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