X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2FIRCParser.c;h=b757f5dc4d28ca18c9af2f356120ded843736a97;hb=a2a7e52f6be12cccfc69cb85c4df521a746bba6c;hp=b3fa2506a9455e925026d6ba964d341d1b300204;hpb=b3b7b7d6bbe39c6077e353764a6dfbffb6434ea6;p=NeonServV5.git diff --git a/src/IRCParser.c b/src/IRCParser.c index b3fa250..b757f5d 100644 --- a/src/IRCParser.c +++ b/src/IRCParser.c @@ -116,7 +116,10 @@ static USERLIST_CALLBACK(got_channel_userlist) { } static IRC_CMD(raw_001) { - client->user = addUser(argv[0]); + struct UserNode *user = getUserByNick(argv[0]); + if(!user) + user = addUser(argv[0]); + client->user = user; client->user->flags |= USERFLAG_ISBOT; client->flags |= SOCKET_FLAG_READY; event_bot_ready(client); @@ -149,6 +152,20 @@ static int is_firstBotSeeUser(struct ClientSocket *client, struct UserNode *user return 0; } +static int is_onlyBotSeeUser(struct ClientSocket *client, struct UserNode *user) { + struct ClientSocket *bot; + struct ChanUser *chanuser; + for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) { + if(bot == client) continue; + for(chanuser = getUserChannels(bot->user, NULL); chanuser; chanuser = getUserChannels(bot->user, chanuser)) { + if(isUserOnChan(user, chanuser->chan)) { + return 0; + } + } + } + return 1; +} + static IRC_CMD(raw_join) { if(from == NULL || argc < 1) return 0; struct UserNode *user = getUserByMask(from); @@ -229,6 +246,8 @@ static IRC_CMD(raw_quit) { struct UserNode *user = getUserByMask(from); if(user == NULL) return 0; if(!is_firstBotSeeUser(client, user)) return 1; //we ignore it - but it's not a parse error + int registering = !stricmp(argv[0], "Registered"); + if((registering && (user->flags & USERFLAG_ISBOT))) return 1; //bot is registering - just ignore it delUser(user, 0); //a little bit crazy, but we want to delete the user on the channel's userlists - but not the users channel list event_quit(user, argv[0]); if(user->flags & USERFLAG_ISBOT) { @@ -248,7 +267,7 @@ static IRC_CMD(raw_quit) { } } } - if(!stricmp(argv[0], "Registered") && !(user->flags & USERFLAG_ISBOT)) { + if(registering && !(user->flags & USERFLAG_ISBOT)) { user->next = registering_users; user->created = time(0); registering_users = user; @@ -261,16 +280,27 @@ void bot_disconnect(struct ClientSocket *client) { struct UserNode *user = client->user; struct ChanUser *chanuser, *next; if(user) { - delUser(user, 0); - event_quit(user, "disconnected"); - for(chanuser = getUserChannels(user, NULL); chanuser; chanuser = next) { - next = getUserChannels(user, chanuser); - if(chanuser->chan->chanbot == user) - checkChannelVisibility(chanuser->chan); - freeChanUser(chanuser); + if(is_onlyBotSeeUser(client, user)) { + //ok the bot-user is not seen by any other bots so we can simply free it. + delUser(user, 0); + event_quit(user, "disconnected"); + for(chanuser = getUserChannels(user, NULL); chanuser; chanuser = next) { + next = getUserChannels(user, chanuser); + if(chanuser->chan->chanbot == user) + checkChannelVisibility(chanuser->chan); + freeChanUser(chanuser); + } + user->channel = NULL; + delUser(user, 1); //now we fully free the user + } else { + //we need to transform the bot-user back to a normal user (BNC FIX) + user->flags &= ~USERFLAG_ISBOT; + for(chanuser = getUserChannels(user, NULL); chanuser; chanuser = next) { + next = getUserChannels(user, chanuser); + if(chanuser->chan->chanbot == user) + checkChannelVisibility(chanuser->chan); + } } - user->channel = NULL; - delUser(user, 1); //now we fully free the user client->user = NULL; } }