diff options
author | Sébastien Helleu <flashcode@flashtux.org> | 2014-03-30 16:16:13 +0200 |
---|---|---|
committer | Sébastien Helleu <flashcode@flashtux.org> | 2014-03-30 16:16:13 +0200 |
commit | 474541b857849e73e1277afa58c3c8ce6178aac6 (patch) | |
tree | d2f8ff497d781d54c92f49af03c8e911a57f14cd /src | |
parent | d7d91d6cf398217c530d253b3a6de202ed459a27 (diff) | |
download | weechat-474541b857849e73e1277afa58c3c8ce6178aac6.zip |
irc: add support of "away-notify" capability (closes #12)
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/irc/irc-channel.c | 7 | ||||
-rw-r--r-- | src/plugins/irc/irc-config.c | 4 | ||||
-rw-r--r-- | src/plugins/irc/irc-nick.c | 1 | ||||
-rw-r--r-- | src/plugins/irc/irc-protocol.c | 32 | ||||
-rw-r--r-- | src/plugins/irc/irc-server.c | 17 | ||||
-rw-r--r-- | src/plugins/irc/irc-server.h | 1 | ||||
-rw-r--r-- | src/plugins/irc/irc-upgrade.c | 1 |
7 files changed, 52 insertions, 11 deletions
diff --git a/src/plugins/irc/irc-channel.c b/src/plugins/irc/irc-channel.c index 2076acf0a..9dbf3b794 100644 --- a/src/plugins/irc/irc-channel.c +++ b/src/plugins/irc/irc-channel.c @@ -492,9 +492,10 @@ irc_channel_check_away (struct t_irc_server *server, { if ((channel->type == IRC_CHANNEL_TYPE_CHANNEL) && channel->nicks) { - if ((IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_AWAY_CHECK) > 0) - && ((IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_AWAY_CHECK_MAX_NICKS) == 0) - || (channel->nicks_count <= IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_AWAY_CHECK_MAX_NICKS)))) + if (server->cap_away_notify + || ((IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_AWAY_CHECK) > 0) + && ((IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_AWAY_CHECK_MAX_NICKS) == 0) + || (channel->nicks_count <= IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_AWAY_CHECK_MAX_NICKS))))) { channel->checking_away++; irc_server_sendf (server, IRC_SERVER_SEND_OUTQ_PRIO_LOW, NULL, diff --git a/src/plugins/irc/irc-config.c b/src/plugins/irc/irc-config.c index e25100df7..0405e27ba 100644 --- a/src/plugins/irc/irc-config.c +++ b/src/plugins/irc/irc-config.c @@ -1627,8 +1627,8 @@ irc_config_server_new_option (struct t_config_file *config_file, /* TRANSLATORS: please keep words "client capabilities" between brackets if translation is different (see fr.po) */ N_("comma-separated list of client capabilities to enable for " "server if they are available; capabilities supported by " - "WeeChat are: multi-prefix, userhost-in-names (example: " - "\"multi-prefix,userhost-in-names\")"), + "WeeChat are: multi-prefix, userhost-in-names, away-notify " + "(example: \"multi-prefix,userhost-in-names,away-notify\")"), NULL, 0, 0, default_value, value, null_value_allowed, diff --git a/src/plugins/irc/irc-nick.c b/src/plugins/irc/irc-nick.c index c9b6763af..370a275e9 100644 --- a/src/plugins/irc/irc-nick.c +++ b/src/plugins/irc/irc-nick.c @@ -903,6 +903,7 @@ irc_nick_set_away (struct t_irc_server *server, struct t_irc_channel *channel, struct t_irc_nick *nick, int is_away) { if (!is_away + || server->cap_away_notify || ((IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_AWAY_CHECK) > 0) && ((IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_AWAY_CHECK_MAX_NICKS) == 0) || (channel->nicks_count <= IRC_SERVER_OPTION_INTEGER(server, IRC_SERVER_OPTION_AWAY_CHECK_MAX_NICKS))))) diff --git a/src/plugins/irc/irc-protocol.c b/src/plugins/irc/irc-protocol.c index 85882cc0c..c44fadad7 100644 --- a/src/plugins/irc/irc-protocol.c +++ b/src/plugins/irc/irc-protocol.c @@ -211,6 +211,33 @@ IRC_PROTOCOL_CALLBACK(authenticate) } /* + * Callback for the IRC message "AWAY": away info about a nick (with capability + * "away-notify"). + * + * Message looks like: + * :nick!user@host AWAY + * :nick!user@host AWAY :I am away + */ + +IRC_PROTOCOL_CALLBACK(away) +{ + struct t_irc_channel *ptr_channel; + struct t_irc_nick *ptr_nick; + + IRC_PROTOCOL_MIN_ARGS(2); + + for (ptr_channel = server->channels; ptr_channel; + ptr_channel = ptr_channel->next_channel) + { + ptr_nick = irc_nick_search (server, ptr_channel, nick); + if (ptr_nick) + irc_nick_set_away (server, ptr_channel, ptr_nick, (argc > 2)); + } + + return WEECHAT_RC_OK; +} + +/* * Callback for the IRC message "CAP": client capability. * * Message looks like: @@ -350,6 +377,10 @@ IRC_PROTOCOL_CALLBACK(cap) sasl_to_do = 1; break; } + else if (strcmp (caps_supported[i], "away-notify") == 0) + { + server->cap_away_notify = 1; + } } weechat_string_free_split (caps_supported); } @@ -5076,6 +5107,7 @@ irc_protocol_recv_command (struct t_irc_server *server, struct t_hashtable *hash_tags; struct t_irc_protocol_msg irc_protocol_messages[] = { { "authenticate", /* authenticate */ 1, 0, &irc_protocol_cb_authenticate }, + { "away", /* away (cap away-notify) */ 1, 0, &irc_protocol_cb_away }, { "cap", /* client capability */ 1, 0, &irc_protocol_cb_cap }, { "error", /* error received from IRC server */ 1, 0, &irc_protocol_cb_error }, { "invite", /* invite a nick on a channel */ 1, 0, &irc_protocol_cb_invite }, diff --git a/src/plugins/irc/irc-server.c b/src/plugins/irc/irc-server.c index eac3ba5a7..45a3cc341 100644 --- a/src/plugins/irc/irc-server.c +++ b/src/plugins/irc/irc-server.c @@ -971,6 +971,7 @@ irc_server_alloc (const char *name) new_server->nick_alternate_number = -1; new_server->nick = NULL; new_server->nick_modes = NULL; + new_server->cap_away_notify = 0; new_server->isupport = NULL; new_server->prefix_modes = NULL; new_server->prefix_chars = NULL; @@ -2865,13 +2866,12 @@ irc_server_timer_cb (void *data, int remaining_calls) { /* check away (only if lag check was not done) */ away_check = IRC_SERVER_OPTION_INTEGER(ptr_server, IRC_SERVER_OPTION_AWAY_CHECK); - if (away_check > 0) + if (!ptr_server->cap_away_notify + && (away_check > 0) + && ((ptr_server->last_away_check == 0) + || (current_time >= ptr_server->last_away_check + (away_check * 60)))) { - if ((ptr_server->last_away_check == 0) - || (current_time >= ptr_server->last_away_check + (away_check * 60))) - { - irc_server_check_away (ptr_server); - } + irc_server_check_away (ptr_server); } } @@ -4295,6 +4295,7 @@ irc_server_disconnect (struct t_irc_server *server, int switch_address, server->nick_modes = NULL; weechat_bar_item_update ("input_prompt"); } + server->cap_away_notify = 0; server->is_away = 0; server->away_time = 0; server->lag = 0; @@ -4820,6 +4821,7 @@ irc_server_hdata_server_cb (void *data, const char *hdata_name) WEECHAT_HDATA_VAR(struct t_irc_server, nick_alternate_number, INTEGER, 0, NULL, NULL); WEECHAT_HDATA_VAR(struct t_irc_server, nick, STRING, 0, NULL, NULL); WEECHAT_HDATA_VAR(struct t_irc_server, nick_modes, STRING, 0, NULL, NULL); + WEECHAT_HDATA_VAR(struct t_irc_server, cap_away_notify, INTEGER, 0, NULL, NULL); WEECHAT_HDATA_VAR(struct t_irc_server, isupport, STRING, 0, NULL, NULL); WEECHAT_HDATA_VAR(struct t_irc_server, prefix_modes, STRING, 0, NULL, NULL); WEECHAT_HDATA_VAR(struct t_irc_server, prefix_chars, STRING, 0, NULL, NULL); @@ -5028,6 +5030,8 @@ irc_server_add_to_infolist (struct t_infolist *infolist, return 0; if (!weechat_infolist_new_var_string (ptr_item, "nick_modes", server->nick_modes)) return 0; + if (!weechat_infolist_new_var_integer (ptr_item, "cap_away_notify", server->cap_away_notify)) + return 0; if (!weechat_infolist_new_var_string (ptr_item, "isupport", server->isupport)) return 0; if (!weechat_infolist_new_var_string (ptr_item, "prefix_modes", server->prefix_modes)) @@ -5373,6 +5377,7 @@ irc_server_print_log () weechat_log_printf (" nick_alternate_number: %d", ptr_server->nick_alternate_number); weechat_log_printf (" nick . . . . . . . . : '%s'", ptr_server->nick); weechat_log_printf (" nick_modes . . . . . : '%s'", ptr_server->nick_modes); + weechat_log_printf (" cap_away_notify. . . : %d", ptr_server->cap_away_notify); weechat_log_printf (" isupport . . . . . . : '%s'", ptr_server->isupport); weechat_log_printf (" prefix_modes . . . . : '%s'", ptr_server->prefix_modes); weechat_log_printf (" prefix_chars . . . . : '%s'", ptr_server->prefix_chars); diff --git a/src/plugins/irc/irc-server.h b/src/plugins/irc/irc-server.h index a48eeaa5c..1a85588e9 100644 --- a/src/plugins/irc/irc-server.h +++ b/src/plugins/irc/irc-server.h @@ -173,6 +173,7 @@ struct t_irc_server /* (nick____1, nick____2, ...) */ char *nick; /* current nickname */ char *nick_modes; /* nick modes */ + int cap_away_notify; /* 1 if capability away-notify is enabled*/ char *isupport; /* copy of message 005 (ISUPPORT) */ char *prefix_modes; /* prefix modes from msg 005 (eg "ohv") */ char *prefix_chars; /* prefix chars from msg 005 (eg "@%+") */ diff --git a/src/plugins/irc/irc-upgrade.c b/src/plugins/irc/irc-upgrade.c index dfc76d718..d77084fea 100644 --- a/src/plugins/irc/irc-upgrade.c +++ b/src/plugins/irc/irc-upgrade.c @@ -361,6 +361,7 @@ irc_upgrade_read_cb (void *data, str = weechat_infolist_string (infolist, "nick_modes"); if (str) irc_upgrade_current_server->nick_modes = strdup (str); + irc_upgrade_current_server->cap_away_notify = weechat_infolist_integer (infolist, "cap_away_notify"); str = weechat_infolist_string (infolist, "isupport"); if (str) irc_upgrade_current_server->isupport = strdup (str); |