From b91aac44888b048fa92cf70446862ad9516f2807 Mon Sep 17 00:00:00 2001 From: pk910 Date: Sun, 15 Jan 2012 20:31:32 +0100 Subject: [PATCH] fixed invisible support for cmd_up and some other functions using getChanUser --- src/ChanUser.c | 27 +++++++++++++++++++++------ src/cmd_neonserv_up.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/ChanUser.c b/src/ChanUser.c index 9ac0691..b9ffde3 100644 --- a/src/ChanUser.c +++ b/src/ChanUser.c @@ -17,6 +17,7 @@ #include "ChanUser.h" #include "ChanNode.h" +#include "ModeNode.h" #include "UserNode.h" struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) { @@ -72,18 +73,32 @@ struct ChanUser* addInvisibleChanUser(struct ChanNode *chan, struct UserNode *us int isUserOnChan(struct UserNode *user, struct ChanNode *chan) { struct ChanUser *chanuser; - for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) { - if(chanuser->chan == chan) - return 1; + if(isModeSet(chan->modes, 'd') || isModeSet(chan->modes, 'D')) { + for(chanuser = chan->user; chanuser; chanuser = chanuser->next_user) { + if(chanuser->user == user) + return 1; + } + } else { + for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) { + if(chanuser->chan == chan) + return 1; + } } return 0; } struct ChanUser* getChanUser(struct UserNode *user, struct ChanNode *chan) { struct ChanUser *chanuser; - for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) { - if(chanuser->chan == chan) - return chanuser; + if(isModeSet(chan->modes, 'd') || isModeSet(chan->modes, 'D')) { + for(chanuser = chan->user; chanuser; chanuser = chanuser->next_user) { + if(chanuser->user == user) + return chanuser; + } + } else { + for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) { + if(chanuser->chan == chan) + return chanuser; + } } return NULL; } diff --git a/src/cmd_neonserv_up.c b/src/cmd_neonserv_up.c index d8bd7ef..930df02 100644 --- a/src/cmd_neonserv_up.c +++ b/src/cmd_neonserv_up.c @@ -21,7 +21,40 @@ * no arguments */ +struct neonserv_cmd_up_cache { + struct ClientSocket *client; + struct ClientSocket *textclient; + struct UserNode *user; + struct Event *event; +}; + +static void neonserv_cmd_up_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event); +static USERLIST_CALLBACK(neonserv_cmd_up_userlist_lookup); + CMD_BIND(neonserv_cmd_up) { + if(isModeSet(chan->modes, 'd') || isModeSet(chan->modes, 'D')) { + struct neonserv_cmd_up_cache *cache = malloc(sizeof(*cache)); + if (!cache) { + perror("malloc() failed"); + return; + } + cache->client = client; + cache->textclient = getTextBot(); + cache->user = user; + cache->event = event; + get_userlist_if_invisible(chan, neonserv_cmd_up_userlist_lookup, cache); + } else { + neonserv_cmd_up_async1(client, getTextBot(), user, chan, event); + } +} + +static USERLIST_CALLBACK(neonserv_cmd_up_userlist_lookup) { + struct neonserv_cmd_up_cache *cache = data; + neonserv_cmd_up_async1(cache->client, cache->textclient, cache->user, chan, cache->event); + free(cache); +} + +static void neonserv_cmd_up_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event) { struct ChanUser *chanuser = getChanUser(user, chan); if(!chanuser) { reply(getTextBot(), user, "NS_NOT_ON_CHANNEL_YOU", chan->name); -- 2.20.1