From 61d215acdd66379d8126bdd982bbfd64a7c71023 Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Wed, 14 Aug 2019 17:45:13 +0200 Subject: [PATCH 1/2] support cap away-notify --- src/fe-common/irc/fe-events.c | 17 ++++++++++++++ src/fe-common/irc/fe-irc-messages.c | 36 +++++++++++++++++++++++++++++ src/fe-common/irc/module-formats.c | 2 ++ src/fe-common/irc/module-formats.h | 2 ++ src/irc/core/irc-nicklist.c | 16 +++++++++++++ src/irc/core/irc-servers.c | 1 + src/irc/core/irc-servers.h | 1 + 7 files changed, 75 insertions(+) diff --git a/src/fe-common/irc/fe-events.c b/src/fe-common/irc/fe-events.c index c26f2e88..aa8eaf81 100644 --- a/src/fe-common/irc/fe-events.c +++ b/src/fe-common/irc/fe-events.c @@ -237,6 +237,21 @@ static void event_mode(IRC_SERVER_REC *server, const char *data, g_free(params); } +static void event_away_notify(IRC_SERVER_REC *server, const char *data, + const char *nick, const char *addr) +{ + char *params, *awaymsg; + + g_return_if_fail(data != NULL); + + params = event_get_params(data, 1 | PARAM_FLAG_GETREST, + &awaymsg); + + signal_emit("message irc away", 4, + server, nick, addr, awaymsg); + g_free(params); +} + static void event_pong(IRC_SERVER_REC *server, const char *data, const char *nick) { char *params, *host, *reply; @@ -458,6 +473,7 @@ void fe_events_init(void) signal_add("event error", (SIGNAL_FUNC) event_error); signal_add("event wallops", (SIGNAL_FUNC) event_wallops); signal_add("event silence", (SIGNAL_FUNC) event_silence); + signal_add("event away", (SIGNAL_FUNC) event_away_notify); signal_add("default event", (SIGNAL_FUNC) event_received); @@ -487,6 +503,7 @@ void fe_events_deinit(void) signal_remove("event error", (SIGNAL_FUNC) event_error); signal_remove("event wallops", (SIGNAL_FUNC) event_wallops); signal_remove("event silence", (SIGNAL_FUNC) event_silence); + signal_remove("event away", (SIGNAL_FUNC) event_away_notify); signal_remove("default event", (SIGNAL_FUNC) event_received); diff --git a/src/fe-common/irc/fe-irc-messages.c b/src/fe-common/irc/fe-irc-messages.c index ddd4311e..6218f6ac 100644 --- a/src/fe-common/irc/fe-irc-messages.c +++ b/src/fe-common/irc/fe-irc-messages.c @@ -295,9 +295,43 @@ static void sig_message_irc_ctcp(IRC_SERVER_REC *server, const char *cmd, IRCTXT_CTCP_REQUESTED, nick, addr, cmd, data, oldtarget); } +static void sig_message_irc_away(IRC_SERVER_REC *server, const char *nick, + const char *addr, const char *awaymsg) +{ + GSList *tmp, *windows; + + if (!settings_get_bool("away_notify_public")) + return; + + windows = NULL; + for (tmp = server->channels; tmp != NULL; tmp = tmp->next) { + int level = MSGLEVEL_CRAP; + CHANNEL_REC *channel = tmp->data; + WINDOW_REC *window = + window_item_window((WI_ITEM_REC *) channel); + + if (nicklist_find(channel, nick) == NULL || + g_slist_find(windows, window) != NULL) + continue; + + if (ignore_check_plus(SERVER(server), nick, addr, + channel->visible_name, awaymsg, &level, TRUE)) + continue; + + windows = g_slist_prepend(windows, window); + + printformat(server, channel->visible_name, level, + *awaymsg == '\0' ? IRCTXT_NOTIFY_UNAWAY_CHANNEL : + IRCTXT_NOTIFY_AWAY_CHANNEL, + nick, addr, channel->visible_name, awaymsg); + } + g_slist_free(windows); +} + void fe_irc_messages_init(void) { settings_add_bool("misc", "notice_channel_context", TRUE); + settings_add_bool("lookandfeel", "away_notify_public", FALSE); signal_add_last("message own_public", (SIGNAL_FUNC) sig_message_own_public); signal_add_last("message irc op_public", (SIGNAL_FUNC) sig_message_irc_op_public); @@ -308,6 +342,7 @@ void fe_irc_messages_init(void) signal_add_last("message irc notice", (SIGNAL_FUNC) sig_message_irc_notice); signal_add_last("message irc own_ctcp", (SIGNAL_FUNC) sig_message_own_ctcp); signal_add_last("message irc ctcp", (SIGNAL_FUNC) sig_message_irc_ctcp); + signal_add_last("message irc away", (SIGNAL_FUNC) sig_message_irc_away); } void fe_irc_messages_deinit(void) @@ -321,4 +356,5 @@ void fe_irc_messages_deinit(void) signal_remove("message irc notice", (SIGNAL_FUNC) sig_message_irc_notice); signal_remove("message irc own_ctcp", (SIGNAL_FUNC) sig_message_own_ctcp); signal_remove("message irc ctcp", (SIGNAL_FUNC) sig_message_irc_ctcp); + signal_remove("message irc away", (SIGNAL_FUNC) sig_message_irc_away); } diff --git a/src/fe-common/irc/module-formats.c b/src/fe-common/irc/module-formats.c index a0f6bd29..50f39d8e 100644 --- a/src/fe-common/irc/module-formats.c +++ b/src/fe-common/irc/module-formats.c @@ -95,6 +95,8 @@ FORMAT_REC fecommon_irc_formats[] = { { "away", "You have been marked as being away", 0 }, { "unaway", "You are no longer marked as being away", 0 }, { "nick_away", "{nick $0} is away: $1", 2, { 0, 0 } }, + { "notify_away_channel", "{channick $0} {chanhost $1} is now away: {reason $3}", 4, { 0, 0, 0, 0 } }, + { "notify_unaway_channel", "{channick_hilight $0} {chanhost $1} is no longer away", 3, { 0, 0, 0 } }, { "no_such_nick", "{nick $0}: No such nick/channel", 1, { 0 } }, { "nick_in_use", "Nick {nick $0} is already in use", 1, { 0 } }, { "nick_unavailable", "Nick {nick $0} is temporarily unavailable", 1, { 0 } }, diff --git a/src/fe-common/irc/module-formats.h b/src/fe-common/irc/module-formats.h index 66a9804f..b9a89bc0 100644 --- a/src/fe-common/irc/module-formats.h +++ b/src/fe-common/irc/module-formats.h @@ -71,6 +71,8 @@ enum { IRCTXT_AWAY, IRCTXT_UNAWAY, IRCTXT_NICK_AWAY, + IRCTXT_NOTIFY_AWAY_CHANNEL, + IRCTXT_NOTIFY_UNAWAY_CHANNEL, IRCTXT_NO_SUCH_NICK, IRCTXT_NICK_IN_USE, IRCTXT_NICK_UNAVAILABLE, diff --git a/src/irc/core/irc-nicklist.c b/src/irc/core/irc-nicklist.c index 9073ddaa..28ac6368 100644 --- a/src/irc/core/irc-nicklist.c +++ b/src/irc/core/irc-nicklist.c @@ -467,6 +467,20 @@ static void event_setname(SERVER_REC *server, const char *data, const char *nick g_slist_free(nicks); } +static void event_away_notify(IRC_SERVER_REC *server, const char *data, const char *nick, const char *add) +{ + char *params, *awaymsg; + + if (!IS_IRC_SERVER(server)) + return; + + g_return_if_fail(data != NULL); + + params = event_get_params(data, 1 | PARAM_FLAG_GETREST, &awaymsg); + nicklist_update_flags(SERVER(server), nick, *awaymsg != '\0', -1); + g_free(params); +} + static void sig_usermode(SERVER_REC *server) { g_return_if_fail(IS_SERVER(server)); @@ -507,6 +521,7 @@ void irc_nicklist_init(void) signal_add_first("event 433", (SIGNAL_FUNC) event_nick_in_use); signal_add_first("event 437", (SIGNAL_FUNC) event_target_unavailable); signal_add_first("event 302", (SIGNAL_FUNC) event_userhost); + signal_add_first("event away", (SIGNAL_FUNC) event_away_notify); signal_add("userhost event", (SIGNAL_FUNC) event_userhost); signal_add("event setname", (SIGNAL_FUNC) event_setname); signal_add("user mode changed", (SIGNAL_FUNC) sig_usermode); @@ -530,6 +545,7 @@ void irc_nicklist_deinit(void) signal_remove("event 433", (SIGNAL_FUNC) event_nick_in_use); signal_remove("event 437", (SIGNAL_FUNC) event_target_unavailable); signal_remove("event 302", (SIGNAL_FUNC) event_userhost); + signal_remove("event away", (SIGNAL_FUNC) event_away_notify); signal_remove("userhost event", (SIGNAL_FUNC) event_userhost); signal_remove("event setname", (SIGNAL_FUNC) event_setname); signal_remove("user mode changed", (SIGNAL_FUNC) sig_usermode); diff --git a/src/irc/core/irc-servers.c b/src/irc/core/irc-servers.c index 5e98e724..16095ed3 100644 --- a/src/irc/core/irc-servers.c +++ b/src/irc/core/irc-servers.c @@ -237,6 +237,7 @@ static void server_init(IRC_SERVER_REC *server) irc_cap_toggle(server, CAP_EXTENDED_JOIN, TRUE); irc_cap_toggle(server, CAP_SETNAME, TRUE); irc_cap_toggle(server, CAP_INVITE_NOTIFY, TRUE); + irc_cap_toggle(server, CAP_AWAY_NOTIFY, TRUE); irc_send_cmd_now(server, "CAP LS " CAP_LS_VERSION); diff --git a/src/irc/core/irc-servers.h b/src/irc/core/irc-servers.h index 5313c1d0..3fccfe9e 100644 --- a/src/irc/core/irc-servers.h +++ b/src/irc/core/irc-servers.h @@ -20,6 +20,7 @@ #define CAP_EXTENDED_JOIN "extended-join" #define CAP_SETNAME "draft/setname" #define CAP_INVITE_NOTIFY "invite-notify" +#define CAP_AWAY_NOTIFY "away-notify" /* returns IRC_SERVER_REC if it's IRC server, NULL if it isn't */ #define IRC_SERVER(server) \ From 5f13614d47198dd7013502ef5c4ead0cffa87978 Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Wed, 14 Aug 2019 22:52:38 +0200 Subject: [PATCH 2/2] move away message to fe-common/core --- src/fe-common/core/fe-messages.c | 22 ++++++++++++++++++ src/fe-common/core/module-formats.c | 2 ++ src/fe-common/core/module-formats.h | 2 ++ src/fe-common/irc/fe-events.c | 2 +- src/fe-common/irc/fe-irc-messages.c | 36 ----------------------------- src/fe-common/irc/module-formats.c | 2 -- src/fe-common/irc/module-formats.h | 2 -- 7 files changed, 27 insertions(+), 41 deletions(-) diff --git a/src/fe-common/core/fe-messages.c b/src/fe-common/core/fe-messages.c index 308680d6..9545af73 100644 --- a/src/fe-common/core/fe-messages.c +++ b/src/fe-common/core/fe-messages.c @@ -587,6 +587,25 @@ static void sig_message_topic(SERVER_REC *server, const char *channel, nick, channel, topic, address); } +static void sig_message_away_notify(SERVER_REC *server, const char *nick, + const char *addr, const char *awaymsg) +{ + int txt = *awaymsg == '\0' ? TXT_NOTIFY_UNAWAY_CHANNEL : + TXT_NOTIFY_AWAY_CHANNEL; + + if (!settings_get_bool("away_notify_public")) + return; + + spread_server_message_to_windows(server, FALSE, + FALSE, + MSGLEVEL_CRAP, + txt, txt, + nick, addr, + awaymsg, + awaymsg + ); +} + static int printnick_exists(NICK_REC *first, NICK_REC *ignore, const char *nick) { @@ -730,6 +749,7 @@ void fe_messages_init(void) settings_add_bool("lookandfeel", "print_active_channel", FALSE); settings_add_bool("lookandfeel", "show_quit_once", FALSE); settings_add_bool("lookandfeel", "show_own_nickchange_once", FALSE); + settings_add_bool("lookandfeel", "away_notify_public", FALSE); signal_add_last("message public", (SIGNAL_FUNC) sig_message_public); signal_add_last("message private", (SIGNAL_FUNC) sig_message_private); @@ -744,6 +764,7 @@ void fe_messages_init(void) signal_add_last("message invite", (SIGNAL_FUNC) sig_message_invite); signal_add_last("message invite_other", (SIGNAL_FUNC) sig_message_invite_other); signal_add_last("message topic", (SIGNAL_FUNC) sig_message_topic); + signal_add_last("message away_notify", (SIGNAL_FUNC) sig_message_away_notify); signal_add("nicklist new", (SIGNAL_FUNC) sig_nicklist_new); signal_add("nicklist remove", (SIGNAL_FUNC) sig_nicklist_remove); @@ -770,6 +791,7 @@ void fe_messages_deinit(void) signal_remove("message invite_other", (SIGNAL_FUNC) sig_message_invite_other); signal_remove("message invite", (SIGNAL_FUNC) sig_message_invite); signal_remove("message topic", (SIGNAL_FUNC) sig_message_topic); + signal_remove("message away_notify", (SIGNAL_FUNC) sig_message_away_notify); signal_remove("nicklist new", (SIGNAL_FUNC) sig_nicklist_new); signal_remove("nicklist remove", (SIGNAL_FUNC) sig_nicklist_remove); diff --git a/src/fe-common/core/module-formats.c b/src/fe-common/core/module-formats.c index 2532d82f..83eae589 100644 --- a/src/fe-common/core/module-formats.c +++ b/src/fe-common/core/module-formats.c @@ -106,6 +106,8 @@ FORMAT_REC fecommon_core_formats[] = { { "topic_unset", "Topic unset by {nick $0} on {channel $1}", 4, { 0, 0, 0, 0 } }, { "your_nick_changed", "You're now known as {nick $1}", 4, { 0, 0, 0, 0 } }, { "nick_changed", "{channick $0} is now known as {channick_hilight $1}", 4, { 0, 0, 0, 0 } }, + { "notify_away_channel", "{channick $0} {chanhost $1} is now away: {reason $2}", 4, { 0, 0, 0, 0 } }, + { "notify_unaway_channel", "{channick_hilight $0} {chanhost $1} is no longer away", 4, { 0, 0, 0, 0 } }, { "talking_in", "You are now talking in {channel $0}", 1, { 0 } }, { "not_in_channels", "You are not on any channels", 0 }, { "current_channel", "Current channel {channel $0}", 1, { 0 } }, diff --git a/src/fe-common/core/module-formats.h b/src/fe-common/core/module-formats.h index c5e2c4d1..74a4dfd9 100644 --- a/src/fe-common/core/module-formats.h +++ b/src/fe-common/core/module-formats.h @@ -82,6 +82,8 @@ enum { TXT_TOPIC_UNSET, TXT_YOUR_NICK_CHANGED, TXT_NICK_CHANGED, + TXT_NOTIFY_AWAY_CHANNEL, + TXT_NOTIFY_UNAWAY_CHANNEL, TXT_TALKING_IN, TXT_NOT_IN_CHANNELS, TXT_CURRENT_CHANNEL, diff --git a/src/fe-common/irc/fe-events.c b/src/fe-common/irc/fe-events.c index aa8eaf81..4608b949 100644 --- a/src/fe-common/irc/fe-events.c +++ b/src/fe-common/irc/fe-events.c @@ -247,7 +247,7 @@ static void event_away_notify(IRC_SERVER_REC *server, const char *data, params = event_get_params(data, 1 | PARAM_FLAG_GETREST, &awaymsg); - signal_emit("message irc away", 4, + signal_emit("message away_notify", 4, server, nick, addr, awaymsg); g_free(params); } diff --git a/src/fe-common/irc/fe-irc-messages.c b/src/fe-common/irc/fe-irc-messages.c index 6218f6ac..ddd4311e 100644 --- a/src/fe-common/irc/fe-irc-messages.c +++ b/src/fe-common/irc/fe-irc-messages.c @@ -295,43 +295,9 @@ static void sig_message_irc_ctcp(IRC_SERVER_REC *server, const char *cmd, IRCTXT_CTCP_REQUESTED, nick, addr, cmd, data, oldtarget); } -static void sig_message_irc_away(IRC_SERVER_REC *server, const char *nick, - const char *addr, const char *awaymsg) -{ - GSList *tmp, *windows; - - if (!settings_get_bool("away_notify_public")) - return; - - windows = NULL; - for (tmp = server->channels; tmp != NULL; tmp = tmp->next) { - int level = MSGLEVEL_CRAP; - CHANNEL_REC *channel = tmp->data; - WINDOW_REC *window = - window_item_window((WI_ITEM_REC *) channel); - - if (nicklist_find(channel, nick) == NULL || - g_slist_find(windows, window) != NULL) - continue; - - if (ignore_check_plus(SERVER(server), nick, addr, - channel->visible_name, awaymsg, &level, TRUE)) - continue; - - windows = g_slist_prepend(windows, window); - - printformat(server, channel->visible_name, level, - *awaymsg == '\0' ? IRCTXT_NOTIFY_UNAWAY_CHANNEL : - IRCTXT_NOTIFY_AWAY_CHANNEL, - nick, addr, channel->visible_name, awaymsg); - } - g_slist_free(windows); -} - void fe_irc_messages_init(void) { settings_add_bool("misc", "notice_channel_context", TRUE); - settings_add_bool("lookandfeel", "away_notify_public", FALSE); signal_add_last("message own_public", (SIGNAL_FUNC) sig_message_own_public); signal_add_last("message irc op_public", (SIGNAL_FUNC) sig_message_irc_op_public); @@ -342,7 +308,6 @@ void fe_irc_messages_init(void) signal_add_last("message irc notice", (SIGNAL_FUNC) sig_message_irc_notice); signal_add_last("message irc own_ctcp", (SIGNAL_FUNC) sig_message_own_ctcp); signal_add_last("message irc ctcp", (SIGNAL_FUNC) sig_message_irc_ctcp); - signal_add_last("message irc away", (SIGNAL_FUNC) sig_message_irc_away); } void fe_irc_messages_deinit(void) @@ -356,5 +321,4 @@ void fe_irc_messages_deinit(void) signal_remove("message irc notice", (SIGNAL_FUNC) sig_message_irc_notice); signal_remove("message irc own_ctcp", (SIGNAL_FUNC) sig_message_own_ctcp); signal_remove("message irc ctcp", (SIGNAL_FUNC) sig_message_irc_ctcp); - signal_remove("message irc away", (SIGNAL_FUNC) sig_message_irc_away); } diff --git a/src/fe-common/irc/module-formats.c b/src/fe-common/irc/module-formats.c index 50f39d8e..a0f6bd29 100644 --- a/src/fe-common/irc/module-formats.c +++ b/src/fe-common/irc/module-formats.c @@ -95,8 +95,6 @@ FORMAT_REC fecommon_irc_formats[] = { { "away", "You have been marked as being away", 0 }, { "unaway", "You are no longer marked as being away", 0 }, { "nick_away", "{nick $0} is away: $1", 2, { 0, 0 } }, - { "notify_away_channel", "{channick $0} {chanhost $1} is now away: {reason $3}", 4, { 0, 0, 0, 0 } }, - { "notify_unaway_channel", "{channick_hilight $0} {chanhost $1} is no longer away", 3, { 0, 0, 0 } }, { "no_such_nick", "{nick $0}: No such nick/channel", 1, { 0 } }, { "nick_in_use", "Nick {nick $0} is already in use", 1, { 0 } }, { "nick_unavailable", "Nick {nick $0} is temporarily unavailable", 1, { 0 } }, diff --git a/src/fe-common/irc/module-formats.h b/src/fe-common/irc/module-formats.h index b9a89bc0..66a9804f 100644 --- a/src/fe-common/irc/module-formats.h +++ b/src/fe-common/irc/module-formats.h @@ -71,8 +71,6 @@ enum { IRCTXT_AWAY, IRCTXT_UNAWAY, IRCTXT_NICK_AWAY, - IRCTXT_NOTIFY_AWAY_CHANNEL, - IRCTXT_NOTIFY_UNAWAY_CHANNEL, IRCTXT_NO_SUCH_NICK, IRCTXT_NICK_IN_USE, IRCTXT_NICK_UNAVAILABLE,