]> jfr.im git - irc/irssi/irssi.git/commitdiff
Fix #291, "/msg +#channel incorrectly shows up as Nick:@#channel"
authordequis <redacted>
Tue, 22 Sep 2015 03:01:04 +0000 (00:01 -0300)
committerdequis <redacted>
Tue, 22 Sep 2015 03:01:04 +0000 (00:01 -0300)
Just passing the full target to the "message irc op_public" signal
handler and letting it do the cleanup.

The fe_channel_skip_prefix() call in event_privmsg() is kept because
recode_in() needs a real channel name, but

There was similar code in sig_message_own_wall(), but that one is
correct - the /wall command always sends NOTICE @#chan, so I added a
comment down there to make it clear.

src/fe-common/irc/fe-events.c
src/fe-common/irc/fe-irc-messages.c

index 3a01b9eb70369a753dcf3c0167bf03f02546ce3d..850174c5b101ad90d027ef2da80d925352ed6b3c 100644 (file)
@@ -56,11 +56,13 @@ static void event_privmsg(IRC_SERVER_REC *server, const char *data,
 
        if (fe_channel_is_opchannel(server, target)) {
                /* Hybrid 6 feature, send msg to all ops in channel */
-               target = (char *)fe_channel_skip_prefix(server, target);
-               recoded = recode_in(SERVER(server), msg, target);
+               const char *cleantarget = fe_channel_skip_prefix(server, target);
+               recoded = recode_in(SERVER(server), msg, cleantarget);
+
+               /* pass the original target to the signal, with the @+ here
+                * the other one is only needed for recode_in*/
                signal_emit("message irc op_public", 5,
-                           server, recoded, nick, addr,
-                           get_visible_target(server, target));
+                           server, recoded, nick, addr, target);
        } else {
                recoded = recode_in(SERVER(server), msg, server_ischannel(SERVER(server), target) ? target : nick);
                signal_emit(server_ischannel(SERVER(server), target) ?
index 11d158affb2e303087bfe76a3c05e1615af9e5c4..110fb29a71897922a246dd883a9951aabdf52d6e 100644 (file)
@@ -37,6 +37,7 @@
 #include "fe-queries.h"
 #include "window-items.h"
 #include "fe-irc-channels.h"
+#include "fe-irc-server.h"
 
 static void sig_message_own_public(SERVER_REC *server, const char *msg,
                                   const char *target, const char *origtarget)
@@ -70,18 +71,28 @@ static void sig_message_irc_op_public(SERVER_REC *server, const char *msg,
                                      const char *nick, const char *address,
                                      const char *target)
 {
-       char *nickmode, *optarget;
+       char *nickmode, *optarget, *prefix;
+       const char *cleantarget;
+
+       /* only skip here so the difference can be stored in prefix */
+       cleantarget = fe_channel_skip_prefix(IRC_SERVER(server), target);
+       prefix = g_strndup(target, cleantarget - target);
+
+       /* and clean the rest here */
+       cleantarget = get_visible_target(IRC_SERVER(server), cleantarget);
 
        nickmode = channel_get_nickmode(channel_find(server, target),
                                        nick);
 
-        optarget = g_strconcat("@", target, NULL);
-       printformat_module("fe-common/core", server, target,
+       optarget = g_strconcat(prefix, cleantarget, NULL);
+
+       printformat_module("fe-common/core", server, cleantarget,
                           MSGLEVEL_PUBLIC,
                           TXT_PUBMSG_CHANNEL,
                           nick, optarget, msg, nickmode);
        g_free(nickmode);
-        g_free(optarget);
+       g_free(optarget);
+       g_free(prefix);
 }
 
 static void sig_message_own_wall(SERVER_REC *server, const char *msg,
@@ -92,7 +103,8 @@ static void sig_message_own_wall(SERVER_REC *server, const char *msg,
        nickmode = channel_get_nickmode(channel_find(server, target),
                                        server->nick);
 
-        optarget = g_strconcat("@", target, NULL);
+       /* this is always @, skip_prefix is not needed here */
+       optarget = g_strconcat("@", target, NULL);
        printformat_module("fe-common/core", server, target,
                           MSGLEVEL_PUBLIC | MSGLEVEL_NOHILIGHT |
                           MSGLEVEL_NO_ACT,