summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSébastien Helleu <flashcode@flashtux.org>2014-03-30 16:16:13 +0200
committerSébastien Helleu <flashcode@flashtux.org>2014-03-30 16:16:13 +0200
commit474541b857849e73e1277afa58c3c8ce6178aac6 (patch)
treed2f8ff497d781d54c92f49af03c8e911a57f14cd /src
parentd7d91d6cf398217c530d253b3a6de202ed459a27 (diff)
downloadweechat-474541b857849e73e1277afa58c3c8ce6178aac6.zip
irc: add support of "away-notify" capability (closes #12)
Diffstat (limited to 'src')
-rw-r--r--src/plugins/irc/irc-channel.c7
-rw-r--r--src/plugins/irc/irc-config.c4
-rw-r--r--src/plugins/irc/irc-nick.c1
-rw-r--r--src/plugins/irc/irc-protocol.c32
-rw-r--r--src/plugins/irc/irc-server.c17
-rw-r--r--src/plugins/irc/irc-server.h1
-rw-r--r--src/plugins/irc/irc-upgrade.c1
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);