X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2FIRCParser.c;h=d13c173b7af02949ccc05011ca7623f8dad39184;hb=bd91d8494c482eed01bf23f7bc8cae540cfee571;hp=aeb0e6d40eb9480f09b8f894d5cbd464cb57435a;hpb=18753ca5e6e98cc29487dbbdacec5b62bac34de3;p=NeonServV5.git diff --git a/src/IRCParser.c b/src/IRCParser.c index aeb0e6d..d13c173 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; @@ -175,10 +188,15 @@ static IRC_CMD(raw_join) { event_registered(user, from); user->flags &= ~USERFLAG_WAS_REGISTERING; } else if(!(chan->flags & CHANFLAG_RECEIVED_USERLIST)) { + if(client->user != user) { //bots are allowed to add themselves + DESYNCHRONIZE(cache_sync); + return 1; //ignore join + } + 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 + if(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); @@ -267,6 +285,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 +343,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! @@ -391,7 +413,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 && !(user->flags & USERFLAG_WAS_REGISTERING)) { delChanUser(chanuser, 0); //not free, yet! event_part(chanuser, 1, argv[0]); if((chanuser->chan->flags & CHANFLAG_RECEIVED_USERLIST) && !(chanuser->chan->flags & CHANFLAG_REJOINING)) @@ -427,12 +449,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); } }