6 struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) {
7 struct ChanUser *chanuser = malloc(sizeof(*chan));
10 perror("malloc() failed");
14 chanuser->user = user;
15 chanuser->chan = chan;
17 chanuser->next_user = chan->user;
18 chan->user = chanuser;
21 chanuser->next_chan = user->channel;
22 user->channel = chanuser;
27 struct ChanUser* addInvisibleChanUser(struct ChanNode *chan, struct UserNode *user) {
28 struct ChanUser *chanuser = malloc(sizeof(*chan));
31 perror("malloc() failed");
34 chanuser->flags = CHANUSERFLAG_INVISIBLE;
35 chanuser->user = user;
36 chanuser->chan = chan;
38 chanuser->next_user = chan->user;
39 chan->user = chanuser;
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)
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)
63 struct ChanUser* getChannelUsers(struct ChanNode *chan, struct ChanUser *last) {
67 return last->next_user;
70 struct ChanUser* getUserChannels(struct UserNode *user, struct ChanUser *last) {
74 return last->next_chan;
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)) {
82 for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
83 if(cchanuser == chanuser) {
85 last->next_chan = chanuser->next_chan;
87 chanuser->user->channel = chanuser->next_chan;
94 //remove it from the channel's user-list
96 for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
97 if(cchanuser == chanuser) {
98 chanuser->chan->usercount--;
100 last->next_user = chanuser->next_user;
102 chanuser->chan->user = chanuser->next_user;
111 chanuser->next_chan = NULL;
112 chanuser->next_user = NULL;
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
121 for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
122 if(cchanuser == chanuser) {
123 chanuser->chan->usercount--;
125 last->next_user = chanuser->next_user;
127 chanuser->chan->user = chanuser->next_user;
132 chanuser->next_user = NULL;
134 if(remove_from_channellist) {
135 //remove it from the user's channel-list
137 for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
138 if(cchanuser == chanuser) {
140 last->next_chan = chanuser->next_chan;
142 chanuser->user->channel = chanuser->next_chan;
147 chanuser->next_chan = NULL;