Index: work/net/libuirc/libuirc.c =================================================================== --- work/net/libuirc/libuirc.c (revision 31361) +++ work/net/libuirc/libuirc.c (revision 31362) @@ -140,6 +140,37 @@ return 0; } +static uirc_event_t uirc_parse_kick(uirc_t *ctx, char *nick, char *arg) +{ + char *victim, *reason; + int q; + + payload(victim, arg); + payload(reason, victim); + + q = uirc_query_search(ctx, arg); + if (q < 0) + return 0; + + if (irc_strcasecmp(victim, ctx->nick) == 0) { + if (ctx->on_me_part != NULL) + ctx->on_me_part(ctx, q, arg); + if (ctx->on_query_end != NULL) + ctx->on_query_end(ctx, q); + ctx->query[q].type = UIRC_UNUSED; + free(ctx->query[q].name); + ctx->query[q].name = NULL; + return UIRC_ME_PART | UIRC_QUERY_END; + } + + if (ctx->on_kick != NULL) { + ctx->on_kick(ctx, nick, q, arg, victim, reason); + return UIRC_KICK; + } + + return 0; +} + static uirc_event_t uirc_parse_msg(uirc_t *ctx, char *nick, char *arg) { char *text; @@ -242,6 +273,7 @@ if (strcmp(cmd, "001") == 0) return res | uirc_parse_001(ctx, arg); if (strcasecmp(cmd, "join") == 0) return res | uirc_parse_join(ctx, from, arg); if (strcasecmp(cmd, "part") == 0) return res | uirc_parse_part(ctx, from, arg); + if (strcasecmp(cmd, "kick") == 0) return res | uirc_parse_kick(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); Index: work/net/libuirc/libuirc.h =================================================================== --- work/net/libuirc/libuirc.h (revision 31361) +++ work/net/libuirc/libuirc.h (revision 31362) @@ -35,6 +35,7 @@ UIRC_PART = 0x0400, UIRC_MSG = 0x0800, UIRC_NOTICE = 0x1000, + UIRC_KICK = 0x2000, } uirc_event_t; typedef struct uirc_s uirc_t; @@ -54,6 +55,7 @@ void (*on_join)(uirc_t *ctx, char *nick, int query, char *chan); void (*on_me_part)(uirc_t *ctx, int query, char *chan); void (*on_part)(uirc_t *ctx, char *nick, int query, char *chan, char *reason); + void (*on_kick)(uirc_t *ctx, char *nick, int query, char *chan, char *victim, 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); Index: work/net/libuirc/main.c =================================================================== --- work/net/libuirc/main.c (revision 31361) +++ work/net/libuirc/main.c (revision 31362) @@ -5,7 +5,7 @@ static void on_me_part(uirc_t *ctx, int query, char *chan) { - printf("### end query with %s (part)\n", chan); + printf("### left channel %s\n", chan); } static void on_msg(uirc_t *ctx, char *from, int query, char *to, char *text) @@ -24,7 +24,12 @@ printf("(by:%s) [%s] topic=%s\n", from, to, text); } +static void on_kick(uirc_t *ctx, char *nick, int query, char *chan, char *victim, char *reason) +{ + printf("(kick: %s kick %s from %s reason=%s\n", nick, victim, chan, reason); +} + static void read_stdin(uirc_t *ctx) { struct P_pollfd fds[1]; @@ -54,6 +59,7 @@ irc.on_msg = on_msg; irc.on_notice = on_notice; irc.on_topic = on_topic; + irc.on_kick = on_kick; irc.nick = strdup("libuirc"); if (uirc_connect(&irc, "10.0.0.2", 6667, "libuirc test client") != 0) {