}
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);
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);
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) {
}
}
}
- 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;
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;
}
}