irssi-import / bugs.irssi.org

bugs.irssi.org archive
https://github.com/irssi/irssi/issues
0 stars 0 forks source link

recode doesn't affect nicknames, even if set for network #723

Open irssibot opened 14 years ago

irssibot commented 14 years ago

Greetings. I had to use irssi recode function because not every server does support recoding on-fly. Everything was fine untill i decided to try russian nickname. There's example: configured network called ONet /recode add ONet CP1251 my locale is set to UTF-8

i can communicate in channels/PM with no problems, but i can't set my own nickname in cyrilic, can't join russian channels and i can't see russian nicknames. however, if my nick are stored in configuration file in CP1251 codepage, it will display properly for others and services. also i can't use non-latin nicknames in commands like /who /nicklist /kick and so on (it says "no such nickname"). it is kinda similar to bugreport #575.

Please, make it possible to recode nick- and channelnames as well if codepage are specified for network or server.

i did try to play with following settings: recode_autodetect_utf8 recode_fallback recode_out_default_charset

recode is set to ON

(I apologize for my poor English)

irssibot commented 14 years ago

Где-то есть патч, решающий эту проблему. Если по-быстрому надо, то скачай из svn версию: r4866 2008-08-01 12:38:58.

irssibot commented 14 years ago

Looks like it's a regression introduced in 0.8.13, because 0.8.12 worked fine.

irssibot commented 14 years ago

I have the same problem with 0.8.15. I have installed version 0.8.12 and it works fine.

irssibot commented 14 years ago

Oh... forgot something. Even 0.8.12 does not work fine.

My locale is UTF-8, irc server works with windows-1251. in 0.8.12: I can see russian (win1251) nicknames but I cannot change my nickname to russian. in 0.8.15: I can neither see russian nicknames nor change my nickname to russian.

irssibot commented 14 years ago

As temporary solution you can start Irssi in UTF-8 terminal with luit program and cp1251 locale: LANG=ru_RU.CP1251 luit irssi

irssibot commented 14 years ago

I second this feature request!

irssibot commented 14 years ago

Alex: not a solution for me since I use a few IRC networks with Unicode support. But someone may find it useful :]

irssibot commented 14 years ago

I second this feature request!

irssibot commented 14 years ago

Hi, I enclose the patch that recodes channel names according to the encoding specified for the chatnet. Now it is possible to join and control channels the names of which are in different encoding than the current encoding is.

irssibot commented 14 years ago

channel-name-recode.diff

Index: src/fe-common/irc/fe-events.c
===================================================================
--- src/fe-common/irc/fe-events.c   (revision 5190)
+++ src/fe-common/irc/fe-events.c   (working copy)
@@ -50,6 +50,8 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg);
+   if (ischannel(*target))
+       target = recode_in(SERVER(server), target, NULL);
    if (nick == NULL) nick = server->real_address;
    if (addr == NULL) addr = "";
    if (*target == '@' && ischannel(target[1])) {
@@ -65,6 +67,8 @@
                server, recoded, nick, addr,
                get_visible_target(server, target));
    }
+   if (ischannel(*target))
+       g_free(target);

    g_free(params);
    g_free(recoded);
@@ -115,26 +119,33 @@
    params = event_get_params(data, 1, &channel);
    tmp = strchr(channel, 7); /* ^G does something weird.. */
    if (tmp != NULL) *tmp = '\0';
+   channel = recode_in(SERVER(server), channel, NULL);

    signal_emit("message join", 4, server,
            get_visible_target(server, channel), nick, addr);
+
+   g_free(channel);
    g_free(params);
 }

 static void event_part(IRC_SERVER_REC *server, const char *data,
               const char *nick, const char *addr)
 {
-   char *params, *channel, *reason, *recoded;
+   char *params, *channel, *reason;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2 | PARAM_FLAG_GETREST,
                  &channel, &reason);
-   recoded = recode_in(SERVER(server), reason, channel);
+   channel = recode_in(SERVER(server), channel, NULL);
+   reason = recode_in(SERVER(server), reason, channel);
+
    signal_emit("message part", 5, server,
-           get_visible_target(server, channel), nick, addr, recoded);
+           get_visible_target(server, channel), nick, addr, reason);
+
+   g_free(reason);
+   g_free(channel);
    g_free(params);
-   g_free(recoded);
 }

 static void event_quit(IRC_SERVER_REC *server, const char *data,
@@ -153,18 +164,22 @@
 static void event_kick(IRC_SERVER_REC *server, const char *data,
               const char *kicker, const char *addr)
 {
-   char *params, *channel, *nick, *reason, *recoded;
+   char *params, *channel, *nick, *reason;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 3 | PARAM_FLAG_GETREST,
                  &channel, &nick, &reason);
-   recoded = recode_in(SERVER(server), reason, channel);
+   channel = recode_in(SERVER(server), channel, NULL);
+   reason = recode_in(SERVER(server), reason, channel);
+
    signal_emit("message kick", 6,
            server, get_visible_target(server, channel),
-           nick, kicker, addr, recoded);
+           nick, kicker, addr, reason);
+
+   g_free(reason);
+   g_free(channel);
    g_free(params);
-   g_free(recoded);
 }

 static void event_kill(IRC_SERVER_REC *server, const char *data,
@@ -225,10 +240,13 @@

    params = event_get_params(data, 2 | PARAM_FLAG_GETREST,
                  &channel, &mode);
+   channel = recode_in(SERVER(server), channel, NULL);

    signal_emit("message irc mode", 5,
            server, get_visible_target(server, channel),
            nick, addr, g_strchomp(mode));
+
+   g_free(channel);
    g_free(params);
 }

@@ -252,25 +270,33 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);
+
    signal_emit("message invite", 4,
            server, get_visible_target(server, channel), nick, addr);
+
+   g_free(channel);
    g_free(params);
 }

 static void event_topic(IRC_SERVER_REC *server, const char *data,
            const char *nick, const char *addr)
 {
-   char *params, *channel, *topic, *recoded;
+   char *params, *channel, *topic;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2 | PARAM_FLAG_GETREST,
                  &channel, &topic);
-   recoded = recode_in(SERVER(server), topic, channel);
+   channel = recode_in(SERVER(server), channel, NULL);
+   topic = recode_in(SERVER(server), topic, channel);
+
    signal_emit("message topic", 5, server,
-           get_visible_target(server, channel), recoded, nick, addr);
+           get_visible_target(server, channel), topic, nick, addr);
+
+   g_free(topic);
+   g_free(channel);
    g_free(params);
-   g_free(recoded);
 }

 static void event_error(IRC_SERVER_REC *server, const char *data)
Index: src/fe-common/irc/fe-events-numeric.c
===================================================================
--- src/fe-common/irc/fe-events-numeric.c   (revision 5190)
+++ src/fe-common/irc/fe-events-numeric.c   (working copy)
@@ -75,6 +75,7 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 4, NULL, NULL, &channel, &names);
+   channel = recode_in(SERVER(server), channel, NULL);

    chanrec = irc_channel_find(server, channel);
    if (chanrec == NULL || chanrec->names_got) {
@@ -84,6 +85,7 @@
                 printtext(server, channel, MSGLEVEL_CRAP, "%s", names);

    }
+   g_free(channel);
    g_free(params);
 }

@@ -96,35 +98,44 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);

    chanrec = irc_channel_find(server, channel);
    if (chanrec == NULL || chanrec->names_got)
        print_event_received(server, data, nick, FALSE);
+
+   g_free(channel);
    g_free(params);
 }

 static void event_who(IRC_SERVER_REC *server, const char *data)
 {
    char *params, *nick, *channel, *user, *host, *stat, *realname, *hops;
-   char *serv, *recoded;
+   char *serv;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 8, NULL, &channel, &user,
                  &host, &serv, &nick, &stat, &realname);

+   channel = recode_in(SERVER(server), channel, NULL);
+   user = recode_in(SERVER(server), user, NULL);
+   host = recode_in(SERVER(server), host, NULL);
    /* split hops/realname */
    hops = realname;
    while (*realname != '\0' && *realname != ' ') realname++;
    if (*realname == ' ')
        *realname++ = '\0';
-   
-   recoded = recode_in(SERVER(server), realname, nick);
+   realname = recode_in(SERVER(server), realname, nick);
+
    printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_WHO,
-           channel, nick, stat, hops, user, host, recoded, serv);
+           channel, nick, stat, hops, user, host, realname, serv);

+   //g_free(realname);
+   g_free(host);
+   g_free(user);
+   g_free(channel);
    g_free(params);
-   g_free(recoded);
 }

 static void event_end_of_who(IRC_SERVER_REC *server, const char *data)
@@ -134,7 +145,11 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);
+
    printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_END_OF_WHO, channel);
+
+   g_free(channel);
    g_free(params);
 }

@@ -142,47 +157,50 @@
 {
    IRC_CHANNEL_REC *chanrec;
    BAN_REC *banrec;
-   const char *channel;
-   char *params, *ban, *setby, *tims;
+   char *params, *channel, *ban, *setby, *tims;
+   const char *target;
    long secs;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 5, NULL, &channel,
                  &ban, &setby, &tims);
+   channel = recode_in(SERVER(server), channel, NULL);
+   target = get_visible_target(server, channel);
+   chanrec = irc_channel_find(server, target);
+   banrec = chanrec == NULL ? NULL : banlist_find(chanrec->banlist, ban);
    secs = *tims == '\0' ? 0 :
        (long) (time(NULL) - atol(tims));

-   chanrec = irc_channel_find(server, channel);
-   banrec = chanrec == NULL ? NULL : banlist_find(chanrec->banlist, ban);
-
-   channel = get_visible_target(server, channel);
-   printformat(server, channel, MSGLEVEL_CRAP,
+   printformat(server, target, MSGLEVEL_CRAP,
            *setby == '\0' ? IRCTXT_BANLIST : IRCTXT_BANLIST_LONG,
            banrec == NULL ? 0 : g_slist_index(chanrec->banlist, banrec)+1,
-           channel, ban, setby, secs);
+           target, ban, setby, secs);

+   g_free(channel);
    g_free(params);
 }

 static void event_eban_list(IRC_SERVER_REC *server, const char *data)
 {
-   const char *channel;
-   char *params, *ban, *setby, *tims;
+   char *params, *channel, *ban, *setby, *tims;
+   const char *target;
    long secs;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 5, NULL, &channel,
                  &ban, &setby, &tims);
+   channel = recode_in(SERVER(server), channel, NULL);
+   target = get_visible_target(server, channel);
    secs = *tims == '\0' ? 0 :
        (long) (time(NULL) - atol(tims));

-   channel = get_visible_target(server, channel);
-   printformat(server, channel, MSGLEVEL_CRAP,
+   printformat(server, target, MSGLEVEL_CRAP,
            *setby == '\0' ? IRCTXT_EBANLIST : IRCTXT_EBANLIST_LONG,
-           channel, ban, setby, secs);
+           target, ban, setby, secs);

+   g_free(channel);
    g_free(params);
 }

@@ -213,21 +231,24 @@

 static void event_invite_list(IRC_SERVER_REC *server, const char *data)
 {
-   const char *channel;
-   char *params, *invite, *setby, *tims;
+   char *params, *channel, *invite, *setby, *tims;
+   const char *target;
    long secs;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 5, NULL, &channel, &invite,
            &setby, &tims);
+   channel = recode_in(SERVER(server), channel, NULL);
+   target = get_visible_target(server, channel);
    secs = *tims == '\0' ? 0 :
        (long) (time(NULL) - atol(tims));

-   channel = get_visible_target(server, channel);
-   printformat(server, channel, MSGLEVEL_CRAP,
+   printformat(server, target, MSGLEVEL_CRAP,
            *setby == '\0' ? IRCTXT_INVITELIST : IRCTXT_INVITELIST_LONG,
-           channel, invite, setby, secs);
+           target, invite, setby, secs);
+
+   g_free(channel);
    g_free(params);
 }

@@ -248,72 +269,85 @@

 static void event_topic_get(IRC_SERVER_REC *server, const char *data)
 {
-   const char *channel;
-   char *params, *topic, *recoded;
+   char *params, *channel, *topic;
+   const char *target;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 3, NULL, &channel, &topic);
-   recoded = recode_in(SERVER(server), topic, channel);
-   channel = get_visible_target(server, channel);
-   printformat(server, channel, MSGLEVEL_CRAP,
-           IRCTXT_TOPIC, channel, recoded);
+   channel = recode_in(SERVER(server), channel, NULL);
+   topic = recode_in(SERVER(server), topic, channel);
+   target = get_visible_target(server, channel);
+
+   printformat(server, target, MSGLEVEL_CRAP,
+           IRCTXT_TOPIC, target, topic);
+
+   g_free(topic);
+   g_free(channel);
    g_free(params);
-   g_free(recoded);
 }

 static void event_topic_info(IRC_SERVER_REC *server, const char *data)
 {
-   const char *channel;
-   char *params, *timestr, *bynick, *byhost, *topictime;
+   char *params, *channel, *timestr, *bynick, *byhost, *topictime;
+   const char *target;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 4, NULL, &channel,
                  &bynick, &topictime);
-
+   channel = recode_in(SERVER(server), channel, NULL);
+   target = get_visible_target(server, channel);
         timestr = my_asctime((time_t) atol(topictime));

    byhost = strchr(bynick, '!');
    if (byhost != NULL)
        *byhost++ = '\0';

-   channel = get_visible_target(server, channel);
-   printformat(server, channel, MSGLEVEL_CRAP, IRCTXT_TOPIC_INFO,
+   printformat(server, target, MSGLEVEL_CRAP, IRCTXT_TOPIC_INFO,
            bynick, timestr, byhost == NULL ? "" : byhost);
+
    g_free(timestr);
+   g_free(channel);
    g_free(params);
 }

 static void event_channel_mode(IRC_SERVER_REC *server, const char *data)
 {
-   const char *channel;
-   char *params, *mode;
+   char *params, *channel, *mode;
+   const char *target;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 3 | PARAM_FLAG_GETREST,
                  NULL, &channel, &mode);
-   channel = get_visible_target(server, channel);
-   printformat(server, channel, MSGLEVEL_CRAP,
-           IRCTXT_CHANNEL_MODE, channel, g_strchomp(mode));
+   channel = recode_in(SERVER(server), channel, NULL);
+   target = get_visible_target(server, channel);
+
+   printformat(server, target, MSGLEVEL_CRAP,
+           IRCTXT_CHANNEL_MODE, target, g_strchomp(mode));
+
+   g_free(channel);
    g_free(params);
 }

 static void event_channel_created(IRC_SERVER_REC *server, const char *data)
 {
-   const char *channel;
-   char *params, *createtime, *timestr;
+   char *params, *channel, *createtime, *timestr;
+   const char *target;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 3, NULL, &channel, &createtime);
+   channel = recode_in(SERVER(server), channel, NULL);
+   target = get_visible_target(server, channel);
+   timestr = my_asctime((time_t) atol(createtime));

-        timestr = my_asctime((time_t) atol(createtime));
-   channel = get_visible_target(server, channel);
-   printformat(server, channel, MSGLEVEL_CRAP,
-           IRCTXT_CHANNEL_CREATED, channel, timestr);
+   printformat(server, target, MSGLEVEL_CRAP,
+           IRCTXT_CHANNEL_CREATED, target, timestr);
+
    g_free(timestr);
+   g_free(channel);
    g_free(params);
 }

@@ -370,22 +404,30 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 3, NULL, &nick, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);
+
    printformat(server, nick, MSGLEVEL_CRAP,
            IRCTXT_INVITING, nick, channel);
+
+   g_free(channel);
    g_free(params);
 }

 static void event_chanserv_url(IRC_SERVER_REC *server, const char *data)
 {
-   const char *channel;
-   char *params, *url;
+   char *params, *channel, *url;
+   const char *target;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 3, NULL, &channel, &url);
-   channel = get_visible_target(server, channel);
-   printformat(server, channel, MSGLEVEL_CRAP,
-           IRCTXT_CHANNEL_URL, channel, url);
+   channel = recode_in(SERVER(server), channel, NULL);
+   target = get_visible_target(server, channel);
+
+   printformat(server, target, MSGLEVEL_CRAP,
+           IRCTXT_CHANNEL_URL, target, url);
+
+   g_free(channel);
    g_free(params);
 }

@@ -393,17 +435,18 @@
                     const char *nick, const char *addr)
 {
    IRC_CHANNEL_REC *chanrec;
-   char *params, *target;
+   char *params, *channel, *target;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, NULL, &target);
-   if (!ischannel(*target)) {
+   channel = recode_in(SERVER(server), target, NULL);
+   if (!ischannel(*channel)) {
        /* nick unavailable */
        printformat(server, NULL, MSGLEVEL_CRAP,
                IRCTXT_NICK_UNAVAILABLE, target);
    } else {
-       chanrec = irc_channel_find(server, target);
+       chanrec = irc_channel_find(server, channel);
        if (chanrec != NULL && chanrec->joined) {
            /* dalnet - can't change nick while being banned */
            print_event_received(server, data, nick, FALSE);
@@ -414,6 +457,7 @@
        }
    }

+   g_free(channel);
    g_free(params);
 }

@@ -441,8 +485,12 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);
+
    printformat(server, channel, MSGLEVEL_CRAP,
            IRCTXT_NO_SUCH_CHANNEL, channel);
+
+   g_free(channel);
    g_free(params);
 }

@@ -453,7 +501,11 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);
+
    printformat(server, NULL, MSGLEVEL_CRAP, format, channel);
+
+   g_free(channel);
    g_free(params);
 }

@@ -472,6 +524,7 @@
    /* this new addition to ircd breaks completely with older
       "standards", "nick Duplicate ::!!channel ...." */
    params = event_get_params(data, 3, NULL, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);
    p = strchr(channel, ' ');
    if (p != NULL) *p = '\0';

@@ -481,6 +534,7 @@
    } else
        print_event_received(server, data, nick, FALSE);

+   g_free(channel);
    g_free(params);
 }

@@ -523,9 +577,12 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);

    chanrec = irc_channel_find(server, channel);
    print_event_received(server, data, nick, chanrec == NULL || chanrec->joined);
+
+   g_free(channel);
    g_free(params);
 }

@@ -542,9 +599,12 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);

    chanrec = irc_channel_find(server, channel);
    print_event_received(server, data, nick, chanrec == NULL || chanrec->joined);
+
+   g_free(channel);
    g_free(params);
 }

Index: src/irc/core/irc-channels.c
===================================================================
--- src/irc/core/irc-channels.c (revision 5190)
+++ src/irc/core/irc-channels.c (working copy)
@@ -23,6 +23,7 @@
 #include "misc.h"
 #include "levels.h"
 #include "channels-setup.h"
+#include "recode.h"

 #include "bans.h"
 #include "modes.h"
@@ -146,11 +147,21 @@
                continue;
        }
        if (outchans->len > 0) {
+           char *outchans_recoded;
+           char *outkeys_recoded;
+
            g_string_truncate(outchans, outchans->len-1);
+           outchans_recoded = recode_out(SERVER(server),
+                   outchans->str, NULL);
            g_string_truncate(outkeys, outkeys->len-1);
+           outkeys_recoded = recode_out(SERVER(server),
+                   outkeys->str, NULL);
            irc_send_cmdv(IRC_SERVER(server),
                      use_keys ? "JOIN %s %s" : "JOIN %s",
-                     outchans->str, outkeys->str);
+                     outchans_recoded, outkeys_recoded);
+
+           g_free(outkeys_recoded);
+           g_free(outchans_recoded);
        }
        cmdlen = 0;
        g_string_truncate(outchans,0);
Index: src/irc/core/irc-nicklist.c
===================================================================
--- src/irc/core/irc-nicklist.c (revision 5190)
+++ src/irc/core/irc-nicklist.c (working copy)
@@ -21,6 +21,7 @@
 #include "module.h"
 #include "signals.h"
 #include "misc.h"
+#include "recode.h"

 #include "irc-servers.h"
 #include "irc-channels.h"
@@ -110,10 +111,12 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 4, NULL, &type, &channel, &names);
+   channel = recode_in(SERVER(server), channel, NULL);

    chanrec = irc_channel_find(server, channel);
    if (chanrec == NULL || chanrec->names_got) {
        /* unknown channel / names list already read */
+       g_free(channel);
        g_free(params);
        return;
    }
@@ -168,6 +171,7 @@
        }
    }

+   g_free(channel);
    g_free(params);
 }

@@ -181,6 +185,7 @@
    g_return_if_fail(server != NULL);

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);

    chanrec = irc_channel_find(server, channel);
    if (chanrec != NULL && !chanrec->names_got) {
@@ -199,6 +204,7 @@
        signal_emit("channel joined", 1, chanrec);
    }

+   g_free(channel);
    g_free(params);
 }

@@ -212,6 +218,7 @@

    params = event_get_params(data, 8, NULL, &channel, &user, &host,
                  NULL, &nick, &stat, &realname);
+   channel = recode_in(SERVER(server), channel, NULL);

    /* get hop count */
    hops = realname;
@@ -238,6 +245,7 @@
                  strchr(stat, 'G') != NULL, /* gone */
                  strchr(stat, '*') != NULL); /* ircop */

+   g_free(channel);
    g_free(params);
 }

Index: src/irc/core/channel-events.c
===================================================================
--- src/irc/core/channel-events.c   (revision 5190)
+++ src/irc/core/channel-events.c   (working copy)
@@ -59,10 +59,12 @@
       which we haven't joined yet. 4xx are error codes and should
       indicate that the join failed. */
    params = event_get_params(line, 3, &numeric, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);

    if (numeric[0] == '4')
        check_join_failure(server, channel);

+   g_free(channel);
    g_free(params);
 }

@@ -73,6 +75,7 @@
    char *params, *channel;

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);
    chanrec = *channel == '!' && channel[1] != '\0' ?
        channel_find(SERVER(server), channel) : NULL;

@@ -83,12 +86,15 @@
        if (setup != NULL && setup->autojoin) {
            /* it's autojoin channel though, so create it */
            irc_send_cmdv(server, "JOIN !%s", chanrec->name);
+           g_free(channel);
            g_free(params);
                         return;
        }
    }

    check_join_failure(server, channel);
+
+   g_free(channel);
    g_free(params);
 }

@@ -102,6 +108,7 @@
    /* this new addition to ircd breaks completely with older
       "standards", "nick Duplicate ::!!channel ...." */
    params = event_get_params(data, 3, NULL, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);
    p = strchr(channel, ' ');
    if (p != NULL) *p = '\0';

@@ -114,6 +121,7 @@
        }
    }

+   g_free(channel);
    g_free(params);
 }

@@ -150,7 +158,11 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 3, NULL, &channel, &topic);
+   channel = recode_in(SERVER(server), channel, NULL);
+
    channel_change_topic(server, channel, topic, NULL, 0);
+
+   g_free(channel);
    g_free(params);
 }

@@ -162,10 +174,14 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, &channel, &topic);
+   channel = recode_in(SERVER(server), channel, NULL);
    mask = addr == NULL ? g_strdup(nick) :
        g_strconcat(nick, "!", addr, NULL);
+
    channel_change_topic(server, channel, topic, mask, time(NULL));
+
    g_free(mask);
+   g_free(channel);
    g_free(params);
 }

@@ -178,9 +194,12 @@

    params = event_get_params(data, 4, NULL, &channel,
                  &topicby, &topictime);
+   channel = recode_in(SERVER(server), channel, NULL);
+   t = (time_t) atol(topictime);

-   t = (time_t) atol(topictime);
    channel_change_topic(server, channel, NULL, topicby, t);
+
+   g_free(channel);
    g_free(params);
 }

@@ -223,6 +242,7 @@
        server->userhost = g_strdup(address);

    params = event_get_params(data, 1, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);
    tmp = strchr(channel, 7); /* ^G does something weird.. */
    if (tmp != NULL) *tmp = '\0';

@@ -276,6 +296,7 @@
    }

    g_free(shortchan);
+   g_free(channel);
    g_free(params);
 }

@@ -292,6 +313,7 @@
    }

    params = event_get_params(data, 2, &channel, &reason);
+   channel = recode_in(SERVER(server), channel, NULL);

    chanrec = channel_find(SERVER(server), channel);
    if (chanrec != NULL && chanrec->joined) {
@@ -299,6 +321,7 @@
        channel_destroy(chanrec);
    }

+   g_free(channel);
    g_free(params);
 }

@@ -310,6 +333,7 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 3, &channel, &nick, &reason);
+   channel = recode_in(SERVER(server), channel, NULL);

    if (g_strcasecmp(nick, server->nick) != 0) {
        /* someone else was kicked, no need to do anything */
@@ -324,6 +348,7 @@
        channel_destroy(chanrec);
    }

+   g_free(channel);
    g_free(params);
 }

@@ -334,6 +359,7 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);

    if (irc_channel_find(server, channel) == NULL) {
                 /* check if we're supposed to autojoin this channel */
@@ -353,6 +379,7 @@

    g_free_not_null(server->last_invite);
    server->last_invite = g_strdup(channel);
+   g_free(channel);
    g_free(params);
 }

Index: src/irc/core/irc-commands.c
===================================================================
--- src/irc/core/irc-commands.c (revision 5190)
+++ src/irc/core/irc-commands.c (working copy)
@@ -170,17 +170,20 @@

    if (*msg != '\0')
        recoded = recode_out(SERVER(server), msg, channame);
+   channame = recode_out(SERVER(server), channame, NULL);
+
    irc_send_cmdv(server, ! recoded ? "PART %s" : "PART %s :%s",
              channame, recoded);

    g_free(recoded);
+   g_free(channame);
    cmd_params_free(free_arg);
 }

 /* SYNTAX: KICK [<channel>] <nicks> [<reason>] */
 static void cmd_kick(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item)
 {
-   char *channame, *nicks, *reason, *recoded;
+   char *channame, *nicks, *reason;
    void *free_arg;

         CMD_IRC_SERVER(server);
@@ -193,12 +196,14 @@
    if (*channame == '\0' || *nicks == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
    if (!ischannel(*channame)) cmd_param_error(CMDERR_NOT_JOINED);

-   recoded = recode_out(SERVER(server), reason, channame);
-   g_string_printf(tmpstr, "KICK %s %s :%s", channame, nicks, recoded);
-   g_free(recoded);
+   reason = recode_out(SERVER(server), reason, channame);
+   channame = recode_out(SERVER(server), channame, NULL);
+   g_string_printf(tmpstr, "KICK %s %s :%s", channame, nicks, reason);

    irc_send_cmd_split(server, tmpstr->str, 3, server->max_kicks_in_cmd);

+   g_free(reason);
+   g_free(channame);
    cmd_params_free(free_arg);
 }

@@ -207,7 +212,6 @@
 {
    GHashTable *optlist;
    char *channame, *topic;
-   char *recoded = NULL;
    void *free_arg;

         CMD_IRC_SERVER(server);
@@ -218,11 +222,13 @@
        return;

    if (*topic != '\0' || g_hash_table_lookup(optlist, "delete") != NULL)
-       recoded = recode_out(SERVER(server), topic, channame);
-   irc_send_cmdv(server, recoded == NULL ? "TOPIC %s" : "TOPIC %s :%s",
-             channame, recoded);
-   g_free(recoded);
+       topic = recode_out(SERVER(server), topic, channame);
+   channame = recode_out(SERVER(server), channame, NULL);
+   irc_send_cmdv(server, topic == NULL ? "TOPIC %s" : "TOPIC %s :%s",
+             channame, topic);

+   g_free(topic);
+   g_free(channame);
    cmd_params_free(free_arg);
 }

@@ -244,8 +250,11 @@

        channame = IRC_CHANNEL(item)->name;
    }
+   channame = recode_out(SERVER(server), channame, NULL);

    irc_send_cmdv(server, "INVITE %s %s", nick, channame);
+
+   g_free(channame);
    cmd_params_free(free_arg);
 }

@@ -268,7 +277,10 @@
         server->channels_formed > LIST_MAX_CHANNELS_PASS))
        cmd_param_error(CMDERR_NOT_GOOD_IDEA);

+   str = recode_out(SERVER(server), str, NULL);
    irc_send_cmdv(server, "LIST %s", str);
+
+   g_free(str);
    cmd_params_free(free_arg);
 }

@@ -292,11 +304,14 @@
    }
    if (strcmp(channel, "**") == 0) {
        /* ** displays all nicks.. */
-       *channel = '\0';
+       irc_send_cmd(server, "WHO");
+   } else {
+       channel = recode_out(SERVER(server), channel, NULL);
+       irc_send_cmdv(server, *rest == '\0' ? "WHO %s" : "WHO %s %s",
+             channel, rest);
+       g_free(channel);
    }

-   irc_send_cmdv(server, *rest == '\0' ? "WHO %s" : "WHO %s %s",
-             channel, rest);
    cmd_params_free(free_arg);
 }

@@ -324,7 +339,9 @@
        /* ** displays all nicks.. */
                 irc_send_cmd(server, "NAMES");
    } else {
+       channel = recode_out(SERVER(server), channel, NULL);
        irc_send_cmdv(server, "NAMES %s", channel);
+       g_free(channel);
    }

    cmd_params_free(free_arg);
irssibot commented 14 years ago

Hi again, I enclose patched patch (sending messages and other things were broken in previous patch).

irssibot commented 14 years ago

channel-name-recode.diff

Index: src/fe-common/irc/fe-events.c
===================================================================
--- src/fe-common/irc/fe-events.c   (revision 5190)
+++ src/fe-common/irc/fe-events.c   (working copy)
@@ -50,6 +50,8 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg);
+   if (ischannel(*target))
+       target = recode_in(SERVER(server), target, NULL);
    if (nick == NULL) nick = server->real_address;
    if (addr == NULL) addr = "";
    if (*target == '@' && ischannel(target[1])) {
@@ -65,6 +67,8 @@
                server, recoded, nick, addr,
                get_visible_target(server, target));
    }
+   if (ischannel(*target))
+       g_free(target);

    g_free(params);
    g_free(recoded);
@@ -74,14 +78,26 @@
            const char *nick, const char *addr,
            const char *target)
 {
-   char *recoded;
+   char *recoded = NULL;
+   char *target_recoded = NULL;

    g_return_if_fail(data != NULL);
-   recoded = recode_in(SERVER(server), data, target);
-   signal_emit("message irc action", 5,
+
+   if (ischannel(*target)) {
+       target_recoded = recode_in(SERVER(server), target, NULL);
+       recoded = recode_in(SERVER(server), data, target_recoded);
+       signal_emit("message irc action", 5,
            server, recoded, nick, addr,
-           get_visible_target(server, target));
-   g_free(recoded);
+           get_visible_target(server, target_recoded));
+       g_free(recoded);
+       g_free(target_recoded);
+   } else {
+       recoded = recode_in(SERVER(server), data, target_recoded);
+       signal_emit("message irc action", 5,
+               server, recoded, nick, addr,
+               get_visible_target(server, target));
+       g_free(recoded);
+   }
 }

 static void event_notice(IRC_SERVER_REC *server, const char *data,
@@ -92,6 +108,8 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg);
+   if (ischannel(*target))
+       target = recode_in(SERVER(server), target, NULL);
    recoded = recode_in(SERVER(server), msg, target);
    if (nick == NULL) {
        nick = server->real_address == NULL ?
@@ -103,6 +121,8 @@
            get_visible_target(server, target));
    g_free(params);
    g_free(recoded);
+   if (ischannel(*target))
+       g_free(target);
 }

 static void event_join(IRC_SERVER_REC *server, const char *data,
@@ -115,26 +135,33 @@
    params = event_get_params(data, 1, &channel);
    tmp = strchr(channel, 7); /* ^G does something weird.. */
    if (tmp != NULL) *tmp = '\0';
+   channel = recode_in(SERVER(server), channel, NULL);

    signal_emit("message join", 4, server,
            get_visible_target(server, channel), nick, addr);
+
+   g_free(channel);
    g_free(params);
 }

 static void event_part(IRC_SERVER_REC *server, const char *data,
               const char *nick, const char *addr)
 {
-   char *params, *channel, *reason, *recoded;
+   char *params, *channel, *reason;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2 | PARAM_FLAG_GETREST,
                  &channel, &reason);
-   recoded = recode_in(SERVER(server), reason, channel);
+   channel = recode_in(SERVER(server), channel, NULL);
+   reason = recode_in(SERVER(server), reason, channel);
+
    signal_emit("message part", 5, server,
-           get_visible_target(server, channel), nick, addr, recoded);
+           get_visible_target(server, channel), nick, addr, reason);
+
+   g_free(reason);
+   g_free(channel);
    g_free(params);
-   g_free(recoded);
 }

 static void event_quit(IRC_SERVER_REC *server, const char *data,
@@ -153,18 +180,22 @@
 static void event_kick(IRC_SERVER_REC *server, const char *data,
               const char *kicker, const char *addr)
 {
-   char *params, *channel, *nick, *reason, *recoded;
+   char *params, *channel, *nick, *reason;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 3 | PARAM_FLAG_GETREST,
                  &channel, &nick, &reason);
-   recoded = recode_in(SERVER(server), reason, channel);
+   channel = recode_in(SERVER(server), channel, NULL);
+   reason = recode_in(SERVER(server), reason, channel);
+
    signal_emit("message kick", 6,
            server, get_visible_target(server, channel),
-           nick, kicker, addr, recoded);
+           nick, kicker, addr, reason);
+
+   g_free(reason);
+   g_free(channel);
    g_free(params);
-   g_free(recoded);
 }

 static void event_kill(IRC_SERVER_REC *server, const char *data,
@@ -225,10 +256,13 @@

    params = event_get_params(data, 2 | PARAM_FLAG_GETREST,
                  &channel, &mode);
+   channel = recode_in(SERVER(server), channel, NULL);

    signal_emit("message irc mode", 5,
            server, get_visible_target(server, channel),
            nick, addr, g_strchomp(mode));
+
+   g_free(channel);
    g_free(params);
 }

@@ -252,25 +286,33 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);
+
    signal_emit("message invite", 4,
            server, get_visible_target(server, channel), nick, addr);
+
+   g_free(channel);
    g_free(params);
 }

 static void event_topic(IRC_SERVER_REC *server, const char *data,
            const char *nick, const char *addr)
 {
-   char *params, *channel, *topic, *recoded;
+   char *params, *channel, *topic;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2 | PARAM_FLAG_GETREST,
                  &channel, &topic);
-   recoded = recode_in(SERVER(server), topic, channel);
+   channel = recode_in(SERVER(server), channel, NULL);
+   topic = recode_in(SERVER(server), topic, channel);
+
    signal_emit("message topic", 5, server,
-           get_visible_target(server, channel), recoded, nick, addr);
+           get_visible_target(server, channel), topic, nick, addr);
+
+   g_free(topic);
+   g_free(channel);
    g_free(params);
-   g_free(recoded);
 }

 static void event_error(IRC_SERVER_REC *server, const char *data)
Index: src/fe-common/irc/fe-events-numeric.c
===================================================================
--- src/fe-common/irc/fe-events-numeric.c   (revision 5190)
+++ src/fe-common/irc/fe-events-numeric.c   (working copy)
@@ -75,6 +75,7 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 4, NULL, NULL, &channel, &names);
+   channel = recode_in(SERVER(server), channel, NULL);

    chanrec = irc_channel_find(server, channel);
    if (chanrec == NULL || chanrec->names_got) {
@@ -84,6 +85,7 @@
                 printtext(server, channel, MSGLEVEL_CRAP, "%s", names);

    }
+   g_free(channel);
    g_free(params);
 }

@@ -96,35 +98,44 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);

    chanrec = irc_channel_find(server, channel);
    if (chanrec == NULL || chanrec->names_got)
        print_event_received(server, data, nick, FALSE);
+
+   g_free(channel);
    g_free(params);
 }

 static void event_who(IRC_SERVER_REC *server, const char *data)
 {
    char *params, *nick, *channel, *user, *host, *stat, *realname, *hops;
-   char *serv, *recoded;
+   char *serv;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 8, NULL, &channel, &user,
                  &host, &serv, &nick, &stat, &realname);

+   channel = recode_in(SERVER(server), channel, NULL);
+   user = recode_in(SERVER(server), user, NULL);
+   host = recode_in(SERVER(server), host, NULL);
    /* split hops/realname */
    hops = realname;
    while (*realname != '\0' && *realname != ' ') realname++;
    if (*realname == ' ')
        *realname++ = '\0';
-   
-   recoded = recode_in(SERVER(server), realname, nick);
+   realname = recode_in(SERVER(server), realname, nick);
+
    printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_WHO,
-           channel, nick, stat, hops, user, host, recoded, serv);
+           channel, nick, stat, hops, user, host, realname, serv);

+   //g_free(realname);
+   g_free(host);
+   g_free(user);
+   g_free(channel);
    g_free(params);
-   g_free(recoded);
 }

 static void event_end_of_who(IRC_SERVER_REC *server, const char *data)
@@ -134,7 +145,11 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);
+
    printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_END_OF_WHO, channel);
+
+   g_free(channel);
    g_free(params);
 }

@@ -142,47 +157,50 @@
 {
    IRC_CHANNEL_REC *chanrec;
    BAN_REC *banrec;
-   const char *channel;
-   char *params, *ban, *setby, *tims;
+   char *params, *channel, *ban, *setby, *tims;
+   const char *target;
    long secs;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 5, NULL, &channel,
                  &ban, &setby, &tims);
+   channel = recode_in(SERVER(server), channel, NULL);
+   target = get_visible_target(server, channel);
+   chanrec = irc_channel_find(server, target);
+   banrec = chanrec == NULL ? NULL : banlist_find(chanrec->banlist, ban);
    secs = *tims == '\0' ? 0 :
        (long) (time(NULL) - atol(tims));

-   chanrec = irc_channel_find(server, channel);
-   banrec = chanrec == NULL ? NULL : banlist_find(chanrec->banlist, ban);
-
-   channel = get_visible_target(server, channel);
-   printformat(server, channel, MSGLEVEL_CRAP,
+   printformat(server, target, MSGLEVEL_CRAP,
            *setby == '\0' ? IRCTXT_BANLIST : IRCTXT_BANLIST_LONG,
            banrec == NULL ? 0 : g_slist_index(chanrec->banlist, banrec)+1,
-           channel, ban, setby, secs);
+           target, ban, setby, secs);

+   g_free(channel);
    g_free(params);
 }

 static void event_eban_list(IRC_SERVER_REC *server, const char *data)
 {
-   const char *channel;
-   char *params, *ban, *setby, *tims;
+   char *params, *channel, *ban, *setby, *tims;
+   const char *target;
    long secs;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 5, NULL, &channel,
                  &ban, &setby, &tims);
+   channel = recode_in(SERVER(server), channel, NULL);
+   target = get_visible_target(server, channel);
    secs = *tims == '\0' ? 0 :
        (long) (time(NULL) - atol(tims));

-   channel = get_visible_target(server, channel);
-   printformat(server, channel, MSGLEVEL_CRAP,
+   printformat(server, target, MSGLEVEL_CRAP,
            *setby == '\0' ? IRCTXT_EBANLIST : IRCTXT_EBANLIST_LONG,
-           channel, ban, setby, secs);
+           target, ban, setby, secs);

+   g_free(channel);
    g_free(params);
 }

@@ -213,21 +231,24 @@

 static void event_invite_list(IRC_SERVER_REC *server, const char *data)
 {
-   const char *channel;
-   char *params, *invite, *setby, *tims;
+   char *params, *channel, *invite, *setby, *tims;
+   const char *target;
    long secs;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 5, NULL, &channel, &invite,
            &setby, &tims);
+   channel = recode_in(SERVER(server), channel, NULL);
+   target = get_visible_target(server, channel);
    secs = *tims == '\0' ? 0 :
        (long) (time(NULL) - atol(tims));

-   channel = get_visible_target(server, channel);
-   printformat(server, channel, MSGLEVEL_CRAP,
+   printformat(server, target, MSGLEVEL_CRAP,
            *setby == '\0' ? IRCTXT_INVITELIST : IRCTXT_INVITELIST_LONG,
-           channel, invite, setby, secs);
+           target, invite, setby, secs);
+
+   g_free(channel);
    g_free(params);
 }

@@ -248,72 +269,85 @@

 static void event_topic_get(IRC_SERVER_REC *server, const char *data)
 {
-   const char *channel;
-   char *params, *topic, *recoded;
+   char *params, *channel, *topic;
+   const char *target;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 3, NULL, &channel, &topic);
-   recoded = recode_in(SERVER(server), topic, channel);
-   channel = get_visible_target(server, channel);
-   printformat(server, channel, MSGLEVEL_CRAP,
-           IRCTXT_TOPIC, channel, recoded);
+   channel = recode_in(SERVER(server), channel, NULL);
+   topic = recode_in(SERVER(server), topic, channel);
+   target = get_visible_target(server, channel);
+
+   printformat(server, target, MSGLEVEL_CRAP,
+           IRCTXT_TOPIC, target, topic);
+
+   g_free(topic);
+   g_free(channel);
    g_free(params);
-   g_free(recoded);
 }

 static void event_topic_info(IRC_SERVER_REC *server, const char *data)
 {
-   const char *channel;
-   char *params, *timestr, *bynick, *byhost, *topictime;
+   char *params, *channel, *timestr, *bynick, *byhost, *topictime;
+   const char *target;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 4, NULL, &channel,
                  &bynick, &topictime);
-
+   channel = recode_in(SERVER(server), channel, NULL);
+   target = get_visible_target(server, channel);
         timestr = my_asctime((time_t) atol(topictime));

    byhost = strchr(bynick, '!');
    if (byhost != NULL)
        *byhost++ = '\0';

-   channel = get_visible_target(server, channel);
-   printformat(server, channel, MSGLEVEL_CRAP, IRCTXT_TOPIC_INFO,
+   printformat(server, target, MSGLEVEL_CRAP, IRCTXT_TOPIC_INFO,
            bynick, timestr, byhost == NULL ? "" : byhost);
+
    g_free(timestr);
+   g_free(channel);
    g_free(params);
 }

 static void event_channel_mode(IRC_SERVER_REC *server, const char *data)
 {
-   const char *channel;
-   char *params, *mode;
+   char *params, *channel, *mode;
+   const char *target;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 3 | PARAM_FLAG_GETREST,
                  NULL, &channel, &mode);
-   channel = get_visible_target(server, channel);
-   printformat(server, channel, MSGLEVEL_CRAP,
-           IRCTXT_CHANNEL_MODE, channel, g_strchomp(mode));
+   channel = recode_in(SERVER(server), channel, NULL);
+   target = get_visible_target(server, channel);
+
+   printformat(server, target, MSGLEVEL_CRAP,
+           IRCTXT_CHANNEL_MODE, target, g_strchomp(mode));
+
+   g_free(channel);
    g_free(params);
 }

 static void event_channel_created(IRC_SERVER_REC *server, const char *data)
 {
-   const char *channel;
-   char *params, *createtime, *timestr;
+   char *params, *channel, *createtime, *timestr;
+   const char *target;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 3, NULL, &channel, &createtime);
+   channel = recode_in(SERVER(server), channel, NULL);
+   target = get_visible_target(server, channel);
+   timestr = my_asctime((time_t) atol(createtime));

-        timestr = my_asctime((time_t) atol(createtime));
-   channel = get_visible_target(server, channel);
-   printformat(server, channel, MSGLEVEL_CRAP,
-           IRCTXT_CHANNEL_CREATED, channel, timestr);
+   printformat(server, target, MSGLEVEL_CRAP,
+           IRCTXT_CHANNEL_CREATED, target, timestr);
+
    g_free(timestr);
+   g_free(channel);
    g_free(params);
 }

@@ -370,22 +404,30 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 3, NULL, &nick, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);
+
    printformat(server, nick, MSGLEVEL_CRAP,
            IRCTXT_INVITING, nick, channel);
+
+   g_free(channel);
    g_free(params);
 }

 static void event_chanserv_url(IRC_SERVER_REC *server, const char *data)
 {
-   const char *channel;
-   char *params, *url;
+   char *params, *channel, *url;
+   const char *target;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 3, NULL, &channel, &url);
-   channel = get_visible_target(server, channel);
-   printformat(server, channel, MSGLEVEL_CRAP,
-           IRCTXT_CHANNEL_URL, channel, url);
+   channel = recode_in(SERVER(server), channel, NULL);
+   target = get_visible_target(server, channel);
+
+   printformat(server, target, MSGLEVEL_CRAP,
+           IRCTXT_CHANNEL_URL, target, url);
+
+   g_free(channel);
    g_free(params);
 }

@@ -393,17 +435,18 @@
                     const char *nick, const char *addr)
 {
    IRC_CHANNEL_REC *chanrec;
-   char *params, *target;
+   char *params, *channel, *target;

    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, NULL, &target);
-   if (!ischannel(*target)) {
+   channel = recode_in(SERVER(server), target, NULL);
+   if (!ischannel(*channel)) {
        /* nick unavailable */
        printformat(server, NULL, MSGLEVEL_CRAP,
                IRCTXT_NICK_UNAVAILABLE, target);
    } else {
-       chanrec = irc_channel_find(server, target);
+       chanrec = irc_channel_find(server, channel);
        if (chanrec != NULL && chanrec->joined) {
            /* dalnet - can't change nick while being banned */
            print_event_received(server, data, nick, FALSE);
@@ -414,6 +457,7 @@
        }
    }

+   g_free(channel);
    g_free(params);
 }

@@ -441,8 +485,12 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);
+
    printformat(server, channel, MSGLEVEL_CRAP,
            IRCTXT_NO_SUCH_CHANNEL, channel);
+
+   g_free(channel);
    g_free(params);
 }

@@ -453,7 +501,11 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);
+
    printformat(server, NULL, MSGLEVEL_CRAP, format, channel);
+
+   g_free(channel);
    g_free(params);
 }

@@ -472,6 +524,7 @@
    /* this new addition to ircd breaks completely with older
       "standards", "nick Duplicate ::!!channel ...." */
    params = event_get_params(data, 3, NULL, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);
    p = strchr(channel, ' ');
    if (p != NULL) *p = '\0';

@@ -481,6 +534,7 @@
    } else
        print_event_received(server, data, nick, FALSE);

+   g_free(channel);
    g_free(params);
 }

@@ -523,9 +577,12 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);

    chanrec = irc_channel_find(server, channel);
    print_event_received(server, data, nick, chanrec == NULL || chanrec->joined);
+
+   g_free(channel);
    g_free(params);
 }

@@ -542,9 +599,12 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);

    chanrec = irc_channel_find(server, channel);
    print_event_received(server, data, nick, chanrec == NULL || chanrec->joined);
+
+   g_free(channel);
    g_free(params);
 }

Index: src/irc/core/irc-servers.c
===================================================================
--- src/irc/core/irc-servers.c  (revision 5190)
+++ src/irc/core/irc-servers.c  (working copy)
@@ -81,6 +81,7 @@
    CHANNEL_REC *channel;
    char *str;
    char *recoded;
+   char *target_recoded;

         ircserver = IRC_SERVER(server);
    g_return_if_fail(ircserver != NULL);
@@ -95,8 +96,10 @@
    }

    recoded = recode_out(SERVER(server), msg, target);
-   str = g_strdup_printf("PRIVMSG %s :%s", target, recoded);
+   target_recoded = recode_out(SERVER(server), target, NULL);
+   str = g_strdup_printf("PRIVMSG %s :%s", target_recoded, recoded);
    irc_send_cmd_split(ircserver, str, 2, ircserver->max_msgs_in_cmd);
+   g_free(target_recoded);
    g_free(str);
    g_free(recoded);
 }
@@ -351,9 +354,12 @@
 void irc_server_send_action(IRC_SERVER_REC *server, const char *target, const char *data)
 {
    char *recoded;
+   char *target_recoded;

    recoded = recode_out(SERVER(server), data, target);
+   target_recoded = recode_out(SERVER(server), target, NULL);
    irc_send_cmdv(server, "PRIVMSG %s :\001ACTION %s\001", target, recoded);
+   g_free(target_recoded);
    g_free(recoded);
 }

Index: src/irc/core/irc-channels.c
===================================================================
--- src/irc/core/irc-channels.c (revision 5190)
+++ src/irc/core/irc-channels.c (working copy)
@@ -23,6 +23,7 @@
 #include "misc.h"
 #include "levels.h"
 #include "channels-setup.h"
+#include "recode.h"

 #include "bans.h"
 #include "modes.h"
@@ -146,11 +147,21 @@
                continue;
        }
        if (outchans->len > 0) {
+           char *outchans_recoded;
+           char *outkeys_recoded;
+
            g_string_truncate(outchans, outchans->len-1);
+           outchans_recoded = recode_out(SERVER(server),
+                   outchans->str, NULL);
            g_string_truncate(outkeys, outkeys->len-1);
+           outkeys_recoded = recode_out(SERVER(server),
+                   outkeys->str, NULL);
            irc_send_cmdv(IRC_SERVER(server),
                      use_keys ? "JOIN %s %s" : "JOIN %s",
-                     outchans->str, outkeys->str);
+                     outchans_recoded, outkeys_recoded);
+
+           g_free(outkeys_recoded);
+           g_free(outchans_recoded);
        }
        cmdlen = 0;
        g_string_truncate(outchans,0);
Index: src/irc/core/irc-nicklist.c
===================================================================
--- src/irc/core/irc-nicklist.c (revision 5190)
+++ src/irc/core/irc-nicklist.c (working copy)
@@ -21,6 +21,7 @@
 #include "module.h"
 #include "signals.h"
 #include "misc.h"
+#include "recode.h"

 #include "irc-servers.h"
 #include "irc-channels.h"
@@ -110,10 +111,12 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 4, NULL, &type, &channel, &names);
+   channel = recode_in(SERVER(server), channel, NULL);

    chanrec = irc_channel_find(server, channel);
    if (chanrec == NULL || chanrec->names_got) {
        /* unknown channel / names list already read */
+       g_free(channel);
        g_free(params);
        return;
    }
@@ -168,6 +171,7 @@
        }
    }

+   g_free(channel);
    g_free(params);
 }

@@ -181,6 +185,7 @@
    g_return_if_fail(server != NULL);

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);

    chanrec = irc_channel_find(server, channel);
    if (chanrec != NULL && !chanrec->names_got) {
@@ -199,6 +204,7 @@
        signal_emit("channel joined", 1, chanrec);
    }

+   g_free(channel);
    g_free(params);
 }

@@ -212,6 +218,7 @@

    params = event_get_params(data, 8, NULL, &channel, &user, &host,
                  NULL, &nick, &stat, &realname);
+   channel = recode_in(SERVER(server), channel, NULL);

    /* get hop count */
    hops = realname;
@@ -238,6 +245,7 @@
                  strchr(stat, 'G') != NULL, /* gone */
                  strchr(stat, '*') != NULL); /* ircop */

+   g_free(channel);
    g_free(params);
 }

Index: src/irc/core/modes.c
===================================================================
--- src/irc/core/modes.c    (revision 5190)
+++ src/irc/core/modes.c    (working copy)
@@ -21,6 +21,7 @@
 #include "module.h"
 #include "signals.h"
 #include "settings.h"
+#include "recode.h"

 #include "irc-commands.h"
 #include "irc-servers.h"
@@ -554,11 +555,15 @@
    GString *str;
    int num, modepos;
    char **nick, **nicklist;
+   char *channel_recoded;

    g_return_if_fail(IS_IRC_CHANNEL(channel));
    g_return_if_fail(nicks != NULL && mode != NULL);
    if (*nicks == '\0') return;

+   channel_recoded = recode_out(SERVER(channel->server),
+       channel->name, NULL);
+
    num = modepos = 0;
    str = g_string_new(NULL);

@@ -570,7 +575,7 @@
        if (num == 0)
        {
            g_string_printf(str, "MODE %s %s",
-                    channel->name, mode);
+                    channel_recoded, mode);
            modepos = str->len;
        } else {
            /* insert the mode string */
@@ -587,6 +592,7 @@
    }
    if (num > 0) irc_send_cmd(channel->server, str->str);

+   g_free(channel_recoded);
    g_strfreev(nicklist);
    g_string_free(str, TRUE);
 }
@@ -597,6 +603,7 @@
    IRC_CHANNEL_REC *chanrec;
    GString *tmode, *targs;
    char *modestr, *curmode, *orig, type, prevtype;
+   char *channel_recoded;
    int count;

    g_return_if_fail(IS_IRC_SERVER(server));
@@ -607,9 +614,12 @@
    count = 0;

    chanrec = irc_channel_find(server, channel);
-   if (chanrec != NULL)
+   if (chanrec != NULL) {
        channel = chanrec->name;
+   }

+   channel_recoded = recode_out(SERVER(server), channel, NULL);
+
    orig = modestr = g_strdup(mode);

         type = '+'; prevtype = '\0';
@@ -630,7 +640,7 @@
        if (count == server->max_modes_in_cmd &&
            HAS_MODE_ARG(server, type, *curmode)) {
            irc_send_cmdv(server, "MODE %s %s%s",
-                     channel, tmode->str, targs->str);
+                     channel_recoded, tmode->str, targs->str);

            count = 0; prevtype = '\0';
            g_string_truncate(tmode, 0);
@@ -665,11 +675,12 @@

    if (tmode->len > 0) {
        irc_send_cmdv(server, "MODE %s %s%s",
-                 channel, tmode->str, targs->str);
+                 channel_recoded, tmode->str, targs->str);
    }

    g_string_free(tmode, TRUE);
    g_string_free(targs, TRUE);
+   g_free(channel_recoded);
    g_free(orig);
 }

@@ -829,6 +840,7 @@
 {
    IRC_CHANNEL_REC *chanrec;
    char *target, *mode;
+   char *target_recoded;
    void *free_arg;

         CMD_IRC_SERVER(server);
@@ -855,7 +867,14 @@
        if (chanrec != NULL)
            target = chanrec->name;

-       irc_send_cmdv(server, "MODE %s", target);
+       // only channel names are recoded
+       if (ischannel(*target))
+           target_recoded = recode_out(SERVER(server), target, NULL);
+       else
+           target_recoded = target;
+       irc_send_cmdv(server, "MODE %s", target_recoded);
+       if (ischannel(*target))
+           g_free(target_recoded);
    } else if (ischannel(*target))
        channel_set_mode(server, target, mode);
    else {
Index: src/irc/core/channel-events.c
===================================================================
--- src/irc/core/channel-events.c   (revision 5190)
+++ src/irc/core/channel-events.c   (working copy)
@@ -59,10 +59,12 @@
       which we haven't joined yet. 4xx are error codes and should
       indicate that the join failed. */
    params = event_get_params(line, 3, &numeric, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);

    if (numeric[0] == '4')
        check_join_failure(server, channel);

+   g_free(channel);
    g_free(params);
 }

@@ -73,6 +75,7 @@
    char *params, *channel;

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);
    chanrec = *channel == '!' && channel[1] != '\0' ?
        channel_find(SERVER(server), channel) : NULL;

@@ -83,12 +86,15 @@
        if (setup != NULL && setup->autojoin) {
            /* it's autojoin channel though, so create it */
            irc_send_cmdv(server, "JOIN !%s", chanrec->name);
+           g_free(channel);
            g_free(params);
                         return;
        }
    }

    check_join_failure(server, channel);
+
+   g_free(channel);
    g_free(params);
 }

@@ -102,6 +108,7 @@
    /* this new addition to ircd breaks completely with older
       "standards", "nick Duplicate ::!!channel ...." */
    params = event_get_params(data, 3, NULL, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);
    p = strchr(channel, ' ');
    if (p != NULL) *p = '\0';

@@ -114,6 +121,7 @@
        }
    }

+   g_free(channel);
    g_free(params);
 }

@@ -150,7 +158,11 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 3, NULL, &channel, &topic);
+   channel = recode_in(SERVER(server), channel, NULL);
+
    channel_change_topic(server, channel, topic, NULL, 0);
+
+   g_free(channel);
    g_free(params);
 }

@@ -162,10 +174,14 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, &channel, &topic);
+   channel = recode_in(SERVER(server), channel, NULL);
    mask = addr == NULL ? g_strdup(nick) :
        g_strconcat(nick, "!", addr, NULL);
+
    channel_change_topic(server, channel, topic, mask, time(NULL));
+
    g_free(mask);
+   g_free(channel);
    g_free(params);
 }

@@ -178,9 +194,12 @@

    params = event_get_params(data, 4, NULL, &channel,
                  &topicby, &topictime);
+   channel = recode_in(SERVER(server), channel, NULL);
+   t = (time_t) atol(topictime);

-   t = (time_t) atol(topictime);
    channel_change_topic(server, channel, NULL, topicby, t);
+
+   g_free(channel);
    g_free(params);
 }

@@ -223,6 +242,7 @@
        server->userhost = g_strdup(address);

    params = event_get_params(data, 1, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);
    tmp = strchr(channel, 7); /* ^G does something weird.. */
    if (tmp != NULL) *tmp = '\0';

@@ -276,6 +296,7 @@
    }

    g_free(shortchan);
+   g_free(channel);
    g_free(params);
 }

@@ -292,6 +313,7 @@
    }

    params = event_get_params(data, 2, &channel, &reason);
+   channel = recode_in(SERVER(server), channel, NULL);

    chanrec = channel_find(SERVER(server), channel);
    if (chanrec != NULL && chanrec->joined) {
@@ -299,6 +321,7 @@
        channel_destroy(chanrec);
    }

+   g_free(channel);
    g_free(params);
 }

@@ -310,6 +333,7 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 3, &channel, &nick, &reason);
+   channel = recode_in(SERVER(server), channel, NULL);

    if (g_strcasecmp(nick, server->nick) != 0) {
        /* someone else was kicked, no need to do anything */
@@ -324,6 +348,7 @@
        channel_destroy(chanrec);
    }

+   g_free(channel);
    g_free(params);
 }

@@ -334,6 +359,7 @@
    g_return_if_fail(data != NULL);

    params = event_get_params(data, 2, NULL, &channel);
+   channel = recode_in(SERVER(server), channel, NULL);

    if (irc_channel_find(server, channel) == NULL) {
                 /* check if we're supposed to autojoin this channel */
@@ -353,6 +379,7 @@

    g_free_not_null(server->last_invite);
    server->last_invite = g_strdup(channel);
+   g_free(channel);
    g_free(params);
 }

Index: src/irc/core/irc-commands.c
===================================================================
--- src/irc/core/irc-commands.c (revision 5190)
+++ src/irc/core/irc-commands.c (working copy)
@@ -65,6 +65,7 @@
 {
    const char *target, *msg;
    char *recoded;
+   char *target_recoded;
    void *free_arg;

         CMD_IRC_SERVER(server);
@@ -78,7 +79,12 @@
        cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);

    recoded = recode_out(SERVER(server), msg, target);
-   g_string_printf(tmpstr, "NOTICE %s :%s", target, recoded);
+   if (ischannel(*target)) {
+       target_recoded = recode_out(SERVER(server), target, NULL);
+       g_string_printf(tmpstr, "NOTICE %s :%s", target_recoded, recoded);
+       g_free(target_recoded);
+   } else
+       g_string_printf(tmpstr, "NOTICE %s :%s", target, recoded);
    g_free(recoded);

    irc_send_cmd_split(server, tmpstr->str, 2, server->max_msgs_in_cmd);
@@ -91,6 +97,7 @@
             WI_ITEM_REC *item)
 {
    const char *target;
+   char *target_recoded = NULL;
    char *ctcpcmd, *ctcpdata;
    void *free_arg;

@@ -106,12 +113,24 @@

    ascii_strup(ctcpcmd);
    if (*ctcpdata == '\0')
-       g_string_printf(tmpstr, "PRIVMSG %s :\001%s\001", target, ctcpcmd);
+       if (ischannel(*target)) {
+           target_recoded = recode_out(SERVER(server), target, NULL);
+           g_string_printf(tmpstr, "PRIVMSG %s :\001%s\001", target_recoded, ctcpcmd);
+           g_free(target_recoded);
+       } else
+           g_string_printf(tmpstr, "PRIVMSG %s :\001%s\001", target, ctcpcmd);
    else {
        char *recoded;

        recoded = recode_out(SERVER(server), ctcpdata, target);
-       g_string_printf(tmpstr, "PRIVMSG %s :\001%s %s\001", target, ctcpcmd, recoded);
+       if (ischannel(*target)) {
+           target_recoded = recode_out(SERVER(server), target, NULL);
+           g_string_printf(tmpstr, "PRIVMSG %s :\001%s %s\001",
+               target_recoded, ctcpcmd, recoded);
+           g_free(target_recoded);
+       } else
+           g_string_printf(tmpstr, "PRIVMSG %s :\001%s %s\001",
+               target, ctcpcmd, recoded);
        g_free(recoded);
    }

@@ -125,6 +144,7 @@
              WI_ITEM_REC *item)
 {
    const char *target;
+   char *target_recoded = NULL;
    char *ctcpcmd, *ctcpdata, *recoded;
    void *free_arg;

@@ -140,7 +160,14 @@

    ascii_strup(ctcpcmd);
    recoded = recode_out(SERVER(server), ctcpdata, target);
-   g_string_printf(tmpstr, "NOTICE %s :\001%s %s\001", target, ctcpcmd, recoded);
+   if (ischannel(*target)) {
+       target_recoded = recode_out(SERVER(server), target, NULL);
+       g_string_printf(tmpstr, "NOTICE %s :\001%s %s\001",
+           target_recoded, ctcpcmd, recoded);
+       g_free(target_recoded);
+   } else
+       g_string_printf(tmpstr, "NOTICE %s :\001%s %s\001",
+           target, ctcpcmd, recoded);
    g_free(recoded);

    irc_send_cmd_split(server, tmpstr->str, 2, server->max_msgs_in_cmd);
@@ -170,9 +197,12 @@

    if (*msg != '\0')
        recoded = recode_out(SERVER(server), msg, channame);
+   channame = recode_out(SERVER(server), channame, NULL);
+
    irc_send_cmdv(server, ! recoded ? "PART %s" : "PART %s :%s",
              channame, recoded);

+   g_free(channame);
    g_free(recoded);
    cmd_params_free(free_arg);
 }
@@ -180,7 +210,7 @@
 /* SYNTAX: KICK [<channel>] <nicks> [<reason>] */
 static void cmd_kick(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item)
 {
-   char *channame, *nicks, *reason, *recoded;
+   char *channame, *nicks, *reason;
    void *free_arg;

         CMD_IRC_SERVER(server);
@@ -193,12 +223,14 @@
    if (*channame == '\0' || *nicks == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
    if (!ischannel(*channame)) cmd_param_error(CMDERR_NOT_JOINED);

-   recoded = recode_out(SERVER(server), reason, channame);
-   g_string_printf(tmpstr, "KICK %s %s :%s", channame, nicks, recoded);
-   g_free(recoded);
+   reason = recode_out(SERVER(server), reason, channame);
+   channame = recode_out(SERVER(server), channame, NULL);
+   g_string_printf(tmpstr, "KICK %s %s :%s", channame, nicks, reason);

    irc_send_cmd_split(server, tmpstr->str, 3, server->max_kicks_in_cmd);

+   g_free(channame);
+   g_free(reason);
    cmd_params_free(free_arg);
 }

@@ -207,7 +239,6 @@
 {
    GHashTable *optlist;
    char *channame, *topic;
-   char *recoded = NULL;
    void *free_arg;

         CMD_IRC_SERVER(server);
@@ -218,11 +249,13 @@
        return;

    if (*topic != '\0' || g_hash_table_lookup(optlist, "delete") != NULL)
-       recoded = recode_out(SERVER(server), topic, channame);
-   irc_send_cmdv(server, recoded == NULL ? "TOPIC %s" : "TOPIC %s :%s",
-             channame, recoded);
-   g_free(recoded);
+       topic = recode_out(SERVER(server), topic, channame);
+   channame = recode_out(SERVER(server), channame, NULL);
+   irc_send_cmdv(server, topic == NULL ? "TOPIC %s" : "TOPIC %s :%s",
+             channame, topic);

+   g_free(channame);
+   g_free(topic);
    cmd_params_free(free_arg);
 }

@@ -244,8 +277,11 @@

        channame = IRC_CHANNEL(item)->name;
    }
+   channame = recode_out(SERVER(server), channame, NULL);

    irc_send_cmdv(server, "INVITE %s %s", nick, channame);
+
+   g_free(channame);
    cmd_params_free(free_arg);
 }

@@ -268,7 +304,10 @@
         server->channels_formed > LIST_MAX_CHANNELS_PASS))
        cmd_param_error(CMDERR_NOT_GOOD_IDEA);

+   str = recode_out(SERVER(server), str, NULL);
    irc_send_cmdv(server, "LIST %s", str);
+
+   g_free(str);
    cmd_params_free(free_arg);
 }

@@ -292,11 +331,14 @@
    }
    if (strcmp(channel, "**") == 0) {
        /* ** displays all nicks.. */
-       *channel = '\0';
+       irc_send_cmd(server, "WHO");
+   } else {
+       channel = recode_out(SERVER(server), channel, NULL);
+       irc_send_cmdv(server, *rest == '\0' ? "WHO %s" : "WHO %s %s",
+             channel, rest);
+       g_free(channel);
    }

-   irc_send_cmdv(server, *rest == '\0' ? "WHO %s" : "WHO %s %s",
-             channel, rest);
    cmd_params_free(free_arg);
 }

@@ -324,7 +366,9 @@
        /* ** displays all nicks.. */
                 irc_send_cmd(server, "NAMES");
    } else {
+       channel = recode_out(SERVER(server), channel, NULL);
        irc_send_cmdv(server, "NAMES %s", channel);
+       g_free(channel);
    }

    cmd_params_free(free_arg);
@@ -629,17 +673,18 @@
    if (chanrec == NULL) cmd_param_error(CMDERR_CHAN_NOT_FOUND);

    recoded = recode_out(SERVER(server), msg, channame);
+   channame = recode_out(SERVER(server), chanrec->name, NULL);
    /* See if the server has advertised support of wallchops */
    if (g_hash_table_lookup(chanrec->server->isupport, "statusmsg") ||
        g_hash_table_lookup(chanrec->server->isupport, "wallchops"))
-       irc_send_cmdv(server, "NOTICE @%s :%s", chanrec->name, recoded);
+       irc_send_cmdv(server, "NOTICE @%s :%s", channame, recoded);
    else {
        /* Fall back to manually noticing each op */
        nicks = NULL;
        g_hash_table_foreach(chanrec->nicks,
                     (GHFunc) cmd_wall_hash, &nicks);

-       args = g_strconcat(chanrec->name, " ", recoded, NULL);
+       args = g_strconcat(channame, " ", recoded, NULL);
        msg = parse_special_string(settings_get_str("wall_format"),
                       SERVER(server), item, args, NULL, 0);
        g_free(args);
@@ -657,6 +702,7 @@
        g_slist_free(nicks);
    }

+   g_free(channame);
    g_free(recoded);
    cmd_params_free(free_arg);
 }
@@ -688,7 +734,8 @@
    g_strfreev(nicklist);

    recoded = recode_out(SERVER(server), reason, channel);
-   kickcmd = g_strdup_printf("%s %s %s", chanrec->name, nicks, recoded);
+   channel = recode_out(SERVER(server), chanrec->name, NULL);
+   kickcmd = g_strdup_printf("%s %s %s", channel, nicks, recoded);
    g_free(recoded);

    bancmd = g_strdup_printf("%s %s", chanrec->name, spacenicks);
@@ -704,6 +751,7 @@
    g_free(kickcmd);
    g_free(bancmd);

+   g_free(channel);
    cmd_params_free(free_arg);
 }

@@ -750,6 +798,7 @@
 {
    KNOCKOUT_REC *rec;
    char *nicks, *reason, *timeoutstr, *kickcmd, *bancmd, *recoded;
+   char *channame;
         char **nicklist, *spacenicks, *banmasks;
    void *free_arg;
    int timeleft;
@@ -785,11 +834,12 @@
    g_free(spacenicks);

    recoded = recode_out(SERVER(server), reason, channel->name);
-   kickcmd = g_strdup_printf("%s %s %s", channel->name, nicks, recoded);
+   channame = recode_out(SERVER(server), channel->name, NULL);
+   kickcmd = g_strdup_printf("%s %s %s", channame, nicks, recoded);
    g_free(recoded);

    bancmd = *banmasks == '\0'? NULL :
-       g_strdup_printf("%s %s", channel->name, banmasks);
+       g_strdup_printf("%s %s", channame, banmasks);

         if (settings_get_bool("kick_first_on_kickban")) {
        signal_emit("command kick", 3, kickcmd, server, channel);
@@ -822,6 +872,7 @@
        rec->unban_time = time(NULL)+timeleft/1000;
    }

+   g_free(channame);
    cmd_params_free(free_arg);
 }

@@ -938,7 +989,14 @@
    if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST, &target, &text))
        return;
    if (*target == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
+
+   if (ischannel(*target))
+       target = recode_out(SERVER(server), target, NULL);
+
    irc_send_cmdv(server, "%s %s :%s", current_command, target, text);
+
+   if (ischannel(*target))
+       g_free(target);
    cmd_params_free(free_arg);
 }
irssibot commented 14 years ago

Nicknames still not recoded properly (for example in /names output).

irssibot commented 13 years ago

Denis, your patch causes irssi to crash when typing /topic in the server window. Look at http://dumpz.org/25438/