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;