1
0
mirror of https://github.com/irssi/irssi.git synced 2024-12-04 14:46:39 -05:00

Fix hilight behavior for STATUSMSG

This patch allows irc_op_public messages to properly trigger
hilights when the message mentions the current nick or one of our
hilights. This is done by copying the required code from
sig_message_public. This is important because Freenode has begun
using this message type for messages that can only be seen by ops
due to the +z channel mode, and ops will want to be notified of
watchwords even in that type of message.

To test, make two connections to Freenode, join a new channel. The
first client to join that channel will be an op. To establish a
baseline, use the non-opped client to attempt to "ping" the opped
client by addressing it by name and using terms in /hilight. Then,
set channel mode to +mz and use the non-opped client to send the
messages again. Without this patch, no message will "ping" the opped
client with +mz set. With this patch, "pings" should operate
normally, causing a bell, hilighting the window number, and so on.

What I don't know is whether there is any other code from
sig_message_public that should be copied over too. In particular,
the lines related to "ignore_check_plus", "emphasis", and
"printnick", I don't know if they are needed here. I also don't know
if there are any other message types that these changes should be
    applied to.
This commit is contained in:
Dan Collins 2019-09-28 20:00:06 -04:00
parent 8a1a96c12c
commit 7e694fd223

View File

@ -35,6 +35,7 @@
#include <irssi/src/fe-common/core/fe-messages.h> #include <irssi/src/fe-common/core/fe-messages.h>
#include <irssi/src/fe-common/core/fe-queries.h> #include <irssi/src/fe-common/core/fe-queries.h>
#include <irssi/src/fe-common/core/hilight-text.h>
#include <irssi/src/fe-common/core/window-items.h> #include <irssi/src/fe-common/core/window-items.h>
#include <irssi/src/fe-common/irc/fe-irc-channels.h> #include <irssi/src/fe-common/irc/fe-irc-channels.h>
#include <irssi/src/fe-common/irc/fe-irc-server.h> #include <irssi/src/fe-common/irc/fe-irc-server.h>
@ -71,8 +72,12 @@ static void sig_message_irc_op_public(SERVER_REC *server, const char *msg,
const char *nick, const char *address, const char *nick, const char *address,
const char *target) const char *target)
{ {
char *nickmode, *optarget, *prefix; CHANNEL_REC *chanrec;
char *nickmode, *optarget, *prefix, *color;
const char *cleantarget; const char *cleantarget;
int for_me, level;
HILIGHT_REC *hilight;
TEXT_DEST_REC dest;
/* only skip here so the difference can be stored in prefix */ /* only skip here so the difference can be stored in prefix */
cleantarget = fe_channel_skip_prefix(IRC_SERVER(server), target); cleantarget = fe_channel_skip_prefix(IRC_SERVER(server), target);
@ -86,10 +91,34 @@ static void sig_message_irc_op_public(SERVER_REC *server, const char *msg,
optarget = g_strconcat(prefix, cleantarget, NULL); optarget = g_strconcat(prefix, cleantarget, NULL);
printformat_module("fe-common/core", server, cleantarget, chanrec = channel_find(server, target);
MSGLEVEL_PUBLIC,
TXT_PUBMSG_CHANNEL, /* Check for hilights */
nick, optarget, msg, nickmode); for_me = !settings_get_bool("hilight_nick_matches") ? FALSE :
!settings_get_bool("hilight_nick_matches_everywhere") ?
nick_match_msg(chanrec, msg, server->nick) :
nick_match_msg_everywhere(chanrec, msg, server->nick);
hilight = for_me ? NULL :
hilight_match_nick(server, target, nick, address, MSGLEVEL_PUBLIC, msg);
color = (hilight == NULL) ? NULL : hilight_get_color(hilight);
level = MSGLEVEL_PUBLIC;
if (for_me)
level |= MSGLEVEL_HILIGHT;
if (color != NULL) {
format_create_dest(&dest, server, cleantarget, level, NULL);
dest.address = address;
dest.nick = nick;
hilight_update_text_dest(&dest,hilight);
printformat_module_dest("fe-common/core", &dest,
TXT_PUBMSG_HILIGHT_CHANNEL,
color, nick, optarget, msg, nickmode);
} else {
printformat_module("fe-common/core", server, cleantarget, level,
for_me ? TXT_PUBMSG_ME_CHANNEL : TXT_PUBMSG_CHANNEL,
nick, optarget, msg, nickmode);
}
g_free(nickmode); g_free(nickmode);
g_free(optarget); g_free(optarget);
g_free(prefix); g_free(prefix);