From 2889b84886d0816ffb5aeedd14487cdc44fa81f3 Mon Sep 17 00:00:00 2001 From: pk910 Date: Mon, 20 Aug 2012 23:24:15 +0200 Subject: [PATCH] fixed initial cache buildup (increase viscount per bot on join) --- src/IRCParser.c | 36 ++++++++++++++++++++++++++++++++---- src/WHOHandler.c | 2 +- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/IRCParser.c b/src/IRCParser.c index efbdbfd..e2a53aa 100644 --- a/src/IRCParser.c +++ b/src/IRCParser.c @@ -116,8 +116,21 @@ static void parse_raw(struct ClientSocket *client, char *from, char *cmd, char * } } +static void increase_viscount_butone(struct ChanNode *chan, struct ChanUser *ignore) { + struct ChanUser *chanuser; + + for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) { + if(chanuser == ignore) + continue; + chanuser2->visCount++; + } +} + static USERLIST_CALLBACK(got_channel_userlist) { struct ChanUser *chanuser = data; + + increase_viscount_butone(chanuser->chan, chanuser); + event_join(chanuser); } @@ -161,13 +174,24 @@ static IRC_CMD(raw_join) { event_registered(user, from); user->flags &= ~USERFLAG_WAS_REGISTERING; - } else if(!isUserOnChan(user, chan)) { - //join user to an existing channel + } else if(!(chan->flags & CHANFLAG_RECEIVED_USERLIST)) { chanuser = addChanUser(chan, user); chanuser->visCount = 1; + if(isBot(user) && isModeSet(chan->modes, 'D')) //if the bot joins a channel it could also be invisible chanuser->flags |= CHANUSERFLAG_INVISIBLE; + get_userlist_with_invisible(chan, 0, got_channel_userlist, chanuser); + } else if(!isUserOnChan(user, chan)) { + //join user to an existing channel + chanuser = addChanUser(chan, user); + chanuser->visCount = 1; + if(isBot(user)) { + 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); + } + event_join(chanuser); if(!(user->flags & USERFLAG_ISBOT) && (chan->flags & CHANFLAG_REJOINING)) { @@ -184,6 +208,10 @@ static IRC_CMD(raw_join) { //user is already in the channel chanuser = getChanUser(user, chan); chanuser->visCount++; + + if(isBot(user) && !(chanuser->flags & CHANUSERFLAG_INVISIBLE)) + increase_viscount_butone(chan, chanuser); + //if multiple bots see the user, it can't be invisible chanuser->flags &= ~CHANUSERFLAG_INVISIBLE; } @@ -363,7 +391,7 @@ static IRC_CMD(raw_quit) { for(chanuser = getUserChannels(user, NULL); chanuser; chanuser = next_chanuser) { next_chanuser = getUserChannels(user, chanuser); chanuser->visCount--; - if(chanuser->visCount == 0) { + if(chanuser->visCount <= 0) { delChanUser(chanuser, 0); //not free, yet! event_part(chanuser, 1, argv[0]); if((chanuser->chan->flags & CHANFLAG_RECEIVED_USERLIST) && !(chanuser->chan->flags & CHANFLAG_REJOINING)) @@ -400,7 +428,7 @@ void bot_disconnect(struct ClientSocket *client) { for(chanuser = getUserChannels(user, NULL); chanuser; chanuser = next_chanuser) { next_chanuser = getUserChannels(user, chanuser); chanuser->visCount--; - if(chanuser->visCount == 0) { + 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)) diff --git a/src/WHOHandler.c b/src/WHOHandler.c index 7a8a354..1378678 100644 --- a/src/WHOHandler.c +++ b/src/WHOHandler.c @@ -30,7 +30,7 @@ #define WHOQUEUETYPE_CHECKTYPE 0x07 #define WHOQUEUETYPE_FOUND 0x08 -#define MAXCALLBACKS 3 +#define MAXCALLBACKS 10 struct WHOQueueEntry { char type; -- 2.20.1