}
}
+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);
}
event_registered(user, from);
user->flags &= ~USERFLAG_WAS_REGISTERING;
+ } 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(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);
//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;
}
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!
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!
for(chanuser = getUserChannels(user, NULL); chanuser; chanuser = next_chanuser) {
next_chanuser = getUserChannels(user, chanuser);
chanuser->visCount--;
- if(chanuser->visCount == 0) {
+ if(chanuser->visCount <= 0 && !(user->flags & USERFLAG_WAS_REGISTERING)) {
delChanUser(chanuser, 0); //not free, yet!
event_part(chanuser, 1, argv[0]);
if((chanuser->chan->flags & CHANFLAG_RECEIVED_USERLIST) && !(chanuser->chan->flags & CHANFLAG_REJOINING))
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);
}
}