summaryrefslogtreecommitdiff
path: root/chat
diff options
context:
space:
mode:
authorsketch <sketch>2010-08-10 20:26:36 +0000
committersketch <sketch>2010-08-10 20:26:36 +0000
commit76eeb838571e6e69ae1535a6430520fb87af3d76 (patch)
treee63c80a9b553c7da6b095fb5e7d096be42df8743 /chat
parent40909b170cd95699c4d0a44d9e3e14c437c0287c (diff)
downloadpkgsrc-76eeb838571e6e69ae1535a6430520fb87af3d76.tar.gz
Add another bunch of patches, including:
- implement commands via irssi signals - detect /topic on join - support /names, including on join - build correctly as .so on OSX
Diffstat (limited to 'chat')
-rw-r--r--chat/irssi-icb/Makefile4
-rw-r--r--chat/irssi-icb/distinfo15
-rw-r--r--chat/irssi-icb/patches/patch-aa25
-rw-r--r--chat/irssi-icb/patches/patch-ab458
-rw-r--r--chat/irssi-icb/patches/patch-af84
-rw-r--r--chat/irssi-icb/patches/patch-ag20
-rw-r--r--chat/irssi-icb/patches/patch-ai13
-rw-r--r--chat/irssi-icb/patches/patch-aj41
-rw-r--r--chat/irssi-icb/patches/patch-al14
-rw-r--r--chat/irssi-icb/patches/patch-am49
-rw-r--r--chat/irssi-icb/patches/patch-an38
11 files changed, 650 insertions, 111 deletions
diff --git a/chat/irssi-icb/Makefile b/chat/irssi-icb/Makefile
index f13b3151258..04cc317ab69 100644
--- a/chat/irssi-icb/Makefile
+++ b/chat/irssi-icb/Makefile
@@ -1,8 +1,8 @@
-# $NetBSD: Makefile,v 1.30 2010/05/18 21:38:49 sketch Exp $
+# $NetBSD: Makefile,v 1.31 2010/08/10 20:26:36 sketch Exp $
#
DISTNAME= irssi-icb-0.14
-PKGREVISION= 17
+PKGREVISION= 18
CATEGORIES= chat
MASTER_SITES= http://www.irssi.org/files/plugins/icb/
DISTFILES= ${DISTNAME}.tar.gz ${IRSSI_DISTFILE}
diff --git a/chat/irssi-icb/distinfo b/chat/irssi-icb/distinfo
index 633eb8eab80..a0d50391722 100644
--- a/chat/irssi-icb/distinfo
+++ b/chat/irssi-icb/distinfo
@@ -1,4 +1,4 @@
-$NetBSD: distinfo,v 1.17 2010/05/18 21:38:49 sketch Exp $
+$NetBSD: distinfo,v 1.18 2010/08/10 20:26:36 sketch Exp $
SHA1 (irssi-0.8.15.tar.bz2) = b79ce8c2c98a76b004f63706e7868cd363000d89
RMD160 (irssi-0.8.15.tar.bz2) = 0c8fba8cf3409621f6c1883127e14538a58c3359
@@ -6,11 +6,16 @@ Size (irssi-0.8.15.tar.bz2) = 948847 bytes
SHA1 (irssi-icb-0.14.tar.gz) = 31d7a5d04a896e0e19db44b4d76b7ac85af1a5d4
RMD160 (irssi-icb-0.14.tar.gz) = dd104925ece6eabd0112b86b9eb6898846ba8f52
Size (irssi-icb-0.14.tar.gz) = 172647 bytes
-SHA1 (patch-aa) = 8249c9ae3e5ae8b6110db030ee4280aa53ca1192
-SHA1 (patch-ab) = 768826fbd30ed66fff6ce45b7ca492b69c0c7437
+SHA1 (patch-aa) = b94bae58a59f4d96a107ad123a6abe7ac0ca375a
+SHA1 (patch-ab) = 6ca4512785b91e7a05cccd8806dbcab969e91cca
SHA1 (patch-ac) = 68409b392f3212a8da9a79c2dfcc4dc265504d98
SHA1 (patch-ad) = f5cf3b9294a1a8a450f8c380ff41bbaafd425337
SHA1 (patch-ae) = ee3ed714e2f1d136562b87cfd82bc4b58b7d80df
-SHA1 (patch-af) = 8f68dadd44acd870b3e84fd561edbd5958305ef3
-SHA1 (patch-ag) = 4b0df5a1f59397455963888fbda1a57d56f90757
+SHA1 (patch-af) = 169f32783892241133df73b25817c562531c69c9
+SHA1 (patch-ag) = 2823b763c76c37e4f382cc09456cccb56f1007fc
SHA1 (patch-ah) = 097bab1ebd959372a0266fa5d9a99c78c3a2c1fe
+SHA1 (patch-ai) = 42ce6c309957c3e46c638e2599b932b6ea4065ee
+SHA1 (patch-aj) = 3a46a61b0bd5763f78e85d6a0bff1d1223e8da39
+SHA1 (patch-al) = 2a190b803f00beb83c123bc3416e23ec7c7edc69
+SHA1 (patch-am) = 832aa40a84afbfff303e6080bf420ca2ceec289f
+SHA1 (patch-an) = 0a936cbdb49f9a1bf65d5e92da5d37de65238d27
diff --git a/chat/irssi-icb/patches/patch-aa b/chat/irssi-icb/patches/patch-aa
index 92378b8d7c0..7f6831a56d5 100644
--- a/chat/irssi-icb/patches/patch-aa
+++ b/chat/irssi-icb/patches/patch-aa
@@ -1,14 +1,13 @@
-$NetBSD: patch-aa,v 1.1 2003/12/04 10:48:09 veego Exp $
+$NetBSD: patch-aa,v 1.2 2010/08/10 20:26:36 sketch Exp $
---- src/fe-common/Makefile.in.orig 2002-11-24 14:18:08.000000000 +0100
-+++ src/fe-common/Makefile.in 2003-11-27 11:59:57.000000000 +0100
-@@ -103,7 +103,8 @@
- CPPFLAGS = @CPPFLAGS@
- LDFLAGS = @LDFLAGS@
- LIBS = @LIBS@
--libfe_icb_la_LIBADD =
-+libfe_icb_la_LIBADD = $(top_srcdir)/src/core/libicb_core.la
-+libfe_icb_la_DEPENDENCIES = $(top_srcdir)/src/core/libicb_core.la
- libfe_icb_la_OBJECTS = fe-icb.lo module-formats.lo
- CFLAGS = @CFLAGS@
- COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+--- src/fe-common/Makefile.in.orig 2002-11-24 13:18:08.000000000 +0000
++++ src/fe-common/Makefile.in 2010-08-10 20:57:17.000000000 +0100
+@@ -83,7 +83,7 @@
+ moduledir = $(libdir)/irssi/modules
+
+ module_LTLIBRARIES = libfe_icb.la
+-libfe_icb_la_LDFLAGS = -avoid-version
++libfe_icb_la_LDFLAGS = -module -avoid-version
+
+ INCLUDES = $(GLIB_CFLAGS) -I$(IRSSI_INCLUDE) -I$(IRSSI_INCLUDE)/src -I$(IRSSI_INCLUDE)/src/core -I$(IRSSI_INCLUDE)/src/fe-common/core -I$(top_srcdir)/src/core
+
diff --git a/chat/irssi-icb/patches/patch-ab b/chat/irssi-icb/patches/patch-ab
index f066757e5b6..31557aceede 100644
--- a/chat/irssi-icb/patches/patch-ab
+++ b/chat/irssi-icb/patches/patch-ab
@@ -1,8 +1,8 @@
-$NetBSD: patch-ab,v 1.2 2010/05/17 20:13:25 sketch Exp $
+$NetBSD: patch-ab,v 1.3 2010/08/10 20:26:36 sketch Exp $
---- src/fe-common/fe-icb.c.orig 2002-04-27 21:56:18.000000000 +0100
-+++ src/fe-common/fe-icb.c 2010-05-17 20:52:23.000000000 +0100
-@@ -18,12 +18,15 @@
+--- src/fe-common/fe-icb.c (revision 5174)
++++ src/fe-common/fe-icb.c (working copy)
+@@ -18,33 +18,73 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
@@ -18,19 +18,29 @@ $NetBSD: patch-ab,v 1.2 2010/05/17 20:13:25 sketch Exp $
#include "icb.h"
#include "icb-servers.h"
-@@ -33,16 +36,84 @@
+ #include "icb-channels.h"
++#include "icb-nicklist.h"
+ #include "icb-protocol.h"
+
#include "printtext.h"
#include "themes.h"
-+static void icb_channel_change_topic(ICB_SERVER_REC *server,
-+ const char *topic, const char *setby,
-+ time_t settime)
-+{
+-static void event_status(ICB_SERVER_REC *server, const char *data)
++static void icb_change_topic(ICB_SERVER_REC *server, const char *topic,
++ const char *setby, time_t settime)
+ {
+- char **args;
+ if (topic != NULL) {
+ g_free_not_null(server->group->topic);
+ server->group->topic = g_strdup(topic);
+ }
-+
+
+- /* FIXME: status messages should probably divided into their own
+- signals so irssi could track joins, parts, etc. */
+- args = icb_split(data, 2);
+- printformat(server, server->group->name, MSGLEVEL_CRAP,
+- ICBTXT_STATUS, args[0], args[1]);
+- icb_split_free(args);
+ if (setby != NULL) {
+ g_free_not_null(server->group->topic_by);
+ server->group->topic_by = g_strdup(setby);
@@ -39,72 +49,42 @@ $NetBSD: patch-ab,v 1.2 2010/05/17 20:13:25 sketch Exp $
+ server->group->topic_time = settime;
+
+ signal_emit("channel topic changed", 1, server->group);
-+}
-+
- static void event_status(ICB_SERVER_REC *server, const char *data)
- {
- char **args;
-+ int len;
-+ char *oldnick, *newnick;
-+ char *topic, *setby, *p1, *p2;
-
- /* FIXME: status messages should probably divided into their own
- signals so irssi could track joins, parts, etc. */
- args = icb_split(data, 2);
- printformat(server, server->group->name, MSGLEVEL_CRAP,
- ICBTXT_STATUS, args[0], args[1]);
-- icb_split_free(args);
-+
-+ len = strlen("Name");
-+ if (strncmp(args[0],"Name",len) == 0) {
-+ oldnick = g_strdup(args[1]);
-+ p2 = strchr(oldnick, ' ');
-+ if (p2 != NULL) {
-+ *p2 = '\0';
-+ /* make sure it's me changing the nick */
-+ if (strcmp(oldnick, server->connrec->nick) == 0) {
-+ newnick = strrchr(args[1], ' ');
-+ if (newnick != NULL) {
-+ newnick++; /* skip the space */
-+ server_change_nick(SERVER(server), newnick);
-+ nicklist_rename(SERVER(server), server->connrec->nick, newnick);
-+ g_free(server->connrec->nick);
-+ server->connrec->nick = g_strdup(newnick);
-+ }
-+ }
-+ }
-+ g_free(oldnick);
-+ }
-+
-+ /* sample topic msg: nick changed the topic to \"test 1\" */
-+ len = strlen("Topic");
-+ if (strncmp(args[0],"Topic",len) == 0) {
-+ p1 = strchr(args[1], '"');
-+ p2 = strrchr(args[1], '"');
-+
-+ /* make sure there's something between those quotes */
-+ if (p1) {
-+ p1++;
-+ topic = g_strdup(p1);
-+ p2 = strrchr(topic, '"');
-+ *p2 = '\0';
-+
-+ setby = g_strdup(args[1]);
-+ p2 = strchr(setby, ' ');
-+ *p2 = '\0';
-+
-+ icb_channel_change_topic(server, topic, setby, time(NULL));
-+
-+ g_free(topic);
-+ g_free(setby);
-+ }
-+ }
-+
-+ icb_split_free(args);
}
++/*
++ * ICB makes it hard to keep track of nicks:
++ *
++ * - moderators can come and go, and even return with a different nick, while
++ * still retaining their moderator status
++ *
++ * - group moderator can change at any time, if the moderator is off-group
++ * while changing nick
++ *
++ * - users can be moderator of multiple groups simultaneously, but can only
++ * be in one group at a time
++ *
++ * So for now we don't bother to track the moderator, just the group nicks
++ */
++static void icb_update_nicklist(ICB_SERVER_REC *server)
++{
++ /*
++ * In theory we should be able to just send '/who <group>' and parse,
++ * but the problem is that ICB does not send any kind of end-of-who
++ * marker when only listing one group, and sending a separate command
++ * isn't guaranteed to come back in the right order.
++ *
++ * So we're forced do perform a full /who and then match against our
++ * groupname. A full /who is terminated with a 'Total: ' line which we
++ * can use as EOF>
++ */
++ server->silentwho = TRUE;
++ icb_command(server, "w", "", NULL);
++}
++
static void event_error(ICB_SERVER_REC *server, const char *data)
-@@ -84,12 +155,67 @@
+ {
+ printformat(server, NULL, MSGLEVEL_CRAP, ICBTXT_ERROR, data);
+@@ -84,15 +124,351 @@
icb_split_free(args);
}
@@ -131,6 +111,77 @@ $NetBSD: patch-ab,v 1.2 2010/05/17 20:13:25 sketch Exp $
+ snprintf(buf, bufsize, " %2ds", (int)idle);
+}
+
++static void cmdout_co(ICB_SERVER_REC *server, char **args)
++{
++ char *p, *group, *topic;
++ int len;
++
++ static const char match_group[] = "Group: ";
++ static const char match_topic[] = "Topic: ";
++ static const char match_topicunset[] = "(None)";
++ static const char match_topicis[] = "The topic is";
++ static const char match_total[] = "Total: ";
++
++ /*
++ * Use 'co' as the marker to denote wl lines have finished, so
++ * reset the nick updates
++ */
++ server->updatenicks = FALSE;
++
++ /* If we're running in silent mode, parse the output for nicks/topic */
++ if (server->silentwho) {
++
++ /* Match group lines */
++ len = strlen(match_group);
++ if (strncmp(args[0], match_group, len) == 0) {
++
++ group = g_strdup(args[0] + len);
++ p = strchr(group, ' ');
++ *p = '\0';
++
++ /* Check for our particular group */
++ len = strlen(group);
++ if (g_ascii_strncasecmp(group, server->group->name, len) == 0) {
++
++ /* Start matching nicks */
++ server->updatenicks = TRUE;
++
++ p = strstr(args[0], match_topic);
++ if (p != NULL && p != args[0]) {
++ topic = p + strlen(match_topic);
++ if (topic != NULL) {
++ len = strlen(match_topicunset);
++ if (strncmp(topic,
++ match_topicunset,
++ len) != 0) {
++
++ /* No way to find who set the topic, mark as unknown */
++ icb_change_topic(server, topic, "unknown", time(NULL));
++ }
++ }
++ }
++ }
++ g_free(group);
++ }
++
++ /*
++ * End of /who output, stop silent mode and signal front-end
++ * to display /names list
++ */
++ len = strlen(match_total);
++ if (strncmp(args[0], match_total, len) == 0) {
++ server->silentwho = FALSE;
++ signal_emit("channel joined", 1, server->group);
++ }
++ } else {
++ /* Now that /topic works correctly, ignore server output */
++ len = strlen(match_topicis);
++ if (strncmp(args[0], match_topicis, len) != 0) {
++ printtext(server, NULL, MSGLEVEL_CRAP, "%s", args[0]);
++ }
++ }
++}
++
+static void cmdout_wl(ICB_SERVER_REC *server, char **args)
+{
+ struct tm *logintime;
@@ -138,6 +189,7 @@ $NetBSD: patch-ab,v 1.2 2010/05/17 20:13:25 sketch Exp $
+ char idlebuf[20];
+ char line[255];
+ time_t temptime;
++ int op;
+
+ /* "wl" : In a who listing, a line of output listing a user. Has the following format:
+
@@ -157,10 +209,25 @@ $NetBSD: patch-ab,v 1.2 2010/05/17 20:13:25 sketch Exp $
+ temptime = strtol(args[2], NULL, 10);
+ idle_time(idlebuf, sizeof(idlebuf), temptime);
+
-+ snprintf(line, sizeof(line), "*** %c%-14.14s %6.6s %12.12s %s@%s %s",
-+ args[0][0] == ' '?' ':'*', args[1], idlebuf, logbuf, args[5],
-+ args[6], args[7]);
-+ printtext(server, NULL, MSGLEVEL_CRAP, line);
++ /* Update nicklist */
++ if (server->updatenicks) {
++ op = FALSE;
++#ifdef NO_MOD_SUPPORT_YET
++ switch(args[0][0]) {
++ case '*':
++ case 'm':
++ op = TRUE;
++ break;
++ }
++#endif
++ icb_nicklist_insert(server->group, args[1], op);
++ }
++ if (!server->silentwho) {
++ snprintf(line, sizeof(line), "*** %c%-14.14s %6.6s %12.12s %s@%s %s",
++ args[0][0] == ' '?' ':'*', args[1], idlebuf, logbuf, args[5],
++ args[6], args[7]);
++ printtext(server, NULL, MSGLEVEL_CRAP, line);
++ }
+}
+
static void cmdout_default(ICB_SERVER_REC *server, char **args)
@@ -169,23 +236,254 @@ $NetBSD: patch-ab,v 1.2 2010/05/17 20:13:25 sketch Exp $
data = g_strjoinv(" ", args+1);
- printtext(server, server->group->name, MSGLEVEL_CRAP, "%s", data);
-+ printtext(server, NULL, MSGLEVEL_CRAP, "%s", data);
++ if (!server->silentwho) {
++ printtext(server, NULL, MSGLEVEL_CRAP, "%s", data);
++ }
g_free(data);
}
-@@ -115,6 +241,7 @@
++/*
++ * args0 = "Arrive"
++ * args0 = "<nickname> (<user>@<host>) entered group"
++ */
++static void status_arrive(ICB_SERVER_REC *server, char **args)
++{
++ char *nick, *p;
++
++ nick = g_strdup(args[1]);
++ p = strchr(nick, ' ');
++ *p = '\0';
++ /* XXX: new arrivals can still be moderator */
++ icb_nicklist_insert(server->group, nick, FALSE);
++ g_free(nick);
++
++ printformat(server, server->group->name, MSGLEVEL_CRAP,
++ ICBTXT_STATUS, args[0], args[1]);
++}
++
++/*
++ * args0 = "Depart"
++ * args1 = "<nickname> (<user>@<host>) just left"
++ */
++static void status_depart(ICB_SERVER_REC *server, char **args)
++{
++ NICK_REC *nickrec;
++ char *nick, *p;
++
++ nick = g_strdup(args[1]);
++ p = strchr(nick, ' ');
++ *p = '\0';
++
++ nickrec = nicklist_find(CHANNEL(server->group), nick);
++ if (nickrec != NULL) {
++ nicklist_remove(CHANNEL(server->group), nickrec);
++ }
++ g_free(nick);
++
++ printformat(server, server->group->name, MSGLEVEL_CRAP,
++ ICBTXT_STATUS, args[0], args[1]);
++}
++
++/*
++ * args0 = "Sign-on"
++ * args1 = "<nickname> (<user>@<host>) entered group"
++ */
++static void status_signon(ICB_SERVER_REC *server, char **args)
++{
++ char *nick, *p;
++
++ nick = g_strdup(args[1]);
++ p = strchr(nick, ' ');
++ *p = '\0';
++
++ icb_nicklist_insert(server->group, nick, FALSE);
++
++ g_free(nick);
++
++ printformat(server, server->group->name, MSGLEVEL_CRAP,
++ ICBTXT_STATUS, args[0], args[1]);
++}
++
++/*
++ * args0 = "Sign-off"
++ * args1 = "<nickname> (<user>@<host>) has signed off."
++ */
++static void status_signoff(ICB_SERVER_REC *server, char **args)
++{
++ NICK_REC *nickrec;
++ char *nick, *p;
++
++ nick = g_strdup(args[1]);
++ p = strchr(nick, ' ');
++ *p = '\0';
++
++ nickrec = nicklist_find(CHANNEL(server->group), nick);
++ if (nickrec != NULL) {
++ nicklist_remove(CHANNEL(server->group), nickrec);
++ }
++ g_free(nick);
++
++ printformat(server, server->group->name, MSGLEVEL_CRAP,
++ ICBTXT_STATUS, args[0], args[1]);
++}
++
++/*
++ * In theory should be status_status() but that's just silly :-)
++ *
++ * args0 = "Status"
++ * args0 = "You are now in group <group>[ as moderator]"
++ */
++static void status_join(ICB_SERVER_REC *server, char **args)
++{
++ icb_update_nicklist(server);
++
++ printformat(server, server->group->name, MSGLEVEL_CRAP,
++ ICBTXT_STATUS, args[0], args[1]);
++}
++
++/*
++ * args0 = "Name"
++ * args1 = "<oldnick> changed nickname to <newnick>"
++ */
++static void status_name(ICB_SERVER_REC *server, char **args)
++{
++ NICK_REC *nickrec;
++ char *oldnick, *newnick, *p;
++
++ oldnick = g_strdup(args[1]);
++ p = strchr(oldnick, ' ');
++ if (p != NULL) *p = '\0';
++
++ p = g_strdup(args[1]);
++ newnick = strrchr(p, ' ');
++ if (newnick != NULL)
++ newnick++;
++
++ nickrec = nicklist_find(CHANNEL(server->group), oldnick);
++ if (nickrec != NULL)
++ nicklist_rename(SERVER(server), oldnick, newnick);
++
++ /* Update our own nick */
++ if (strcmp(oldnick, server->connrec->nick) == 0) {
++ server_change_nick(SERVER(server), newnick);
++ g_free(server->connrec->nick);
++ server->connrec->nick = g_strdup(newnick);
++ }
++
++ g_free(oldnick);
++ g_free(p);
++
++ printformat(server, server->group->name, MSGLEVEL_CRAP,
++ ICBTXT_STATUS, args[0], args[1]);
++}
++
++/*
++ * args0 = "Topic"
++ * args1 = "<nickname> changed the topic to "<topic>"
++ */
++static void status_topic(ICB_SERVER_REC *server, char **args)
++{
++ char *topic, *setby, *p1, *p2;
++
++ p1 = strchr(args[1], '"');
++ p2 = strrchr(args[1], '"');
++
++ if (p1++) {
++ topic = g_strdup(p1);
++ p2 = strrchr(topic, '"');
++ *p2 = '\0';
++
++ setby = g_strdup(args[1]);
++ p2 = strchr(setby, ' ');
++ *p2 = '\0';
++
++ icb_change_topic(server, topic, setby, time(NULL));
++
++ g_free(topic);
++ g_free(setby);
++ }
++
++ printformat(server, server->group->name, MSGLEVEL_CRAP,
++ ICBTXT_STATUS, args[0], args[1]);
++}
++
++/*
++ * args0 = "Pass"
++ * args1 = "<nickname> just passed you moderation of group <group>"
++ * args1 = "<nickname> has passed moderation to <nickname>"
++ * args1 = "<nickname> is now mod."
++ *
++ * If the moderator signs off and you are passed moderation, then the third
++ * args1 is used.
++ *
++ */
++static void status_pass(ICB_SERVER_REC *server, char **args)
++{
++ /*
++ * Eventually we might want to track this, for now just print status
++ * to the group window
++ */
++ printformat(server, server->group->name, MSGLEVEL_CRAP,
++ ICBTXT_STATUS, args[0], args[1]);
++}
++
++static void status_default(ICB_SERVER_REC *server, char **args)
++{
++ /* Send messages to the group window by default */
++ printformat(server, server->group->name, MSGLEVEL_CRAP,
++ ICBTXT_STATUS, args[0], args[1]);
++}
++
+ static void sig_server_add_fill(SERVER_SETUP_REC *rec,
+ GHashTable *optlist)
+ {
+@@ -109,13 +485,23 @@
+ {
+ theme_register(fecommon_icb_formats);
+
+- signal_add("icb event status", (SIGNAL_FUNC) event_status);
+ signal_add("icb event error", (SIGNAL_FUNC) event_error);
+ signal_add("icb event important", (SIGNAL_FUNC) event_important);
signal_add("icb event beep", (SIGNAL_FUNC) event_beep);
signal_add("icb event open", (SIGNAL_FUNC) event_open);
signal_add("icb event personal", (SIGNAL_FUNC) event_personal);
++ signal_add("icb cmdout co", (SIGNAL_FUNC) cmdout_co);
+ signal_add("icb cmdout wl", (SIGNAL_FUNC) cmdout_wl);
signal_add("default icb cmdout", (SIGNAL_FUNC) cmdout_default);
++ signal_add("icb status arrive", (SIGNAL_FUNC) status_arrive);
++ signal_add("icb status depart", (SIGNAL_FUNC) status_depart);
++ signal_add("icb status sign-on", (SIGNAL_FUNC) status_signon);
++ signal_add("icb status sign-off", (SIGNAL_FUNC) status_signoff);
++ signal_add("icb status status", (SIGNAL_FUNC) status_join);
++ signal_add("icb status topic", (SIGNAL_FUNC) status_topic);
++ signal_add("icb status name", (SIGNAL_FUNC) status_name);
++ signal_add("icb status pass", (SIGNAL_FUNC) status_pass);
++ signal_add("default icb status", (SIGNAL_FUNC) status_default);
signal_add("server add fill", (SIGNAL_FUNC) sig_server_add_fill);
-@@ -131,6 +258,7 @@
+ command_set_options("server add", "-icbnet");
+@@ -125,13 +511,23 @@
+
+ void fe_icb_deinit(void)
+ {
+- signal_remove("icb event status", (SIGNAL_FUNC) event_status);
+ signal_remove("icb event error", (SIGNAL_FUNC) event_error);
+ signal_remove("icb event important", (SIGNAL_FUNC) event_important);
signal_remove("icb event beep", (SIGNAL_FUNC) event_beep);
signal_remove("icb event open", (SIGNAL_FUNC) event_open);
signal_remove("icb event personal", (SIGNAL_FUNC) event_personal);
++ signal_remove("icb cmdout co", (SIGNAL_FUNC) cmdout_co);
+ signal_remove("icb cmdout wl", (SIGNAL_FUNC) cmdout_wl);
signal_remove("default icb cmdout", (SIGNAL_FUNC) cmdout_default);
++ signal_remove("icb status arrive", (SIGNAL_FUNC) status_arrive);
++ signal_remove("icb status depart", (SIGNAL_FUNC) status_depart);
++ signal_remove("icb status sign-on", (SIGNAL_FUNC) status_signon);
++ signal_remove("icb status sign-off", (SIGNAL_FUNC) status_signoff);
++ signal_remove("icb status status", (SIGNAL_FUNC) status_join);
++ signal_remove("icb status topic", (SIGNAL_FUNC) status_topic);
++ signal_remove("icb status name", (SIGNAL_FUNC) status_name);
++ signal_remove("icb status pass", (SIGNAL_FUNC) status_pass);
++ signal_remove("default icb status", (SIGNAL_FUNC) status_default);
signal_remove("server add fill", (SIGNAL_FUNC) sig_server_add_fill);
+ }
diff --git a/chat/irssi-icb/patches/patch-af b/chat/irssi-icb/patches/patch-af
index 4f0b13f2c83..44b0fbd83cf 100644
--- a/chat/irssi-icb/patches/patch-af
+++ b/chat/irssi-icb/patches/patch-af
@@ -1,6 +1,41 @@
---- src/core/icb-protocol.c.orig 2010-05-18 21:09:43.000000000 +0100
-+++ src/core/icb-protocol.c 2010-05-18 22:32:50.000000000 +0100
-@@ -121,7 +121,91 @@
+$NetBSD: patch-af,v 1.2 2010/08/10 20:26:36 sketch Exp $
+
+--- src/core/icb-protocol.c (revision 5174)
++++ src/core/icb-protocol.c (working copy)
+@@ -27,19 +27,19 @@
+ #include "icb-servers.h"
+
+ static char *signal_names[] = {
+- "login",
+- "open",
+- "personal",
+- "status",
+- "error",
+- "important",
+- "exit",
+- "command",
+- "cmdout",
+- "protocol",
+- "beep",
+- "ping",
+- "pong"
++ "login", /* a */
++ "open", /* b */
++ "personal", /* c */
++ "status", /* d */
++ "error", /* e */
++ "important", /* f */
++ "exit", /* g */
++ "command", /* h */
++ "cmdout", /* i */
++ "protocol", /* j */
++ "beep", /* k */
++ "ping", /* l */
++ "pong" /* m */
+ };
+
+ #define SIGNAL_FIRST 'a'
+@@ -121,9 +121,93 @@
void icb_send_open_msg(ICB_SERVER_REC *server, const char *text)
{
@@ -42,8 +77,8 @@
+ icb_send_cmd(server, 'b', sendbuf, NULL);
+ text += len > copylen ? copylen : len;
+ }
-+}
-+
+ }
+
+void icb_send_private_msg(ICB_SERVER_REC *server, const char *target,
+ const char *text)
+{
@@ -90,6 +125,43 @@
+ icb_send_cmd(server, 'h', "m", sendbuf, NULL);
+ text += len > copylen ? copylen : len;
+ }
++}
++
+ void icb_command(ICB_SERVER_REC *server, const char *cmd,
+ const char *args, const char *id)
+ {
+@@ -293,6 +377,20 @@
+ g_strfreev(args);
+ }
+
++static void event_status(ICB_SERVER_REC *server, const char *data)
++{
++ char **args, *event;
++
++ args = g_strsplit(data, "\001", -1);
++ if (args[0] != NULL) {
++ event = g_strdup_printf("icb status %s", g_ascii_strdown(args[0], strlen(args[0])));
++ if (!signal_emit(event, 2, server, args))
++ signal_emit("default icb status", 2, server, args);
++ g_free(event);
++ }
++ g_strfreev(args);
++}
++
+ void icb_protocol_init(void)
+ {
+ signal_add("server connected", (SIGNAL_FUNC) sig_server_connected);
+@@ -300,6 +398,7 @@
+ signal_add("icb event login", (SIGNAL_FUNC) event_login);
+ signal_add("icb event ping", (SIGNAL_FUNC) event_ping);
+ signal_add("icb event cmdout", (SIGNAL_FUNC) event_cmdout);
++ signal_add("icb event status", (SIGNAL_FUNC) event_status);
}
- void icb_command(ICB_SERVER_REC *server, const char *cmd,
+ void icb_protocol_deinit(void)
+@@ -309,4 +408,5 @@
+ signal_remove("icb event login", (SIGNAL_FUNC) event_login);
+ signal_remove("icb event ping", (SIGNAL_FUNC) event_ping);
+ signal_remove("icb event cmdout", (SIGNAL_FUNC) event_cmdout);
++ signal_remove("icb event status", (SIGNAL_FUNC) event_status);
+ }
diff --git a/chat/irssi-icb/patches/patch-ag b/chat/irssi-icb/patches/patch-ag
index 1b634521842..290d44db287 100644
--- a/chat/irssi-icb/patches/patch-ag
+++ b/chat/irssi-icb/patches/patch-ag
@@ -1,8 +1,18 @@
-$NetBSD: patch-ag,v 1.1 2010/05/18 21:38:49 sketch Exp $
+$NetBSD: patch-ag,v 1.2 2010/08/10 20:26:36 sketch Exp $
---- src/core/icb-servers.c.orig 2010-05-18 21:25:22.000000000 +0100
-+++ src/core/icb-servers.c 2010-05-18 21:24:58.000000000 +0100
-@@ -113,7 +113,6 @@
+--- src/core/icb-servers.c (revision 5174)
++++ src/core/icb-servers.c (working copy)
+@@ -39,6 +39,9 @@
+ server = g_new0(ICB_SERVER_REC, 1);
+ server->chat_type = ICB_PROTOCOL;
+
++ server->silentwho = FALSE;
++ server->updatenicks = FALSE;
++
+ server->recvbuf_size = 256;
+ server->recvbuf = g_malloc(server->recvbuf_size);
+
+@@ -113,7 +116,6 @@
const char *msg, int target_type)
{
ICB_SERVER_REC *icbserver;
@@ -10,7 +20,7 @@ $NetBSD: patch-ag,v 1.1 2010/05/18 21:38:49 sketch Exp $
icbserver = ICB_SERVER(server);
g_return_if_fail(server != NULL);
-@@ -125,9 +124,7 @@
+@@ -125,9 +127,7 @@
icb_send_open_msg(icbserver, msg);
} else {
/* private message */
diff --git a/chat/irssi-icb/patches/patch-ai b/chat/irssi-icb/patches/patch-ai
new file mode 100644
index 00000000000..d0e2a28692e
--- /dev/null
+++ b/chat/irssi-icb/patches/patch-ai
@@ -0,0 +1,13 @@
+$NetBSD: patch-ai,v 1.1 2010/08/10 20:26:36 sketch Exp $
+
+--- src/fe-common/module-formats.c (revision 5174)
++++ src/fe-common/module-formats.c (working copy)
+@@ -30,7 +30,7 @@
+ { "status", "[$0] $1", 2, { 0, 0 } },
+ { "important", "[$0!] $1", 2, { 0, 0 } },
+ { "status", "{error [Error]} $0", 1, { 0 } },
+- { "beep", "[beep] $1 beeps you", 1, { 0 } },
++ { "beep", "[Beep] $1 beeps you", 1, { 0 } },
+
+ { NULL, NULL, 0 }
+ };
diff --git a/chat/irssi-icb/patches/patch-aj b/chat/irssi-icb/patches/patch-aj
new file mode 100644
index 00000000000..f246fdc2d1c
--- /dev/null
+++ b/chat/irssi-icb/patches/patch-aj
@@ -0,0 +1,41 @@
+$NetBSD: patch-aj,v 1.1 2010/08/10 20:26:36 sketch Exp $
+
+--- src/core/Makefile.in.orig 2002-11-24 13:18:08.000000000 +0000
++++ src/core/Makefile.in 2010-08-10 21:10:22.000000000 +0100
+@@ -83,15 +83,15 @@
+ moduledir = $(libdir)/irssi/modules
+
+ module_LTLIBRARIES = libicb_core.la
+-libicb_core_la_LDFLAGS = -avoid-version
++libicb_core_la_LDFLAGS = -module -avoid-version
+
+ INCLUDES = $(GLIB_CFLAGS) -I$(IRSSI_INCLUDE) -I$(IRSSI_INCLUDE)/src -I$(IRSSI_INCLUDE)/src/core
+
+
+-libicb_core_la_SOURCES = icb-channels.c icb-commands.c icb-core.c icb-queries.c icb-servers-reconnect.c icb-protocol.c icb-servers.c icb-session.c
++libicb_core_la_SOURCES = icb-channels.c icb-commands.c icb-core.c icb-nicklist.c icb-queries.c icb-servers-reconnect.c icb-protocol.c icb-servers.c icb-session.c
+
+
+-noinst_HEADERS = icb.h icb-channels.h icb-commands.h icb-protocol.h icb-queries.h icb-servers.h module.h
++noinst_HEADERS = icb.h icb-channels.h icb-commands.h icb-nicklist.h icb-protocol.h icb-queries.h icb-servers.h module.h
+
+ mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+ CONFIG_HEADER = ../../config-plugin.h
+@@ -106,7 +106,7 @@
+ libicb_core_la_LIBADD =
+ libicb_core_la_OBJECTS = icb-channels.lo icb-commands.lo icb-core.lo \
+ icb-queries.lo icb-servers-reconnect.lo icb-protocol.lo icb-servers.lo \
+-icb-session.lo
++icb-session.lo icb-nicklist.lo
+ CFLAGS = @CFLAGS@
+ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+ LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+@@ -257,6 +257,8 @@
+ icb-commands.h icb-servers.h icb-channels.h icb-protocol.h
+ icb-core.lo icb-core.o : icb-core.c module.h icb.h icb-commands.h \
+ icb-servers.h icb-channels.h icb-queries.h icb-protocol.h
++icb-nicklist.lo icb-nicklist.o : icb-nicklist.c module.h \
++ icb-channels.h icb-nicklist.h
+ icb-protocol.lo icb-protocol.o : icb-protocol.c module.h icb.h \
+ icb-servers.h
+ icb-queries.lo icb-queries.o : icb-queries.c module.h icb.h \
diff --git a/chat/irssi-icb/patches/patch-al b/chat/irssi-icb/patches/patch-al
new file mode 100644
index 00000000000..e355c4ec4a8
--- /dev/null
+++ b/chat/irssi-icb/patches/patch-al
@@ -0,0 +1,14 @@
+$NetBSD: patch-al,v 1.1 2010/08/10 20:26:36 sketch Exp $
+
+--- src/core/icb-servers.h (revision 5174)
++++ src/core/icb-servers.h (working copy)
+@@ -31,6 +31,9 @@
+ unsigned char *sendbuf;
+ int sendbuf_size;
+
++ int silentwho; /* silence /who output when updating nicks */
++ int updatenicks; /* parse /who output for topic/nicks */
++
+ unsigned char *recvbuf;
+ int recvbuf_size, recvbuf_pos;
+ int recvbuf_next_packet;
diff --git a/chat/irssi-icb/patches/patch-am b/chat/irssi-icb/patches/patch-am
new file mode 100644
index 00000000000..85550c175de
--- /dev/null
+++ b/chat/irssi-icb/patches/patch-am
@@ -0,0 +1,49 @@
+$NetBSD: patch-am,v 1.1 2010/08/10 20:26:36 sketch Exp $
+
+--- /dev/null 2009-11-03 03:54:19.098165668 +0100
++++ src/core/icb-nicklist.c 2010-05-21 13:03:14.227283420 +0200
+@@ -0,0 +1,44 @@
++/*
++ icb-nicklist.c : irssi
++
++ Copyright (C) 2010 Jonathan Perkin
++
++ 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.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++*/
++
++#include "module.h"
++#include "signals.h"
++
++#include "icb-channels.h"
++#include "icb-nicklist.h"
++
++/* Add new nick to list*/
++NICK_REC *icb_nicklist_insert(ICB_CHANNEL_REC *channel, const char *nick,
++ int mod)
++{
++ NICK_REC *rec;
++
++ g_return_val_if_fail(IS_ICB_CHANNEL(channel), NULL);
++ g_return_val_if_fail(nick != NULL, NULL);
++
++ rec = g_new0(NICK_REC, 1);
++ rec->nick = g_strdup(nick);
++
++ /* Just use existing 'op' for moderator */
++ if (mod) rec->op = TRUE;
++
++ nicklist_insert(CHANNEL(channel), rec);
++ return rec;
++}
diff --git a/chat/irssi-icb/patches/patch-an b/chat/irssi-icb/patches/patch-an
new file mode 100644
index 00000000000..331c543ef13
--- /dev/null
+++ b/chat/irssi-icb/patches/patch-an
@@ -0,0 +1,38 @@
+$NetBSD: patch-an,v 1.1 2010/08/10 20:26:36 sketch Exp $
+
+--- /dev/null 2009-11-03 03:54:19.098165668 +0100
++++ src/core/icb-nicklist.h 2010-05-21 13:03:14.236221682 +0200
+@@ -0,0 +1,33 @@
++/*
++ icb-nicklist.h : irssi
++
++ Copyright (C) 2010 Jonathan Perkin
++
++ 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.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++*/
++
++#ifndef __ICB_NICKLIST_H
++#define __ICB_NICKLIST_H
++
++#include "nicklist.h"
++
++/* Add new nick to list */
++NICK_REC *icb_nicklist_insert(ICB_CHANNEL_REC *channel, const char *nick,
++ int mod);
++
++void icb_nicklist_init(void);
++void icb_nicklist_deinit(void);
++
++#endif