-/* ChanUser.c - NeonServ v5.3
+/* ChanUser.c - NeonServ v5.4
* Copyright (C) 2011-2012 Philipp Kreil (pk910)
*
* This program is free software: you can redistribute it and/or modify
#include "ChanUser.h"
#include "ChanNode.h"
+#include "ModeNode.h"
#include "UserNode.h"
struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) {
- struct ChanUser *chanuser = malloc(sizeof(*chan));
+ struct ChanUser *chanuser = malloc(sizeof(*chanuser));
if (!chanuser)
{
perror("malloc() failed");
chanuser->flags = 0;
chanuser->user = user;
chanuser->chan = chan;
+ chanuser->visCount = 0;
chanuser->changeTime = 0;
chanuser->spamnode = NULL;
}
struct ChanUser* addInvisibleChanUser(struct ChanNode *chan, struct UserNode *user) {
- struct ChanUser *chanuser = malloc(sizeof(*chan));
+ struct ChanUser *chanuser = malloc(sizeof(*chanuser));
if (!chanuser)
{
perror("malloc() failed");
chanuser->flags = CHANUSERFLAG_INVISIBLE;
chanuser->user = user;
chanuser->chan = chan;
+ chanuser->visCount = 0;
chanuser->changeTime = 0;
chanuser->spamnode = NULL;
int isUserOnChan(struct UserNode *user, struct ChanNode *chan) {
struct ChanUser *chanuser;
- for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
- if(chanuser->chan == chan)
- return 1;
+ if(isModeSet(chan->modes, 'd') || isModeSet(chan->modes, 'D')) {
+ for(chanuser = chan->user; chanuser; chanuser = chanuser->next_user) {
+ if(chanuser->user == user)
+ return 1;
+ }
+ } else {
+ for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
+ if(chanuser->chan == chan)
+ return 1;
+ }
}
return 0;
}
struct ChanUser* getChanUser(struct UserNode *user, struct ChanNode *chan) {
struct ChanUser *chanuser;
- for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
- if(chanuser->chan == chan)
- return chanuser;
+ if(isModeSet(chan->modes, 'd') || isModeSet(chan->modes, 'D')) {
+ for(chanuser = chan->user; chanuser; chanuser = chanuser->next_user) {
+ if(chanuser->user == user)
+ return chanuser;
+ }
+ } else {
+ for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
+ if(chanuser->chan == chan)
+ return chanuser;
+ }
}
return NULL;
}