本文整理汇总了C++中CommandSource类的典型用法代码示例。如果您正苦于以下问题:C++ CommandSource类的具体用法?C++ CommandSource怎么用?C++ CommandSource使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了CommandSource类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DoStats
void DoStats(CommandSource &source, const bool is_global, const std::vector<Anope::string> ¶ms)
{
Anope::string display, channel;
/*
* possible parameters are:
* stats [channel] [nick]
* stats [channel]
* stats [nick]
* stats
*/
switch (params.size())
{
case 2:
channel = params[0];
display = params[1];
break;
case 1:
if (params[0][0] == '#')
channel = params[0];
else
{
if (NickAlias *na = NickAlias::Find(params[0]))
display = na->nc->display;
else
{
source.Reply(_("%s not found."), params[0].c_str());
return;
}
}
break;
}
if (display.empty())
display = source.nc->display;
try
{
SQL::Query query;
query = "SELECT letters, words, line, smileys_happy+smileys_sad+smileys_other as smileys,"
"actions FROM `" + prefix + "chanstats` "
"WHERE `nick` = @[email protected] AND `chan` = @[email protected] AND `type` = 'total';";
if (is_global || channel.empty())
query.SetValue("channel", "");
else
query.SetValue("channel", channel);
query.SetValue("nick", display);
SQL::Result res = this->RunQuery(query);
if (res.Rows() > 0)
{
if (is_global)
source.Reply(_("Network stats for %s:"), display.c_str());
else
source.Reply(_("Channel stats for %s on %s:"), display.c_str(), channel.c_str());
source.Reply(_("letters: %s, words: %s, lines: %s, smileys: %s, actions: %s"),
res.Get(0, "letters").c_str(), res.Get(0, "words").c_str(),
res.Get(0, "line").c_str(), res.Get(0, "smileys").c_str(),
res.Get(0, "actions").c_str());
}
else
source.Reply(_("No stats for %s."), display.c_str());
}
catch (const SQL::Exception &ex)
{
Log(LOG_DEBUG) << ex.GetReason();
}
}
示例2: OnHelp
bool OnHelp(CommandSource &source, const Anope::string &subcommand) override
{
if (subcommand.empty())
{
CommandInfo *help = source.service->FindCommand("generic/help");
if (!help)
return false;
source.Reply(_("Sets various memo options. \037option\037 can be one of:\n"
"\n"
" NOTIFY Changes when you will be notified about\n"
" new memos (only for nicknames)\n"
" LIMIT Sets the maximum number of memos you can\n"
" receive\n"
"\n"
"Type \002{0}{1} {2} {3} \037option\037\002 for more information on a specific option."),
Config->StrictPrivmsg, source.service->nick, help->cname, source.command);
}
else if (subcommand.equals_ci("NOTIFY"))
source.Reply(_("Syntax: \002NOTIFY {ON | LOGON | NEW | MAIL | NOMAIL | OFF}\002\n"
"\n"
"Changes when you will be notified about new memos:\n"
"\n"
" ON You will be notified of memos when you log on,\n"
" when you unset /AWAY, and when they are sent\n"
" to you.\n"
"\n"
" LOGON You will only be notified of memos when you log\n"
" on or when you unset /AWAY.\n"
"\n"
" NEW You will only be notified of memos when they\n"
" are sent to you.\n"
"\n"
" MAIL You will be notified of memos by email as well as\n"
" any other settings you have.\n"
"\n"
" NOMAIL You will not be notified of memos by email.\n"
"\n"
" OFF You will not receive any notification of memos.\n"
"\n"
"\002ON\002 is essentially \002LOGON\002 and \002NEW\002 combined."));
else if (subcommand.equals_ci("LIMIT"))
{
int max_memos = Config->GetModule("memoserv")->Get<int>("maxmemos");
if (source.IsServicesOper())
source.Reply(_("Syntax: \002LIMIT [\037user\037 | \037channel\037] {\037limit\037 | NONE} [HARD]\002\n"
"\n"
"Sets the maximum number of memos a user or channel is allowed to have."
" Setting the limit to 0 prevents the user from receiving any memos; setting it to \002NONE\002 allows the user to receive and keep as many memos as they want."
" If you do not give a nickname or channel, your own limit is set.\n"
"\n"
"Adding \002HARD\002 prevents the user from changing the limit."
" Not adding \002HARD\002 has the opposite effect, allowing the user to change the limit, even if a previous limit was set.\n"
" \n"
"This use of the \002{0} LIMIT\002 command is limited to \002Services Operators\002."
" Other users may only enter a limit for themselves or a channel on which they have the \002MEMO\002 privilege on, may not remove their limit, may not set a limit above {1}, and may not set a hard limit."),
source.command, max_memos);
else
source.Reply(_("Syntax: \002LIMIT [\037channel\037] \037limit\037\002\n"
"\n"
"Sets the maximum number of memos you, or the given channel, are allowed to have."
" If you set this to 0, no one will be able to send any memos to you."
"However, you cannot set this any higher than {0}."), max_memos);
}
else
return false;
return true;
}
示例3: Run
void Run(CommandSource &source, const std::vector<Flux::string> ¶ms)
{
source.Reply("My PID is: \2%i\2", (int)getpid());
Log(source.u, this) << "command to get navn's PID " << getpid();
}
示例4: OnHelp
bool OnHelp(CommandSource &source, const Anope::string &subcommand) override
{
source.Reply(_("Deactivates your vhost."));
return true;
}
示例5: Execute
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) override
{
const Anope::string &channel = params[0];
ChanServ::Channel *ci = ChanServ::Find(channel);
if (ci == NULL)
{
source.Reply(_("Channel \002{0}\002 isn't registered."), channel);
return;
}
if (!source.AccessFor(ci).HasPriv("SET") && !source.HasOverridePriv("chanserv/administration"))
{
source.Reply(_("Access denied. You do not have privilege \002{0}\002 on \002{1}\002."), "SET", ci->GetName());
return;
}
if (params.size() == 1)
{
std::vector<LogSetting *> ls = ci->GetRefs<LogSetting *>();
if (ls.empty())
{
source.Reply(_("There currently are no logging configurations for \002{0}\002."), ci->GetName());
return;
}
ListFormatter list(source.GetAccount());
list.AddColumn(_("Number")).AddColumn(_("Service")).AddColumn(_("Command")).AddColumn(_("Method")).AddColumn("");
for (unsigned i = 0; i < ls.size(); ++i)
{
LogSetting *log = ls[i];
ListFormatter::ListEntry entry;
entry["Number"] = stringify(i + 1);
entry["Service"] = log->GetCommandService();
entry["Command"] = !log->GetCommandName().empty() ? log->GetCommandName() : log->GetServiceName();
entry["Method"] = log->GetMethod();
entry[""] = log->GetExtra();
list.AddEntry(entry);
}
source.Reply(_("Log list for \002{0}\002:"), ci->GetName());
std::vector<Anope::string> replies;
list.Process(replies);
for (unsigned i = 0; i < replies.size(); ++i)
source.Reply(replies[i]);
}
else if (params.size() > 2)
{
if (Anope::ReadOnly)
{
source.Reply(_("Services are in read-only mode."));
return;
}
const Anope::string &command = params[1];
const Anope::string &method = params[2];
const Anope::string &extra = params.size() > 3 ? params[3] : "";
size_t sl = command.find('/');
if (sl == Anope::string::npos)
{
source.Reply(_("\002{0}\002 is not a valid command."), command);
return;
}
Anope::string service = command.substr(0, sl),
command_name = command.substr(sl + 1);
ServiceBot *bi = ServiceBot::Find(service, true);
Anope::string service_name;
/* Allow either a command name or a service name. */
if (bi && bi->commands.count(command_name))
{
/* Get service name from command */
service_name = bi->commands[command_name].name;
}
else if (ServiceReference<Command>(command.lower()))
{
/* This is the service name, don't use any specific command */
service_name = command;
bi = NULL;
command_name.clear();
}
else
{
source.Reply(_("\002{0}\002 is not a valid command."), command);
return;
}
if (!method.equals_ci("MESSAGE") && !method.equals_ci("NOTICE") && !method.equals_ci("MEMO"))
{
source.Reply(_("\002%s\002 is not a valid logging method."));
return;
}
//.........这里部分代码省略.........
示例6: DoAdd
void DoAdd(CommandSource &source, NickServ::Account *nc, const Anope::string &chans, const Anope::string &keys)
{
std::vector<AutoJoin *> channels = nc->GetRefs<AutoJoin *>();
Anope::string addedchans;
Anope::string alreadyadded;
Anope::string invalidkey;
commasepstream ksep(keys, true);
commasepstream csep(chans);
for (Anope::string chan, key; csep.GetToken(chan);)
{
ksep.GetToken(key);
unsigned i = 0;
for (; i < channels.size(); ++i)
if (channels[i]->GetChannel().equals_ci(chan))
break;
if (channels.size() >= Config->GetModule(this->GetOwner())->Get<unsigned>("ajoinmax"))
{
source.Reply(_("Sorry, the maximum of \002{0}\002 auto join entries has been reached."), Config->GetModule(this->GetOwner())->Get<unsigned>("ajoinmax"));
return;
}
if (i != channels.size())
alreadyadded += chan + ", ";
else if (IRCD->IsChannelValid(chan) == false)
source.Reply(_("\002{0}\002 isn't a valid channel."), chan);
else
{
Channel *c = Channel::Find(chan);
Anope::string k;
if (c && c->GetParam("KEY", k) && key != k)
{
invalidkey += chan + ", ";
continue;
}
AutoJoin *entry = Serialize::New<AutoJoin *>();
entry->SetOwner(nc);
entry->SetChannel(chan);
entry->SetKey(key);
addedchans += chan + ", ";
}
}
if (!alreadyadded.empty())
{
alreadyadded = alreadyadded.substr(0, alreadyadded.length() - 2);
source.Reply(_("\002{0}\002 is already on the auto join list of \002{1}\002."), alreadyadded, nc->GetDisplay());
}
if (!invalidkey.empty())
{
invalidkey = invalidkey.substr(0, invalidkey.length() - 2);
source.Reply(_("\002{0}\002 had an invalid key specified, and was ignored."), invalidkey);
}
if (addedchans.empty())
return;
addedchans = addedchans.substr(0, addedchans.length() - 2);
Log(nc == source.GetAccount() ? LOG_COMMAND : LOG_ADMIN, source, this) << "to ADD channel " << addedchans << " to " << nc->GetDisplay();
source.Reply(_("\002{0}\002 added to the auto join list of \002{1}\002."), addedchans, nc->GetDisplay());
}
示例7: Execute
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) override
{
const Anope::string &chan = params[0];
User *u = source.GetUser();
Channel *c = Channel::Find(chan);
if (!c)
{
source.Reply(_("Channel \002{0}\002 doesn't exist."), chan);
return;
}
ChanServ::Channel *ci = c->ci;
if (!ci)
{
source.Reply(_("Channel \002{0}\002 isn't registered."), c->name);
return;
}
if (!source.AccessFor(ci).HasPriv("INVITE") && !source.HasCommand("chanserv/invite"))
{
source.Reply(_("Access denied. You do not have privilege \002{0}\002 on \002{1}\002."), "INVITE", ci->GetName());
return;
}
User *u2;
if (params.size() == 1)
u2 = u;
else
u2 = User::Find(params[1], true);
if (!u2)
{
source.Reply(_("\002{0}\002 isn't currently online."), params.size() > 1 ? params[1] : source.GetNick());
return;
}
if (c->FindUser(u2))
{
if (u2 == u)
source.Reply(_("You are already in \002{0}\002!"), c->name);
else
source.Reply(_("\002{0}\002 is already in \002{1}\002!"), u2->nick, c->name);
return;
}
bool override = !source.AccessFor(ci).HasPriv("INVITE");
IRCD->SendInvite(ci->WhoSends(), c, u2);
if (u2 != u)
{
source.Reply(_("\002{0}\002 has been invited to \002{1}\002."), u2->nick, c->name);
u2->SendMessage(ci->WhoSends(), _("You have been invited to \002{0}\002 by \002{1}\002."), c->name, source.GetNick());
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "for " << u2->nick;
}
示例8: Execute
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) override
{
const Anope::string &target = params[0];
const Anope::string &modes = params[1];
Reference<Channel> c = Channel::Find(target);
if (!c)
source.Reply(_("Channel \002{0}\002 doesn't exist."), target);
else if (c->bouncy_modes)
source.Reply(_("Services is unable to change modes. Are your servers' U:lines configured correctly?"));
else if (modes.equals_ci("CLEAR"))
{
bool all = params.size() > 2 && params[2].equals_ci("ALL");
const Channel::ModeList chmodes = c->GetModes();
for (Channel::ModeList::const_iterator it = chmodes.begin(), it_end = chmodes.end(); it != it_end && c; ++it)
c->RemoveMode(c->ci->WhoSends(), it->first, it->second, false);
if (!c)
{
source.Reply(_("Modes cleared on %s and the channel destroyed."), target.c_str());
return;
}
if (all)
{
for (Channel::ChanUserList::iterator it = c->users.begin(), it_end = c->users.end(); it != it_end; ++it)
{
ChanUserContainer *uc = it->second;
if (uc->user->HasMode("OPER"))
continue;
for (size_t i = uc->status.Modes().length(); i > 0; --i)
c->RemoveMode(c->ci->WhoSends(), ModeManager::FindChannelModeByChar(uc->status.Modes()[i - 1]), uc->user->GetUID(), false);
}
source.Reply(_("All modes cleared on \002{0}\002."), c->name);
}
else
source.Reply(_("Non-status modes cleared on \002{0}\002."), c->name);
}
else
{
spacesepstream sep(modes + (params.size() > 2 ? " " + params[2] : ""));
Anope::string mode;
int add = 1;
Anope::string log_modes, log_params;
sep.GetToken(mode);
for (unsigned i = 0; i < mode.length() && c; ++i)
{
char ch = mode[i];
if (ch == '+')
{
add = 1;
log_modes += "+";
continue;
}
else if (ch == '-')
{
add = 0;
log_modes += "-";
continue;
}
ChannelMode *cm = ModeManager::FindChannelModeByChar(ch);
if (!cm)
continue;
Anope::string param, param_log;
if (cm->type != MODE_REGULAR)
{
if (cm->type == MODE_PARAM && !add && anope_dynamic_static_cast<ChannelModeParam *>(cm)->minus_no_arg)
;
else if (!sep.GetToken(param))
continue;
param_log = param;
if (cm->type == MODE_STATUS)
{
User *targ = User::Find(param, true);
if (targ == NULL || c->FindUser(targ) == NULL)
continue;
param = targ->GetUID();
}
}
log_modes += cm->mchar;
if (!param.empty())
log_params += " " + param_log;
if (add)
c->SetMode(source.service, cm, param, false);
else
c->RemoveMode(source.service, cm, param, false);
}
//.........这里部分代码省略.........
示例9: Execute
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
{
const Anope::string &chan = params[0];
const Anope::string &chdesc = params.size() > 1 ? params[1] : "";
User *u = source.u;
Channel *c = findchan(params[0]);
ChannelInfo *ci = cs_findchan(params[0]);
if (readonly)
source.Reply(_("Sorry, channel registration is temporarily disabled."));
else if (u->Account()->HasFlag(NI_UNCONFIRMED))
source.Reply(_("You must confirm your account before you can register a channel."));
else if (chan[0] == '&')
source.Reply(_("Local channels cannot be registered."));
else if (chan[0] != '#')
source.Reply(CHAN_SYMBOL_REQUIRED);
else if (!ircdproto->IsChannelValid(chan))
source.Reply(CHAN_X_INVALID, chan.c_str());
else if (ci)
source.Reply(_("Channel \002%s\002 is already registered!"), chan.c_str());
else if (c && !c->HasUserStatus(u, CMODE_OP))
source.Reply(_("You must be a channel operator to register the channel."));
else if (Config->CSMaxReg && u->Account()->channelcount >= Config->CSMaxReg && !u->HasPriv("chanserv/no-register-limit"))
source.Reply(u->Account()->channelcount > Config->CSMaxReg ? CHAN_EXCEEDED_CHANNEL_LIMIT : _(CHAN_REACHED_CHANNEL_LIMIT), Config->CSMaxReg);
else
{
ci = new ChannelInfo(chan);
ci->SetFounder(u->Account());
if (!chdesc.empty())
ci->desc = chdesc;
ci->mode_locks = def_mode_locks;
for (ChannelInfo::ModeList::iterator it = ci->mode_locks.begin(), it_end = ci->mode_locks.end(); it != it_end; ++it)
{
it->second.setter = u->nick;
it->second.ci = ci;
}
if (c && !c->topic.empty())
{
ci->last_topic = c->topic;
ci->last_topic_setter = c->topic_setter;
ci->last_topic_time = c->topic_time;
}
else
ci->last_topic_setter = source.owner->nick;
Log(LOG_COMMAND, u, this, ci);
source.Reply(_("Channel \002%s\002 registered under your nickname: %s"), chan.c_str(), u->nick.c_str());
/* Implement new mode lock */
if (c)
{
check_modes(c);
ChannelMode *cm;
if (u->FindChannel(c) != NULL)
{
/* On most ircds you do not receive the admin/owner mode till its registered */
if ((cm = ModeManager::FindChannelModeByName(CMODE_OWNER)))
c->SetMode(NULL, cm, u->nick);
else if ((cm = ModeManager::FindChannelModeByName(CMODE_PROTECT)))
c->RemoveMode(NULL, cm, u->nick);
}
/* Mark the channel as persistent */
if (c->HasMode(CMODE_PERM))
ci->SetFlag(CI_PERSIST);
/* Persist may be in def cflags, set it here */
else if (ci->HasFlag(CI_PERSIST) && (cm = ModeManager::FindChannelModeByName(CMODE_PERM)))
c->SetMode(NULL, CMODE_PERM);
}
FOREACH_MOD(I_OnChanRegistered, OnChanRegistered(ci));
}
return;
}
示例10: ProcessList
void ProcessList(CommandSource &source, const std::vector<Anope::string> ¶ms, ListFormatter &list)
{
const Anope::string &mask = params.size() > 1 ? params[1] : "";
if (session_service->GetExceptions().empty())
{
source.Reply(_("The session exception list is empty."));
return;
}
if (!mask.empty() && mask.find_first_not_of("1234567890,-") == Anope::string::npos)
{
class ExceptionListCallback : public NumberList
{
ListFormatter &list;
public:
ExceptionListCallback(ListFormatter &_list, const Anope::string &numlist) : NumberList(numlist, false), list(_list)
{
}
void HandleNumber(unsigned Number)
{
if (!Number || Number > session_service->GetExceptions().size())
return;
Exception *e = session_service->GetExceptions()[Number - 1];
ListFormatter::ListEntry entry;
entry["Number"] = stringify(Number);
entry["Mask"] = e->mask;
entry["By"] = e->who;
entry["Created"] = do_strftime(e->time);
entry["Limit"] = stringify(e->limit);
entry["Reason"] = e->reason;
this->list.addEntry(entry);
}
}
nl_list(list, mask);
nl_list.Process();
}
else
{
for (unsigned i = 0, end = session_service->GetExceptions().size(); i < end; ++i)
{
Exception *e = session_service->GetExceptions()[i];
if (mask.empty() || Anope::Match(e->mask, mask))
{
ListFormatter::ListEntry entry;
entry["Number"] = stringify(i + 1);
entry["Mask"] = e->mask;
entry["By"] = e->who;
entry["Created"] = do_strftime(e->time);
entry["Limit"] = stringify(e->limit);
entry["Reason"] = e->reason;
list.addEntry(entry);
}
}
}
if (list.isEmpty())
source.Reply(_("No matching entries on session-limit exception list."));
else
{
source.Reply(_("Current Session Limit Exception list:"));
std::vector<Anope::string> replies;
list.Process(replies);
for (unsigned i = 0; i < replies.size(); ++i)
source.Reply(replies[i]);
}
}
示例11: DoAdd
void DoAdd(CommandSource &source, const std::vector<Anope::string> ¶ms)
{
User *u = source.u;
Anope::string mask, expiry, limitstr;
unsigned last_param = 3;
mask = params.size() > 1 ? params[1] : "";
if (!mask.empty() && mask[0] == '+')
{
expiry = mask;
mask = params.size() > 2 ? params[2] : "";
last_param = 4;
}
limitstr = params.size() > last_param - 1 ? params[last_param - 1] : "";
if (params.size() <= last_param)
{
this->OnSyntaxError(source, "ADD");
return;
}
Anope::string reason = params[last_param];
if (last_param == 3 && params.size() > 4)
reason += " " + params[4];
if (reason.empty())
{
this->OnSyntaxError(source, "ADD");
return;
}
time_t expires = !expiry.empty() ? dotime(expiry) : Config->ExceptionExpiry;
if (expires < 0)
{
source.Reply(BAD_EXPIRY_TIME);
return;
}
else if (expires > 0)
expires += Anope::CurTime;
int limit = -1;
try
{
limit = convertTo<int>(limitstr);
}
catch (const ConvertException &) { }
if (limit < 0 || limit > static_cast<int>(Config->MaxSessionLimit))
{
source.Reply(_("Invalid session limit. It must be a valid integer greater than or equal to zero and less than \002%d\002."), Config->MaxSessionLimit);
return;
}
else
{
if (mask.find('!') != Anope::string::npos || mask.find('@') != Anope::string::npos)
{
source.Reply(_("Invalid hostmask. Only real hostmasks are valid, as exceptions are not matched against nicks or usernames."));
return;
}
for (std::vector<Exception *>::iterator it = session_service->GetExceptions().begin(), it_end = session_service->GetExceptions().end(); it != it_end; ++it)
{
Exception *e = *it;
if (e->mask.equals_ci(mask))
{
if (e->limit != limit)
{
e->limit = limit;
source.Reply(_("Exception for \002%s\002 has been updated to %d."), mask.c_str(), e->limit);
}
else
source.Reply(_("\002%s\002 already exists on the EXCEPTION list."), mask.c_str());
return;
}
}
Exception *exception = new Exception();
exception->mask = mask;
exception->limit = limit;
exception->reason = reason;
exception->time = Anope::CurTime;
exception->who = u->nick;
exception->expires = expires;
EventReturn MOD_RESULT;
FOREACH_RESULT(I_OnExceptionAdd, OnExceptionAdd(exception));
if (MOD_RESULT == EVENT_STOP)
delete exception;
else
{
session_service->AddException(exception);
source.Reply(_("Session limit for \002%s\002 set to \002%d\002."), mask.c_str(), limit);
if (readonly)
source.Reply(READ_ONLY_MODE);
}
}
return;
}
示例12: OnServHelp
void Command::OnServHelp(CommandSource &source)
{
source.Reply(" %-14s %s", source.command.c_str(), Language::Translate(source.nc, this->GetDesc(source).c_str()));
}
示例13: Execute
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) override
{
if (!this->fs)
return;
const Anope::string &command = params[0];
const Anope::string &subcommand = params.size() > 1 ? params[1] : "";
ForbidType ftype = FT_SIZE;
if (subcommand.equals_ci("NICK"))
ftype = FT_NICK;
else if (subcommand.equals_ci("CHAN"))
ftype = FT_CHAN;
else if (subcommand.equals_ci("EMAIL"))
ftype = FT_EMAIL;
else if (subcommand.equals_ci("REGISTER"))
ftype = FT_REGISTER;
if (command.equals_ci("ADD") && params.size() > 3 && ftype != FT_SIZE)
{
const Anope::string &expiry = params[2][0] == '+' ? params[2] : "";
const Anope::string &entry = !expiry.empty() ? params[3] : params[2];
Anope::string reason;
if (expiry.empty())
reason = params[3] + " ";
if (params.size() > 4)
reason += params[4];
reason.trim();
if (entry.replace_all_cs("?*", "").empty())
{
source.Reply(_("The mask must contain at least one non wildcard character."));
return;
}
time_t expiryt = 0;
if (!expiry.empty())
{
expiryt = Anope::DoTime(expiry);
if (expiryt == -1)
{
source.Reply(_("Invalid expiry time \002{0}\002."), expiry);
return;
}
else if (expiryt)
expiryt += Anope::CurTime;
}
NickServ::Nick *target = NickServ::FindNick(entry);
if (target != NULL && Config->GetModule("nickserv")->Get<bool>("secureadmins", "yes") && target->GetAccount()->IsServicesOper())
{
source.Reply(_("Access denied."));
return;
}
ForbidData *d = this->fs->FindForbid(entry, ftype);
bool created = false;
if (d == NULL)
{
d = Serialize::New<ForbidData *>();
created = true;
}
d->SetMask(entry);
d->SetCreator(source.GetNick());
d->SetReason(reason);
d->SetCreated(Anope::CurTime);
d->SetExpires(expiryt);
d->SetType(ftype);
if (Anope::ReadOnly)
source.Reply(_("Services are in read-only mode. Any changes made may not persist."));
Log(LOG_ADMIN, source, this) << "to add a forbid on " << entry << " of type " << subcommand;
source.Reply(_("Added a forbid on \002{0}\002 of type \002{1}\002 to expire on \002{2}\002."), entry, subcommand.lower(), expiryt ? Anope::strftime(expiryt, source.GetAccount()) : "never");
/* apply forbid */
switch (ftype)
{
case FT_NICK:
{
int na_matches = 0;
for (user_map::const_iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it)
this->OnUserNickChange(it->second);
for (auto it = NickServ::service->GetNickList().begin(); it != NickServ::service->GetNickList().end();)
{
NickServ::Nick *na = *it;
++it;
d = this->fs->FindForbid(na->GetNick(), FT_NICK);
if (d == NULL)
continue;
++na_matches;
delete na;
}
//.........这里部分代码省略.........
示例14: Execute
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
{
const Anope::string &subcommand = params[0];
if (subcommand.equals_ci("ADD") && params.size() > 2)
{
const Anope::string &oper = params[1];
const Anope::string &otype = params[2];
NickAlias *na = findnick(oper);
if (na == NULL)
source.Reply(NICK_X_NOT_REGISTERED, oper.c_str());
else if (na->nc->o)
source.Reply(_("Nick \2%s\2 is already an operator."), na->nick.c_str());
else
{
OperType *ot = OperType::Find(otype);
if (ot == NULL)
source.Reply(_("Oper type \2%s\2 has not been configured."), otype.c_str());
else
{
na->nc->o = new MyOper(na->nc->display, ot);
Log(LOG_ADMIN, source.u, this) << "ADD " << na->nick << " as type " << ot->GetName();
source.Reply("%s (%s) added to the \2%s\2 list.", na->nick.c_str(), na->nc->display.c_str(), ot->GetName().c_str());
}
}
}
else if (subcommand.equals_ci("DEL") && params.size() > 1)
{
const Anope::string &oper = params[1];
NickAlias *na = findnick(oper);
if (na == NULL)
source.Reply(NICK_X_NOT_REGISTERED, oper.c_str());
else if (!na->nc || !na->nc->o)
source.Reply(_("Nick \2%s\2 is not a services operator."), oper.c_str());
else
{
delete na->nc->o;
na->nc->o = NULL;
Log(LOG_ADMIN, source.u, this) << "DEL " << na->nick;
source.Reply(_("Oper privileges removed from %s (%s)."), na->nick.c_str(), na->nc->display.c_str());
}
}
else if (subcommand.equals_ci("LIST"))
{
source.Reply(_("Name Type"));
for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it)
{
NickCore *nc = it->second;
if (!nc->o)
continue;
source.Reply(_("%-8s %s"), nc->o->name.c_str(), nc->o->ot->GetName().c_str());
if (nc->o->config)
source.Reply(_(" This oper is configured in the configuration file."));
for (std::list<User *>::iterator uit = nc->Users.begin(); uit != nc->Users.end(); ++uit)
{
User *u = *uit;
source.Reply(_(" %s is online using this oper block."), u->nick.c_str());
}
}
}
else if (subcommand.equals_ci("INFO") && params.size() > 1)
{
Anope::string fulltype = params[1];
if (params.size() > 2)
fulltype += " " + params[2];
OperType *ot = OperType::Find(fulltype);
if (ot == NULL)
source.Reply(_("Oper type \2%s\2 has not been configured."), fulltype.c_str());
else
{
if (ot->GetCommands().empty())
source.Reply(_("Opertype \2%s\2 has no allowed commands."), ot->GetName().c_str());
else
{
source.Reply(_("Available commands for \2%s\2:"), ot->GetName().c_str());
Anope::string buf;
std::list<Anope::string> cmds = ot->GetCommands();
for (std::list<Anope::string>::const_iterator it = cmds.begin(), it_end = cmds.end(); it != it_end; ++it)
{
buf += *it + " ";
if (buf.length() > 400)
{
source.Reply("%s", buf.c_str());
buf.clear();
}
}
if (!buf.empty())
{
source.Reply("%s", buf.c_str());
buf.clear();
}
}
if (ot->GetPrivs().empty())
source.Reply(_("Opertype \2%s\2 has no allowed privileges."), ot->GetName().c_str());
//.........这里部分代码省略.........
示例15: OnPreCommand
EventReturn OnPreCommand(CommandSource &source, Command *command, std::vector<Anope::string> ¶ms) override
{
if (command->GetName() == "nickserv/info" && params.size() > 0)
{
ForbidData *d = this->forbid_service.FindForbid(params[0], FT_NICK);
if (d != NULL)
{
if (source.IsOper())
source.Reply(_("Nick \002%s\002 is forbidden by %s: %s"), params[0], d->GetCreator(), d->GetReason());
else
source.Reply(_("Nick \002%s\002 is forbidden."), params[0]);
return EVENT_STOP;
}
}
else if (command->GetName() == "chanserv/info" && params.size() > 0)
{
ForbidData *d = this->forbid_service.FindForbid(params[0], FT_CHAN);
if (d != NULL)
{
if (source.IsOper())
source.Reply(_("Channel \002%s\002 is forbidden by %s: %s"), params[0], d->GetCreator(), d->GetReason());
else
source.Reply(_("Channel \002%s\002 is forbidden."), params[0]);
return EVENT_STOP;
}
}
else if (source.IsOper())
return EVENT_CONTINUE;
else if (command->GetName() == "nickserv/register" && params.size() > 1)
{
ForbidData *d = this->forbid_service.FindForbid(source.GetNick(), FT_REGISTER);
if (d != NULL)
{
source.Reply(_("\002{0}\002 may not be registered."), source.GetNick());
return EVENT_STOP;
}
d = this->forbid_service.FindForbid(params[1], FT_EMAIL);
if (d != NULL)
{
source.Reply(_("Your email address is not allowed, choose a different one."));
return EVENT_STOP;
}
}
else if (command->GetName() == "nickserv/set/email" && params.size() > 0)
{
ForbidData *d = this->forbid_service.FindForbid(params[0], FT_EMAIL);
if (d != NULL)
{
source.Reply(_("Your email address is not allowed, choose a different one."));
return EVENT_STOP;
}
}
else if (command->GetName() == "chanserv/register" && !params.empty())
{
ForbidData *d = this->forbid_service.FindForbid(params[0], FT_REGISTER);
if (d != NULL)
{
source.Reply(_("Channel \002{0}\002 is currently suspended."), params[0]);
return EVENT_STOP;
}
}
return EVENT_CONTINUE;
}