From: pk910 Date: Mon, 10 Sep 2012 13:48:08 +0000 (+0200) Subject: fixed cache asyncs caused by users rejoining the channel to fast X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=commitdiff_plain;h=15d3e663d09e801fed79a8af7165e1698a377f8e fixed cache asyncs caused by users rejoining the channel to fast PART, JOIN, PART, JOIN instead of PART, PART, JOIN, JOIN (2 bots) --- diff --git a/src/ChanUser.h b/src/ChanUser.h index e98a8cd..62d8361 100644 --- a/src/ChanUser.h +++ b/src/ChanUser.h @@ -18,10 +18,11 @@ #define _ChanUser_h #include "main.h" -#define CHANUSERFLAG_OPPED 0x01 -#define CHANUSERFLAG_VOICED 0x02 +#define CHANUSERFLAG_OPPED 0x01 +#define CHANUSERFLAG_VOICED 0x02 #define CHANUSERFLAG_INVISIBLE 0x04 #define CHANUSERFLAG_HALFOPPED 0x08 +#define CHANUSERFLAG_PARTING 0x10 #define CHANUSERFLAG_OPPED_OR_VOICED (CHANUSERFLAG_OPPED | CHANUSERFLAG_HALFOPPED | CHANUSERFLAG_VOICED) @@ -34,7 +35,8 @@ struct ChanUser { struct ChanNode *chan; struct UserNode *user; - int visCount; //visible counter - if this is 0, the ChanUser gets removed + int visCount : 8; //visible counter - if this is 0, the ChanUser gets removed + int old_visCount : 8; int chageEvents; time_t changeTime; diff --git a/src/IRCParser.c b/src/IRCParser.c index bf77551..fc6b607 100644 --- a/src/IRCParser.c +++ b/src/IRCParser.c @@ -404,11 +404,24 @@ static IRC_CMD(raw_part) { decrease_viscount_butone(chan, chanuser); chan->botcount--; } + if(chanuser->flags & CHANUSERFLAG_PARTING) + chanuser->old_visCount--; chanuser->visCount--; if(chanuser->visCount == 0) { delChanUser(chanuser, 0); //not free, yet! event_part(chanuser, 0, (argc > 1 ? argv[1] : NULL)); freeChanUser(chanuser); + } else if(!(chanuser->flags & CHANUSERFLAG_PARTING)) { + chanuser->flags |= CHANUSERFLAG_PARTING; + chanuser->old_visCount = chanuser->visCount; + } else if(chanuser->old_visCount == 0) { + int visCount = chanuser->visCount; + delChanUser(chanuser, 0); //not free, yet! + event_part(chanuser, 0, (argc > 1 ? argv[1] : NULL)); + freeChanUser(chanuser); + chanuser = addChanUser(chan, user); + chanuser->visCount = visCount; + event_join(chanuser); } //check if channel is still present diff --git a/src/modules/NeonServ.mod/cmd_neonserv_nicklist.c b/src/modules/NeonServ.mod/cmd_neonserv_nicklist.c index 129d79c..1231160 100644 --- a/src/modules/NeonServ.mod/cmd_neonserv_nicklist.c +++ b/src/modules/NeonServ.mod/cmd_neonserv_nicklist.c @@ -129,7 +129,7 @@ static void neonserv_cmd_nicklist_async1(struct ClientSocket *client, struct Cli int chanuser_count; char statebuf[5]; char accessbuf[50]; - char viscountbuf[5]; + char viscountbuf[50]; int uaccess; i = 3; @@ -278,7 +278,10 @@ static void neonserv_cmd_nicklist_async1(struct ClientSocket *client, struct Cli accessbufpos += sprintf(accessbuf+accessbufpos, ")"); content[2] = accessbuf; if(flags & NEONSERV_CMD_NICKLIST_FLAG_VISCOUNT) { - sprintf(viscountbuf, "%d", chanuser->visCount); + if(chanuser->flags & CHANUSERFLAG_PARTING) + sprintf(viscountbuf, "%d (\003P\003 %d)", chanuser->visCount, chanuser->old_visCount); + else + sprintf(viscountbuf, "%d", chanuser->visCount); content[3] = viscountbuf; } table_add(table, content);