From 468642c4f4b48449bc46b9c88e7f2da2da8dc709 Mon Sep 17 00:00:00 2001 From: Jochen Eisinger Date: Mon, 5 Jan 2004 22:31:39 +0000 Subject: [PATCH] Mon Jan 03 23:26:38 CET 2004 Jochen Eisinger * Changed the way ACTION flagged messages are treated. Added support for actions in queries and signing actions. Affected files irssi/default.theme; irssi/docs/help/in/action.in; irssi/src/fe-common/silc/module-formats.[ch], fe-silc-messages.c, fe-silc-queries.c; irssi/src/silc/core/client_ops.c, silc-channels.c, silc-servers.[ch] --- CHANGES | 7 + apps/irssi/default.theme | 14 +- apps/irssi/docs/help/in/action.in | 6 +- .../src/fe-common/silc/fe-silc-messages.c | 228 ++++++++++++++++++ .../src/fe-common/silc/fe-silc-queries.c | 73 ------ .../irssi/src/fe-common/silc/module-formats.c | 22 +- .../irssi/src/fe-common/silc/module-formats.h | 23 +- apps/irssi/src/silc/core/client_ops.c | 59 ++++- apps/irssi/src/silc/core/silc-channels.c | 168 ++++++------- apps/irssi/src/silc/core/silc-servers.c | 12 +- apps/irssi/src/silc/core/silc-servers.h | 5 + 11 files changed, 428 insertions(+), 189 deletions(-) diff --git a/CHANGES b/CHANGES index 42e4d00d..95706be0 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,13 @@ Mon Jan 03 23:26:38 CET 2004 Jochen Eisinger * Fixed typo in perl module. Affected file irssi/src/perl/silc/Server.xs + * Changed the way ACTION flagged messages are treated. Added support + for actions in queries and signing actions. Affected files + irssi/default.theme; irssi/docs/help/in/action.in; + irssi/src/fe-common/silc/module-formats.[ch], fe-silc-messages.c, + fe-silc-queries.c; irssi/src/silc/core/client_ops.c, silc-channels.c, + silc-servers.[ch] + Mon Jan 03 16:04:29 CET 2004 Jochen Eisinger * Incorrectly reported error when client had to be resolved from diff --git a/apps/irssi/default.theme b/apps/irssi/default.theme index 599b3494..b29bb017 100644 --- a/apps/irssi/default.theme +++ b/apps/irssi/default.theme @@ -119,10 +119,20 @@ abstracts = { ## # Generic action - action = "%Y* $0 $1-"; + action = "%c* $*%n "; # Own sent action - ownaction = "%c* $0 $1-"; + ownaction = "{action $*}"; + + # Own sent action with target + ownaction_target = "{action $0}%K:%c$1%n "; + + # private action sent by others + pvtaction = "%Y(*) $*%n "; + pvtaction_query = "%Y* $*%n "; + + # public action sent by others + pubaction = "{pvtaction_query $*}"; ## ## Notice (/NOTICE command) diff --git a/apps/irssi/docs/help/in/action.in b/apps/irssi/docs/help/in/action.in index 6f0b9f1b..c934442d 100644 --- a/apps/irssi/docs/help/in/action.in +++ b/apps/irssi/docs/help/in/action.in @@ -1,6 +1,10 @@ @SYNTAX:action@ -Same as ME, but gets channel as an additional parameter. Example: /ACTION silc yawns (This outputs the following to channel silc: * Nick yawns) +Sends and ACTION to target. +For example: /ME * sits back. (sends ACTION "sits back" to the current window) + + -channel: interpret as channel name + -sign: add signature See also: ME diff --git a/apps/irssi/src/fe-common/silc/fe-silc-messages.c b/apps/irssi/src/fe-common/silc/fe-silc-messages.c index 155e6f44..07cf4a01 100644 --- a/apps/irssi/src/fe-common/silc/fe-silc-messages.c +++ b/apps/irssi/src/fe-common/silc/fe-silc-messages.c @@ -43,6 +43,8 @@ msg##_SIGNED : (v == SILC_MSG_SIGNED_UNKNOWN ? \ msg##_UNKNOWN : msg##_FAILED)) +#define VERIFIED_MSG2(v,msg) (v >= 0 ? VERIFIED_MSG(v,msg) : msg) + static void sig_signed_message_public(SERVER_REC * server, const char *msg, const char *nick, const char *address, @@ -165,6 +167,190 @@ static void sig_signed_message_own_public(SERVER_REC * server, g_free_not_null(freemsg); } +static void sig_signed_message_private(SERVER_REC * server, + const char *msg, const char *nick, + const char *address, int verified) +{ + QUERY_REC *query; + char *freemsg = NULL; + + query = query_find(server, nick); + + if (settings_get_bool("emphasis")) + msg = freemsg = expand_emphasis((WI_ITEM_REC *) query, msg); + + printformat_module("fe-common/silc", server, nick, MSGLEVEL_MSGS, + query == NULL ? VERIFIED_MSG(verified, SILCTXT_MSG_PRIVATE) : + VERIFIED_MSG(verified, SILCTXT_MSG_PRIVATE_QUERY), nick, address, msg); + + g_free_not_null(freemsg); +} + +static void sig_signed_message_own_private(SERVER_REC * server, + const char *msg, + const char *target, + const char *origtarget) +{ + QUERY_REC *query; + char *freemsg = NULL; + + g_return_if_fail(server != NULL); + g_return_if_fail(msg != NULL); + + if (target == NULL) { + /* this should only happen if some special target failed and + we should display some error message. currently the special + targets are only ',' and '.'. */ + g_return_if_fail(strcmp(origtarget, ",") == 0 || + strcmp(origtarget, ".") == 0); + + printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CLIENTNOTICE, + *origtarget == ',' ? SILCTXT_NO_MSGS_GOT : + SILCTXT_NO_MSGS_SENT); + signal_stop(); + return; + } + + query = privmsg_get_query(server, target, TRUE, MSGLEVEL_MSGS); + + if (settings_get_bool("emphasis")) + msg = freemsg = expand_emphasis((WI_ITEM_REC *) query, msg); + + printformat_module("fe-common/silc", server, target, + MSGLEVEL_MSGS | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT, + query == NULL ? SILCTXT_OWN_MSG_PRIVATE_SIGNED : + SILCTXT_OWN_MSG_PRIVATE_QUERY_SIGNED, target, msg, + server->nick); + + g_free_not_null(freemsg); +} + +static void sig_message_own_action_all(SERVER_REC *server, + const char *msg, const char *target, + bool is_channel, bool is_signed) +{ + void *item; + char *freemsg = NULL; + + if (is_channel) + item = channel_find(server, target); + else + item = query_find(server, target); + + if (settings_get_bool("emphasis")) + msg = freemsg = expand_emphasis(item, msg); + + printformat(server, target, + MSGLEVEL_ACTIONS | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT | + (is_channel ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS), + item != NULL ? + (is_signed ? SILCTXT_OWN_ACTION_SIGNED : SILCTXT_OWN_ACTION) : + (is_signed ? SILCTXT_OWN_ACTION_TARGET_SIGNED : + SILCTXT_OWN_ACTION_TARGET), + server->nick, msg, target); + + g_free_not_null(freemsg); +} + +static void sig_message_own_action(SERVER_REC *server, const char *msg, + const char *target) +{ + sig_message_own_action_all(server, msg, target, TRUE, FALSE); +} + +static void sig_message_own_private_action(SERVER_REC *server, + const char *msg, const char *target) +{ + sig_message_own_action_all(server, msg, target, FALSE, FALSE); +} + +static void sig_message_own_action_signed(SERVER_REC *server, + const char *msg, const char *target) +{ + sig_message_own_action_all(server, msg, target, TRUE, TRUE); +} + +static void sig_message_own_private_action_signed(SERVER_REC *server, + const char *msg, const char *target) +{ + sig_message_own_action_all(server, msg, target, FALSE, TRUE); +} + +static void sig_message_action_all(SERVER_REC *server, const char *msg, + const char *nick, const char *address, + const char *target, int is_channel, + int verified) +{ + void *item; + char *freemsg = NULL; + int level; + + level = MSGLEVEL_ACTIONS | + (is_channel ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); + + if (ignore_check(server, nick, address, target, msg, level)) + return; + + if (is_channel) + item = channel_find(server, target); + else + item = privmsg_get_query(server, nick, FALSE, level); + + if (settings_get_bool("emphasis")) + msg = freemsg = expand_emphasis(item, msg); + + if (is_channel) { + /* channel action */ + if (window_item_is_active(item)) { + /* message to active channel in window */ + printformat(server, target, level, + VERIFIED_MSG2(verified, SILCTXT_ACTION_PUBLIC), + nick, target, msg); + } else { + /* message to not existing/active channel */ + printformat(server, target, level, + VERIFIED_MSG2(verified, SILCTXT_ACTION_PUBLIC_CHANNEL), + nick, target, msg); + } + } else { + /* private action */ + printformat(server, nick, MSGLEVEL_ACTIONS | MSGLEVEL_MSGS, + item == NULL ? VERIFIED_MSG2(verified, SILCTXT_ACTION_PRIVATE) : + VERIFIED_MSG2(verified, SILCTXT_ACTION_PRIVATE_QUERY), + nick, address == NULL ? "" : address, msg); + } + + g_free_not_null(freemsg); +} + +static void sig_message_action(SERVER_REC *server, const char *msg, + const char *nick, const char *address, + const char *target) +{ + sig_message_action_all(server, msg, nick, address, target, TRUE, -1); +} + +static void sig_message_private_action(SERVER_REC *server, const char *msg, + const char *nick, const char *address, + const char *target) +{ + sig_message_action_all(server, msg, nick, address, target, FALSE, -1); +} + +static void sig_message_action_signed(SERVER_REC *server, const char *msg, + const char *nick, const char *address, + const char *target, int verified) +{ + sig_message_action_all(server, msg, nick, address, target, TRUE, verified); +} + +static void sig_message_private_action_signed(SERVER_REC *server, + const char *msg, const char *nick, + const char *address, const char *target, + int verified) +{ + sig_message_action_all(server, msg, nick, address, target, FALSE, verified); +} void fe_silc_messages_init(void) { @@ -172,6 +358,27 @@ void fe_silc_messages_init(void) (SIGNAL_FUNC) sig_signed_message_public); signal_add_last("message signed_own_public", (SIGNAL_FUNC) sig_signed_message_own_public); + signal_add_last("message signed_private", + (SIGNAL_FUNC) sig_signed_message_private); + signal_add_last("message signed_own_private", + (SIGNAL_FUNC) sig_signed_message_own_private); + + signal_add_last("message silc own_action", + (SIGNAL_FUNC) sig_message_own_action); + signal_add_last("message silc action", + (SIGNAL_FUNC) sig_message_action); + signal_add_last("message silc signed_own_action", + (SIGNAL_FUNC) sig_message_own_action_signed); + signal_add_last("message silc signed_action", + (SIGNAL_FUNC) sig_message_action_signed); + signal_add_last("message silc own_private_action", + (SIGNAL_FUNC) sig_message_own_private_action); + signal_add_last("message silc private_action", + (SIGNAL_FUNC) sig_message_private_action); + signal_add_last("message silc signed_own_private_action", + (SIGNAL_FUNC) sig_message_own_private_action_signed); + signal_add_last("message silc signed_private_action", + (SIGNAL_FUNC) sig_message_private_action_signed); } void fe_silc_messages_deinit(void) @@ -180,4 +387,25 @@ void fe_silc_messages_deinit(void) (SIGNAL_FUNC) sig_signed_message_public); signal_remove("message signed_own_public", (SIGNAL_FUNC) sig_signed_message_own_public); + signal_remove("message signed_private", + (SIGNAL_FUNC) sig_signed_message_private); + signal_remove("message signed_own_private", + (SIGNAL_FUNC) sig_signed_message_own_private); + + signal_remove("message silc own_action", + (SIGNAL_FUNC) sig_message_own_action); + signal_remove("message silc action", + (SIGNAL_FUNC) sig_message_action); + signal_remove("message silc signed_own_action", + (SIGNAL_FUNC) sig_message_own_action_signed); + signal_remove("message silc signed_action", + (SIGNAL_FUNC) sig_message_action_signed); + signal_remove("message silc own_private_action", + (SIGNAL_FUNC) sig_message_own_private_action); + signal_remove("message silc private_action", + (SIGNAL_FUNC) sig_message_private_action); + signal_remove("message silc signed_own_private_action", + (SIGNAL_FUNC) sig_message_own_private_action_signed); + signal_remove("message silc signed_private_action", + (SIGNAL_FUNC) sig_message_private_action_signed); } diff --git a/apps/irssi/src/fe-common/silc/fe-silc-queries.c b/apps/irssi/src/fe-common/silc/fe-silc-queries.c index 4dee4d27..405fd91a 100644 --- a/apps/irssi/src/fe-common/silc/fe-silc-queries.c +++ b/apps/irssi/src/fe-common/silc/fe-silc-queries.c @@ -39,68 +39,6 @@ #include "printtext.h" #include "module-formats.h" -#define VERIFIED_MSG(v,msg) (v == SILC_MSG_SIGNED_VERIFIED ? \ - msg##_SIGNED : (v == SILC_MSG_SIGNED_UNKNOWN ? \ - msg##_UNKNOWN : msg##_FAILED)) - -static void sig_signed_message_private(SERVER_REC * server, - const char *msg, const char *nick, - const char *address, int verified) -{ - QUERY_REC *query; - char *freemsg = NULL; - - query = query_find(server, nick); - - if (settings_get_bool("emphasis")) - msg = freemsg = expand_emphasis((WI_ITEM_REC *) query, msg); - - printformat_module("fe-common/silc", server, nick, MSGLEVEL_MSGS, - query == NULL ? VERIFIED_MSG(verified, SILCTXT_MSG_PRIVATE) : - VERIFIED_MSG(verified, SILCTXT_MSG_PRIVATE_QUERY), nick, address, msg); - - g_free_not_null(freemsg); -} - -static void sig_signed_message_own_private(SERVER_REC * server, - const char *msg, - const char *target, - const char *origtarget) -{ - QUERY_REC *query; - char *freemsg = NULL; - - g_return_if_fail(server != NULL); - g_return_if_fail(msg != NULL); - - if (target == NULL) { - /* this should only happen if some special target failed and - we should display some error message. currently the special - targets are only ',' and '.'. */ - g_return_if_fail(strcmp(origtarget, ",") == 0 || - strcmp(origtarget, ".") == 0); - - printformat_module("fe-common/silc", NULL, NULL, MSGLEVEL_CLIENTNOTICE, - *origtarget == ',' ? SILCTXT_NO_MSGS_GOT : - SILCTXT_NO_MSGS_SENT); - signal_stop(); - return; - } - - query = privmsg_get_query(server, target, TRUE, MSGLEVEL_MSGS); - - if (settings_get_bool("emphasis")) - msg = freemsg = expand_emphasis((WI_ITEM_REC *) query, msg); - - printformat_module("fe-common/silc", server, target, - MSGLEVEL_MSGS | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT, - query == NULL ? SILCTXT_OWN_MSG_PRIVATE_SIGNED : - SILCTXT_OWN_MSG_PRIVATE_QUERY_SIGNED, target, msg, - server->nick); - - g_free_not_null(freemsg); -} - static void sig_signed_message_query(SERVER_REC *server, const char *msg, const char *nick, const char *address, int verified) @@ -115,25 +53,14 @@ static void sig_signed_message_query(SERVER_REC *server, const char *msg, query->last_unread_msg = time(NULL); } - void fe_silc_queries_init(void) { - signal_add_last("message signed_private", - (SIGNAL_FUNC) sig_signed_message_private); - signal_add_last("message signed_own_private", - (SIGNAL_FUNC) sig_signed_message_own_private); - signal_add_first("message signed_private", (SIGNAL_FUNC) sig_signed_message_query); } void fe_silc_queries_deinit(void) { - signal_remove("message signed_private", - (SIGNAL_FUNC) sig_signed_message_private); - signal_remove("message signed_own_private", - (SIGNAL_FUNC) sig_signed_message_own_private); - signal_remove("message signed_private", (SIGNAL_FUNC) sig_signed_message_query); } diff --git a/apps/irssi/src/fe-common/silc/module-formats.c b/apps/irssi/src/fe-common/silc/module-formats.c index d492d3f6..aa1880c1 100644 --- a/apps/irssi/src/fe-common/silc/module-formats.c +++ b/apps/irssi/src/fe-common/silc/module-formats.c @@ -33,9 +33,7 @@ FORMAT_REC fecommon_silc_formats[] = { { "channel_topic_not_set", "Topic for {channel $0} not set", 1, { 0 } }, { "cmode", "channel mode/{channel $0} {mode $1} by {nick $2}", 3, { 0, 0, 0 } }, { "cumode", "channel user mode/{channel $0}/{nick $1} {mode $2} by {nick $3}", 4, { 0, 0, 0, 0 } }, - { "action", "{action $0-}", 2, { 0, 0 } }, { "notice", "{notice $0-}", 2, { 0, 0 } }, - { "ownaction", "{ownaction $0-}", 2, { 0, 0 } }, { "ownnotice", "{ownnotice $0-}", 2, { 0, 0 } }, { "inviteban_list", "channel {channel $0} $1 list:", 2, { 0, 0 } }, { "inviteban_string", "$0 - {channel $1}: $2 {ban $3}", 4, { 1, 0, 0, 0 } }, @@ -82,6 +80,26 @@ FORMAT_REC fecommon_silc_formats[] = { { "channel_pk_list", "Channel {channel $0} Public Key List:", 1, { 0 } }, { "channel_pk_list_entry", "$0 - {channel $1}: $2 $3: Fingerprint (SHA1) {ban $4} (Babbleprint (SHA1) {ban $5})", 6, { 1, 0, 0, 0, 0, 0 } }, { "channel_pk_no_list", "No Channel Public Key List for {channel $0}", 1, { 0 } }, + { "own_action", "{ownaction $0}$1", 3, { 0, 0, 0 } }, + { "own_action_signed", "{ownaction {flag_signed}$0}$1", 3, { 0, 0, 0 } }, + { "own_action_target", "{ownaction_target $0 $2}$1", 3, { 0, 0, 0 } }, + { "own_action_target_signed", "{ownaction_target {flag_signed}$0 $2}$1", 3, { 0, 0, 0 } }, + { "action_public", "{pubaction $0}$2", 3, { 0, 0, 0 } }, + { "action_public_signed", "{pubaction {flag_signed}$0}$2", 3, { 0, 0, 0 } }, + { "action_public_unknown", "{pubaction {flag_unknown}$0}$2", 3, { 0, 0, 0 } }, + { "action_public_failed", "{pubaction {flag_failed}$0}$2", 3, { 0, 0, 0 } }, + { "action_public_channel", "{pubaction $0{msgchannel $1}}$2", 3, { 0, 0, 0 } }, + { "action_public_channel_signed", "{pubaction {flag_signed}$0{msgchannel $1}}$2", 3, { 0, 0, 0 } }, + { "action_public_channel_unknown", "{pubaction {flag_unknown}$0{msgchannel $1}}$2", 3, { 0, 0, 0 } }, + { "action_public_channel_failed", "{pubaction {flag_failed}$0{msgchannel $1}}$2", 3, { 0, 0, 0 } }, + { "action_private", "{pvtaction $0}$2", 3, { 0, 0, 0 } }, + { "action_private_signed", "{pvtaction {flag_signed}$0}$2", 3, { 0, 0, 0 } }, + { "action_private_unknown", "{pvtaction {flag_unknown}$0}$2", 3, { 0, 0, 0 } }, + { "action_private_failed", "{pvtaction {flag_failed}$0}$2", 3, { 0, 0, 0 } }, + { "action_private_query", "{pvtaction_query $0}$2", 3, { 0, 0, 0 } }, + { "action_private_query_signed", "{pvtaction_query {flag_signed}$0}$2", 3, { 0, 0, 0 } }, + { "action_private_query_unknown", "{pvtaction_query {flag_unknown}$0}$2", 3, { 0, 0, 0 } }, + { "action_private_query_failed", "{pvtaction_query {flag_failed}$0}$2", 3, { 0, 0, 0 } }, /* WHOIS, WHOWAS and USERS (alias WHO) messages */ { NULL, "Who Queries", 0 }, diff --git a/apps/irssi/src/fe-common/silc/module-formats.h b/apps/irssi/src/fe-common/silc/module-formats.h index 0d9277a0..a9832745 100644 --- a/apps/irssi/src/fe-common/silc/module-formats.h +++ b/apps/irssi/src/fe-common/silc/module-formats.h @@ -30,9 +30,7 @@ enum { SILCTXT_CHANNEL_TOPIC_NOT_SET, SILCTXT_CHANNEL_CMODE, SILCTXT_CHANNEL_CUMODE, - SILCTXT_CHANNEL_ACTION, SILCTXT_CHANNEL_NOTICE, - SILCTXT_CHANNEL_OWNACTION, SILCTXT_CHANNEL_OWNNOTICE, SILCTXT_CHANNEL_INVITEBAN_LIST, SILCTXT_CHANNEL_INVITEBAN_STRING, @@ -79,6 +77,27 @@ enum { SILCTXT_CHANNEL_PK_LIST, SILCTXT_CHANNEL_PK_LIST_ENTRY, SILCTXT_CHANNEL_PK_NO_LIST, + SILCTXT_OWN_ACTION, + SILCTXT_OWN_ACTION_SIGNED, + SILCTXT_OWN_ACTION_TARGET, + SILCTXT_OWN_ACTION_TARGET_SIGNED, + SILCTXT_ACTION_PUBLIC, + SILCTXT_ACTION_PUBLIC_SIGNED, + SILCTXT_ACTION_PUBLIC_UNKNOWN, + SILCTXT_ACTION_PUBLIC_FAILED, + SILCTXT_ACTION_PUBLIC_CHANNEL, + SILCTXT_ACTION_PUBLIC_CHANNEL_SIGNED, + SILCTXT_ACTION_PUBLIC_CHANNEL_UNKNOWN, + SILCTXT_ACTION_PUBLIC_CHANNEL_FAILED, + SILCTXT_ACTION_PRIVATE, + SILCTXT_ACTION_PRIVATE_SIGNED, + SILCTXT_ACTION_PRIVATE_UNKNOWN, + SILCTXT_ACTION_PRIVATE_FAILED, + SILCTXT_ACTION_PRIVATE_QUERY, + SILCTXT_ACTION_PRIVATE_QUERY_SIGNED, + SILCTXT_ACTION_PRIVATE_QUERY_UNKNOWN, + SILCTXT_ACTION_PRIVATE_QUERY_FAILED, + SILCTXT_FILL_2, diff --git a/apps/irssi/src/silc/core/client_ops.c b/apps/irssi/src/silc/core/client_ops.c index ba0201cc..76262922 100644 --- a/apps/irssi/src/silc/core/client_ops.c +++ b/apps/irssi/src/silc/core/client_ops.c @@ -426,8 +426,6 @@ void silc_channel_message(SilcClient client, SilcClientConnection conn, if (!message) return; - /* FIXME: replace those printformat calls with signals and add signature - information to them (if present) */ if (flags & SILC_MESSAGE_FLAG_ACTION) if(flags & SILC_MESSAGE_FLAG_UTF8 && !silc_term_utf8()) { char tmp[256], *cp, *dm = NULL; @@ -439,16 +437,23 @@ void silc_channel_message(SilcClient client, SilcClientConnection conn, } silc_utf8_decode(message, message_len, SILC_STRING_LANGUAGE, cp, message_len); - printformat_module("fe-common/silc", server, channel->channel_name, - MSGLEVEL_ACTIONS, SILCTXT_CHANNEL_ACTION, - nick == NULL ? "[]" : nick->nick, cp); + if (flags & SILC_MESSAGE_FLAG_SIGNED) + signal_emit("message silc signed_action", 6, server, cp, nick->nick, + nick->host, channel->channel_name, verified); + else + signal_emit("message silc action", 6, server, cp, nick->nick, + nick->host, channel->channel_name); silc_free(dm); } else { - printformat_module("fe-common/silc", server, channel->channel_name, - MSGLEVEL_ACTIONS, SILCTXT_CHANNEL_ACTION, - nick == NULL ? "[]" : nick->nick, - message); + if (flags & SILC_MESSAGE_FLAG_SIGNED) + signal_emit("message silc signed_action", 6, server, message, + nick->nick, nick->host, channel->channel_name, verified); + else + signal_emit("message silc action", 6, server, message, + nick->nick, nick->host, channel->channel_name); } + /* FIXME: replace those printformat calls with signals and add signature + information to them (if present) */ else if (flags & SILC_MESSAGE_FLAG_NOTICE) if(flags & SILC_MESSAGE_FLAG_UTF8 && !silc_term_utf8()) { char tmp[256], *cp, *dm = NULL; @@ -555,6 +560,42 @@ void silc_private_message(SilcClient client, SilcClientConnection conn, if (!message) return; + if (flags & SILC_MESSAGE_FLAG_ACTION) { + if(flags & SILC_MESSAGE_FLAG_UTF8 && !silc_term_utf8()) { + char tmp[256], *cp, *dm = NULL; + memset(tmp, 0, sizeof(tmp)); + cp = tmp; + if(message_len > sizeof(tmp) - 1) { + dm = silc_calloc(message_len + 1, sizeof(*dm)); + cp = dm; + } + silc_utf8_decode(message, message_len, SILC_STRING_LANGUAGE, + cp, message_len); + if (flags & SILC_MESSAGE_FLAG_SIGNED) + signal_emit("message silc signed_private_action", 6, server, cp, + sender->nickname ? sender->nickname : "[]", + sender->username ? userhost : NULL, + NULL, verified); + else + signal_emit("message silc private_action", 6, server, cp, + sender->nickname ? sender->nickname : "[]", + sender->username ? userhost : NULL, NULL); + silc_free(dm); + } else { + if (flags & SILC_MESSAGE_FLAG_SIGNED) + signal_emit("message silc signed_private_action", 6, server, message, + sender->nickname ? sender->nickname : "[]", + sender->username ? userhost : NULL, + NULL, verified); + else + signal_emit("message silc private_action", 6, server, message, + sender->nickname ? sender->nickname : "[]", + sender->username ? userhost : NULL, NULL); + } + return; + } + /* FIXME: added notices */ + if (flags & SILC_MESSAGE_FLAG_UTF8 && !silc_term_utf8()) { char tmp[256], *cp, *dm = NULL; diff --git a/apps/irssi/src/silc/core/silc-channels.c b/apps/irssi/src/silc/core/silc-channels.c index 9352f67e..6340283a 100644 --- a/apps/irssi/src/silc/core/silc-channels.c +++ b/apps/irssi/src/silc/core/silc-channels.c @@ -200,130 +200,109 @@ static void command_part(const char *data, SILC_SERVER_REC *server, channel_destroy(CHANNEL(chanrec)); } -/* ME local command. */ -static void command_me(const char *data, SILC_SERVER_REC *server, - WI_ITEM_REC *item) +/* ACTION local command. */ + +static void command_action(const char *data, SILC_SERVER_REC *server, + WI_ITEM_REC *item) { - SILC_CHANNEL_REC *chanrec; - char *tmpcmd = "ME", *tmp; - SilcUInt32 argc = 0; - unsigned char *message = NULL; - unsigned char **argv; - SilcUInt32 *argv_lens, *argv_types; - int i; - - CMD_SILC_SERVER(server); + GHashTable *optlist; + char *target, *msg; + char *message = NULL; + int target_type; + void *free_arg; + CMD_SILC_SERVER(server); if (!IS_SILC_SERVER(server) || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); - if (!IS_SILC_CHANNEL(item)) + if ((item != NULL) && (!IS_SILC_CHANNEL(item) && !IS_SILC_QUERY(item))) cmd_return_error(CMDERR_NOT_JOINED); /* Now parse all arguments */ - tmp = g_strconcat(tmpcmd, " ", data, NULL); - silc_parse_command_line(tmp, &argv, &argv_lens, - &argv_types, &argc, 2); - g_free(tmp); - - if (argc < 2) - cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); + if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_OPTIONS | + PARAM_FLAG_GETREST, + "action", &optlist, &target, &msg)) + return; - chanrec = silc_channel_find(server, item->visible_name); - if (chanrec == NULL) - cmd_return_error(CMDERR_CHAN_NOT_FOUND); + if (*target == '\0' || *msg == '\0') + cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); + + if (strcmp(target, "*") == 0) { + /* send to active channel/query */ + if (item == NULL) + cmd_param_error(CMDERR_NOT_JOINED); + + target_type = IS_SILC_CHANNEL(item) ? + SEND_TARGET_CHANNEL : SEND_TARGET_NICK; + target = (char *)window_item_get_target(item); + } else if (g_hash_table_lookup(optlist, "channel") != NULL) + target_type = SEND_TARGET_CHANNEL; + else { + target_type = SEND_TARGET_NICK; + } if (!silc_term_utf8()) { - int len = silc_utf8_encoded_len(argv[1], argv_lens[1], + int len = silc_utf8_encoded_len(msg, strlen(msg), SILC_STRING_LANGUAGE); message = silc_calloc(len + 1, sizeof(*message)); g_return_if_fail(message != NULL); - silc_utf8_encode(argv[1], argv_lens[1], SILC_STRING_LANGUAGE, + silc_utf8_encode(msg, strlen(msg), SILC_STRING_LANGUAGE, message, len); } - /* Send the action message */ - silc_client_send_channel_message(silc_client, server->conn, - chanrec->entry, NULL, - SILC_MESSAGE_FLAG_ACTION | - SILC_MESSAGE_FLAG_UTF8, - message ? message : argv[1], - message ? strlen(message) : argv_lens[1], - TRUE); - - printformat_module("fe-common/silc", server, chanrec->entry->channel_name, - MSGLEVEL_ACTIONS, SILCTXT_CHANNEL_OWNACTION, - server->conn->local_entry->nickname, argv[1]); + if (target != NULL) { + if (target_type == SEND_TARGET_CHANNEL) { + if (silc_send_channel(server, target, (message != NULL ? message : msg), + SILC_MESSAGE_FLAG_ACTION | SILC_MESSAGE_FLAG_UTF8 | + (g_hash_table_lookup(optlist, "sign") != NULL ? + SILC_MESSAGE_FLAG_SIGNED : 0))) { + if (g_hash_table_lookup(optlist, "sign")) + signal_emit("message silc signed_own_action", 3, server, msg, target); + else + signal_emit("message silc own_action", 3, server, msg, target); + } + } else { + if (silc_send_msg(server, target, (message != NULL ? message : msg), + (message != NULL ? strlen(message) : strlen(msg)), + SILC_MESSAGE_FLAG_ACTION | SILC_MESSAGE_FLAG_UTF8 | + (g_hash_table_lookup(optlist, "sign") != NULL ? + SILC_MESSAGE_FLAG_SIGNED : 0))) { + if (g_hash_table_lookup(optlist, "sign")) + signal_emit("message silc signed_own_private_action", 3, + server, msg, target); + else + signal_emit("message silc own_private_action", 3, + server, msg, target); + } + } + } - for (i = 0; i < argc; i++) - silc_free(argv[i]); - silc_free(argv_lens); - silc_free(argv_types); + cmd_params_free(free_arg); silc_free(message); } -/* ACTION local command. Same as ME but takes the channel as mandatory - argument. */ +/* ME local command. */ -static void command_action(const char *data, SILC_SERVER_REC *server, - WI_ITEM_REC *item) +static void command_me(const char *data, SILC_SERVER_REC *server, + WI_ITEM_REC *item) { - SILC_CHANNEL_REC *chanrec; - char *tmpcmd = "ME", *tmp; - SilcUInt32 argc = 0; - unsigned char *message = NULL; - unsigned char **argv; - SilcUInt32 *argv_lens, *argv_types; - int i; - + char *tmpcmd; + CMD_SILC_SERVER(server); if (!IS_SILC_SERVER(server) || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); - if (!IS_SILC_CHANNEL(item)) + if (!IS_SILC_CHANNEL(item) && !IS_SILC_QUERY(item)) cmd_return_error(CMDERR_NOT_JOINED); - /* Now parse all arguments */ - tmp = g_strconcat(tmpcmd, " ", data, NULL); - silc_parse_command_line(tmp, &argv, &argv_lens, - &argv_types, &argc, 3); - g_free(tmp); - - if (argc < 3) - cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); - - chanrec = silc_channel_find(server, argv[1]); - if (chanrec == NULL) - cmd_return_error(CMDERR_CHAN_NOT_FOUND); - - if (!silc_term_utf8()) { - int len = silc_utf8_encoded_len(argv[2], argv_lens[2], - SILC_STRING_LANGUAGE); - message = silc_calloc(len + 1, sizeof(*message)); - g_return_if_fail(message != NULL); - silc_utf8_encode(argv[2], argv_lens[2], SILC_STRING_LANGUAGE, - message, len); - } - - /* Send the action message */ - silc_client_send_channel_message(silc_client, server->conn, - chanrec->entry, NULL, - SILC_MESSAGE_FLAG_ACTION | - SILC_MESSAGE_FLAG_UTF8, - message ? message : argv[2], - message ? strlen(message) : argv_lens[2], - TRUE); - - printformat_module("fe-common/silc", server, chanrec->entry->channel_name, - MSGLEVEL_ACTIONS, SILCTXT_CHANNEL_OWNACTION, - server->conn->local_entry->nickname, argv[2]); + if (IS_SILC_CHANNEL(item)) + tmpcmd = g_strdup_printf("-channel %s %s", item->visible_name, data); + else + tmpcmd = g_strdup_printf("%s %s", item->visible_name, data); - for (i = 0; i < argc; i++) - silc_free(argv[i]); - silc_free(argv_lens); - silc_free(argv_types); - silc_free(message); + command_action(tmpcmd, server, item); + g_free(tmpcmd); } /* NOTICE local command. */ @@ -332,7 +311,7 @@ static void command_notice(const char *data, SILC_SERVER_REC *server, WI_ITEM_REC *item) { SILC_CHANNEL_REC *chanrec; - char *tmpcmd = "ME", *tmp; + char *tmpcmd = "NOTICE", *tmp; SilcUInt32 argc = 0; unsigned char *message = NULL; unsigned char **argv; @@ -1228,6 +1207,7 @@ void silc_channels_init(void) command_bind("listkeys", MODULE_NAME, (SIGNAL_FUNC) command_listkeys); command_set_options("listkeys", "clients servers"); + command_set_options("action", "sign channel"); silc_nicklist_init(); } diff --git a/apps/irssi/src/silc/core/silc-servers.c b/apps/irssi/src/silc/core/silc-servers.c index 4115204a..444cda53 100644 --- a/apps/irssi/src/silc/core/silc-servers.c +++ b/apps/irssi/src/silc/core/silc-servers.c @@ -51,9 +51,9 @@ void silc_servers_reconnect_init(void); void silc_servers_reconnect_deinit(void); -static int silc_send_channel(SILC_SERVER_REC *server, - char *channel, char *msg, - SilcMessageFlags flags) +int silc_send_channel(SILC_SERVER_REC *server, + char *channel, char *msg, + SilcMessageFlags flags) { SILC_CHANNEL_REC *rec; @@ -135,8 +135,8 @@ static void silc_send_msg_clients(SilcClient client, g_free(rec); } -static int silc_send_msg(SILC_SERVER_REC *server, char *nick, char *msg, - int msg_len, SilcMessageFlags flags) +int silc_send_msg(SILC_SERVER_REC *server, char *nick, char *msg, + int msg_len, SilcMessageFlags flags) { PRIVMSG_REC *rec; SilcClientEntry *clients; @@ -426,7 +426,7 @@ char *silc_server_get_channels(SILC_SERVER_REC *server) /* SYNTAX: MOTD [] */ /* SYNTAX: LIST [] */ /* SYNTAX: ME */ -/* SYNTAX: ACTION */ +/* SYNTAX: ACTION [-sign] [-channel] */ /* SYNTAX: AWAY [] */ /* SYNTAX: INFO [] */ /* SYNTAX: NICK */ diff --git a/apps/irssi/src/silc/core/silc-servers.h b/apps/irssi/src/silc/core/silc-servers.h index bf3f3b70..5e63c09b 100644 --- a/apps/irssi/src/silc/core/silc-servers.h +++ b/apps/irssi/src/silc/core/silc-servers.h @@ -73,4 +73,9 @@ void silc_server_free_ftp(SILC_SERVER_REC *server, SilcClientEntry client_entry); bool silc_term_utf8(void); +int silc_send_msg(SILC_SERVER_REC *server, char *nick, char *msg, + int msg_len, SilcMessageFlags flags); +int silc_send_channel(SILC_SERVER_REC *server, + char *channel, char *msg, + SilcMessageFlags flags); #endif -- 2.43.0