# HG changeset patch # User Ethan Blanton # Date 1169965879 0 # Node ID 8ff4af28c9f94feb708dafb73458c7eeb5f1ca37 # Parent a415922e288264d3a029982beffec8eee9976be3 Recognize non-standard mode characters communicated in an 005 numeric for IRC diff -r a415922e2882 -r 8ff4af28c9f9 libpurple/protocols/irc/irc.h --- a/libpurple/protocols/irc/irc.h Sun Jan 28 01:24:15 2007 +0000 +++ b/libpurple/protocols/irc/irc.h Sun Jan 28 06:31:19 2007 +0000 @@ -116,6 +116,7 @@ void irc_msg_chanmode(struct irc_conn *irc, const char *name, const char *from, char **args); void irc_msg_endwhois(struct irc_conn *irc, const char *name, const char *from, char **args); void irc_msg_endmotd(struct irc_conn *irc, const char *name, const char *from, char **args); +void irc_msg_features(struct irc_conn *irc, const char *name, const char *from, char **args); void irc_msg_invite(struct irc_conn *irc, const char *name, const char *from, char **args); void irc_msg_inviteonly(struct irc_conn *irc, const char *name, const char *from, char **args); void irc_msg_ison(struct irc_conn *irc, const char *name, const char *from, char **args); diff -r a415922e2882 -r 8ff4af28c9f9 libpurple/protocols/irc/msgs.c --- a/libpurple/protocols/irc/msgs.c Sun Jan 28 01:24:15 2007 +0000 +++ b/libpurple/protocols/irc/msgs.c Sun Jan 28 06:31:19 2007 +0000 @@ -40,6 +40,8 @@ const char *from, const char *to, const char *rawmsg, gboolean notice); +static char *mode_chars = NULL; + static char *irc_mask_nick(const char *mask) { char *end, *buf; @@ -75,6 +77,24 @@ gaim_debug(GAIM_DEBUG_INFO, "irc", "Unrecognized message: %s\n", args[0]); } +void irc_msg_features(struct irc_conn *irc, const char *name, const char *from, char **args) +{ + gchar **features; + int i; + + if (!args || !args[0] || !args[1]) + return; + + features = g_strsplit(args[1], " ", -1); + for (i = 0; features[i]; i++) { + char *val; + if (!strncmp(features[i], "PREFIX=", 7)) { + if ((val = strchr(features[i] + 7, ')')) != NULL) + mode_chars = g_strdup(val + 1); + } + } +} + void irc_msg_away(struct irc_conn *irc, const char *name, const char *from, char **args) { GaimConnection *gc; @@ -408,6 +428,9 @@ } else if(*cur == '+') { f = GAIM_CBFLAGS_VOICE; cur++; + } else if(mode_chars + && strchr(mode_chars, *cur)) { + cur++; } tmp = g_strndup(cur, end - cur); users = g_list_prepend(users, tmp); diff -r a415922e2882 -r 8ff4af28c9f9 libpurple/protocols/irc/parse.c --- a/libpurple/protocols/irc/parse.c Sun Jan 28 01:24:15 2007 +0000 +++ b/libpurple/protocols/irc/parse.c Sun Jan 28 06:31:19 2007 +0000 @@ -52,6 +52,7 @@ char *format; void (*cb)(struct irc_conn *irc, const char *name, const char *from, char **args); } _irc_msgs[] = { + { "005", "n*", irc_msg_features }, /* Feature list */ { "301", "nn:", irc_msg_away }, /* User is away */ { "303", "n:", irc_msg_ison }, /* ISON reply */ { "311", "nnvvv:", irc_msg_whois }, /* Whois user */