Merge branch 'development'
[NeonServV5.git] / src / WHOHandler.c
index e7ffb62ad9aa3c92552468fb9da54d57bf755a60..5db3db6a3d58be68ad50a402308033f61d004c6c 100644 (file)
@@ -1,4 +1,4 @@
-/* WHOHandler.c - NeonServ v5.4
+/* WHOHandler.c - NeonServ v5.6
  * Copyright (C) 2011-2012  Philipp Kreil (pk910)
  * 
  * This program is free software: you can redistribute it and/or modify
@@ -23,6 +23,7 @@
 #include "ClientSocket.h"
 #include "IPNode.h"
 #include "modules.h"
+#include "log.h"
 
 #define WHOQUEUETYPE_ISONQUEUE 0x01
 #define WHOQUEUETYPE_USERLIST  0x02
@@ -30,7 +31,7 @@
 #define WHOQUEUETYPE_CHECKTYPE 0x07
 #define WHOQUEUETYPE_FOUND     0x08
 
-#define MAXCALLBACKS 3
+#define MAXCALLBACKS 10
 
 struct WHOQueueEntry {
     char type;
@@ -65,7 +66,7 @@ static struct WHOQueueEntry* addWHOQueueEntry(struct ClientSocket *client) {
     struct WHOQueueEntry *entry = malloc(sizeof(*entry));
     if (!entry)
     {
-        perror("malloc() failed");
+        printf_log("main", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__);
         DESYNCHRONIZE(whohandler_sync);
         return NULL;
     }
@@ -215,7 +216,7 @@ void get_userauth(struct UserNode *user, int module_id, userauth_callback_t call
         callback(bot, user->nick, NULL, data);
         return;
     }
-    if((user->flags & (USERFLAG_ISAUTHED | USERFLAG_ISIRCOP | USERFLAG_ISBOT | USERFLAG_ISSERVER)) || (time(0) - user->last_who) <= REWHO_TIMEOUT) {
+    if((user->flags & (USERFLAG_ISAUTHED | USERFLAG_ISSERVER)) || (time(0) - user->last_who) <= REWHO_TIMEOUT) {
         callback(bot, user->nick, user, data);
         return;
     }
@@ -285,11 +286,9 @@ static void _recv_whohandler_354(struct ClientSocket *client, char **argv, unsig
         
         struct UserNode *user = getUserByNick(argv[5]);
         struct ChanUser *chanuser;
-        if((chanuserflags & CHANUSERFLAG_INVISIBLE)) {
-            if(!user) {
-                user = createTempUser(argv[5]);
-                user->flags |= USERFLAG_ISTMPUSER;
-            }
+        if((chanuserflags & CHANUSERFLAG_INVISIBLE) && (!user || (user && !isBot(user)))) {
+            user = createTempUser(argv[5]); //always add a temponary user to prevent cache problems when the user joins right now (while it's stored in our cache as being invisible)
+            user->flags |= USERFLAG_ISTMPUSER;
             chan->flags |= CHANFLAG_HAVE_INVISIBLES;
             chanuser = addInvisibleChanUser(chan, user);
             chanuser->flags = (chanuser->flags & ~CHANUSERFLAG_OPPED_OR_VOICED) | chanuserflags;