diff options
author | Alexander Færøy <ahf@0x90.dk> | 2015-09-10 01:37:08 +0200 |
---|---|---|
committer | Alexander Færøy <ahf@0x90.dk> | 2015-09-10 01:37:08 +0200 |
commit | 7b46dae1825fc90d97163b40cdca2ffaceb2e13c (patch) | |
tree | 96146bab7bf0bf8bb2900ab30afed456fb53ae99 /src/fe-common | |
parent | 762c1d7f2c7478f1e98f847352e6cb3ca889c580 (diff) | |
parent | 4346c2a6d479b9c4d94fabc35ade324fdbe0e0d0 (diff) | |
download | irssi-7b46dae1825fc90d97163b40cdca2ffaceb2e13c.zip |
Merge pull request #248 from LemonBoy/chantypes
Implement CHANTYPES support
Diffstat (limited to 'src/fe-common')
-rw-r--r-- | src/fe-common/irc/dcc/fe-dcc-chat.c | 2 | ||||
-rw-r--r-- | src/fe-common/irc/dcc/fe-dcc-get.c | 5 | ||||
-rw-r--r-- | src/fe-common/irc/fe-common-irc.c | 4 | ||||
-rw-r--r-- | src/fe-common/irc/fe-ctcp.c | 8 | ||||
-rw-r--r-- | src/fe-common/irc/fe-events-numeric.c | 4 | ||||
-rw-r--r-- | src/fe-common/irc/fe-events.c | 12 | ||||
-rw-r--r-- | src/fe-common/irc/fe-irc-channels.c | 47 | ||||
-rw-r--r-- | src/fe-common/irc/fe-irc-channels.h | 10 | ||||
-rw-r--r-- | src/fe-common/irc/fe-irc-messages.c | 58 | ||||
-rw-r--r-- | src/fe-common/irc/fe-irc-queries.c | 2 | ||||
-rw-r--r-- | src/fe-common/irc/fe-modes.c | 2 | ||||
-rw-r--r-- | src/fe-common/irc/fe-netjoin.c | 2 |
12 files changed, 93 insertions, 63 deletions
diff --git a/src/fe-common/irc/dcc/fe-dcc-chat.c b/src/fe-common/irc/dcc/fe-dcc-chat.c index e2706ba3..5bcb3475 100644 --- a/src/fe-common/irc/dcc/fe-dcc-chat.c +++ b/src/fe-common/irc/dcc/fe-dcc-chat.c @@ -44,7 +44,7 @@ static void dcc_request(CHAT_DCC_REC *dcc) if (!IS_DCC_CHAT(dcc)) return; printformat(dcc->server, NULL, MSGLEVEL_DCC, - ischannel(*dcc->target) ? IRCTXT_DCC_CHAT_CHANNEL : + server_ischannel(SERVER(dcc->server), dcc->target) ? IRCTXT_DCC_CHAT_CHANNEL : IRCTXT_DCC_CHAT, dcc->id, dcc->addrstr, dcc->port, dcc->target); } diff --git a/src/fe-common/irc/dcc/fe-dcc-get.c b/src/fe-common/irc/dcc/fe-dcc-get.c index 451463f9..675cab65 100644 --- a/src/fe-common/irc/dcc/fe-dcc-get.c +++ b/src/fe-common/irc/dcc/fe-dcc-get.c @@ -21,6 +21,7 @@ #include "module.h" #include "signals.h" #include "levels.h" +#include "servers.h" #include "irc.h" #include "dcc-file.h" @@ -35,12 +36,12 @@ static void dcc_request(GET_DCC_REC *dcc) { char *sizestr; - if (!IS_DCC_GET(dcc)) return; + if (!IS_DCC_GET(dcc)) return; sizestr = dcc_get_size_str(dcc->size); printformat(dcc->server, NULL, MSGLEVEL_DCC, - ischannel(*dcc->target) ? IRCTXT_DCC_SEND_CHANNEL : + server_ischannel(SERVER(dcc->server), dcc->target) ? IRCTXT_DCC_SEND_CHANNEL : IRCTXT_DCC_SEND, dcc->nick, dcc->addrstr, dcc->port, dcc->arg, sizestr, dcc->target); diff --git a/src/fe-common/irc/fe-common-irc.c b/src/fe-common/irc/fe-common-irc.c index 72606263..d6ab30ce 100644 --- a/src/fe-common/irc/fe-common-irc.c +++ b/src/fe-common/irc/fe-common-irc.c @@ -28,13 +28,11 @@ #include "themes.h" #include "fe-irc-server.h" +#include "fe-irc-channels.h" void fe_irc_modules_init(void); void fe_irc_modules_deinit(void); -void fe_irc_channels_init(void); -void fe_irc_channels_deinit(void); - void fe_irc_queries_init(void); void fe_irc_queries_deinit(void); diff --git a/src/fe-common/irc/fe-ctcp.c b/src/fe-common/irc/fe-ctcp.c index 2321bb7a..cbb591ba 100644 --- a/src/fe-common/irc/fe-ctcp.c +++ b/src/fe-common/irc/fe-ctcp.c @@ -49,7 +49,7 @@ static void ctcp_default_msg(IRC_SERVER_REC *server, const char *data, data = p+1; } - printformat(server, ischannel(*target) ? target : nick, MSGLEVEL_CTCPS, + printformat(server, server_ischannel(SERVER(server), target) ? target : nick, MSGLEVEL_CTCPS, IRCTXT_CTCP_REQUESTED_UNKNOWN, nick, addr, cmd, data, target); g_free(cmd); @@ -113,8 +113,8 @@ static void ctcp_default_reply(IRC_SERVER_REC *server, const char *data, ctcpdata = ptr+1; } - printformat(server, ischannel(*target) ? target : nick, MSGLEVEL_CTCPS, - ischannel(*target) ? IRCTXT_CTCP_REPLY_CHANNEL : + printformat(server, server_ischannel(SERVER(server), target) ? target : nick, MSGLEVEL_CTCPS, + server_ischannel(SERVER(server), target) ? IRCTXT_CTCP_REPLY_CHANNEL : IRCTXT_CTCP_REPLY, ctcp, nick, ctcpdata, target); g_free(ctcp); } @@ -137,7 +137,7 @@ static void ctcp_ping_reply(IRC_SERVER_REC *server, const char *data, g_get_current_time(&tv); usecs = get_timeval_diff(&tv, &tv2); - printformat(server, ischannel(*target) ? target : nick, MSGLEVEL_CTCPS, + printformat(server, server_ischannel(SERVER(server), target) ? target : nick, MSGLEVEL_CTCPS, IRCTXT_CTCP_PING_REPLY, nick, usecs/1000, usecs%1000); } diff --git a/src/fe-common/irc/fe-events-numeric.c b/src/fe-common/irc/fe-events-numeric.c index ec7669ab..3eb124fc 100644 --- a/src/fe-common/irc/fe-events-numeric.c +++ b/src/fe-common/irc/fe-events-numeric.c @@ -400,7 +400,7 @@ static void event_target_unavailable(IRC_SERVER_REC *server, const char *data, g_return_if_fail(data != NULL); params = event_get_params(data, 2, NULL, &target); - if (!ischannel(*target)) { + if (!server_ischannel(SERVER(server), target)) { /* nick unavailable */ printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_NICK_UNAVAILABLE, target); @@ -583,7 +583,7 @@ static void print_event_received(IRC_SERVER_REC *server, const char *data, return; ptr++; - if (ischannel(*data)) /* directed at channel */ + if (server_ischannel(SERVER(server), data)) /* directed at channel */ target = g_strndup(data, (int)(ptr - data - 1)); else if (!target_param || *ptr == ':' || (ptr2 = strchr(ptr, ' ')) == NULL) target = NULL; diff --git a/src/fe-common/irc/fe-events.c b/src/fe-common/irc/fe-events.c index 5cde9e4b..068ee543 100644 --- a/src/fe-common/irc/fe-events.c +++ b/src/fe-common/irc/fe-events.c @@ -52,15 +52,17 @@ static void event_privmsg(IRC_SERVER_REC *server, const char *data, params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg); if (nick == NULL) nick = server->real_address; if (addr == NULL) addr = ""; - if (*target == '@' && ischannel(target[1])) { + + if (fe_channel_is_opchannel(server, target)) { /* Hybrid 6 feature, send msg to all ops in channel */ - recoded = recode_in(SERVER(server), msg, target+1); + target = (char *)fe_channel_skip_prefix(server, target); + recoded = recode_in(SERVER(server), msg, target); signal_emit("message irc op_public", 5, server, recoded, nick, addr, - get_visible_target(server, target+1)); + get_visible_target(server, target)); } else { - recoded = recode_in(SERVER(server), msg, ischannel(*target) ? target : nick); - signal_emit(ischannel(*target) ? + recoded = recode_in(SERVER(server), msg, server_ischannel(SERVER(server), target) ? target : nick); + signal_emit(server_ischannel(SERVER(server), target) ? "message public" : "message private", 5, server, recoded, nick, addr, get_visible_target(server, target)); diff --git a/src/fe-common/irc/fe-irc-channels.c b/src/fe-common/irc/fe-irc-channels.c index e884aef4..d5f17bd0 100644 --- a/src/fe-common/irc/fe-irc-channels.c +++ b/src/fe-common/irc/fe-irc-channels.c @@ -31,6 +31,51 @@ #include "fe-windows.h" #include "window-items.h" +int fe_channel_is_opchannel(IRC_SERVER_REC *server, const char *target) +{ + const char *statusmsg; + + /* Quick check */ + if (server == NULL || server->prefix[(int)(unsigned char)*target] == 0) + return FALSE; + + statusmsg = g_hash_table_lookup(server->isupport, "statusmsg"); + if (statusmsg == NULL) + statusmsg = "@+"; + + return strchr(statusmsg, *target) != NULL; +} + +const char *fe_channel_skip_prefix(IRC_SERVER_REC *server, const char *target) +{ + const char *statusmsg; + + /* Quick check */ + if (server == NULL || server->prefix[(int)(unsigned char)*target] == 0) + return target; + + /* Exit early if target doesn't name a channel */ + if (server_ischannel(SERVER(server), target) == FALSE) + return FALSE; + + statusmsg = g_hash_table_lookup(server->isupport, "statusmsg"); + + /* Hack: for bahamut 1.4 which sends neither STATUSMSG nor + * WALLCHOPS in 005, accept @#chan and @+#chan (but not +#chan) */ + if (statusmsg == NULL && *target != '@') + return target; + + if (statusmsg == NULL) + statusmsg = "@+"; + + /* Strip the leading statusmsg prefixes */ + while (strchr(statusmsg, *target) != NULL) { + target++; + } + + return target; +} + static void sig_channel_rejoin(SERVER_REC *server, REJOIN_REC *rec) { g_return_if_fail(rec != NULL); @@ -46,7 +91,7 @@ static void sig_event_forward(SERVER_REC *server, const char *data, char *params, *from, *to; params = event_get_params(data, 3, NULL, &from, &to); - if (from != NULL && to != NULL && ischannel(*from) && ischannel(*to)) { + if (from != NULL && to != NULL && server_ischannel(server, from) && server_ischannel(server, to)) { channel = irc_channel_find(server, from); if (channel != NULL && irc_channel_find(server, to) == NULL) { window_bind_add(window_item_window(channel), diff --git a/src/fe-common/irc/fe-irc-channels.h b/src/fe-common/irc/fe-irc-channels.h new file mode 100644 index 00000000..d05c91a5 --- /dev/null +++ b/src/fe-common/irc/fe-irc-channels.h @@ -0,0 +1,10 @@ +#ifndef __FE_IRC_CHANNELS_H +#define __FE_IRC_CHANNELS_H + +int fe_channel_is_opchannel(IRC_SERVER_REC *server, const char *target); +const char *fe_channel_skip_prefix(IRC_SERVER_REC *server, const char *target); + +void fe_irc_channels_init(void); +void fe_irc_channels_deinit(void); + +#endif diff --git a/src/fe-common/irc/fe-irc-messages.c b/src/fe-common/irc/fe-irc-messages.c index 94d1ad4a..b2736a2c 100644 --- a/src/fe-common/irc/fe-irc-messages.c +++ b/src/fe-common/irc/fe-irc-messages.c @@ -37,32 +37,6 @@ #include "fe-queries.h" #include "window-items.h" -static const char *skip_target(IRC_SERVER_REC *server, const char *target) -{ - int i = 0; - const char *val, *chars; - - /* Quick check */ - if (server == NULL || server->prefix[(int)(unsigned char)*target] == 0) - return target; - - /* Hack: for bahamut 1.4 which sends neither STATUSMSG nor - * WALLCHOPS in 005, accept @#chan and @+#chan (but not +#chan) */ - val = g_hash_table_lookup(server->isupport, "STATUSMSG"); - if (val == NULL && *target != '@') - return target; - chars = val ? val : "@+"; - for(i = 0; target[i] != '\0'; i++) { - if (strchr(chars, target[i]) == NULL) - break; - }; - - if(ischannel(target[i])) - target += i; - - return target; -} - static void sig_message_own_public(SERVER_REC *server, const char *msg, const char *target, const char *origtarget) { @@ -72,7 +46,7 @@ static void sig_message_own_public(SERVER_REC *server, const char *msg, if (!IS_IRC_SERVER(server)) return; oldtarget = target; - target = skip_target(IRC_SERVER(server), target); + target = fe_channel_skip_prefix(IRC_SERVER(server), target); if (target != oldtarget) { /* Hybrid 6 / Bahamut feature, send msg to all ops / ops+voices in channel */ @@ -135,8 +109,8 @@ static void sig_message_own_action(IRC_SERVER_REC *server, const char *msg, char *freemsg = NULL; oldtarget = target; - target = skip_target(IRC_SERVER(server), target); - if (ischannel(*target)) + target = fe_channel_skip_prefix(IRC_SERVER(server), target); + if (server_ischannel(SERVER(server), target)) item = irc_channel_find(server, target); else item = irc_query_find(server, target); @@ -146,7 +120,7 @@ static void sig_message_own_action(IRC_SERVER_REC *server, const char *msg, printformat(server, target, MSGLEVEL_ACTIONS | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT | - (ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS), + (server_ischannel(SERVER(server), target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS), item != NULL && oldtarget == target ? IRCTXT_OWN_ACTION : IRCTXT_OWN_ACTION_TARGET, server->nick, msg, oldtarget); g_free_not_null(freemsg); @@ -163,10 +137,10 @@ static void sig_message_irc_action(IRC_SERVER_REC *server, const char *msg, int own = FALSE; oldtarget = target; - target = skip_target(IRC_SERVER(server), target); + target = fe_channel_skip_prefix(IRC_SERVER(server), target); level = MSGLEVEL_ACTIONS | - (ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); + (server_ischannel(SERVER(server), target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); if (ignore_check(SERVER(server), nick, address, target, msg, level)) return; @@ -175,7 +149,7 @@ static void sig_message_irc_action(IRC_SERVER_REC *server, const char *msg, level | MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; - if (ischannel(*target)) { + if (server_ischannel(SERVER(server), target)) { item = irc_channel_find(server, target); } else { own = (!g_strcmp0(nick, server->nick)); @@ -185,7 +159,7 @@ static void sig_message_irc_action(IRC_SERVER_REC *server, const char *msg, if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis(item, msg); - if (ischannel(*target)) { + if (server_ischannel(SERVER(server), target)) { /* channel action */ if (window_item_is_active(item) && target == oldtarget) { /* message to active channel in window */ @@ -219,7 +193,7 @@ static void sig_message_irc_action(IRC_SERVER_REC *server, const char *msg, static void sig_message_own_notice(IRC_SERVER_REC *server, const char *msg, const char *target) { - printformat(server, skip_target(server, target), MSGLEVEL_NOTICES | + printformat(server, fe_channel_skip_prefix(server, target), MSGLEVEL_NOTICES | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT, IRCTXT_OWN_NOTICE, target, msg); } @@ -232,7 +206,7 @@ static void sig_message_irc_notice(SERVER_REC *server, const char *msg, int level = MSGLEVEL_NOTICES; oldtarget = target; - target = skip_target(IRC_SERVER(server), target); + target = fe_channel_skip_prefix(IRC_SERVER(server), target); if (address == NULL || *address == '\0') { /* notice from server */ @@ -245,16 +219,16 @@ static void sig_message_irc_notice(SERVER_REC *server, const char *msg, } if (ignore_check(server, nick, address, - ischannel(*target) ? target : NULL, + server_ischannel(SERVER(server), target) ? target : NULL, msg, level)) return; if (ignore_check(server, nick, address, - ischannel(*target) ? target : NULL, + server_ischannel(SERVER(server), target) ? target : NULL, msg, level | MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; - if (ischannel(*target)) { + if (server_ischannel(SERVER(server), target)) { /* notice in some channel */ printformat(server, target, level, IRCTXT_NOTICE_PUBLIC, nick, oldtarget, msg); @@ -270,7 +244,7 @@ static void sig_message_irc_notice(SERVER_REC *server, const char *msg, static void sig_message_own_ctcp(IRC_SERVER_REC *server, const char *cmd, const char *data, const char *target) { - printformat(server, skip_target(server, target), MSGLEVEL_CTCPS | + printformat(server, fe_channel_skip_prefix(server, target), MSGLEVEL_CTCPS | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT, IRCTXT_OWN_CTCP, target, cmd, data); } @@ -282,8 +256,8 @@ static void sig_message_irc_ctcp(IRC_SERVER_REC *server, const char *cmd, const char *oldtarget; oldtarget = target; - target = skip_target(server, target); - printformat(server, ischannel(*target) ? target : nick, MSGLEVEL_CTCPS, + target = fe_channel_skip_prefix(server, target); + printformat(server, server_ischannel(SERVER(server), target) ? target : nick, MSGLEVEL_CTCPS, IRCTXT_CTCP_REQUESTED, nick, addr, cmd, data, oldtarget); } diff --git a/src/fe-common/irc/fe-irc-queries.c b/src/fe-common/irc/fe-irc-queries.c index 0861c9e4..b2faefbc 100644 --- a/src/fe-common/irc/fe-irc-queries.c +++ b/src/fe-common/irc/fe-irc-queries.c @@ -63,7 +63,7 @@ static void event_privmsg(SERVER_REC *server, const char *data, g_return_if_fail(data != NULL); - if (nick == NULL || address == NULL || ischannel(*data) || + if (nick == NULL || address == NULL || server_ischannel(server, data) || !settings_get_bool("query_track_nick_changes")) return; diff --git a/src/fe-common/irc/fe-modes.c b/src/fe-common/irc/fe-modes.c index e5317c0f..53e56c97 100644 --- a/src/fe-common/irc/fe-modes.c +++ b/src/fe-common/irc/fe-modes.c @@ -168,7 +168,7 @@ static void sig_message_mode(IRC_SERVER_REC *server, const char *channel, mode, MSGLEVEL_MODES)) return; - if (!ischannel(*channel)) { + if (!server_ischannel(SERVER(server), channel)) { /* user mode change */ printformat(server, NULL, MSGLEVEL_MODES, IRCTXT_USERMODE_CHANGE, mode, channel); diff --git a/src/fe-common/irc/fe-netjoin.c b/src/fe-common/irc/fe-netjoin.c index 35c463e4..f5cb081e 100644 --- a/src/fe-common/irc/fe-netjoin.c +++ b/src/fe-common/irc/fe-netjoin.c @@ -400,7 +400,7 @@ static void msg_mode(IRC_SERVER_REC *server, const char *channel, int show; g_return_if_fail(data != NULL); - if (!ischannel(*channel) || addr != NULL) + if (!server_ischannel(SERVER(server), channel) || addr != NULL) return; params = event_get_params(data, 2 | PARAM_FLAG_GETREST, |