#include "conf.h"
#include "global.h"
#include "modcmd.h"
-#include "opserv.h" /* for opserv_bad_channel() */
+#include "opserv.h" /* for opserv_bad_channel() and devnull management */
#include "nickserv.h" /* for oper_outranks() */
#include "saxdb.h"
#include "spamserv.h"
return modify_users(CSFUNC_ARGS, NULL, MODE_REMOVE|MODE_VOICE, "CSMSG_DEVOICED_USERS");
}
+static CHANSERV_FUNC(cmd_opme)
+{
+ struct mod_chanmode change;
+ struct userData *uData;
+ const char *errmsg;
+
+ mod_chanmode_init(&change);
+ change.argc = 1;
+ change.args[0].u.member = GetUserMode(channel, user);
+ if(!change.args[0].u.member)
+ {
+ if(argc)
+ reply("MSG_CHANNEL_ABSENT", channel->name);
+ return 0;
+ }
+
+ struct devnull_class *devnull;
+ if(user->handle_info->devnull && (devnull = devnull_get(user->handle_info->devnull)) && (devnull->modes & DEVNULL_MODE_OPME))
+ {
+ change.args[0].mode = MODE_CHANOP;
+ errmsg = "CSMSG_ALREADY_OPPED";
+ }
+ else
+ {
+ if(argc)
+ reply("CSMSG_NO_ACCESS");
+ return 0;
+ }
+ change.args[0].mode &= ~change.args[0].u.member->modes;
+ if(!change.args[0].mode)
+ {
+ if(argc)
+ reply(errmsg, channel->name);
+ return 0;
+ }
+ modcmd_chanmode_announce(&change);
+ return 1;
+}
+
static int
bad_channel_ban(struct chanNode *channel, struct userNode *user, const char *ban, unsigned int *victimCount, struct modeNode **victims)
{
DEFINE_COMMAND(endvote, 1, MODCMD_REQUIRE_AUTHED, NULL);
DEFINE_COMMAND(voteresults, 1, MODCMD_REQUIRE_AUTHED, NULL);
+ DEFINE_COMMAND(opme, 1, MODCMD_REQUIRE_AUTHED|MODCMD_REQUIRE_CHANNEL, NULL);
+
/* Channel options */
DEFINE_CHANNEL_OPTION(defaulttopic);
DEFINE_CHANNEL_OPTION(topicmask);
{ "OSMSG_DEVNULL_SET_M", "OverrideNoAmsg: %s" },
{ "OSMSG_DEVNULL_SET_N", "MaxSendQ: %s" },
{ "OSMSG_DEVNULL_SET_N_i", "MaxSendQ: %i" },
+ { "OSMSG_DEVNULL_SET_OPME", "OpMe: %s" },
{ "OSMSG_DEVNULL_SET_DONE", "Done." },
{ "OSMSG_DEVNULL_RENAMED", "Devnull class %s renamed to %s" },
{ "OSMSG_DEVNULL_SET_INVALID", "Invalid Option for setting %s" },
count++;
}
tbl.length = count+1;
- tbl.width = 14;
+ tbl.width = 15;
tbl.flags = 0;
tbl.flags = TABLE_NO_FREE;
tbl.contents = malloc(tbl.length * sizeof(tbl.contents[0]));
tbl.contents[0][11] = "+S";
tbl.contents[0][12] = "+X";
tbl.contents[0][13] = "MaxQ";
+ tbl.contents[0][14] = "OpMe";
if(!count)
{
table_send(cmd->parent->bot, user->nick, 0, NULL, tbl);
} else {
tbl.contents[ii][13] = off;
}
+ if(DEVNULL_FLAGGED(th, MODE_OPME)) {
+ tbl.contents[ii][14] = on;
+ } else {
+ tbl.contents[ii][14] = off;
+ }
}
table_send(cmd->parent->bot, user->nick, 0, NULL, tbl);
for(ii = 1; ii < tbl.length; ++ii)
send_message_type(4, user, opserv,"+k = ChanServ Mode (mode +k)");
send_message_type(4, user, opserv,"+S = NetServ Mode (mode +S)");
send_message_type(4, user, opserv,"+X = XtraOp Mode (mode +X)");
+ send_message_type(4, user, opserv,"OpMe = ChanServ opme command");
return 1;
}
th->maxsendq = strtoul(argv[offset+3], NULL, 0);
reply("OSMSG_DEVNULL_SET_DONE");
}
+ }
+ else if(!strcmp("OPME",argv[offset+2])) {
+ if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+ DEVNULL_CLEAR_FLAG(th, MODE_OPME);
+ reply("OSMSG_DEVNULL_SET_DONE");
+ } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+ DEVNULL_SET_FLAG(th, MODE_OPME);
+ reply("OSMSG_DEVNULL_SET_DONE");
+ } else {
+ reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+ }
} else {
reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+2]);
}
} else {
reply("OSMSG_DEVNULL_SET_N", "off");
}
+ if(DEVNULL_FLAGGED(th, MODE_OPME)) {
+ reply("OSMSG_DEVNULL_SET_OPME", "on");
+ } else {
+ reply("OSMSG_DEVNULL_SET_OPME", "off");
+ }
}
} else {
reply("OSMSG_DEVNULL_NOTFOUND", argv[offset+1]);