1 /* ChanUser.c - NeonServ v5.3
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/>.
22 struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) {
23 struct ChanUser *chanuser = malloc(sizeof(*chan));
26 perror("malloc() failed");
30 chanuser->user = user;
31 chanuser->chan = chan;
33 chanuser->changeTime = 0;
34 chanuser->spamnode = NULL;
36 SYNCHRONIZE(cache_sync);
38 chanuser->next_user = chan->user;
39 chan->user = chanuser;
42 chanuser->next_chan = user->channel;
43 user->channel = chanuser;
45 DESYNCHRONIZE(cache_sync);
50 struct ChanUser* addInvisibleChanUser(struct ChanNode *chan, struct UserNode *user) {
51 struct ChanUser *chanuser = malloc(sizeof(*chan));
54 perror("malloc() failed");
57 chanuser->flags = CHANUSERFLAG_INVISIBLE;
58 chanuser->user = user;
59 chanuser->chan = chan;
61 chanuser->changeTime = 0;
62 chanuser->spamnode = NULL;
64 SYNCHRONIZE(cache_sync);
65 chanuser->next_user = chan->user;
66 chan->user = chanuser;
67 DESYNCHRONIZE(cache_sync);
73 int isUserOnChan(struct UserNode *user, struct ChanNode *chan) {
74 struct ChanUser *chanuser;
75 for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
76 if(chanuser->chan == chan)
82 struct ChanUser* getChanUser(struct UserNode *user, struct ChanNode *chan) {
83 struct ChanUser *chanuser;
84 for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
85 if(chanuser->chan == chan)
91 struct ChanUser* getChannelUsers(struct ChanNode *chan, struct ChanUser *last) {
95 return last->next_user;
98 struct ChanUser* getUserChannels(struct UserNode *user, struct ChanUser *last) {
100 return user->channel;
102 return last->next_chan;
105 void delChanUser(struct ChanUser *chanuser, int do_freeChanUser) {
106 SYNCHRONIZE(cache_sync);
107 struct ChanUser *cchanuser, *last;
108 //remove it from the user's channel-list
109 if(!(chanuser->flags & CHANUSERFLAG_INVISIBLE)) {
111 for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
112 if(cchanuser == chanuser) {
114 last->next_chan = chanuser->next_chan;
116 chanuser->user->channel = chanuser->next_chan;
123 //remove it from the channel's user-list
125 for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
126 if(cchanuser == chanuser) {
127 chanuser->chan->usercount--;
129 last->next_user = chanuser->next_user;
131 chanuser->chan->user = chanuser->next_user;
137 if(do_freeChanUser) {
138 freeChanUser(chanuser);
140 chanuser->next_chan = NULL;
141 chanuser->next_user = NULL;
143 DESYNCHRONIZE(cache_sync);
146 void removeChanUserFromLists(struct ChanUser *chanuser, int remove_from_userlist, int remove_from_channellist, int do_freeChanUser) {
147 SYNCHRONIZE(cache_sync);
148 struct ChanUser *cchanuser, *last;
149 if(remove_from_userlist) {
150 //remove it from the channel's user-list
152 for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
153 if(cchanuser == chanuser) {
154 chanuser->chan->usercount--;
156 last->next_user = chanuser->next_user;
158 chanuser->chan->user = chanuser->next_user;
163 chanuser->next_user = NULL;
165 if(remove_from_channellist) {
166 //remove it from the user's channel-list
168 for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
169 if(cchanuser == chanuser) {
171 last->next_chan = chanuser->next_chan;
173 chanuser->user->channel = chanuser->next_chan;
178 chanuser->next_chan = NULL;
181 if(do_freeChanUser) {
182 freeChanUser(chanuser);
184 DESYNCHRONIZE(cache_sync);
187 void freeChanUser(struct ChanUser *chanuser) {
188 if(chanuser->spamnode)
189 free(chanuser->spamnode);