X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=blobdiff_plain;f=src%2FIRCParser.c;h=f9e79e0c127c720b34a67f96db5217334d0a2738;hp=156afb3c04245e7524ed5801f8bef7c05d703679;hb=4b9de3472bf8bb35214bd3c31289b7c601304686;hpb=c99b8d5951fe6429844c8cb5ff94213bb625ad95 diff --git a/src/IRCParser.c b/src/IRCParser.c index 156afb3..f9e79e0 100644 --- a/src/IRCParser.c +++ b/src/IRCParser.c @@ -99,8 +99,34 @@ 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; + chanuser->visCount++; + } +} + +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; + + increase_viscount_butone(chanuser->chan, chanuser); + event_join(chanuser); } @@ -144,12 +170,28 @@ static IRC_CMD(raw_join) { event_registered(user, from); user->flags &= ~USERFLAG_WAS_REGISTERING; + } else if(!(chan->flags & CHANFLAG_RECEIVED_USERLIST)) { + if(!isBot(user)) { + DESYNCHRONIZE(cache_sync); + return 1; //ignore join + } + + chanuser = addChanUser(chan, user); + chanuser->visCount = 1; + + 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); } else if(!isUserOnChan(user, chan)) { //join user to an existing channel 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; + 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); @@ -167,6 +209,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; } @@ -222,6 +268,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! @@ -278,6 +326,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! @@ -346,7 +396,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)) @@ -382,12 +432,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) { + 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); } }