#include "ChanUser.h"
#include "ChanNode.h"
+#include "ModeNode.h"
#include "UserNode.h"
struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) {
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;
}
* 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);