1 /* ChanUser.c - NeonServ v5.6
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/>.
24 struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) {
25 struct ChanUser *chanuser = malloc(sizeof(*chanuser));
28 printf_log("main", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__);
32 chanuser->user = user;
33 chanuser->chan = chan;
34 chanuser->visCount = 0;
36 chanuser->changeTime = 0;
37 chanuser->spamnode = NULL;
39 SYNCHRONIZE(cache_sync);
41 chanuser->next_user = chan->user;
42 chan->user = chanuser;
45 chanuser->next_chan = user->channel;
46 user->channel = chanuser;
48 DESYNCHRONIZE(cache_sync);
53 struct ChanUser* addInvisibleChanUser(struct ChanNode *chan, struct UserNode *user) {
54 struct ChanUser *chanuser = malloc(sizeof(*chanuser));
57 printf_log("main", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__);
60 chanuser->flags = CHANUSERFLAG_INVISIBLE;
61 chanuser->user = user;
62 chanuser->chan = chan;
63 chanuser->visCount = 0;
65 chanuser->changeTime = 0;
66 chanuser->spamnode = NULL;
68 SYNCHRONIZE(cache_sync);
69 chanuser->next_user = chan->user;
70 chan->user = chanuser;
71 DESYNCHRONIZE(cache_sync);
77 int isUserOnChan(struct UserNode *user, struct ChanNode *chan) {
78 struct ChanUser *chanuser;
79 if(isModeSet(chan->modes, 'd') || isModeSet(chan->modes, 'D')) {
80 for(chanuser = chan->user; chanuser; chanuser = chanuser->next_user) {
81 if(chanuser->user == user)
85 for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
86 if(chanuser->chan == chan)
93 struct ChanUser* getChanUser(struct UserNode *user, struct ChanNode *chan) {
94 struct ChanUser *chanuser;
95 if(isModeSet(chan->modes, 'd') || isModeSet(chan->modes, 'D')) {
96 for(chanuser = chan->user; chanuser; chanuser = chanuser->next_user) {
97 if(chanuser->user == user)
101 for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
102 if(chanuser->chan == chan)
109 struct ChanUser* getChannelUsers(struct ChanNode *chan, struct ChanUser *last) {
113 return last->next_user;
116 struct ChanUser* getUserChannels(struct UserNode *user, struct ChanUser *last) {
118 return user->channel;
120 return last->next_chan;
123 void delChanUser(struct ChanUser *chanuser, int do_freeChanUser) {
124 SYNCHRONIZE(cache_sync);
125 struct ChanUser *cchanuser, *last;
126 //remove it from the user's channel-list
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;
139 //remove it from the channel's user-list
141 for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
142 if(cchanuser == chanuser) {
143 chanuser->chan->usercount--;
145 last->next_user = chanuser->next_user;
147 chanuser->chan->user = chanuser->next_user;
153 if(do_freeChanUser) {
154 freeChanUser(chanuser);
156 chanuser->next_chan = NULL;
157 chanuser->next_user = NULL;
159 DESYNCHRONIZE(cache_sync);
162 void removeChanUserFromLists(struct ChanUser *chanuser, int remove_from_userlist, int remove_from_channellist, int do_freeChanUser) {
163 SYNCHRONIZE(cache_sync);
164 struct ChanUser *cchanuser, *last;
165 if(remove_from_userlist) {
166 //remove it from the channel's user-list
168 for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
169 if(cchanuser == chanuser) {
170 chanuser->chan->usercount--;
172 last->next_user = chanuser->next_user;
174 chanuser->chan->user = chanuser->next_user;
179 chanuser->next_user = NULL;
181 if(remove_from_channellist) {
182 //remove it from the user's channel-list
184 for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
185 if(cchanuser == chanuser) {
187 last->next_chan = chanuser->next_chan;
189 chanuser->user->channel = chanuser->next_chan;
194 chanuser->next_chan = NULL;
197 if(do_freeChanUser) {
198 freeChanUser(chanuser);
200 DESYNCHRONIZE(cache_sync);
203 void freeChanUser(struct ChanUser *chanuser) {
204 if(chanuser->spamnode)
205 free(chanuser->spamnode);