From 77c1edbe13e1d4a2697e184a01d174004dd9e25b Mon Sep 17 00:00:00 2001 From: TingPing Date: Tue, 20 Aug 2013 00:24:11 -0400 Subject: [PATCH] Handle lists in MONITOR replies --- src/common/notify.c | 64 ++++++++++++++++++++++++++++++++++++++++++ src/common/notify.h | 5 ++++ src/common/proto-irc.c | 12 ++------ 3 files changed, 71 insertions(+), 10 deletions(-) diff --git a/src/common/notify.c b/src/common/notify.c index 944d826c..f1439140 100644 --- a/src/common/notify.c +++ b/src/common/notify.c @@ -284,6 +284,70 @@ notify_set_online (server * serv, char *nick, notify_announce_online (serv, servnot, nick, tags_data); } +/* monitor can send lists for numeric 730/731 */ + +void +notify_set_offline_list (server * serv, char *users, int quiet, + const message_tags_data *tags_data) +{ + struct notify_per_server *servnot; + char nick[NICKLEN]; + char *token, *chr; + int pos; + + token = strtok (users, ","); + while (token != NULL) + { + chr = strchr (token, '!'); + if (!chr) + goto end; + + pos = chr - token; + if (pos + 1 >= sizeof(nick)) + goto end; + + memset (nick, 0, sizeof(nick)); + strncpy (nick, token, pos); + + servnot = notify_find (serv, nick); + if (servnot) + notify_announce_offline (serv, servnot, nick, quiet, tags_data); +end: + token = strtok (NULL, ","); + } +} + +void +notify_set_online_list (server * serv, char *users, + const message_tags_data *tags_data) +{ + struct notify_per_server *servnot; + char nick[NICKLEN]; + char *token, *chr; + int pos; + + token = strtok (users, ","); + while (token != NULL) + { + chr = strchr (token, '!'); + if (!chr) + goto end; + + pos = chr - token; + if (pos + 1 >= sizeof(nick)) + goto end; + + memset (nick, 0, sizeof(nick)); + strncpy (nick, token, pos); + + servnot = notify_find (serv, nick); + if (servnot) + notify_announce_online (serv, servnot, nick, tags_data); +end: + token = strtok (NULL, ","); + } +} + static void notify_watch (server * serv, char *nick, int add) { diff --git a/src/common/notify.h b/src/common/notify.h index 4a6ffb35..5bf43410 100644 --- a/src/common/notify.h +++ b/src/common/notify.h @@ -47,6 +47,11 @@ void notify_set_online (server * serv, char *nick, const message_tags_data *tags_data); void notify_set_offline (server * serv, char *nick, int quiet, const message_tags_data *tags_data); +/* the MONITOR stuff */ +void notify_set_online_list (server * serv, char *users, + const message_tags_data *tags_data); +void notify_set_offline_list (server * serv, char *users, int quiet, + const message_tags_data *tags_data); void notify_send_watches (server * serv); /* the general stuff */ diff --git a/src/common/proto-irc.c b/src/common/proto-irc.c index 642cd056..527a7605 100644 --- a/src/common/proto-irc.c +++ b/src/common/proto-irc.c @@ -465,8 +465,6 @@ process_numeric (session * sess, int n, server *serv = sess->server; /* show whois is the server tab */ session *whois_sess = serv->server_session; - - char *ex; /* unless this setting is on */ if (prefs.hex_irc_whois_front) @@ -942,17 +940,11 @@ process_numeric (session * sess, int n, break; case 730: /* RPL_MONONLINE */ - ex = strchr (word[4], '!'); /* only send the nick */ - if (ex) - ex[0] = 0; - notify_set_online (serv, word[4] + 1, tags_data); + notify_set_online_list (serv, word[4] + 1, tags_data); break; case 731: /* RPL_MONOFFLINE */ - ex = strchr (word[4], '!'); /* only send the nick */ - if (ex) - ex[0] = 0; - notify_set_offline (serv, word[4] + 1, FALSE, tags_data); + notify_set_offline_list (serv, word[4] + 1, FALSE, tags_data); break; case 900: /* successful SASL 'logged in as ' */