From 47518b4b751fa1fc50798dc28a57bdf8e9e420e9 Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Tue, 13 Aug 2019 00:31:43 +0200 Subject: [PATCH] request the setname capability --- src/irc/core/irc-commands.c | 2 ++ src/irc/core/irc-nicklist.c | 23 +++++++++++++++++++++++ src/irc/core/irc-servers.c | 4 +++- src/irc/core/irc-servers.h | 1 + 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/irc/core/irc-commands.c b/src/irc/core/irc-commands.c index 4062b1da..6737748f 100644 --- a/src/irc/core/irc-commands.c +++ b/src/irc/core/irc-commands.c @@ -1045,6 +1045,7 @@ void irc_commands_init(void) command_bind_irc("wallops", NULL, (SIGNAL_FUNC) command_1self); command_bind_irc("kickban", NULL, (SIGNAL_FUNC) cmd_kickban); command_bind_irc("knockout", NULL, (SIGNAL_FUNC) cmd_knockout); + command_bind_irc("setname", NULL, (SIGNAL_FUNC) command_1self); command_bind_irc("server purge", NULL, (SIGNAL_FUNC) cmd_server_purge); signal_add("channel destroyed", (SIGNAL_FUNC) sig_channel_destroyed); @@ -1111,6 +1112,7 @@ void irc_commands_deinit(void) command_unbind("wait", (SIGNAL_FUNC) cmd_wait); command_unbind("wallops", (SIGNAL_FUNC) command_1self); command_unbind("kickban", (SIGNAL_FUNC) cmd_kickban); + command_unbind("setname", (SIGNAL_FUNC) command_1self); command_unbind("knockout", (SIGNAL_FUNC) cmd_knockout); command_unbind("server purge", (SIGNAL_FUNC) cmd_server_purge); diff --git a/src/irc/core/irc-nicklist.c b/src/irc/core/irc-nicklist.c index 54a9bd3b..9073ddaa 100644 --- a/src/irc/core/irc-nicklist.c +++ b/src/irc/core/irc-nicklist.c @@ -446,6 +446,27 @@ static void event_userhost(SERVER_REC *server, const char *data) g_free(params); } +static void event_setname(SERVER_REC *server, const char *data, const char *nick, const char *address) +{ + GSList *nicks, *tmp; + NICK_REC *rec; + + if (!IS_IRC_SERVER(server)) + return; + + g_return_if_fail(data != NULL); + if (*data == ':') data++; + + nicks = nicklist_get_same(server, nick); + for (tmp = nicks; tmp != NULL; tmp = tmp->next->next) { + rec = tmp->next->data; + + g_free(rec->realname); + rec->realname = g_strdup(data); + } + g_slist_free(nicks); +} + static void sig_usermode(SERVER_REC *server) { g_return_if_fail(IS_SERVER(server)); @@ -487,6 +508,7 @@ void irc_nicklist_init(void) signal_add_first("event 437", (SIGNAL_FUNC) event_target_unavailable); signal_add_first("event 302", (SIGNAL_FUNC) event_userhost); 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); signal_add("server connected", (SIGNAL_FUNC) sig_connected); } @@ -509,6 +531,7 @@ void irc_nicklist_deinit(void) signal_remove("event 437", (SIGNAL_FUNC) event_target_unavailable); signal_remove("event 302", (SIGNAL_FUNC) event_userhost); 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); signal_remove("server connected", (SIGNAL_FUNC) sig_connected); } diff --git a/src/irc/core/irc-servers.c b/src/irc/core/irc-servers.c index e2d96bdb..195ced02 100644 --- a/src/irc/core/irc-servers.c +++ b/src/irc/core/irc-servers.c @@ -229,11 +229,13 @@ static void server_init(IRC_SERVER_REC *server) g_free(cmd); } - if (conn->sasl_mechanism != SASL_MECHANISM_NONE) + if (conn->sasl_mechanism != SASL_MECHANISM_NONE) { irc_cap_toggle(server, CAP_SASL, TRUE); + } irc_cap_toggle(server, CAP_MULTI_PREFIX, TRUE); irc_cap_toggle(server, CAP_EXTENDED_JOIN, TRUE); + irc_cap_toggle(server, CAP_SETNAME, 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 cd5a63ff..15ca7452 100644 --- a/src/irc/core/irc-servers.h +++ b/src/irc/core/irc-servers.h @@ -18,6 +18,7 @@ #define CAP_SASL "sasl" #define CAP_MULTI_PREFIX "multi-prefix" #define CAP_EXTENDED_JOIN "extended-join" +#define CAP_SETNAME "draft/setname" /* returns IRC_SERVER_REC if it's IRC server, NULL if it isn't */ #define IRC_SERVER(server) \