irssi-import / bugs.irssi.org

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

different recode for dcc and usual nicknames (patch included) #800

Open irssibot opened 13 years ago

irssibot commented 13 years ago

There are IRC networks where servers can do recode for different clients (e.g. port-based). In this case one don't need recode for normal chats, but do need for DCC ones.

So then you go to this DCC chat window and do /recode add CP1251 Then see a "=nick" in conversion database. The problem is - it doesn't recode anything. Then you try /recode add nick CP1251

After this conversion database contains to records, for "nick" and "=nick". This is expected. Recode in DCC begins to work after this, but it now wrongly applies to normal chat window also. This is NOT expected (bug).

The attached patch fixes this bug (tested on 0.8.15), after this conversion database begins to work in expected and intuitive way: records for "nick" and "=nick" are both working and serve different purposes.

irssibot commented 13 years ago

patch-irc_dcc_dcc-chat_c

--- src/irc/dcc/dcc-chat.c.orig 2011-04-15 20:50:38.000000000 +0700
+++ src/irc/dcc/dcc-chat.c  2011-04-15 20:54:35.000000000 +0700
@@ -146,15 +146,18 @@
 {
    char *str;
    char *recoded;
+   char *convdbnick;

    if (chat != NULL && chat->sendbuf != NULL) {
        /* send it via open DCC chat */
-       recoded = recode_out(SERVER(server), msg, chat->nick);
+       convdbnick = g_strdup_printf("=%s", chat->nick);
+       recoded = recode_out(SERVER(server), msg, convdbnick);
        str = g_strdup_printf("%s\001%s\001", chat->mirc_ctcp ? "" :
                      notice ? "CTCP_REPLY " :
                      "CTCP_MESSAGE ", recoded);
                 dcc_chat_send(chat, str);
        g_free(str);
+       g_free(convdbnick);
    } else {
        recoded = recode_out(SERVER(server), msg, target);
        irc_send_cmdv(server, "%s %s :\001%s\001",
@@ -200,10 +203,13 @@

    if (dcc != NULL && dcc->sendbuf != NULL) {
        char *recoded;
+       char *convdbnick;

-       recoded = recode_out(server, text, dcc->nick);
+       convdbnick = g_strdup_printf("=%s", dcc->nick);
+       recoded = recode_out(server, text, convdbnick);
        dcc_chat_send(dcc, recoded);
        g_free(recoded);
+       g_free(convdbnick);
    }

    if (dcc != NULL || *target == '=')
@@ -312,12 +318,15 @@

        if (ret > 0) {
            char *recoded;
+           char *convdbnick;

            dcc->transfd += ret;

-           recoded = recode_in(SERVER(dcc->server), str, dcc->nick);
+           convdbnick = g_strdup_printf("=%s", dcc->nick);
+           recoded = recode_in(SERVER(dcc->server), str, convdbnick);
            signal_emit("dcc chat message", 2, dcc, recoded);
            g_free(recoded);
+           g_free(convdbnick);
        }
    } while (ret > 0);
 }