7041fa66796f3b59dfa0e2f74e519b59d7559578
[NeonServV5.git] / src / ChanUser.c
1 /* ChanUser.c - NeonServ v5.3
2  * Copyright (C) 2011-2012  Philipp Kreil (pk910)
3  * 
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.
8  * 
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.
13  * 
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/>. 
16  */
17
18 #include "ChanUser.h"
19 #include "ChanNode.h"
20 #include "UserNode.h"
21
22 struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) {
23     struct ChanUser *chanuser = malloc(sizeof(*chan));
24     if (!chanuser)
25     {
26         perror("malloc() failed");
27         return NULL;
28     }
29     chanuser->flags = 0;
30     chanuser->user = user;
31     chanuser->chan = chan;
32     
33     chanuser->changeTime = 0;
34     chanuser->spamnode = NULL;
35
36     chanuser->next_user = chan->user;
37     chan->user = chanuser;
38     chan->usercount++;
39
40     chanuser->next_chan = user->channel;
41     user->channel = chanuser;
42
43     return chanuser;
44 }
45
46 struct ChanUser* addInvisibleChanUser(struct ChanNode *chan, struct UserNode *user) {
47     struct ChanUser *chanuser = malloc(sizeof(*chan));
48     if (!chanuser)
49     {
50         perror("malloc() failed");
51         return NULL;
52     }
53     chanuser->flags = CHANUSERFLAG_INVISIBLE;
54     chanuser->user = user;
55     chanuser->chan = chan;
56     
57     chanuser->changeTime = 0;
58     chanuser->spamnode = NULL;
59
60     chanuser->next_user = chan->user;
61     chan->user = chanuser;
62     chan->usercount++;
63
64     return chanuser;
65 }
66
67 int isUserOnChan(struct UserNode *user, struct ChanNode *chan) {
68     struct ChanUser *chanuser;
69     for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
70         if(chanuser->chan == chan)
71             return 1;
72     }
73     return 0;
74 }
75
76 struct ChanUser* getChanUser(struct UserNode *user, struct ChanNode *chan) {
77     struct ChanUser *chanuser;
78     for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
79         if(chanuser->chan == chan)
80             return chanuser;
81     }
82     return NULL;
83 }
84
85 struct ChanUser* getChannelUsers(struct ChanNode *chan, struct ChanUser *last) {
86     if(last == NULL)
87         return chan->user;
88     else
89         return last->next_user;
90 }
91
92 struct ChanUser* getUserChannels(struct UserNode *user, struct ChanUser *last) {
93     if(last == NULL)
94         return user->channel;
95     else
96         return last->next_chan;
97 }
98
99 void delChanUser(struct ChanUser *chanuser, int do_freeChanUser) {
100     struct ChanUser *cchanuser, *last;
101     //remove it from the user's channel-list
102     if(!(chanuser->flags & CHANUSERFLAG_INVISIBLE)) {
103         last = NULL;
104         for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
105             if(cchanuser == chanuser) {
106                 if(last) 
107                     last->next_chan = chanuser->next_chan;
108                 else
109                     chanuser->user->channel = chanuser->next_chan;
110                 break;
111             } else
112                 last = cchanuser;
113         }
114     }
115
116     //remove it from the channel's user-list
117     last = NULL;
118     for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
119         if(cchanuser == chanuser) {
120             chanuser->chan->usercount--;
121             if(last) 
122                 last->next_user = chanuser->next_user;
123             else
124                 chanuser->chan->user = chanuser->next_user;
125             break;
126         } else
127             last = cchanuser;
128     }
129     
130     if(do_freeChanUser) {
131         freeChanUser(chanuser);
132     } else {
133         chanuser->next_chan = NULL;
134         chanuser->next_user = NULL;
135     }
136 }
137
138 void removeChanUserFromLists(struct ChanUser *chanuser, int remove_from_userlist, int remove_from_channellist, int do_freeChanUser) {
139     struct ChanUser *cchanuser, *last;
140     if(remove_from_userlist) {
141         //remove it from the channel's user-list
142         last = NULL;
143         for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
144             if(cchanuser == chanuser) {
145                 chanuser->chan->usercount--;
146                 if(last) 
147                     last->next_user = chanuser->next_user;
148                 else
149                     chanuser->chan->user = chanuser->next_user;
150                 break;
151             } else
152                 last = cchanuser;
153         }
154         chanuser->next_user = NULL;
155     }
156     if(remove_from_channellist) {
157         //remove it from the user's channel-list
158         last = NULL;
159         for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
160             if(cchanuser == chanuser) {
161                 if(last) 
162                     last->next_chan = chanuser->next_chan;
163                 else
164                     chanuser->user->channel = chanuser->next_chan;
165                 break;
166             } else
167                 last = cchanuser;
168         }
169         chanuser->next_chan = NULL;
170     }
171     
172     if(do_freeChanUser) {
173         freeChanUser(chanuser);
174     }
175 }
176
177 void freeChanUser(struct ChanUser *chanuser) {
178     if(chanuser->spamnode)
179         free(chanuser->spamnode);
180     free(chanuser);
181 }
182