Index: libuirc/libuirc.c =================================================================== --- libuirc/libuirc.c (revision 20987) +++ libuirc/libuirc.c (revision 20988) @@ -100,7 +100,45 @@ return 0; } +static uirc_event_t uirc_parse_part(uirc_t *ctx, char *nick, char *arg) +{ + char *reason; + int q; +/*:libuirc!~libuirc@78-131-56-146.static.hdsnet.hu PART #pcb-rnd*/ + if (*arg == ':') arg++; + reason = strpbrk(arg, " \t"); + if (reason != NULL) { + *reason = 0; + reason++; + if (*reason == ':'); + reason++; + } + + q = uirc_query_search(ctx, arg); + if (q < 0) + return 0; + + if (irc_strcasecmp(nick, 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_part != NULL) { + ctx->on_part(ctx, nick, q, arg, reason); + return UIRC_PART; + } + + return 0; +} + + static uirc_event_t uirc_parse(uirc_t *ctx, char *line) { char *end, *arg, *cmd, *from = line; @@ -145,6 +183,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); return res; } Index: libuirc/libuirc.h =================================================================== --- libuirc/libuirc.h (revision 20987) +++ libuirc/libuirc.h (revision 20988) @@ -30,7 +30,9 @@ UIRC_QUERY_END = 0x0020, UIRC_ME_QUIT = 0x0040, UIRC_ME_JOIN = 0x0080, - UIRC_JOIN = 0x0100 + UIRC_JOIN = 0x0100, + UIRC_ME_PART = 0x0200, + UIRC_PART = 0x0400 } uirc_event_t; typedef struct uirc_s uirc_t; @@ -49,8 +51,9 @@ void (*on_me_quit)(uirc_t *ctx); void (*on_me_join)(uirc_t *ctx, int query, char *chan); 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); - /* internal */ P_net_socket sk; gds_t ibuf, obuf; Index: libuirc/main.c =================================================================== --- libuirc/main.c (revision 20987) +++ libuirc/main.c (revision 20988) @@ -3,6 +3,12 @@ #include #include "libuirc.h" +static void on_me_part(uirc_t *ctx, int query, char *chan) +{ + printf("### end query with %s (part)\n", chan); +} + + static void read_stdin(uirc_t *ctx) { struct P_pollfd fds[1]; @@ -28,6 +34,7 @@ uirc_t irc; memset(&irc, 0, sizeof(irc)); + irc.on_me_part = on_me_part; irc.nick = strdup("libuirc"); if (uirc_connect(&irc, "repo.hu", 6667, "libuirc test client") != 0) { @@ -39,7 +46,7 @@ uirc_event_t ev = uirc_poll(&irc); if (ev & UIRC_CONNECT) { printf("joining\n"); - uirc_raw(&irc, "join :#pcb-rnd"); + uirc_raw(&irc, "join :#dev"); } if (ev & UIRC_QUERY_BEGIN) { irc.curr_query = irc.last_new_query;