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/>.
23 struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) {
24 if(isUserOnChan(user, chan)) {
25 putlog(LOGLEVEL_ERROR, "CACHE FAIL");
27 struct ChanUser *chanuser = malloc(sizeof(*chanuser));
30 perror("malloc() failed");
34 chanuser->user = user;
35 chanuser->chan = chan;
36 chanuser->visCount = 0;
38 chanuser->changeTime = 0;
39 chanuser->spamnode = NULL;
41 SYNCHRONIZE(cache_sync);
43 chanuser->next_user = chan->user;
44 chan->user = chanuser;
47 chanuser->next_chan = user->channel;
48 user->channel = chanuser;
50 DESYNCHRONIZE(cache_sync);
55 struct ChanUser* addInvisibleChanUser(struct ChanNode *chan, struct UserNode *user) {
56 struct ChanUser *chanuser = malloc(sizeof(*chanuser));
59 perror("malloc() failed");
62 chanuser->flags = CHANUSERFLAG_INVISIBLE;
63 chanuser->user = user;
64 chanuser->chan = chan;
65 chanuser->visCount = 0;
67 chanuser->changeTime = 0;
68 chanuser->spamnode = NULL;
70 SYNCHRONIZE(cache_sync);
71 chanuser->next_user = chan->user;
72 chan->user = chanuser;
73 DESYNCHRONIZE(cache_sync);
79 int isUserOnChan(struct UserNode *user, struct ChanNode *chan) {
80 struct ChanUser *chanuser;
81 if(isModeSet(chan->modes, 'd') || isModeSet(chan->modes, 'D')) {
82 for(chanuser = chan->user; chanuser; chanuser = chanuser->next_user) {
83 if(chanuser->user == user)
87 for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
88 if(chanuser->chan == chan)
95 struct ChanUser* getChanUser(struct UserNode *user, struct ChanNode *chan) {
96 struct ChanUser *chanuser;
97 if(isModeSet(chan->modes, 'd') || isModeSet(chan->modes, 'D')) {
98 for(chanuser = chan->user; chanuser; chanuser = chanuser->next_user) {
99 if(chanuser->user == user)
103 for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
104 if(chanuser->chan == chan)
111 struct ChanUser* getChannelUsers(struct ChanNode *chan, struct ChanUser *last) {
115 return last->next_user;
118 struct ChanUser* getUserChannels(struct UserNode *user, struct ChanUser *last) {
120 return user->channel;
122 return last->next_chan;
125 void delChanUser(struct ChanUser *chanuser, int do_freeChanUser) {
126 SYNCHRONIZE(cache_sync);
127 struct ChanUser *cchanuser, *last;
128 //remove it from the user's channel-list
130 for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
131 if(cchanuser == chanuser) {
133 last->next_chan = chanuser->next_chan;
135 chanuser->user->channel = chanuser->next_chan;
141 //remove it from the channel's user-list
143 for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
144 if(cchanuser == chanuser) {
145 chanuser->chan->usercount--;
147 last->next_user = chanuser->next_user;
149 chanuser->chan->user = chanuser->next_user;
155 if(do_freeChanUser) {
156 freeChanUser(chanuser);
158 chanuser->next_chan = NULL;
159 chanuser->next_user = NULL;
161 DESYNCHRONIZE(cache_sync);
164 void removeChanUserFromLists(struct ChanUser *chanuser, int remove_from_userlist, int remove_from_channellist, int do_freeChanUser) {
165 SYNCHRONIZE(cache_sync);
166 struct ChanUser *cchanuser, *last;
167 if(remove_from_userlist) {
168 //remove it from the channel's user-list
170 for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
171 if(cchanuser == chanuser) {
172 chanuser->chan->usercount--;
174 last->next_user = chanuser->next_user;
176 chanuser->chan->user = chanuser->next_user;
181 chanuser->next_user = NULL;
183 if(remove_from_channellist) {
184 //remove it from the user's channel-list
186 for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
187 if(cchanuser == chanuser) {
189 last->next_chan = chanuser->next_chan;
191 chanuser->user->channel = chanuser->next_chan;
196 chanuser->next_chan = NULL;
199 if(do_freeChanUser) {
200 freeChanUser(chanuser);
202 DESYNCHRONIZE(cache_sync);
205 void freeChanUser(struct ChanUser *chanuser) {
206 if(chanuser->spamnode)
207 free(chanuser->spamnode);