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