commit 6a85dc86cf5b59383fce4ea1313641afa9d7f073
parent 1f38d54b398e5328840f2f8a9af0e850a4ae5016
Author: emmett1 <me@emmett1.my>
Date: Thu, 9 Apr 2026 07:39:26 +0800
fix names not update when user leaves
Diffstat:
| M | sirc.c | | | 25 | +++++++++++++++++++++---- |
1 file changed, 21 insertions(+), 4 deletions(-)
diff --git a/sirc.c b/sirc.c
@@ -151,6 +151,7 @@ typedef struct {
int mention;
int scroll;
char topic[MAX_LINE];
+ int names_pending; /* 1 while receiving fresh 353 NAMES reply */
} Channel;
typedef struct {
@@ -162,7 +163,7 @@ typedef enum {
EV_CONNECTED, EV_STATUS, EV_ERROR, EV_SERVER_TEXT,
EV_PRIVMSG, EV_JOIN, EV_PART, EV_QUIT_MSG,
EV_NICK_CHANGE, EV_NAMES, EV_KICK, EV_RAW,
- EV_RECONNECT, EV_TOPIC
+ EV_RECONNECT, EV_TOPIC, EV_NAMES_END
} EvType;
typedef struct {
@@ -881,7 +882,12 @@ static void handle_irc_line(int si, const char *raw) {
ev_simple(EV_STATUS, si, NULL, NULL, "[list] end"); return;
}
- if (strcmp(m.cmd,"366")==0) return;
+ if (strcmp(m.cmd,"366")==0) {
+ /* end of NAMES — reset pending flag so next /names clears again */
+ const char *ch = m.nparams>=2 ? m.params[1] : (m.nparams>=1 ? m.params[0] : "");
+ ev_simple(EV_NAMES_END, si, NULL, ch, NULL);
+ return;
+ }
/* AWAY */
if (strcmp(m.cmd,"301")==0) {
@@ -1102,7 +1108,7 @@ static int srv_alloc(void) {
memset(s,0,sizeof(Server));
strncpy(s->host,"irc.libera.chat",MAX_HOST-1);
s->port=6697;
- strncpy(s->nick,"sirc_user",MAX_NICK-1);
+ strncpy(s->nick,"circ_user",MAX_NICK-1);
s->use_tls=1;
s->sock=-1;
pthread_mutex_init(&s->send_lock,NULL);
@@ -1144,7 +1150,7 @@ static void load_config(const char *path) {
if (!f) return;
/* defaults that apply before any [server] block */
- char def_nick[MAX_NICK]="sirc_user";
+ char def_nick[MAX_NICK]="circ_user";
/* current server being parsed; -1 = not inside a [server] block */
int cur_si=-1;
@@ -1646,6 +1652,11 @@ static void handle_event(const Event *ev) {
case EV_NAMES: {
int ci=chan_find(si,ev->chan); if(ci<0) break;
+ /* first nick of a fresh NAMES reply — wipe the stale list */
+ if (!g_chans[ci].names_pending) {
+ g_chans[ci].user_count = 0;
+ g_chans[ci].names_pending = 1;
+ }
chan_adduser(&g_chans[ci], ev->extra[0], ev->nick);
chan_sort_users(&g_chans[ci]);
break;
@@ -1666,6 +1677,12 @@ static void handle_event(const Event *ev) {
break;
}
+ case EV_NAMES_END: {
+ int ci=chan_find(si,ev->chan); if(ci<0) break;
+ g_chans[ci].names_pending = 0;
+ break;
+ }
+
}
}