From 2da0e142dbb1c4dcc89116f0acdb1835c123179c Mon Sep 17 00:00:00 2001 From: pk910 Date: Tue, 21 Aug 2012 00:00:33 +0200 Subject: [PATCH] fixed cache update when a bot disconnects from the network / parts a channel --- src/IRCParser.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/IRCParser.c b/src/IRCParser.c index aeb0e6d..0188de9 100644 --- a/src/IRCParser.c +++ b/src/IRCParser.c @@ -126,6 +126,19 @@ static void increase_viscount_butone(struct ChanNode *chan, struct ChanUser *ign } } +static void decrease_viscount_butone(struct ChanNode *chan, struct ChanUser *ignore) { + struct ChanUser *chanuser, *next_chanuser; + + for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = next_chanuser) { + next_chanuser = getChannelUsers(chan, chanuser); + if(chanuser == ignore) + continue; + chanuser->visCount--; + if(chanuser->visCount <= 0) + delChanUser(chanuser, 1); + } +} + static USERLIST_CALLBACK(got_channel_userlist) { struct ChanUser *chanuser = data; @@ -267,6 +280,8 @@ static IRC_CMD(raw_part) { DESYNCHRONIZE(cache_sync); return 0; } + if(isBot(user) && user == client->user) + decrease_viscount_butone(chan, chanuser); chanuser->visCount--; if(chanuser->visCount == 0) { delChanUser(chanuser, 0); //not free, yet! @@ -323,6 +338,8 @@ static IRC_CMD(raw_kick) { DESYNCHRONIZE(cache_sync); return 0; } + if(isBot(target) && target == client->user) + decrease_viscount_butone(chan, chanuser); chanuser->visCount--; if(chanuser->visCount == 0) { delChanUser(chanuser, 0); //not free, yet! @@ -427,12 +444,13 @@ void bot_disconnect(struct ClientSocket *client) { struct ChanUser *chanuser, *next_chanuser; for(chanuser = getUserChannels(user, NULL); chanuser; chanuser = next_chanuser) { next_chanuser = getUserChannels(user, chanuser); + decrease_viscount_butone(chanuser->chan, chanuser); chanuser->visCount--; if(chanuser->visCount <= 0) { delChanUser(chanuser, 0); //not free, yet! event_part(chanuser, 1, "QUIT"); - if((chanuser->chan->flags & CHANFLAG_RECEIVED_USERLIST) && !(chanuser->chan->flags & CHANFLAG_REJOINING)) - check_full_rejoin(chanuser->chan); + if(chanuser->chan->flags & CHANFLAG_RECEIVED_USERLIST) + checkChannelVisibility(chanuser->chan); freeChanUser(chanuser); } } -- 2.20.1