struct mod_chanmode change;
unsigned int ii;
bans = bd->channel->channel->banlist;
- change.modes_set = change.modes_clear = 0;
- change.argc = 0;
+ mod_chanmode_init(&change);
for(ii=0; ii<bans.used; ii++)
{
if(!strcmp(bans.list[ii]->ban, bd->mask))
else if(!IsSuspended(channel->channel_info))
{
struct mod_chanmode change;
- change.modes_set = change.modes_clear = 0;
+ mod_chanmode_init(&change);
change.argc = 1;
change.args[0].mode = MODE_CHANOP;
change.args[0].member = AddChannelUser(chanserv, target);
return 0;
}
channel->channel_info->may_opchan = 0;
- change.modes_set = change.modes_clear = 0;
+ mod_chanmode_init(&change);
change.argc = 1;
change.args[0].mode = MODE_CHANOP;
change.args[0].member = GetUserMode(channel, chanserv);
struct userData *uData;
const char *errmsg;
- change.modes_set = change.modes_clear = 0;
+ mod_chanmode_init(&change);
change.argc = 1;
change.args[0].member = GetUserMode(channel, user);
if(!change.args[0].member)
{
struct mod_chanmode change;
- change.modes_set = change.modes_clear = 0;
+ mod_chanmode_init(&change);
change.argc = 1;
change.args[0].member = GetUserMode(channel, user);
if(!change.args[0].member)
}
else
{
- reply("You must specify the name of a channel or user.");
+ reply("MSG_NOT_TARGET_NAME");
return 0;
}
return 1;
}
else
{
- reply("You must specify the name of a channel or user.");
+ reply("MSG_NOT_TARGET_NAME");
return 0;
}
return 1;
channel = suspended->cData->channel;
suspended->cData->channel = channel;
suspended->cData->flags &= ~CHANNEL_SUSPENDED;
- change.modes_set = change.modes_clear = 0;
+ mod_chanmode_init(&change);
change.argc = 1;
change.args[0].mode = MODE_CHANOP;
change.args[0].member = AddChannelUser(chanserv, channel);
CHANNEL_BINARY_OPTION("CSMSG_SET_DYNLIMIT", CHANNEL_DYNAMIC_LIMIT);
}
-/* TODO: reimplement
-
-static MODCMD_FUNC(chan_opt_userinfo)
-{
- CHANNEL_BINARY_OPTION("CSMSG_SET_USERINFO", CHANNEL_INFO_LINES);
-}
-
-static MODCMD_FUNC(chan_opt_voice)
-{
- CHANNEL_BINARY_OPTION("CSMSG_SET_VOICE", CHANNEL_VOICE_ALL);
-}
-
-static MODCMD_FUNC(chan_opt_topicsnarf)
-{
- if((argc > 0) && !check_user_level(channel, user, lvlEnfTopic, 1, 0))
- {
- reply("CSMSG_TOPIC_LOCKED", channel->name);
- return 0;
- }
- CHANNEL_BINARY_OPTION("CSMSG_SET_TOPICSNARF", CHANNEL_TOPIC_SNARF);
-}
-
-static MODCMD_FUNC(chan_opt_peoninvite)
-{
- CHANNEL_BINARY_OPTION("CSMSG_SET_PEONINVITE", CHANNEL_PEON_INVITE);
-}
-
-*/
-
static MODCMD_FUNC(chan_opt_defaults)
{
struct userData *uData;
static CHANSERV_FUNC(cmd_huggle)
{
- char response[MAXLEN];
- const char *fmt;
/* CTCP must be via PRIVMSG, never notice */
if(channel)
- {
- fmt = user_find_message(user, "CSMSG_HUGGLES_HIM");
- sprintf(response, fmt, user->nick);
- irc_privmsg(cmd->parent->bot, channel->name, response);
- }
+ send_target_message(1, channel->name, cmd->parent->bot, "CSMSG_HUGGLES_HIM", user->nick);
else
- {
- fmt = user_find_message(user, "CSMSG_HUGGLES_YOU");
- irc_privmsg(cmd->parent->bot, user->nick, fmt);
- }
+ send_target_message(1, user->nick, cmd->parent->bot, "CSMSG_HUGGLES_YOU");
return 1;
}
return;
}
+ mod_chanmode_init(&change);
change.modes_set = MODE_LIMIT;
- change.modes_clear = 0;
change.new_limit = limit;
- change.argc = 0;
mod_chanmode_announce(chanserv, channel, &change);
}
}
}
- change.modes_set = change.modes_clear = 0;
+ mod_chanmode_init(&change);
change.argc = 1;
if(channel->banlist.used < MAXBANS)
{
if(!user->handle_info)
return;
- change.modes_set = change.modes_clear = 0;
+ mod_chanmode_init(&change);
change.argc = 1;
for(channel = user->handle_info->channels; channel; channel = channel->u_next)
{
unsigned int ii, jj;
char kick_reason[MAXLEN];
- change.modes_set = change.modes_clear = 0;
+ mod_chanmode_init(&change);
change.argc = 1;
change.args[0].mode = MODE_BAN;
for(ii = 0; ii < user->channels.used; ++ii)
if(!(cData->flags & CHANNEL_SUSPENDED))
{
struct mod_chanmode change;
- change.modes_set = change.modes_clear = 0;
+ mod_chanmode_init(&change);
change.argc = 1;
change.args[0].mode = MODE_CHANOP;
change.args[0].member = AddChannelUser(chanserv, cNode);
unsigned int n;
irc_user(user);
- change.modes_set = change.modes_clear = 0;
+ mod_chanmode_init(&change);
change.argc = 1;
for (n = 0; n < user->channels.used; n++) {
struct modeNode *mn = user->channels.list[n];
{ "MSG_INVALID_MODES", "$b%s$b is an invalid set of channel modes." },
{ "MSG_INVALID_GLINE", "Invalid G-line '%s'." },
{ "MSG_INVALID_DURATION", "Invalid time span '%s'." },
+ { "MSG_NOT_TARGET_NAME", "You must provide the name of a channel or user." },
{ "MSG_NOT_CHANNEL_NAME", "You must provide a valid channel name." },
{ "MSG_INVALID_CHANNEL", "You must provide the name of a channel that exists." },
{ "MSG_CHANNEL_ABSENT", "You aren't currently in $b%s$b." },
struct modeNode *mn = GetUserMode(hs->helpchan, req_user);
if ((!newest || !newest->helper) && mn && (mn->modes & MODE_VOICE)) {
struct mod_chanmode change;
- change.modes_set = change.modes_clear = 0;
+ mod_chanmode_init(&change);
change.argc = 1;
change.args[0].mode = MODE_REMOVE | MODE_VOICE;
change.args[0].member = mn;
if (req->user && hs->auto_voice) {
struct mod_chanmode change;
- change.modes_set = change.modes_clear = 0;
+ mod_chanmode_init(&change);
change.argc = 1;
change.args[0].mode = MODE_VOICE;
if ((change.args[0].member = GetUserMode(hs->helpchan, req->user)))
AddChannelUser(hs->helpserv, hs->helpchan)->modes |= MODE_CHANOP;
} else if (!helpserv_in_channel(hs, old_helpchan)) {
struct mod_chanmode change;
- change.modes_set = change.modes_clear = 0;
+ mod_chanmode_init(&change);
change.argc = 1;
change.args[0].mode = MODE_CHANOP;
change.args[0].member = AddChannelUser(hs->helpserv, hs->helpchan);
helpserv_msguser(req->user, "HSMSG_REQ_UNASSIGNED", req->id, reason);
if (hs->auto_devoice && mn && (mn->modes & MODE_VOICE)) {
struct mod_chanmode change;
- change.modes_set = change.modes_clear = 0;
+ mod_chanmode_init(&change);
change.argc = 1;
change.args[0].mode = MODE_REMOVE | MODE_VOICE;
change.args[0].member = mn;
AddChannelUser(hs->helpserv, hs->helpchan)->modes |= MODE_CHANOP;
} else {
struct mod_chanmode change;
- change.modes_set = change.modes_clear = 0;
+ mod_chanmode_init(&change);
change.argc = 1;
change.args[0].mode = MODE_CHANOP;
change.args[0].member = AddChannelUser(hs->helpserv, hs->helpchan);
DelChannelUser(hs->helpserv, old_target, "Changing page target.", 0);
if (new_target && !helpserv_in_channel(hs, new_target)) {
struct mod_chanmode change;
- change.modes_set = change.modes_clear = 0;
+ mod_chanmode_init(&change);
change.argc = 1;
change.args[0].mode = MODE_CHANOP;
change.args[0].member = AddChannelUser(hs->helpserv, new_target);
if (hs->auto_voice && req->helper)
{
struct mod_chanmode change;
- change.modes_set = change.modes_clear = 0;
+ mod_chanmode_init(&change);
change.argc = 1;
change.args[0].mode = MODE_VOICE;
if ((change.args[0].member = GetUserMode(hs->helpchan, user)))
snoop_cfg.bot = GetUserH(str);
if (!snoop_cfg.bot)
return 0;
- change.modes_set = change.modes_clear = 0;
+ mod_chanmode_init(&change);
change.argc = 1;
change.args[0].mode = MODE_CHANOP;
change.args[0].member = AddChannelUser(snoop_cfg.bot, snoop_cfg.channel);
if (!add)
change->args[ch_arg].mode |= MODE_REMOVE;
victim = GetUserH(modes[in_arg++]);
+ if (!victim)
+ continue;
if ((change->args[ch_arg].member = GetUserMode(channel, victim)))
ch_arg++;
break;
char int_buff[32];
unsigned int arg;
+ assert(change->argc <= change->alloc_argc);
memset(&chbuf, 0, sizeof(chbuf));
chbuf.channel = channel;
chbuf.actor = who;
mod_chanmode_format(struct mod_chanmode *change, char *outbuff)
{
unsigned int used = 0;
+ assert(change->argc <= change->alloc_argc);
if (change->modes_clear) {
outbuff[used++] = '-';
#define DO_MODE_CHAR(BIT, CHAR) if (change->modes_clear & MODE_##BIT) outbuff[used++] = CHAR
res = calloc(1, sizeof(*res) + (argc-1)*sizeof(res->args[0]));
else
res = calloc(1, sizeof(*res));
- if (res)
+ if (res) {
+ res->alloc_argc = argc;
res->argc = argc;
+ }
return res;
}
struct banNode *bn;
unsigned int ii, jj;
+ assert(change->argc <= change->alloc_argc);
channel->modes = (channel->modes & ~change->modes_clear) | change->modes_set;
if (change->modes_set & MODE_LIMIT)
channel->limit = change->new_limit;
victim = GetUserN(modes[in_arg++]);
else
victim = GetUserH(modes[in_arg++]);
+ if (!victim)
+ continue;
if ((change->args[ch_arg].member = GetUserMode(channel, victim)))
ch_arg++;
break;
struct modeNode *mn;
char int_buff[32], mode = '\0';
+ assert(change->argc <= change->alloc_argc);
memset(&chbuf, 0, sizeof(chbuf));
chbuf.channel = channel;
chbuf.actor = who;
mod_chanmode_format(struct mod_chanmode *change, char *outbuff)
{
unsigned int used = 0;
+ assert(change->argc <= change->alloc_argc);
if (change->modes_clear) {
outbuff[used++] = '-';
#define DO_MODE_CHAR(BIT, CHAR) if (change->modes_clear & MODE_##BIT) outbuff[used++] = CHAR
struct mod_chanmode {
chan_mode_t modes_set, modes_clear;
unsigned int new_limit, argc;
+#ifndef NDEBUG
+ unsigned int alloc_argc;
+#endif
char new_key[KEYLEN + 1];
struct {
unsigned int mode;
#define MCP_KEY_FREE 0x0004 /* -k without a key argument */
#define MC_ANNOUNCE 0x0100 /* send a mod_chanmode() change out */
#define MC_NOTIFY 0x0200 /* make local callbacks to announce */
+#ifdef NDEBUG
+#define mod_chanmode_init(CHANMODE) do { memset((CHANMODE), 0, sizeof(*CHANMODE)); } while (0)
+#else
+#define mod_chanmode_init(CHANMODE) do { memset((CHANMODE), 0, sizeof(*CHANMODE)); (CHANMODE)->alloc_argc = ArrayLength((CHANMODE)->args); } while (0)
+#endif
+
struct mod_chanmode *mod_chanmode_alloc(unsigned int argc);
struct mod_chanmode *mod_chanmode_dup(struct mod_chanmode *orig, unsigned int extra);
struct mod_chanmode *mod_chanmode_parse(struct chanNode *channel, char **modes, unsigned int argc, unsigned int flags);