summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/common/hexchat.c5
-rw-r--r--src/common/hexchat.h1
-rw-r--r--src/common/inbound.c16
-rw-r--r--src/common/inbound.h1
-rw-r--r--src/common/proto-irc.c15
-rw-r--r--src/common/server.c1
6 files changed, 37 insertions, 2 deletions
diff --git a/src/common/hexchat.c b/src/common/hexchat.c
index 9bd4985b..140f7653 100644
--- a/src/common/hexchat.c
+++ b/src/common/hexchat.c
@@ -336,14 +336,15 @@ doover:
 		list = list->next;
 	}
 
-	/* done them all, reset done_away_check to FALSE and start over */
+	/* done them all, reset done_away_check to FALSE and start over unless we have away-notify */
 	if (full)
 	{
 		list = sess_list;
 		while (list)
 		{
 			sess = list->data;
-			sess->done_away_check = FALSE;
+			if (!sess->server->have_awaynotify)
+				sess->done_away_check = FALSE;
 			list = list->next;
 		}
 		loop++;
diff --git a/src/common/hexchat.h b/src/common/hexchat.h
index 32ffd4d2..3e07ec4e 100644
--- a/src/common/hexchat.h
+++ b/src/common/hexchat.h
@@ -589,6 +589,7 @@ typedef struct server
 	unsigned int supports_watch:1;	/* supports the WATCH command */
 	unsigned int bad_prefix:1;			/* gave us a bad PREFIX= 005 number */
 	unsigned int have_namesx:1;		/* 005 tokens NAMESX and UHNAMES */
+	unsigned int have_awaynotify:1;
 	unsigned int have_uhnames:1;
 	unsigned int have_whox:1;		/* have undernet's WHOX features */
 	unsigned int have_idmsg:1;		/* freenode's IDENTIFY-MSG */
diff --git a/src/common/inbound.c b/src/common/inbound.c
index dae919b8..878a8759 100644
--- a/src/common/inbound.c
+++ b/src/common/inbound.c
@@ -986,6 +986,22 @@ inbound_away (server *serv, char *nick, char *msg)
 	}
 }
 
+void
+inbound_away_notify (server *serv, char *nick, char *reason)
+{
+	session *sess = NULL;
+	GSList *list;
+
+	list = sess_list;
+	while (list)
+	{
+		sess = list->data;
+		if (sess->server == serv)
+			userlist_set_away (sess, nick, reason ? TRUE : FALSE);
+		list = list->next;
+	}
+}
+
 int
 inbound_nameslist_end (server *serv, char *chan)
 {
diff --git a/src/common/inbound.h b/src/common/inbound.h
index a98beaa1..d77a9e53 100644
--- a/src/common/inbound.h
+++ b/src/common/inbound.h
@@ -42,6 +42,7 @@ void inbound_ping_reply (session *sess, char *timestring, char *from);
 void inbound_nameslist (server *serv, char *chan, char *names);
 int inbound_nameslist_end (server *serv, char *chan);
 void inbound_away (server *serv, char *nick, char *msg);
+void inbound_away_notify (server *serv, char *nick, char *reason);
 void inbound_login_start (session *sess, char *nick, char *servname);
 void inbound_login_end (session *sess, char *text);
 void inbound_chanmsg (server *serv, session *sess, char *chan, char *from, char *text, char fromme, int id);
diff --git a/src/common/proto-irc.c b/src/common/proto-irc.c
index 790e3242..906ee713 100644
--- a/src/common/proto-irc.c
+++ b/src/common/proto-irc.c
@@ -1029,6 +1029,11 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[])
 			inbound_quit (serv, nick, ip,
 							  (word_eol[3][0] == ':') ? word_eol[3] + 1 : word_eol[3]);
 			return;
+
+		case WORDL('A','W','A','Y'):
+			inbound_away_notify (serv, nick,
+						(word_eol[3][0] == ':') ? word_eol[3] + 1 : NULL);
+			return;
 		}
 
 		goto garbage;
@@ -1166,6 +1171,11 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[])
 						serv->have_namesx = TRUE;
 					}
 
+					if (strstr (word_eol[5], "away-notify") != 0)
+					{
+						serv->have_awaynotify = TRUE;
+					}
+
 					if (strstr (word_eol[5], "sasl") != 0)
 					{
 						serv->have_sasl = TRUE;
@@ -1193,6 +1203,11 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[])
 						want_cap ? strcat (buffer, " multi-prefix") : strcpy (buffer, "CAP REQ :multi-prefix");
 						want_cap = 1;
 					}
+					if (strstr (word_eol[5], "away-notify") != 0)
+					{
+						want_cap ? strcat (buffer, " away-notify") : strcpy (buffer, "CAP REQ :away-notify");
+						want_cap = 1;
+					}
 					/* if the SASL password is set, request SASL auth */
 					if (strstr (word_eol[5], "sasl") != 0 && strlen (sess->server->saslpassword) != 0)
 					{
diff --git a/src/common/server.c b/src/common/server.c
index 1ace2a48..9e07b5d5 100644
--- a/src/common/server.c
+++ b/src/common/server.c
@@ -1884,6 +1884,7 @@ server_set_defaults (server *serv)
 	serv->bad_prefix = FALSE;
 	serv->use_who = TRUE;
 	serv->have_namesx = FALSE;
+	serv->have_awaynotify = FALSE;
 	serv->have_uhnames = FALSE;
 	serv->have_whox = FALSE;
 	serv->have_idmsg = FALSE;