Open irssibot opened 14 years ago
Где-то есть патч, решающий эту проблему. Если по-быстрому надо, то скачай из svn версию: r4866 2008-08-01 12:38:58.
Looks like it's a regression introduced in 0.8.13, because 0.8.12 worked fine.
I have the same problem with 0.8.15. I have installed version 0.8.12 and it works fine.
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.
As temporary solution you can start Irssi in UTF-8 terminal with luit program and cp1251 locale: LANG=ru_RU.CP1251 luit irssi
I second this feature request!
Alex: not a solution for me since I use a few IRC networks with Unicode support. But someone may find it useful :]
I second this feature request!
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.
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);
Hi again, I enclose patched patch (sending messages and other things were broken in previous patch).
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);
}
Nicknames still not recoded properly (for example in /names output).
Denis, your patch causes irssi to crash when typing /topic in the server window. Look at http://dumpz.org/25438/
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
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)