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