From: Jochen Eisinger Date: Tue, 6 Jan 2004 01:47:25 +0000 (+0000) Subject: Tue Jan 04 02:43:44 CET 2004 Jochen Eisinger X-Git-Tag: silc.client.1.0.1~8 X-Git-Url: http://git.silcnet.org/gitweb/?a=commitdiff_plain;h=0a314053b203fbac22b0655222e0e01f74fdf36f;p=silc.git Tue Jan 04 02:43:44 CET 2004 Jochen Eisinger * Changed the way NOTICE flagged messages are treated. Added support for notices in queries and signing notices. Affected files irssi/default.theme; irssi/docs/help/in/notice.in; irssi/src/fe-common/silc/module-formats.[ch], fe-silc-messages.c; irssi/src/silc/core/client_ops.c, silc-channels.c, silc-servers.c --- diff --git a/CHANGES b/CHANGES index 95706be0..06ec28a2 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,14 @@ +Tue Jan 04 02:43:44 CET 2004 Jochen Eisinger + + * Changed the way NOTICE flagged messages are treated. Added support + for notices in queries and signing notices. Affected files + irssi/default.theme; irssi/docs/help/in/notice.in; + irssi/src/fe-common/silc/module-formats.[ch], fe-silc-messages.c; + irssi/src/silc/core/client_ops.c, silc-channels.c, silc-servers.c + + * Fixed typo in /ACTION help. Affected file + irssi/docs/help/in/action.in + Mon Jan 03 23:26:38 CET 2004 Jochen Eisinger * Fixed typo in perl module. Affected file diff --git a/apps/irssi/default.theme b/apps/irssi/default.theme index b29bb017..f7e6d668 100644 --- a/apps/irssi/default.theme +++ b/apps/irssi/default.theme @@ -139,10 +139,10 @@ abstracts = { ## # Generic notice - notice = "%C- $0 $1-"; - - # Own sent notice - ownnotice = "%g- $0 $1-"; + ownnotice = "%g- $1 -%n "; + notice = "%C- $* -%n "; + pubnotice_channel = ""; + pvtnotice_host = ""; ## diff --git a/apps/irssi/docs/help/in/notice.in b/apps/irssi/docs/help/in/notice.in index e93d2c2a..3763cb60 100644 --- a/apps/irssi/docs/help/in/notice.in +++ b/apps/irssi/docs/help/in/notice.in @@ -3,6 +3,11 @@ Sends a notice to the nick or the channel. Usually notices are used in bots and scripts for different kinds of replies. +For example: /NOTICE * command executed. (sends NOTICE "command executed" to +the current window) + + -channel: interpret as channel name + -sign: add signature See also: ACTION 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 07cf4a01..475c9e9e 100644 --- a/apps/irssi/src/fe-common/silc/fe-silc-messages.c +++ b/apps/irssi/src/fe-common/silc/fe-silc-messages.c @@ -352,6 +352,79 @@ static void sig_message_private_action_signed(SERVER_REC *server, sig_message_action_all(server, msg, nick, address, target, FALSE, verified); } +static void sig_message_own_notice_all(SERVER_REC *server, + const char *msg, const char *target, + bool is_signed) +{ + printformat(server, target, + MSGLEVEL_NOTICES | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT, + (is_signed ? SILCTXT_OWN_NOTICE_SIGNED : SILCTXT_OWN_NOTICE), + target, msg); +} + +static void sig_message_own_notice(SERVER_REC *server, const char *msg, + const char *target) +{ + sig_message_own_notice_all(server, msg, target, FALSE); +} + +static void sig_message_own_notice_signed(SERVER_REC *server, + const char *msg, const char *target) +{ + sig_message_own_notice_all(server, msg, target, TRUE); +} + +static void sig_message_notice_all(SERVER_REC *server, const char *msg, + const char *nick, const char *address, + const char *target, int is_channel, + int verified) +{ + if (ignore_check(server, nick, address, target, msg, MSGLEVEL_NOTICES)) + return; + + if (is_channel) { + /* channel notice */ + printformat(server, target, MSGLEVEL_NOTICES, + VERIFIED_MSG2(verified, SILCTXT_NOTICE_PUBLIC), + nick, target, msg); + } else { + /* private notice */ + printformat(server, nick, MSGLEVEL_NOTICES, + VERIFIED_MSG2(verified, SILCTXT_NOTICE_PRIVATE), + nick, address == NULL ? "" : address, msg); + } + +} + +static void sig_message_notice(SERVER_REC *server, const char *msg, + const char *nick, const char *address, + const char *target) +{ + sig_message_notice_all(server, msg, nick, address, target, TRUE, -1); +} + +static void sig_message_private_notice(SERVER_REC *server, const char *msg, + const char *nick, const char *address, + const char *target) +{ + sig_message_notice_all(server, msg, nick, address, target, FALSE, -1); +} + +static void sig_message_notice_signed(SERVER_REC *server, const char *msg, + const char *nick, const char *address, + const char *target, int verified) +{ + sig_message_notice_all(server, msg, nick, address, target, TRUE, verified); +} + +static void sig_message_private_notice_signed(SERVER_REC *server, + const char *msg, const char *nick, + const char *address, const char *target, + int verified) +{ + sig_message_notice_all(server, msg, nick, address, target, FALSE, verified); +} + void fe_silc_messages_init(void) { signal_add_last("message signed_public", @@ -379,6 +452,23 @@ void fe_silc_messages_init(void) (SIGNAL_FUNC) sig_message_own_private_action_signed); signal_add_last("message silc signed_private_action", (SIGNAL_FUNC) sig_message_private_action_signed); + + signal_add_last("message silc own_notice", + (SIGNAL_FUNC) sig_message_own_notice); + signal_add_last("message silc notice", + (SIGNAL_FUNC) sig_message_notice); + signal_add_last("message silc signed_own_notice", + (SIGNAL_FUNC) sig_message_own_notice_signed); + signal_add_last("message silc signed_notice", + (SIGNAL_FUNC) sig_message_notice_signed); + signal_add_last("message silc own_private_notice", + (SIGNAL_FUNC) sig_message_own_notice); + signal_add_last("message silc private_notice", + (SIGNAL_FUNC) sig_message_private_notice); + signal_add_last("message silc signed_own_private_notice", + (SIGNAL_FUNC) sig_message_own_notice_signed); + signal_add_last("message silc signed_private_notice", + (SIGNAL_FUNC) sig_message_private_notice_signed); } void fe_silc_messages_deinit(void) @@ -408,4 +498,21 @@ void fe_silc_messages_deinit(void) (SIGNAL_FUNC) sig_message_own_private_action_signed); signal_remove("message silc signed_private_action", (SIGNAL_FUNC) sig_message_private_action_signed); + + signal_remove("message silc own_notice", + (SIGNAL_FUNC) sig_message_own_notice); + signal_remove("message silc notice", + (SIGNAL_FUNC) sig_message_notice); + signal_remove("message silc signed_own_notice", + (SIGNAL_FUNC) sig_message_own_notice_signed); + signal_remove("message silc signed_notice", + (SIGNAL_FUNC) sig_message_notice_signed); + signal_remove("message silc own_private_notice", + (SIGNAL_FUNC) sig_message_own_notice); + signal_remove("message silc private_notice", + (SIGNAL_FUNC) sig_message_private_notice); + signal_remove("message silc signed_own_private_notice", + (SIGNAL_FUNC) sig_message_own_notice_signed); + signal_remove("message silc signed_private_notice", + (SIGNAL_FUNC) sig_message_private_notice_signed); } diff --git a/apps/irssi/src/fe-common/silc/module-formats.c b/apps/irssi/src/fe-common/silc/module-formats.c index aa1880c1..88736464 100644 --- a/apps/irssi/src/fe-common/silc/module-formats.c +++ b/apps/irssi/src/fe-common/silc/module-formats.c @@ -33,8 +33,6 @@ 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 } }, - { "notice", "{notice $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 } }, { "inviteban_pubkey", "$0 - {channel $1}: $2 Fingerprint (SHA1) {ban $3} (Babbleprint (SHA1) {ban $4})", 5, { 1, 0, 0, 0, 0 } }, @@ -100,6 +98,16 @@ FORMAT_REC fecommon_silc_formats[] = { { "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 } }, + { "own_notice", "{ownnotice notice $0}$1", 2, { 0, 0 } }, + { "own_notice_signed", "{ownnotice notice {flag_signed}$0}$1", 2, { 0, 0 } }, + { "notice_public", "{notice $0{pubnotice_channel $1}}$2", 3, { 0, 0, 0 } }, + { "notice_public_signed", "{notice {flag_signed}$0{pubnotice_channel $1}}$2", 3, { 0, 0, 0 } }, + { "notice_public_unknown", "{notice {flag_unknown}$0{pubnotice_channel $1}}$2", 3, { 0, 0, 0 } }, + { "notice_public_failed", "{notice {flag_failed}$0{pubnotice_channel $1}}$2", 3, { 0, 0, 0 } }, + { "notice_private", "{notice $0{pvtnotice_host $1}}$2", 3, { 0, 0, 0 } }, + { "notice_private_signed", "{notice {flag_signed}$0{pvtnotice_host $1}}$2", 3, { 0, 0, 0 } }, + { "notice_private_unknown", "{notice {flag_unknown}$0{pvtnotice_host $1}}$2", 3, { 0, 0, 0 } }, + { "notice_private_failed", "{notice {flag_failed}$0{pvtnotice_host $1}}$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 a9832745..27a94e9e 100644 --- a/apps/irssi/src/fe-common/silc/module-formats.h +++ b/apps/irssi/src/fe-common/silc/module-formats.h @@ -30,8 +30,6 @@ enum { SILCTXT_CHANNEL_TOPIC_NOT_SET, SILCTXT_CHANNEL_CMODE, SILCTXT_CHANNEL_CUMODE, - SILCTXT_CHANNEL_NOTICE, - SILCTXT_CHANNEL_OWNNOTICE, SILCTXT_CHANNEL_INVITEBAN_LIST, SILCTXT_CHANNEL_INVITEBAN_STRING, SILCTXT_CHANNEL_INVITEBAN_PUBKEY, @@ -97,6 +95,16 @@ enum { SILCTXT_ACTION_PRIVATE_QUERY_SIGNED, SILCTXT_ACTION_PRIVATE_QUERY_UNKNOWN, SILCTXT_ACTION_PRIVATE_QUERY_FAILED, + SILCTXT_OWN_NOTICE, + SILCTXT_OWN_NOTICE_SIGNED, + SILCTXT_NOTICE_PUBLIC, + SILCTXT_NOTICE_PUBLIC_SIGNED, + SILCTXT_NOTICE_PUBLIC_UNKNOWN, + SILCTXT_NOTICE_PUBLIC_FAILED, + SILCTXT_NOTICE_PRIVATE, + SILCTXT_NOTICE_PRIVATE_SIGNED, + SILCTXT_NOTICE_PRIVATE_UNKNOWN, + SILCTXT_NOTICE_PRIVATE_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 fb9782ff..d47dfc99 100644 --- a/apps/irssi/src/silc/core/client_ops.c +++ b/apps/irssi/src/silc/core/client_ops.c @@ -452,8 +452,6 @@ void silc_channel_message(SilcClient client, SilcClientConnection conn, signal_emit("message silc action", 5, 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; @@ -465,15 +463,20 @@ 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_NOTICES, SILCTXT_CHANNEL_NOTICE, - nick == NULL ? "[]" : nick->nick, cp); + if (flags & SILC_MESSAGE_FLAG_SIGNED) + signal_emit("message silc signed_notice", 6, server, cp, nick->nick, + nick->host, channel->channel_name, verified); + else + signal_emit("message silc notice", 5, server, cp, nick->nick, + nick->host, channel->channel_name); silc_free(dm); } else { - printformat_module("fe-common/silc", server, channel->channel_name, - MSGLEVEL_NOTICES, SILCTXT_CHANNEL_NOTICE, - nick == NULL ? "[]" : nick->nick, - message); + if (flags & SILC_MESSAGE_FLAG_SIGNED) + signal_emit("message silc signed_notice", 6, server, message, + nick->nick, nick->host, channel->channel_name, verified); + else + signal_emit("message silc notice", 5, server, message, + nick->nick, nick->host, channel->channel_name); } else { if (flags & SILC_MESSAGE_FLAG_UTF8 && !silc_term_utf8()) { @@ -560,7 +563,7 @@ void silc_private_message(SilcClient client, SilcClientConnection conn, if (!message) return; - if (flags & SILC_MESSAGE_FLAG_ACTION) { + 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)); @@ -592,42 +595,72 @@ void silc_private_message(SilcClient client, SilcClientConnection conn, sender->nickname ? sender->nickname : "[]", sender->username ? userhost : NULL, NULL); } - return; - } - /* FIXME: added notices */ + else if (flags & SILC_MESSAGE_FLAG_NOTICE) + 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_notice", 6, server, cp, + sender->nickname ? sender->nickname : "[]", + sender->username ? userhost : NULL, + NULL, verified); + else + signal_emit("message silc private_notice", 5, 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_notice", 6, server, message, + sender->nickname ? sender->nickname : "[]", + sender->username ? userhost : NULL, + NULL, verified); + else + signal_emit("message silc private_notice", 5, server, message, + sender->nickname ? sender->nickname : "[]", + sender->username ? userhost : NULL, NULL); + } + else { + if (flags & SILC_MESSAGE_FLAG_UTF8 && !silc_term_utf8()) { + char tmp[256], *cp, *dm = NULL; - 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; + } - 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 signed_private", 5, server, cp, + sender->nickname ? sender->nickname : "[]", + sender->username ? userhost : NULL, verified); + else + signal_emit("message private", 4, server, cp, + sender->nickname ? sender->nickname : "[]", + sender->username ? userhost : NULL); + silc_free(dm); + return; + } - silc_utf8_decode(message, message_len, SILC_STRING_LANGUAGE, - cp, message_len); if (flags & SILC_MESSAGE_FLAG_SIGNED) - signal_emit("message signed_private", 5, server, cp, - sender->nickname ? sender->nickname : "[]", - sender->username ? userhost : NULL, verified); + signal_emit("message signed_private", 5, server, message, + sender->nickname ? sender->nickname : "[]", + sender->username ? userhost : NULL, verified); else - signal_emit("message private", 4, server, cp, - sender->nickname ? sender->nickname : "[]", - sender->username ? userhost : NULL); - silc_free(dm); - return; - } - - if (flags & SILC_MESSAGE_FLAG_SIGNED) - signal_emit("message signed_private", 5, server, message, - sender->nickname ? sender->nickname : "[]", - sender->username ? userhost : NULL, verified); - else - signal_emit("message private", 4, server, message, - sender->nickname ? sender->nickname : "[]", - sender->username ? userhost : NULL); + signal_emit("message private", 4, server, message, + sender->nickname ? sender->nickname : "[]", + sender->username ? userhost : NULL); + } } /* Notify message to the client. The notify arguments are sent in the diff --git a/apps/irssi/src/silc/core/silc-channels.c b/apps/irssi/src/silc/core/silc-channels.c index 6340283a..66b9e990 100644 --- a/apps/irssi/src/silc/core/silc-channels.c +++ b/apps/irssi/src/silc/core/silc-channels.c @@ -310,60 +310,79 @@ static void command_me(const char *data, SILC_SERVER_REC *server, static void command_notice(const char *data, SILC_SERVER_REC *server, WI_ITEM_REC *item) { - SILC_CHANNEL_REC *chanrec; - char *tmpcmd = "NOTICE", *tmp; - SilcUInt32 argc = 0; - unsigned char *message = NULL; - unsigned char **argv; - SilcUInt32 *argv_lens, *argv_types; - int i; - + 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 (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_OPTIONS | + PARAM_FLAG_GETREST, + "notice", &optlist, &target, &msg)) + return; - if (argc < 2) - cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); + if (*target == '\0' || *msg == '\0') + cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); - chanrec = silc_channel_find(server, item->visible_name); - if (chanrec == NULL) - cmd_return_error(CMDERR_CHAN_NOT_FOUND); + 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_NOTICE | - 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_NOTICES, SILCTXT_CHANNEL_OWNNOTICE, - server->conn->local_entry->nickname, argv[1]); - - for (i = 0; i < argc; i++) - silc_free(argv[i]); - silc_free(argv_lens); - silc_free(argv_types); + if (target != NULL) { + if (target_type == SEND_TARGET_CHANNEL) { + if (silc_send_channel(server, target, (message != NULL ? message : msg), + SILC_MESSAGE_FLAG_NOTICE | 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_notice", 3, server, msg, target); + else + signal_emit("message silc own_notice", 3, server, msg, target); + } + } else { + if (silc_send_msg(server, target, (message != NULL ? message : msg), + (message != NULL ? strlen(message) : strlen(msg)), + SILC_MESSAGE_FLAG_NOTICE | 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_notice", 3, + server, msg, target); + else + signal_emit("message silc own_private_notice", 3, + server, msg, target); + } + } + } + + cmd_params_free(free_arg); silc_free(message); } @@ -1208,6 +1227,7 @@ void silc_channels_init(void) command_set_options("listkeys", "clients servers"); command_set_options("action", "sign channel"); + command_set_options("notice", "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 444cda53..cc901cad 100644 --- a/apps/irssi/src/silc/core/silc-servers.c +++ b/apps/irssi/src/silc/core/silc-servers.c @@ -430,7 +430,7 @@ char *silc_server_get_channels(SILC_SERVER_REC *server) /* SYNTAX: AWAY [] */ /* SYNTAX: INFO [] */ /* SYNTAX: NICK */ -/* SYNTAX: NOTICE */ +/* SYNTAX: NOTICE [-sign] [-channel] */ /* SYNTAX: PART [] */ /* SYNTAX: PING */ /* SYNTAX: SCONNECT [] */