Wed Dec 4 21:08:52 CET 2002 Jochen Eisinger <c0ffee@penguin-breeder.org>
authorJochen Eisinger <coffee@silcnet.org>
Wed, 4 Dec 2002 20:18:42 +0000 (20:18 +0000)
committerJochen Eisinger <coffee@silcnet.org>
Wed, 4 Dec 2002 20:18:42 +0000 (20:18 +0000)
* Display signature verification result in public and private
  messages using theme abstracts. See irssi/default.theme for
  examples on their usage. Affected files
  irssi/default.theme, irssi/src/fe-common/silc/fe-messages.h,
  irssi/src/fe-common/silc/module-formats.[ch],
  irssi/src/fe-common/silc/fe-common-silc.c,
  irssi/src/fe-common/silc/Makefile.am
  irssi/src/fe-common/core/fe-messages.[ch]

apps/irssi/default.theme
apps/irssi/src/fe-common/core/fe-messages.c
apps/irssi/src/fe-common/core/fe-messages.h
apps/irssi/src/fe-common/silc/Makefile.am
apps/irssi/src/fe-common/silc/fe-common-silc.c
apps/irssi/src/fe-common/silc/fe-messages.c [new file with mode: 0644]
apps/irssi/src/fe-common/silc/module-formats.c
apps/irssi/src/fe-common/silc/module-formats.h

index 121ca9459dc4538caa2cc2aea1f4b3d52d958286..4c97c6d9a30e9475f6babff8fe9c40d2686d4af1 100644 (file)
@@ -273,6 +273,63 @@ abstracts = {
   sb_act_hilight = "%M$*";
   # hilight with specified color, $0 = color, $1 = text
   sb_act_hilight_color = "$0$1-%n";
+
+  # signed messages
+  # the following formats fit the Irssi default theme:
+  # 
+  # flag_signed = "%GS%n";
+  # flag_unknown = "%Y?%n";
+  # flag_failed = "%RF%n";
+  # 
+  # pubmsghinick_signed = "{msgnick {flag_signed} $0$2-%n}";
+  # pubmsghinick_unknown = "{msgnick {flag_unknown} $0$2-%n}";
+  # pubmsghinick_failed = "{msgnick {flag_failed} $0$2-%n}";
+  # 
+  # pubmsgmenick_signed = "{msgnick {flag_signed} $1-}";
+  # pubmsgmenick_unknown = "{msgnick {flag_unknown} $1-}";
+  # pubmsgmenick_failed = "{msgnick {flag_failed} $1-}";
+  # 
+  # pubmsgnick_signed = "{msgnick {flag_signed} $1-}";
+  # pubmsgnick_unknown = "{msgnick {flag_unknown} $1-}";
+  # pubmsgnick_failed = "{msgnick {flag_failed} $1-}";
+  # 
+  # privmsg_signed = "{privmsg {flag_signed}$0 $1}";
+  # privmsg_unknown = "{privmsg {flag_unknown}$0 $1}";
+  # privmsg_failed = "{privmsg {flag_failed}$0 $1}";
+  # 
+  # privmsgnick_signed = "{msgnick {flag_signed} %R$*%n}";
+  # privmsgnick_unknown = "{msgnick {flag_unknown} %R$*%n}";
+  # privmsgnick_failed = "{msgnick {flag_failed} %R$*%n}";
+  # 
+  # ownmsgnick_signed = "{msgnick {flag_signed} $1-}";
+  # ownprivmsgnick_signed = "{msgnick {flag_signed} $*}";
+  #
+  flag_signed = "%GS%n";
+  flag_unknown = "%Y?%n";
+  flag_failed = "%RF%n";
+  
+  pubmsghinick_signed = "{msgnick {flag_signed} $0$2-%n}";
+  pubmsghinick_unknown = "{msgnick {flag_unknown} $0$2-%n}";
+  pubmsghinick_failed = "{msgnick {flag_failed} $0$2-%n}";
+  
+  pubmsgmenick_signed = "%g<{flag_signed}$1->%n %|";
+  pubmsgmenick_unknown = "%g<{flag_unknown}$1->%n %|";
+  pubmsgmenick_failed = "%g<{flag_failed}$1->%n %|";
+  
+  pubmsgnick_signed = "{msgnick {flag_signed} $1-}";
+  pubmsgnick_unknown = "{msgnick {flag_unknown} $1-}";
+  pubmsgnick_failed = "{msgnick {flag_failed} $1-}";
+  
+  privmsg_signed = "{privmsg {flag_signed}$0 $1}";
+  privmsg_unknown = "{privmsg {flag_unknown}$0 $1}";
+  privmsg_failed = "{privmsg {flag_failed}$0 $1}";
+  
+  privmsgnick_signed = "{privmsgnick {flag_signed}$0}";
+  privmsgnick_unknown = "{privmsgnick {flag_unknown}$0}";
+  privmsgnick_failed = "{privmsgnick {flag_failed}$0}";
+  
+  ownmsgnick_signed = "{msgnick {flag_signed} $1-}%g";
+  ownprivmsgnick_signed = "->*%c{flag_signed}%n* %g$1-";
 };
 
 #
index e210c2a2d156101e53adc30dee660797419e33f5..31bbbfad056125c3ccee7b1dd7844af09ecbd423 100644 (file)
@@ -39,7 +39,7 @@
 
 #define ishighalnum(c) ((unsigned char) (c) >= 128 || i_isalnum(c))
 
-static GHashTable *printnicks;
+GHashTable *printnicks;
 
 /* convert _underlined_ and *bold* words (and phrases) to use real
    underlining or bolding */
index afe7644df8bbf2a020795064722303d53d1cbab6..07ecef80824830c1dfc6d40bb5d53d7a60759139 100644 (file)
@@ -7,4 +7,6 @@ char *expand_emphasis(WI_ITEM_REC *item, const char *text);
 
 char *channel_get_nickmode(CHANNEL_REC *channel, const char *nick);
 
+extern GHashTable *printnicks;
+
 #endif
index 72abc05ef880c6de8aaf73f42bba61c0d8802e64..1a89f348df3e661239671ec37969380e6dc0e8cd 100644 (file)
@@ -27,7 +27,8 @@ libfe_common_silc_a_SOURCES = \
        fe-channels.c \
        fe-common-silc.c \
        module-formats.c \
-       silc-modules.c 
+       silc-modules.c \
+       fe-messages.c
 
 noinst_HEADERS = \
        module-formats.h \
index e1912d5c91b2d0272aa8d6e2fb017094ee8b2c04..51047a005396ddf52936115d787c034e88d34a7f 100644 (file)
@@ -30,18 +30,23 @@ void fe_silc_channels_deinit(void);
 void fe_silc_modules_init(void);
 void fe_silc_modules_deinit(void);
 
+void fe_silc_messages_init(void);
+void fe_silc_messages_deinit(void);
+
 void fe_silc_init(void)
 {
   theme_register(fecommon_silc_formats);
 
   fe_silc_channels_init();
   fe_silc_modules_init();
+  fe_silc_messages_init();
 
   module_register("silc", "fe");
 }
 
 void fe_silc_deinit(void)
 {
+  fe_silc_messages_deinit();
   fe_silc_modules_deinit();
   fe_silc_channels_deinit();
 
diff --git a/apps/irssi/src/fe-common/silc/fe-messages.c b/apps/irssi/src/fe-common/silc/fe-messages.c
new file mode 100644 (file)
index 0000000..41e0514
--- /dev/null
@@ -0,0 +1,248 @@
+/*
+
+  fe-messages.c
+
+  Author: Jochen Eisinger <c0ffee@penguin-breeder.org>
+
+  Copyright (C) 2002 Jochen Eisinger
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+  
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+*/
+
+#include "module.h"
+#include "modules.h"
+#include "signals.h"
+#include "themes.h"
+#include "levels.h"
+#include "misc.h"
+#include "special-vars.h"
+#include "settings.h"
+
+#include "servers.h"
+#include "channels.h"
+#include "nicklist.h"
+#include "ignore.h"
+
+#include "window-items.h"
+#include "fe-queries.h"
+#include "fe-messages.h"
+#include "hilight-text.h"
+#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_public(SERVER_REC * server, const char *msg,
+                                     const char *nick,
+                                     const char *address,
+                                     const char *target,
+                                     int verified)
+{
+  CHANNEL_REC *chanrec;
+  NICK_REC *nickrec = NULL; /* we cheat here a little to keep the limit of 
+                              6 parameters to a signal handler ... */
+  const char *nickmode, *printnick;
+  int for_me, print_channel, level;
+  char *color, *freemsg = NULL;
+
+  /* NOTE: this may return NULL if some channel is just closed with
+     /WINDOW CLOSE and server still sends the few last messages */
+  chanrec = channel_find(server, target);
+  if (nickrec == NULL && chanrec != NULL)
+    nickrec = nicklist_find(chanrec, nick);
+
+  for_me = !settings_get_bool("hilight_nick_matches") ? FALSE :
+      nick_match_msg(chanrec, msg, server->nick);
+  color = for_me ? NULL :
+      hilight_match_nick(server, target, nick, address, MSGLEVEL_PUBLIC,
+                        msg);
+
+  print_channel = chanrec == NULL ||
+      !window_item_is_active((WI_ITEM_REC *) chanrec);
+  if (!print_channel && settings_get_bool("print_active_channel") &&
+      window_item_window((WI_ITEM_REC *) chanrec)->items->next != NULL)
+    print_channel = TRUE;
+
+  level = MSGLEVEL_PUBLIC;
+  if (for_me || color != NULL)
+    level |= MSGLEVEL_HILIGHT;
+
+  if (settings_get_bool("emphasis"))
+    msg = freemsg = expand_emphasis((WI_ITEM_REC *) chanrec, msg);
+
+  /* get nick mode & nick what to print the msg with
+     (in case there's multiple identical nicks) */
+  nickmode = channel_get_nickmode(chanrec, nick);
+  printnick = nickrec == NULL ? nick :
+      g_hash_table_lookup(printnicks, nickrec);
+  if (printnick == NULL)
+    printnick = nick;
+
+  if (!print_channel) {
+    /* message to active channel in window */
+    if (color != NULL) {
+      /* highlighted nick */
+      printformat_module("fe-common/silc", server, target,
+                        level, VERIFIED_MSG(verified, SILCTXT_PUBMSG_HILIGHT),
+                        color, printnick, msg, nickmode);
+    } else {
+      printformat_module("fe-common/silc", server, target, level,
+                        for_me ? VERIFIED_MSG(verified, SILCTXT_PUBMSG_ME) :
+                                 VERIFIED_MSG(verified,SILCTXT_PUBMSG),
+                        printnick, msg, nickmode);
+    }
+  } else {
+    /* message to not existing/active channel */
+    if (color != NULL) {
+      /* highlighted nick */
+      printformat_module("fe-common/silc", server, target, level,
+                        VERIFIED_MSG(verified, SILCTXT_PUBMSG_HILIGHT_CHANNEL),
+                        color, printnick, target, msg, nickmode);
+    } else {
+      printformat_module("fe-common/silc", server, target, level,
+                        for_me ? VERIFIED_MSG(verified, SILCTXT_PUBMSG_ME_CHANNEL) :
+                        VERIFIED_MSG(verified, SILCTXT_PUBMSG_CHANNEL),
+                        printnick, target, msg, nickmode);
+    }
+  }
+
+  g_free_not_null(freemsg);
+  g_free_not_null(color);
+}
+
+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_public(SERVER_REC * server,
+                                         const char *msg,
+                                         const char *target)
+{
+  WINDOW_REC *window;
+  CHANNEL_REC *channel;
+  const char *nickmode;
+  char *freemsg = NULL;
+  int print_channel;
+
+  channel = channel_find(server, target);
+  if (channel != NULL)
+    target = channel->visible_name;
+
+  nickmode = channel_get_nickmode(channel, server->nick);
+
+  window = channel == NULL ? NULL :
+      window_item_window((WI_ITEM_REC *) channel);
+
+  print_channel = window == NULL ||
+      window->active != (WI_ITEM_REC *) channel;
+
+  if (!print_channel && settings_get_bool("print_active_channel") &&
+      window != NULL && g_slist_length(window->items) > 1)
+    print_channel = TRUE;
+
+  if (settings_get_bool("emphasis"))
+    msg = freemsg = expand_emphasis((WI_ITEM_REC *) channel, msg);
+
+  if (!print_channel) {
+    printformat_module("fe-common/silc", server, target,
+                      MSGLEVEL_PUBLIC | MSGLEVEL_NOHILIGHT |
+                      MSGLEVEL_NO_ACT, SILCTXT_OWN_MSG_SIGNED, server->nick, msg,
+                      nickmode);
+  } else {
+    printformat_module("fe-common/silc", server, target,
+                      MSGLEVEL_PUBLIC | MSGLEVEL_NOHILIGHT |
+                      MSGLEVEL_NO_ACT, SILCTXT_OWN_MSG_CHANNEL_SIGNED,
+                      server->nick, target, msg, nickmode);
+  }
+
+  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);
+}
+
+void fe_silc_messages_init(void)
+{
+  signal_add_last("message signed_public",
+                 (SIGNAL_FUNC) sig_signed_message_public);
+  signal_add_last("message signed_private",
+                 (SIGNAL_FUNC) sig_signed_message_private);
+  signal_add_last("message signed_own_public",
+                 (SIGNAL_FUNC) sig_signed_message_own_public);
+  signal_add_last("message signed_own_private",
+                 (SIGNAL_FUNC) sig_signed_message_own_private);
+}
+
+void fe_silc_messages_deinit(void)
+{
+  signal_remove("message signed_public",
+               (SIGNAL_FUNC) sig_signed_message_public);
+  signal_remove("message signed_private",
+               (SIGNAL_FUNC) sig_signed_message_private);
+  signal_remove("message signed_own_public",
+               (SIGNAL_FUNC) sig_signed_message_own_public);
+  signal_remove("message signed_own_private",
+               (SIGNAL_FUNC) sig_signed_message_own_private);
+}
index 050f4e6c3328008c7653f5af291860f217de6a6d..09440ca5c9c5c4606944c3566f705fe22c73785f 100644 (file)
@@ -50,6 +50,36 @@ FORMAT_REC fecommon_silc_formats[] = {
        { "killed", "{nick $0} has been killed from the SILC Network by {nick $1} ($2)", 3, { 0, 0, 0 } },
        { "quieted", "You have been queited and cannot talk on {channel $0}", 1, { 0 } },
        { "appears", "{channick $0} now appears as {channick_hilight $1}", 4, { 0, 0, 0, 0 } },
+       { "pubmsg_hilight_signed", "{pubmsghinick_signed $0 $3 $1}$2", 4, { 0, 0, 0, 0 } },
+       { "pubmsg_hilight_unknown", "{pubmsghinick_unknown $0 $3 $1}$2", 4, { 0, 0, 0, 0 } },
+       { "pubmsg_hilight_failed", "{pubmsghinick_failed $0 $3 $1}$2", 4, { 0, 0, 0, 0 } },
+       { "pubmsg_me_signed", "{pubmsgmenick_signed $2 {menick $0}}$1", 3, { 0, 0, 0 } },
+       { "pubmsg_me_unknown", "{pubmsgmenick_unknown $2 {menick $0}}$1", 3, { 0, 0, 0 } },
+       { "pubmsg_me_failed", "{pubmsgmenick_failed $2 {menick $0}}$1", 3, { 0, 0, 0 } },
+       { "pubmsg_signed", "{pubmsgnick_signed $2 {pubnick $0}}$1", 3, { 0, 0, 0 } },
+       { "pubmsg_unknown", "{pubmsgnick_unknown $2 {pubnick $0}}$1", 3, { 0, 0, 0 } },
+       { "pubmsg_failed", "{pubmsgnick_failed $2 {pubnick $0}}$1", 3, { 0, 0, 0 } },
+       { "pubmsg_hilight_channel_signed", "{pubmsghinick_signed $0 $4 $1{msgchannel $2}}$3", 5, { 0, 0, 0, 0, 0 } },
+       { "pubmsg_hilight_channel_unknown", "{pubmsghinick_unknown $0 $4 $1{msgchannel $2}}$3", 5, { 0, 0, 0, 0, 0 } },
+       { "pubmsg_hilight_channel_failed", "{pubmsghinick_failed $0 $4 $1{msgchannel $2}}$3", 5, { 0, 0, 0, 0, 0 } },
+       { "pubmsg_me_channel_signed", "{pubmsgmenick_signed $3 {menick $0}{msgchannel $1}}$2", 4, { 0, 0, 0, 0 } },
+       { "pubmsg_me_channel_unknown", "{pubmsgmenick_unknown $3 {menick $0}{msgchannel $1}}$2", 4, { 0, 0, 0, 0 } },
+       { "pubmsg_me_channel_failed", "{pubmsgmenick_failed $3 {menick $0}{msgchannel $1}}$2", 4, { 0, 0, 0, 0 } },
+       { "pubmsg_channel_signed", "{pubmsgnick_signed $3 {pubnick $0}{msgchannel $1}}$2", 4, { 0, 0, 0, 0 } },
+       { "pubmsg_channel_unknown", "{pubmsgnick_unknown $3 {pubnick $0}{msgchannel $1}}$2", 4, { 0, 0, 0, 0 } },
+       { "pubmsg_channel_failed", "{pubmsgnick_failed $3 {pubnick $0}{msgchannel $1}}$2", 4, { 0, 0, 0, 0 } },
+       { "msg_private_signed", "{privmsg_signed $0 $1}$2", 3, { 0, 0, 0 } },
+       { "msg_private_unknown", "{privmsg_unknown $0 $1}$2", 3, { 0, 0, 0 } },
+       { "msg_private_failed", "{privmsg_failed $0 $1}$2", 3, { 0, 0, 0 } },
+       { "msg_private_query_signed", "{privmsgnick_signed $0}$2", 3, { 0, 0, 0 } },
+       { "msg_private_query_unknown", "{privmsgnick_unknown $0}$2", 3, { 0, 0, 0 } },
+       { "msg_private_query_failed", "{privmsgnick_failed $0}$2", 3, { 0, 0, 0 } },
+       { "own_msg_signed", "{ownmsgnick_signed $2 {ownnick $0}}$1", 3, { 0, 0, 0 } },
+       { "own_msg_channel_signed", "{ownmsgnick_signed $3 {ownnick $0}{msgchannel $1}}$2", 4, { 0, 0, 0, 0 } },
+       { "no_msgs_got", "You have not received a message from anyone yet", 0 },
+       { "no_msgs_sent", "You have not sent a message to anyone yet", 0 },
+       { "own_msg_private_signed", "{ownprivmsg_signed msg $0}$1", 2, { 0, 0 } },
+       { "own_msg_private_query_signed", "{ownprivmsgnick_signed {ownprivnick $2}}$1", 3, { 0, 0, 0 } },
 
        /* WHOIS, WHOWAS and USERS (alias WHO) messages */
        { NULL, "Who Queries", 0 },
index 27c92de0ea31c77028cc75fb4facb1f3ce425248..7df09206b9ec5be9a67ed4a584c2eb715e912e71 100644 (file)
@@ -47,6 +47,36 @@ enum {
   SILCTXT_CHANNEL_KILLED,
   SILCTXT_CHANNEL_QUIETED,
   SILCTXT_CHANNEL_APPEARS,
+  SILCTXT_PUBMSG_HILIGHT_SIGNED,
+  SILCTXT_PUBMSG_HILIGHT_UNKNOWN,
+  SILCTXT_PUBMSG_HILIGHT_FAILED,
+  SILCTXT_PUBMSG_ME_SIGNED,
+  SILCTXT_PUBMSG_ME_UNKNOWN,
+  SILCTXT_PUBMSG_ME_FAILED,
+  SILCTXT_PUBMSG_SIGNED,
+  SILCTXT_PUBMSG_UNKNOWN,
+  SILCTXT_PUBMSG_FAILED,
+  SILCTXT_PUBMSG_HILIGHT_CHANNEL_SIGNED,
+  SILCTXT_PUBMSG_HILIGHT_CHANNEL_UNKNOWN,
+  SILCTXT_PUBMSG_HILIGHT_CHANNEL_FAILED,
+  SILCTXT_PUBMSG_ME_CHANNEL_SIGNED,
+  SILCTXT_PUBMSG_ME_CHANNEL_UNKNOWN,
+  SILCTXT_PUBMSG_ME_CHANNEL_FAILED,
+  SILCTXT_PUBMSG_CHANNEL_SIGNED,
+  SILCTXT_PUBMSG_CHANNEL_UNKNOWN,
+  SILCTXT_PUBMSG_CHANNEL_FAILED,
+  SILCTXT_MSG_PRIVATE_SIGNED,
+  SILCTXT_MSG_PRIVATE_UNKNOWN,
+  SILCTXT_MSG_PRIVATE_FAILED,
+  SILCTXT_MSG_PRIVATE_QUERY_SIGNED,
+  SILCTXT_MSG_PRIVATE_QUERY_UNKNOWN,
+  SILCTXT_MSG_PRIVATE_QUERY_FAILED,
+  SILCTXT_OWN_MSG_SIGNED,
+  SILCTXT_OWN_MSG_CHANNEL_SIGNED,
+  SILCTXT_NO_MSGS_GOT,
+  SILCTXT_NO_MSGS_SENT,
+  SILCTXT_OWN_MSG_PRIVATE_SIGNED,
+  SILCTXT_OWN_MSG_PRIVATE_QUERY_SIGNED,
 
   SILCTXT_FILL_2,