From 1bfa44524dabc4ec90880c7fedfd2a838b746656 Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Fri, 11 Mar 2016 11:20:48 +0100 Subject: [PATCH] fix IRC ischannel function fixes #435 --- src/irc/core/irc-servers.c | 40 +++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/src/irc/core/irc-servers.c b/src/irc/core/irc-servers.c index 81f0c269..071d32b5 100644 --- a/src/irc/core/irc-servers.c +++ b/src/irc/core/irc-servers.c @@ -78,17 +78,47 @@ static int ischannel_func(SERVER_REC *server, const char *data) IRC_SERVER_REC *irc_server = (IRC_SERVER_REC *) server; char *chantypes, *statusmsg; + /* empty string is no channel */ + if (*data == '\0') + return FALSE; + chantypes = g_hash_table_lookup(irc_server->isupport, "chantypes"); if (chantypes == NULL) chantypes = "#&!+"; /* normal, local, secure, modeless */ + + if (strchr(chantypes, *data) != NULL) + return TRUE; + statusmsg = g_hash_table_lookup(irc_server->isupport, "statusmsg"); - if (statusmsg == NULL) - statusmsg = "@+"; + if (statusmsg == NULL) { + gboolean wallchops = g_hash_table_lookup(irc_server->isupport, + "wallchops") != NULL; + gboolean wallvoices = g_hash_table_lookup(irc_server->isupport, + "wallvoices") != NULL; + if (wallchops && wallvoices) + statusmsg = "@+"; + else if (wallchops) + statusmsg = "@"; + else if (wallvoices) + statusmsg = "+"; + else + return FALSE; + } - while (strchr(statusmsg, *data) != NULL) - data++; + /* No statusmsg announced, so there is no statusmsg prefix to skip */ + if (*statusmsg == '\0') + return FALSE; - return strchr(chantypes, *data) != NULL; + while (*data != '\0') { + if (strchr(chantypes, *data) != NULL) + return TRUE; + else if (strchr(statusmsg, *data) != NULL) + data++; + else + return FALSE; + } + + return FALSE; } static char **split_line(const SERVER_REC *server, const char *line,