X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=blobdiff_plain;f=src%2FIRCParser.c;h=ff244a05043c98384c978b0dca68e8bca1a01be2;hp=bd505f23ab514ff92106d39602d6a8ed53b3e2e6;hb=4812835346f724fcea86e78f741cc6c72c86b676;hpb=ab202224a669025ff7dbf50549d7ac4a337d7fc7 diff --git a/src/IRCParser.c b/src/IRCParser.c index bd505f2..ff244a0 100644 --- a/src/IRCParser.c +++ b/src/IRCParser.c @@ -1,4 +1,4 @@ -/* IRCParser.c - NeonServ v5.5 +/* IRCParser.c - NeonServ v5.6 * Copyright (C) 2011-2012 Philipp Kreil (pk910) * * This program is free software: you can redistribute it and/or modify @@ -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); @@ -333,14 +334,21 @@ static IRC_CMD(raw_join) { event_registered(user, from); user->flags &= ~USERFLAG_WAS_REGISTERING; + if(user->last_who > REWHO_TIMEOUT) + user->last_who -= REWHO_TIMEOUT; + + event_join(chanuser); } 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(!(chanuser = getChanUser(user, chan))) { + chanuser = addChanUser(chan, user); + } + chanuser->visCount++; + chan->botcount++; if(isModeSet(chan->modes, 'D')) //if the bot joins a channel it could also be invisible chanuser->flags |= CHANUSERFLAG_INVISIBLE; @@ -354,6 +362,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 +377,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,13 +404,28 @@ 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--; + } + if(chanuser->flags & CHANUSERFLAG_PARTING) + chanuser->old_visCount--; chanuser->visCount--; if(chanuser->visCount == 0) { delChanUser(chanuser, 0); //not free, yet! event_part(chanuser, 0, (argc > 1 ? argv[1] : NULL)); freeChanUser(chanuser); + } else if(!(chanuser->flags & CHANUSERFLAG_PARTING)) { + chanuser->flags |= CHANUSERFLAG_PARTING; + chanuser->old_visCount = chanuser->visCount; + } else if(chanuser->old_visCount == 0) { + int visCount = chanuser->visCount; + delChanUser(chanuser, 0); //not free, yet! + event_part(chanuser, 0, (argc > 1 ? argv[1] : NULL)); + freeChanUser(chanuser); + chanuser = addChanUser(chan, user); + chanuser->visCount = visCount; + event_join(chanuser); } //check if channel is still present @@ -441,8 +472,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 +579,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!