* 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 <jochen@penguin-breeder.org>
* Incorrectly reported error when client had to be resolved from
##
# 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)
@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 <target> as channel name
+ -sign: add signature
See also: ME
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,
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)
{
(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)
(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);
}
#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)
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);
}
{ "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 } },
{ "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 },
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,
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,
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;
}
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 ? "[<unknown>]" : 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 ? "[<unknown>]" : 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;
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 : "[<unknown>]",
+ sender->username ? userhost : NULL,
+ NULL, verified);
+ else
+ signal_emit("message silc private_action", 6, 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_action", 6, server, message,
+ sender->nickname ? sender->nickname : "[<unknown>]",
+ sender->username ? userhost : NULL,
+ NULL, verified);
+ else
+ signal_emit("message silc private_action", 6, server, message,
+ sender->nickname ? sender->nickname : "[<unknown>]",
+ sender->username ? userhost : NULL, NULL);
+ }
+ return;
+ }
+ /* FIXME: added notices */
+
if (flags & SILC_MESSAGE_FLAG_UTF8 && !silc_term_utf8()) {
char tmp[256], *cp, *dm = NULL;
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. */
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;
command_bind("listkeys", MODULE_NAME, (SIGNAL_FUNC) command_listkeys);
command_set_options("listkeys", "clients servers");
+ command_set_options("action", "sign channel");
silc_nicklist_init();
}
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;
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;
/* SYNTAX: MOTD [<server>] */
/* SYNTAX: LIST [<channel>] */
/* SYNTAX: ME <message> */
-/* SYNTAX: ACTION <channel> <message> */
+/* SYNTAX: ACTION [-sign] [-channel] <target> <message> */
/* SYNTAX: AWAY [<message>] */
/* SYNTAX: INFO [<server>] */
/* SYNTAX: NICK <nickname> */
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