From a2a7e52f6be12cccfc69cb85c4df521a746bba6c Mon Sep 17 00:00:00 2001 From: pk910 Date: Tue, 29 Nov 2011 23:50:18 +0100 Subject: [PATCH] tried to make NeonServ fully ZNC compatible (shared cache problems) --- src/IRCParser.c | 52 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 11 deletions(-) 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; } } -- 2.20.1