case '@':
chanuserflags |= CHANUSERFLAG_OPPED;
break;
+ case '%':
+ chanuserflags |= CHANUSERFLAG_HALFOPPED;
+ break;
case '+':
chanuserflags |= CHANUSERFLAG_VOICED;
break;
}
}
- struct UserNode *user;
+ struct UserNode *user = getUserByNick(argv[4]);
struct ChanUser *chanuser;
- if(chanuserflags & CHANUSERFLAG_INVISIBLE) {
+ if((chanuserflags & CHANUSERFLAG_INVISIBLE) && (!user || !isBot(user))) {
user = createTempUser(argv[4]);
user->flags |= USERFLAG_ISTMPUSER;
chan->flags |= CHANFLAG_HAVE_INVISIBLES;
chanuser = addInvisibleChanUser(chan, user);
chanuser->flags = (chanuser->flags & ~CHANUSERFLAG_OPPED_OR_VOICED) | chanuserflags;
} else {
- user = getUserByNick(argv[4]);
if(user == NULL) {
user = addUser(argv[4]);
}
if(!(chanuser = getChanUser(user, chan))) {
chanuser = addChanUser(chan, user);
}
- chanuser->flags = (chanuser->flags & ~CHANUSERFLAG_OPPED_OR_VOICED) | chanuserflags;
+ chanuser->flags = (chanuser->flags & ~(CHANUSERFLAG_OPPED_OR_VOICED | CHANUSERFLAG_INVISIBLE)) | chanuserflags;
}
user->flags = (user->flags & ~USERFLAG_ISIRCOP) | userflags;
user->last_who = time(0);
struct ChanUser *chanuser, *next;
for(chanuser = getChannelUsers(entry->chan, NULL); chanuser; chanuser = next) {
next = getChannelUsers(entry->chan, chanuser);
- if(chanuser->flags & CHANUSERFLAG_INVISIBLE) {
+ if((chanuser->flags & CHANUSERFLAG_INVISIBLE) && !isBot(chanuser->user)) {
delChanUser(chanuser, 1);
}
}