From 854e38b76f6ca963c0def2dd0e71153a56f2930c Mon Sep 17 00:00:00 2001 From: pk910 Date: Wed, 5 Sep 2012 16:23:51 +0200 Subject: [PATCH] fixed possible cache errors due receive time shifts --- src/ChanNode.c | 1 + src/ChanNode.h | 1 + src/IRCParser.c | 21 ++++++++++++++++++--- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/ChanNode.c b/src/ChanNode.c index 1ea32d4..4dd16b3 100644 --- a/src/ChanNode.c +++ b/src/ChanNode.c @@ -138,6 +138,7 @@ struct ChanNode* addChannel(const char *name) { chan->bans = NULL; chan->spam_settings = NULL; chan->usercount = 0; + chan->botcount = 0; chan->topic[0] = 0; chan->flags = 0; /* mode lists */ diff --git a/src/ChanNode.h b/src/ChanNode.h index f17792f..eba80af 100644 --- a/src/ChanNode.h +++ b/src/ChanNode.h @@ -37,6 +37,7 @@ struct ChanNode { char topic[TOPICLEN+1]; struct ChanUser *user; unsigned int usercount; + unsigned int botcount; unsigned char flags; struct ModeNode *modes; struct BanNode *bans; diff --git a/src/IRCParser.c b/src/IRCParser.c index bd505f2..c8cd526 100644 --- a/src/IRCParser.c +++ b/src/IRCParser.c @@ -322,6 +322,7 @@ static IRC_CMD(raw_join) { chan = addChannel(argv[0]); chanuser = addChanUser(chan, user); chanuser->visCount = 1; + chan->botcount = 1; get_userlist_with_invisible(chan, 0, got_channel_userlist, chanuser); putsock(client, "MODE %s", chan->name); putsock(client, "MODE %s +b", chan->name); @@ -341,6 +342,7 @@ static IRC_CMD(raw_join) { chanuser = addChanUser(chan, user); chanuser->visCount = 1; + chan->botcount++; if(isModeSet(chan->modes, 'D')) //if the bot joins a channel it could also be invisible chanuser->flags |= CHANUSERFLAG_INVISIBLE; @@ -354,6 +356,7 @@ static IRC_CMD(raw_join) { if(isModeSet(chan->modes, 'D')) //if the bot joins a channel it could also be invisible chanuser->flags |= CHANUSERFLAG_INVISIBLE; increase_viscount_butone(chan, chanuser); + chan->botcount++; } event_join(chanuser); @@ -368,8 +371,15 @@ static IRC_CMD(raw_join) { chanuser = getChanUser(user, chan); chanuser->visCount++; - if(isBot(user) && client->user == user) + if(isBot(user) && client->user == user) { increase_viscount_butone(chan, chanuser); + chan->botcount++; + } + + if(chanuser->visCount > chan->botcount) { + chanuser->visCount = chan->botcount; + //TODO: Trigger WARNING + } //if multiple bots see the user, it can't be invisible chanuser->flags &= ~CHANUSERFLAG_INVISIBLE; @@ -388,8 +398,10 @@ static IRC_CMD(raw_part) { DESYNCHRONIZE(cache_sync); return 0; } - if(isBot(user) && user == client->user) + if(isBot(user) && user == client->user) { decrease_viscount_butone(chan, chanuser); + chan->botcount--; + } chanuser->visCount--; if(chanuser->visCount == 0) { delChanUser(chanuser, 0); //not free, yet! @@ -441,8 +453,10 @@ static IRC_CMD(raw_kick) { DESYNCHRONIZE(cache_sync); return 0; } - if(isBot(target) && target == client->user) + if(isBot(target) && target == client->user) { decrease_viscount_butone(chan, chanuser); + chan->botcount--; + } chanuser->visCount--; if(chanuser->visCount == 0) { delChanUser(chanuser, 0); //not free, yet! @@ -546,6 +560,7 @@ void bot_disconnect(struct ClientSocket *client) { for(chanuser = getUserChannels(user, NULL); chanuser; chanuser = next_chanuser) { next_chanuser = getUserChannels(user, chanuser); decrease_viscount_butone(chanuser->chan, chanuser); + chanuser->chan->botcount--; chanuser->visCount--; if(chanuser->visCount <= 0) { delChanUser(chanuser, 0); //not free, yet! -- 2.20.1