fix names not update when user leaves
This commit is contained in:
@@ -151,6 +151,7 @@ typedef struct {
|
|||||||
int mention;
|
int mention;
|
||||||
int scroll;
|
int scroll;
|
||||||
char topic[MAX_LINE];
|
char topic[MAX_LINE];
|
||||||
|
int names_pending; /* 1 while receiving fresh 353 NAMES reply */
|
||||||
} Channel;
|
} Channel;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -162,7 +163,7 @@ typedef enum {
|
|||||||
EV_CONNECTED, EV_STATUS, EV_ERROR, EV_SERVER_TEXT,
|
EV_CONNECTED, EV_STATUS, EV_ERROR, EV_SERVER_TEXT,
|
||||||
EV_PRIVMSG, EV_JOIN, EV_PART, EV_QUIT_MSG,
|
EV_PRIVMSG, EV_JOIN, EV_PART, EV_QUIT_MSG,
|
||||||
EV_NICK_CHANGE, EV_NAMES, EV_KICK, EV_RAW,
|
EV_NICK_CHANGE, EV_NAMES, EV_KICK, EV_RAW,
|
||||||
EV_RECONNECT, EV_TOPIC
|
EV_RECONNECT, EV_TOPIC, EV_NAMES_END
|
||||||
} EvType;
|
} EvType;
|
||||||
|
|
||||||
typedef struct {
|
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;
|
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 */
|
/* AWAY */
|
||||||
if (strcmp(m.cmd,"301")==0) {
|
if (strcmp(m.cmd,"301")==0) {
|
||||||
@@ -1102,7 +1108,7 @@ static int srv_alloc(void) {
|
|||||||
memset(s,0,sizeof(Server));
|
memset(s,0,sizeof(Server));
|
||||||
strncpy(s->host,"irc.libera.chat",MAX_HOST-1);
|
strncpy(s->host,"irc.libera.chat",MAX_HOST-1);
|
||||||
s->port=6697;
|
s->port=6697;
|
||||||
strncpy(s->nick,"sirc_user",MAX_NICK-1);
|
strncpy(s->nick,"circ_user",MAX_NICK-1);
|
||||||
s->use_tls=1;
|
s->use_tls=1;
|
||||||
s->sock=-1;
|
s->sock=-1;
|
||||||
pthread_mutex_init(&s->send_lock,NULL);
|
pthread_mutex_init(&s->send_lock,NULL);
|
||||||
@@ -1144,7 +1150,7 @@ static void load_config(const char *path) {
|
|||||||
if (!f) return;
|
if (!f) return;
|
||||||
|
|
||||||
/* defaults that apply before any [server] block */
|
/* 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 */
|
/* current server being parsed; -1 = not inside a [server] block */
|
||||||
int cur_si=-1;
|
int cur_si=-1;
|
||||||
@@ -1646,6 +1652,11 @@ static void handle_event(const Event *ev) {
|
|||||||
|
|
||||||
case EV_NAMES: {
|
case EV_NAMES: {
|
||||||
int ci=chan_find(si,ev->chan); if(ci<0) break;
|
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_adduser(&g_chans[ci], ev->extra[0], ev->nick);
|
||||||
chan_sort_users(&g_chans[ci]);
|
chan_sort_users(&g_chans[ci]);
|
||||||
break;
|
break;
|
||||||
@@ -1666,6 +1677,12 @@ static void handle_event(const Event *ev) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case EV_NAMES_END: {
|
||||||
|
int ci=chan_find(si,ev->chan); if(ci<0) break;
|
||||||
|
g_chans[ci].names_pending = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user