Mon Jan 03 23:26:38 CET 2004 Jochen Eisinger <jochen@penguin-breeder.org>
authorJochen Eisinger <coffee@silcnet.org>
Mon, 5 Jan 2004 22:31:39 +0000 (22:31 +0000)
committerJochen Eisinger <coffee@silcnet.org>
Mon, 5 Jan 2004 22:31:39 +0000 (22:31 +0000)
* 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
apps/irssi/default.theme
apps/irssi/docs/help/in/action.in
apps/irssi/src/fe-common/silc/fe-silc-messages.c
apps/irssi/src/fe-common/silc/fe-silc-queries.c
apps/irssi/src/fe-common/silc/module-formats.c
apps/irssi/src/fe-common/silc/module-formats.h
apps/irssi/src/silc/core/client_ops.c
apps/irssi/src/silc/core/silc-channels.c
apps/irssi/src/silc/core/silc-servers.c
apps/irssi/src/silc/core/silc-servers.h

diff --git a/CHANGES b/CHANGES
index 42e4d00d0f6a5b8bd88e0c9774301557a1518410..95706be013ade551c7c38776311cb785288cd177 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -3,6 +3,13 @@ Mon Jan 03 23:26:38 CET 2004  Jochen Eisinger <jochen@penguin-breeder.org>
        * 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
index 599b3494b8ab9699a1a0f8c36db44f835557a818..b29bb017e8c5fc8b5e49416ff321e46bd3938def 100644 (file)
@@ -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)
index 6f0b9f1b980a491a120883ddb00731a9132fcf09..c934442d8881b978ec9710bc47fbfdf46ad69cb2 100644 (file)
@@ -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 <target> as channel name
+      -sign: add signature
 
 See also: ME
index 155e6f449430dae168ebe682e9efe2fa9ece1cae..07cf4a01e91e52a01380dc25159b59d6fcd9634e 100644 (file)
@@ -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);
 }
index 4dee4d2788bd2c50eb6b3727a59a41e335497f88..405fd91a68fa8138ec4a223ad751c3c4bff5abeb 100644 (file)
 #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);
 }
index d492d3f6136974f7477a84b69a2de8e80a404b5a..aa1880c16c9aa523b3fc33be347d8cb585d1c2b7 100644 (file)
@@ -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 },
index 0d9277a00afbe8c8f1fe4a8ab99d9e9138a895c9..a983274518d5635eb574193af93d2e0aa918378d 100644 (file)
@@ -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,
 
index ba0201cc9311a687d01b358a41d00519cfbd6596..76262922344ac548b6efbff0a517299dc56a7977 100644 (file)
@@ -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 ? "[<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;
@@ -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 : "[<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;
 
index 9352f67ee93a023bcc51b4ece510c19fbd601555..6340283a8e7d39dfb843997357e1edf6d0ec215b 100644 (file)
@@ -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();
 }
index 4115204af48f7fbd79bf2b6151f6c1cb733a3069..444cda53325e53e554e1adc4ef24e872e807e8a4 100644 (file)
@@ -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 [<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> */
index bf3f3b7066722009fe2b0b6ff863c249083ed325..5e63c09bf9b3a6075c2972e67e33113bff4fed6c 100644 (file)
@@ -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