+#include "cmd_neonserv.h"
+
/*
* argv[0-*] nicks
*/
+static USERLIST_CALLBACK(neonserv_cmd_op_userlist_lookup);
+static void neonserv_cmd_op_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nicks);
+
+struct neonserv_cmd_op_cache {
+ struct ClientSocket *client, *textclient;
+ struct UserNode *user;
+ struct Event *event;
+ char *nicks;
+};
+
+CMD_BIND(neonserv_cmd_op) {
+ struct neonserv_cmd_op_cache *cache = malloc(sizeof(*cache));
+ if (!cache) {
+ perror("malloc() failed");
+ return;
+ }
+ cache->client = client;
+ cache->textclient = getTextBot();
+ cache->user = user;
+ cache->event = event;
+ cache->nicks = strdup(merge_argv(argv, 0, argc));
+ get_userlist_with_invisible(chan, neonserv_cmd_op_userlist_lookup, cache);
+}
-static CMD_BIND(neonserv_cmd_op) {
- int i, done_users = 0;
+static USERLIST_CALLBACK(neonserv_cmd_op_userlist_lookup) {
+ struct neonserv_cmd_op_cache *cache = data;
+ neonserv_cmd_op_async1(cache->client, cache->textclient, cache->user, chan, cache->event, cache->nicks);
+ free(cache->nicks);
+ free(cache);
+}
+
+static void neonserv_cmd_op_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, struct Event *event, char *nicks) {
+ int total_users = 0, done_users = 0;
struct UserNode *cuser;
struct ChanUser *chanuser;
struct ModeBuffer *modeBuf;
- check_mysql();
- if(!checkChannelAccess(user, chan, "channel_canop", 1, 0)) {
- reply(getTextBot(), user, "NS_ACCESS_DENIED");
- return;
- }
modeBuf = initModeBuffer(client, chan);
- for(i = 0; i < argc; i++) {
- cuser = searchUserByNick(argv[i]);
- if(!cuser) continue;
- chanuser = getChanUser(cuser, chan);
- if(!chanuser) continue;
+ char *a, *b = nicks;
+ do {
+ a = strstr(b, " ");
+ if(a) *a = '\0';
+ total_users++;
+ cuser = searchUserByNick(b);
+ if(!cuser) {
+ //check for an invisible user
+ for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) {
+ if(!stricmp(chanuser->user->nick, b)) {
+ cuser = chanuser->user;
+ break;
+ }
+ }
+ if(!cuser) continue;
+ } else {
+ chanuser = getChanUser(cuser, chan);
+ if(!chanuser) continue;
+ }
done_users++;
if(chanuser->flags & CHANUSERFLAG_OPPED) continue;
- modeBufferOp(modeBuf, argv[i]);
- }
+ modeBufferOp(modeBuf, b);
+ if(a) {
+ b = a+1;
+ }
+ } while(a);
freeModeBuffer(modeBuf);
- if(done_users == argc)
- reply(getTextBot(), user, "NS_OP_DONE", chan->name);
+ if(done_users == total_users)
+ reply(textclient, user, "NS_OP_DONE", chan->name);
else
- reply(getTextBot(), user, "NS_OP_FAIL", client->user->nick);
+ reply(textclient, user, "NS_OP_FAIL", client->user->nick);
+ if(done_users)
+ logEvent(event);
}