-/* 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
#include "ClientSocket.h"
#include "IPNode.h"
#include "modules.h"
+#include "log.h"
#define WHOQUEUETYPE_ISONQUEUE 0x01
#define WHOQUEUETYPE_USERLIST 0x02
#define WHOQUEUETYPE_CHECKTYPE 0x07
#define WHOQUEUETYPE_FOUND 0x08
-#define MAXCALLBACKS 3
+#define MAXCALLBACKS 10
struct WHOQueueEntry {
char type;
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;
}
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;
}
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;