1 /* ChanUser.c - NeonServ v5.4
2 * Copyright (C) 2011-2012 Philipp Kreil (pk910)
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) {
24 struct ChanUser *chanuser = malloc(sizeof(*chanuser));
27 perror("malloc() failed");
31 chanuser->user = user;
32 chanuser->chan = chan;
33 chanuser->visCount = 0;
35 chanuser->changeTime = 0;
36 chanuser->spamnode = NULL;
38 SYNCHRONIZE(cache_sync);
40 chanuser->next_user = chan->user;
41 chan->user = chanuser;
44 chanuser->next_chan = user->channel;
45 user->channel = chanuser;
47 DESYNCHRONIZE(cache_sync);
52 struct ChanUser* addInvisibleChanUser(struct ChanNode *chan, struct UserNode *user) {
53 struct ChanUser *chanuser = malloc(sizeof(*chanuser));
56 perror("malloc() failed");
59 chanuser->flags = CHANUSERFLAG_INVISIBLE;
60 chanuser->user = user;
61 chanuser->chan = chan;
62 chanuser->visCount = 0;
64 chanuser->changeTime = 0;
65 chanuser->spamnode = NULL;
67 SYNCHRONIZE(cache_sync);
68 chanuser->next_user = chan->user;
69 chan->user = chanuser;
70 DESYNCHRONIZE(cache_sync);
76 int isUserOnChan(struct UserNode *user, struct ChanNode *chan) {
77 struct ChanUser *chanuser;
78 if(isModeSet(chan->modes, 'd') || isModeSet(chan->modes, 'D')) {
79 for(chanuser = chan->user; chanuser; chanuser = chanuser->next_user) {
80 if(chanuser->user == user)
84 for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
85 if(chanuser->chan == chan)
92 struct ChanUser* getChanUser(struct UserNode *user, struct ChanNode *chan) {
93 struct ChanUser *chanuser;
94 if(isModeSet(chan->modes, 'd') || isModeSet(chan->modes, 'D')) {
95 for(chanuser = chan->user; chanuser; chanuser = chanuser->next_user) {
96 if(chanuser->user == user)
100 for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
101 if(chanuser->chan == chan)
108 struct ChanUser* getChannelUsers(struct ChanNode *chan, struct ChanUser *last) {
112 return last->next_user;
115 struct ChanUser* getUserChannels(struct UserNode *user, struct ChanUser *last) {
117 return user->channel;
119 return last->next_chan;
122 void delChanUser(struct ChanUser *chanuser, int do_freeChanUser) {
123 SYNCHRONIZE(cache_sync);
124 struct ChanUser *cchanuser, *last;
125 //remove it from the user's channel-list
126 if(!(chanuser->flags & CHANUSERFLAG_INVISIBLE)) {
128 for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
129 if(cchanuser == chanuser) {
131 last->next_chan = chanuser->next_chan;
133 chanuser->user->channel = chanuser->next_chan;
140 //remove it from the channel's user-list
142 for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
143 if(cchanuser == chanuser) {
144 chanuser->chan->usercount--;
146 last->next_user = chanuser->next_user;
148 chanuser->chan->user = chanuser->next_user;
154 if(do_freeChanUser) {
155 freeChanUser(chanuser);
157 chanuser->next_chan = NULL;
158 chanuser->next_user = NULL;
160 DESYNCHRONIZE(cache_sync);
163 void removeChanUserFromLists(struct ChanUser *chanuser, int remove_from_userlist, int remove_from_channellist, int do_freeChanUser) {
164 SYNCHRONIZE(cache_sync);
165 struct ChanUser *cchanuser, *last;
166 if(remove_from_userlist) {
167 //remove it from the channel's user-list
169 for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
170 if(cchanuser == chanuser) {
171 chanuser->chan->usercount--;
173 last->next_user = chanuser->next_user;
175 chanuser->chan->user = chanuser->next_user;
180 chanuser->next_user = NULL;
182 if(remove_from_channellist) {
183 //remove it from the user's channel-list
185 for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
186 if(cchanuser == chanuser) {
188 last->next_chan = chanuser->next_chan;
190 chanuser->user->channel = chanuser->next_chan;
195 chanuser->next_chan = NULL;
198 if(do_freeChanUser) {
199 freeChanUser(chanuser);
201 DESYNCHRONIZE(cache_sync);
204 void freeChanUser(struct ChanUser *chanuser) {
205 if(chanuser->spamnode)
206 free(chanuser->spamnode);