/* SET NEVERGROUP <ON|OFF> */ static void ns_cmd_set_nevergroup(sourceinfo_t *si, int parc, char *parv[]) { char *params = parv[0]; if (!params) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "NEVERGROUP"); return; } if (!strcasecmp("ON", params)) { if (MU_NEVERGROUP & si->smu->flags) { command_fail(si, fault_nochange, _("The \2%s\2 flag is already set for account \2%s\2."), "NEVERGROUP", entity(si->smu)->name); return; } logcommand(si, CMDLOG_SET, "SET:NEVERGROUP:ON"); si->smu->flags |= MU_NEVERGROUP; command_success_nodata(si, _("The \2%s\2 flag has been set for account \2%s\2."), "NEVERGROUP", entity(si->smu)->name); return; } else if (!strcasecmp("OFF", params)) { if (!(MU_NEVERGROUP & si->smu->flags)) { command_fail(si, fault_nochange, _("The \2%s\2 flag is not set for account \2%s\2."), "NEVERGROUP", entity(si->smu)->name); return; } logcommand(si, CMDLOG_SET, "SET:NEVERGROUP:OFF"); si->smu->flags &= ~MU_NEVERGROUP; command_success_nodata(si, _("The \2%s\2 flag has been removed for account \2%s\2."), "NEVERGROUP", entity(si->smu)->name); return; } else { command_fail(si, fault_badparams, STR_INVALID_PARAMS, "NEVERGROUP"); return; } }
/* SET HIDELASTLOGIN [ON|OFF] */ static void ns_cmd_set_hidelastlogin(sourceinfo_t *si, int parc, char *parv[]) { char *params = parv[0]; if (!params) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "HIDELASTLOGIN"); return; } if (!strcasecmp("ON", params)) { if (metadata_find(si->smu, "private:showlast:optout")) { command_fail(si, fault_nochange, _("The \2%s\2 flag is already set for account \2%s\2."), "HIDELASTLOGIN", entity(si->smu)->name); return; } logcommand(si, CMDLOG_SET, "SET:HIDELASTLOGIN:ON"); metadata_add(si->smu, "private:showlast:optout", "ON"); command_success_nodata(si, _("The \2%s\2 flag has been set for account \2%s\2."), "HIDELASTLOGIN", entity(si->smu)->name); return; } else if (!strcasecmp("OFF", params)) { if (!metadata_find(si->smu, "private:showlast:optout")) { command_fail(si, fault_nochange, _("The \2%s\2 flag is not set for account \2%s\2."), "HIDELASTLOGIN", entity(si->smu)->name); return; } logcommand(si, CMDLOG_SET, "SET:HIDELASTLOGIN:OFF"); metadata_delete(si->smu, "private:showlast:optout"); command_success_nodata(si, _("The \2%s\2 flag has been removed for account \2%s\2."), "HIDELASTLOGIN", entity(si->smu)->name); return; } else { command_fail(si, fault_badparams, STR_INVALID_PARAMS, "HIDELASTLOGIN"); return; } }
static void gs_cmd_set_email(sourceinfo_t *si, int parc, char *parv[]) { mygroup_t *mg; char *mail = parv[1]; if (!(mg = mygroup_find(parv[0]))) { command_fail(si, fault_nosuch_target, _("Group \2%s\2 does not exist."), parv[0]); return; } if (si->smu == NULL) { command_fail(si, fault_noprivs, _("You are not logged in.")); return; } if (!groupacs_sourceinfo_has_flag(mg, si, GA_SET)) { command_fail(si, fault_noprivs, _("You are not authorized to execute this command.")); return; } if (!mail || !strcasecmp(mail, "NONE") || !strcasecmp(mail, "OFF")) { if (metadata_find(mg, "email")) { metadata_delete(mg, "email"); command_success_nodata(si, _("The e-mail address for group \2%s\2 was deleted."), entity(mg)->name); logcommand(si, CMDLOG_SET, "SET:EMAIL:NONE: \2%s\2", entity(mg)->name); return; } command_fail(si, fault_nochange, _("The e-mail address for group \2%s\2 was not set."), entity(mg)->name); return; } if (!validemail(mail)) { command_fail(si, fault_badparams, _("\2%s\2 is not a valid e-mail address."), mail); return; } /* we'll overwrite any existing metadata */ metadata_add(mg, "email", mail); logcommand(si, CMDLOG_SET, "SET:EMAIL: \2%s\2 \2%s\2", entity(mg)->name, mail); command_success_nodata(si, _("The e-mail address for group \2%s\2 has been set to \2%s\2."), parv[0], mail); }
static void bs_cmd_set_fantasy(struct sourceinfo *si, int parc, char *parv[]) { char *channel = parv[0]; char *option = parv[1]; struct mychan *mc; struct metadata *md; if (parc < 2 || !channel || !option) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "SET FANTASY"); command_fail(si, fault_needmoreparams, _("Syntax: SET <#channel> FANTASY {ON|OFF}")); return; } mc = mychan_find(channel); if (!mc) { command_fail(si, fault_nosuch_target, STR_IS_NOT_REGISTERED, channel); return; } if (!chanacs_source_has_flag(mc, si, CA_SET)) { command_fail(si, fault_noprivs, STR_NOT_AUTHORIZED); return; } if (!irccasecmp(option, "ON")) { if ((md = metadata_find(mc, "private:botserv:bot-assigned")) != NULL) metadata_add(mc, "private:botserv:bot-handle-fantasy", md->value); logcommand(si, CMDLOG_SET, "SET:FANTASY:ON: \2%s\2", mc->name); command_success_nodata(si, _("Fantasy mode is now \2ON\2 on channel %s."), mc->name); } else if(!irccasecmp(option, "OFF")) { metadata_delete(mc, "private:botserv:bot-handle-fantasy"); logcommand(si, CMDLOG_SET, "SET:FANTASY:OFF: \2%s\2", mc->name); command_success_nodata(si, _("Fantasy mode is now \2OFF\2 on channel %s."), mc->name); } else { command_fail(si, fault_badparams, STR_INVALID_PARAMS, "SET FANTASY"); command_fail(si, fault_badparams, _("Syntax: SET <#channel> FANTASY {ON|OFF}")); } }
static void gs_cmd_set_joinflags(sourceinfo_t *si, int parc, char *parv[]) { mygroup_t *mg; char *joinflags = parv[1]; unsigned int flags = 0; if (!(mg = mygroup_find(parv[0]))) { command_fail(si, fault_nosuch_target, _("Group \2%s\2 does not exist."), parv[0]); return; } if (!groupacs_sourceinfo_has_flag(mg, si, GA_SET)) { command_fail(si, fault_noprivs, STR_NOT_AUTHORIZED); return; } if (!joinflags || !strcasecmp("OFF", joinflags) || !strcasecmp("NONE", joinflags)) { /* not in a namespace to allow more natural use of SET PROPERTY. * they may be able to introduce spaces, though. c'est la vie. */ if (metadata_find(mg, "joinflags")) { metadata_delete(mg, "joinflags"); logcommand(si, CMDLOG_SET, "SET:JOINFLAGS:NONE: \2%s\2", entity(mg)->name); command_success_nodata(si, _("The group-specific join flags for \2%s\2 have been cleared."), parv[0]); return; } command_fail(si, fault_nochange, _("Join flags for \2%s\2 were not set."), parv[0]); return; } if (!strncasecmp(joinflags, "-", 1)) { command_fail(si, fault_badparams, _("You can't set join flags to be removed.")); return; } flags = gs_flags_parser(joinflags, 0, flags); /* we'll overwrite any existing metadata */ metadata_add(mg, "joinflags", number_to_string(flags)); logcommand(si, CMDLOG_SET, "SET:JOINFLAGS: \2%s\2 \2%s\2", entity(mg)->name, joinflags); command_success_nodata(si, _("The join flags of \2%s\2 have been set to \2%s\2."), parv[0], joinflags); }
static void os_cmd_connavg(sourceinfo_t *si, int parc, char *parv[]) { command_success_nodata(si, _("Connections in the last minute: %d"), s.connections); if (s.peak_time != 0) command_success_nodata(si, _("Peak connections: %d (Reached %s ago)"), s.peak_conn, time_ago(s.peak_time)); command_success_nodata(si, _("Configuration alert level: %d"), safe_connections); if (s.alert_time != 0) command_success_nodata(si, _("Alert peak last broken: %s ago"), time_ago(s.alert_time)); else command_success_nodata(si, _("Alert peak last broken: never")); logcommand(si, CMDLOG_GET, "CONNAVG"); }
/* SET EMAILMEMOS [ON|OFF] */ static void ns_cmd_set_emailmemos(sourceinfo_t *si, int parc, char *parv[]) { char *params = parv[0]; if (!params) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "EMAILMEMOS"); return; } if (!strcasecmp("ON", params)) { if (me.mta == NULL) { command_fail(si, fault_emailfail, _("Sending email is administratively disabled.")); return; } if (MU_EMAILMEMOS & si->smu->flags) { command_fail(si, fault_nochange, _("The \2%s\2 flag is already set for account \2%s\2."), "EMAILMEMOS", entity(si->smu)->name); return; } logcommand(si, CMDLOG_SET, "SET:EMAILMEMOS:ON"); si->smu->flags |= MU_EMAILMEMOS; command_success_nodata(si, _("The \2%s\2 flag has been set for account \2%s\2."), "EMAILMEMOS", entity(si->smu)->name); return; } else if (!strcasecmp("OFF", params)) { if (!(MU_EMAILMEMOS & si->smu->flags)) { command_fail(si, fault_nochange, _("The \2%s\2 flag is not set for account \2%s\2."), "EMAILMEMOS", entity(si->smu)->name); return; } logcommand(si, CMDLOG_SET, "SET:EMAILMEMOS:OFF"); si->smu->flags &= ~MU_EMAILMEMOS; command_success_nodata(si, _("The \2%s\2 flag has been removed for account \2%s\2."), "EMAILMEMOS", entity(si->smu)->name); return; } else { command_fail(si, fault_badparams, STR_INVALID_PARAMS, "EMAILMEMOS"); return; } }
static void os_cmd_set_akicktime(sourceinfo_t *si, int parc, char *parv[]) { char *minutes = parv[0]; if (!minutes) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "AKICKTIME"); command_fail(si, fault_needmoreparams, _("Syntax: SET AKICKTIME <minutes>")); return; } int value = atoi(minutes); if (value < 0) { command_fail(si, fault_badparams, _("AKICKTIME must be a positive integer, %s is invalid"), minutes); return; } else { unsigned int realvalue = value * 60; chansvs.akick_time = realvalue; command_success_nodata(si, "AKICKTIME has been successfully set to %s minutes.", minutes); logcommand(si, CMDLOG_ADMIN, "SET:AKICKTIME: \2%s\2", minutes); } }
static void os_cmd_set_maxfounders(sourceinfo_t *si, int parc, char *parv[]) { char *founders = parv[0]; if (!founders) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "MAXFOUNDERS"); command_fail(si, fault_needmoreparams, _("Syntax: SET MAXFOUNDERS <value>")); return; } int value = atoi(founders); /* Yes, I know how arbitrary the high value is, this is what it is in confprocess.c * (I rounded it down though) -- JD */ if (value < 1 || value > 41) { command_fail(si, fault_badparams, _("%s is invalid for MAXFOUNDERS value."), founders); return; } else { chansvs.maxfounders = value; command_success_nodata(si, "MAXFOUNDERS has been successfully set to %s.", founders); logcommand(si, CMDLOG_ADMIN, "SET:MAXFOUNDERS: \2%s\2", founders); } }
static void os_cmd_set_commitinterval(sourceinfo_t *si, int parc, char *parv[]) { char *minutes = parv[0]; if (!minutes) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "COMMITINTERVAL"); command_fail(si, fault_needmoreparams, _("Syntax: SET COMMITINTERVAL <minutes>")); return; } int value = atoi(minutes); if (value < 0) { command_fail(si, fault_badparams, _("COMMITINTERVAL must be a positive integer, %s is invalid"), minutes); return; } else { unsigned int realvalue = value * 60; config_options.commit_interval = realvalue; command_success_nodata(si, "COMMITINTERVAL has been successfully set to %s minutes.", minutes); logcommand(si, CMDLOG_ADMIN, "SET:COMMITINTERVAL: \2%s\2", minutes); } }
static void os_cmd_set_klinetime(sourceinfo_t *si, int parc, char *parv[]) { char *days = parv[0]; if (!days) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "KLINETIME"); command_fail(si, fault_needmoreparams, _("Syntax: SET KLINETIME <days>")); return; } int value = atoi(days); if (value < 0) { command_fail(si, fault_badparams, _("KLINETIME must be a positive integer, %s is invalid"), days); return; } else { unsigned int realvalue = value * 24 * 60 * 60; config_options.kline_time = realvalue; command_success_nodata(si, "KLINETIME has been successfully set to %s days.", days); logcommand(si, CMDLOG_ADMIN, "SET:KLINETIME: \2%s\2", days); } }
static void os_cmd_set_mdlimit(sourceinfo_t *si, int parc, char *parv[]) { char *limit = parv[0]; if (!limit) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "MDLIMIT"); command_fail(si, fault_needmoreparams, _("Syntax: SET MDLIMIT <value>")); return; } int value = atoi(limit); if (value < 1 || value > INT_MAX) { command_fail(si, fault_badparams, _("%s is invalid for MDLIMIT value."), limit); return; } else { me.mdlimit = value; command_success_nodata(si, "MDLIMIT has been successfully set to %s.", limit); logcommand(si, CMDLOG_ADMIN, "SET:MDLIMIT: \2%s\2", limit); } }
static void os_cmd_set_recontime(sourceinfo_t *si, int parc, char *parv[]) { char *recontime = parv[0]; if (!recontime) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "RECONTIME"); command_fail(si, fault_needmoreparams, _("Syntax: SET RECONTIME <seconds>")); return; } int value = atoi(recontime); if (value < 0) { command_fail(si, fault_badparams, _("RECONTIME must be a positive integer, %s is invalid"), recontime); return; } else { me.recontime = value; command_success_nodata(si, "RECONTIME has been successfully set to %s seconds.", recontime); logcommand(si, CMDLOG_ADMIN, "SET:RECONTIME: \2%s\2", recontime); } }
static void funserv_cmd_requestbot(sourceinfo_t *si, int parc, char *parv[]) { char *name = parv[0]; mychan_t *mc; if (!name) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "REQUESTBOT"); command_fail(si, fault_needmoreparams, _("Syntax: REQUESTBOT <#channel>")); } if (*name != '#') { command_fail(si, fault_needmoreparams, STR_INVALID_PARAMS, "REQUESTBOT"); command_fail(si, fault_needmoreparams, _("Syntax: REQUESTBOT <#channel>")); } if (!(mc = mychan_find(name))) { command_fail(si, fault_nosuch_target, _("Channel \2%s\2 is not registered."), name); return; } if (!is_founder(mc, entity(si->smu))) { command_fail(si, fault_noprivs, _("You are not authorized to perform this operation.")); return; } myuser_notice(funserv->nick, myuser_find_ext(BOTNAME), "JOIN %s", name); command_success_nodata(si, "The bot should now be in %s.", name); }
static void os_cmd_set_nickexpire(sourceinfo_t *si, int parc, char *parv[]) { char *days = parv[0]; if (!days) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "NICKEXPIRE"); command_fail(si, fault_needmoreparams, _("Syntax: SET NICKEXPIRE <days>")); return; } int value = atoi(days); if (value < 0) { command_fail(si, fault_badparams, _("NICKEXPIRE must be a positive integer, %s is invalid"), days); return; } else { unsigned int realvalue = value * 24 * 60 * 60; nicksvs.expiry = realvalue; command_success_nodata(si, "NICKEXPIRE has been successfully set to %s days.", days); logcommand(si, CMDLOG_ADMIN, "SET:NICKEXPIRE: \2%s\2", days); } }
static void ns_cmd_listownmail(sourceinfo_t *si, int parc, char *parv[]) { struct listmail_state state; if (si->smu == NULL) { command_fail(si, fault_noprivs, _("You are not logged in.")); return; } if (si->smu->flags & MU_WAITAUTH) { command_fail(si, fault_noprivs, _("You have to verify your email address before you can perform this operation.")); return; } command_add_flood(si, FLOOD_HEAVY); state.matches = 0; state.pattern = si->smu->email; state.origin = si; myentity_foreach_t(ENT_USER, listmail_foreach_cb, &state); logcommand(si, CMDLOG_GET, "LISTOWNMAIL: \2%s\2 (\2%d\2 matches)", si->smu->email, state.matches); command_success_nodata(si, ngettext(N_("\2%d\2 match for e-mail address \2%s\2"), N_("\2%d\2 matches for e-mail address \2%s\2"), state.matches), state.matches, si->smu->email); }
static void gs_cmd_leave(sourceinfo_t *si, int parc, char *parv[]) { mygroup_t *mg; if (!parv[0]) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "LEAVE"); command_fail(si, fault_needmoreparams, _("Syntax: LEAVE <!groupname>")); return; } if (!(mg = mygroup_find(parv[0]))) { command_fail(si, fault_alreadyexists, _("Group \2%s\2 does not exist."), parv[0]); return; } if (!groupacs_sourceinfo_has_flag(mg, si, 0)) { command_fail(si, fault_nosuch_target, _("You are not a member of group \2%s\2."), parv[0]); return; } groupacs_delete(mg, entity(si->smu)); command_success_nodata(si, _("You are not longer a member of group \2%s\2."), entity(mg)->name); }
static void cs_cmd_devoice(sourceinfo_t *si, int parc, char *parv[]) { char *chan = parv[0]; char *nick = parv[1]; mychan_t *mc; user_t *tu; chanuser_t *cu; if (!chan) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "DEVOICE"); command_fail(si, fault_needmoreparams, _("Syntax: DEVOICE <#channel> [nickname]")); return; } mc = mychan_find(chan); if (!mc) { command_fail(si, fault_nosuch_target, _("Channel \2%s\2 is not registered."), chan); return; } if (!chanacs_source_has_flag(mc, si, CA_VOICE)) { command_fail(si, fault_noprivs, _("You are not authorized to perform this operation.")); return; } /* figure out who we're going to devoice */ if (!nick) tu = si->su; else { if (!(tu = user_find_named(nick))) { command_fail(si, fault_nosuch_target, _("\2%s\2 is not online."), nick); return; } } if (is_internal_client(tu)) return; cu = chanuser_find(mc->chan, tu); if (!cu) { command_fail(si, fault_nosuch_target, _("\2%s\2 is not on \2%s\2."), tu->nick, mc->name); return; } modestack_mode_param(chansvs.nick, mc->chan, MTYPE_DEL, 'v', CLIENT_NAME(tu)); cu->modes &= ~CSTATUS_VOICE; if (si->c == NULL && tu != si->su) change_notify(chansvs.nick, tu, "You have been devoiced on %s by %s", mc->name, get_source_name(si)); logcommand(si, CMDLOG_DO, "DEVOICE: \2%s!%s@%s\2 on \2%s\2", tu->nick, tu->user, tu->vhost, mc->name); if (!chanuser_find(mc->chan, si->su)) command_success_nodata(si, _("\2%s\2 has been devoiced on \2%s\2."), tu->nick, mc->name); }
static void gs_cmd_fdrop(sourceinfo_t *si, int parc, char *parv[]) { mygroup_t *mg; char *name = parv[0]; if (!name) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "DROP"); command_fail(si, fault_needmoreparams, _("Syntax: DROP <!group>")); return; } if (*name != '!') { command_fail(si, fault_badparams, STR_INVALID_PARAMS, "DROP"); command_fail(si, fault_badparams, _("Syntax: DROP <!group>")); return; } if (!(mg = mygroup_find(name))) { command_fail(si, fault_nosuch_target, _("Group \2%s\2 does not exist."), name); return; } remove_group_chanacs(mg); hook_call_group_drop(mg); logcommand(si, CMDLOG_ADMIN | LG_REGISTER, "FDROP: \2%s\2", entity(mg)->name); wallops("%s dropped the group \2%s\2", get_oper_name(si), name); command_success_nodata(si, _("The group \2%s\2 has been dropped."), entity(mg)->name); object_unref(mg); return; }
static void cs_cmd_invite(struct sourceinfo *si, int parc, char *parv[]) { char *chan = parv[0]; struct mychan *mc; if (si->su == NULL) { command_fail(si, fault_noprivs, STR_IRC_COMMAND_ONLY, "INVITE"); return; } /* This command is not useful if the user is already in the channel, * ignore it if it is a fantasy command so users can program bots to * react on it without interference from ChanServ. */ if (si->c != NULL) return; if (!chan) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "INVITE"); command_fail(si, fault_needmoreparams, _("Syntax: INVITE <#channel>")); return; } if (!(mc = mychan_find(chan))) { command_fail(si, fault_nosuch_target, STR_IS_NOT_REGISTERED, chan); return; } if (metadata_find(mc, "private:close:closer")) { command_fail(si, fault_noprivs, STR_CHANNEL_IS_CLOSED, chan); return; } if (!chanacs_source_has_flag(mc, si, CA_INVITE)) { command_fail(si, fault_noprivs, STR_NOT_AUTHORIZED); return; } if (!mc->chan) { command_fail(si, fault_nosuch_target, STR_CHANNEL_IS_EMPTY, mc->name); return; } if (chanuser_find(mc->chan, si->su)) { command_fail(si, fault_noprivs, _("You're already on \2%s\2."), mc->name); return; } invite_sts(si->service->me, si->su, mc->chan); logcommand(si, CMDLOG_DO, "INVITE: \2%s\2", mc->name); command_success_nodata(si, _("You have been invited to \2%s\2."), mc->name); }
static void os_cmd_set_maxchanacs(sourceinfo_t *si, int parc, char *parv[]) { char *chanacs = parv[0]; if (!chanacs) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "MAXCHANACS"); command_fail(si, fault_needmoreparams, _("Syntax: SET MAXCHANACS <value>")); return; } int value = atoi(chanacs); if (value < 0 || value > INT_MAX) { command_fail(si, fault_badparams, _("%s is invalid for MAXCHANACS value."), chanacs); return; } else { chansvs.maxchanacs = value; command_success_nodata(si, "MAXCHANACS has been successfully set to %s.", chanacs); logcommand(si, CMDLOG_ADMIN, "SET:MAXCHANACS: \2%s\2", chanacs); } }
static void cs_cmd_invite(sourceinfo_t *si, int parc, char *parv[]) { char *chan = parv[0]; mychan_t *mc; if (si->su == NULL) { command_fail(si, fault_noprivs, _("\2%s\2 can only be executed via IRC."), "INVITE"); return; } /* This command is not useful if the user is already in the channel, * ignore it if it is a fantasy command so users can program bots to * react on it without interference from ChanServ. */ if (si->c != NULL) return; if (!chan) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "INVITE"); command_fail(si, fault_needmoreparams, _("Syntax: INVITE <#channel>")); return; } mc = mychan_find(chan); if (!mc) { command_fail(si, fault_nosuch_target, _("Channel \2%s\2 is not registered."), chan); return; } if (metadata_find(mc, "private:close:closer")) { command_fail(si, fault_noprivs, _("\2%s\2 is closed."), chan); return; } if (!chanacs_source_has_flag(mc, si, CA_INVITE)) { command_fail(si, fault_noprivs, _("You are not authorized to perform this operation.")); return; } if (!mc->chan) { command_fail(si, fault_nosuch_target, _("\2%s\2 is currently empty."), mc->name); return; } if (chanuser_find(mc->chan, si->su)) { command_fail(si, fault_noprivs, _("You're already on \2%s\2."), mc->name); return; } invite_sts(si->service->me, si->su, mc->chan); logcommand(si, CMDLOG_DO, "INVITE: \2%s\2", mc->name); command_success_nodata(si, _("You have been invited to \2%s\2."), mc->name); }
static void os_cmd_mode(sourceinfo_t *si, int parc, char *parv[]) { char *channel = parv[0]; char *mode = parv[1]; channel_t *c; int modeparc; char *modeparv[256]; if (!channel || !mode) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "MODE"); command_fail(si, fault_needmoreparams, _("Syntax: MODE <channel> <parameters>")); return; } c = channel_find(channel); if (!c) { command_fail(si, fault_nosuch_target, _("Channel \2%s\2 does not exist."), channel); return; } wallops("\2%s\2 is using MODE on \2%s\2 (set: \2%s\2)", get_oper_name(si), channel, mode); logcommand(si, CMDLOG_ADMIN, "MODE: \2%s\2 on \2%s\2", mode, channel); modeparc = sjtoken(mode, ' ', modeparv); channel_mode(si->service->me, c, modeparc, modeparv); command_success_nodata(si, _("Set modes \2%s\2 on \2%s\2."), mode, channel); }
// SET LANGUAGE <language> static void ns_cmd_set_language(struct sourceinfo *si, int parc, char *parv[]) { char *language = parv[0]; struct language *lang; if (!language) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "LANGUAGE"); command_fail(si, fault_needmoreparams, _("Valid languages are: %s"), language_names()); return; } lang = language_find(language); if (strcmp(language, "default") && (lang == NULL || !language_is_valid(lang))) { command_fail(si, fault_badparams, _("Invalid language \2%s\2."), language); command_fail(si, fault_badparams, _("Valid languages are: %s"), language_names()); return; } logcommand(si, CMDLOG_SET, "SET:LANGUAGE: \2%s\2", language_get_name(lang)); si->smu->language = lang; command_success_nodata(si, _("The language for \2%s\2 has been changed to \2%s\2."), entity(si->smu)->name, language_get_name(lang)); return; }
static void cs_cmd_set_url(sourceinfo_t *si, int parc, char *parv[]) { mychan_t *mc; char *url = parv[1]; if (!(mc = mychan_find(parv[0]))) { command_fail(si, fault_nosuch_target, _("Channel \2%s\2 is not registered."), parv[0]); return; } if (!(chanacs_source_has_flag(mc, si, CA_SET) || chanacs_source_has_flag(mc, si, CA_FOUNDER))) { command_fail(si, fault_noprivs, _("You are not authorized to execute this command.")); return; } if (!url || !strcasecmp("OFF", url) || !strcasecmp("NONE", url)) { /* not in a namespace to allow more natural use of SET PROPERTY. * they may be able to introduce spaces, though. c'est la vie. */ if (metadata_find(mc, "url")) { metadata_delete(mc, "url"); logcommand(si, CMDLOG_SET, "SET:URL:NONE: \2%s\2", mc->name); verbose(mc, _("\2%s\2 cleared the channel URL."), get_source_name(si)); command_success_nodata(si, _("The URL for \2%s\2 has been cleared."), mc->name); notify_channel_set_change(si, si->smu, mc, "URL", "Cleared"); return; } command_fail(si, fault_nochange, _("The URL for \2%s\2 was not set."), mc->name); return; } /* we'll overwrite any existing metadata */ metadata_add(mc, "url", url); logcommand(si, CMDLOG_SET, "SET:URL: \2%s\2 \2%s\2", mc->name, url); verbose(mc, _("\2%s\2 set the channel URL to \2%s\2"), get_source_name(si), url); command_success_nodata(si, _("The URL of \2%s\2 has been set to: \2%s\2"), mc->name, url); notify_channel_set_change(si, si->smu, mc, "URL", url); }
static void gs_cmd_set_channel(sourceinfo_t *si, int parc, char *parv[]) { mygroup_t *mg; char *chan = parv[1]; if (!(mg = mygroup_find(parv[0]))) { command_fail(si, fault_nosuch_target, _("Group \2%s\2 does not exist."), parv[0]); return; } if (si->smu == NULL) { command_fail(si, fault_noprivs, _("You are not logged in.")); return; } if (!groupacs_sourceinfo_has_flag(mg, si, GA_SET)) { command_fail(si, fault_noprivs, _("You are not authorized to execute this command.")); return; } if (!chan || !strcasecmp("OFF", chan) || !strcasecmp("NONE", chan)) { /* not in a namespace to allow more natural use of SET PROPERTY. * they may be able to introduce spaces, though. c'est la vie. */ if (metadata_find(mg, "channel")) { metadata_delete(mg, "channel"); logcommand(si, CMDLOG_SET, "SET:CHANNEL:NONE: \2%s\2", entity(mg)->name); command_success_nodata(si, _("The official channel for \2%s\2 has been cleared."), parv[0]); return; } command_fail(si, fault_nochange, _("A official channel for \2%s\2 was not set."), parv[0]); return; } /* we'll overwrite any existing metadata */ metadata_add(mg, "channel", chan); logcommand(si, CMDLOG_SET, "SET:CHANNEL: \2%s\2 \2%s\2", entity(mg)->name, chan); command_success_nodata(si, _("The official channel of \2%s\2 has been set to \2%s\2."), parv[0], chan); }
static void rs_cmd_info(sourceinfo_t *si, int parc, char *parv[]) { mychan_t *mc; metadata_t *md; if (parc < 1) { command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "INFO"); command_fail(si, fault_needmoreparams, _("Syntax: INFO <channel>")); return; } mc = mychan_find(parv[0]); if (!mc) { command_fail(si, fault_nosuch_target, _("Channel \2%s\2 is not registered."), parv[0]); return; } if (!metadata_find(mc, "private:rpgserv:enabled")) { command_fail(si, fault_nosuch_target, _("Channel \2%s\2 does not have RPGServ enabled."), parv[0]); return; } command_success_nodata(si, _("Information on \2%s\2:"), parv[0]); md = metadata_find(mc, "private:rpgserv:genre"); command_success_nodata(si, _("Genre : %s"), rs_prettyprint_keywords(md, genre_keys, genre_names, ARRAY_SIZE(genre_keys))); md = metadata_find(mc, "private:rpgserv:period"); command_success_nodata(si, _("Period : %s"), rs_prettyprint_keywords(md, period_keys, period_names, ARRAY_SIZE(period_keys))); md = metadata_find(mc, "private:rpgserv:ruleset"); command_success_nodata(si, _("Ruleset : %s"), rs_prettyprint_keywords(md, ruleset_keys, ruleset_names, ARRAY_SIZE(ruleset_keys))); md = metadata_find(mc, "private:rpgserv:rating"); command_success_nodata(si, _("Rating : %s"), rs_prettyprint_keywords(md, rating_keys, rating_names, ARRAY_SIZE(rating_keys))); md = metadata_find(mc, "private:rpgserv:system"); command_success_nodata(si, _("System : %s"), rs_prettyprint_keywords(md, system_keys, system_names, ARRAY_SIZE(system_keys))); md = metadata_find(mc, "private:rpgserv:setting"); command_success_nodata(si, _("Setting : %s"), md ? md->value : "<none>"); md = metadata_find(mc, "private:rpgserv:storyline"); command_success_nodata(si, _("Storyline: %s"), md ? md->value : "<none>"); md = metadata_find(mc, "private:rpgserv:summary"); command_success_nodata(si, _("Summary : %s"), md ? md->value : "<none>"); command_success_nodata(si, _("\2*** End of Info ***\2")); logcommand(si, CMDLOG_GET, "RPGSERV:INFO: \2%s\2", mc->name); }
static int listmail_foreach_cb(const char *key, void *data, void *privdata) { struct listmail_state *state = (struct listmail_state *) privdata; myuser_t *mu = (myuser_t *)data; if (!strcasecmp(state->pattern, mu->email)) { /* in the future we could add a LIMIT parameter */ if (state->matches == 0) command_success_nodata(state->origin, "Accounts matching e-mail address \2%s\2:", state->pattern); command_success_nodata(state->origin, "- %s (%s)", mu->name, mu->email); state->matches++; } return 0; }
static int listmail_foreach_cb(myentity_t *mt, void *privdata) { struct listmail_state *state = (struct listmail_state *) privdata; myuser_t *mu = user(mt); if (!match(state->pattern, mu->email)) { /* in the future we could add a LIMIT parameter */ if (state->matches == 0) command_success_nodata(state->origin, "Accounts matching e-mail address \2%s\2:", state->pattern); command_success_nodata(state->origin, "- %s (%s)", entity(mu)->name, mu->email); state->matches++; } return 0; }
/* HELP <command> [params] */ static void os_cmd_help(sourceinfo_t *si, int parc, char *parv[]) { char *command = parv[0]; if (!has_any_privs(si)) { command_fail(si, fault_noprivs, _("You are not authorized to use %s."), si->service->nick); return; } if (!command) { command_success_nodata(si, _("***** \2%s Help\2 *****"), si->service->nick); command_success_nodata(si, _("\2%s\2 provides essential network management services, such as\n" "routing manipulation and access restriction. Please do not abuse\n" "your access to \2%s\2!"), si->service->nick, si->service->nick); command_success_nodata(si, " "); command_success_nodata(si, _("For information on a command, type:")); command_success_nodata(si, "\2/%s%s help <command>\2", (ircd->uses_rcommand == false) ? "msg " : "", si->service->disp); command_success_nodata(si, " "); command_help(si, si->service->commands); command_success_nodata(si, _("***** \2End of Help\2 *****")); return; } /* take the command through the hash table */ help_display(si, si->service, command, si->service->commands); }