summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/proto-irc.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/common/proto-irc.c b/src/common/proto-irc.c
index b1c869fc..ed7d9a4d 100644
--- a/src/common/proto-irc.c
+++ b/src/common/proto-irc.c
@@ -49,6 +49,7 @@ irc_login (server *serv, char *user, char *realname)
 {
 	if (serv->password[0])
 		tcp_sendf (serv, "PASS %s\r\n", serv->password);
+	tcp_sendf (serv, "CAP LS\r\n");
 
 	tcp_sendf (serv,
 				  "NICK %s\r\n"
@@ -1114,6 +1115,41 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[])
 		}
 	}
 
+	else if (len == 3)
+	{
+		guint32 t;
+
+		t = WORDL((guint8)type[0], (guint8)type[1], (guint8)type[2], (guint8)type[3]);
+		switch (t)
+		{
+			case WORDL('C','A','P','\0'):
+				if (strncasecmp (word[4], "ACK", 3) == 0)
+				{
+					if (strncasecmp (word[5][0]==':' ? word[5] + 1 : word[5], "identify-msg", 12) == 0)
+					{
+						serv->have_idmsg = TRUE;
+						tcp_send_len (serv, "CAP END\r\n", 9);
+					}
+				}
+				else if (strncasecmp (word[4], "LS", 2) == 0)
+				{
+					if (strstr (word_eol[5], "identify-msg") != 0)
+					{
+						tcp_send_len (serv, "CAP REQ :identify-msg\r\n", 23);
+					}
+					else
+					{
+						tcp_send_len (serv, "CAP END\r\n", 9);
+					}
+				}
+				else if (strncasecmp (word[4], "NAK",3) == 0)
+				{
+					tcp_send_len (serv, "CAP END\r\n", 9);
+				}
+				return;
+		}
+	}
+
 garbage:
 	/* unknown message */
 	PrintTextf (sess, "GARBAGE: %s\n", word_eol[1]);