summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorTingPing <tingping@tingping.se>2013-08-20 00:24:11 -0400
committerTingPing <tingping@tingping.se>2013-08-20 00:24:20 -0400
commit77c1edbe13e1d4a2697e184a01d174004dd9e25b (patch)
treecef2bff93cd6d0b5af8aa173aafdfa8951c1688b
parent46c32952b06452a219424ed3e5a6c1da92691a49 (diff)
Handle lists in MONITOR replies
-rw-r--r--src/common/notify.c64
-rw-r--r--src/common/notify.h5
-rw-r--r--src/common/proto-irc.c12
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 ' */