From c9aae766f5dba95033e6533e4ea02f1cf17d9114 Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Mon, 4 May 2020 01:14:25 +0200 Subject: [PATCH] implement account-tag --- src/irc/core/irc-expandos.c | 38 ++++++++++++++++++++++++++++++++++++- src/irc/core/irc-servers.c | 1 + src/irc/core/irc-servers.h | 1 + src/irc/core/irc.c | 8 +++++++- 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/irc/core/irc-expandos.c b/src/irc/core/irc-expandos.c index 625e6e8b..adfe9531 100644 --- a/src/irc/core/irc-expandos.c +++ b/src/irc/core/irc-expandos.c @@ -141,6 +141,34 @@ static char *expando_cumode_space(SERVER_REC *server, void *item, int *free_ret) return *ret == '\0' ? " " : ret; } +static char *expando_account_tag(SERVER_REC *server, void *item, int *free_ret) +{ + const char *ret; + + if (!IS_IRC_SERVER(server)) + return ""; + + ret = server_meta_stash_find(server, "account"); + + return ret == NULL ? "" : (char *) ret; +} + +static char *expando_has_account_tag(SERVER_REC *server, void *item, int *free_ret) +{ + const char *ret; + + if (!IS_IRC_SERVER(server)) + return ""; + + if (gslist_find_string(IRC_SERVER(server)->cap_active, CAP_ACCOUNT_TAG) == NULL) + return ""; + + ret = server_meta_stash_find(server, "account"); + + return (char *) settings_get_str(ret == NULL ? "format_has_no_account_tag" : + "format_has_account_tag"); +} + static void event_join(IRC_SERVER_REC *server, const char *data, const char *nick, const char *address) { @@ -155,6 +183,8 @@ static void event_join(IRC_SERVER_REC *server, const char *data, void irc_expandos_init(void) { last_join = NULL; + settings_add_str("lookandfeel", "format_has_no_account_tag", "~"); + settings_add_str("lookandfeel", "format_has_account_tag", "ยช"); expando_create(":", expando_lastjoin, "event join", EXPANDO_ARG_SERVER, NULL); @@ -183,8 +213,12 @@ void irc_expandos_init(void) "window item changed", EXPANDO_ARG_WINDOW, "nick mode changed", EXPANDO_ARG_WINDOW_ITEM, "channel joined", EXPANDO_ARG_WINDOW_ITEM, NULL); + expando_create("account_tag", expando_account_tag, "server event", EXPANDO_ARG_SERVER, + NULL); + expando_create("has_account_tag", expando_has_account_tag, "server event", + EXPANDO_ARG_SERVER, NULL); - expando_add_signal("I", "event invite", EXPANDO_ARG_SERVER); + expando_add_signal("I", "event invite", EXPANDO_ARG_SERVER); signal_add("event join", (SIGNAL_FUNC) event_join); } @@ -200,6 +234,8 @@ void irc_expandos_deinit(void) expando_destroy("x", expando_hostname); expando_destroy("usermode", expando_usermode); expando_destroy("cumode", expando_cumode); + expando_destroy("account_tag", expando_account_tag); + expando_destroy("has_account_tag", expando_has_account_tag); signal_remove("event join", (SIGNAL_FUNC) event_join); } diff --git a/src/irc/core/irc-servers.c b/src/irc/core/irc-servers.c index 7b0402b1..1b7b4c11 100644 --- a/src/irc/core/irc-servers.c +++ b/src/irc/core/irc-servers.c @@ -243,6 +243,7 @@ static void server_init(IRC_SERVER_REC *server) irc_cap_toggle(server, CAP_ACCOUNT_NOTIFY, TRUE); irc_cap_toggle(server, CAP_SELF_MESSAGE, TRUE); irc_cap_toggle(server, CAP_SERVER_TIME, TRUE); + irc_cap_toggle(server, CAP_ACCOUNT_TAG, 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 100ad724..0910b97d 100644 --- a/src/irc/core/irc-servers.h +++ b/src/irc/core/irc-servers.h @@ -27,6 +27,7 @@ #define CAP_ACCOUNT_NOTIFY "account-notify" #define CAP_SELF_MESSAGE "znc.in/self-message" #define CAP_SERVER_TIME "server-time" +#define CAP_ACCOUNT_TAG "account-tag" /* returns IRC_SERVER_REC if it's IRC server, NULL if it isn't */ #define IRC_SERVER(server) \ diff --git a/src/irc/core/irc.c b/src/irc/core/irc.c index f60655e2..5ca51358 100644 --- a/src/irc/core/irc.c +++ b/src/irc/core/irc.c @@ -446,7 +446,7 @@ GHashTable *irc_parse_message_tags(const char *tags) static void irc_server_event_tags(IRC_SERVER_REC *server, const char *line, const char *nick, const char *address, const char *tags) { - char *timestr; + char *timestr, *accountstr; GHashTable *tags_hash = NULL; if (tags != NULL && *tags != '\0') { @@ -454,6 +454,12 @@ static void irc_server_event_tags(IRC_SERVER_REC *server, const char *line, cons if ((timestr = g_hash_table_lookup(tags_hash, "time")) != NULL) { server_meta_stash(SERVER(server), "time", timestr); } + + accountstr = g_hash_table_lookup(tags_hash, "account"); + if (accountstr != NULL) { + server_meta_stash(SERVER(server), "account", accountstr); + g_free(accountstr); + } } if (*line != '\0')