fixed invisible nicklist (bots need to be added even if they join invisible)
authorpk910 <philipp@zoelle1.de>
Wed, 14 Dec 2011 20:30:15 +0000 (21:30 +0100)
committerpk910 <philipp@zoelle1.de>
Wed, 14 Dec 2011 20:30:15 +0000 (21:30 +0100)
src/IRCParser.c
src/WHOHandler.c

index 3e7c0b5347d4c04858ccfc6fd622afd16a1406ba..e96063e54ff0219aebcf469f8604c4d1f38e31fd 100644 (file)
@@ -171,7 +171,8 @@ static IRC_CMD(raw_join) {
     struct UserNode *user = getUserByMask(from);
     struct ChanNode *chan = getChanByName(argv[0]);
     if(!chan && !(user->flags & USERFLAG_ISBOT)) return 0;
-    if(chan && chan->chanbot != client->user) return 1; //we ignore it - but it's not a parse error
+    if(chan && ((!isBot(user) && chan->chanbot != client->user) || (isBot(user) && client->user != user))) return 1; //we ignore it - but it's not a parse error
+    //let Bots always add themselves! (maybe they join invisible)
     if(user == NULL) {
         user = addUserMask(from);
     }
@@ -204,8 +205,10 @@ static IRC_CMD(raw_join) {
         get_userlist(chan, got_channel_userlist, chanuser);
         putsock(client, "MODE %s", chan->name);
         putsock(client, "MODE %s +b", chan->name);
-    } else if(!isUserOnChan(user, chan) && (chan->flags & CHANFLAG_RECEIVED_USERLIST)) {
+    } else if(!isUserOnChan(user, chan) && ((chan->flags & CHANFLAG_RECEIVED_USERLIST) || isBot(user))) {
         struct ChanUser *chanuser = addChanUser(chan, user);
+        if(isModeSet(chan->modes, 'D'))
+            chanuser->flags |= CHANUSERFLAG_INVISIBLE;
         if(!noEvent) {
             if(wasRegistering)
                 user->flags |= USERFLAG_WAS_REGISTRING;
@@ -271,7 +274,7 @@ static IRC_CMD(raw_part) {
     if(user == NULL) return 0;
     struct ChanNode *chan = getChanByName(argv[0]);
     if(chan == NULL) return 0;
-    if(chan->chanbot != client->user) return 1; //we ignore it - but it's not a parse error
+    if((!isBot(user) && chan->chanbot != client->user) || (isBot(user) && client->user != user)) return 1; //we ignore it - but it's not a parse error
     int keep_channel = 1;
     if(chan->chanbot == user && (chan->flags & CHANFLAG_REJOINING)) {
         struct ClientSocket **clients = chan->rejoin_array;
@@ -385,7 +388,7 @@ static IRC_CMD(raw_kick) {
     struct UserNode *target = getUserByNick(argv[1]);
     struct ChanNode *chan = getChanByName(argv[0]);
     if(chan == NULL || target == NULL) return 0;
-    if(chan->chanbot != client->user) return 1; //we ignore it - but it's not a parse error
+    if(((!isBot(user) && chan->chanbot != client->user) || (isBot(user) && client->user != user))) return 1; //we ignore it - but it's not a parse error
     int keep_channel = 1;
     if(isUserOnChan(target, chan) && (chan->flags & CHANFLAG_RECEIVED_USERLIST)) {
         if(user == NULL) {
index c8c65820043017651b46e52ac13b76bdeacfca04..f7287a3cf367a48cad2f0543f0b22d1b342d72a1 100644 (file)
@@ -222,16 +222,15 @@ void recv_whohandler_354(struct ClientSocket *client, char **argv, unsigned int
             }
         }
         
-        struct UserNode *user;
+        struct UserNode *user = getUserByNick(argv[4]);
         struct ChanUser *chanuser;
-        if(chanuserflags & CHANUSERFLAG_INVISIBLE) {
+        if((chanuserflags & CHANUSERFLAG_INVISIBLE) && !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]);
             }
@@ -290,7 +289,7 @@ void recv_whohandler_315(struct ClientSocket *client, char **argv, unsigned int
             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);
                 }
             }