+Tue Jan 04 02:43:44 CET 2004 Jochen Eisinger <jochen@penguin-breeder.org>
+
+ * 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 <jochen@penguin-breeder.org>
* Fixed typo in perl module. Affected file
##
# Generic notice
- notice = "%C- $0 $1-";
-
- # Own sent notice
- ownnotice = "%g- $0 $1-";
+ ownnotice = "%g- $1 -%n ";
+ notice = "%C- $* -%n ";
+ pubnotice_channel = "";
+ pvtnotice_host = "";
##
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 <target> as channel name
+ -sign: add signature
See also: ACTION
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",
(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)
(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);
}
{ "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 } },
{ "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 },
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,
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,
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;
}
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 ? "[<unknown>]" : 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 ? "[<unknown>]" : 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()) {
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));
sender->nickname ? sender->nickname : "[<unknown>]",
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 : "[<unknown>]",
+ sender->username ? userhost : NULL,
+ NULL, verified);
+ else
+ signal_emit("message silc private_notice", 5, server, cp,
+ sender->nickname ? sender->nickname : "[<unknown>]",
+ 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 : "[<unknown>]",
+ sender->username ? userhost : NULL,
+ NULL, verified);
+ else
+ signal_emit("message silc private_notice", 5, server, message,
+ sender->nickname ? sender->nickname : "[<unknown>]",
+ 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 : "[<unknown>]",
+ sender->username ? userhost : NULL, verified);
+ else
+ signal_emit("message private", 4, server, cp,
+ sender->nickname ? sender->nickname : "[<unknown>]",
+ 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 : "[<unknown>]",
- sender->username ? userhost : NULL, verified);
+ signal_emit("message signed_private", 5, server, message,
+ sender->nickname ? sender->nickname : "[<unknown>]",
+ sender->username ? userhost : NULL, verified);
else
- signal_emit("message private", 4, server, cp,
- sender->nickname ? sender->nickname : "[<unknown>]",
- 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 : "[<unknown>]",
- sender->username ? userhost : NULL, verified);
- else
- signal_emit("message private", 4, server, message,
- sender->nickname ? sender->nickname : "[<unknown>]",
- sender->username ? userhost : NULL);
+ signal_emit("message private", 4, server, message,
+ sender->nickname ? sender->nickname : "[<unknown>]",
+ sender->username ? userhost : NULL);
+ }
}
/* Notify message to the client. The notify arguments are sent in the
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);
}
command_set_options("listkeys", "clients servers");
command_set_options("action", "sign channel");
+ command_set_options("notice", "sign channel");
silc_nicklist_init();
}
/* SYNTAX: AWAY [<message>] */
/* SYNTAX: INFO [<server>] */
/* SYNTAX: NICK <nickname> */
-/* SYNTAX: NOTICE <message> */
+/* SYNTAX: NOTICE [-sign] [-channel] <target> <message> */
/* SYNTAX: PART [<channel>] */
/* SYNTAX: PING */
/* SYNTAX: SCONNECT <server> [<port>] */