Index: work/net/libuirc/libuirc.c =================================================================== --- work/net/libuirc/libuirc.c (revision 31360) +++ work/net/libuirc/libuirc.c (revision 31361) @@ -176,7 +176,27 @@ return 0; } +static uirc_event_t uirc_parse_topic(uirc_t *ctx, char *nick, char *arg, int numeric) +{ + char *text; + int q; + if (*arg == ':') arg++; + payload(text, arg); + + q = uirc_query_search(ctx, arg); + + if (ctx->on_topic != NULL) { + if (numeric) + nick = NULL; + ctx->on_topic(ctx, nick, q, arg, text); + return UIRC_TOPIC; + } + + return 0; +} + + static uirc_event_t uirc_parse(uirc_t *ctx, char *line) { char *end, *arg, *cmd, *from = line; @@ -224,6 +244,8 @@ if (strcasecmp(cmd, "part") == 0) return res | uirc_parse_part(ctx, from, arg); if (strcasecmp(cmd, "privmsg") == 0) return res | uirc_parse_msg(ctx, from, arg); if (strcasecmp(cmd, "notice") == 0) return res | uirc_parse_notice(ctx, from, arg); + if (strcasecmp(cmd, "topic") == 0) return res | uirc_parse_topic(ctx, from, arg, 0); + if (strcasecmp(cmd, "332") == 0) return res | uirc_parse_topic(ctx, from, arg, 1); return res; } Index: work/net/libuirc/libuirc.h =================================================================== --- work/net/libuirc/libuirc.h (revision 31360) +++ work/net/libuirc/libuirc.h (revision 31361) @@ -24,7 +24,7 @@ typedef enum { /* bitfield */ UIRC_CONNECT = 0x0001, UIRC_DISCONNECT = 0x0002, - UIRC_GOT_MSG = 0x0004, + UIRC_TOPIC = 0x0004, UIRC_GOT_MISC = 0x0008, UIRC_QUERY_BEGIN = 0x0010, UIRC_QUERY_END = 0x0020, @@ -34,7 +34,7 @@ UIRC_ME_PART = 0x0200, UIRC_PART = 0x0400, UIRC_MSG = 0x0800, - UIRC_NOTICE = 0x1000 + UIRC_NOTICE = 0x1000, } uirc_event_t; typedef struct uirc_s uirc_t; @@ -46,7 +46,6 @@ void *user_data; void (*on_connect)(uirc_t *ctx); void (*on_disconnect)(uirc_t *ctx); - void (*on_got_msg)(uirc_t *ctx, const char *from, int query_to, const char *msg); void (*on_got_misc)(uirc_t *ctx, int query_to, const char *msg); void (*on_query_begin)(uirc_t *ctx, int query_to); void (*on_query_end)(uirc_t *ctx, int query_to); /* called on leaving the channel for any reason */ @@ -57,6 +56,7 @@ void (*on_part)(uirc_t *ctx, char *nick, int query, char *chan, char *reason); void (*on_msg)(uirc_t *ctx, char *from, int query, char *to, char *text); void (*on_notice)(uirc_t *ctx, char *from, int query, char *to, char *text); + void (*on_topic)(uirc_t *ctx, char *from, int query, char *to, char *text); /* internal */ P_net_socket sk; Index: work/net/libuirc/main.c =================================================================== --- work/net/libuirc/main.c (revision 31360) +++ work/net/libuirc/main.c (revision 31361) @@ -19,6 +19,12 @@ } +static void on_topic(uirc_t *ctx, char *from, int query, char *to, char *text) +{ + printf("(by:%s) [%s] topic=%s\n", from, to, text); +} + + static void read_stdin(uirc_t *ctx) { struct P_pollfd fds[1]; @@ -47,6 +53,7 @@ irc.on_me_part = on_me_part; irc.on_msg = on_msg; irc.on_notice = on_notice; + irc.on_topic = on_topic; irc.nick = strdup("libuirc"); if (uirc_connect(&irc, "10.0.0.2", 6667, "libuirc test client") != 0) {