1
0
mirror of https://github.com/anope/anope.git synced 2026-07-01 18:46:39 +02:00

Send replies from fantasy commands back to the channel, this will be expanded on later

This commit is contained in:
Adam
2010-11-24 21:40:56 -06:00
parent 37e02a3594
commit cb6ef574e3
154 changed files with 2428 additions and 2111 deletions
+1 -1
View File
@@ -9,6 +9,7 @@ Legend:
[x] Allow users to delete their own access
[x] ChanServ CLONE command
[x] XMLRPC to execute commands and get data from Anope
[+] fantasy: allow replies/notifications to fantasy commands to go to the channel via notice
Future
------
@@ -21,7 +22,6 @@ Future
[ ] Allow channel founders to change the fantasy trigger for their channel.
[ ] CIDR Akills, session exceptions, etc
[?] Language charset stuff, including collation (1.9.1? phoenix?)
[ ] fantasy: allow replies/notifications to fantasy commands to go to the channel via notice
[?] a way for a module to queue itself (or even another module) for unloading
[ ] Useful/common "third party" modules to core distro
[ ] NS AJOIN
+22 -2
View File
@@ -43,6 +43,25 @@ enum CommandFlag
CFLAG_DISABLE_FANTASY
};
/* The source for a command */
struct CommandSource
{
/* User executing the command */
User *u;
/* Channel (if applicable) */
ChannelInfo *ci;
/* The service this command is on */
BotInfo *owner;
/* The service the reply should come from, *not* necessarily the service the command is on */
BotInfo *service;
/* Whether or not this was a fantasy command */
bool fantasy;
void Reply(LanguageString message, ...);
void Reply(const char *message, ...);
void Reply(const Anope::string &message);
};
/** Every services command is a class, inheriting from Command.
*/
class CoreExport Command : public Flags<CommandFlag>
@@ -73,9 +92,10 @@ class CoreExport Command : public Flags<CommandFlag>
virtual ~Command();
/** Execute this command.
* @param u The user executing the command.
* @param source The source
* @param params Command parameters
*/
virtual CommandReturn Execute(User *u, const std::vector<Anope::string> &);
virtual CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params) = 0;
/** Called when HELP is requsted for the client this command is on.
* @param u The user requesting help
+2 -3
View File
@@ -380,12 +380,11 @@ class CoreExport Module : public Extensible
virtual EventReturn OnPreCommand(User *u, BotInfo *service, const Anope::string &command, const std::vector<Anope::string> &params) { return EVENT_CONTINUE; }
/** Called after a command has been executed.
* @param u The user executing the command
* @param service The service the command is associated with
* @param source The source of the command
* @param command The command the user executed
* @param params The parameters the user sent
*/
virtual void OnPostCommand(User *u, BotInfo *service, const Anope::string &command, const std::vector<Anope::string> &params) { }
virtual void OnPostCommand(CommandSource &source, Command *command, const std::vector<Anope::string> &params) { }
/** Called after the core has finished loading the databases, but before
* we connect to the server
+6 -5
View File
@@ -20,26 +20,27 @@ class CommandBSAct : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci = cs_findchan(params[0]);
User *u = source.u;
ChannelInfo *ci = source.ci;
Anope::string message = params[1];
if (!check_access(u, ci, CA_SAY))
{
u->SendMessage(BotServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
if (!ci->bi)
{
u->SendMessage(BotServ, BOT_NOT_ASSIGNED);
source.Reply(BOT_NOT_ASSIGNED);
return MOD_CONT;
}
if (!ci->c || !ci->c->FindUser(ci->bi))
{
u->SendMessage(BotServ, BOT_NOT_ON_CHANNEL, ci->name.c_str());
source.Reply(BOT_NOT_ON_CHANNEL, ci->name.c_str());
return MOD_CONT;
}
+12 -13
View File
@@ -20,42 +20,41 @@ class CommandBSAssign : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
Anope::string nick = params[1];
BotInfo *bi;
ChannelInfo *ci;
const Anope::string &chan = params[0];
const Anope::string &nick = params[1];
User *u = source.u;
ChannelInfo *ci = source.ci;
if (readonly)
{
u->SendMessage(BotServ, BOT_ASSIGN_READONLY);
source.Reply(BOT_ASSIGN_READONLY);
return MOD_CONT;
}
if (!(bi = findbot(nick)))
BotInfo *bi = findbot(nick);
if (!bi)
{
u->SendMessage(BotServ, BOT_DOES_NOT_EXIST, nick.c_str());
source.Reply(BOT_DOES_NOT_EXIST, nick.c_str());
return MOD_CONT;
}
ci = cs_findchan(chan);
if (ci->botflags.HasFlag(BS_NOBOT) || (!check_access(u, ci, CA_ASSIGN) && !u->Account()->HasPriv("botserv/administration")))
{
u->SendMessage(BotServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
if (bi->HasFlag(BI_PRIVATE) && !u->Account()->HasCommand("botserv/assign/private"))
{
u->SendMessage(BotServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
if (ci->bi && nick.equals_ci(ci->bi->nick))
{
u->SendMessage(BotServ, BOT_ASSIGN_ALREADY, ci->bi->nick.c_str(), chan.c_str());
source.Reply(BOT_ASSIGN_ALREADY, ci->bi->nick.c_str(), chan.c_str());
return MOD_CONT;
}
+56 -56
View File
@@ -15,88 +15,87 @@
class BadwordsListCallback : public NumberList
{
User *u;
ChannelInfo *ci;
CommandSource &source;
bool SentHeader;
public:
BadwordsListCallback(User *_u, ChannelInfo *_ci, const Anope::string &list) : NumberList(list, false), u(_u), ci(_ci), SentHeader(false)
BadwordsListCallback(CommandSource &_source, const Anope::string &list) : NumberList(list, false), source(_source), SentHeader(false)
{
}
~BadwordsListCallback()
{
if (!SentHeader)
u->SendMessage(BotServ, BOT_BADWORDS_NO_MATCH, ci->name.c_str());
source.Reply(BOT_BADWORDS_NO_MATCH, source.ci->name.c_str());
}
void HandleNumber(unsigned Number)
{
if (!Number || Number > ci->GetBadWordCount())
if (!Number || Number > source.ci->GetBadWordCount())
return;
if (!SentHeader)
{
SentHeader = true;
u->SendMessage(BotServ, BOT_BADWORDS_LIST_HEADER, ci->name.c_str());
source.Reply(BOT_BADWORDS_LIST_HEADER, source.ci->name.c_str());
}
DoList(u, ci, Number - 1, ci->GetBadWord(Number - 1));
DoList(source, Number - 1, source.ci->GetBadWord(Number - 1));
}
static void DoList(User *u, ChannelInfo *ci, unsigned Number, BadWord *bw)
static void DoList(CommandSource &source, unsigned Number, BadWord *bw)
{
u->SendMessage(BotServ, BOT_BADWORDS_LIST_FORMAT, Number + 1, bw->word.c_str(), bw->type == BW_SINGLE ? "(SINGLE)" : (bw->type == BW_START ? "(START)" : (bw->type == BW_END ? "(END)" : "")));
source.Reply(BOT_BADWORDS_LIST_FORMAT, Number + 1, bw->word.c_str(), bw->type == BW_SINGLE ? "(SINGLE)" : (bw->type == BW_START ? "(START)" : (bw->type == BW_END ? "(END)" : "")));
}
};
class BadwordsDelCallback : public NumberList
{
User *u;
ChannelInfo *ci;
CommandSource &source;
Command *c;
unsigned Deleted;
bool override;
public:
BadwordsDelCallback(User *_u, ChannelInfo *_ci, Command *_c, const Anope::string &list) : NumberList(list, true), u(_u), ci(_ci), c(_c), Deleted(0), override(false)
BadwordsDelCallback(CommandSource &_source, Command *_c, const Anope::string &list) : NumberList(list, true), source(_source), c(_c), Deleted(0), override(false)
{
if (!check_access(u, ci, CA_BADWORDS) && u->Account()->HasPriv("botserv/administration"))
if (!check_access(source.u, source.ci, CA_BADWORDS) && source.u->Account()->HasPriv("botserv/administration"))
this->override = true;
}
~BadwordsDelCallback()
{
if (!Deleted)
u->SendMessage(BotServ, BOT_BADWORDS_NO_MATCH, ci->name.c_str());
source.Reply(BOT_BADWORDS_NO_MATCH, source.ci->name.c_str());
else if (Deleted == 1)
u->SendMessage(BotServ, BOT_BADWORDS_DELETED_ONE, ci->name.c_str());
source.Reply(BOT_BADWORDS_DELETED_ONE, source.ci->name.c_str());
else
u->SendMessage(BotServ, BOT_BADWORDS_DELETED_SEVERAL, Deleted, ci->name.c_str());
source.Reply(BOT_BADWORDS_DELETED_SEVERAL, Deleted, source.ci->name.c_str());
}
void HandleNumber(unsigned Number)
{
if (!Number || Number > ci->GetBadWordCount())
if (!Number || Number > source.ci->GetBadWordCount())
return;
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, c, ci) << "DEL " << ci->GetBadWord(Number -1 )->word;
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, c, source.ci) << "DEL " << source.ci->GetBadWord(Number - 1)->word;
++Deleted;
ci->EraseBadWord(Number - 1);
source.ci->EraseBadWord(Number - 1);
}
};
class CommandBSBadwords : public Command
{
private:
CommandReturn DoList(User *u, ChannelInfo *ci, const Anope::string &word)
CommandReturn DoList(CommandSource &source, const Anope::string &word)
{
bool override = !check_access(u, ci, CA_BADWORDS);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "LIST";
ChannelInfo *ci = source.ci;
bool override = !check_access(source.u, ci, CA_BADWORDS);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, this, ci) << "LIST";
if (!ci->GetBadWordCount())
u->SendMessage(BotServ, BOT_BADWORDS_LIST_EMPTY, ci->name.c_str());
source.Reply(BOT_BADWORDS_LIST_EMPTY, ci->name.c_str());
else if (!word.empty() && word.find_first_not_of("1234567890,-") == Anope::string::npos)
{
BadwordsListCallback list(u, ci, word);
BadwordsListCallback list(source, word);
list.Process();
}
else
@@ -113,21 +112,22 @@ class CommandBSBadwords : public Command
if (!SentHeader)
{
SentHeader = true;
u->SendMessage(BotServ, BOT_BADWORDS_LIST_HEADER, ci->name.c_str());
source.Reply(BOT_BADWORDS_LIST_HEADER, ci->name.c_str());
}
BadwordsListCallback::DoList(u, ci, i, bw);
BadwordsListCallback::DoList(source, i, bw);
}
if (!SentHeader)
u->SendMessage(BotServ, BOT_BADWORDS_NO_MATCH, ci->name.c_str());
source.Reply(BOT_BADWORDS_NO_MATCH, ci->name.c_str());
}
return MOD_CONT;
}
CommandReturn DoAdd(User *u, ChannelInfo *ci, const Anope::string &word)
CommandReturn DoAdd(CommandSource &source, const Anope::string &word)
{
ChannelInfo *ci = source.ci;
size_t pos = word.rfind(' ');
BadWordType type = BW_ANY;
Anope::string realword = word;
@@ -149,7 +149,7 @@ class CommandBSBadwords : public Command
if (ci->GetBadWordCount() >= Config->BSBadWordsMax)
{
u->SendMessage(BotServ, BOT_BADWORDS_REACHED_LIMIT, Config->BSBadWordsMax);
source.Reply(BOT_BADWORDS_REACHED_LIMIT, Config->BSBadWordsMax);
return MOD_CONT;
}
@@ -159,26 +159,27 @@ class CommandBSBadwords : public Command
if (!bw->word.empty() && ((Config->BSCaseSensitive && realword.equals_cs(bw->word)) || (!Config->BSCaseSensitive && realword.equals_ci(bw->word))))
{
u->SendMessage(BotServ, BOT_BADWORDS_ALREADY_EXISTS, bw->word.c_str(), ci->name.c_str());
source.Reply(BOT_BADWORDS_ALREADY_EXISTS, bw->word.c_str(), ci->name.c_str());
return MOD_CONT;
}
}
bool override = !check_access(u, ci, CA_BADWORDS);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "ADD " << realword;
bool override = !check_access(source.u, ci, CA_BADWORDS);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, this, ci) << "ADD " << realword;
ci->AddBadWord(realword, type);
u->SendMessage(BotServ, BOT_BADWORDS_ADDED, realword.c_str(), ci->name.c_str());
source.Reply(BOT_BADWORDS_ADDED, realword.c_str(), ci->name.c_str());
return MOD_CONT;
}
CommandReturn DoDelete(User *u, ChannelInfo *ci, const Anope::string &word)
CommandReturn DoDelete(CommandSource &source, const Anope::string &word)
{
ChannelInfo *ci = source.ci;
/* Special case: is it a number/list? Only do search if it isn't. */
if (!word.empty() && isdigit(word[0]) && word.find_first_not_of("1234567890,-") == Anope::string::npos)
{
BadwordsDelCallback list(u, ci, this, word);
BadwordsDelCallback list(source, this, word);
list.Process();
}
else
@@ -196,27 +197,28 @@ class CommandBSBadwords : public Command
if (i == end)
{
u->SendMessage(BotServ, BOT_BADWORDS_NOT_FOUND, word.c_str(), ci->name.c_str());
source.Reply(BOT_BADWORDS_NOT_FOUND, word.c_str(), ci->name.c_str());
return MOD_CONT;
}
bool override = !check_access(u, ci, CA_BADWORDS);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "DEL " << badword->word;
bool override = !check_access(source.u, ci, CA_BADWORDS);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, this, ci) << "DEL " << badword->word;
ci->EraseBadWord(i);
u->SendMessage(BotServ, BOT_BADWORDS_DELETED, badword->word.c_str(), ci->name.c_str());
source.Reply(BOT_BADWORDS_DELETED, badword->word.c_str(), ci->name.c_str());
}
return MOD_CONT;
}
CommandReturn DoClear(User *u, ChannelInfo *ci)
CommandReturn DoClear(CommandSource &source)
{
bool override = !check_access(u, ci, CA_BADWORDS);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "CLEAR";
ChannelInfo *ci = source.ci;
bool override = !check_access(source.u, ci, CA_BADWORDS);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, this, ci) << "CLEAR";
ci->ClearBadWords();
u->SendMessage(BotServ, BOT_BADWORDS_CLEAR);
source.Reply(BOT_BADWORDS_CLEAR);
return MOD_CONT;
}
public:
@@ -224,12 +226,12 @@ class CommandBSBadwords : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
Anope::string cmd = params[1];
Anope::string word = params.size() > 2 ? params[2] : "";
ChannelInfo *ci;
const Anope::string &cmd = params[1];
const Anope::string &word = params.size() > 2 ? params[2] : "";
User *u = source.u;
ChannelInfo *ci = source.ci;
bool need_args = cmd.equals_ci("LIST") || cmd.equals_ci("CLEAR");
if (!need_args && word.empty())
@@ -238,28 +240,26 @@ class CommandBSBadwords : public Command
return MOD_CONT;
}
ci = cs_findchan(chan);
if (!check_access(u, ci, CA_BADWORDS) && (!need_args || !u->Account()->HasPriv("botserv/administration")))
{
u->SendMessage(BotServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
if (readonly)
{
u->SendMessage(BotServ, BOT_BADWORDS_DISABLED);
source.Reply(BOT_BADWORDS_DISABLED);
return MOD_CONT;
}
if (cmd.equals_ci("ADD"))
return this->DoAdd(u, ci, word);
return this->DoAdd(source, word);
else if (cmd.equals_ci("DEL"))
return this->DoDelete(u, ci, word);
return this->DoDelete(source, word);
else if (cmd.equals_ci("LIST"))
return this->DoList(u, ci, word);
return this->DoList(source, word);
else if (cmd.equals_ci("CLEAR"))
return this->DoClear(u, ci);
return this->DoClear(source);
else
this->OnSyntaxError(u, "");
+59 -58
View File
@@ -16,70 +16,70 @@
class CommandBSBot : public Command
{
private:
CommandReturn DoAdd(User *u, const std::vector<Anope::string> &params)
CommandReturn DoAdd(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params[1];
Anope::string user = params[2];
Anope::string host = params[3];
Anope::string real = params[4];
const Anope::string &nick = params[1];
const Anope::string &user = params[2];
const Anope::string &host = params[3];
const Anope::string &real = params[4];
BotInfo *bi;
if (findbot(nick))
{
u->SendMessage(BotServ, BOT_BOT_ALREADY_EXISTS, nick.c_str());
source.Reply(BOT_BOT_ALREADY_EXISTS, nick.c_str());
return MOD_CONT;
}
if (nick.length() > Config->NickLen)
{
u->SendMessage(BotServ, BOT_BAD_NICK);
source.Reply(BOT_BAD_NICK);
return MOD_CONT;
}
if (user.length() > Config->UserLen)
{
u->SendMessage(BotServ, BOT_LONG_IDENT, Config->UserLen);
source.Reply(BOT_LONG_IDENT, Config->UserLen);
return MOD_CONT;
}
if (host.length() > Config->HostLen)
{
u->SendMessage(BotServ, BOT_LONG_HOST, Config->HostLen);
source.Reply(BOT_LONG_HOST, Config->HostLen);
return MOD_CONT;
}
/* Check the nick is valid re RFC 2812 */
if (isdigit(nick[0]) || nick[0] == '-')
{
u->SendMessage(BotServ, BOT_BAD_NICK);
source.Reply(BOT_BAD_NICK);
return MOD_CONT;
}
for (unsigned i = 0, end = nick.length(); i < end && i < Config->NickLen; ++i)
if (!isvalidnick(nick[i]))
{
u->SendMessage(BotServ, BOT_BAD_NICK);
source.Reply(BOT_BAD_NICK);
return MOD_CONT;
}
/* check for hardcored ircd forbidden nicks */
if (!ircdproto->IsNickValid(nick))
{
u->SendMessage(BotServ, BOT_BAD_NICK);
source.Reply(BOT_BAD_NICK);
return MOD_CONT;
}
/* Check the host is valid re RFC 2812 */
if (!isValidHost(host, 3))
{
u->SendMessage(BotServ, BOT_BAD_HOST);
source.Reply(BOT_BAD_HOST);
return MOD_CONT;
}
for (unsigned i = 0, end = user.length(); i < end && i < Config->UserLen; ++i)
if (!isalnum(user[i]))
{
u->SendMessage(BotServ, BOT_BAD_IDENT, Config->UserLen);
source.Reply(BOT_BAD_IDENT, Config->UserLen);
return MOD_CONT;
}
@@ -89,73 +89,73 @@ class CommandBSBot : public Command
*/
if (findnick(nick))
{
u->SendMessage(BotServ, NICK_ALREADY_REGISTERED, nick.c_str());
source.Reply(NICK_ALREADY_REGISTERED, nick.c_str());
return MOD_CONT;
}
if (!(bi = new BotInfo(nick, user, host, real)))
{
// XXX this cant happen?
u->SendMessage(BotServ, BOT_BOT_CREATION_FAILED);
source.Reply(BOT_BOT_CREATION_FAILED);
return MOD_CONT;
}
Log(LOG_ADMIN, u, this) << "ADD " << bi->GetMask() << " " << bi->realname;
Log(LOG_ADMIN, source.u, this) << "ADD " << bi->GetMask() << " " << bi->realname;
u->SendMessage(BotServ, BOT_BOT_ADDED, bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str(), bi->realname.c_str());
source.Reply(BOT_BOT_ADDED, bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str(), bi->realname.c_str());
FOREACH_MOD(I_OnBotCreate, OnBotCreate(bi));
return MOD_CONT;
}
CommandReturn DoChange(User *u, const std::vector<Anope::string> &params)
CommandReturn DoChange(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string oldnick = params[1];
Anope::string nick = params.size() > 2 ? params[2] : "";
Anope::string user = params.size() > 3 ? params[3] : "";
Anope::string host = params.size() > 4 ? params[4] : "";
Anope::string real = params.size() > 5 ? params[5] : "";
const Anope::string &oldnick = params[1];
const Anope::string &nick = params.size() > 2 ? params[2] : "";
const Anope::string &user = params.size() > 3 ? params[3] : "";
const Anope::string &host = params.size() > 4 ? params[4] : "";
const Anope::string &real = params.size() > 5 ? params[5] : "";
BotInfo *bi;
if (oldnick.empty() || nick.empty())
{
this->OnSyntaxError(u, "CHANGE");
this->OnSyntaxError(source.u, "CHANGE");
return MOD_CONT;
}
if (!(bi = findbot(oldnick)))
{
u->SendMessage(BotServ, BOT_DOES_NOT_EXIST, oldnick.c_str());
source.Reply(BOT_DOES_NOT_EXIST, oldnick.c_str());
return MOD_CONT;
}
if (!oldnick.equals_ci(nick) && nickIsServices(oldnick, false))
{
u->SendMessage(BotServ, BOT_DOES_NOT_EXIST, oldnick.c_str());
source.Reply(BOT_DOES_NOT_EXIST, oldnick.c_str());
return MOD_CONT;
}
if (nick.length() > Config->NickLen)
{
u->SendMessage(BotServ, BOT_BAD_NICK);
source.Reply(BOT_BAD_NICK);
return MOD_CONT;
}
if (!user.empty() && user.length() > Config->UserLen)
{
u->SendMessage(BotServ, BOT_LONG_IDENT, Config->UserLen);
source.Reply(BOT_LONG_IDENT, Config->UserLen);
return MOD_CONT;
}
if (!host.empty() && host.length() > Config->HostLen)
{
u->SendMessage(BotServ, BOT_LONG_HOST, Config->HostLen);
source.Reply(BOT_LONG_HOST, Config->HostLen);
return MOD_CONT;
}
if (!oldnick.equals_ci(nick) && nickIsServices(nick, false))
{
u->SendMessage(BotServ, BOT_DOES_NOT_EXIST, oldnick.c_str());
source.Reply(BOT_DOES_NOT_EXIST, oldnick.c_str());
return MOD_CONT;
}
@@ -166,34 +166,34 @@ class CommandBSBot : public Command
*/
if (nick.equals_cs(bi->nick) && (!user.empty() ? user.equals_cs(bi->GetIdent()) : 1) && (!host.empty() ? host.equals_cs(bi->host) : 1) && (!real.empty() ? real.equals_cs(bi->realname) : 1))
{
u->SendMessage(BotServ, BOT_BOT_ANY_CHANGES);
source.Reply(BOT_BOT_ANY_CHANGES);
return MOD_CONT;
}
/* Check the nick is valid re RFC 2812 */
if (isdigit(nick[0]) || nick[0] == '-')
{
u->SendMessage(BotServ, BOT_BAD_NICK);
source.Reply(BOT_BAD_NICK);
return MOD_CONT;
}
for (unsigned i = 0, end = nick.length(); i < end && i < Config->NickLen; ++i)
if (!isvalidnick(nick[i]))
{
u->SendMessage(BotServ, BOT_BAD_NICK);
source.Reply(BOT_BAD_NICK);
return MOD_CONT;
}
/* check for hardcored ircd forbidden nicks */
if (!ircdproto->IsNickValid(nick))
{
u->SendMessage(BotServ, BOT_BAD_NICK);
source.Reply(BOT_BAD_NICK);
return MOD_CONT;
}
if (!host.empty() && !isValidHost(host, 3))
{
u->SendMessage(BotServ, BOT_BAD_HOST);
source.Reply(BOT_BAD_HOST);
return MOD_CONT;
}
@@ -201,13 +201,13 @@ class CommandBSBot : public Command
for (unsigned i = 0, end = user.length(); i < end && i < Config->UserLen; ++i)
if (!isalnum(user[i]))
{
u->SendMessage(BotServ, BOT_BAD_IDENT, Config->UserLen);
source.Reply(BOT_BAD_IDENT, Config->UserLen);
return MOD_CONT;
}
if (!nick.equals_ci(bi->nick) && findbot(nick))
{
u->SendMessage(BotServ, BOT_BOT_ALREADY_EXISTS, nick.c_str());
source.Reply(BOT_BOT_ALREADY_EXISTS, nick.c_str());
return MOD_CONT;
}
@@ -219,7 +219,7 @@ class CommandBSBot : public Command
*/
if (findnick(nick))
{
u->SendMessage(BotServ, NICK_ALREADY_REGISTERED, nick.c_str());
source.Reply(NICK_ALREADY_REGISTERED, nick.c_str());
return MOD_CONT;
}
@@ -262,46 +262,46 @@ class CommandBSBot : public Command
bi->RejoinAll();
}
u->SendMessage(BotServ, BOT_BOT_CHANGED, oldnick.c_str(), bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str(), bi->realname.c_str());
Log(LOG_ADMIN, u, this) << "CHANGE " << oldnick << " to " << bi->GetMask() << " " << bi->realname;
source.Reply(BOT_BOT_CHANGED, oldnick.c_str(), bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str(), bi->realname.c_str());
Log(LOG_ADMIN, source.u, this) << "CHANGE " << oldnick << " to " << bi->GetMask() << " " << bi->realname;
FOREACH_MOD(I_OnBotChange, OnBotChange(bi));
return MOD_CONT;
}
CommandReturn DoDel(User *u, const std::vector<Anope::string> &params)
CommandReturn DoDel(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params[1];
const Anope::string &nick = params[1];
BotInfo *bi;
if (nick.empty())
{
this->OnSyntaxError(u, "DEL");
this->OnSyntaxError(source.u, "DEL");
return MOD_CONT;
}
if (!(bi = findbot(nick)))
{
u->SendMessage(BotServ, BOT_DOES_NOT_EXIST, nick.c_str());
source.Reply(BOT_DOES_NOT_EXIST, nick.c_str());
return MOD_CONT;
}
if (nickIsServices(nick, false))
{
u->SendMessage(BotServ, BOT_DOES_NOT_EXIST, nick.c_str());
source.Reply(BOT_DOES_NOT_EXIST, nick.c_str());
return MOD_CONT;
}
FOREACH_MOD(I_OnBotDelete, OnBotDelete(bi));
ircdproto->SendQuit(bi, "Quit: Help! I'm being deleted by %s!", u->nick.c_str());
ircdproto->SendQuit(bi, "Quit: Help! I'm being deleted by %s!", source.u->nick.c_str());
XLine x(bi->nick);
ircdproto->SendSQLineDel(&x);
Log(LOG_ADMIN, u, this) << "DEL " << bi->nick;
Log(LOG_ADMIN, source.u, this) << "DEL " << bi->nick;
source.Reply(BOT_BOT_DELETED, nick.c_str());
delete bi;
u->SendMessage(BotServ, BOT_BOT_DELETED, nick.c_str());
return MOD_CONT;
}
public:
@@ -310,13 +310,14 @@ class CommandBSBot : public Command
this->SetFlag(CFLAG_STRIP_CHANNEL);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string cmd = params[0];
const Anope::string &cmd = params[0];
User *u = source.u;
if (readonly)
{
u->SendMessage(BotServ, BOT_BOT_READONLY);
source.Reply(BOT_BOT_READONLY);
return MOD_CONT;
}
@@ -325,7 +326,7 @@ class CommandBSBot : public Command
// ADD nick user host real - 5
if (!u->Account()->HasCommand("botserv/bot/add"))
{
u->SendMessage(BotServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
@@ -340,7 +341,7 @@ class CommandBSBot : public Command
if (tempparams.size() >= 6)
tempparams[4] = tempparams[4] + " " + tempparams[5];
return this->DoAdd(u, tempparams);
return this->DoAdd(source, tempparams);
}
else if (cmd.equals_ci("CHANGE"))
{
@@ -348,7 +349,7 @@ class CommandBSBot : public Command
// but only oldn and newn are required
if (!u->Account()->HasCommand("botserv/bot/change"))
{
u->SendMessage(BotServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
@@ -358,14 +359,14 @@ class CommandBSBot : public Command
return MOD_CONT;
}
return this->DoChange(u, params);
return this->DoChange(source, params);
}
else if (cmd.equals_ci("DEL"))
{
// DEL nick
if (!u->Account()->HasCommand("botserv/bot/del"))
{
u->SendMessage(BotServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
@@ -375,7 +376,7 @@ class CommandBSBot : public Command
return MOD_CONT;
}
return this->DoDel(u, params);
return this->DoDel(source, params);
}
else
this->OnSyntaxError(u, "");
+9 -8
View File
@@ -20,13 +20,14 @@ class CommandBSBotList : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
unsigned count = 0;
if (BotListByNick.empty())
{
u->SendMessage(BotServ, BOT_BOTLIST_EMPTY);
source.Reply(BOT_BOTLIST_EMPTY);
return MOD_CONT;
}
@@ -37,15 +38,15 @@ class CommandBSBotList : public Command
if (!bi->HasFlag(BI_PRIVATE))
{
if (!count)
u->SendMessage(BotServ, BOT_BOTLIST_HEADER);
source.Reply(BOT_BOTLIST_HEADER);
++count;
u->SendMessage(Config->s_BotServ, " %-15s (%s@%s)", bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str());
source.Reply(" %-15s (%s@%s)", bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str());
}
}
if (u->Account()->HasCommand("botserv/botlist") && count < BotListByNick.size())
{
u->SendMessage(BotServ, BOT_BOTLIST_PRIVATE_HEADER);
source.Reply(BOT_BOTLIST_PRIVATE_HEADER);
for (patricia_tree<BotInfo *>::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it)
{
@@ -53,16 +54,16 @@ class CommandBSBotList : public Command
if (bi->HasFlag(BI_PRIVATE))
{
u->SendMessage(Config->s_BotServ, " %-15s (%s@%s)", bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str());
source.Reply(" %-15s (%s@%s)", bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str());
++count;
}
}
}
if (!count)
u->SendMessage(BotServ, BOT_BOTLIST_EMPTY);
source.Reply(BOT_BOTLIST_EMPTY);
else
u->SendMessage(BotServ, BOT_BOTLIST_FOOTER, count);
source.Reply(BOT_BOTLIST_FOOTER, count);
return MOD_CONT;
}
+2 -1
View File
@@ -22,8 +22,9 @@ class CommandBSHelp : public Command
this->SetFlag(CFLAG_STRIP_CHANNEL);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
mod_help_cmd(findbot(Config->s_BotServ), u, params[0]);
return MOD_CONT;
}
+56 -55
View File
@@ -17,7 +17,7 @@
class CommandBSInfo : public Command
{
private:
void send_bot_channels(User *u, BotInfo *bi)
void send_bot_channels(CommandSource &source, BotInfo *bi)
{
Anope::string buf;
for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it)
@@ -28,7 +28,7 @@ class CommandBSInfo : public Command
{
if (buf.length() + ci->name.length() > 300)
{
u->SendMessage(Config->s_BotServ, "%s", buf.c_str());
source.Reply("%s", buf.c_str());
buf.clear();
}
buf += " " + ci->name + " ";
@@ -36,7 +36,7 @@ class CommandBSInfo : public Command
}
if (!buf.empty())
u->SendMessage(Config->s_BotServ, "%s", buf.c_str());
source.Reply("%s", buf.c_str());
return;
}
public:
@@ -45,159 +45,160 @@ class CommandBSInfo : public Command
this->SetFlag(CFLAG_STRIP_CHANNEL);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
BotInfo *bi;
ChannelInfo *ci;
Anope::string query = params[0];
const Anope::string &query = params[0];
int need_comma = 0;
bool need_comma = false;
char buf[BUFSIZE], *end;
if ((bi = findbot(query)))
User *u = source.u;
BotInfo *bi = findbot(query);
ChannelInfo *ci;
if (bi)
{
u->SendMessage(BotServ, BOT_INFO_BOT_HEADER, bi->nick.c_str());
u->SendMessage(BotServ, BOT_INFO_BOT_MASK, bi->GetIdent().c_str(), bi->host.c_str());
u->SendMessage(BotServ, BOT_INFO_BOT_REALNAME, bi->realname.c_str());
u->SendMessage(BotServ, BOT_INFO_BOT_CREATED, do_strftime(bi->created).c_str());
u->SendMessage(BotServ, BOT_INFO_BOT_OPTIONS, GetString(u, (bi->HasFlag(BI_PRIVATE) ? NICK_INFO_OPT_PRIVATE : NICK_INFO_OPT_NONE)).c_str());
u->SendMessage(BotServ, BOT_INFO_BOT_USAGE, bi->chancount);
source.Reply(BOT_INFO_BOT_HEADER, bi->nick.c_str());
source.Reply(BOT_INFO_BOT_MASK, bi->GetIdent().c_str(), bi->host.c_str());
source.Reply(BOT_INFO_BOT_REALNAME, bi->realname.c_str());
source.Reply(BOT_INFO_BOT_CREATED, do_strftime(bi->created).c_str());
source.Reply(BOT_INFO_BOT_OPTIONS, GetString(u, (bi->HasFlag(BI_PRIVATE) ? NICK_INFO_OPT_PRIVATE : NICK_INFO_OPT_NONE)).c_str());
source.Reply(BOT_INFO_BOT_USAGE, bi->chancount);
if (u->Account()->HasPriv("botserv/administration"))
this->send_bot_channels(u, bi);
this->send_bot_channels(source, bi);
}
else if ((ci = cs_findchan(query)))
{
if (!check_access(u, ci, CA_FOUNDER) && !u->Account()->HasPriv("botserv/administration"))
{
u->SendMessage(BotServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
u->SendMessage(BotServ, CHAN_INFO_HEADER, ci->name.c_str());
source.Reply(CHAN_INFO_HEADER, ci->name.c_str());
if (ci->bi)
u->SendMessage(BotServ, BOT_INFO_CHAN_BOT, ci->bi->nick.c_str());
source.Reply(BOT_INFO_CHAN_BOT, ci->bi->nick.c_str());
else
u->SendMessage(BotServ, BOT_INFO_CHAN_BOT_NONE);
source.Reply(BOT_INFO_CHAN_BOT_NONE);
if (ci->botflags.HasFlag(BS_KICK_BADWORDS))
{
if (ci->ttb[TTB_BADWORDS])
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_BADWORDS_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_BADWORDS]);
source.Reply(BOT_INFO_CHAN_KICK_BADWORDS_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_BADWORDS]);
else
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_BADWORDS, GetString(u, BOT_INFO_ACTIVE).c_str());
source.Reply(BOT_INFO_CHAN_KICK_BADWORDS, GetString(u, BOT_INFO_ACTIVE).c_str());
}
else
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_BADWORDS, GetString(u, BOT_INFO_INACTIVE).c_str());
source.Reply(BOT_INFO_CHAN_KICK_BADWORDS, GetString(u, BOT_INFO_INACTIVE).c_str());
if (ci->botflags.HasFlag(BS_KICK_BOLDS))
{
if (ci->ttb[TTB_BOLDS])
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_BOLDS_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_BOLDS]);
source.Reply(BOT_INFO_CHAN_KICK_BOLDS_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_BOLDS]);
else
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_BOLDS, GetString(u, BOT_INFO_ACTIVE).c_str());
source.Reply(BOT_INFO_CHAN_KICK_BOLDS, GetString(u, BOT_INFO_ACTIVE).c_str());
}
else
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_BOLDS, GetString(u, BOT_INFO_INACTIVE).c_str());
source.Reply(BOT_INFO_CHAN_KICK_BOLDS, GetString(u, BOT_INFO_INACTIVE).c_str());
if (ci->botflags.HasFlag(BS_KICK_CAPS))
{
if (ci->ttb[TTB_CAPS])
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_CAPS_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_CAPS], ci->capsmin, ci->capspercent);
source.Reply(BOT_INFO_CHAN_KICK_CAPS_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_CAPS], ci->capsmin, ci->capspercent);
else
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_CAPS_ON, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->capsmin, ci->capspercent);
source.Reply(BOT_INFO_CHAN_KICK_CAPS_ON, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->capsmin, ci->capspercent);
}
else
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_CAPS_OFF, GetString(u, BOT_INFO_INACTIVE).c_str());
source.Reply(BOT_INFO_CHAN_KICK_CAPS_OFF, GetString(u, BOT_INFO_INACTIVE).c_str());
if (ci->botflags.HasFlag(BS_KICK_COLORS))
{
if (ci->ttb[TTB_COLORS])
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_COLORS_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_COLORS]);
source.Reply(BOT_INFO_CHAN_KICK_COLORS_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_COLORS]);
else
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_COLORS, GetString(u, BOT_INFO_ACTIVE).c_str());
source.Reply(BOT_INFO_CHAN_KICK_COLORS, GetString(u, BOT_INFO_ACTIVE).c_str());
}
else
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_COLORS, GetString(u, BOT_INFO_INACTIVE).c_str());
source.Reply(BOT_INFO_CHAN_KICK_COLORS, GetString(u, BOT_INFO_INACTIVE).c_str());
if (ci->botflags.HasFlag(BS_KICK_FLOOD))
{
if (ci->ttb[TTB_FLOOD])
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_FLOOD_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_FLOOD], ci->floodlines, ci->floodsecs);
source.Reply(BOT_INFO_CHAN_KICK_FLOOD_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_FLOOD], ci->floodlines, ci->floodsecs);
else
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_FLOOD_ON, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->floodlines, ci->floodsecs);
source.Reply(BOT_INFO_CHAN_KICK_FLOOD_ON, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->floodlines, ci->floodsecs);
}
else
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_FLOOD_OFF, GetString(u, BOT_INFO_INACTIVE).c_str());
source.Reply(BOT_INFO_CHAN_KICK_FLOOD_OFF, GetString(u, BOT_INFO_INACTIVE).c_str());
if (ci->botflags.HasFlag(BS_KICK_REPEAT))
{
if (ci->ttb[TTB_REPEAT])
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_REPEAT_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_REPEAT], ci->repeattimes);
source.Reply(BOT_INFO_CHAN_KICK_REPEAT_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_REPEAT], ci->repeattimes);
else
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_REPEAT_ON, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->repeattimes);
source.Reply(BOT_INFO_CHAN_KICK_REPEAT_ON, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->repeattimes);
}
else
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_REPEAT_OFF, GetString(u, BOT_INFO_INACTIVE).c_str());
source.Reply(BOT_INFO_CHAN_KICK_REPEAT_OFF, GetString(u, BOT_INFO_INACTIVE).c_str());
if (ci->botflags.HasFlag(BS_KICK_REVERSES))
{
if (ci->ttb[TTB_REVERSES])
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_REVERSES_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_REVERSES]);
source.Reply(BOT_INFO_CHAN_KICK_REVERSES_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_REVERSES]);
else
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_REVERSES, GetString(u, BOT_INFO_ACTIVE).c_str());
source.Reply(BOT_INFO_CHAN_KICK_REVERSES, GetString(u, BOT_INFO_ACTIVE).c_str());
}
else
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_REVERSES, GetString(u, BOT_INFO_INACTIVE).c_str());
source.Reply(BOT_INFO_CHAN_KICK_REVERSES, GetString(u, BOT_INFO_INACTIVE).c_str());
if (ci->botflags.HasFlag(BS_KICK_UNDERLINES))
{
if (ci->ttb[TTB_UNDERLINES])
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_UNDERLINES_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_UNDERLINES]);
source.Reply(BOT_INFO_CHAN_KICK_UNDERLINES_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_UNDERLINES]);
else
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_UNDERLINES, GetString(u, BOT_INFO_ACTIVE).c_str());
source.Reply(BOT_INFO_CHAN_KICK_UNDERLINES, GetString(u, BOT_INFO_ACTIVE).c_str());
}
else
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_UNDERLINES, GetString(u, BOT_INFO_INACTIVE).c_str());
source.Reply(BOT_INFO_CHAN_KICK_UNDERLINES, GetString(u, BOT_INFO_INACTIVE).c_str());
if (ci->botflags.HasFlag(BS_KICK_ITALICS))
{
if (ci->ttb[TTB_ITALICS])
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_ITALICS_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_ITALICS]);
source.Reply(BOT_INFO_CHAN_KICK_ITALICS_BAN, GetString(u, BOT_INFO_ACTIVE).c_str(), ci->ttb[TTB_ITALICS]);
else
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_ITALICS, GetString(u, BOT_INFO_ACTIVE).c_str());
source.Reply(BOT_INFO_CHAN_KICK_ITALICS, GetString(u, BOT_INFO_ACTIVE).c_str());
}
else
u->SendMessage(BotServ, BOT_INFO_CHAN_KICK_ITALICS, GetString(u, BOT_INFO_INACTIVE).c_str());
source.Reply(BOT_INFO_CHAN_KICK_ITALICS, GetString(u, BOT_INFO_INACTIVE).c_str());
end = buf;
*end = 0;
if (ci->botflags.HasFlag(BS_DONTKICKOPS))
{
end += snprintf(end, sizeof(buf) - (end - buf), "%s", GetString(u, BOT_INFO_OPT_DONTKICKOPS).c_str());
need_comma = 1;
need_comma = true;
}
if (ci->botflags.HasFlag(BS_DONTKICKVOICES))
{
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", GetString(u, BOT_INFO_OPT_DONTKICKVOICES).c_str());
need_comma = 1;
need_comma = true;
}
if (ci->botflags.HasFlag(BS_FANTASY))
{
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", GetString(u, BOT_INFO_OPT_FANTASY).c_str());
need_comma = 1;
need_comma = true;
}
if (ci->botflags.HasFlag(BS_GREET))
{
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", GetString(u, BOT_INFO_OPT_GREET).c_str());
need_comma = 1;
need_comma = true;
}
if (ci->botflags.HasFlag(BS_NOBOT))
{
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", GetString(u, BOT_INFO_OPT_NOBOT).c_str());
need_comma = 1;
need_comma = true;
}
if (ci->botflags.HasFlag(BS_SYMBIOSIS))
{
end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", GetString(u, BOT_INFO_OPT_SYMBIOSIS).c_str());
need_comma = 1;
need_comma = true;
}
u->SendMessage(BotServ, BOT_INFO_CHAN_OPTIONS, *buf ? buf : GetString(u, BOT_INFO_OPT_NONE).c_str());
source.Reply(BOT_INFO_CHAN_OPTIONS, *buf ? buf : GetString(u, BOT_INFO_OPT_NONE).c_str());
}
else
u->SendMessage(BotServ, BOT_INFO_NOT_FOUND, query.c_str());
source.Reply(BOT_INFO_NOT_FOUND, query.c_str());
return MOD_CONT;
}
+47 -46
View File
@@ -21,25 +21,26 @@ class CommandBSKick : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
Anope::string option = params[1];
Anope::string value = params[2];
Anope::string ttb = params.size() > 3 ? params[3] : "";
const Anope::string &chan = params[0];
const Anope::string &option = params[1];
const Anope::string &value = params[2];
const Anope::string &ttb = params.size() > 3 ? params[3] : "";
ChannelInfo *ci = cs_findchan(chan);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (readonly)
u->SendMessage(BotServ, BOT_KICK_DISABLED);
source.Reply(BOT_KICK_DISABLED);
else if (chan.empty() || option.empty() || value.empty())
SyntaxError(BotServ, u, "KICK", BOT_KICK_SYNTAX);
else if (!value.equals_ci("ON") && !value.equals_ci("OFF"))
SyntaxError(BotServ, u, "KICK", BOT_KICK_SYNTAX);
else if (!check_access(u, ci, CA_SET) && !u->Account()->HasPriv("botserv/administration"))
u->SendMessage(BotServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else if (!ci->bi)
u->SendMessage(BotServ, BOT_NOT_ASSIGNED);
source.Reply(BOT_NOT_ASSIGNED);
else
{
bool override = !check_access(u, ci, CA_SET);
@@ -60,7 +61,7 @@ class CommandBSKick : public Command
Log(LOG_DEBUG) << "remainder of ttb " << error << " ttb " << ci->ttb[TTB_BADWORDS];
/* reset the value back to 0 - TSL */
ci->ttb[TTB_BADWORDS] = 0;
u->SendMessage(BotServ, BOT_KICK_BAD_TTB, ttb.c_str());
source.Reply(BOT_KICK_BAD_TTB, ttb.c_str());
return MOD_CONT;
}
}
@@ -68,14 +69,14 @@ class CommandBSKick : public Command
ci->ttb[TTB_BADWORDS] = 0;
ci->botflags.SetFlag(BS_KICK_BADWORDS);
if (ci->ttb[TTB_BADWORDS])
u->SendMessage(BotServ, BOT_KICK_BADWORDS_ON_BAN, ci->ttb[TTB_BADWORDS]);
source.Reply(BOT_KICK_BADWORDS_ON_BAN, ci->ttb[TTB_BADWORDS]);
else
u->SendMessage(BotServ, BOT_KICK_BADWORDS_ON);
source.Reply(BOT_KICK_BADWORDS_ON);
}
else
{
ci->botflags.UnsetFlag(BS_KICK_BADWORDS);
u->SendMessage(BotServ, BOT_KICK_BADWORDS_OFF);
source.Reply(BOT_KICK_BADWORDS_OFF);
}
}
else if (option.equals_ci("BOLDS"))
@@ -90,7 +91,7 @@ class CommandBSKick : public Command
{
Log(LOG_DEBUG) << "remainder of ttb " << error << " ttb " << ci->ttb[TTB_BOLDS];
ci->ttb[TTB_BOLDS] = 0;
u->SendMessage(BotServ, BOT_KICK_BAD_TTB, ttb.c_str());
source.Reply(BOT_KICK_BAD_TTB, ttb.c_str());
return MOD_CONT;
}
}
@@ -98,14 +99,14 @@ class CommandBSKick : public Command
ci->ttb[TTB_BOLDS] = 0;
ci->botflags.SetFlag(BS_KICK_BOLDS);
if (ci->ttb[TTB_BOLDS])
u->SendMessage(BotServ, BOT_KICK_BOLDS_ON_BAN, ci->ttb[TTB_BOLDS]);
source.Reply(BOT_KICK_BOLDS_ON_BAN, ci->ttb[TTB_BOLDS]);
else
u->SendMessage(BotServ, BOT_KICK_BOLDS_ON);
source.Reply(BOT_KICK_BOLDS_ON);
}
else
{
ci->botflags.UnsetFlag(BS_KICK_BOLDS);
u->SendMessage(BotServ, BOT_KICK_BOLDS_OFF);
source.Reply(BOT_KICK_BOLDS_OFF);
}
}
else if (option.equals_ci("CAPS"))
@@ -123,7 +124,7 @@ class CommandBSKick : public Command
{
Log(LOG_DEBUG) << "remainder of ttb " << error << " ttb " << ci->ttb[TTB_CAPS];
ci->ttb[TTB_CAPS] = 0;
u->SendMessage(BotServ, BOT_KICK_BAD_TTB, ttb.c_str());
source.Reply(BOT_KICK_BAD_TTB, ttb.c_str());
return MOD_CONT;
}
}
@@ -146,14 +147,14 @@ class CommandBSKick : public Command
ci->botflags.SetFlag(BS_KICK_CAPS);
if (ci->ttb[TTB_CAPS])
u->SendMessage(BotServ, BOT_KICK_CAPS_ON_BAN, ci->capsmin, ci->capspercent, ci->ttb[TTB_CAPS]);
source.Reply(BOT_KICK_CAPS_ON_BAN, ci->capsmin, ci->capspercent, ci->ttb[TTB_CAPS]);
else
u->SendMessage(BotServ, BOT_KICK_CAPS_ON, ci->capsmin, ci->capspercent);
source.Reply(BOT_KICK_CAPS_ON, ci->capsmin, ci->capspercent);
}
else
{
ci->botflags.UnsetFlag(BS_KICK_CAPS);
u->SendMessage(BotServ, BOT_KICK_CAPS_OFF);
source.Reply(BOT_KICK_CAPS_OFF);
}
}
else if (option.equals_ci("COLORS"))
@@ -168,7 +169,7 @@ class CommandBSKick : public Command
{
Log(LOG_DEBUG) << "remainder of ttb " << error << " ttb " << ci->ttb[TTB_COLORS];
ci->ttb[TTB_COLORS] = 0;
u->SendMessage(BotServ, BOT_KICK_BAD_TTB, ttb.c_str());
source.Reply(BOT_KICK_BAD_TTB, ttb.c_str());
return MOD_CONT;
}
}
@@ -176,14 +177,14 @@ class CommandBSKick : public Command
ci->ttb[TTB_COLORS] = 0;
ci->botflags.SetFlag(BS_KICK_COLORS);
if (ci->ttb[TTB_COLORS])
u->SendMessage(BotServ, BOT_KICK_COLORS_ON_BAN, ci->ttb[TTB_COLORS]);
source.Reply(BOT_KICK_COLORS_ON_BAN, ci->ttb[TTB_COLORS]);
else
u->SendMessage(BotServ, BOT_KICK_COLORS_ON);
source.Reply(BOT_KICK_COLORS_ON);
}
else
{
ci->botflags.UnsetFlag(BS_KICK_COLORS);
u->SendMessage(BotServ, BOT_KICK_COLORS_OFF);
source.Reply(BOT_KICK_COLORS_OFF);
}
}
else if (option.equals_ci("FLOOD"))
@@ -201,7 +202,7 @@ class CommandBSKick : public Command
{
Log(LOG_DEBUG) << "remainder of ttb " << error << " ttb " << ci->ttb[TTB_FLOOD];
ci->ttb[TTB_FLOOD] = 0;
u->SendMessage(BotServ, BOT_KICK_BAD_TTB, ttb.c_str());
source.Reply(BOT_KICK_BAD_TTB, ttb.c_str());
return MOD_CONT;
}
}
@@ -224,14 +225,14 @@ class CommandBSKick : public Command
ci->botflags.SetFlag(BS_KICK_FLOOD);
if (ci->ttb[TTB_FLOOD])
u->SendMessage(BotServ, BOT_KICK_FLOOD_ON_BAN, ci->floodlines, ci->floodsecs, ci->ttb[TTB_FLOOD]);
source.Reply(BOT_KICK_FLOOD_ON_BAN, ci->floodlines, ci->floodsecs, ci->ttb[TTB_FLOOD]);
else
u->SendMessage(BotServ, BOT_KICK_FLOOD_ON, ci->floodlines, ci->floodsecs);
source.Reply(BOT_KICK_FLOOD_ON, ci->floodlines, ci->floodsecs);
}
else
{
ci->botflags.UnsetFlag(BS_KICK_FLOOD);
u->SendMessage(BotServ, BOT_KICK_FLOOD_OFF);
source.Reply(BOT_KICK_FLOOD_OFF);
}
}
else if (option.equals_ci("REPEAT"))
@@ -248,7 +249,7 @@ class CommandBSKick : public Command
{
Log(LOG_DEBUG) << "remainder of ttb " << error << " ttb " << ci->ttb[TTB_REPEAT];
ci->ttb[TTB_REPEAT] = 0;
u->SendMessage(BotServ, BOT_KICK_BAD_TTB, ttb.c_str());
source.Reply(BOT_KICK_BAD_TTB, ttb.c_str());
return MOD_CONT;
}
}
@@ -264,14 +265,14 @@ class CommandBSKick : public Command
ci->botflags.SetFlag(BS_KICK_REPEAT);
if (ci->ttb[TTB_REPEAT])
u->SendMessage(BotServ, BOT_KICK_REPEAT_ON_BAN, ci->repeattimes, ci->ttb[TTB_REPEAT]);
source.Reply(BOT_KICK_REPEAT_ON_BAN, ci->repeattimes, ci->ttb[TTB_REPEAT]);
else
u->SendMessage(BotServ, BOT_KICK_REPEAT_ON, ci->repeattimes);
source.Reply(BOT_KICK_REPEAT_ON, ci->repeattimes);
}
else
{
ci->botflags.UnsetFlag(BS_KICK_REPEAT);
u->SendMessage(BotServ, BOT_KICK_REPEAT_OFF);
source.Reply(BOT_KICK_REPEAT_OFF);
}
}
else if (option.equals_ci("REVERSES"))
@@ -286,7 +287,7 @@ class CommandBSKick : public Command
{
Log(LOG_DEBUG) << "remainder of ttb " << error << " ttb " << ci->ttb[TTB_REVERSES];
ci->ttb[TTB_REVERSES] = 0;
u->SendMessage(BotServ, BOT_KICK_BAD_TTB, ttb.c_str());
source.Reply(BOT_KICK_BAD_TTB, ttb.c_str());
return MOD_CONT;
}
}
@@ -294,14 +295,14 @@ class CommandBSKick : public Command
ci->ttb[TTB_REVERSES] = 0;
ci->botflags.SetFlag(BS_KICK_REVERSES);
if (ci->ttb[TTB_REVERSES])
u->SendMessage(BotServ, BOT_KICK_REVERSES_ON_BAN, ci->ttb[TTB_REVERSES]);
source.Reply(BOT_KICK_REVERSES_ON_BAN, ci->ttb[TTB_REVERSES]);
else
u->SendMessage(BotServ, BOT_KICK_REVERSES_ON);
source.Reply(BOT_KICK_REVERSES_ON);
}
else
{
ci->botflags.UnsetFlag(BS_KICK_REVERSES);
u->SendMessage(BotServ, BOT_KICK_REVERSES_OFF);
source.Reply(BOT_KICK_REVERSES_OFF);
}
}
else if (option.equals_ci("UNDERLINES"))
@@ -316,7 +317,7 @@ class CommandBSKick : public Command
{
Log(LOG_DEBUG) << "remainder of ttb " << error << " ttb " << ci->ttb[TTB_UNDERLINES];
ci->ttb[TTB_UNDERLINES] = 0;
u->SendMessage(BotServ, BOT_KICK_BAD_TTB, ttb.c_str());
source.Reply(BOT_KICK_BAD_TTB, ttb.c_str());
return MOD_CONT;
}
}
@@ -324,14 +325,14 @@ class CommandBSKick : public Command
ci->ttb[TTB_UNDERLINES] = 0;
ci->botflags.SetFlag(BS_KICK_UNDERLINES);
if (ci->ttb[TTB_UNDERLINES])
u->SendMessage(BotServ, BOT_KICK_UNDERLINES_ON_BAN, ci->ttb[TTB_UNDERLINES]);
source.Reply(BOT_KICK_UNDERLINES_ON_BAN, ci->ttb[TTB_UNDERLINES]);
else
u->SendMessage(BotServ, BOT_KICK_UNDERLINES_ON);
source.Reply(BOT_KICK_UNDERLINES_ON);
}
else
{
ci->botflags.UnsetFlag(BS_KICK_UNDERLINES);
u->SendMessage(BotServ, BOT_KICK_UNDERLINES_OFF);
source.Reply(BOT_KICK_UNDERLINES_OFF);
}
}
else if (option.equals_ci("ITALICS"))
@@ -346,7 +347,7 @@ class CommandBSKick : public Command
{
Log(LOG_DEBUG) << "remainder of ttb " << error << " ttb " << ci->ttb[TTB_ITALICS];
ci->ttb[TTB_ITALICS] = 0;
u->SendMessage(BotServ, BOT_KICK_BAD_TTB, ttb.c_str());
source.Reply(BOT_KICK_BAD_TTB, ttb.c_str());
return MOD_CONT;
}
}
@@ -354,18 +355,18 @@ class CommandBSKick : public Command
ci->ttb[TTB_ITALICS] = 0;
ci->botflags.SetFlag(BS_KICK_ITALICS);
if (ci->ttb[TTB_ITALICS])
u->SendMessage(BotServ, BOT_KICK_ITALICS_ON_BAN, ci->ttb[TTB_ITALICS]);
source.Reply(BOT_KICK_ITALICS_ON_BAN, ci->ttb[TTB_ITALICS]);
else
u->SendMessage(BotServ, BOT_KICK_ITALICS_ON);
source.Reply(BOT_KICK_ITALICS_ON);
}
else
{
ci->botflags.UnsetFlag(BS_KICK_ITALICS);
u->SendMessage(BotServ, BOT_KICK_ITALICS_OFF);
source.Reply(BOT_KICK_ITALICS_OFF);
}
}
else
u->SendMessage(BotServ, BOT_KICK_UNKNOWN, option.c_str());
source.Reply(BOT_KICK_UNKNOWN, option.c_str());
}
return MOD_CONT;
}
+7 -9
View File
@@ -20,30 +20,28 @@ class CommandBSSay : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci;
const Anope::string &text = params[1];
Anope::string chan = params[0];
Anope::string text = params[1];
ci = cs_findchan(chan);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!check_access(u, ci, CA_SAY))
{
u->SendMessage(BotServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
if (!ci->bi)
{
u->SendMessage(BotServ, BOT_NOT_ASSIGNED);
source.Reply(BOT_NOT_ASSIGNED);
return MOD_CONT;
}
if (!ci->c || !ci->c->FindUser(ci->bi))
{
u->SendMessage(BotServ, BOT_NOT_ON_CHANNEL, ci->name.c_str());
source.Reply(BOT_NOT_ON_CHANNEL, ci->name.c_str());
return MOD_CONT;
}
+27 -28
View File
@@ -21,47 +21,45 @@ class CommandBSSet : public Command
this->SetFlag(CFLAG_STRIP_CHANNEL);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
Anope::string option = params[1];
Anope::string value = params[2];
const Anope::string &chan = params[0];
const Anope::string &option = params[1];
const Anope::string &value = params[2];
User *u = source.u;
ChannelInfo *ci;
if (readonly)
{
u->SendMessage(BotServ, BOT_SET_DISABLED);
return MOD_CONT;
}
if (u->Account()->HasCommand("botserv/set/private") && option.equals_ci("PRIVATE"))
source.Reply(BOT_SET_DISABLED);
else if (u->Account()->HasCommand("botserv/set/private") && option.equals_ci("PRIVATE"))
{
BotInfo *bi;
if (!(bi = findbot(chan)))
{
u->SendMessage(BotServ, BOT_DOES_NOT_EXIST, chan.c_str());
source.Reply(BOT_DOES_NOT_EXIST, chan.c_str());
return MOD_CONT;
}
if (value.equals_ci("ON"))
{
bi->SetFlag(BI_PRIVATE);
u->SendMessage(BotServ, BOT_SET_PRIVATE_ON, bi->nick.c_str());
source.Reply(BOT_SET_PRIVATE_ON, bi->nick.c_str());
}
else if (value.equals_ci("OFF"))
{
bi->UnsetFlag(BI_PRIVATE);
u->SendMessage(BotServ, BOT_SET_PRIVATE_OFF, bi->nick.c_str());
source.Reply(BOT_SET_PRIVATE_OFF, bi->nick.c_str());
}
else
SyntaxError(BotServ, u, "SET PRIVATE", BOT_SET_PRIVATE_SYNTAX);
return MOD_CONT;
}
else if (!(ci = cs_findchan(chan)))
u->SendMessage(BotServ, CHAN_X_NOT_REGISTERED, chan.c_str());
source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
else if (!u->Account()->HasPriv("botserv/administration") && !check_access(u, ci, CA_SET))
u->SendMessage(BotServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else
{
bool override = !check_access(u, ci, CA_SET);
@@ -72,12 +70,12 @@ class CommandBSSet : public Command
if (value.equals_ci("ON"))
{
ci->botflags.SetFlag(BS_DONTKICKOPS);
u->SendMessage(BotServ, BOT_SET_DONTKICKOPS_ON, ci->name.c_str());
source.Reply(BOT_SET_DONTKICKOPS_ON, ci->name.c_str());
}
else if (value.equals_ci("OFF"))
{
ci->botflags.UnsetFlag(BS_DONTKICKOPS);
u->SendMessage(BotServ, BOT_SET_DONTKICKOPS_OFF, ci->name.c_str());
source.Reply(BOT_SET_DONTKICKOPS_OFF, ci->name.c_str());
}
else
SyntaxError(BotServ, u, "SET DONTKICKOPS", BOT_SET_DONTKICKOPS_SYNTAX);
@@ -87,12 +85,12 @@ class CommandBSSet : public Command
if (value.equals_ci("ON"))
{
ci->botflags.SetFlag(BS_DONTKICKVOICES);
u->SendMessage(BotServ, BOT_SET_DONTKICKVOICES_ON, ci->name.c_str());
source.Reply(BOT_SET_DONTKICKVOICES_ON, ci->name.c_str());
}
else if (value.equals_ci("OFF"))
{
ci->botflags.UnsetFlag(BS_DONTKICKVOICES);
u->SendMessage(BotServ, BOT_SET_DONTKICKVOICES_OFF, ci->name.c_str());
source.Reply(BOT_SET_DONTKICKVOICES_OFF, ci->name.c_str());
}
else
SyntaxError(BotServ, u, "SET DONTKICKVOICES", BOT_SET_DONTKICKVOICES_SYNTAX);
@@ -102,12 +100,12 @@ class CommandBSSet : public Command
if (value.equals_ci("ON"))
{
ci->botflags.SetFlag(BS_FANTASY);
u->SendMessage(BotServ, BOT_SET_FANTASY_ON, ci->name.c_str());
source.Reply(BOT_SET_FANTASY_ON, ci->name.c_str());
}
else if (value.equals_ci("OFF"))
{
ci->botflags.UnsetFlag(BS_FANTASY);
u->SendMessage(BotServ, BOT_SET_FANTASY_OFF, ci->name.c_str());
source.Reply(BOT_SET_FANTASY_OFF, ci->name.c_str());
}
else
SyntaxError(BotServ, u, "SET FANTASY", BOT_SET_FANTASY_SYNTAX);
@@ -117,12 +115,12 @@ class CommandBSSet : public Command
if (value.equals_ci("ON"))
{
ci->botflags.SetFlag(BS_GREET);
u->SendMessage(BotServ, BOT_SET_GREET_ON, ci->name.c_str());
source.Reply(BOT_SET_GREET_ON, ci->name.c_str());
}
else if (value.equals_ci("OFF"))
{
ci->botflags.UnsetFlag(BS_GREET);
u->SendMessage(BotServ, BOT_SET_GREET_OFF, ci->name.c_str());
source.Reply(BOT_SET_GREET_OFF, ci->name.c_str());
}
else
SyntaxError(BotServ, u, "SET GREET", BOT_SET_GREET_SYNTAX);
@@ -134,12 +132,12 @@ class CommandBSSet : public Command
ci->botflags.SetFlag(BS_NOBOT);
if (ci->bi)
ci->bi->UnAssign(u, ci);
u->SendMessage(BotServ, BOT_SET_NOBOT_ON, ci->name.c_str());
source.Reply(BOT_SET_NOBOT_ON, ci->name.c_str());
}
else if (value.equals_ci("OFF"))
{
ci->botflags.UnsetFlag(BS_NOBOT);
u->SendMessage(BotServ, BOT_SET_NOBOT_OFF, ci->name.c_str());
source.Reply(BOT_SET_NOBOT_OFF, ci->name.c_str());
}
else
SyntaxError(BotServ, u, "SET NOBOT", BOT_SET_NOBOT_SYNTAX);
@@ -149,19 +147,20 @@ class CommandBSSet : public Command
if (value.equals_ci("ON"))
{
ci->botflags.SetFlag(BS_SYMBIOSIS);
u->SendMessage(BotServ, BOT_SET_SYMBIOSIS_ON, ci->name.c_str());
source.Reply(BOT_SET_SYMBIOSIS_ON, ci->name.c_str());
}
else if (value.equals_ci("OFF"))
{
ci->botflags.UnsetFlag(BS_SYMBIOSIS);
u->SendMessage(BotServ, BOT_SET_SYMBIOSIS_OFF, ci->name.c_str());
source.Reply(BOT_SET_SYMBIOSIS_OFF, ci->name.c_str());
}
else
SyntaxError(BotServ, u, "SET SYMBIOSIS", BOT_SET_SYMBIOSIS_SYNTAX);
}
else
u->SendMessage(BotServ, BOT_SET_UNKNOWN, option.c_str());
source.Reply(BOT_SET_UNKNOWN, option.c_str());
}
return MOD_CONT;
}
+9 -8
View File
@@ -20,27 +20,28 @@ class CommandBSUnassign : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
ChannelInfo *ci = cs_findchan(chan);
ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_PERM);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (readonly)
u->SendMessage(BotServ, BOT_ASSIGN_READONLY);
source.Reply(BOT_ASSIGN_READONLY);
else if (!u->Account()->HasPriv("botserv/administration") && !check_access(u, ci, CA_ASSIGN))
u->SendMessage(BotServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else if (!ci->bi)
u->SendMessage(BotServ, BOT_NOT_ASSIGNED);
source.Reply(BOT_NOT_ASSIGNED);
else if (ci->HasFlag(CI_PERSIST) && !cm)
u->SendMessage(BotServ, BOT_UNASSIGN_PERSISTANT_CHAN);
source.Reply(BOT_UNASSIGN_PERSISTANT_CHAN);
else
{
bool override = !check_access(u, ci, CA_ASSIGN);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "for " << ci->bi->nick;
ci->bi->UnAssign(u, ci);
u->SendMessage(BotServ, BOT_UNASSIGN_UNASSIGNED, ci->name.c_str());
source.Reply(BOT_UNASSIGN_UNASSIGNED, ci->name.c_str());
}
return MOD_CONT;
}
+138 -111
View File
@@ -16,71 +16,72 @@
class AccessListCallback : public NumberList
{
protected:
User *u;
ChannelInfo *ci;
CommandSource &source;
bool SentHeader;
public:
AccessListCallback(User *_u, ChannelInfo *_ci, const Anope::string &numlist) : NumberList(numlist, false), u(_u), ci(_ci), SentHeader(false)
AccessListCallback(CommandSource &_source, const Anope::string &numlist) : NumberList(numlist, false), source(_source), SentHeader(false)
{
}
~AccessListCallback()
{
if (SentHeader)
u->SendMessage(ChanServ, CHAN_ACCESS_LIST_FOOTER, ci->name.c_str());
source.Reply(CHAN_ACCESS_LIST_FOOTER, source.ci->name.c_str());
else
u->SendMessage(ChanServ, CHAN_ACCESS_NO_MATCH, ci->name.c_str());
source.Reply(CHAN_ACCESS_NO_MATCH, source.ci->name.c_str());
}
virtual void HandleNumber(unsigned Number)
{
if (!Number || Number > ci->GetAccessCount())
if (!Number || Number > source.ci->GetAccessCount())
return;
if (!SentHeader)
{
SentHeader = true;
u->SendMessage(ChanServ, CHAN_ACCESS_LIST_HEADER, ci->name.c_str());
source.Reply(CHAN_ACCESS_LIST_HEADER, source.ci->name.c_str());
}
DoList(u, ci, Number - 1, ci->GetAccess(Number - 1));
DoList(source, Number - 1, source.ci->GetAccess(Number - 1));
}
static void DoList(User *u, ChannelInfo *ci, unsigned Number, ChanAccess *access)
static void DoList(CommandSource &source, unsigned Number, ChanAccess *access)
{
if (ci->HasFlag(CI_XOP))
if (source.ci->HasFlag(CI_XOP))
{
Anope::string xop = get_xop_level(access->level);
u->SendMessage(ChanServ, CHAN_ACCESS_LIST_XOP_FORMAT, Number + 1, xop.c_str(), access->nc->display.c_str());
source.Reply(CHAN_ACCESS_LIST_XOP_FORMAT, Number + 1, xop.c_str(), access->nc->display.c_str());
}
else
u->SendMessage(ChanServ, CHAN_ACCESS_LIST_AXS_FORMAT, Number + 1, access->level, access->nc->display.c_str());
source.Reply(CHAN_ACCESS_LIST_AXS_FORMAT, Number + 1, access->level, access->nc->display.c_str());
}
};
class AccessViewCallback : public AccessListCallback
{
public:
AccessViewCallback(User *_u, ChannelInfo *_ci, const Anope::string &numlist) : AccessListCallback(_u, _ci, numlist)
AccessViewCallback(CommandSource &_source, const Anope::string &numlist) : AccessListCallback(_source, numlist)
{
}
void HandleNumber(unsigned Number)
{
if (!Number || Number > ci->GetAccessCount())
if (!Number || Number > source.ci->GetAccessCount())
return;
if (!SentHeader)
{
SentHeader = true;
u->SendMessage(ChanServ, CHAN_ACCESS_LIST_HEADER, ci->name.c_str());
source.Reply(CHAN_ACCESS_LIST_HEADER, source.ci->name.c_str());
}
DoList(u, ci, Number - 1, ci->GetAccess(Number - 1));
DoList(source, Number - 1, source.ci->GetAccess(Number - 1));
}
static void DoList(User *u, ChannelInfo *ci, unsigned Number, ChanAccess *access)
static void DoList(CommandSource &source, unsigned Number, ChanAccess *access)
{
User *u = source.u;
ChannelInfo *ci = source.ci;
Anope::string timebuf;
if (ci->c && nc_on_chan(ci->c, access->nc))
timebuf = "Now";
@@ -92,51 +93,53 @@ class AccessViewCallback : public AccessListCallback
if (ci->HasFlag(CI_XOP))
{
Anope::string xop = get_xop_level(access->level);
u->SendMessage(ChanServ, CHAN_ACCESS_VIEW_XOP_FORMAT, Number + 1, xop.c_str(), access->nc->display.c_str(), access->creator.c_str(), timebuf.c_str());
source.Reply(CHAN_ACCESS_VIEW_XOP_FORMAT, Number + 1, xop.c_str(), access->nc->display.c_str(), access->creator.c_str(), timebuf.c_str());
}
else
u->SendMessage(ChanServ, CHAN_ACCESS_VIEW_AXS_FORMAT, Number + 1, access->level, access->nc->display.c_str(), access->creator.c_str(), timebuf.c_str());
source.Reply(CHAN_ACCESS_VIEW_AXS_FORMAT, Number + 1, access->level, access->nc->display.c_str(), access->creator.c_str(), timebuf.c_str());
}
};
class AccessDelCallback : public NumberList
{
User *u;
ChannelInfo *ci;
CommandSource &source;
Command *c;
unsigned Deleted;
Anope::string Nicks;
bool Denied;
bool override;
public:
AccessDelCallback(User *_u, ChannelInfo *_ci, Command *_c, const Anope::string &numlist) : NumberList(numlist, true), u(_u), ci(_ci), c(_c), Deleted(0), Denied(false)
AccessDelCallback(CommandSource &_source, Command *_c, const Anope::string &numlist) : NumberList(numlist, true), source(_source), c(_c), Deleted(0), Denied(false)
{
if (!check_access(u, ci, CA_ACCESS_CHANGE) && u->Account()->HasPriv("chanserv/access/modify"))
if (!check_access(source.u, source.ci, CA_ACCESS_CHANGE) && source.u->Account()->HasPriv("chanserv/access/modify"))
this->override = true;
}
~AccessDelCallback()
{
if (Denied && !Deleted)
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else if (!Deleted)
u->SendMessage(ChanServ, CHAN_ACCESS_NO_MATCH, ci->name.c_str());
source.Reply(CHAN_ACCESS_NO_MATCH, source.ci->name.c_str());
else
{
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, c, ci) << "for user" << (Deleted == 1 ? " " : "s ") << Nicks;
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, c, source.ci) << "for user" << (Deleted == 1 ? " " : "s ") << Nicks;
if (Deleted == 1)
u->SendMessage(ChanServ, CHAN_ACCESS_DELETED_ONE, ci->name.c_str());
source.Reply(CHAN_ACCESS_DELETED_ONE, source.ci->name.c_str());
else
u->SendMessage(ChanServ, CHAN_ACCESS_DELETED_SEVERAL, Deleted, ci->name.c_str());
source.Reply(CHAN_ACCESS_DELETED_SEVERAL, Deleted, source.ci->name.c_str());
}
}
void HandleNumber(unsigned Number)
{
if (!Number || Number > ci->GetAccessCount())
if (!Number || Number > source.ci->GetAccessCount())
return;
User *u = source.u;
ChannelInfo *ci = source.ci;
ChanAccess *access = ci->GetAccess(Number - 1);
if (get_access(u, ci) <= access->level && !u->Account()->HasPriv("chanserv/access/modify"))
@@ -159,26 +162,29 @@ class AccessDelCallback : public NumberList
class CommandCSAccess : public Command
{
CommandReturn DoAdd(User *u, ChannelInfo *ci, const std::vector<Anope::string> &params)
CommandReturn DoAdd(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params[2];
User *u = source.u;
ChannelInfo *ci = source.ci;
const Anope::string &nick = params[2];
int level = params[3].is_number_only() ? convertTo<int>(params[3]) : ACCESS_INVALID;
int ulev = get_access(u, ci);
if (level >= ulev && !u->Account()->HasPriv("chanserv/access/modify"))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
if (!level)
{
u->SendMessage(ChanServ, CHAN_ACCESS_LEVEL_NONZERO);
source.Reply(CHAN_ACCESS_LEVEL_NONZERO);
return MOD_CONT;
}
else if (level <= ACCESS_INVALID || level >= ACCESS_FOUNDER)
{
u->SendMessage(ChanServ, CHAN_ACCESS_LEVEL_RANGE, ACCESS_INVALID + 1, ACCESS_FOUNDER - 1);
source.Reply(CHAN_ACCESS_LEVEL_RANGE, ACCESS_INVALID + 1, ACCESS_FOUNDER - 1);
return MOD_CONT;
}
@@ -187,12 +193,12 @@ class CommandCSAccess : public Command
NickAlias *na = findnick(nick);
if (!na)
{
u->SendMessage(ChanServ, CHAN_ACCESS_NICKS_ONLY);
source.Reply(CHAN_ACCESS_NICKS_ONLY);
return MOD_CONT;
}
else if (na->HasFlag(NS_FORBIDDEN))
{
u->SendMessage(ChanServ, NICK_X_FORBIDDEN, nick.c_str());
source.Reply(NICK_X_FORBIDDEN, nick.c_str());
return MOD_CONT;
}
@@ -203,12 +209,12 @@ class CommandCSAccess : public Command
/* Don't allow lowering from a level >= ulev */
if (access->level >= ulev && !u->Account()->HasPriv("chanserv/access/modify"))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
if (access->level == level)
{
u->SendMessage(ChanServ, CHAN_ACCESS_LEVEL_UNCHANGED, access->nc->display.c_str(), ci->name.c_str(), level);
source.Reply(CHAN_ACCESS_LEVEL_UNCHANGED, access->nc->display.c_str(), ci->name.c_str(), level);
return MOD_CONT;
}
access->level = level;
@@ -216,13 +222,13 @@ class CommandCSAccess : public Command
FOREACH_MOD(I_OnAccessChange, OnAccessChange(ci, u, na->nc, level));
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "ADD " << na->nick << " (group: " << nc->display << ") (level: " << level << ") as level " << ulev;
u->SendMessage(ChanServ, CHAN_ACCESS_LEVEL_CHANGED, nc->display.c_str(), ci->name.c_str(), level);
source.Reply(CHAN_ACCESS_LEVEL_CHANGED, nc->display.c_str(), ci->name.c_str(), level);
return MOD_CONT;
}
if (ci->GetAccessCount() >= Config->CSAccessMax)
{
u->SendMessage(ChanServ, CHAN_ACCESS_REACHED_LIMIT, Config->CSAccessMax);
source.Reply(CHAN_ACCESS_REACHED_LIMIT, Config->CSAccessMax);
return MOD_CONT;
}
@@ -236,15 +242,18 @@ class CommandCSAccess : public Command
return MOD_CONT;
}
CommandReturn DoDel(User *u, ChannelInfo *ci, const std::vector<Anope::string> &params)
CommandReturn DoDel(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params[2];
User *u = source.u;
ChannelInfo *ci = source.ci;
const Anope::string &nick = params[2];
if (!ci->GetAccessCount())
u->SendMessage(ChanServ, CHAN_ACCESS_LIST_EMPTY, ci->name.c_str());
source.Reply(CHAN_ACCESS_LIST_EMPTY, ci->name.c_str());
else if (isdigit(nick[0]) && nick.find_first_not_of("1234567890,-") == Anope::string::npos)
{
AccessDelCallback list(u, ci, this, nick);
AccessDelCallback list(source, this, nick);
list.Process();
}
else
@@ -252,7 +261,7 @@ class CommandCSAccess : public Command
NickAlias *na = findnick(nick);
if (!na)
{
u->SendMessage(ChanServ, NICK_X_NOT_REGISTERED, nick.c_str());
source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
return MOD_CONT;
}
@@ -269,12 +278,12 @@ class CommandCSAccess : public Command
}
if (i == end)
u->SendMessage(ChanServ, CHAN_ACCESS_NOT_FOUND, nick.c_str(), ci->name.c_str());
source.Reply(CHAN_ACCESS_NOT_FOUND, nick.c_str(), ci->name.c_str());
else if (nc != u->Account() && check_access(u, ci, CA_NOJOIN) && get_access(u, ci) <= access->level && !u->Account()->HasPriv("chanserv/access/modify"))
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else
{
u->SendMessage(ChanServ, CHAN_ACCESS_DELETED, access->nc->display.c_str(), ci->name.c_str());
source.Reply(CHAN_ACCESS_DELETED, access->nc->display.c_str(), ci->name.c_str());
bool override = !check_access(u, ci, CA_ACCESS_CHANGE) && nc != u->Account();
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "DEL " << na->nick << " (group: " << access->nc->display << ") from level " << access->level;
@@ -287,15 +296,17 @@ class CommandCSAccess : public Command
return MOD_CONT;
}
CommandReturn DoList(User *u, ChannelInfo *ci, const std::vector<Anope::string> &params)
CommandReturn DoList(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params.size() > 2 ? params[2] : "";
ChannelInfo *ci = source.ci;
const Anope::string &nick = params.size() > 2 ? params[2] : "";
if (!ci->GetAccessCount())
u->SendMessage(ChanServ, CHAN_ACCESS_LIST_EMPTY, ci->name.c_str());
source.Reply(CHAN_ACCESS_LIST_EMPTY, ci->name.c_str());
else if (!nick.empty() && nick.find_first_not_of("1234567890,-") == Anope::string::npos)
{
AccessListCallback list(u, ci, nick);
AccessListCallback list(source, nick);
list.Process();
}
else
@@ -312,30 +323,32 @@ class CommandCSAccess : public Command
if (!SentHeader)
{
SentHeader = true;
u->SendMessage(ChanServ, CHAN_ACCESS_LIST_HEADER, ci->name.c_str());
source.Reply(CHAN_ACCESS_LIST_HEADER, ci->name.c_str());
}
AccessListCallback::DoList(u, ci, i, access);
AccessListCallback::DoList(source, i, access);
}
if (SentHeader)
u->SendMessage(ChanServ, CHAN_ACCESS_LIST_FOOTER, ci->name.c_str());
source.Reply(CHAN_ACCESS_LIST_FOOTER, ci->name.c_str());
else
u->SendMessage(ChanServ, CHAN_ACCESS_NO_MATCH, ci->name.c_str());
source.Reply(CHAN_ACCESS_NO_MATCH, ci->name.c_str());
}
return MOD_CONT;
}
CommandReturn DoView(User *u, ChannelInfo *ci, const std::vector<Anope::string> &params)
CommandReturn DoView(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params.size() > 2 ? params[2] : "";
ChannelInfo *ci = source.ci;
const Anope::string &nick = params.size() > 2 ? params[2] : "";
if (!ci->GetAccessCount())
u->SendMessage(ChanServ, CHAN_ACCESS_LIST_EMPTY, ci->name.c_str());
source.Reply(CHAN_ACCESS_LIST_EMPTY, ci->name.c_str());
else if (!nick.empty() && nick.find_first_not_of("1234567890,-") == Anope::string::npos)
{
AccessViewCallback list(u, ci, nick);
AccessViewCallback list(source, nick);
list.Process();
}
else
@@ -352,32 +365,35 @@ class CommandCSAccess : public Command
if (!SentHeader)
{
SentHeader = true;
u->SendMessage(ChanServ, CHAN_ACCESS_LIST_HEADER, ci->name.c_str());
source.Reply(CHAN_ACCESS_LIST_HEADER, ci->name.c_str());
}
AccessViewCallback::DoList(u, ci, i, access);
AccessViewCallback::DoList(source, i, access);
}
if (SentHeader)
u->SendMessage(ChanServ, CHAN_ACCESS_LIST_FOOTER, ci->name.c_str());
source.Reply(CHAN_ACCESS_LIST_FOOTER, ci->name.c_str());
else
u->SendMessage(ChanServ, CHAN_ACCESS_NO_MATCH, ci->name.c_str());
source.Reply(CHAN_ACCESS_NO_MATCH, ci->name.c_str());
}
return MOD_CONT;
}
CommandReturn DoClear(User *u, ChannelInfo *ci)
CommandReturn DoClear(CommandSource &source)
{
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!IsFounder(u, ci) && !u->Account()->HasPriv("chanserv/access/modify"))
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else
{
ci->ClearAccess();
FOREACH_MOD(I_OnAccessClear, OnAccessClear(ci, u));
u->SendMessage(ChanServ, CHAN_ACCESS_CLEAR, ci->name.c_str());
source.Reply(CHAN_ACCESS_CLEAR, ci->name.c_str());
bool override = !IsFounder(u, ci);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "CLEAR";
@@ -391,14 +407,14 @@ class CommandCSAccess : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
Anope::string cmd = params[1];
Anope::string nick = params.size() > 2 ? params[2] : "";
Anope::string s = params.size() > 3 ? params[3] : "";
const Anope::string &cmd = params[1];
const Anope::string &nick = params.size() > 2 ? params[2] : "";
const Anope::string &s = params.size() > 3 ? params[3] : "";
ChannelInfo *ci = cs_findchan(chan);
User *u = source.u;
ChannelInfo *ci = source.ci;
bool is_list = cmd.equals_ci("LIST") || cmd.equals_ci("VIEW");
bool is_clear = cmd.equals_ci("CLEAR");
@@ -422,27 +438,27 @@ class CommandCSAccess : public Command
if (is_list || is_clear ? 0 : (cmd.equals_ci("DEL") ? (nick.empty() || !s.empty()) : s.empty()))
this->OnSyntaxError(u, cmd);
else if (!has_access)
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
/* We still allow LIST and CLEAR in xOP mode, but not others */
else if (ci->HasFlag(CI_XOP) && !is_list && !is_clear)
{
if (ModeManager::FindChannelModeByName(CMODE_HALFOP))
u->SendMessage(ChanServ, CHAN_ACCESS_XOP_HOP, Config->s_ChanServ.c_str());
source.Reply(CHAN_ACCESS_XOP_HOP, Config->s_ChanServ.c_str());
else
u->SendMessage(ChanServ, CHAN_ACCESS_XOP, Config->s_ChanServ.c_str());
source.Reply(CHAN_ACCESS_XOP, Config->s_ChanServ.c_str());
}
else if (readonly && !is_list)
u->SendMessage(ChanServ, CHAN_ACCESS_DISABLED);
source.Reply(CHAN_ACCESS_DISABLED);
else if (cmd.equals_ci("ADD"))
this->DoAdd(u, ci, params);
this->DoAdd(source, params);
else if (cmd.equals_ci("DEL"))
this->DoDel(u, ci, params);
this->DoDel(source, params);
else if (cmd.equals_ci("LIST"))
this->DoList(u, ci, params);
this->DoList(source, params);
else if (cmd.equals_ci("VIEW"))
this->DoView(u, ci, params);
this->DoView(source, params);
else if (cmd.equals_ci("CLEAR"))
this->DoClear(u, ci);
this->DoClear(source);
else
this->OnSyntaxError(u, "");
@@ -464,10 +480,13 @@ class CommandCSAccess : public Command
class CommandCSLevels : public Command
{
CommandReturn DoSet(User *u, ChannelInfo *ci, const std::vector<Anope::string> &params)
CommandReturn DoSet(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string what = params[2];
Anope::string lev = params[3];
User *u = source.u;
ChannelInfo *ci = source.ci;
const Anope::string &what = params[2];
const Anope::string &lev = params[3];
Anope::string error;
int level = (lev.is_number_only() ? convertTo<int>(lev, error, false) : 0);
@@ -483,7 +502,7 @@ class CommandCSLevels : public Command
if (!error.empty())
this->OnSyntaxError(u, "SET");
else if (level <= ACCESS_INVALID || level > ACCESS_FOUNDER)
u->SendMessage(ChanServ, CHAN_LEVELS_RANGE, ACCESS_INVALID + 1, ACCESS_FOUNDER - 1);
source.Reply(CHAN_LEVELS_RANGE, ACCESS_INVALID + 1, ACCESS_FOUNDER - 1);
else
{
for (int i = 0; levelinfo[i].what >= 0; ++i)
@@ -497,22 +516,25 @@ class CommandCSLevels : public Command
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "SET " << levelinfo[i].name << " to " << level;
if (level == ACCESS_FOUNDER)
u->SendMessage(ChanServ, CHAN_LEVELS_CHANGED_FOUNDER, levelinfo[i].name.c_str(), ci->name.c_str());
source.Reply(CHAN_LEVELS_CHANGED_FOUNDER, levelinfo[i].name.c_str(), ci->name.c_str());
else
u->SendMessage(ChanServ, CHAN_LEVELS_CHANGED, levelinfo[i].name.c_str(), ci->name.c_str(), level);
source.Reply(CHAN_LEVELS_CHANGED, levelinfo[i].name.c_str(), ci->name.c_str(), level);
return MOD_CONT;
}
}
u->SendMessage(ChanServ, CHAN_LEVELS_UNKNOWN, what.c_str(), Config->s_ChanServ.c_str());
source.Reply(CHAN_LEVELS_UNKNOWN, what.c_str(), Config->s_ChanServ.c_str());
}
return MOD_CONT;
}
CommandReturn DoDisable(User *u, ChannelInfo *ci, const std::vector<Anope::string> &params)
CommandReturn DoDisable(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string what = params[2];
User *u = source.u;
ChannelInfo *ci = source.ci;
const Anope::string &what = params[2];
/* Don't allow disabling of the founder level. It would be hard to change it back if you dont have access to use this command */
if (what.equals_ci("FOUNDER"))
@@ -526,19 +548,21 @@ class CommandCSLevels : public Command
bool override = !check_access(u, ci, CA_FOUNDER);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "DISABLE " << levelinfo[i].name;
u->SendMessage(ChanServ, CHAN_LEVELS_DISABLED, levelinfo[i].name.c_str(), ci->name.c_str());
source.Reply(CHAN_LEVELS_DISABLED, levelinfo[i].name.c_str(), ci->name.c_str());
return MOD_CONT;
}
}
u->SendMessage(ChanServ, CHAN_LEVELS_UNKNOWN, what.c_str(), Config->s_ChanServ.c_str());
source.Reply(CHAN_LEVELS_UNKNOWN, what.c_str(), Config->s_ChanServ.c_str());
return MOD_CONT;
}
CommandReturn DoList(User *u, ChannelInfo *ci)
CommandReturn DoList(CommandSource &source)
{
u->SendMessage(ChanServ, CHAN_LEVELS_LIST_HEADER, ci->name.c_str());
ChannelInfo *ci = source.ci;
source.Reply(CHAN_LEVELS_LIST_HEADER, ci->name.c_str());
if (!levelinfo_maxwidth)
for (int i = 0; levelinfo[i].what >= 0; ++i)
@@ -556,19 +580,22 @@ class CommandCSLevels : public Command
{
j = levelinfo[i].what;
u->SendMessage(ChanServ, CHAN_LEVELS_LIST_DISABLED, levelinfo_maxwidth, levelinfo[i].name.c_str());
source.Reply(CHAN_LEVELS_LIST_DISABLED, levelinfo_maxwidth, levelinfo[i].name.c_str());
}
else if (j == ACCESS_FOUNDER)
u->SendMessage(ChanServ, CHAN_LEVELS_LIST_FOUNDER, levelinfo_maxwidth, levelinfo[i].name.c_str());
source.Reply(CHAN_LEVELS_LIST_FOUNDER, levelinfo_maxwidth, levelinfo[i].name.c_str());
else
u->SendMessage(ChanServ, CHAN_LEVELS_LIST_NORMAL, levelinfo_maxwidth, levelinfo[i].name.c_str(), j);
source.Reply(CHAN_LEVELS_LIST_NORMAL, levelinfo_maxwidth, levelinfo[i].name.c_str(), j);
}
return MOD_CONT;
}
CommandReturn DoReset(User *u, ChannelInfo *ci)
CommandReturn DoReset(CommandSource &source)
{
User *u = source.u;
ChannelInfo *ci = source.ci;
reset_levels(ci);
FOREACH_MOD(I_OnLevelChange, OnLevelChange(u, ci, -1, 0));
@@ -584,14 +611,14 @@ class CommandCSLevels : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
Anope::string cmd = params[1];
Anope::string what = params.size() > 2 ? params[2] : "";
Anope::string s = params.size() > 3 ? params[3] : "";
const Anope::string &cmd = params[1];
const Anope::string &what = params.size() > 2 ? params[2] : "";
const Anope::string &s = params.size() > 3 ? params[3] : "";
ChannelInfo *ci = cs_findchan(chan);
User *u = source.u;
ChannelInfo *ci = source.ci;
/* If SET, we want two extra parameters; if DIS[ABLE] or FOUNDER, we want only
* one; else, we want none.
@@ -599,17 +626,17 @@ class CommandCSLevels : public Command
if (cmd.equals_ci("SET") ? s.empty() : (cmd.substr(0, 3).equals_ci("DIS") ? (what.empty() || !s.empty()) : !what.empty()))
this->OnSyntaxError(u, cmd);
else if (ci->HasFlag(CI_XOP))
u->SendMessage(ChanServ, CHAN_LEVELS_XOP);
source.Reply(CHAN_LEVELS_XOP);
else if (!check_access(u, ci, CA_FOUNDER) && !u->Account()->HasPriv("chanserv/access/modify"))
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else if (cmd.equals_ci("SET"))
this->DoSet(u, ci, params);
this->DoSet(source, params);
else if (cmd.equals_ci("DIS") || cmd.equals_ci("DISABLE"))
this->DoDisable(u, ci, params);
this->DoDisable(source, params);
else if (cmd.equals_ci("LIST"))
this->DoList(u, ci);
this->DoList(source);
else if (cmd.equals_ci("RESET"))
this->DoReset(u, ci);
this->DoReset(source);
else
this->OnSyntaxError(u, "");
+86 -67
View File
@@ -54,114 +54,119 @@ static void split_usermask(const Anope::string &mask, Anope::string &nick, Anope
class AkickListCallback : public NumberList
{
protected:
User *u;
ChannelInfo *ci;
CommandSource &source;
bool SentHeader;
public:
AkickListCallback(User *_u, ChannelInfo *_ci, const Anope::string &numlist) : NumberList(numlist, false), u(_u), ci(_ci), SentHeader(false)
AkickListCallback(CommandSource &_source, const Anope::string &numlist) : NumberList(numlist, false), source(_source), SentHeader(false)
{
}
~AkickListCallback()
{
if (!SentHeader)
u->SendMessage(ChanServ, CHAN_AKICK_NO_MATCH, ci->name.c_str());
source.Reply(CHAN_AKICK_NO_MATCH, source.ci->name.c_str());
}
virtual void HandleNumber(unsigned Number)
{
if (!Number || Number > ci->GetAkickCount())
if (!Number || Number > source.ci->GetAkickCount())
return;
if (!SentHeader)
{
SentHeader = true;
u->SendMessage(ChanServ, CHAN_AKICK_LIST_HEADER, ci->name.c_str());
source.Reply(CHAN_AKICK_LIST_HEADER, source.ci->name.c_str());
}
DoList(u, ci, Number - 1, ci->GetAkick(Number - 1));
DoList(source, Number - 1, source.ci->GetAkick(Number - 1));
}
static void DoList(User *u, ChannelInfo *ci, unsigned index, AutoKick *akick)
static void DoList(CommandSource &source, unsigned index, AutoKick *akick)
{
u->SendMessage(ChanServ, CHAN_AKICK_LIST_FORMAT, index + 1, akick->HasFlag(AK_ISNICK) ? akick->nc->display.c_str() :akick->mask.c_str(), !akick->reason.empty() ? akick->reason.c_str() : GetString(u, NO_REASON).c_str());
source.Reply(CHAN_AKICK_LIST_FORMAT, index + 1, akick->HasFlag(AK_ISNICK) ? akick->nc->display.c_str() : akick->mask.c_str(), !akick->reason.empty() ? akick->reason.c_str() : GetString(source.u, NO_REASON).c_str());
}
};
class AkickViewCallback : public AkickListCallback
{
public:
AkickViewCallback(User *_u, ChannelInfo *_ci, const Anope::string &numlist) : AkickListCallback(_u, _ci, numlist)
AkickViewCallback(CommandSource &_source, const Anope::string &numlist) : AkickListCallback(_source, numlist)
{
}
void HandleNumber(unsigned Number)
{
if (!Number || Number > ci->GetAkickCount())
if (!Number || Number > source.ci->GetAkickCount())
return;
if (!SentHeader)
{
SentHeader = true;
u->SendMessage(ChanServ, CHAN_AKICK_LIST_HEADER, ci->name.c_str());
source.Reply(CHAN_AKICK_LIST_HEADER, source.ci->name.c_str());
}
DoList(u, ci, Number - 1, ci->GetAkick(Number - 1));
DoList(source, Number - 1, source.ci->GetAkick(Number - 1));
}
static void DoList(User *u, ChannelInfo *ci, unsigned index, AutoKick *akick)
static void DoList(CommandSource &source, unsigned index, AutoKick *akick)
{
User *u = source.u;
Anope::string timebuf;
if (akick->addtime)
timebuf = do_strftime(akick->addtime);
else
timebuf = GetString(u, UNKNOWN);
u->SendMessage(ChanServ, CHAN_AKICK_VIEW_FORMAT, index + 1, akick->HasFlag(AK_ISNICK) ? akick->nc->display.c_str() : akick->mask.c_str(), !akick->creator.empty() ? akick->creator.c_str() : GetString(u, UNKNOWN).c_str(), timebuf.c_str(), !akick->reason.empty() ? akick->reason.c_str() : GetString(u, NO_REASON).c_str());
source.Reply(CHAN_AKICK_VIEW_FORMAT, index + 1, akick->HasFlag(AK_ISNICK) ? akick->nc->display.c_str() : akick->mask.c_str(), !akick->creator.empty() ? akick->creator.c_str() : GetString(u, UNKNOWN).c_str(), timebuf.c_str(), !akick->reason.empty() ? akick->reason.c_str() : GetString(u, NO_REASON).c_str());
if (akick->last_used)
u->SendMessage(ChanServ, CHAN_AKICK_LAST_USED, do_strftime(akick->last_used).c_str());
source.Reply(CHAN_AKICK_LAST_USED, do_strftime(akick->last_used).c_str());
}
};
class AkickDelCallback : public NumberList
{
User *u;
ChannelInfo *ci;
CommandSource &source;
Command *c;
unsigned Deleted;
public:
AkickDelCallback(User *_u, ChannelInfo *_ci, Command *_c, const Anope::string &list) : NumberList(list, true), u(_u), ci(_ci), c(_c), Deleted(0)
AkickDelCallback(CommandSource &_source, Command *_c, const Anope::string &list) : NumberList(list, true), source(_source), c(_c), Deleted(0)
{
}
~AkickDelCallback()
{
User *u = source.u;
ChannelInfo *ci = source.ci;
bool override = !check_access(u, ci, CA_AKICK);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, c, ci) << "DEL on " << Deleted << " users";
if (!Deleted)
u->SendMessage(ChanServ, CHAN_AKICK_NO_MATCH, ci->name.c_str());
source.Reply(CHAN_AKICK_NO_MATCH, ci->name.c_str());
else if (Deleted == 1)
u->SendMessage(ChanServ, CHAN_AKICK_DELETED_ONE, ci->name.c_str());
source.Reply(CHAN_AKICK_DELETED_ONE, ci->name.c_str());
else
u->SendMessage(ChanServ, CHAN_AKICK_DELETED_SEVERAL, Deleted, ci->name.c_str());
source.Reply(CHAN_AKICK_DELETED_SEVERAL, Deleted, ci->name.c_str());
}
void HandleNumber(unsigned Number)
{
if (!Number || Number > ci->GetAkickCount())
if (!Number || Number > source.ci->GetAkickCount())
return;
++Deleted;
ci->EraseAkick(Number - 1);
source.ci->EraseAkick(Number - 1);
}
};
class CommandCSAKick : public Command
{
void DoAdd(User *u, ChannelInfo *ci, const std::vector<Anope::string> &params)
void DoAdd(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
ChannelInfo *ci = source.ci;
Anope::string mask = params[2];
Anope::string reason = params.size() > 3 ? params[3] : "";
NickAlias *na = findnick(mask);
@@ -179,7 +184,7 @@ class CommandCSAKick : public Command
{
if (na->HasFlag(NS_FORBIDDEN))
{
u->SendMessage(ChanServ, NICK_X_FORBIDDEN, mask.c_str());
source.Reply(NICK_X_FORBIDDEN, mask.c_str());
return;
}
@@ -189,7 +194,7 @@ class CommandCSAKick : public Command
/* Check excepts BEFORE we get this far */
if (ModeManager::FindChannelModeByName(CMODE_EXCEPT) && is_excepted_mask(ci, mask))
{
u->SendMessage(ChanServ, CHAN_EXCEPTED, mask.c_str(), ci->name.c_str());
source.Reply(CHAN_EXCEPTED, mask.c_str(), ci->name.c_str());
return;
}
@@ -199,7 +204,7 @@ class CommandCSAKick : public Command
{
if (nc == ci->founder || get_access_level(ci, nc) >= get_access(u, ci))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return;
}
}
@@ -213,7 +218,7 @@ class CommandCSAKick : public Command
if ((check_access(u2, ci, CA_FOUNDER) || get_access(u2, ci) >= get_access(u, ci)) && match_usermask(mask, u2))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return;
}
}
@@ -232,7 +237,7 @@ class CommandCSAKick : public Command
Anope::string buf = na2->nick + "!" + na2->last_usermask;
if (Anope::Match(buf, mask))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return;
}
}
@@ -244,14 +249,14 @@ class CommandCSAKick : public Command
akick = ci->GetAkick(j);
if (akick->HasFlag(AK_ISNICK) ? akick->nc == nc : mask.equals_ci(akick->mask))
{
u->SendMessage(ChanServ, CHAN_AKICK_ALREADY_EXISTS, akick->HasFlag(AK_ISNICK) ? akick->nc->display.c_str() : akick->mask.c_str(), ci->name.c_str());
source.Reply(CHAN_AKICK_ALREADY_EXISTS, akick->HasFlag(AK_ISNICK) ? akick->nc->display.c_str() : akick->mask.c_str(), ci->name.c_str());
return;
}
}
if (ci->GetAkickCount() >= Config->CSAutokickMax)
{
u->SendMessage(ChanServ, CHAN_AKICK_REACHED_LIMIT, Config->CSAutokickMax);
source.Reply(CHAN_AKICK_REACHED_LIMIT, Config->CSAutokickMax);
return;
}
@@ -265,27 +270,30 @@ class CommandCSAKick : public Command
FOREACH_MOD(I_OnAkickAdd, OnAkickAdd(u, ci, akick));
u->SendMessage(ChanServ, CHAN_AKICK_ADDED, mask.c_str(), ci->name.c_str());
source.Reply(CHAN_AKICK_ADDED, mask.c_str(), ci->name.c_str());
this->DoEnforce(u, ci);
this->DoEnforce(source);
}
void DoDel(User *u, ChannelInfo *ci, const std::vector<Anope::string> &params)
void DoDel(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string mask = params[2];
User *u = source.u;
ChannelInfo *ci = source.ci;
const Anope::string &mask = params[2];
AutoKick *akick;
unsigned i, end;
if (!ci->GetAkickCount())
{
u->SendMessage(ChanServ, CHAN_AKICK_LIST_EMPTY, ci->name.c_str());
source.Reply(CHAN_AKICK_LIST_EMPTY, ci->name.c_str());
return;
}
/* Special case: is it a number/list? Only do search if it isn't. */
if (isdigit(mask[0]) && mask.find_first_not_of("1234567890,-") == Anope::string::npos)
{
AkickDelCallback list(u, ci, this, mask);
AkickDelCallback list(source, this, mask);
list.Process();
}
else
@@ -303,7 +311,7 @@ class CommandCSAKick : public Command
if (i == ci->GetAkickCount())
{
u->SendMessage(ChanServ, CHAN_AKICK_NOT_FOUND, mask.c_str(), ci->name.c_str());
source.Reply(CHAN_AKICK_NOT_FOUND, mask.c_str(), ci->name.c_str());
return;
}
@@ -312,26 +320,29 @@ class CommandCSAKick : public Command
ci->EraseAkick(i);
u->SendMessage(ChanServ, CHAN_AKICK_DELETED, mask.c_str(), ci->name.c_str());
source.Reply(CHAN_AKICK_DELETED, mask.c_str(), ci->name.c_str());
}
}
void DoList(User *u, ChannelInfo *ci, const std::vector<Anope::string> &params)
void DoList(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string mask = params.size() > 2 ? params[2] : "";
User *u = source.u;
ChannelInfo *ci = source.ci;
const Anope::string &mask = params.size() > 2 ? params[2] : "";
bool override = !check_access(u, ci, CA_AKICK);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "LIST";
if (!ci->GetAkickCount())
{
u->SendMessage(ChanServ, CHAN_AKICK_LIST_EMPTY, ci->name.c_str());
source.Reply(CHAN_AKICK_LIST_EMPTY, ci->name.c_str());
return;
}
if (!mask.empty() && isdigit(mask[0]) && mask.find_first_not_of("1234567890,-") == Anope::string::npos)
{
AkickListCallback list(u, ci, mask);
AkickListCallback list(source, mask);
list.Process();
}
else
@@ -353,33 +364,36 @@ class CommandCSAKick : public Command
if (!SentHeader)
{
SentHeader = true;
u->SendMessage(ChanServ, CHAN_AKICK_LIST_HEADER, ci->name.c_str());
source.Reply(CHAN_AKICK_LIST_HEADER, ci->name.c_str());
}
AkickListCallback::DoList(u, ci, i, akick);
AkickListCallback::DoList(source, i, akick);
}
if (!SentHeader)
u->SendMessage(ChanServ, CHAN_AKICK_NO_MATCH, ci->name.c_str());
source.Reply(CHAN_AKICK_NO_MATCH, ci->name.c_str());
}
}
void DoView(User *u, ChannelInfo *ci, const std::vector<Anope::string> &params)
void DoView(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string mask = params.size() > 2 ? params[2] : "";
User *u = source.u;
ChannelInfo *ci = source.ci;
const Anope::string &mask = params.size() > 2 ? params[2] : "";
bool override = !check_access(u, ci, CA_AKICK);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "VIEW";
if (!ci->GetAkickCount())
{
u->SendMessage(ChanServ, CHAN_AKICK_LIST_EMPTY, ci->name.c_str());
source.Reply(CHAN_AKICK_LIST_EMPTY, ci->name.c_str());
return;
}
if (!mask.empty() && isdigit(mask[0]) && mask.find_first_not_of("1234567890,-") == Anope::string::npos)
{
AkickViewCallback list(u, ci, mask);
AkickViewCallback list(source, mask);
list.Process();
}
else
@@ -401,25 +415,27 @@ class CommandCSAKick : public Command
if (!SentHeader)
{
SentHeader = true;
u->SendMessage(ChanServ, CHAN_AKICK_LIST_HEADER, ci->name.c_str());
source.Reply(CHAN_AKICK_LIST_HEADER, ci->name.c_str());
}
AkickViewCallback::DoList(u, ci, i, akick);
AkickViewCallback::DoList(source, i, akick);
}
if (!SentHeader)
u->SendMessage(ChanServ, CHAN_AKICK_NO_MATCH, ci->name.c_str());
source.Reply(CHAN_AKICK_NO_MATCH, ci->name.c_str());
}
}
void DoEnforce(User *u, ChannelInfo *ci)
void DoEnforce(CommandSource &source)
{
User *u = source.u;
ChannelInfo *ci = source.ci;
Channel *c = ci->c;
int count = 0;
if (!c)
{
u->SendMessage(ChanServ, CHAN_X_NOT_IN_USE, ci->name.c_str());
source.Reply(CHAN_X_NOT_IN_USE, ci->name.c_str());
return;
}
@@ -437,8 +453,10 @@ class CommandCSAKick : public Command
u->SendMessage(ChanServ, CHAN_AKICK_ENFORCE_DONE, ci->name.c_str(), count);
}
void DoClear(User *u, ChannelInfo *ci)
void DoClear(CommandSource &source)
{
User *u = source.u;
ChannelInfo *ci = source.ci;
bool override = !check_access(u, ci, CA_AKICK);
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "CLEAR";
@@ -451,32 +469,33 @@ class CommandCSAKick : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
Anope::string cmd = params[1];
Anope::string mask = params.size() > 2 ? params[2] : "";
ChannelInfo *ci = cs_findchan(chan);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (mask.empty() && (cmd.equals_ci("ADD") || cmd.equals_ci("DEL")))
this->OnSyntaxError(u, cmd);
else if (!check_access(u, ci, CA_AKICK) && !u->Account()->HasPriv("chanserv/access/modify"))
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else if (!cmd.equals_ci("LIST") && !cmd.equals_ci("VIEW") && !cmd.equals_ci("ENFORCE") && readonly)
u->SendMessage(ChanServ, CHAN_AKICK_DISABLED);
source.Reply(CHAN_AKICK_DISABLED);
else if (cmd.equals_ci("ADD"))
this->DoAdd(u, ci, params);
this->DoAdd(source, params);
else if (cmd.equals_ci("DEL"))
this->DoDel(u, ci, params);
this->DoDel(source, params);
else if (cmd.equals_ci("LIST"))
this->DoList(u, ci, params);
this->DoList(source, params);
else if (cmd.equals_ci("VIEW"))
this->DoView(u, ci, params);
this->DoView(source, params);
else if (cmd.equals_ci("ENFORCE"))
this->DoEnforce(u, ci);
this->DoEnforce(source);
else if (cmd.equals_ci("CLEAR"))
this->DoClear(u, ci);
this->DoClear(source);
else
this->OnSyntaxError(u, "");
+15 -20
View File
@@ -20,39 +20,35 @@ class CommandCSBan : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
Anope::string target = params[1];
Anope::string reason = params.size() > 2 ? params[2] : "Requested";
const Anope::string &chan = params[0];
const Anope::string &target = params[1];
const Anope::string &reason = params.size() > 2 ? params[2] : "Requested";
Channel *c = findchan(chan);
ChannelInfo *ci;
User *u = source.u;
ChannelInfo *ci = source.ci;
Channel *c = ci->c;
User *u2;
int is_same;
is_same = target.equals_ci(u->nick);
if (c)
ci = c->ci;
bool is_same = target.equals_ci(u->nick);
if (!c)
u->SendMessage(ChanServ, CHAN_X_NOT_IN_USE, chan.c_str());
source.Reply(CHAN_X_NOT_IN_USE, chan.c_str());
else if (is_same ? !(u2 = u) : !(u2 = finduser(target)))
u->SendMessage(ChanServ, NICK_X_NOT_IN_USE, target.c_str());
source.Reply(NICK_X_NOT_IN_USE, target.c_str());
else if (!is_same ? !check_access(u, ci, CA_BAN) : !check_access(u, ci, CA_BANME))
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else if (!is_same && (ci->HasFlag(CI_PEACE)) && (get_access(u2, ci) >= get_access(u, ci)))
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
/*
* Dont ban/kick the user on channels where he is excepted
* to prevent services <-> server wars.
*/
else if (ModeManager::FindChannelModeByName(CMODE_EXCEPT) && is_excepted(ci, u2))
u->SendMessage(ChanServ, CHAN_EXCEPTED, u2->nick.c_str(), ci->name.c_str());
source.Reply(CHAN_EXCEPTED, u2->nick.c_str(), ci->name.c_str());
else if (u2->IsProtected())
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else
{
Anope::string mask;
@@ -89,8 +85,7 @@ class CommandCSBan : public Command
void OnServHelp(User *u)
{
if (this->name.equals_ci("BAN"))
u->SendMessage(ChanServ, CHAN_HELP_CMD_BAN);
u->SendMessage(ChanServ, CHAN_HELP_CMD_BAN);
}
};
+10 -8
View File
@@ -20,20 +20,22 @@ class CommandCSClearUsers : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
Anope::string what = params[1];
Channel *c = findchan(chan);
ChannelInfo *ci = c ? c->ci : NULL;
const Anope::string &chan = params[0];
User *u = source.u;
ChannelInfo *ci = source.ci;
Channel *c = ci->c;
Anope::string modebuf;
if (!c)
u->SendMessage(ChanServ, CHAN_X_NOT_IN_USE, chan.c_str());
source.Reply(CHAN_X_NOT_IN_USE, chan.c_str());
else if (!check_access(u, ci, CA_FOUNDER))
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
Anope::string buf = "CLEAR USERS command from " + u->nick + " (" + u->Account()->display + ")";
Anope::string buf = "CLEARUSERS command from " + u->nick + " (" + u->Account()->display + ")";
for (CUserList::iterator it = c->users.begin(), it_end = c->users.end(); it != it_end; )
{
+12 -10
View File
@@ -20,33 +20,35 @@ public:
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
const Anope::string &channel = params[0];
const Anope::string &target = params[1];
Anope::string what = params.size() > 2 ? params[2] : "";
ChannelInfo *ci = cs_findchan(channel);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!check_access(u, ci, CA_SET))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
ChannelInfo *target_ci = cs_findchan(target);
if (!target_ci)
{
u->SendMessage(ChanServ, CHAN_X_NOT_REGISTERED, target.c_str());
source.Reply(CHAN_X_NOT_REGISTERED, target.c_str());
return MOD_CONT;
}
if (!IsFounder(u, ci) || !IsFounder(u, target_ci))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
if (Config->CSMaxReg && u->Account()->channelcount >= Config->CSMaxReg && !u->Account()->HasPriv("chanserv/no-register-limit"))
{
u->SendMessage(ChanServ, u->Account()->channelcount > Config->CSMaxReg ? CHAN_EXCEEDED_CHANNEL_LIMIT : CHAN_REACHED_CHANNEL_LIMIT, Config->CSMaxReg);
source.Reply(u->Account()->channelcount > Config->CSMaxReg ? CHAN_EXCEEDED_CHANNEL_LIMIT : CHAN_REACHED_CHANNEL_LIMIT, Config->CSMaxReg);
return MOD_CONT;
}
@@ -98,7 +100,7 @@ public:
FOREACH_MOD(I_OnChanRegistered, OnChanRegistered(target_ci));
u->SendMessage(ChanServ, CHAN_CLONED, channel.c_str(), target.c_str());
source.Reply(CHAN_CLONED, channel.c_str(), target.c_str());
}
else if (what.equals_ci("ACCESS"))
{
@@ -109,7 +111,7 @@ public:
target_ci->AddAccess(access->nc, access->level, access->creator, access->last_seen);
}
u->SendMessage(ChanServ, CHAN_CLONED_ACCESS, channel.c_str(), target.c_str());
source.Reply(CHAN_CLONED_ACCESS, channel.c_str(), target.c_str());
}
else if (what.equals_ci("AKICK"))
{
@@ -123,7 +125,7 @@ public:
target_ci->AddAkick(akick->creator, akick->mask, akick->reason, akick->addtime, akick->last_used);
}
u->SendMessage(ChanServ, CHAN_CLONED_AKICK, channel.c_str(), target.c_str());
source.Reply(CHAN_CLONED_AKICK, channel.c_str(), target.c_str());
}
else if (what.equals_ci("BADWORDS"))
{
@@ -134,7 +136,7 @@ public:
target_ci->AddBadWord(bw->word, bw->type);
}
u->SendMessage(ChanServ, CHAN_CLONED_BADWORDS, channel.c_str(), target.c_str());
source.Reply(CHAN_CLONED_BADWORDS, channel.c_str(), target.c_str());
}
else
{
+9 -7
View File
@@ -22,14 +22,16 @@ class CommandCSDrop : public Command
this->SetFlag(CFLAG_ALLOW_SUSPENDED);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
ChannelInfo *ci;
const Anope::string &chan = params[0];
User *u = source.u;
ChannelInfo *ci = source.ci;
if (readonly)
{
u->SendMessage(ChanServ, CHAN_DROP_DISABLED); // XXX: READ_ONLY_MODE?
source.Reply(CHAN_DROP_DISABLED); // XXX: READ_ONLY_MODE?
return MOD_CONT;
}
@@ -37,19 +39,19 @@ class CommandCSDrop : public Command
if (ci->HasFlag(CI_FORBIDDEN) && !u->Account()->HasCommand("chanserv/drop"))
{
u->SendMessage(ChanServ, CHAN_X_FORBIDDEN, chan.c_str());
source.Reply(CHAN_X_FORBIDDEN, chan.c_str());
return MOD_CONT;
}
if (ci->HasFlag(CI_SUSPENDED) && !u->Account()->HasCommand("chanserv/drop"))
{
u->SendMessage(ChanServ, CHAN_X_FORBIDDEN, chan.c_str());
source.Reply(CHAN_X_FORBIDDEN, chan.c_str());
return MOD_CONT;
}
if ((ci->HasFlag(CI_SECUREFOUNDER) ? !IsFounder(u, ci) : !check_access(u, ci, CA_FOUNDER)) && !u->Account()->HasCommand("chanserv/drop"))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
+9 -8
View File
@@ -21,13 +21,13 @@ class CommandCSForbid : public Command
this->SetFlag(CFLAG_ALLOW_UNREGISTEREDCHANNEL);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci;
Anope::string chan = params[0];
Anope::string reason = params.size() > 1 ? params[1] : "";
const Anope::string &chan = params[0];
const Anope::string &reason = params.size() > 1 ? params[1] : "";
Channel *c;
User *u = source.u;
ChannelInfo *ci = source.ci;
if (Config->ForceForbidReason && reason.empty())
{
@@ -37,13 +37,13 @@ class CommandCSForbid : public Command
if (chan[0] != '#')
{
u->SendMessage(ChanServ, CHAN_SYMBOL_REQUIRED);
source.Reply(CHAN_SYMBOL_REQUIRED);
return MOD_CONT;
}
if (readonly)
{
u->SendMessage(ChanServ, READ_ONLY_MODE);
source.Reply(READ_ONLY_MODE);
return MOD_CONT;
}
@@ -55,7 +55,8 @@ class CommandCSForbid : public Command
ci->forbidby = u->nick;
ci->forbidreason = reason;
if ((c = ci->c))
Channel *c = ci->c;
if (c)
{
/* Before banning everyone, it might be prudent to clear +e and +I lists..
* to prevent ppl from rejoining.. ~ Viper */
+7 -7
View File
@@ -20,23 +20,23 @@ class CommandCSGetKey : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
ChannelInfo *ci;
Anope::string key;
const Anope::string &chan = params[0];
ci = cs_findchan(chan);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!check_access(u, ci, CA_GETKEY) && !u->Account()->HasCommand("chanserv/getkey"))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
Anope::string key;
if (!ci->c || !ci->c->GetParam(CMODE_KEY, key))
{
u->SendMessage(ChanServ, CHAN_GETKEY_NOKEY, chan.c_str());
source.Reply(CHAN_GETKEY_NOKEY, chan.c_str());
return MOD_CONT;
}
+2 -2
View File
@@ -22,9 +22,9 @@ class CommandCSHelp : public Command
this->SetFlag(CFLAG_STRIP_CHANNEL);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
mod_help_cmd(ChanServ, u, params[0]);
mod_help_cmd(ChanServ, source.u, params[0]);
return MOD_CONT;
}
+17 -15
View File
@@ -34,20 +34,22 @@ class CommandCSInfo : public Command
this->SetFlag(CFLAG_ALLOW_FORBIDDEN);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
const Anope::string &chan = params[0];
User *u = source.u;
ChannelInfo *ci = source.ci;
bool has_auspex = u->IsIdentified() && u->Account()->HasPriv("chanserv/auspex");
bool show_all = false;
ChannelInfo *ci = cs_findchan(chan);
if (ci->HasFlag(CI_FORBIDDEN))
{
if (is_oper(u) && !ci->forbidby.empty())
u->SendMessage(ChanServ, CHAN_X_FORBIDDEN_OPER, chan.c_str(), ci->forbidby.c_str(), !ci->forbidreason.empty() ? ci->forbidreason.c_str() : GetString(u, NO_REASON).c_str());
source.Reply(CHAN_X_FORBIDDEN_OPER, chan.c_str(), ci->forbidby.c_str(), !ci->forbidreason.empty() ? ci->forbidreason.c_str() : GetString(u, NO_REASON).c_str());
else
u->SendMessage(ChanServ, CHAN_X_FORBIDDEN, chan.c_str());
source.Reply(CHAN_X_FORBIDDEN, chan.c_str());
return MOD_CONT;
}
@@ -60,7 +62,7 @@ class CommandCSInfo : public Command
u->SendMessage(ChanServ, CHAN_INFO_NO_FOUNDER, ci->founder->display.c_str());
if (show_all && ci->successor)
u->SendMessage(ChanServ, CHAN_INFO_NO_SUCCESSOR, ci->successor->display.c_str());
source.Reply(CHAN_INFO_NO_SUCCESSOR, ci->successor->display.c_str());
u->SendMessage(ChanServ, CHAN_INFO_DESCRIPTION, ci->desc.c_str());
u->SendMessage(ChanServ, CHAN_INFO_TIME_REGGED, do_strftime(ci->time_registered).c_str());
@@ -69,13 +71,13 @@ class CommandCSInfo : public Command
ModeLock *secret = ci->GetMLock(CMODE_SECRET);
if (!ci->last_topic.empty() && (show_all || ((!secret || secret->set == false) && (!ci->c || !ci->c->HasMode(CMODE_SECRET)))))
{
u->SendMessage(ChanServ, CHAN_INFO_LAST_TOPIC, ci->last_topic.c_str());
u->SendMessage(ChanServ, CHAN_INFO_TOPIC_SET_BY, ci->last_topic_setter.c_str());
source.Reply(CHAN_INFO_LAST_TOPIC, ci->last_topic.c_str());
source.Reply(CHAN_INFO_TOPIC_SET_BY, ci->last_topic_setter.c_str());
}
if (show_all)
{
u->SendMessage(ChanServ, CHAN_INFO_BANTYPE, ci->bantype);
source.Reply(CHAN_INFO_BANTYPE, ci->bantype);
Anope::string optbuf;
CheckOptStr(optbuf, CI_KEEPTOPIC, GetString(u, CHAN_INFO_OPT_KEEPTOPIC), ci, u->Account());
@@ -94,17 +96,17 @@ class CommandCSInfo : public Command
CheckOptStr(optbuf, CI_XOP, GetString(u, CHAN_INFO_OPT_XOP), ci, u->Account());
CheckOptStr(optbuf, CI_PERSIST, GetString(u, CHAN_INFO_OPT_PERSIST), ci, u->Account());
u->SendMessage(ChanServ, NICK_INFO_OPTIONS, optbuf.empty() ? GetString(u, NICK_INFO_OPT_NONE).c_str() : optbuf.c_str());
u->SendMessage(ChanServ, CHAN_INFO_MODE_LOCK, get_mlock_modes(ci, 1).c_str());
source.Reply(NICK_INFO_OPTIONS, optbuf.empty() ? GetString(u, NICK_INFO_OPT_NONE).c_str() : optbuf.c_str());
source.Reply(CHAN_INFO_MODE_LOCK, get_mlock_modes(ci, 1).c_str());
// XXX: we could just as easily (and tidily) merge this in with the flags display above.
if (ci->HasFlag(CI_NO_EXPIRE))
u->SendMessage(ChanServ, CHAN_INFO_NO_EXPIRE);
source.Reply(CHAN_INFO_NO_EXPIRE);
else
u->SendMessage(ChanServ, CHAN_INFO_EXPIRE, do_strftime(ci->last_used + Config->CSExpire).c_str());
source.Reply(CHAN_INFO_EXPIRE, do_strftime(ci->last_used + Config->CSExpire).c_str());
}
if (ci->HasFlag(CI_SUSPENDED))
u->SendMessage(ChanServ, CHAN_X_SUSPENDED, ci->forbidby.c_str(), !ci->forbidreason.empty() ? ci->forbidreason.c_str() : GetString(u, NO_REASON).c_str());
source.Reply(CHAN_X_SUSPENDED, ci->forbidby.c_str(), !ci->forbidreason.empty() ? ci->forbidreason.c_str() : GetString(u, NO_REASON).c_str());
FOREACH_MOD(I_OnChanInfo, OnChanInfo(u, ci, show_all));
+12 -10
View File
@@ -20,16 +20,17 @@ class CommandCSInvite : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
Channel *c;
ChannelInfo *ci;
User *u2;
const Anope::string &chan = params[0];
User *u = source.u;
ChannelInfo *ci = source.ci;
Channel *c = ci->c;
if (!(c = findchan(chan)))
{
u->SendMessage(ChanServ, CHAN_X_NOT_IN_USE, chan.c_str());
source.Reply(CHAN_X_NOT_IN_USE, chan.c_str());
return MOD_CONT;
}
@@ -37,17 +38,18 @@ class CommandCSInvite : public Command
if (!check_access(u, ci, CA_INVITE))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
User *u2;
if (params.size() == 1)
u2 = u;
else
{
if (!(u2 = finduser(params[1])))
{
u->SendMessage(ChanServ, NICK_X_NOT_IN_USE, params[1].c_str());
source.Reply(NICK_X_NOT_IN_USE, params[1].c_str());
return MOD_CONT;
}
}
@@ -56,11 +58,11 @@ class CommandCSInvite : public Command
Log(LOG_COMMAND, u, this, ci) << "for " << u2->nick;
if (c->FindUser(u2))
u->SendMessage(ChanServ, CHAN_INVITE_ALREADY_IN, c->name.c_str());
source.Reply(CHAN_INVITE_ALREADY_IN, c->name.c_str());
else
{
ircdproto->SendInvite(whosends(ci), chan, u2->nick);
u->SendMessage(whosends(ci), CHAN_INVITE_OTHER_SUCCESS, u2->nick.c_str(), c->name.c_str());
source.Reply(CHAN_INVITE_OTHER_SUCCESS, u2->nick.c_str(), c->name.c_str());
u2->SendMessage(whosends(ci), CHAN_INVITE_SUCCESS, c->name.c_str());
}
return MOD_CONT;
+15 -20
View File
@@ -20,35 +20,31 @@ class CommandCSKick : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
Anope::string target = params[1];
Anope::string reason = params.size() > 2 ? params[2] : "Requested";
const Anope::string &chan = params[0];
const Anope::string &target = params[1];
const Anope::string &reason = params.size() > 2 ? params[2] : "Requested";
Channel *c = findchan(chan);
ChannelInfo *ci;
User *u = source.u;
ChannelInfo *ci = source.ci;
Channel *c = ci->c;
User *u2;
int is_same;
is_same = target.equals_cs(u->nick) ? 1 : target.equals_ci(u->nick);
if (c)
ci = c->ci;
bool is_same = target.equals_ci(u->nick);
if (!c)
u->SendMessage(ChanServ, CHAN_X_NOT_IN_USE, chan.c_str());
source.Reply(CHAN_X_NOT_IN_USE, chan.c_str());
else if (is_same ? !(u2 = u) : !(u2 = finduser(target)))
u->SendMessage(ChanServ, NICK_X_NOT_IN_USE, target.c_str());
source.Reply(NICK_X_NOT_IN_USE, target.c_str());
else if (!is_same ? !check_access(u, ci, CA_KICK) : !check_access(u, ci, CA_KICKME))
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else if (!is_same && (ci->HasFlag(CI_PEACE)) && get_access(u2, ci) >= get_access(u, ci))
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else if (u2->IsProtected())
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else if (!c->FindUser(u2))
u->SendMessage(ChanServ, NICK_X_NOT_ON_CHAN, u2->nick.c_str(), c->name.c_str());
source.Reply(NICK_X_NOT_ON_CHAN, u2->nick.c_str(), c->name.c_str());
else
{
// XXX
@@ -75,8 +71,7 @@ class CommandCSKick : public Command
void OnServHelp(User *u)
{
if (this->name.equals_ci("KICK"))
u->SendMessage(ChanServ, CHAN_HELP_CMD_KICK);
u->SendMessage(ChanServ, CHAN_HELP_CMD_KICK);
}
};
+13 -11
View File
@@ -22,8 +22,10 @@ public:
this->SetFlag(CFLAG_STRIP_CHANNEL);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
Anope::string pattern = params[0];
unsigned nchans;
char buf[BUFSIZE];
@@ -33,7 +35,7 @@ public:
if (Config->CSListOpersOnly && !is_oper(u))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_STOP;
}
@@ -42,28 +44,28 @@ public:
Anope::string tmp = myStrGetToken(pattern.substr(1), '-', 0); /* Read FROM out */
if (tmp.empty())
{
u->SendMessage(ChanServ, LIST_INCORRECT_RANGE);
u->SendMessage(ChanServ, CS_LIST_INCORRECT_RANGE);
source.Reply(LIST_INCORRECT_RANGE);
source.Reply(CS_LIST_INCORRECT_RANGE);
return MOD_CONT;
}
if (!tmp.is_number_only())
{
u->SendMessage(ChanServ, LIST_INCORRECT_RANGE);
u->SendMessage(ChanServ, CS_LIST_INCORRECT_RANGE);
source.Reply(LIST_INCORRECT_RANGE);
source.Reply(CS_LIST_INCORRECT_RANGE);
return MOD_CONT;
}
from = convertTo<int>(tmp);
tmp = myStrGetTokenRemainder(pattern, '-', 1); /* Read TO out */
if (tmp.empty())
{
u->SendMessage(ChanServ, LIST_INCORRECT_RANGE);
u->SendMessage(ChanServ, CS_LIST_INCORRECT_RANGE);
source.Reply(LIST_INCORRECT_RANGE);
source.Reply(CS_LIST_INCORRECT_RANGE);
return MOD_CONT;
}
if (!tmp.is_number_only())
{
u->SendMessage(ChanServ, LIST_INCORRECT_RANGE);
u->SendMessage(ChanServ, CS_LIST_INCORRECT_RANGE);
source.Reply(LIST_INCORRECT_RANGE);
source.Reply(CS_LIST_INCORRECT_RANGE);
return MOD_CONT;
}
to = convertTo<int>(tmp);
@@ -119,7 +121,7 @@ public:
else
snprintf(buf, sizeof(buf), "%-20s %s", ci->name.c_str(), !ci->desc.empty() ? ci->desc.c_str() : "");
u->SendMessage(Config->s_ChanServ, " %c%s", noexpire_char, buf);
source.Reply(" %c%s", noexpire_char, buf);
}
++count;
}
+24 -18
View File
@@ -15,8 +15,10 @@
class CommandCSMode : public Command
{
void DoLock(User *u, ChannelInfo *ci, const std::vector<Anope::string> &params)
void DoLock(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
ChannelInfo *ci = source.ci;
const Anope::string &subcommand = params[2];
const Anope::string &param = params.size() > 3 ? params[3] : "";
@@ -44,18 +46,18 @@ class CommandCSMode : public Command
ChannelMode *cm = ModeManager::FindChannelModeByChar(modes[i]);
if (!cm || !cm->CanSet(u))
{
u->SendMessage(ChanServ, CHAN_MODE_LOCK_UNKNOWN, modes[i]);
source.Reply(CHAN_MODE_LOCK_UNKNOWN, modes[i]);
break;
}
Anope::string mode_param;
if (((cm->Type == MODE_STATUS || cm->Type == MODE_LIST) && !sep.GetToken(mode_param)) || (cm->Type == MODE_PARAM && adding && !sep.GetToken(mode_param)))
u->SendMessage(ChanServ, CHAN_MODE_LOCK_MISSING_PARAM, cm->ModeChar);
source.Reply(CHAN_MODE_LOCK_MISSING_PARAM, cm->ModeChar);
else
{
ci->SetMLock(cm, adding, mode_param, u->nick);
if (!mode_param.empty())
mode_param = " " + mode_param;
u->SendMessage(ChanServ, CHAN_MODE_LOCKED, adding ? '+' : '-', cm->ModeChar, mode_param.c_str(), ci->name.c_str());
source.Reply(CHAN_MODE_LOCKED, adding ? '+' : '-', cm->ModeChar, mode_param.c_str(), ci->name.c_str());
}
}
}
@@ -87,22 +89,22 @@ class CommandCSMode : public Command
ChannelMode *cm = ModeManager::FindChannelModeByChar(modes[i]);
if (!cm || !cm->CanSet(u))
{
u->SendMessage(ChanServ, CHAN_MODE_LOCK_UNKNOWN, modes[i]);
source.Reply(CHAN_MODE_LOCK_UNKNOWN, modes[i]);
break;
}
Anope::string mode_param;
if (!cm->Type == MODE_REGULAR && !sep.GetToken(mode_param))
u->SendMessage(ChanServ, CHAN_MODE_LOCK_MISSING_PARAM, cm->ModeChar);
source.Reply(CHAN_MODE_LOCK_MISSING_PARAM, cm->ModeChar);
else
{
if (ci->RemoveMLock(cm, mode_param))
{
if (!mode_param.empty())
mode_param = " " + mode_param;
u->SendMessage(ChanServ, CHAN_MODE_UNLOCKED, adding == 1 ? '+' : '-', cm->ModeChar, mode_param.c_str(), ci->name.c_str());
source.Reply(CHAN_MODE_UNLOCKED, adding == 1 ? '+' : '-', cm->ModeChar, mode_param.c_str(), ci->name.c_str());
}
else
u->SendMessage(ChanServ, CHAN_MODE_NOT_LOCKED, cm->ModeChar, ci->name.c_str());
source.Reply(CHAN_MODE_NOT_LOCKED, cm->ModeChar, ci->name.c_str());
}
}
}
@@ -112,11 +114,11 @@ class CommandCSMode : public Command
const std::multimap<ChannelModeName, ModeLock> &mlocks = ci->GetMLock();
if (mlocks.empty())
{
u->SendMessage(ChanServ, CHAN_MODE_LOCK_NONE, ci->name.c_str());
source.Reply(CHAN_MODE_LOCK_NONE, ci->name.c_str());
}
else
{
u->SendMessage(ChanServ, CHAN_MODE_LOCK_HEADER, ci->name.c_str());
source.Reply(CHAN_MODE_LOCK_HEADER, ci->name.c_str());
for (std::multimap<ChannelModeName, ModeLock>::const_iterator it = mlocks.begin(), it_end = mlocks.end(); it != it_end; ++it)
{
const ModeLock &ml = it->second;
@@ -130,7 +132,7 @@ class CommandCSMode : public Command
Anope::string setter = ml.setter;
if (setter.empty())
setter = ci->founder ? ci->founder->display : "Unknown";
u->SendMessage(ChanServ, CHAN_MODE_LIST_FMT, ml.set ? '+' : '-', cm->ModeChar, modeparam.c_str(), setter.c_str(), do_strftime(ml.created).c_str());
source.Reply(CHAN_MODE_LIST_FMT, ml.set ? '+' : '-', cm->ModeChar, modeparam.c_str(), setter.c_str(), do_strftime(ml.created).c_str());
}
}
}
@@ -138,8 +140,11 @@ class CommandCSMode : public Command
this->OnSyntaxError(u, subcommand);
}
void DoSet(User *u, ChannelInfo *ci, const std::vector<Anope::string> &params)
void DoSet(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
ChannelInfo *ci = source.ci;
spacesepstream sep(params.size() > 3 ? params[3] : "");
Anope::string modes = params[2], param;
@@ -252,20 +257,21 @@ class CommandCSMode : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
const Anope::string &subcommand = params[1];
ChannelInfo *ci = cs_findchan(params[0]);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!ci || !ci->c)
u->SendMessage(ChanServ, CHAN_X_NOT_IN_USE, ci->name.c_str());
source.Reply(CHAN_X_NOT_IN_USE, ci->name.c_str());
else if (!check_access(u, ci, CA_MODE) && !u->Account()->HasCommand("chanserv/mode"))
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else if (subcommand.equals_ci("LOCK"))
this->DoLock(u, ci, params);
this->DoLock(source, params);
else if (subcommand.equals_ci("SET"))
this->DoSet(u, ci, params);
this->DoSet(source, params);
else
this->OnSyntaxError(u, "");
+20 -12
View File
@@ -68,8 +68,9 @@ class CommandCSOp : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OP);
return do_util(u, this, cm, params[0], params.size() > 1 ? params[1] : "", true, CA_OPDEOP, CA_OPDEOPME, "OP", CI_OPNOTICE);
@@ -99,8 +100,9 @@ class CommandCSDeOp : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OP);
return do_util(u, this, cm, params[0], params.size() > 1 ? params[1] : "", false, CA_OPDEOP, CA_OPDEOPME, "DEOP", CI_OPNOTICE);
@@ -130,8 +132,9 @@ class CommandCSVoice : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_VOICE);
return do_util(u, this, cm, params[0], params.size() > 1 ? params[1] : "", true, CA_VOICE, CA_VOICEME, "VOICE", CI_BEGIN);
@@ -161,8 +164,9 @@ class CommandCSDeVoice : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_VOICE);
return do_util(u, this, cm, params[0], params.size() > 1 ? params[1] : "", false, CA_VOICE, CA_VOICEME, "DEVOICE", CI_BEGIN);
@@ -192,14 +196,13 @@ class CommandCSHalfOp : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_HALFOP);
if (!cm)
{
return MOD_CONT;
}
return do_util(u, this, cm, params[0], params.size() > 1 ? params[1] : "", true, CA_HALFOP, CA_HALFOPME, "HALFOP", CI_BEGIN);
}
@@ -228,8 +231,9 @@ class CommandCSDeHalfOp : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_HALFOP);
if (!cm)
@@ -262,8 +266,9 @@ class CommandCSProtect : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_PROTECT);
if (!cm)
@@ -296,8 +301,9 @@ class CommandCSDeProtect : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_PROTECT);
if (!cm)
@@ -330,8 +336,9 @@ class CommandCSOwner : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OWNER);
if (!cm)
@@ -364,8 +371,9 @@ class CommandCSDeOwner : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OWNER);
if (!cm)
+16 -14
View File
@@ -21,32 +21,33 @@ class CommandCSRegister : public Command
this->SetFlag(CFLAG_ALLOW_UNREGISTEREDCHANNEL);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
Anope::string desc = params[1];
Channel *c = findchan(chan);
ChannelInfo *ci;
ChannelMode *cm;
const Anope::string &chan = params[0];
const Anope::string &desc = params[1];
User *u = source.u;
ChannelInfo *ci = source.ci;
Channel *c = ci->c;
if (readonly)
{
u->SendMessage(ChanServ, CHAN_REGISTER_DISABLED);
source.Reply(CHAN_REGISTER_DISABLED);
return MOD_CONT;
}
if (chan[0] == '&')
u->SendMessage(ChanServ, CHAN_REGISTER_NOT_LOCAL);
source.Reply(CHAN_REGISTER_NOT_LOCAL);
else if (chan[0] != '#')
u->SendMessage(ChanServ, CHAN_SYMBOL_REQUIRED);
source.Reply(CHAN_SYMBOL_REQUIRED);
else if (!ircdproto->IsChannelValid(chan))
u->SendMessage(ChanServ, CHAN_X_INVALID, chan.c_str());
source.Reply(CHAN_X_INVALID, chan.c_str());
else if ((ci = cs_findchan(chan)))
u->SendMessage(ChanServ, CHAN_ALREADY_REGISTERED, chan.c_str());
source.Reply(CHAN_ALREADY_REGISTERED, chan.c_str());
else if (c && !c->HasUserStatus(u, CMODE_OP))
u->SendMessage(ChanServ, CHAN_MUST_BE_CHANOP);
source.Reply(CHAN_MUST_BE_CHANOP);
else if (Config->CSMaxReg && u->Account()->channelcount >= Config->CSMaxReg && !u->Account()->HasPriv("chanserv/no-register-limit"))
u->SendMessage(ChanServ, u->Account()->channelcount > Config->CSMaxReg ? CHAN_EXCEEDED_CHANNEL_LIMIT : CHAN_REACHED_CHANNEL_LIMIT, Config->CSMaxReg);
source.Reply(u->Account()->channelcount > Config->CSMaxReg ? CHAN_EXCEEDED_CHANNEL_LIMIT : CHAN_REACHED_CHANNEL_LIMIT, Config->CSMaxReg);
else
{
ci = new ChannelInfo(chan);
@@ -65,13 +66,14 @@ class CommandCSRegister : public Command
ci->bi = NULL;
++ci->founder->channelcount;
Log(LOG_COMMAND, u, this, ci);
u->SendMessage(ChanServ, CHAN_REGISTERED, chan.c_str(), u->nick.c_str());
source.Reply(CHAN_REGISTERED, 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 */
+8 -6
View File
@@ -28,18 +28,20 @@ class CommandCSSASet : public Command
this->subcommands.clear();
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
if (readonly)
{
u->SendMessage(ChanServ, CHAN_SET_DISABLED);
source.Reply(CHAN_SET_DISABLED);
return MOD_CONT;
}
// XXX Remove after 1.9.4 release
if (params[1].equals_ci("MLOCK"))
{
u->SendMessage(ChanServ, CHAN_SET_MLOCK_DEPRECATED);
source.Reply(CHAN_SET_MLOCK_DEPRECATED);
return MOD_CONT;
}
@@ -47,7 +49,7 @@ class CommandCSSASet : public Command
if (c)
{
ChannelInfo *ci = cs_findchan(params[0]);
ChannelInfo *ci = source.ci;
Anope::string cmdparams = ci->name;
for (std::vector<Anope::string>::const_iterator it = params.begin() + 2, it_end = params.end(); it != it_end; ++it)
cmdparams += " " + *it;
@@ -56,8 +58,8 @@ class CommandCSSASet : public Command
}
else
{
u->SendMessage(ChanServ, NICK_SET_UNKNOWN_OPTION, params[1].c_str());
u->SendMessage(ChanServ, MORE_INFO, Config->s_ChanServ.c_str(), "SET");
source.Reply(NICK_SET_UNKNOWN_OPTION, params[1].c_str());
source.Reply(MORE_INFO, Config->s_ChanServ.c_str(), "SET");
}
return MOD_CONT;
+5 -4
View File
@@ -20,21 +20,22 @@ class CommandCSSASetNoexpire : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci = cs_findchan(params[0]);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!ci)
throw CoreException("NULL ci in CommandCSSASetNoexpire");
if (params[1].equals_ci("ON"))
{
ci->SetFlag(CI_NO_EXPIRE);
u->SendMessage(ChanServ, CHAN_SET_NOEXPIRE_ON, ci->name.c_str());
source.Reply(CHAN_SET_NOEXPIRE_ON, ci->name.c_str());
}
else if (params[1].equals_ci("OFF"))
{
ci->UnsetFlag(CI_NO_EXPIRE);
u->SendMessage(ChanServ, CHAN_SET_NOEXPIRE_OFF, ci->name.c_str());
source.Reply(CHAN_SET_NOEXPIRE_OFF, ci->name.c_str());
}
else
this->OnSyntaxError(u, "NOEXPIRE");
+9 -7
View File
@@ -28,23 +28,25 @@ class CommandCSSet : public Command
this->subcommands.clear();
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
if (readonly)
{
u->SendMessage(ChanServ, CHAN_SET_DISABLED);
source.Reply(CHAN_SET_DISABLED);
return MOD_CONT;
}
if (!check_access(u, cs_findchan(params[0]), CA_SET))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
// XXX Remove after 1.9.4 release
if (params[1].equals_ci("MLOCK"))
{
u->SendMessage(ChanServ, CHAN_SET_MLOCK_DEPRECATED, Config->s_ChanServ.c_str());
source.Reply(CHAN_SET_MLOCK_DEPRECATED, Config->s_ChanServ.c_str());
return MOD_CONT;
}
@@ -52,7 +54,7 @@ class CommandCSSet : public Command
if (c)
{
ChannelInfo *ci = cs_findchan(params[0]);
ChannelInfo *ci = source.ci;
Anope::string cmdparams = ci->name;
for (std::vector<Anope::string>::const_iterator it = params.begin() + 2, it_end = params.end(); it != it_end; ++it)
cmdparams += " " + *it;
@@ -60,8 +62,8 @@ class CommandCSSet : public Command
}
else
{
u->SendMessage(ChanServ, NICK_SET_UNKNOWN_OPTION, params[1].c_str());
u->SendMessage(ChanServ, MORE_INFO, Config->s_ChanServ.c_str(), "SET");
source.Reply(NICK_SET_UNKNOWN_OPTION, params[1].c_str());
source.Reply(MORE_INFO, Config->s_ChanServ.c_str(), "SET");
}
return MOD_CONT;
+4 -4
View File
@@ -20,9 +20,9 @@ class CommandCSSetBanType : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci = cs_findchan(params[0]);
ChannelInfo *ci = source.ci;
if (!ci)
throw CoreException("NULL ci in CommandCSSetBanType");
@@ -31,11 +31,11 @@ class CommandCSSetBanType : public Command
int16 bantype = convertTo<int16>(params[1], end, false);
if (!end.empty() || bantype < 0 || bantype > 3)
u->SendMessage(ChanServ, CHAN_SET_BANTYPE_INVALID, params[1].c_str());
source.Reply(CHAN_SET_BANTYPE_INVALID, params[1].c_str());
else
{
ci->bantype = bantype;
u->SendMessage(ChanServ, CHAN_SET_BANTYPE_CHANGED, ci->name.c_str(), ci->bantype);
source.Reply(CHAN_SET_BANTYPE_CHANGED, ci->name.c_str(), ci->bantype);
}
return MOD_CONT;
+3 -2
View File
@@ -20,9 +20,10 @@ class CommandCSSetDescription : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci = cs_findchan(params[0]);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!ci)
throw CoreException("NULL ci in CommandCSSetDescription");
+7 -6
View File
@@ -20,15 +20,16 @@ class CommandCSSetFounder : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci = cs_findchan(params[0]);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!ci)
throw CoreException("NULL ci in CommandCSSetFounder");
if (this->permission.empty() && (ci->HasFlag(CI_SECUREFOUNDER) ? !IsFounder(u, ci) : !check_access(u, ci, CA_FOUNDER)))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
@@ -37,19 +38,19 @@ class CommandCSSetFounder : public Command
if (!na)
{
u->SendMessage(ChanServ, NICK_X_NOT_REGISTERED, params[1].c_str());
source.Reply(NICK_X_NOT_REGISTERED, params[1].c_str());
return MOD_CONT;
}
else if (na->HasFlag(NS_FORBIDDEN))
{
u->SendMessage(ChanServ, NICK_X_FORBIDDEN, na->nick.c_str());
source.Reply(NICK_X_FORBIDDEN, na->nick.c_str());
return MOD_CONT;
}
nc = na->nc;
if (Config->CSMaxReg && nc->channelcount >= Config->CSMaxReg && !u->Account()->HasPriv("chanserv/no-register-limit"))
{
u->SendMessage(ChanServ, CHAN_SET_FOUNDER_TOO_MANY_CHANS, na->nick.c_str());
source.Reply(CHAN_SET_FOUNDER_TOO_MANY_CHANS, na->nick.c_str());
return MOD_CONT;
}
+5 -4
View File
@@ -20,21 +20,22 @@ class CommandCSSetKeepTopic : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci = cs_findchan(params[0]);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!ci)
throw CoreException("NULL ci in CommandCSSetKeepTopic");
if (params[1].equals_ci("ON"))
{
ci->SetFlag(CI_KEEPTOPIC);
u->SendMessage(ChanServ, CHAN_SET_KEEPTOPIC_ON, ci->name.c_str());
source.Reply(CHAN_SET_KEEPTOPIC_ON, ci->name.c_str());
}
else if (params[1].equals_ci("OFF"))
{
ci->UnsetFlag(CI_KEEPTOPIC);
u->SendMessage(ChanServ, CHAN_SET_KEEPTOPIC_OFF, ci->name.c_str());
source.Reply(CHAN_SET_KEEPTOPIC_OFF, ci->name.c_str());
}
else
this->OnSyntaxError(u, "KEEPTOPIC");
+5 -4
View File
@@ -20,21 +20,22 @@ class CommandCSSetOpNotice : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci = cs_findchan(params[0]);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!ci)
throw CoreException("NULL ci in CommandCSSetOpNotice");
if (params[1].equals_ci("ON"))
{
ci->SetFlag(CI_OPNOTICE);
u->SendMessage(ChanServ, CHAN_SET_OPNOTICE_ON, ci->name.c_str());
source.Reply(CHAN_SET_OPNOTICE_ON, ci->name.c_str());
}
else if (params[1].equals_ci("OFF"))
{
ci->UnsetFlag(CI_OPNOTICE);
u->SendMessage(ChanServ, CHAN_SET_OPNOTICE_OFF, ci->name.c_str());
source.Reply(CHAN_SET_OPNOTICE_OFF, ci->name.c_str());
}
else
this->OnSyntaxError(u, "OPNOTICE");
+5 -4
View File
@@ -20,21 +20,22 @@ class CommandCSSetPeace : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci = cs_findchan(params[0]);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!ci)
throw CoreException("NULL ci in CommandCSSetPeace");
if (params[1].equals_ci("ON"))
{
ci->SetFlag(CI_PEACE);
u->SendMessage(ChanServ, CHAN_SET_PEACE_ON, ci->name.c_str());
source.Reply(CHAN_SET_PEACE_ON, ci->name.c_str());
}
else if (params[1].equals_ci("OFF"))
{
ci->UnsetFlag(CI_PEACE);
u->SendMessage(ChanServ, CHAN_SET_PEACE_OFF, ci->name.c_str());
source.Reply(CHAN_SET_PEACE_OFF, ci->name.c_str());
}
else
this->OnSyntaxError(u, "PEACE");
+5 -4
View File
@@ -20,9 +20,10 @@ class CommandCSSetPersist : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci = cs_findchan(params[0]);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!ci)
throw CoreException("NULL ci in CommandCSSetPersist");
@@ -65,7 +66,7 @@ class CommandCSSetPersist : public Command
}
}
u->SendMessage(ChanServ, CHAN_SET_PERSIST_ON, ci->name.c_str());
source.Reply(CHAN_SET_PERSIST_ON, ci->name.c_str());
}
else if (params[1].equals_ci("OFF"))
{
@@ -92,7 +93,7 @@ class CommandCSSetPersist : public Command
ChanServ->UnAssign(NULL, ci);
}
u->SendMessage(ChanServ, CHAN_SET_PERSIST_OFF, ci->name.c_str());
source.Reply(CHAN_SET_PERSIST_OFF, ci->name.c_str());
}
else
this->OnSyntaxError(u, "PERSIST");
+5 -4
View File
@@ -20,21 +20,22 @@ class CommandCSSetPrivate : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci = cs_findchan(params[0]);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!ci)
throw CoreException("NULL ci in CommandCSSetPrivate");
if (params[1].equals_ci("ON"))
{
ci->SetFlag(CI_PRIVATE);
u->SendMessage(ChanServ, CHAN_SET_PRIVATE_ON, ci->name.c_str());
source.Reply(CHAN_SET_PRIVATE_ON, ci->name.c_str());
}
else if (params[1].equals_ci("OFF"))
{
ci->UnsetFlag(CI_PRIVATE);
u->SendMessage(ChanServ, CHAN_SET_PRIVATE_OFF, ci->name.c_str());
source.Reply(CHAN_SET_PRIVATE_OFF, ci->name.c_str());
}
else
this->OnSyntaxError(u, "PRIVATE");
+5 -4
View File
@@ -19,9 +19,10 @@ class CommandCSSetRestricted : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci = cs_findchan(params[0]);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!ci)
throw CoreException("NULL ci in CommandCSSetRestricted");
@@ -30,14 +31,14 @@ class CommandCSSetRestricted : public Command
ci->SetFlag(CI_RESTRICTED);
if (ci->levels[CA_NOJOIN] < 0)
ci->levels[CA_NOJOIN] = 0;
u->SendMessage(ChanServ, CHAN_SET_RESTRICTED_ON, ci->name.c_str());
source.Reply(CHAN_SET_RESTRICTED_ON, ci->name.c_str());
}
else if (params[1].equals_ci("OFF"))
{
ci->UnsetFlag(CI_RESTRICTED);
if (ci->levels[CA_NOJOIN] >= 0)
ci->levels[CA_NOJOIN] = -2;
u->SendMessage(ChanServ, CHAN_SET_RESTRICTED_OFF, ci->name.c_str());
source.Reply(CHAN_SET_RESTRICTED_OFF, ci->name.c_str());
}
else
this->OnSyntaxError(u, "RESTRICTED");
+5 -4
View File
@@ -20,21 +20,22 @@ class CommandCSSetSecure : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci = cs_findchan(params[0]);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!ci)
throw CoreException("NULL ci in CommandCSSetSecure");
if (params[1].equals_ci("ON"))
{
ci->SetFlag(CI_SECURE);
u->SendMessage(ChanServ, CHAN_SET_SECURE_ON, ci->name.c_str());
source.Reply(CHAN_SET_SECURE_ON, ci->name.c_str());
}
else if (params[1].equals_ci("OFF"))
{
ci->UnsetFlag(CI_SECURE);
u->SendMessage(ChanServ, CHAN_SET_SECURE_OFF, ci->name.c_str());
source.Reply(CHAN_SET_SECURE_OFF, ci->name.c_str());
}
else
this->OnSyntaxError(u, "SECURE");
+6 -5
View File
@@ -20,27 +20,28 @@ class CommandCSSetSecureFounder : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci = cs_findchan(params[0]);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!ci)
throw CoreException("NULL ci in CommandCSSetSecureFounder");
if (this->permission.empty() && ci->HasFlag(CI_SECUREFOUNDER) ? !IsFounder(u, ci) : !check_access(u, ci, CA_FOUNDER))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
if (params[1].equals_ci("ON"))
{
ci->SetFlag(CI_SECUREFOUNDER);
u->SendMessage(ChanServ, CHAN_SET_SECUREFOUNDER_ON, ci->name.c_str());
source.Reply(CHAN_SET_SECUREFOUNDER_ON, ci->name.c_str());
}
else if (params[1].equals_ci("OFF"))
{
ci->UnsetFlag(CI_SECUREFOUNDER);
u->SendMessage(ChanServ, CHAN_SET_SECUREFOUNDER_OFF, ci->name.c_str());
source.Reply(CHAN_SET_SECUREFOUNDER_OFF, ci->name.c_str());
}
else
this->OnSyntaxError(u, "SECUREFOUNDER");
+5 -4
View File
@@ -20,21 +20,22 @@ class CommandCSSetSecureOps : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci = cs_findchan(params[0]);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!ci)
throw CoreException("NULL ci in CommandCSSetSecureIos");
if (params[1].equals_ci("ON"))
{
ci->SetFlag(CI_SECUREOPS);
u->SendMessage(ChanServ, CHAN_SET_SECUREOPS_ON, ci->name.c_str());
source.Reply(CHAN_SET_SECUREOPS_ON, ci->name.c_str());
}
else if (params[1].equals_ci("OFF"))
{
ci->UnsetFlag(CI_SECUREOPS);
u->SendMessage(ChanServ, CHAN_SET_SECUREOPS_OFF, ci->name.c_str());
source.Reply(CHAN_SET_SECUREOPS_OFF, ci->name.c_str());
}
else
this->OnSyntaxError(u, "SECUREOPS");
+6 -5
View File
@@ -20,9 +20,10 @@ class CommandCSSetSignKick : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci = cs_findchan(params[0]);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!ci)
throw CoreException("NULL ci in CommandCSSetSignKick");
@@ -30,19 +31,19 @@ class CommandCSSetSignKick : public Command
{
ci->SetFlag(CI_SIGNKICK);
ci->UnsetFlag(CI_SIGNKICK_LEVEL);
u->SendMessage(ChanServ, CHAN_SET_SIGNKICK_ON, ci->name.c_str());
source.Reply(CHAN_SET_SIGNKICK_ON, ci->name.c_str());
}
else if (params[1].equals_ci("LEVEL"))
{
ci->SetFlag(CI_SIGNKICK_LEVEL);
ci->UnsetFlag(CI_SIGNKICK);
u->SendMessage(ChanServ, CHAN_SET_SIGNKICK_LEVEL, ci->name.c_str());
source.Reply(CHAN_SET_SIGNKICK_LEVEL, ci->name.c_str());
}
else if (params[1].equals_ci("OFF"))
{
ci->UnsetFlag(CI_SIGNKICK);
ci->UnsetFlag(CI_SIGNKICK_LEVEL);
u->SendMessage(ChanServ, CHAN_SET_SIGNKICK_OFF, ci->name.c_str());
source.Reply(CHAN_SET_SIGNKICK_OFF, ci->name.c_str());
}
else
this->OnSyntaxError(u, "SIGNKICK");
+9 -8
View File
@@ -20,15 +20,16 @@ class CommandCSSetSuccessor : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci = cs_findchan(params[0]);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!ci)
throw CoreException("NULL ci in CommandCSSetSuccessor");
if (this->permission.empty() && ci->HasFlag(CI_SECUREFOUNDER) ? !IsFounder(u, ci) : !check_access(u, ci, CA_FOUNDER))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
@@ -40,17 +41,17 @@ class CommandCSSetSuccessor : public Command
if (!na)
{
u->SendMessage(ChanServ, NICK_X_NOT_REGISTERED, params[1].c_str());
source.Reply(NICK_X_NOT_REGISTERED, params[1].c_str());
return MOD_CONT;
}
if (na->HasFlag(NS_FORBIDDEN))
{
u->SendMessage(ChanServ, NICK_X_FORBIDDEN, na->nick.c_str());
source.Reply(NICK_X_FORBIDDEN, na->nick.c_str());
return MOD_CONT;
}
if (na->nc == ci->founder)
{
u->SendMessage(ChanServ, CHAN_SUCCESSOR_IS_FOUNDER, na->nick.c_str(), ci->name.c_str());
source.Reply(CHAN_SUCCESSOR_IS_FOUNDER, na->nick.c_str(), ci->name.c_str());
return MOD_CONT;
}
nc = na->nc;
@@ -63,9 +64,9 @@ class CommandCSSetSuccessor : public Command
ci->successor = nc;
if (nc)
u->SendMessage(ChanServ, CHAN_SUCCESSOR_CHANGED, ci->name.c_str(), nc->display.c_str());
source.Reply(CHAN_SUCCESSOR_CHANGED, ci->name.c_str(), nc->display.c_str());
else
u->SendMessage(ChanServ, CHAN_SUCCESSOR_UNSET, ci->name.c_str());
source.Reply(CHAN_SUCCESSOR_UNSET, ci->name.c_str());
return MOD_CONT;
}
+5 -4
View File
@@ -20,21 +20,22 @@ class CommandCSSetTopicLock : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci = cs_findchan(params[0]);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!ci)
throw CoreException("NULL ci in CommandCSSetTopicLock");
if (params[1].equals_ci("ON"))
{
ci->SetFlag(CI_TOPICLOCK);
u->SendMessage(ChanServ, CHAN_SET_TOPICLOCK_ON, ci->name.c_str());
source.Reply(CHAN_SET_TOPICLOCK_ON, ci->name.c_str());
}
else if (params[1].equals_ci("OFF"))
{
ci->UnsetFlag(CI_TOPICLOCK);
u->SendMessage(ChanServ, CHAN_SET_TOPICLOCK_OFF, ci->name.c_str());
source.Reply(CHAN_SET_TOPICLOCK_OFF, ci->name.c_str());
}
else
this->OnSyntaxError(u, "TOPICLOCK");
+7 -5
View File
@@ -21,15 +21,17 @@ class CommandCSSetXOP : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
ChannelInfo *ci = source.ci;
if (!FindModule("cs_xop"))
{
u->SendMessage(ChanServ, CHAN_XOP_NOT_AVAILABLE, "XOP");
source.Reply(CHAN_XOP_NOT_AVAILABLE, "XOP");
return MOD_CONT;
}
ChannelInfo *ci = cs_findchan(params[0]);
if (!ci)
throw CoreException("NULL ci in CommandCSSetXOP");
@@ -65,14 +67,14 @@ class CommandCSSetXOP : public Command
}
Log(LOG_COMMAND, u, this, ci) << "to enable XOP";
u->SendMessage(ChanServ, CHAN_SET_XOP_ON, ci->name.c_str());
source.Reply(CHAN_SET_XOP_ON, ci->name.c_str());
}
else if (params[1].equals_ci("OFF"))
{
ci->UnsetFlag(CI_XOP);
Log(LOG_COMMAND, u, this, ci) << "to disable XOP";
u->SendMessage(ChanServ, CHAN_SET_XOP_OFF, ci->name.c_str());
source.Reply(CHAN_SET_XOP_OFF, ci->name.c_str());
}
else
this->OnSyntaxError(u, "XOP");
+8 -18
View File
@@ -20,27 +20,17 @@ class CommandCSStatus : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
ChannelInfo *ci;
User *u2;
Anope::string chan = params[0];
Anope::string nick = params[1];
Anope::string temp;
User *u = source.u;
ChannelInfo *ci = source.ci;
const Anope::string &nick = params[1];
if (!(ci = cs_findchan(chan)))
{
temp = chan;
chan = nick;
nick = temp;
ci = cs_findchan(chan);
}
if (!ci)
u->SendMessage(ChanServ, CHAN_STATUS_NOT_REGGED, temp.c_str());
else if ((u2 = finduser(nick)))
u->SendMessage(ChanServ, CHAN_STATUS_INFO, chan.c_str(), nick.c_str(), get_access(u2, ci));
User *u2 = finduser(nick);
if (u2)
source.Reply(CHAN_STATUS_INFO, ci->name.c_str(), u2->nick.c_str(), get_access(u2, ci));
else /* !u2 */
u->SendMessage(ChanServ, CHAN_STATUS_NOTONLINE, nick.c_str());
source.Reply(CHAN_STATUS_NOTONLINE, nick.c_str());
return MOD_CONT;
}
+15 -26
View File
@@ -20,13 +20,13 @@ class CommandCSSuspend : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
Anope::string reason = params.size() > 1 ? params[1] : "";
ChannelInfo *ci = cs_findchan(chan);
const Anope::string &reason = params.size() > 1 ? params[1] : "";
Channel *c;
User *u = source.u;
ChannelInfo *ci = source.ci;
Channel *c = ci->c;
/* Assumes that permission checking has already been done. */
if (Config->ForceForbidReason && reason.empty())
@@ -35,28 +35,22 @@ class CommandCSSuspend : public Command
return MOD_CONT;
}
if (chan[0] != '#')
{
u->SendMessage(ChanServ, CHAN_UNSUSPEND_ERROR);
return MOD_CONT;
}
/* You should not SUSPEND a FORBIDEN channel */
if (ci->HasFlag(CI_FORBIDDEN))
{
u->SendMessage(ChanServ, CHAN_MAY_NOT_BE_REGISTERED, chan.c_str());
source.Reply(CHAN_MAY_NOT_BE_REGISTERED, ci->name.c_str());
return MOD_CONT;
}
if (readonly)
u->SendMessage(ChanServ, READ_ONLY_MODE);
source.Reply(READ_ONLY_MODE);
ci->SetFlag(CI_SUSPENDED);
ci->forbidby = u->nick;
if (!reason.empty())
ci->forbidreason = reason;
if ((c = findchan(ci->name)))
if (c)
{
for (CUserList::iterator it = c->users.begin(), it_end = c->users.end(); it != it_end; )
{
@@ -73,7 +67,7 @@ class CommandCSSuspend : public Command
ircdproto->SendGlobops(ChanServ, "\2%s\2 used SUSPEND on channel \2%s\2", u->nick.c_str(), ci->name.c_str());
Log(LOG_ADMIN, u, this, ci) << (!reason.empty() ? reason : "No reason");
u->SendMessage(ChanServ, CHAN_SUSPEND_SUCCEEDED, chan.c_str());
u->SendMessage(ChanServ, CHAN_SUSPEND_SUCCEEDED, ci->name.c_str());
FOREACH_MOD(I_OnChanSuspend, OnChanSuspend(ci));
@@ -105,23 +99,18 @@ class CommandCSUnSuspend : public Command
this->SetFlag(CFLAG_ALLOW_SUSPENDED);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
ChannelInfo *ci = cs_findchan(chan);
User *u = source.u;
ChannelInfo *ci = source.ci;
if (chan[0] != '#')
{
u->SendMessage(ChanServ, CHAN_UNSUSPEND_ERROR);
return MOD_CONT;
}
if (readonly)
u->SendMessage(ChanServ, READ_ONLY_MODE);
source.Reply(READ_ONLY_MODE);
/* Only UNSUSPEND already suspended channels */
if (!ci->HasFlag(CI_SUSPENDED))
{
u->SendMessage(ChanServ, CHAN_UNSUSPEND_FAILED, chan.c_str());
source.Reply(CHAN_UNSUSPEND_FAILED, ci->name.c_str());
return MOD_CONT;
}
@@ -134,7 +123,7 @@ class CommandCSUnSuspend : public Command
if (Config->WallForbid)
ircdproto->SendGlobops(ChanServ, "\2%s\2 used UNSUSPEND on channel \2%s\2", u->nick.c_str(), ci->name.c_str());
u->SendMessage(ChanServ, CHAN_UNSUSPEND_SUCCEEDED, chan.c_str());
u->SendMessage(ChanServ, CHAN_UNSUSPEND_SUCCEEDED, ci->name.c_str());
FOREACH_MOD(I_OnChanUnsuspend, OnChanUnsuspend(ci));
+6 -6
View File
@@ -20,18 +20,18 @@ class CommandCSTopic : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
Anope::string topic = params.size() > 1 ? params[1] : "";
const Anope::string &topic = params.size() > 1 ? params[1] : "";
ChannelInfo *ci = cs_findchan(params[0]);
User *u = source.u;
ChannelInfo *ci = source.ci;
Channel *c = ci->c;
if (!c)
u->SendMessage(ChanServ, CHAN_X_NOT_IN_USE, chan.c_str());
source.Reply(CHAN_X_NOT_IN_USE, ci->name.c_str());
else if (!check_access(u, ci, CA_TOPIC) && !u->Account()->HasCommand("chanserv/topic"))
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else
{
bool has_topiclock = ci->HasFlag(CI_TOPICLOCK);
+14 -13
View File
@@ -20,39 +20,40 @@ class CommandCSUnban : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string chan = params[0];
Channel *c;
User *u2;
User *u = source.u;
ChannelInfo *ci = source.ci;
Channel *c = ci->c;
if (!(c = findchan(chan)))
if (!c)
{
u->SendMessage(ChanServ, CHAN_X_NOT_IN_USE, chan.c_str());
source.Reply(CHAN_X_NOT_IN_USE, ci->name.c_str());
return MOD_CONT;
}
if (!check_access(u, c->ci, CA_UNBAN))
if (!check_access(u, ci, CA_UNBAN))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
u2 = u;
User *u2 = u;
if (params.size() > 1)
u2 = finduser(params[1]);
if (!u2)
{
u->SendMessage(ChanServ, NICK_X_NOT_IN_USE, params[1].c_str());
source.Reply(NICK_X_NOT_IN_USE, params[1].c_str());
return MOD_CONT;
}
common_unban(c->ci, u2->nick);
common_unban(ci, u2->nick);
if (u2 == u)
u->SendMessage(ChanServ, CHAN_UNBANNED, c->name.c_str());
source.Reply(CHAN_UNBANNED, c->name.c_str());
else
u->SendMessage(ChanServ, CHAN_UNBANNED_OTHER, u2->nick.c_str(), c->name.c_str());
source.Reply(CHAN_UNBANNED_OTHER, u2->nick.c_str(), c->name.c_str());
return MOD_CONT;
}
+83 -72
View File
@@ -111,22 +111,21 @@ LanguageString xop_msgs[XOP_TYPES][XOP_MESSAGES] = {
class XOPListCallback : public NumberList
{
User *u;
ChannelInfo *ci;
CommandSource &source;
int level;
LanguageString *messages;
bool SentHeader;
public:
XOPListCallback(User *_u, ChannelInfo *_ci, const Anope::string &numlist, int _level, LanguageString *_messages) : NumberList(numlist, false), u(_u), ci(_ci), level(_level), messages(_messages), SentHeader(false)
XOPListCallback(CommandSource &_source, const Anope::string &numlist, int _level, LanguageString *_messages) : NumberList(numlist, false), source(_source), level(_level), messages(_messages), SentHeader(false)
{
}
void HandleNumber(unsigned Number)
{
if (!Number || Number > ci->GetAccessCount())
if (!Number || Number > source.ci->GetAccessCount())
return;
ChanAccess *access = ci->GetAccess(Number - 1);
ChanAccess *access = source.ci->GetAccess(Number - 1);
if (level != access->level)
return;
@@ -134,53 +133,52 @@ class XOPListCallback : public NumberList
if (!SentHeader)
{
SentHeader = true;
u->SendMessage(ChanServ, messages[XOP_LIST_HEADER], ci->name.c_str());
source.Reply(messages[XOP_LIST_HEADER], source.ci->name.c_str());
}
DoList(u, ci, access, Number - 1, level, messages);
DoList(source, access, Number - 1, level, messages);
}
static void DoList(User *u, ChannelInfo *ci, ChanAccess *access, unsigned index, int level, LanguageString *messages)
static void DoList(CommandSource &source, ChanAccess *access, unsigned index, int level, LanguageString *messages)
{
u->SendMessage(ChanServ, CHAN_XOP_LIST_FORMAT, index, access->nc->display.c_str());
source.Reply(CHAN_XOP_LIST_FORMAT, index, access->nc->display.c_str());
}
};
class XOPDelCallback : public NumberList
{
User *u;
ChannelInfo *ci;
CommandSource &source;
Command *c;
LanguageString *messages;
unsigned Deleted;
Anope::string Nicks;
bool override;
public:
XOPDelCallback(User *_u, Command *_c, ChannelInfo *_ci, LanguageString *_messages, bool _override, const Anope::string &numlist) : NumberList(numlist, true), u(_u), ci(_ci), c(_c), messages(_messages), Deleted(0), override(_override)
XOPDelCallback(CommandSource &_source, Command *_c, LanguageString *_messages, bool _override, const Anope::string &numlist) : NumberList(numlist, true), source(_source), c(_c), messages(_messages), Deleted(0), override(_override)
{
}
~XOPDelCallback()
{
if (!Deleted)
u->SendMessage(ChanServ, messages[XOP_NO_MATCH], ci->name.c_str());
source.Reply(messages[XOP_NO_MATCH], source.ci->name.c_str());
else
{
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, c, ci) << "deleted access of users " << Nicks;
Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, c, source.ci) << "deleted access of users " << Nicks;
if (Deleted == 1)
u->SendMessage(ChanServ, messages[XOP_DELETED_ONE], ci->name.c_str());
source.Reply(messages[XOP_DELETED_ONE], source.ci->name.c_str());
else
u->SendMessage(ChanServ, messages[XOP_DELETED_SEVERAL], Deleted, ci->name.c_str());
source.Reply(messages[XOP_DELETED_SEVERAL], Deleted, source.ci->name.c_str());
}
}
void HandleNumber(unsigned Number)
{
if (!Number || Number > ci->GetAccessCount())
if (!Number || Number > source.ci->GetAccessCount())
return;
ChanAccess *access = ci->GetAccess(Number - 1);
ChanAccess *access = source.ci->GetAccess(Number - 1);
++Deleted;
if (!Nicks.empty())
@@ -188,18 +186,21 @@ class XOPDelCallback : public NumberList
else
Nicks = access->nc->display;
FOREACH_MOD(I_OnAccessDel, OnAccessDel(ci, u, access->nc));
FOREACH_MOD(I_OnAccessDel, OnAccessDel(source.ci, source.u, access->nc));
ci->EraseAccess(Number - 1);
source.ci->EraseAccess(Number - 1);
}
};
class XOPBase : public Command
{
private:
CommandReturn DoAdd(User *u, const std::vector<Anope::string> &params, ChannelInfo *ci, int level, LanguageString *messages)
CommandReturn DoAdd(CommandSource &source, const std::vector<Anope::string> &params, int level, LanguageString *messages)
{
Anope::string nick = params.size() > 2 ? params[2] : "";
User *u = source.u;
ChannelInfo *ci = source.ci;
const Anope::string &nick = params.size() > 2 ? params[2] : "";
ChanAccess *access;
int change = 0;
@@ -211,7 +212,7 @@ class XOPBase : public Command
if (readonly)
{
u->SendMessage(ChanServ, messages[XOP_DISABLED]);
source.Reply(messages[XOP_DISABLED]);
return MOD_CONT;
}
@@ -219,19 +220,19 @@ class XOPBase : public Command
if ((level >= ulev || ulev < ACCESS_AOP) && !u->Account()->HasPriv("chanserv/access/modify"))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
NickAlias *na = findnick(nick);
if (!na)
{
u->SendMessage(ChanServ, messages[XOP_NICKS_ONLY]);
source.Reply(messages[XOP_NICKS_ONLY]);
return MOD_CONT;
}
else if (na->HasFlag(NS_FORBIDDEN))
{
u->SendMessage(ChanServ, NICK_X_FORBIDDEN, na->nick.c_str());
source.Reply(NICK_X_FORBIDDEN, na->nick.c_str());
return MOD_CONT;
}
@@ -244,7 +245,7 @@ class XOPBase : public Command
**/
if (access->level >= ulev && !u->Account()->HasPriv("chanserv/access/modify"))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
++change;
@@ -252,7 +253,7 @@ class XOPBase : public Command
if (!change && ci->GetAccessCount() >= Config->CSAccessMax)
{
u->SendMessage(ChanServ, CHAN_XOP_REACHED_LIMIT, Config->CSAccessMax);
source.Reply(CHAN_XOP_REACHED_LIMIT, Config->CSAccessMax);
return MOD_CONT;
}
@@ -271,20 +272,23 @@ class XOPBase : public Command
if (!change)
{
FOREACH_MOD(I_OnAccessAdd, OnAccessAdd(ci, u, nc, level));
u->SendMessage(ChanServ, messages[XOP_ADDED], nc->display.c_str(), ci->name.c_str());
source.Reply(messages[XOP_ADDED], nc->display.c_str(), ci->name.c_str());
}
else
{
FOREACH_MOD(I_OnAccessChange, OnAccessChange(ci, u, na->nc, level));
u->SendMessage(ChanServ, messages[XOP_MOVED], nc->display.c_str(), ci->name.c_str());
source.Reply(messages[XOP_MOVED], nc->display.c_str(), ci->name.c_str());
}
return MOD_CONT;
}
CommandReturn DoDel(User *u, const std::vector<Anope::string> &params, ChannelInfo *ci, int level, LanguageString *messages)
CommandReturn DoDel(CommandSource &source, const std::vector<Anope::string> &params, int level, LanguageString *messages)
{
Anope::string nick = params.size() > 2 ? params[2] : "";
User *u = source.u;
ChannelInfo *ci = source.ci;
const Anope::string &nick = params.size() > 2 ? params[2] : "";
ChanAccess *access;
if (nick.empty())
@@ -295,13 +299,13 @@ class XOPBase : public Command
if (readonly)
{
u->SendMessage(ChanServ, messages[XOP_DISABLED]);
source.Reply(messages[XOP_DISABLED]);
return MOD_CONT;
}
if (!ci->GetAccessCount())
{
u->SendMessage(ChanServ, messages[XOP_LIST_EMPTY], ci->name.c_str());
source.Reply(messages[XOP_LIST_EMPTY], ci->name.c_str());
return MOD_CONT;
}
@@ -311,7 +315,7 @@ class XOPBase : public Command
na = findnick(nick);
if (!na)
{
u->SendMessage(ChanServ, NICK_X_NOT_REGISTERED, nick.c_str());
source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
return MOD_CONT;
}
}
@@ -320,7 +324,7 @@ class XOPBase : public Command
if ((!na || na->nc != u->Account()) && (level >= ulev || ulev < ACCESS_AOP) && !u->Account()->HasPriv("chanserv/access/modify"))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
@@ -328,7 +332,7 @@ class XOPBase : public Command
if (isdigit(nick[0]) && nick.find_first_not_of("1234567890,-") == Anope::string::npos)
{
bool override = level >= ulev || ulev < ACCESS_AOP;
XOPDelCallback list(u, this, ci, messages, override, nick);
XOPDelCallback list(source, this, messages, override, nick);
list.Process();
}
else
@@ -345,18 +349,18 @@ class XOPBase : public Command
if (i == end)
{
u->SendMessage(ChanServ, messages[XOP_NOT_FOUND], nick.c_str(), ci->name.c_str());
source.Reply(messages[XOP_NOT_FOUND], nick.c_str(), ci->name.c_str());
return MOD_CONT;
}
if (nc != u->Account() && ulev <= access->level && !u->Account()->HasPriv("chanserv/access/modify"))
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else
{
bool override = ulev <= access->level;
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "DEL " << access->nc->display;
u->SendMessage(ChanServ, messages[XOP_DELETED], access->nc->display.c_str(), ci->name.c_str());
source.Reply(messages[XOP_DELETED], access->nc->display.c_str(), ci->name.c_str());
FOREACH_MOD(I_OnAccessDel, OnAccessDel(ci, u, na->nc));
@@ -367,13 +371,16 @@ class XOPBase : public Command
return MOD_CONT;
}
CommandReturn DoList(User *u, const std::vector<Anope::string> &params, ChannelInfo *ci, int level, LanguageString *messages)
CommandReturn DoList(CommandSource &source, const std::vector<Anope::string> &params, int level, LanguageString *messages)
{
Anope::string nick = params.size() > 2 ? params[2] : "";
User *u = source.u;
ChannelInfo *ci = source.ci;
const Anope::string &nick = params.size() > 2 ? params[2] : "";
if (!get_access(u, ci) && !u->Account()->HasCommand("chanserv/access/list"))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
@@ -382,13 +389,13 @@ class XOPBase : public Command
if (!ci->GetAccessCount())
{
u->SendMessage(ChanServ, messages[XOP_LIST_EMPTY], ci->name.c_str());
source.Reply(messages[XOP_LIST_EMPTY], ci->name.c_str());
return MOD_CONT;
}
if (!nick.empty() && nick.find_first_not_of("1234567890,-") == Anope::string::npos)
{
XOPListCallback list(u, ci, nick, level, messages);
XOPListCallback list(source, nick, level, messages);
list.Process();
}
else
@@ -407,36 +414,39 @@ class XOPBase : public Command
if (!SentHeader)
{
SentHeader = true;
u->SendMessage(ChanServ, messages[XOP_LIST_HEADER], ci->name.c_str());
source.Reply(messages[XOP_LIST_HEADER], ci->name.c_str());
}
XOPListCallback::DoList(u, ci, access, i + 1, level, messages);
XOPListCallback::DoList(source, access, i + 1, level, messages);
}
if (!SentHeader)
u->SendMessage(ChanServ, messages[XOP_NO_MATCH], ci->name.c_str());
source.Reply(messages[XOP_NO_MATCH], ci->name.c_str());
}
return MOD_CONT;
}
CommandReturn DoClear(User *u, ChannelInfo *ci, int level, LanguageString *messages)
CommandReturn DoClear(CommandSource &source, int level, LanguageString *messages)
{
User *u = source.u;
ChannelInfo *ci = source.ci;
if (readonly)
{
u->SendMessage(ChanServ, messages[XOP_DISABLED]);
source.Reply(messages[XOP_DISABLED]);
return MOD_CONT;
}
if (!ci->GetAccessCount())
{
u->SendMessage(ChanServ, messages[XOP_LIST_EMPTY], ci->name.c_str());
source.Reply(messages[XOP_LIST_EMPTY], ci->name.c_str());
return MOD_CONT;
}
if (!check_access(u, ci, CA_FOUNDER) && !u->Account()->HasPriv("chanserv/access/modify"))
{
u->SendMessage(ChanServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
@@ -457,25 +467,26 @@ class XOPBase : public Command
return MOD_CONT;
}
protected:
CommandReturn DoXop(User *u, const std::vector<Anope::string> &params, int level, LanguageString *messages)
CommandReturn DoXop(CommandSource &source, const std::vector<Anope::string> &params, int level, LanguageString *messages)
{
Anope::string chan = params[0];
Anope::string cmd = params[1];
User *u = source.u;
ChannelInfo *ci = source.ci;
ChannelInfo *ci = cs_findchan(chan);
const Anope::string &cmd = params[1];
if (!ci->HasFlag(CI_XOP))
u->SendMessage(ChanServ, CHAN_XOP_ACCESS, Config->s_ChanServ.c_str());
source.Reply(CHAN_XOP_ACCESS, Config->s_ChanServ.c_str());
else if (cmd.equals_ci("ADD"))
return this->DoAdd(u, params, ci, level, messages);
return this->DoAdd(source, params, level, messages);
else if (cmd.equals_ci("DEL"))
return this->DoDel(u, params, ci, level, messages);
return this->DoDel(source, params, level, messages);
else if (cmd.equals_ci("LIST"))
return this->DoList(u, params, ci, level, messages);
return this->DoList(source, params, level, messages);
else if (cmd.equals_ci("CLEAR"))
return this->DoClear(u, ci, level, messages);
return this->DoClear(source, level, messages);
else
this->OnSyntaxError(u, "");
return MOD_CONT;
}
public:
@@ -487,7 +498,7 @@ class XOPBase : public Command
{
}
virtual CommandReturn Execute(User *u, const std::vector<Anope::string> &params) = 0;
virtual CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params) = 0;
virtual bool OnHelp(User *u, const Anope::string &subcommand) = 0;
@@ -503,9 +514,9 @@ class CommandCSQOP : public XOPBase
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
return this->DoXop(u, params, ACCESS_QOP, xop_msgs[XOP_QOP]);
return this->DoXop(source, params, ACCESS_QOP, xop_msgs[XOP_QOP]);
}
bool OnHelp(User *u, const Anope::string &subcommand)
@@ -532,9 +543,9 @@ class CommandCSAOP : public XOPBase
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
return this->DoXop(u, params, ACCESS_AOP, xop_msgs[XOP_AOP]);
return this->DoXop(source, params, ACCESS_AOP, xop_msgs[XOP_AOP]);
}
bool OnHelp(User *u, const Anope::string &subcommand)
@@ -561,9 +572,9 @@ class CommandCSHOP : public XOPBase
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
return this->DoXop(u, params, ACCESS_HOP, xop_msgs[XOP_HOP]);
return this->DoXop(source, params, ACCESS_HOP, xop_msgs[XOP_HOP]);
}
bool OnHelp(User *u, const Anope::string &subcommand)
@@ -590,9 +601,9 @@ class CommandCSSOP : public XOPBase
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
return this->DoXop(u, params, ACCESS_SOP, xop_msgs[XOP_SOP]);
return this->DoXop(source, params, ACCESS_SOP, xop_msgs[XOP_SOP]);
}
bool OnHelp(User *u, const Anope::string &subcommand)
@@ -619,9 +630,9 @@ class CommandCSVOP : public XOPBase
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
return this->DoXop(u, params, ACCESS_VOP, xop_msgs[XOP_VOP]);
return this->DoXop(source, params, ACCESS_VOP, xop_msgs[XOP_VOP]);
}
bool OnHelp(User *u, const Anope::string &subcommand)
+9 -7
View File
@@ -20,24 +20,26 @@ class CommandHSDel : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
NickAlias *na;
Anope::string nick = params[0];
if ((na = findnick(nick)))
User *u = source.u;
const Anope::string &nick = params[0];
NickAlias *na = findnick(nick);
if (na)
{
if (na->HasFlag(NS_FORBIDDEN))
{
u->SendMessage(HostServ, NICK_X_FORBIDDEN, nick.c_str());
source.Reply(NICK_X_FORBIDDEN, nick.c_str());
return MOD_CONT;
}
Log(LOG_ADMIN, u, this) << "for user " << na->nick;
FOREACH_MOD(I_OnDeleteVhost, OnDeleteVhost(na));
na->hostinfo.RemoveVhost();
u->SendMessage(HostServ, HOST_DEL, nick.c_str());
source.Reply(HOST_DEL, nick.c_str());
}
else
u->SendMessage(HostServ, HOST_NOREG, nick.c_str());
source.Reply(HOST_NOREG, nick.c_str());
return MOD_CONT;
}
+9 -7
View File
@@ -20,15 +20,16 @@ class CommandHSDelAll : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params[0];
NickAlias *na;
if ((na = findnick(nick)))
const Anope::string &nick = params[0];
User *u = source.u;
NickAlias *na = findnick(nick);
if (na)
{
if (na->HasFlag(NS_FORBIDDEN))
{
u->SendMessage(HostServ, NICK_X_FORBIDDEN, nick.c_str());
source.Reply(NICK_X_FORBIDDEN, nick.c_str());
return MOD_CONT;
}
FOREACH_MOD(I_OnDeleteVhost, OnDeleteVhost(na));
@@ -39,10 +40,11 @@ class CommandHSDelAll : public Command
na->hostinfo.RemoveVhost();
}
Log(LOG_ADMIN, u, this) << "for all nicks in group " << nc->display;
u->SendMessage(HostServ, HOST_DELALL, nc->display.c_str());
source.Reply(HOST_DELALL, nc->display.c_str());
}
else
u->SendMessage(HostServ, HOST_NOREG, nick.c_str());
source.Reply(HOST_NOREG, nick.c_str());
return MOD_CONT;
}
+5 -4
View File
@@ -20,19 +20,20 @@ class CommandHSGroup : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
NickAlias *na = findnick(u->nick);
if (na && u->Account() == na->nc && na->hostinfo.HasVhost())
{
HostServSyncVhosts(na);
if (!na->hostinfo.GetIdent().empty())
u->SendMessage(HostServ, HOST_IDENT_GROUP, u->Account()->display.c_str(), na->hostinfo.GetIdent().c_str(), na->hostinfo.GetHost().c_str());
source.Reply(HOST_IDENT_GROUP, u->Account()->display.c_str(), na->hostinfo.GetIdent().c_str(), na->hostinfo.GetHost().c_str());
else
u->SendMessage(HostServ, HOST_GROUP, u->Account()->display.c_str(), na->hostinfo.GetHost().c_str());
source.Reply(HOST_GROUP, u->Account()->display.c_str(), na->hostinfo.GetHost().c_str());
}
else
u->SendMessage(HostServ, HOST_NOT_ASSIGNED);
source.Reply(HOST_NOT_ASSIGNED);
return MOD_CONT;
}
+2 -2
View File
@@ -21,9 +21,9 @@ class CommandHSHelp : public Command
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
mod_help_cmd(HostServ, u, params[0]);
mod_help_cmd(HostServ, source.u, params[0]);
return MOD_CONT;
}
+13 -11
View File
@@ -20,9 +20,11 @@ class CommandHSList : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string key = !params.empty() ? params[0] : "";
User *u = source.u;
const Anope::string &key = !params.empty() ? params[0] : "";
int from = 0, to = 0, counter = 1;
unsigned display_counter = 0;
@@ -35,14 +37,14 @@ class CommandHSList : public Command
size_t tmp = key.find('-');
if (tmp == Anope::string::npos || tmp == key.length() || tmp == 1)
{
u->SendMessage(HostServ, LIST_INCORRECT_RANGE);
source.Reply(LIST_INCORRECT_RANGE);
return MOD_CONT;
}
for (unsigned i = 1, end = key.length(); i < end; ++i)
{
if (!isdigit(key[i]) && i != tmp)
{
u->SendMessage(HostServ, LIST_INCORRECT_RANGE);
source.Reply(LIST_INCORRECT_RANGE);
return MOD_CONT;
}
from = convertTo<int>(key.substr(1, tmp - 1));
@@ -63,9 +65,9 @@ class CommandHSList : public Command
{
++display_counter;
if (!na->hostinfo.GetIdent().empty())
u->SendMessage(HostServ, HOST_IDENT_ENTRY, counter, na->nick.c_str(), na->hostinfo.GetIdent().c_str(), na->hostinfo.GetHost().c_str(), na->hostinfo.GetCreator().c_str(), do_strftime(na->hostinfo.GetTime()).c_str());
source.Reply(HOST_IDENT_ENTRY, counter, na->nick.c_str(), na->hostinfo.GetIdent().c_str(), na->hostinfo.GetHost().c_str(), na->hostinfo.GetCreator().c_str(), do_strftime(na->hostinfo.GetTime()).c_str());
else
u->SendMessage(HostServ, HOST_ENTRY, counter, na->nick.c_str(), na->hostinfo.GetHost().c_str(), na->hostinfo.GetCreator().c_str(), do_strftime(na->hostinfo.GetTime()).c_str());
source.Reply(HOST_ENTRY, counter, na->nick.c_str(), na->hostinfo.GetHost().c_str(), na->hostinfo.GetCreator().c_str(), do_strftime(na->hostinfo.GetTime()).c_str());
}
}
else
@@ -78,21 +80,21 @@ class CommandHSList : public Command
{
++display_counter;
if (!na->hostinfo.GetIdent().empty())
u->SendMessage(HostServ, HOST_IDENT_ENTRY, counter, na->nick.c_str(), na->hostinfo.GetIdent().c_str(), na->hostinfo.GetHost().c_str(), na->hostinfo.GetCreator().c_str(), do_strftime(na->hostinfo.GetTime()).c_str());
source.Reply(HOST_IDENT_ENTRY, counter, na->nick.c_str(), na->hostinfo.GetIdent().c_str(), na->hostinfo.GetHost().c_str(), na->hostinfo.GetCreator().c_str(), do_strftime(na->hostinfo.GetTime()).c_str());
else
u->SendMessage(HostServ, HOST_ENTRY, counter, na->nick.c_str(), na->hostinfo.GetHost().c_str(), na->hostinfo.GetCreator().c_str(), do_strftime(na->hostinfo.GetTime()).c_str());
source.Reply(HOST_ENTRY, counter, na->nick.c_str(), na->hostinfo.GetHost().c_str(), na->hostinfo.GetCreator().c_str(), do_strftime(na->hostinfo.GetTime()).c_str());
}
}
++counter;
}
if (!key.empty())
u->SendMessage(HostServ, HOST_LIST_KEY_FOOTER, key.c_str(), display_counter);
source.Reply(HOST_LIST_KEY_FOOTER, key.c_str(), display_counter);
else
{
if (from)
u->SendMessage(HostServ, HOST_LIST_RANGE_FOOTER, from, to);
source.Reply(HOST_LIST_RANGE_FOOTER, from, to);
else
u->SendMessage(HostServ, HOST_LIST_FOOTER, display_counter);
source.Reply(HOST_LIST_FOOTER, display_counter);
}
return MOD_CONT;
}
+4 -3
View File
@@ -20,17 +20,18 @@ class CommandHSOff : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
NickAlias *na = findnick(u->nick);
if (!na || !na->hostinfo.HasVhost())
u->SendMessage(HostServ, HOST_NOT_ASSIGNED);
source.Reply(HOST_NOT_ASSIGNED);
else
{
ircdproto->SendVhostDel(u);
Log(LOG_COMMAND, u, this) << "to disable their vhost";
u->SendMessage(HostServ, HOST_OFF);
source.Reply(HOST_OFF);
}
return MOD_CONT;
+5 -4
View File
@@ -20,15 +20,16 @@ class CommandHSOn : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
NickAlias *na = findnick(u->nick);
if (na && u->Account() == na->nc && na->hostinfo.HasVhost())
{
if (!na->hostinfo.GetIdent().empty())
u->SendMessage(HostServ, HOST_IDENT_ACTIVATED, na->hostinfo.GetIdent().c_str(), na->hostinfo.GetHost().c_str());
source.Reply(HOST_IDENT_ACTIVATED, na->hostinfo.GetIdent().c_str(), na->hostinfo.GetHost().c_str());
else
u->SendMessage(HostServ, HOST_ACTIVATED, na->hostinfo.GetHost().c_str());
source.Reply(HOST_ACTIVATED, na->hostinfo.GetHost().c_str());
Log(LOG_COMMAND, u, this) << "to enable their vhost of " << (!na->hostinfo.GetIdent().empty() ? na->hostinfo.GetIdent() + "@" : "") << na->hostinfo.GetHost();
ircdproto->SendVhost(u, na->hostinfo.GetIdent(), na->hostinfo.GetHost());
if (ircd->vhost)
@@ -41,7 +42,7 @@ class CommandHSOn : public Command
u->UpdateHost();
}
else
u->SendMessage(HostServ, HOST_NOT_ASSIGNED);
source.Reply(HOST_NOT_ASSIGNED);
return MOD_CONT;
}
+14 -16
View File
@@ -20,27 +20,26 @@ class CommandHSSet : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
Anope::string nick = params[0];
Anope::string rawhostmask = params[1];
Anope::string hostmask;
NickAlias *na;
int32 tmp_time;
Anope::string vIdent = myStrGetToken(rawhostmask, '@', 0); /* Get the first substring, @ as delimiter */
if (!vIdent.empty())
{
rawhostmask = myStrGetTokenRemainder(rawhostmask, '@', 1); /* get the remaining string */
if (rawhostmask.empty())
{
u->SendMessage(HostServ, HOST_SET_SYNTAX, Config->s_HostServ.c_str());
source.Reply(HOST_SET_SYNTAX, Config->s_HostServ.c_str());
return MOD_CONT;
}
if (vIdent.length() > Config->UserLen)
{
u->SendMessage(HostServ, HOST_SET_IDENTTOOLONG, Config->UserLen);
source.Reply(HOST_SET_IDENTTOOLONG, Config->UserLen);
return MOD_CONT;
}
else
@@ -48,13 +47,13 @@ class CommandHSSet : public Command
for (Anope::string::iterator s = vIdent.begin(), s_end = vIdent.end(); s != s_end; ++s)
if (!isvalidchar(*s))
{
u->SendMessage(HostServ, HOST_SET_IDENT_ERROR);
source.Reply(HOST_SET_IDENT_ERROR);
return MOD_CONT;
}
}
if (!ircd->vident)
{
u->SendMessage(HostServ, HOST_NO_VIDENT);
source.Reply(HOST_NO_VIDENT);
return MOD_CONT;
}
}
@@ -62,23 +61,22 @@ class CommandHSSet : public Command
hostmask = rawhostmask;
else
{
u->SendMessage(HostServ, HOST_SET_TOOLONG, Config->HostLen);
source.Reply(HOST_SET_TOOLONG, Config->HostLen);
return MOD_CONT;
}
if (!isValidHost(hostmask, 3))
{
u->SendMessage(HostServ, HOST_SET_ERROR);
source.Reply(HOST_SET_ERROR);
return MOD_CONT;
}
tmp_time = Anope::CurTime;
NickAlias *na = findnick(nick);
if ((na = findnick(nick)))
{
if (na->HasFlag(NS_FORBIDDEN))
{
u->SendMessage(HostServ, NICK_X_FORBIDDEN, nick.c_str());
source.Reply(NICK_X_FORBIDDEN, nick.c_str());
return MOD_CONT;
}
@@ -87,12 +85,12 @@ class CommandHSSet : public Command
na->hostinfo.SetVhost(vIdent, hostmask, u->nick);
FOREACH_MOD(I_OnSetVhost, OnSetVhost(na));
if (!vIdent.empty())
u->SendMessage(HostServ, HOST_IDENT_SET, nick.c_str(), vIdent.c_str(), hostmask.c_str());
source.Reply(HOST_IDENT_SET, nick.c_str(), vIdent.c_str(), hostmask.c_str());
else
u->SendMessage(HostServ, HOST_SET, nick.c_str(), hostmask.c_str());
source.Reply(HOST_SET, nick.c_str(), hostmask.c_str());
}
else
u->SendMessage(HostServ, HOST_NOREG, nick.c_str());
source.Reply(HOST_NOREG, nick.c_str());
return MOD_CONT;
}
+17 -15
View File
@@ -20,23 +20,24 @@ class CommandHSSetAll : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params[0];
User *u = source.u;
const Anope::string &nick = params[0];
Anope::string rawhostmask = params[1];
Anope::string hostmask;
NickAlias *na;
int32 tmp_time;
if (!(na = findnick(nick)))
NickAlias *na = findnick(nick);
if (!na)
{
u->SendMessage(HostServ, HOST_NOREG, nick.c_str());
source.Reply(HOST_NOREG, nick.c_str());
return MOD_CONT;
}
else if (na->HasFlag(NS_FORBIDDEN))
{
u->SendMessage(HostServ, NICK_X_FORBIDDEN, nick.c_str());
source.Reply(NICK_X_FORBIDDEN, nick.c_str());
return MOD_CONT;
}
@@ -46,12 +47,12 @@ class CommandHSSetAll : public Command
rawhostmask = myStrGetTokenRemainder(rawhostmask, '@', 1); /* get the remaining string */
if (rawhostmask.empty())
{
u->SendMessage(HostServ, HOST_SETALL_SYNTAX, Config->s_HostServ.c_str());
source.Reply(HOST_SETALL_SYNTAX, Config->s_HostServ.c_str());
return MOD_CONT;
}
if (vIdent.length() > Config->UserLen)
{
u->SendMessage(HostServ, HOST_SET_IDENTTOOLONG, Config->UserLen);
source.Reply(HOST_SET_IDENTTOOLONG, Config->UserLen);
return MOD_CONT;
}
else
@@ -59,28 +60,29 @@ class CommandHSSetAll : public Command
for (Anope::string::iterator s = vIdent.begin(), s_end = vIdent.end(); s != s_end; ++s)
if (!isvalidchar(*s))
{
u->SendMessage(HostServ, HOST_SET_IDENT_ERROR);
source.Reply(HOST_SET_IDENT_ERROR);
return MOD_CONT;
}
}
if (!ircd->vident)
{
u->SendMessage(HostServ, HOST_NO_VIDENT);
source.Reply(HOST_NO_VIDENT);
return MOD_CONT;
}
}
Anope::string hostmask;
if (rawhostmask.length() < Config->HostLen)
hostmask = rawhostmask;
else
{
u->SendMessage(HostServ, HOST_SET_TOOLONG, Config->HostLen);
source.Reply(HOST_SET_TOOLONG, Config->HostLen);
return MOD_CONT;
}
if (!isValidHost(hostmask, 3))
{
u->SendMessage(HostServ, HOST_SET_ERROR);
source.Reply(HOST_SET_ERROR);
return MOD_CONT;
}
@@ -92,9 +94,9 @@ class CommandHSSetAll : public Command
HostServSyncVhosts(na);
FOREACH_MOD(I_OnSetVhost, OnSetVhost(na));
if (!vIdent.empty())
u->SendMessage(HostServ, HOST_IDENT_SETALL, nick.c_str(), vIdent.c_str(), hostmask.c_str());
source.Reply(HOST_IDENT_SETALL, nick.c_str(), vIdent.c_str(), hostmask.c_str());
else
u->SendMessage(HostServ, HOST_SETALL, nick.c_str(), hostmask.c_str());
source.Reply(HOST_SETALL, nick.c_str(), hostmask.c_str());
return MOD_CONT;
}
+10 -9
View File
@@ -22,33 +22,34 @@ class CommandMSCancel : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
const Anope::string &nname = params[0];
bool ischan, isforbid;
Anope::string nname = params[0];
MemoInfo *mi;
if (!(mi = getmemoinfo(nname, ischan, isforbid)))
{
if (isforbid)
u->SendMessage(MemoServ, ischan ? CHAN_X_FORBIDDEN : NICK_X_FORBIDDEN, nname.c_str());
source.Reply(ischan ? CHAN_X_FORBIDDEN : NICK_X_FORBIDDEN, nname.c_str());
else
u->SendMessage(MemoServ, ischan ? CHAN_X_NOT_REGISTERED : NICK_X_NOT_REGISTERED, nname.c_str());
source.Reply(ischan ? CHAN_X_NOT_REGISTERED : NICK_X_NOT_REGISTERED, nname.c_str());
}
else
{
int i;
for (i = mi->memos.size() - 1; i >= 0; --i)
for (int i = mi->memos.size() - 1; i >= 0; --i)
if (mi->memos[i]->HasFlag(MF_UNREAD) && u->Account()->display.equals_ci(mi->memos[i]->sender) && !mi->memos[i]->HasFlag(MF_NOTIFYS))
{
FOREACH_MOD(I_OnMemoDel, OnMemoDel(findnick(nname)->nc, mi, mi->memos[i]));
mi->Del(mi->memos[i]);
u->SendMessage(MemoServ, MEMO_CANCELLED, nname.c_str());
source.Reply(MEMO_CANCELLED, nname.c_str());
return MOD_CONT;
}
u->SendMessage(MemoServ, MEMO_CANCEL_NONE);
source.Reply(MEMO_CANCEL_NONE);
}
return MOD_CONT;
}
+16 -14
View File
@@ -20,46 +20,48 @@ class CommandMSCheck : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
NickAlias *na = NULL;
MemoInfo *mi = NULL;
int i, found = 0;
Anope::string recipient = params[0];
User *u = source.u;
if (!(na = findnick(recipient)))
const Anope::string &recipient = params[0];
bool found = false;
NickAlias *na = findnick(recipient);
if (!na)
{
u->SendMessage(MemoServ, NICK_X_NOT_REGISTERED, recipient.c_str());
source.Reply(NICK_X_NOT_REGISTERED, recipient.c_str());
return MOD_CONT;
}
if (na->HasFlag(NS_FORBIDDEN))
{
u->SendMessage(MemoServ, NICK_X_FORBIDDEN, recipient.c_str());
source.Reply(NICK_X_FORBIDDEN, recipient.c_str());
return MOD_CONT;
}
mi = &na->nc->memos;
MemoInfo *mi = &na->nc->memos;
/* Okay, I know this looks strange but we wanna get the LAST memo, so we
have to loop backwards */
for (i = mi->memos.size() - 1; i >= 0; --i)
for (int i = mi->memos.size() - 1; i >= 0; --i)
{
if (u->Account()->display.equals_ci(mi->memos[i]->sender))
{
found = 1; /* Yes, we've found the memo */
found = true; /* Yes, we've found the memo */
if (mi->memos[i]->HasFlag(MF_UNREAD))
u->SendMessage(MemoServ, MEMO_CHECK_NOT_READ, na->nick.c_str(), do_strftime(mi->memos[i]->time).c_str());
source.Reply(MEMO_CHECK_NOT_READ, na->nick.c_str(), do_strftime(mi->memos[i]->time).c_str());
else
u->SendMessage(MemoServ, MEMO_CHECK_READ, na->nick.c_str(), do_strftime(mi->memos[i]->time).c_str());
source.Reply(MEMO_CHECK_READ, na->nick.c_str(), do_strftime(mi->memos[i]->time).c_str());
break;
}
}
if (!found)
u->SendMessage(MemoServ, MEMO_CHECK_NO_MEMO, na->nick.c_str());
source.Reply(MEMO_CHECK_NO_MEMO, na->nick.c_str());
return MOD_CONT;
}
+17 -16
View File
@@ -15,11 +15,11 @@
class MemoDelCallback : public NumberList
{
User *u;
CommandSource &source;
ChannelInfo *ci;
MemoInfo *mi;
public:
MemoDelCallback(User *_u, ChannelInfo *_ci, MemoInfo *_mi, const Anope::string &list) : NumberList(list, true), u(_u), ci(_ci), mi(_mi)
MemoDelCallback(CommandSource &_source, ChannelInfo *_ci, MemoInfo *_mi, const Anope::string &list) : NumberList(list, true), source(_source), ci(_ci), mi(_mi)
{
}
@@ -31,10 +31,10 @@ class MemoDelCallback : public NumberList
if (ci)
FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->memos[Number - 1]));
else
FOREACH_MOD(I_OnMemoDel, OnMemoDel(u->Account(), mi, mi->memos[Number - 1]));
FOREACH_MOD(I_OnMemoDel, OnMemoDel(source.u->Account(), mi, mi->memos[Number - 1]));
mi->Del(Number - 1);
u->SendMessage(MemoServ, MEMO_DELETED_ONE, Number);
source.Reply(MEMO_DELETED_ONE, Number);
}
};
@@ -45,12 +45,13 @@ class CommandMSDel : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
MemoInfo *mi;
ChannelInfo *ci = NULL;
Anope::string numstr = !params.empty() ? params[0] : "", chan;
unsigned i, end;
if (!numstr.empty() && numstr[0] == '#')
{
@@ -59,17 +60,17 @@ class CommandMSDel : public Command
if (!(ci = cs_findchan(chan)))
{
u->SendMessage(MemoServ, CHAN_X_NOT_REGISTERED, chan.c_str());
source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
return MOD_CONT;
}
else if (readonly)
{
u->SendMessage(MemoServ, READ_ONLY_MODE);
source.Reply(READ_ONLY_MODE);
return MOD_CONT;
}
else if (!check_access(u, ci, CA_MEMO))
{
u->SendMessage(MemoServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
mi = &ci->memos;
@@ -81,15 +82,15 @@ class CommandMSDel : public Command
else if (mi->memos.empty())
{
if (!chan.empty())
u->SendMessage(MemoServ, MEMO_X_HAS_NO_MEMOS, chan.c_str());
source.Reply(MEMO_X_HAS_NO_MEMOS, chan.c_str());
else
u->SendMessage(MemoServ, MEMO_HAVE_NO_MEMOS);
source.Reply(MEMO_HAVE_NO_MEMOS);
}
else
{
if (isdigit(numstr[0]))
{
MemoDelCallback list(u, ci, mi, numstr);
MemoDelCallback list(source, ci, mi, numstr);
list.Process();
}
else if (numstr.equals_ci("LAST"))
@@ -100,7 +101,7 @@ class CommandMSDel : public Command
else
FOREACH_MOD(I_OnMemoDel, OnMemoDel(u->Account(), mi, mi->memos[mi->memos.size() - 1]));
mi->Del(mi->memos[mi->memos.size() - 1]);
u->SendMessage(MemoServ, MEMO_DELETED_ONE, mi->memos.size() + 1);
source.Reply(MEMO_DELETED_ONE, mi->memos.size() + 1);
}
else
{
@@ -109,13 +110,13 @@ class CommandMSDel : public Command
else
FOREACH_MOD(I_OnMemoDel, OnMemoDel(u->Account(), mi, NULL));
/* Delete all memos. */
for (i = 0, end = mi->memos.size(); i < end; ++i)
for (unsigned i = 0, end = mi->memos.size(); i < end; ++i)
delete mi->memos[i];
mi->memos.clear();
if (!chan.empty())
u->SendMessage(MemoServ, MEMO_CHAN_DELETED_ALL, chan.c_str());
source.Reply(MEMO_CHAN_DELETED_ALL, chan.c_str());
else
u->SendMessage(MemoServ, MEMO_DELETED_ALL);
source.Reply(MEMO_DELETED_ALL);
}
}
return MOD_CONT;
+2 -2
View File
@@ -21,9 +21,9 @@ class CommandMSHelp : public Command
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
mod_help_cmd(MemoServ, u, params[0]);
mod_help_cmd(MemoServ, source.u, params[0]);
return MOD_CONT;
}
+13 -11
View File
@@ -20,8 +20,10 @@ class CommandMSIgnore : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
Anope::string channel = params[0];
Anope::string command = (params.size() > 1 ? params[1] : "");
Anope::string param = (params.size() > 2 ? params[2] : "");
@@ -38,21 +40,21 @@ class CommandMSIgnore : public Command
if (!mi)
{
if (isforbid)
u->SendMessage(MemoServ, ischan ? CHAN_X_FORBIDDEN : NICK_X_FORBIDDEN, channel.c_str());
source.Reply(ischan ? CHAN_X_FORBIDDEN : NICK_X_FORBIDDEN, channel.c_str());
else
u->SendMessage(MemoServ, ischan ? CHAN_X_NOT_REGISTERED : NICK_X_NOT_REGISTERED, channel.c_str());
source.Reply(ischan ? CHAN_X_NOT_REGISTERED : NICK_X_NOT_REGISTERED, channel.c_str());
}
else if (ischan && !check_access(u, cs_findchan(channel), CA_MEMO))
u->SendMessage(MemoServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else if (command.equals_ci("ADD") && !param.empty())
{
if (std::find(mi->ignores.begin(), mi->ignores.end(), param.ci_str()) == mi->ignores.end())
{
mi->ignores.push_back(param.ci_str());
u->SendMessage(MemoServ, MEMO_IGNORE_ADD, param.c_str());
source.Reply(MEMO_IGNORE_ADD, param.c_str());
}
else
u->SendMessage(MemoServ, MEMO_IGNORE_ALREADY_IGNORED, param.c_str());
source.Reply(MEMO_IGNORE_ALREADY_IGNORED, param.c_str());
}
else if (command.equals_ci("DEL") && !param.empty())
{
@@ -61,20 +63,20 @@ class CommandMSIgnore : public Command
if (it != mi->ignores.end())
{
mi->ignores.erase(it);
u->SendMessage(MemoServ, MEMO_IGNORE_DEL, param.c_str());
source.Reply(MEMO_IGNORE_DEL, param.c_str());
}
else
u->SendMessage(MemoServ, MEMO_IGNORE_NOT_IGNORED, param.c_str());
source.Reply(MEMO_IGNORE_NOT_IGNORED, param.c_str());
}
else if (command.equals_ci("LIST"))
{
if (mi->ignores.empty())
u->SendMessage(MemoServ, MEMO_IGNORE_LIST_EMPTY);
source.Reply(MEMO_IGNORE_LIST_EMPTY);
else
{
u->SendMessage(MemoServ, MEMO_IGNORE_LIST_HEADER);
source.Reply(MEMO_IGNORE_LIST_HEADER);
for (unsigned i = 0; i < mi->ignores.size(); ++i)
u->SendMessage(Config->s_MemoServ, " %s", mi->ignores[i].c_str());
source.Reply(" %s", mi->ignores[i].c_str());
}
}
else
+41 -39
View File
@@ -20,12 +20,14 @@ class CommandMSInfo : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
const MemoInfo *mi;
NickAlias *na = NULL;
ChannelInfo *ci = NULL;
Anope::string nname = !params.empty() ? params[0] : "";
const Anope::string &nname = !params.empty() ? params[0] : "";
int hardmax = 0;
if (!nname.empty() && nname[0] != '#' && u->Account()->HasPriv("memoserv/info"))
@@ -33,12 +35,12 @@ class CommandMSInfo : public Command
na = findnick(nname);
if (!na)
{
u->SendMessage(MemoServ, NICK_X_NOT_REGISTERED, nname.c_str());
source.Reply(NICK_X_NOT_REGISTERED, nname.c_str());
return MOD_CONT;
}
else if (na->HasFlag(NS_FORBIDDEN))
{
u->SendMessage(MemoServ, NICK_X_FORBIDDEN, nname.c_str());
source.Reply(NICK_X_FORBIDDEN, nname.c_str());
return MOD_CONT;
}
mi = &na->nc->memos;
@@ -48,12 +50,12 @@ class CommandMSInfo : public Command
{
if (!(ci = cs_findchan(nname)))
{
u->SendMessage(MemoServ, CHAN_X_NOT_REGISTERED, nname.c_str());
source.Reply(CHAN_X_NOT_REGISTERED, nname.c_str());
return MOD_CONT;
}
else if (!check_access(u, ci, CA_MEMO))
{
u->SendMessage(MemoServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
mi = &ci->memos;
@@ -61,7 +63,7 @@ class CommandMSInfo : public Command
}
else if (!nname.empty()) /* It's not a chan and we aren't services admin */
{
u->SendMessage(MemoServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
else
@@ -73,13 +75,13 @@ class CommandMSInfo : public Command
if (!nname.empty() && (ci || na->nc != u->Account()))
{
if (mi->memos.empty())
u->SendMessage(MemoServ, MEMO_INFO_X_NO_MEMOS, nname.c_str());
source.Reply(MEMO_INFO_X_NO_MEMOS, nname.c_str());
else if (mi->memos.size() == 1)
{
if (mi->memos[0]->HasFlag(MF_UNREAD))
u->SendMessage(MemoServ, MEMO_INFO_X_MEMO_UNREAD, nname.c_str());
source.Reply(MEMO_INFO_X_MEMO_UNREAD, nname.c_str());
else
u->SendMessage(MemoServ, MEMO_INFO_X_MEMO, nname.c_str());
source.Reply(MEMO_INFO_X_MEMO, nname.c_str());
}
else
{
@@ -88,55 +90,55 @@ class CommandMSInfo : public Command
if (mi->memos[i]->HasFlag(MF_UNREAD))
++count;
if (count == mi->memos.size())
u->SendMessage(MemoServ, MEMO_INFO_X_MEMOS_ALL_UNREAD, nname.c_str(), count);
source.Reply(MEMO_INFO_X_MEMOS_ALL_UNREAD, nname.c_str(), count);
else if (!count)
u->SendMessage(MemoServ, MEMO_INFO_X_MEMOS, nname.c_str(), mi->memos.size());
source.Reply(MEMO_INFO_X_MEMOS, nname.c_str(), mi->memos.size());
else if (count == 1)
u->SendMessage(MemoServ, MEMO_INFO_X_MEMOS_ONE_UNREAD, nname.c_str(), mi->memos.size());
source.Reply(MEMO_INFO_X_MEMOS_ONE_UNREAD, nname.c_str(), mi->memos.size());
else
u->SendMessage(MemoServ, MEMO_INFO_X_MEMOS_SOME_UNREAD, nname.c_str(), mi->memos.size(), count);
source.Reply(MEMO_INFO_X_MEMOS_SOME_UNREAD, nname.c_str(), mi->memos.size(), count);
}
if (!mi->memomax)
{
if (hardmax)
u->SendMessage(MemoServ, MEMO_INFO_X_HARD_LIMIT, nname.c_str(), mi->memomax);
source.Reply(MEMO_INFO_X_HARD_LIMIT, nname.c_str(), mi->memomax);
else
u->SendMessage(MemoServ, MEMO_INFO_X_LIMIT, nname.c_str(), mi->memomax);
source.Reply(MEMO_INFO_X_LIMIT, nname.c_str(), mi->memomax);
}
else if (mi->memomax > 0)
{
if (hardmax)
u->SendMessage(MemoServ, MEMO_INFO_X_HARD_LIMIT, nname.c_str(), mi->memomax);
source.Reply(MEMO_INFO_X_HARD_LIMIT, nname.c_str(), mi->memomax);
else
u->SendMessage(MemoServ, MEMO_INFO_X_LIMIT, nname.c_str(), mi->memomax);
source.Reply(MEMO_INFO_X_LIMIT, nname.c_str(), mi->memomax);
}
else
u->SendMessage(MemoServ, MEMO_INFO_X_NO_LIMIT, nname.c_str());
source.Reply(MEMO_INFO_X_NO_LIMIT, nname.c_str());
/* I ripped this code out of ircservices 4.4.5, since I didn't want
to rewrite the whole thing (it pisses me off). */
if (na)
{
if (na->nc->HasFlag(NI_MEMO_RECEIVE) && na->nc->HasFlag(NI_MEMO_SIGNON))
u->SendMessage(MemoServ, MEMO_INFO_X_NOTIFY_ON, nname.c_str());
source.Reply(MEMO_INFO_X_NOTIFY_ON, nname.c_str());
else if (na->nc->HasFlag(NI_MEMO_RECEIVE))
u->SendMessage(MemoServ, MEMO_INFO_X_NOTIFY_RECEIVE, nname.c_str());
source.Reply(MEMO_INFO_X_NOTIFY_RECEIVE, nname.c_str());
else if (na->nc->HasFlag(NI_MEMO_SIGNON))
u->SendMessage(MemoServ, MEMO_INFO_X_NOTIFY_SIGNON, nname.c_str());
source.Reply(MEMO_INFO_X_NOTIFY_SIGNON, nname.c_str());
else
u->SendMessage(MemoServ, MEMO_INFO_X_NOTIFY_OFF, nname.c_str());
source.Reply(MEMO_INFO_X_NOTIFY_OFF, nname.c_str());
}
}
else /* !nname || (!ci || na->nc == u->Account()) */
{
if (mi->memos.empty())
u->SendMessage(MemoServ, MEMO_INFO_NO_MEMOS);
source.Reply(MEMO_INFO_NO_MEMOS);
else if (mi->memos.size() == 1)
{
if (mi->memos[0]->HasFlag(MF_UNREAD))
u->SendMessage(MemoServ, MEMO_INFO_MEMO_UNREAD);
source.Reply(MEMO_INFO_MEMO_UNREAD);
else
u->SendMessage(MemoServ, MEMO_INFO_MEMO);
source.Reply(MEMO_INFO_MEMO);
}
else
{
@@ -145,41 +147,41 @@ class CommandMSInfo : public Command
if (mi->memos[i]->HasFlag(MF_UNREAD))
++count;
if (count == mi->memos.size())
u->SendMessage(MemoServ, MEMO_INFO_MEMOS_ALL_UNREAD, count);
source.Reply(MEMO_INFO_MEMOS_ALL_UNREAD, count);
else if (!count)
u->SendMessage(MemoServ, MEMO_INFO_MEMOS, mi->memos.size());
source.Reply(MEMO_INFO_MEMOS, mi->memos.size());
else if (count == 1)
u->SendMessage(MemoServ, MEMO_INFO_MEMOS_ONE_UNREAD, mi->memos.size());
source.Reply(MEMO_INFO_MEMOS_ONE_UNREAD, mi->memos.size());
else
u->SendMessage(MemoServ, MEMO_INFO_MEMOS_SOME_UNREAD, mi->memos.size(), count);
source.Reply(MEMO_INFO_MEMOS_SOME_UNREAD, mi->memos.size(), count);
}
if (!mi->memomax)
{
if (!u->Account()->IsServicesOper() && hardmax)
u->SendMessage(MemoServ, MEMO_INFO_HARD_LIMIT_ZERO);
source.Reply(MEMO_INFO_HARD_LIMIT_ZERO);
else
u->SendMessage(MemoServ, MEMO_INFO_LIMIT_ZERO);
source.Reply(MEMO_INFO_LIMIT_ZERO);
}
else if (mi->memomax > 0)
{
if (!u->Account()->IsServicesOper() && hardmax)
u->SendMessage(MemoServ, MEMO_INFO_HARD_LIMIT, mi->memomax);
source.Reply(MEMO_INFO_HARD_LIMIT, mi->memomax);
else
u->SendMessage(MemoServ, MEMO_INFO_LIMIT, mi->memomax);
source.Reply(MEMO_INFO_LIMIT, mi->memomax);
}
else
u->SendMessage(MemoServ, MEMO_INFO_NO_LIMIT);
source.Reply(MEMO_INFO_NO_LIMIT);
/* Ripped too. But differently because of a seg fault (loughs) */
if (u->Account()->HasFlag(NI_MEMO_RECEIVE) && u->Account()->HasFlag(NI_MEMO_SIGNON))
u->SendMessage(MemoServ, MEMO_INFO_NOTIFY_ON);
source.Reply(MEMO_INFO_NOTIFY_ON);
else if (u->Account()->HasFlag(NI_MEMO_RECEIVE))
u->SendMessage(MemoServ, MEMO_INFO_NOTIFY_RECEIVE);
source.Reply(MEMO_INFO_NOTIFY_RECEIVE);
else if (u->Account()->HasFlag(NI_MEMO_SIGNON))
u->SendMessage(MemoServ, MEMO_INFO_NOTIFY_SIGNON);
source.Reply(MEMO_INFO_NOTIFY_SIGNON);
else
u->SendMessage(MemoServ, MEMO_INFO_NOTIFY_OFF);
source.Reply(MEMO_INFO_NOTIFY_OFF);
}
return MOD_CONT;
}
+22 -20
View File
@@ -15,12 +15,12 @@
class MemoListCallback : public NumberList
{
User *u;
CommandSource &source;
ChannelInfo *ci;
const MemoInfo *mi;
bool SentHeader;
public:
MemoListCallback(User *_u, ChannelInfo *_ci, const MemoInfo *_mi, const Anope::string &list) : NumberList(list, false), u(_u), ci(_ci), mi(_mi), SentHeader(false)
MemoListCallback(CommandSource &_source, ChannelInfo *_ci, const MemoInfo *_mi, const Anope::string &list) : NumberList(list, false), source(_source), ci(_ci), mi(_mi), SentHeader(false)
{
}
@@ -33,20 +33,20 @@ class MemoListCallback : public NumberList
{
SentHeader = true;
if (ci)
u->SendMessage(MemoServ, MEMO_LIST_CHAN_MEMOS, ci->name.c_str(), Config->s_MemoServ.c_str(), ci->name.c_str());
source.Reply(MEMO_LIST_CHAN_MEMOS, ci->name.c_str(), Config->s_MemoServ.c_str(), ci->name.c_str());
else
u->SendMessage(MemoServ, MEMO_LIST_MEMOS, u->nick.c_str(), Config->s_MemoServ.c_str());
source.Reply(MEMO_LIST_MEMOS, source.u->nick.c_str(), Config->s_MemoServ.c_str());
u->SendMessage(MemoServ, MEMO_LIST_HEADER);
source.Reply(MEMO_LIST_HEADER);
}
DoList(u, ci, mi, Number - 1);
DoList(source, mi, Number - 1);
}
static void DoList(User *u, ChannelInfo *ci, const MemoInfo *mi, unsigned index)
static void DoList(CommandSource &source, const MemoInfo *mi, unsigned index)
{
Memo *m = mi->memos[index];
u->SendMessage(MemoServ, MEMO_LIST_FORMAT, (m->HasFlag(MF_UNREAD)) ? '*' : ' ', index + 1, m->sender.c_str(), do_strftime(m->time).c_str());
source.Reply(MEMO_LIST_FORMAT, (m->HasFlag(MF_UNREAD)) ? '*' : ' ', index + 1, m->sender.c_str(), do_strftime(m->time).c_str());
}
};
@@ -57,8 +57,10 @@ class CommandMSList : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
Anope::string param = !params.empty() ? params[0] : "", chan;
ChannelInfo *ci = NULL;
const MemoInfo *mi;
@@ -71,12 +73,12 @@ class CommandMSList : public Command
if (!(ci = cs_findchan(chan)))
{
u->SendMessage(MemoServ, CHAN_X_NOT_REGISTERED, chan.c_str());
source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
return MOD_CONT;
}
else if (!check_access(u, ci, CA_MEMO))
{
u->SendMessage(MemoServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
mi = &ci->memos;
@@ -88,15 +90,15 @@ class CommandMSList : public Command
else if (!mi->memos.size())
{
if (!chan.empty())
u->SendMessage(MemoServ, MEMO_X_HAS_NO_MEMOS, chan.c_str());
source.Reply(MEMO_X_HAS_NO_MEMOS, chan.c_str());
else
u->SendMessage(MemoServ, MEMO_HAVE_NO_MEMOS);
source.Reply(MEMO_HAVE_NO_MEMOS);
}
else
{
if (!param.empty() && isdigit(param[0]))
{
MemoListCallback list(u, ci, mi, param);
MemoListCallback list(source, ci, mi, param);
list.Process();
}
else
@@ -109,9 +111,9 @@ class CommandMSList : public Command
if (i == end)
{
if (!chan.empty())
u->SendMessage(MemoServ, MEMO_X_HAS_NO_NEW_MEMOS, chan.c_str());
source.Reply(MEMO_X_HAS_NO_NEW_MEMOS, chan.c_str());
else
u->SendMessage(MemoServ, MEMO_HAVE_NO_NEW_MEMOS);
source.Reply(MEMO_HAVE_NO_NEW_MEMOS);
return MOD_CONT;
}
}
@@ -127,13 +129,13 @@ class CommandMSList : public Command
{
SentHeader = true;
if (ci)
u->SendMessage(MemoServ, !param.empty() ? MEMO_LIST_CHAN_NEW_MEMOS : MEMO_LIST_CHAN_MEMOS, ci->name.c_str(), Config->s_MemoServ.c_str(), ci->name.c_str());
source.Reply(!param.empty() ? MEMO_LIST_CHAN_NEW_MEMOS : MEMO_LIST_CHAN_MEMOS, ci->name.c_str(), Config->s_MemoServ.c_str(), ci->name.c_str());
else
u->SendMessage(MemoServ, !param.empty() ? MEMO_LIST_NEW_MEMOS : MEMO_LIST_MEMOS, u->nick.c_str(), Config->s_MemoServ.c_str());
u->SendMessage(MemoServ, MEMO_LIST_HEADER);
source.Reply(!param.empty() ? MEMO_LIST_NEW_MEMOS : MEMO_LIST_MEMOS, u->nick.c_str(), Config->s_MemoServ.c_str());
source.Reply(MEMO_LIST_HEADER);
}
MemoListCallback::DoList(u, ci, mi, i);
MemoListCallback::DoList(source, mi, i);
}
}
}
+17 -14
View File
@@ -15,10 +15,10 @@
class MemoListCallback : public NumberList
{
User *u;
CommandSource &source;
MemoInfo *mi;
public:
MemoListCallback(User *_u, MemoInfo *_mi, const Anope::string &numlist) : NumberList(numlist, false), u(_u), mi(_mi)
MemoListCallback(CommandSource &_source, MemoInfo *_mi, const Anope::string &numlist) : NumberList(numlist, false), source(_source), mi(_mi)
{
}
@@ -27,11 +27,12 @@ class MemoListCallback : public NumberList
if (!Number || Number > mi->memos.size())
return;
MemoListCallback::DoRead(u, mi, NULL, Number - 1);
MemoListCallback::DoRead(source, mi, NULL, Number - 1);
}
static void DoRead(User *u, MemoInfo *mi, ChannelInfo *ci, unsigned index)
static void DoRead(CommandSource &source, MemoInfo *mi, ChannelInfo *ci, unsigned index)
{
User *u = source.u;
Memo *m = mi->memos[index];
if (ci)
u->SendMessage(MemoServ, MEMO_CHAN_HEADER, index + 1, m->sender.c_str(), do_strftime(m->time).c_str(), Config->s_MemoServ.c_str(), ci->name.c_str(), index + 1);
@@ -53,8 +54,10 @@ class CommandMSRead : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
MemoInfo *mi;
ChannelInfo *ci = NULL;
Anope::string numstr = !params.empty() ? params[0] : "", chan;
@@ -67,12 +70,12 @@ class CommandMSRead : public Command
if (!(ci = cs_findchan(chan)))
{
u->SendMessage(MemoServ, CHAN_X_NOT_REGISTERED, chan.c_str());
source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
return MOD_CONT;
}
else if (!check_access(u, ci, CA_MEMO))
{
u->SendMessage(MemoServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
mi = &ci->memos;
@@ -85,9 +88,9 @@ class CommandMSRead : public Command
else if (mi->memos.empty())
{
if (!chan.empty())
u->SendMessage(MemoServ, MEMO_X_HAS_NO_MEMOS, chan.c_str());
source.Reply(MEMO_X_HAS_NO_MEMOS, chan.c_str());
else
u->SendMessage(MemoServ, MEMO_HAVE_NO_MEMOS);
source.Reply(MEMO_HAVE_NO_MEMOS);
}
else {
int i, end;
@@ -98,25 +101,25 @@ class CommandMSRead : public Command
for (i = 0, end = mi->memos.size(); i < end; ++i)
if (mi->memos[i]->HasFlag(MF_UNREAD))
{
MemoListCallback::DoRead(u, mi, ci, i);
MemoListCallback::DoRead(source, mi, ci, i);
++readcount;
}
if (!readcount)
{
if (!chan.empty())
u->SendMessage(MemoServ, MEMO_X_HAS_NO_NEW_MEMOS, chan.c_str());
source.Reply(MEMO_X_HAS_NO_NEW_MEMOS, chan.c_str());
else
u->SendMessage(MemoServ, MEMO_HAVE_NO_NEW_MEMOS);
source.Reply(MEMO_HAVE_NO_NEW_MEMOS);
}
}
else if (numstr.equals_ci("LAST"))
{
for (i = 0, end = mi->memos.size() - 1; i < end; ++i);
MemoListCallback::DoRead(u, mi, ci, i);
MemoListCallback::DoRead(source, mi, ci, i);
}
else /* number[s] */
{
MemoListCallback list(u, mi, numstr);
MemoListCallback list(source, mi, numstr);
list.Process();
}
}
+8 -6
View File
@@ -20,16 +20,18 @@ class CommandMSRSend : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params[0];
Anope::string text = params[1];
User *u = source.u;
const Anope::string &nick = params[0];
const Anope::string &text = params[1];
NickAlias *na = NULL;
/* prevent user from rsend to themselves */
if ((na = findnick(nick)) && na->nc == u->Account())
{
u->SendMessage(MemoServ, MEMO_NO_RSEND_SELF);
source.Reply(MEMO_NO_RSEND_SELF);
return MOD_CONT;
}
@@ -39,7 +41,7 @@ class CommandMSRSend : public Command
if (u->Account()->IsServicesOper())
memo_send(u, nick, text, 3);
else
u->SendMessage(MemoServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
}
else if (Config->MSMemoReceipt == 2)
/* Everybody can use rsend */
@@ -48,7 +50,7 @@ class CommandMSRSend : public Command
{
/* rsend has been disabled */
Log() << "MSMemoReceipt is set misconfigured to " << Config->MSMemoReceipt;
u->SendMessage(MemoServ, MEMO_RSEND_DISABLED);
source.Reply(MEMO_RSEND_DISABLED);
}
return MOD_CONT;
+4 -3
View File
@@ -20,10 +20,11 @@ class CommandMSSend : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params[0];
Anope::string text = params[1];
User *u = source.u;
const Anope::string &nick = params[0];
const Anope::string &text = params[1];
memo_send(u, nick, text, 0);
return MOD_CONT;
}
+4 -3
View File
@@ -20,13 +20,14 @@ class CommandMSSendAll : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string text = params[0];
User *u = source.u;
const Anope::string &text = params[0];
if (readonly)
{
u->SendMessage(MemoServ, MEMO_SEND_DISABLED);
source.Reply(MEMO_SEND_DISABLED);
return MOD_CONT;
}
+38 -35
View File
@@ -16,57 +16,61 @@
class CommandMSSet : public Command
{
private:
CommandReturn DoNotify(User *u, const std::vector<Anope::string> &params, MemoInfo *mi)
CommandReturn DoNotify(CommandSource &source, const std::vector<Anope::string> &params, MemoInfo *mi)
{
Anope::string param = params[1];
User *u = source.u;
const Anope::string &param = params[1];
if (param.equals_ci("ON"))
{
u->Account()->SetFlag(NI_MEMO_SIGNON);
u->Account()->SetFlag(NI_MEMO_RECEIVE);
u->SendMessage(MemoServ, MEMO_SET_NOTIFY_ON, Config->s_MemoServ.c_str());
source.Reply(MEMO_SET_NOTIFY_ON, Config->s_MemoServ.c_str());
}
else if (param.equals_ci("LOGON"))
{
u->Account()->SetFlag(NI_MEMO_SIGNON);
u->Account()->UnsetFlag(NI_MEMO_RECEIVE);
u->SendMessage(MemoServ, MEMO_SET_NOTIFY_LOGON, Config->s_MemoServ.c_str());
source.Reply(MEMO_SET_NOTIFY_LOGON, Config->s_MemoServ.c_str());
}
else if (param.equals_ci("NEW"))
{
u->Account()->UnsetFlag(NI_MEMO_SIGNON);
u->Account()->SetFlag(NI_MEMO_RECEIVE);
u->SendMessage(MemoServ, MEMO_SET_NOTIFY_NEW, Config->s_MemoServ.c_str());
source.Reply(MEMO_SET_NOTIFY_NEW, Config->s_MemoServ.c_str());
}
else if (param.equals_ci("MAIL"))
{
if (!u->Account()->email.empty())
{
u->Account()->SetFlag(NI_MEMO_MAIL);
u->SendMessage(MemoServ, MEMO_SET_NOTIFY_MAIL);
source.Reply(MEMO_SET_NOTIFY_MAIL);
}
else
u->SendMessage(MemoServ, MEMO_SET_NOTIFY_INVALIDMAIL);
source.Reply(MEMO_SET_NOTIFY_INVALIDMAIL);
}
else if (param.equals_ci("NOMAIL"))
{
u->Account()->UnsetFlag(NI_MEMO_MAIL);
u->SendMessage(MemoServ, MEMO_SET_NOTIFY_NOMAIL);
source.Reply(MEMO_SET_NOTIFY_NOMAIL);
}
else if (param.equals_ci("OFF"))
{
u->Account()->UnsetFlag(NI_MEMO_SIGNON);
u->Account()->UnsetFlag(NI_MEMO_RECEIVE);
u->Account()->UnsetFlag(NI_MEMO_MAIL);
u->SendMessage(MemoServ, MEMO_SET_NOTIFY_OFF, Config->s_MemoServ.c_str());
source.Reply(MEMO_SET_NOTIFY_OFF, Config->s_MemoServ.c_str());
}
else
SyntaxError(MemoServ, u, "SET NOTIFY", MEMO_SET_NOTIFY_SYNTAX);
return MOD_CONT;
}
CommandReturn DoLimit(User *u, const std::vector<Anope::string> &params, MemoInfo *mi)
CommandReturn DoLimit(CommandSource &source, const std::vector<Anope::string> &params, MemoInfo *mi)
{
User *u = source.u;
Anope::string p1 = params[1];
Anope::string p2 = params.size() > 2 ? params[2] : "";
Anope::string p3 = params.size() > 3 ? params[3] : "";
@@ -84,12 +88,12 @@ class CommandMSSet : public Command
p3 = params.size() > 4 ? params[4] : "";
if (!(ci = cs_findchan(chan)))
{
u->SendMessage(MemoServ, CHAN_X_NOT_REGISTERED, chan.c_str());
source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
return MOD_CONT;
}
else if (!is_servadmin && !check_access(u, ci, CA_MEMO))
{
u->SendMessage(MemoServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
mi = &ci->memos;
@@ -101,7 +105,7 @@ class CommandMSSet : public Command
NickAlias *na;
if (!(na = findnick(p1)))
{
u->SendMessage(MemoServ, NICK_X_NOT_REGISTERED, p1.c_str());
source.Reply(NICK_X_NOT_REGISTERED, p1.c_str());
return MOD_CONT;
}
user = p1;
@@ -137,7 +141,7 @@ class CommandMSSet : public Command
limit = p1.is_pos_number_only() ? convertTo<int32>(p1) : -1;
if (limit < 0 || limit > 32767)
{
u->SendMessage(MemoServ, MEMO_SET_LIMIT_OVERFLOW, 32767);
source.Reply(MEMO_SET_LIMIT_OVERFLOW, 32767);
limit = 32767;
}
if (p1.equals_ci("NONE"))
@@ -152,12 +156,12 @@ class CommandMSSet : public Command
}
if (!chan.empty() && ci->HasFlag(CI_MEMO_HARDMAX))
{
u->SendMessage(MemoServ, MEMO_SET_LIMIT_FORBIDDEN, chan.c_str());
source.Reply(MEMO_SET_LIMIT_FORBIDDEN, chan.c_str());
return MOD_CONT;
}
else if (chan.empty() && nc->HasFlag(NI_MEMO_HARDMAX))
{
u->SendMessage(MemoServ, MEMO_SET_YOUR_LIMIT_FORBIDDEN);
source.Reply(MEMO_SET_YOUR_LIMIT_FORBIDDEN);
return MOD_CONT;
}
limit = p1.is_pos_number_only() ? convertTo<int32>(p1) : -1;
@@ -166,14 +170,14 @@ class CommandMSSet : public Command
if (limit < 0 || (Config->MSMaxMemos > 0 && static_cast<unsigned>(limit) > Config->MSMaxMemos))
{
if (!chan.empty())
u->SendMessage(MemoServ, MEMO_SET_LIMIT_TOO_HIGH, chan.c_str(), Config->MSMaxMemos);
source.Reply(MEMO_SET_LIMIT_TOO_HIGH, chan.c_str(), Config->MSMaxMemos);
else
u->SendMessage(MemoServ, MEMO_SET_YOUR_LIMIT_TOO_HIGH, Config->MSMaxMemos);
source.Reply(MEMO_SET_YOUR_LIMIT_TOO_HIGH, Config->MSMaxMemos);
return MOD_CONT;
}
else if (limit > 32767)
{
u->SendMessage(MemoServ, MEMO_SET_LIMIT_OVERFLOW, 32767);
source.Reply(MEMO_SET_LIMIT_OVERFLOW, 32767);
limit = 32767;
}
}
@@ -181,23 +185,23 @@ class CommandMSSet : public Command
if (limit > 0)
{
if (chan.empty() && nc == u->Account())
u->SendMessage(MemoServ, MEMO_SET_YOUR_LIMIT, limit);
source.Reply(MEMO_SET_YOUR_LIMIT, limit);
else
u->SendMessage(MemoServ, MEMO_SET_LIMIT, !chan.empty() ? chan.c_str() : user.c_str(), limit);
source.Reply(MEMO_SET_LIMIT, !chan.empty() ? chan.c_str() : user.c_str(), limit);
}
else if (!limit)
{
if (chan.empty() && nc == u->Account())
u->SendMessage(MemoServ, MEMO_SET_YOUR_LIMIT_ZERO);
source.Reply(MEMO_SET_YOUR_LIMIT_ZERO);
else
u->SendMessage(MemoServ, MEMO_SET_LIMIT_ZERO, !chan.empty() ? chan.c_str() : user.c_str());
source.Reply(MEMO_SET_LIMIT_ZERO, !chan.empty() ? chan.c_str() : user.c_str());
}
else
{
if (chan.empty() && nc == u->Account())
u->SendMessage(MemoServ, MEMO_UNSET_YOUR_LIMIT);
source.Reply(MEMO_UNSET_YOUR_LIMIT);
else
u->SendMessage(MemoServ, MEMO_UNSET_LIMIT, !chan.empty() ? chan.c_str() : user.c_str());
source.Reply(MEMO_UNSET_LIMIT, !chan.empty() ? chan.c_str() : user.c_str());
}
return MOD_CONT;
}
@@ -206,25 +210,24 @@ class CommandMSSet : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string cmd = params[0];
User *u = source.u;
const Anope::string &cmd = params[0];
MemoInfo *mi = &u->Account()->memos;
if (readonly)
{
u->SendMessage(MemoServ, MEMO_SET_DISABLED);
return MOD_CONT;
}
source.Reply(MEMO_SET_DISABLED);
else if (cmd.equals_ci("NOTIFY"))
return this->DoNotify(u, params, mi);
return this->DoNotify(source, params, mi);
else if (cmd.equals_ci("LIMIT"))
return this->DoLimit(u, params, mi);
return this->DoLimit(source, params, mi);
else
{
u->SendMessage(MemoServ, NICK_SET_UNKNOWN_OPTION, cmd.c_str());
u->SendMessage(MemoServ, MORE_INFO, Config->s_MemoServ.c_str(), "SET");
source.Reply(NICK_SET_UNKNOWN_OPTION, cmd.c_str());
source.Reply(MORE_INFO, Config->s_MemoServ.c_str(), "SET");
}
return MOD_CONT;
}
+4 -3
View File
@@ -20,13 +20,14 @@ class CommandMSStaff : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string text = params[0];
User *u = source.u;
const Anope::string &text = params[0];
if (readonly)
{
u->SendMessage(MemoServ, MEMO_SEND_DISABLED);
source.Reply(MEMO_SEND_DISABLED);
return MOD_CONT;
}
+34 -31
View File
@@ -16,37 +16,39 @@
class CommandNSAccess : public Command
{
private:
CommandReturn DoServAdminList(User *u, const std::vector<Anope::string> &params, NickCore *nc)
CommandReturn DoServAdminList(CommandSource &source, const std::vector<Anope::string> &params, NickCore *nc)
{
Anope::string mask = params.size() > 2 ? params[2] : "";
unsigned i, end;
if (nc->access.empty())
{
u->SendMessage(NickServ, NICK_ACCESS_LIST_X_EMPTY, nc->display.c_str());
source.Reply(NICK_ACCESS_LIST_X_EMPTY, nc->display.c_str());
return MOD_CONT;
}
if (nc->HasFlag(NI_SUSPENDED))
{
u->SendMessage(NickServ, NICK_X_SUSPENDED, nc->display.c_str());
source.Reply(NICK_X_SUSPENDED, nc->display.c_str());
return MOD_CONT;
}
u->SendMessage(NickServ, NICK_ACCESS_LIST_X, params[1].c_str());
source.Reply(NICK_ACCESS_LIST_X, params[1].c_str());
for (i = 0, end = nc->access.size(); i < end; ++i)
{
Anope::string access = nc->GetAccess(i);
if (!mask.empty() && !Anope::Match(access, mask))
continue;
u->SendMessage(Config->s_NickServ, " %s", access.c_str());
source.Reply(" %s", access.c_str());
}
return MOD_CONT;
}
CommandReturn DoAdd(User *u, NickCore *nc, const Anope::string &mask)
CommandReturn DoAdd(CommandSource &source, NickCore *nc, const Anope::string &mask)
{
User *u = source.u;
if (mask.empty())
{
this->OnSyntaxError(u, "ADD");
@@ -55,24 +57,26 @@ class CommandNSAccess : public Command
if (nc->access.size() >= Config->NSAccessMax)
{
u->SendMessage(NickServ, NICK_ACCESS_REACHED_LIMIT, Config->NSAccessMax);
source.Reply(NICK_ACCESS_REACHED_LIMIT, Config->NSAccessMax);
return MOD_CONT;
}
if (nc->FindAccess(mask))
{
u->SendMessage(NickServ, NICK_ACCESS_ALREADY_PRESENT, mask.c_str());
source.Reply(NICK_ACCESS_ALREADY_PRESENT, mask.c_str());
return MOD_CONT;
}
nc->AddAccess(mask);
u->SendMessage(NickServ, NICK_ACCESS_ADDED, mask.c_str());
source.Reply(NICK_ACCESS_ADDED, mask.c_str());
return MOD_CONT;
}
CommandReturn DoDel(User *u, NickCore *nc, const Anope::string &mask)
CommandReturn DoDel(CommandSource &source, NickCore *nc, const Anope::string &mask)
{
User *u = source.u;
if (mask.empty())
{
this->OnSyntaxError(u, "DEL");
@@ -81,33 +85,34 @@ class CommandNSAccess : public Command
if (!nc->FindAccess(mask))
{
u->SendMessage(NickServ, NICK_ACCESS_NOT_FOUND, mask.c_str());
source.Reply(NICK_ACCESS_NOT_FOUND, mask.c_str());
return MOD_CONT;
}
u->SendMessage(NickServ, NICK_ACCESS_DELETED, mask.c_str());
source.Reply(NICK_ACCESS_DELETED, mask.c_str());
nc->EraseAccess(mask);
return MOD_CONT;
}
CommandReturn DoList(User *u, NickCore *nc, const Anope::string &mask)
CommandReturn DoList(CommandSource &source, NickCore *nc, const Anope::string &mask)
{
User *u = source.u;
unsigned i, end;
if (nc->access.empty())
{
u->SendMessage(NickServ, NICK_ACCESS_LIST_EMPTY, u->nick.c_str());
source.Reply(NICK_ACCESS_LIST_EMPTY, u->nick.c_str());
return MOD_CONT;
}
u->SendMessage(NickServ, NICK_ACCESS_LIST);
source.Reply(NICK_ACCESS_LIST);
for (i = 0, end = nc->access.size(); i < end; ++i)
{
Anope::string access = nc->GetAccess(i);
if (!mask.empty() && !Anope::Match(access, mask))
continue;
u->SendMessage(Config->s_NickServ, " %s", access.c_str());
source.Reply(" %s", access.c_str());
}
return MOD_CONT;
@@ -117,34 +122,32 @@ class CommandNSAccess : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string cmd = params[0];
Anope::string mask = params.size() > 1 ? params[1] : "";
NickAlias *na;
User *u = source.u;
const Anope::string &cmd = params[0];
const Anope::string &mask = params.size() > 1 ? params[1] : "";
NickAlias *na;
if (cmd.equals_ci("LIST") && u->Account()->IsServicesOper() && !mask.empty() && (na = findnick(params[1])))
return this->DoServAdminList(u, params, na->nc);
return this->DoServAdminList(source, params, na->nc);
if (!mask.empty() && mask.find('@') == Anope::string::npos)
{
u->SendMessage(NickServ, BAD_USERHOST_MASK);
u->SendMessage(NickServ, MORE_INFO, Config->s_NickServ.c_str(), "ACCESS");
source.Reply(BAD_USERHOST_MASK);
source.Reply(MORE_INFO, Config->s_NickServ.c_str(), "ACCESS");
}
/*
else if (na->HasFlag(NS_FORBIDDEN))
u->SendMessage(NickServ, NICK_X_FORBIDDEN, na->nick);
*/
else if (u->Account()->HasFlag(NI_SUSPENDED))
u->SendMessage(NickServ, NICK_X_SUSPENDED, u->Account()->display.c_str());
source.Reply(NICK_X_SUSPENDED, u->Account()->display.c_str());
else if (cmd.equals_ci("ADD"))
return this->DoAdd(u, u->Account(), mask);
return this->DoAdd(source, u->Account(), mask);
else if (cmd.equals_ci("DEL"))
return this->DoDel(u, u->Account(), mask);
return this->DoDel(source, u->Account(), mask);
else if (cmd.equals_ci("LIST"))
return this->DoList(u, u->Account(), mask);
return this->DoList(source, u->Account(), mask);
else
this->OnSyntaxError(u, "");
return MOD_CONT;
}
+9 -9
View File
@@ -20,7 +20,7 @@ class CommandNSAList : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
/*
* List the channels that the given nickname has access on
@@ -31,8 +31,8 @@ class CommandNSAList : public Command
* -jester
*/
User *u = source.u;
Anope::string nick;
NickAlias *na;
int min_level = 0;
@@ -77,18 +77,18 @@ class CommandNSAList : public Command
}
if (!na)
u->SendMessage(NickServ, NICK_X_NOT_REGISTERED, nick.c_str());
source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
else if (na->HasFlag(NS_FORBIDDEN))
u->SendMessage(NickServ, NICK_X_FORBIDDEN, na->nick.c_str());
source.Reply(NICK_X_FORBIDDEN, na->nick.c_str());
else if (min_level <= ACCESS_INVALID || min_level > ACCESS_FOUNDER)
u->SendMessage(NickServ, CHAN_ACCESS_LEVEL_RANGE, ACCESS_INVALID + 1, ACCESS_FOUNDER - 1);
source.Reply(CHAN_ACCESS_LEVEL_RANGE, ACCESS_INVALID + 1, ACCESS_FOUNDER - 1);
else
{
int level;
int chan_count = 0;
int match_count = 0;
u->SendMessage(NickServ, is_servadmin ? NICK_ALIST_HEADER_X : NICK_ALIST_HEADER, na->nick.c_str());
source.Reply(is_servadmin ? NICK_ALIST_HEADER_X : NICK_ALIST_HEADER, na->nick.c_str());
for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it)
{
@@ -107,14 +107,14 @@ class CommandNSAList : public Command
{
Anope::string xop = get_xop_level(level);
u->SendMessage(NickServ, NICK_ALIST_XOP_FORMAT, match_count, ci->HasFlag(CI_NO_EXPIRE) ? '!' : ' ', ci->name.c_str(), xop.c_str(), !ci->desc.empty() ? ci->desc.c_str() : "");
source.Reply(NICK_ALIST_XOP_FORMAT, match_count, ci->HasFlag(CI_NO_EXPIRE) ? '!' : ' ', ci->name.c_str(), xop.c_str(), !ci->desc.empty() ? ci->desc.c_str() : "");
}
else
u->SendMessage(NickServ, NICK_ALIST_ACCESS_FORMAT, match_count, ci->HasFlag(CI_NO_EXPIRE) ? '!' : ' ', ci->name.c_str(), level, !ci->desc.empty() ? ci->desc.c_str() : "");
source.Reply(NICK_ALIST_ACCESS_FORMAT, match_count, ci->HasFlag(CI_NO_EXPIRE) ? '!' : ' ', ci->name.c_str(), level, !ci->desc.empty() ? ci->desc.c_str() : "");
}
}
u->SendMessage(NickServ, NICK_ALIST_FOOTER, match_count, chan_count);
source.Reply(NICK_ALIST_FOOTER, match_count, chan_count);
}
return MOD_CONT;
}
+14 -13
View File
@@ -21,13 +21,14 @@ class CommandNSDrop : public Command
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
Anope::string nick = !params.empty() ? params[0] : "";
if (readonly)
{
u->SendMessage(NickServ, NICK_DROP_DISABLED);
source.Reply(NICK_DROP_DISABLED);
return MOD_CONT;
}
@@ -42,7 +43,7 @@ class CommandNSDrop : public Command
Log(LOG_ADMIN, u, this) << "to drop nickname " << nr->nick << " (email: " << nr->email << ")";
delete nr;
u->SendMessage(NickServ, NICK_X_DROPPED, nick.c_str());
source.Reply(NICK_X_DROPPED, nick.c_str());
}
else if (nr && !nick.empty())
{
@@ -50,23 +51,23 @@ class CommandNSDrop : public Command
if (res)
{
Log(LOG_COMMAND, u, this) << "to drop nick request " << nr->nick;
u->SendMessage(NickServ, NICK_X_DROPPED, nr->nick.c_str());
source.Reply(NICK_X_DROPPED, nr->nick.c_str());
delete nr;
}
else if (bad_password(u))
return MOD_STOP;
else
u->SendMessage(NickServ, PASSWORD_INCORRECT);
source.Reply(PASSWORD_INCORRECT);
}
else
u->SendMessage(NickServ, NICK_NOT_REGISTERED);
source.Reply(NICK_NOT_REGISTERED);
return MOD_CONT;
}
if (!u->Account())
{
u->SendMessage(NickServ, NICK_IDENTIFY_REQUIRED, Config->s_NickServ.c_str());
source.Reply(NICK_IDENTIFY_REQUIRED, Config->s_NickServ.c_str());
return MOD_CONT;
}
@@ -76,13 +77,13 @@ class CommandNSDrop : public Command
my_nick = na->nick;
if (!is_mine && !u->Account()->HasPriv("nickserv/drop"))
u->SendMessage(NickServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else if (Config->NSSecureAdmins && !is_mine && na->nc->IsServicesOper())
u->SendMessage(NickServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else
{
if (readonly)
u->SendMessage(NickServ, READ_ONLY_MODE);
source.Reply(READ_ONLY_MODE);
if (ircd->sqline && na->HasFlag(NS_FORBIDDEN))
{
@@ -99,14 +100,14 @@ class CommandNSDrop : public Command
{
if (Config->WallDrop)
ircdproto->SendGlobops(NickServ, "\2%s\2 used DROP on \2%s\2", u->nick.c_str(), nick.c_str());
u->SendMessage(NickServ, NICK_X_DROPPED, nick.c_str());
source.Reply(NICK_X_DROPPED, nick.c_str());
}
else
{
if (!nick.empty())
u->SendMessage(NickServ, NICK_X_DROPPED, nick.c_str());
source.Reply(NICK_X_DROPPED, nick.c_str());
else
u->SendMessage(NickServ, NICK_DROPPED);
source.Reply(NICK_DROPPED);
}
}
+10 -8
View File
@@ -20,11 +20,11 @@ class CommandNSForbid : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
NickAlias *na;
Anope::string nick = params[0];
Anope::string reason = params.size() > 1 ? params[1] : "";
User *u = source.u;
const Anope::string &nick = params[0];
const Anope::string &reason = params.size() > 1 ? params[1] : "";
/* Assumes that permission checking has already been done. */
if (Config->ForceForbidReason && reason.empty())
@@ -34,17 +34,19 @@ class CommandNSForbid : public Command
}
if (readonly)
u->SendMessage(NickServ, READ_ONLY_MODE);
source.Reply(READ_ONLY_MODE);
if (!ircdproto->IsNickValid(nick))
{
u->SendMessage(NickServ, NICK_X_FORBIDDEN, nick.c_str());
source.Reply(NICK_X_FORBIDDEN, nick.c_str());
return MOD_CONT;
}
if ((na = findnick(nick)))
NickAlias *na = findnick(nick);
if (na)
{
if (Config->NSSecureAdmins && na->nc->IsServicesOper())
{
u->SendMessage(NickServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
delete na;
+5 -4
View File
@@ -24,9 +24,10 @@ class CommandNSGetEMail : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string email = params[0];
User *u = source.u;
const Anope::string &email = params[0];
int j = 0;
Log(LOG_ADMIN, u, this) << "on " << email;
@@ -38,13 +39,13 @@ class CommandNSGetEMail : public Command
if (!nc->email.empty() && nc->email.equals_ci(email))
{
++j;
u->SendMessage(NickServ, NICK_GETEMAIL_EMAILS_ARE, nc->display.c_str(), email.c_str());
source.Reply(NICK_GETEMAIL_EMAILS_ARE, nc->display.c_str(), email.c_str());
}
}
if (j <= 0)
{
u->SendMessage(NickServ, NICK_GETEMAIL_NOT_USED, email.c_str());
source.Reply(NICK_GETEMAIL_NOT_USED, email.c_str());
return MOD_CONT;
}
+9 -8
View File
@@ -20,9 +20,10 @@ class CommandNSGetPass : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params[0];
User *u = source.u;
const Anope::string &nick = params[0];
Anope::string tmp_pass;
NickAlias *na;
NickRequest *nr = NULL;
@@ -34,15 +35,15 @@ class CommandNSGetPass : public Command
Log(LOG_ADMIN, u, this) << "for " << nr->nick;
if (Config->WallGetpass)
ircdproto->SendGlobops(NickServ, "\2%s\2 used GETPASS on \2%s\2", u->nick.c_str(), nick.c_str());
u->SendMessage(NickServ, NICK_GETPASS_PASSCODE_IS, nick.c_str(), nr->passcode.c_str());
source.Reply(NICK_GETPASS_PASSCODE_IS, nick.c_str(), nr->passcode.c_str());
}
else
u->SendMessage(NickServ, NICK_X_NOT_REGISTERED, nick.c_str());
source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
}
else if (na->HasFlag(NS_FORBIDDEN))
u->SendMessage(NickServ, NICK_X_FORBIDDEN, na->nick.c_str());
source.Reply(NICK_X_FORBIDDEN, na->nick.c_str());
else if (Config->NSSecureAdmins && na->nc->IsServicesOper())
u->SendMessage(NickServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else
{
if (enc_decrypt(na->nc->pass, tmp_pass) == 1)
@@ -50,10 +51,10 @@ class CommandNSGetPass : public Command
Log(LOG_ADMIN, u, this) << "for " << nick;
if (Config->WallGetpass)
ircdproto->SendGlobops(NickServ, "\2%s\2 used GETPASS on \2%s\2", u->nick.c_str(), nick.c_str());
u->SendMessage(NickServ, NICK_GETPASS_PASSWORD_IS, nick.c_str(), tmp_pass.c_str());
source.Reply(NICK_GETPASS_PASSWORD_IS, nick.c_str(), tmp_pass.c_str());
}
else
u->SendMessage(NickServ, NICK_GETPASS_UNAVAILABLE);
source.Reply(NICK_GETPASS_UNAVAILABLE);
}
return MOD_CONT;
}
+12 -10
View File
@@ -21,39 +21,41 @@ class CommandNSGhost : public Command
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params[0];
const Anope::string &nick = params[0];
Anope::string pass = params.size() > 1 ? params[1] : "";
User *u = source.u;
User *user = finduser(nick);
NickAlias *na = findnick(nick);
if (!user)
u->SendMessage(NickServ, NICK_X_NOT_IN_USE, nick.c_str());
source.Reply(NICK_X_NOT_IN_USE, nick.c_str());
else if (!na)
u->SendMessage(NickServ, NICK_X_NOT_REGISTERED, nick.c_str());
source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
else if (na->HasFlag(NS_FORBIDDEN))
u->SendMessage(NickServ, NICK_X_FORBIDDEN, na->nick.c_str());
source.Reply(NICK_X_FORBIDDEN, na->nick.c_str());
else if (na->nc->HasFlag(NI_SUSPENDED))
u->SendMessage(NickServ, NICK_X_SUSPENDED, na->nick.c_str());
source.Reply(NICK_X_SUSPENDED, na->nick.c_str());
else if (nick.equals_ci(u->nick))
u->SendMessage(NickServ, NICK_NO_GHOST_SELF);
source.Reply(NICK_NO_GHOST_SELF);
else if ((u->Account() == na->nc || (!na->nc->HasFlag(NI_SECURE) && is_on_access(u, na->nc))) ||
(!pass.empty() && enc_check_password(pass, na->nc->pass) == 1))
{
if (!user->IsIdentified() && FindCommand(NickServ, "RECOVER"))
u->SendMessage(NickServ, NICK_GHOST_UNIDENTIFIED);
source.Reply(NICK_GHOST_UNIDENTIFIED);
else
{
Log(LOG_COMMAND, u, this) << "for " << nick;
Anope::string buf = "GHOST command used by " + u->nick;
kill_user(Config->s_NickServ, nick, buf);
u->SendMessage(NickServ, NICK_GHOST_KILLED, nick.c_str());
source.Reply(NICK_GHOST_KILLED, nick.c_str());
}
}
else
{
u->SendMessage(NickServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
if (!pass.empty())
{
Log(LOG_COMMAND, u, this) << "with an invalid password for " << nick;
+35 -33
View File
@@ -21,71 +21,71 @@ class CommandNSGroup : public Command
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
NickAlias *na, *target;
Anope::string nick = params[0];
User *u = source.u;
const Anope::string &nick = params[0];
Anope::string pass = params[1];
std::list<std::pair<Anope::string, Anope::string> >::iterator it, it_end;
if (Config->NSEmailReg && findrequestnick(u->nick))
{
u->SendMessage(NickServ, NICK_REQUESTED);
source.Reply(NICK_REQUESTED);
return MOD_CONT;
}
if (readonly)
{
u->SendMessage(NickServ, NICK_GROUP_DISABLED);
source.Reply(NICK_GROUP_DISABLED);
return MOD_CONT;
}
if (!ircdproto->IsNickValid(u->nick))
{
u->SendMessage(NickServ, NICK_X_FORBIDDEN, u->nick.c_str());
source.Reply(NICK_X_FORBIDDEN, u->nick.c_str());
return MOD_CONT;
}
if (Config->RestrictOperNicks)
for (it = Config->Opers.begin(), it_end = Config->Opers.end(); it != it_end; ++it)
for (std::list<std::pair<Anope::string, Anope::string> >::iterator it = Config->Opers.begin(), it_end = Config->Opers.end(); it != it_end; ++it)
if (!is_oper(u) && u->nick.find_ci(it->first) != Anope::string::npos)
{
u->SendMessage(NickServ, NICK_CANNOT_BE_REGISTERED, u->nick.c_str());
source.Reply(NICK_CANNOT_BE_REGISTERED, u->nick.c_str());
return MOD_CONT;
}
na = findnick(u->nick);
NickAlias *target, *na = findnick(u->nick);
if (!(target = findnick(nick)))
u->SendMessage(NickServ, NICK_X_NOT_REGISTERED, nick.c_str());
source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
else if (Anope::CurTime < u->lastnickreg + Config->NSRegDelay)
u->SendMessage(NickServ, NICK_GROUP_PLEASE_WAIT, (Config->NSRegDelay + u->lastnickreg) - Anope::CurTime);
source.Reply(NICK_GROUP_PLEASE_WAIT, (Config->NSRegDelay + u->lastnickreg) - Anope::CurTime);
else if (u->Account() && u->Account()->HasFlag(NI_SUSPENDED))
{
Log(NickServ) << NickServ << u->GetMask() << " tried to use GROUP from SUSPENDED nick " << target->nick;
u->SendMessage(NickServ, NICK_X_SUSPENDED, u->nick.c_str());
source.Reply(NICK_X_SUSPENDED, u->nick.c_str());
}
else if (target && target->nc->HasFlag(NI_SUSPENDED))
{
Log(LOG_COMMAND, u, this) << "tried to use GROUP for SUSPENDED nick " << target->nick;
u->SendMessage(NickServ, NICK_X_SUSPENDED, target->nick.c_str());
source.Reply(NICK_X_SUSPENDED, target->nick.c_str());
}
else if (target->HasFlag(NS_FORBIDDEN))
u->SendMessage(NickServ, NICK_X_FORBIDDEN, nick.c_str());
source.Reply(NICK_X_FORBIDDEN, nick.c_str());
else if (na && target->nc == na->nc)
u->SendMessage(NickServ, NICK_GROUP_SAME, target->nick.c_str());
source.Reply(NICK_GROUP_SAME, target->nick.c_str());
else if (na && na->nc != u->Account())
u->SendMessage(NickServ, NICK_IDENTIFY_REQUIRED, Config->s_NickServ.c_str());
source.Reply(NICK_IDENTIFY_REQUIRED, Config->s_NickServ.c_str());
else if (na && Config->NSNoGroupChange)
u->SendMessage(NickServ, NICK_GROUP_CHANGE_DISABLED, Config->s_NickServ.c_str());
source.Reply(NICK_GROUP_CHANGE_DISABLED, Config->s_NickServ.c_str());
else if (Config->NSMaxAliases && (target->nc->aliases.size() >= Config->NSMaxAliases) && !target->nc->IsServicesOper())
u->SendMessage(NickServ, NICK_GROUP_TOO_MANY, target->nick.c_str(), Config->s_NickServ.c_str(), Config->s_NickServ.c_str());
source.Reply(NICK_GROUP_TOO_MANY, target->nick.c_str(), Config->s_NickServ.c_str(), Config->s_NickServ.c_str());
else
{
int res = enc_check_password(pass, target->nc->pass);
if (res == -1)
{
Log(LOG_COMMAND, u, this) << "failed group for " << na->nick << " (invalid password)";
u->SendMessage(NickServ, PASSWORD_INCORRECT);
source.Reply(PASSWORD_INCORRECT);
if (bad_password(u))
return MOD_STOP;
}
@@ -103,7 +103,7 @@ class CommandNSGroup : public Command
if (nicklen <= prefixlen + 7 && nicklen >= prefixlen + 1 && !u->nick.find_ci(Config->NSGuestNickPrefix) && !u->nick.substr(prefixlen).find_first_not_of("1234567890"))
{
u->SendMessage(NickServ, NICK_CANNOT_BE_REGISTERED, u->nick.c_str());
source.Reply(NICK_CANNOT_BE_REGISTERED, u->nick.c_str());
return MOD_CONT;
}
}
@@ -121,7 +121,7 @@ class CommandNSGroup : public Command
u->SetMode(NickServ, UMODE_REGISTERED);
Log(LOG_COMMAND, u, this) << "makes " << u->nick << " join group of " << target->nick << " (" << target->nc->display << ") (email: " << (!target->nc->email.empty() ? target->nc->email : "none") << ")";
u->SendMessage(NickServ, NICK_GROUP_JOINED, target->nick.c_str());
source.Reply(NICK_GROUP_JOINED, target->nick.c_str());
u->lastnickreg = Anope::CurTime;
@@ -155,17 +155,18 @@ class CommandNSUngroup : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
Anope::string nick = !params.empty() ? params[0] : "";
NickAlias *na = findnick(!nick.empty() ? nick : u->nick);
if (u->Account()->aliases.size() == 1)
u->SendMessage(NickServ, NICK_UNGROUP_ONE_NICK);
source.Reply(NICK_UNGROUP_ONE_NICK);
else if (!na)
u->SendMessage(NickServ, NICK_X_NOT_REGISTERED, !nick.empty() ? nick.c_str() : u->nick.c_str());
source.Reply(NICK_X_NOT_REGISTERED, !nick.empty() ? nick.c_str() : u->nick.c_str());
else if (na->nc != u->Account())
u->SendMessage(NickServ, NICK_UNGROUP_NOT_IN_GROUP, na->nick.c_str());
source.Reply(NICK_UNGROUP_NOT_IN_GROUP, na->nick.c_str());
else
{
NickCore *oldcore = na->nc;
@@ -187,7 +188,7 @@ class CommandNSUngroup : public Command
na->nc->greet = oldcore->greet;
na->nc->language = oldcore->language;
u->SendMessage(NickServ, NICK_UNGROUP_SUCCESSFUL, na->nick.c_str(), oldcore->display.c_str());
source.Reply(NICK_UNGROUP_SUCCESSFUL, na->nick.c_str(), oldcore->display.c_str());
User *user = finduser(na->nick);
if (user)
@@ -217,26 +218,27 @@ class CommandNSGList : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
Anope::string nick = !params.empty() ? params[0] : "";
const NickCore *nc = u->Account();
if (!nick.empty() && (!nick.equals_ci(u->nick) && !u->Account()->IsServicesOper()))
u->SendMessage(NickServ, ACCESS_DENIED, Config->s_NickServ.c_str());
source.Reply(ACCESS_DENIED, Config->s_NickServ.c_str());
else if (!nick.empty() && (!findnick(nick) || !(nc = findnick(nick)->nc)))
u->SendMessage(NickServ, nick.empty() ? NICK_NOT_REGISTERED : NICK_X_NOT_REGISTERED, nick.c_str());
source.Reply(nick.empty() ? NICK_NOT_REGISTERED : NICK_X_NOT_REGISTERED, nick.c_str());
else
{
u->SendMessage(NickServ, !nick.empty() ? NICK_GLIST_HEADER_X : NICK_GLIST_HEADER, nc->display.c_str());
source.Reply(!nick.empty() ? NICK_GLIST_HEADER_X : NICK_GLIST_HEADER, nc->display.c_str());
for (std::list<NickAlias *>::const_iterator it = nc->aliases.begin(), it_end = nc->aliases.end(); it != it_end; ++it)
{
NickAlias *na2 = *it;
u->SendMessage(NickServ, na2->HasFlag(NS_NO_EXPIRE) ? NICK_GLIST_REPLY_NOEXPIRE : NICK_GLIST_REPLY, na2->nick.c_str(), do_strftime(na2->last_seen + Config->NSExpire).c_str());
source.Reply(na2->HasFlag(NS_NO_EXPIRE) ? NICK_GLIST_REPLY_NOEXPIRE : NICK_GLIST_REPLY, na2->nick.c_str(), do_strftime(na2->last_seen + Config->NSExpire).c_str());
}
u->SendMessage(NickServ, NICK_GLIST_FOOTER, nc->aliases.size());
source.Reply(NICK_GLIST_FOOTER, nc->aliases.size());
}
return MOD_CONT;
}
+2 -2
View File
@@ -21,9 +21,9 @@ class CommandNSHelp : public Command
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
mod_help_cmd(NickServ, u, params[0]);
mod_help_cmd(NickServ, source.u, params[0]);
return MOD_CONT;
}
+14 -12
View File
@@ -21,9 +21,11 @@ class CommandNSIdentify : public Command
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params.size() == 2 ? params[0] : u->nick;
User *u = source.u;
const Anope::string &nick = params.size() == 2 ? params[0] : u->nick;
Anope::string pass = params[params.size() - 1];
NickAlias *na = findnick(nick), *this_na = findnick(u->nick);
@@ -31,32 +33,32 @@ class CommandNSIdentify : public Command
{
NickRequest *nr = findrequestnick(nick);
if (nr)
u->SendMessage(NickServ, NICK_IS_PREREG);
source.Reply(NICK_IS_PREREG);
else
u->SendMessage(NickServ, NICK_NOT_REGISTERED);
source.Reply(NICK_NOT_REGISTERED);
}
else if (na->HasFlag(NS_FORBIDDEN))
u->SendMessage(NickServ, NICK_X_FORBIDDEN, na->nick.c_str());
source.Reply(NICK_X_FORBIDDEN, na->nick.c_str());
else if (na->nc->HasFlag(NI_SUSPENDED))
u->SendMessage(NickServ, NICK_X_SUSPENDED, na->nick.c_str());
source.Reply(NICK_X_SUSPENDED, na->nick.c_str());
/* You can now identify for other nicks without logging out first,
* however you can not identify again for the group you're already
* identified as
*/
else if (u->Account() && u->Account() == na->nc)
u->SendMessage(NickServ, NICK_ALREADY_IDENTIFIED);
source.Reply(NICK_ALREADY_IDENTIFIED);
else
{
int res = enc_check_password(pass, na->nc->pass);
if (!res)
{
Log(LOG_COMMAND, u, this) << "and failed to identify";
u->SendMessage(NickServ, PASSWORD_INCORRECT);
source.Reply(PASSWORD_INCORRECT);
if (bad_password(u))
return MOD_STOP;
}
else if (res == -1)
u->SendMessage(NickServ, NICK_IDENTIFY_FAILED);
source.Reply(NICK_IDENTIFY_FAILED);
else
{
if (u->IsIdentified())
@@ -77,7 +79,7 @@ class CommandNSIdentify : public Command
FOREACH_MOD(I_OnNickIdentify, OnNickIdentify(u));
Log(LOG_COMMAND, u, this) << "and identified for account " << u->Account()->display;
u->SendMessage(NickServ, NICK_IDENTIFY_SUCCEEDED);
source.Reply(NICK_IDENTIFY_SUCCEEDED);
if (ircd->vhost)
do_on_id(u);
if (Config->NSModeOnID)
@@ -85,8 +87,8 @@ class CommandNSIdentify : public Command
if (Config->NSForceEmail && u->Account() && u->Account()->email.empty())
{
u->SendMessage(NickServ, NICK_IDENTIFY_EMAIL_REQUIRED);
u->SendMessage(NickServ, NICK_IDENTIFY_EMAIL_HOWTO);
source.Reply(NICK_IDENTIFY_EMAIL_REQUIRED);
source.Reply(NICK_IDENTIFY_EMAIL_HOWTO);
}
if (u->IsIdentified())
+26 -25
View File
@@ -33,10 +33,11 @@ class CommandNSInfo : public Command
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params[0];
User *u = source.u;
const Anope::string &nick = params[0];
NickAlias *na = findnick(nick);
bool has_auspex = u->IsIdentified() && u->Account()->HasPriv("nickserv/auspex");
@@ -45,21 +46,21 @@ class CommandNSInfo : public Command
NickRequest *nr = findrequestnick(nick);
if (nr)
{
u->SendMessage(NickServ, NICK_IS_PREREG);
source.Reply(NICK_IS_PREREG);
if (has_auspex)
u->SendMessage(NickServ, NICK_INFO_EMAIL, nr->email.c_str());
source.Reply(NICK_INFO_EMAIL, nr->email.c_str());
}
else if (nickIsServices(nick, true))
u->SendMessage(NickServ, NICK_X_IS_SERVICES, nick.c_str());
source.Reply(NICK_X_IS_SERVICES, nick.c_str());
else
u->SendMessage(NickServ, NICK_X_NOT_REGISTERED, nick.c_str());
source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
}
else if (na->HasFlag(NS_FORBIDDEN))
{
if (is_oper(u) && !na->last_usermask.empty())
u->SendMessage(NickServ, NICK_X_FORBIDDEN_OPER, nick.c_str(), na->last_usermask.c_str(), !na->last_realname.empty() ? na->last_realname.c_str() : GetString(u, NO_REASON).c_str());
source.Reply(NICK_X_FORBIDDEN_OPER, nick.c_str(), na->last_usermask.c_str(), !na->last_realname.empty() ? na->last_realname.c_str() : GetString(u, NO_REASON).c_str());
else
u->SendMessage(NickServ, NICK_X_FORBIDDEN, nick.c_str());
source.Reply(NICK_X_FORBIDDEN, nick.c_str());
}
else
{
@@ -73,48 +74,48 @@ class CommandNSInfo : public Command
if (has_auspex || (u->Account() && na->nc == u->Account()))
show_hidden = true;
u->SendMessage(NickServ, NICK_INFO_REALNAME, na->nick.c_str(), na->last_realname.c_str());
source.Reply(NICK_INFO_REALNAME, na->nick.c_str(), na->last_realname.c_str());
if (na->nc->IsServicesOper() && (show_hidden || !na->nc->HasFlag(NI_HIDE_STATUS)))
u->SendMessage(NickServ, NICK_INFO_SERVICES_OPERTYPE, na->nick.c_str(), na->nc->ot->GetName().c_str());
source.Reply(NICK_INFO_SERVICES_OPERTYPE, na->nick.c_str(), na->nc->ot->GetName().c_str());
if (nick_online)
{
if (show_hidden || !na->nc->HasFlag(NI_HIDE_MASK))
u->SendMessage(NickServ, NICK_INFO_ADDRESS_ONLINE, na->last_usermask.c_str());
source.Reply(NICK_INFO_ADDRESS_ONLINE, na->last_usermask.c_str());
else
u->SendMessage(NickServ, NICK_INFO_ADDRESS_ONLINE_NOHOST, na->nick.c_str());
source.Reply(NICK_INFO_ADDRESS_ONLINE_NOHOST, na->nick.c_str());
}
else
{
if (show_hidden || !na->nc->HasFlag(NI_HIDE_MASK))
u->SendMessage(NickServ, NICK_INFO_ADDRESS, na->last_usermask.c_str());
source.Reply(NICK_INFO_ADDRESS, na->last_usermask.c_str());
}
u->SendMessage(NickServ, NICK_INFO_TIME_REGGED, do_strftime(na->time_registered).c_str());
source.Reply(NICK_INFO_TIME_REGGED, do_strftime(na->time_registered).c_str());
if (!nick_online)
{
u->SendMessage(NickServ, NICK_INFO_LAST_SEEN, do_strftime(na->last_seen).c_str());
source.Reply(NICK_INFO_LAST_SEEN, do_strftime(na->last_seen).c_str());
}
if (!na->last_quit.empty() && (show_hidden || !na->nc->HasFlag(NI_HIDE_QUIT)))
u->SendMessage(NickServ, NICK_INFO_LAST_QUIT, na->last_quit.c_str());
source.Reply(NICK_INFO_LAST_QUIT, na->last_quit.c_str());
if (!na->nc->email.empty() && (show_hidden || !na->nc->HasFlag(NI_HIDE_EMAIL)))
u->SendMessage(NickServ, NICK_INFO_EMAIL, na->nc->email.c_str());
source.Reply(NICK_INFO_EMAIL, na->nc->email.c_str());
if (show_hidden)
{
if (!Config->s_HostServ.empty() && ircd->vhost && na->hostinfo.HasVhost())
{
if (ircd->vident && !na->hostinfo.GetIdent().empty())
u->SendMessage(NickServ, NICK_INFO_VHOST2, na->hostinfo.GetIdent().c_str(), na->hostinfo.GetHost().c_str());
source.Reply(NICK_INFO_VHOST2, na->hostinfo.GetIdent().c_str(), na->hostinfo.GetHost().c_str());
else
u->SendMessage(NickServ, NICK_INFO_VHOST, na->hostinfo.GetHost().c_str());
source.Reply(NICK_INFO_VHOST, na->hostinfo.GetHost().c_str());
}
if (!na->nc->greet.empty())
u->SendMessage(NickServ, NICK_INFO_GREET, na->nc->greet.c_str());
source.Reply(NICK_INFO_GREET, na->nc->greet.c_str());
Anope::string optbuf;
@@ -124,20 +125,20 @@ class CommandNSInfo : public Command
CheckOptStr(optbuf, NI_MSG, GetString(u, NICK_INFO_OPT_MSG).c_str(), na->nc);
CheckOptStr(optbuf, NI_AUTOOP, GetString(u, NICK_INFO_OPT_AUTOOP).c_str(), na->nc);
u->SendMessage(NickServ, NICK_INFO_OPTIONS, optbuf.empty() ? GetString(u, NICK_INFO_OPT_NONE).c_str() : optbuf.c_str());
source.Reply(NICK_INFO_OPTIONS, optbuf.empty() ? GetString(u, NICK_INFO_OPT_NONE).c_str() : optbuf.c_str());
if (na->nc->HasFlag(NI_SUSPENDED))
{
if (!na->last_quit.empty())
u->SendMessage(NickServ, NICK_INFO_SUSPENDED, na->last_quit.c_str());
source.Reply(NICK_INFO_SUSPENDED, na->last_quit.c_str());
else
u->SendMessage(NickServ, NICK_INFO_SUSPENDED_NO_REASON);
source.Reply(NICK_INFO_SUSPENDED_NO_REASON);
}
if (na->HasFlag(NS_NO_EXPIRE))
u->SendMessage(NickServ, NICK_INFO_NO_EXPIRE);
source.Reply(NICK_INFO_NO_EXPIRE);
else
u->SendMessage(NickServ, NICK_INFO_EXPIRE, do_strftime(na->last_seen + Config->NSExpire).c_str());
source.Reply(NICK_INFO_EXPIRE, do_strftime(na->last_seen + Config->NSExpire).c_str());
}
FOREACH_MOD(I_OnNickInfo, OnNickInfo(u, na, show_hidden));
+10 -8
View File
@@ -21,7 +21,7 @@ class CommandNSList : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
/* SADMINS can search for nicks based on their NS_FORBIDDEN and NS_NO_EXPIRE
* status. The keywords FORBIDDEN and NOEXPIRE represent these two states
@@ -36,6 +36,8 @@ class CommandNSList : public Command
*
* UPDATE: SUSPENDED keyword is now accepted as well.
*/
User *u = source.u;
Anope::string pattern = params[0];
const NickCore *mync;
unsigned nnicks;
@@ -49,7 +51,7 @@ class CommandNSList : public Command
if (Config->NSListOpersOnly && !is_oper(u)) /* reverse the help logic */
{
u->SendMessage(NickServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_STOP;
}
@@ -58,24 +60,24 @@ class CommandNSList : public Command
Anope::string tmp = myStrGetToken(pattern.substr(1), '-', 0); /* Read FROM out */
if (tmp.empty())
{
u->SendMessage(NickServ, LIST_INCORRECT_RANGE);
source.Reply(LIST_INCORRECT_RANGE);
return MOD_CONT;
}
if (!tmp.is_number_only())
{
u->SendMessage(NickServ, LIST_INCORRECT_RANGE);
source.Reply(LIST_INCORRECT_RANGE);
return MOD_CONT;
}
from = convertTo<int>(tmp);
tmp = myStrGetTokenRemainder(pattern, '-', 1); /* Read TO out */
if (tmp.empty())
{
u->SendMessage(NickServ, LIST_INCORRECT_RANGE);
source.Reply(LIST_INCORRECT_RANGE);
return MOD_CONT;
}
if (!tmp.is_number_only())
{
u->SendMessage(NickServ, LIST_INCORRECT_RANGE);
source.Reply(LIST_INCORRECT_RANGE);
return MOD_CONT;
}
to = convertTo<int>(tmp);
@@ -142,7 +144,7 @@ class CommandNSList : public Command
snprintf(buf, sizeof(buf), "%-20s [Suspended]", na->nick.c_str());
else
snprintf(buf, sizeof(buf), "%-20s %s", na->nick.c_str(), na->last_usermask.c_str());
u->SendMessage(Config->s_NickServ, " %c%s", noexpire_char, buf);
source.Reply(" %c%s", noexpire_char, buf);
}
++count;
}
@@ -161,7 +163,7 @@ class CommandNSList : public Command
if ((nr->nick.equals_ci(pattern) || Anope::Match(buf, pattern)) && ++nnicks <= Config->NSListMax)
{
snprintf(buf, sizeof(buf), "%-20s [UNCONFIRMED]", nr->nick.c_str());
u->SendMessage(Config->s_NickServ, " %c%s", noexpire_char, buf);
source.Reply(" %c%s", noexpire_char, buf);
}
}
}
+10 -8
View File
@@ -20,18 +20,20 @@ class CommandNSLogout : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = !params.empty() ? params[0] : "";
Anope::string param = params.size() > 1 ? params[1] : "";
User *u2;
User *u = source.u;
const Anope::string &nick = !params.empty() ? params[0] : "";
const Anope::string &param = params.size() > 1 ? params[1] : "";
User *u2;
if (!u->Account()->IsServicesOper() && !nick.empty())
this->OnSyntaxError(u, "");
else if (!(u2 = (!nick.empty() ? finduser(nick) : u)))
u->SendMessage(NickServ, NICK_X_NOT_IN_USE, nick.c_str());
source.Reply(NICK_X_NOT_IN_USE, nick.c_str());
else if (!nick.empty() && u2->Account() && !u2->Account()->IsServicesOper())
u->SendMessage(NickServ, NICK_LOGOUT_SERVICESADMIN, nick.c_str());
source.Reply(NICK_LOGOUT_SERVICESADMIN, nick.c_str());
else
{
if (!nick.empty() && !param.empty() && param.equals_ci("REVALIDATE"))
@@ -42,9 +44,9 @@ class CommandNSLogout : public Command
/* Remove founder status from this user in all channels */
if (!nick.empty())
u->SendMessage(NickServ, NICK_LOGOUT_X_SUCCEEDED, nick.c_str());
source.Reply(NICK_LOGOUT_X_SUCCEEDED, nick.c_str());
else
u->SendMessage(NickServ, NICK_LOGOUT_SUCCEEDED);
source.Reply(NICK_LOGOUT_SUCCEEDED);
ircdproto->SendAccountLogout(u2, u2->Account());
u2->RemoveMode(NickServ, UMODE_REGISTERED);
+14 -12
View File
@@ -21,23 +21,25 @@ class CommandNSRecover : public Command
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params[0];
User *u = source.u;
const Anope::string &nick = params[0];
Anope::string pass = params.size() > 1 ? params[1] : "";
NickAlias *na;
User *u2;
if (!(u2 = finduser(nick)))
u->SendMessage(NickServ, NICK_X_NOT_IN_USE, nick.c_str());
source.Reply(NICK_X_NOT_IN_USE, nick.c_str());
else if (!(na = findnick(u2->nick)))
u->SendMessage(NickServ, NICK_X_NOT_REGISTERED, nick.c_str());
source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
else if (na->HasFlag(NS_FORBIDDEN))
u->SendMessage(NickServ, NICK_X_FORBIDDEN, na->nick.c_str());
source.Reply(NICK_X_FORBIDDEN, na->nick.c_str());
else if (na->nc->HasFlag(NI_SUSPENDED))
u->SendMessage(NickServ, NICK_X_SUSPENDED, na->nick.c_str());
source.Reply(NICK_X_SUSPENDED, na->nick.c_str());
else if (nick.equals_ci(u->nick))
u->SendMessage(NickServ, NICK_NO_RECOVER_SELF);
source.Reply(NICK_NO_RECOVER_SELF);
else if (!pass.empty())
{
int res = enc_check_password(pass, na->nc->pass);
@@ -50,11 +52,11 @@ class CommandNSRecover : public Command
/* Convert Config->NSReleaseTimeout seconds to string format */
Anope::string relstr = duration(na->nc, Config->NSReleaseTimeout);
u->SendMessage(NickServ, NICK_RECOVERED, Config->s_NickServ.c_str(), nick.c_str(), relstr.c_str());
source.Reply(NICK_RECOVERED, Config->s_NickServ.c_str(), nick.c_str(), relstr.c_str());
}
else
{
u->SendMessage(NickServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
if (!res)
{
Log(LOG_COMMAND, u, this) << "with invalid password for " << nick;
@@ -73,10 +75,10 @@ class CommandNSRecover : public Command
/* Convert Config->NSReleaseTimeout seconds to string format */
Anope::string relstr = duration(na->nc, Config->NSReleaseTimeout);
u->SendMessage(NickServ, NICK_RECOVERED, Config->s_NickServ.c_str(), nick.c_str(), relstr.c_str());
source.Reply(NICK_RECOVERED, Config->s_NickServ.c_str(), nick.c_str(), relstr.c_str());
}
else
u->SendMessage(NickServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
}
return MOD_CONT;
}
+36 -32
View File
@@ -18,8 +18,9 @@ static bool SendRegmail(User *u, NickRequest *nr);
class CommandNSConfirm : public Command
{
protected:
CommandReturn ActuallyConfirmNick(User *u, NickRequest *nr, bool force)
CommandReturn ActuallyConfirmNick(CommandSource &source, NickRequest *nr, bool force)
{
User *u = source.u;
NickAlias *na = new NickAlias(nr->nick, new NickCore(nr->nick));
Anope::string tmp_pass;
@@ -51,23 +52,23 @@ class CommandNSConfirm : public Command
u->Login(na->nc);
Log(LOG_COMMAND, u, this) << "to register " << u->nick << " (email: " << (!nr->email.empty() ? nr->email : "none") << ")";
if (Config->NSAddAccessOnReg)
u->SendMessage(NickServ, NICK_REGISTERED, u->nick.c_str(), na->nc->GetAccess(0).c_str());
source.Reply(NICK_REGISTERED, u->nick.c_str(), na->nc->GetAccess(0).c_str());
else
u->SendMessage(NickServ, NICK_REGISTERED_NO_MASK, u->nick.c_str());
source.Reply(NICK_REGISTERED_NO_MASK, u->nick.c_str());
delete nr;
ircdproto->SendAccountLogin(u, u->Account());
ircdproto->SetAutoIdentificationToken(u);
if (enc_decrypt(na->nc->pass, tmp_pass) == 1)
u->SendMessage(NickServ, NICK_PASSWORD_IS, tmp_pass.c_str());
source.Reply(NICK_PASSWORD_IS, tmp_pass.c_str());
u->lastnickreg = Anope::CurTime;
}
else
{
Log(LOG_COMMAND, u, this) << "to confirm " << u->nick << " (email: " << (!nr->email.empty() ? nr->email : "none") << ")";
u->SendMessage(NickServ, NICK_FORCE_REG, nr->nick.c_str());
source.Reply(NICK_FORCE_REG, nr->nick.c_str());
User *user = finduser(nr->nick);
/* Delrequest must be called before validate_user */
delete nr;
@@ -80,8 +81,9 @@ class CommandNSConfirm : public Command
return MOD_CONT;
}
CommandReturn DoConfirm(User *u, const std::vector<Anope::string> &params)
CommandReturn DoConfirm(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
Anope::string passcode = !params.empty() ? params[0] : "";
NickRequest *nr = findrequestnick(u->nick);
@@ -103,29 +105,29 @@ class CommandNSConfirm : public Command
nr = findrequestnick(passcode);
if (nr)
{
ActuallyConfirmNick(u, nr, true);
ActuallyConfirmNick(source, nr, true);
return MOD_CONT;
}
}
u->SendMessage(NickServ, NICK_CONFIRM_NOT_FOUND, Config->s_NickServ.c_str());
source.Reply(NICK_CONFIRM_NOT_FOUND, Config->s_NickServ.c_str());
return MOD_CONT;
}
if (!nr->passcode.equals_cs(passcode))
{
u->SendMessage(NickServ, NICK_CONFIRM_INVALID);
source.Reply(NICK_CONFIRM_INVALID);
return MOD_CONT;
}
}
if (!nr)
{
u->SendMessage(NickServ, NICK_REGISTRATION_FAILED);
source.Reply(NICK_REGISTRATION_FAILED);
return MOD_CONT;
}
ActuallyConfirmNick(u, nr, false);
ActuallyConfirmNick(source, nr, false);
return MOD_CONT;
}
@@ -135,9 +137,9 @@ class CommandNSConfirm : public Command
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
return this->DoConfirm(u, params);
return this->DoConfirm(source, params);
}
bool OnHelp(User *u, const Anope::string &subcommand)
@@ -167,8 +169,9 @@ class CommandNSRegister : public CommandNSConfirm
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
NickRequest *nr = NULL, *anr = NULL;
NickAlias *na;
size_t prefixlen = Config->NSGuestNickPrefix.length();
@@ -188,19 +191,19 @@ class CommandNSRegister : public CommandNSConfirm
if (readonly)
{
u->SendMessage(NickServ, NICK_REGISTRATION_DISABLED);
source.Reply(NICK_REGISTRATION_DISABLED);
return MOD_CONT;
}
if (!is_oper(u) && Config->NickRegDelay && Anope::CurTime - u->my_signon < Config->NickRegDelay)
{
u->SendMessage(NickServ, NICK_REG_DELAY, Config->NickRegDelay);
source.Reply(NICK_REG_DELAY, Config->NickRegDelay);
return MOD_CONT;
}
if ((anr = findrequestnick(u->nick)))
{
u->SendMessage(NickServ, NICK_REQUESTED);
source.Reply(NICK_REQUESTED);
return MOD_CONT;
}
@@ -211,13 +214,13 @@ class CommandNSRegister : public CommandNSConfirm
*/
if (nicklen <= prefixlen + 7 && nicklen >= prefixlen + 1 && !u->nick.find_ci(Config->NSGuestNickPrefix) && !u->nick.substr(prefixlen).find_first_not_of("1234567890"))
{
u->SendMessage(NickServ, NICK_CANNOT_BE_REGISTERED, u->nick.c_str());
source.Reply(NICK_CANNOT_BE_REGISTERED, u->nick.c_str());
return MOD_CONT;
}
if (!ircdproto->IsNickValid(u->nick))
{
u->SendMessage(NickServ, NICK_X_FORBIDDEN, u->nick.c_str());
source.Reply(NICK_X_FORBIDDEN, u->nick.c_str());
return MOD_CONT;
}
@@ -228,7 +231,7 @@ class CommandNSRegister : public CommandNSConfirm
if (u->nick.find_ci(nick) != Anope::string::npos && !is_oper(u))
{
u->SendMessage(NickServ, NICK_CANNOT_BE_REGISTERED, u->nick.c_str());
source.Reply(NICK_CANNOT_BE_REGISTERED, u->nick.c_str());
return MOD_CONT;
}
}
@@ -236,24 +239,24 @@ class CommandNSRegister : public CommandNSConfirm
if (Config->NSForceEmail && email.empty())
this->OnSyntaxError(u, "");
else if (Anope::CurTime < u->lastnickreg + Config->NSRegDelay)
u->SendMessage(NickServ, NICK_REG_PLEASE_WAIT, (u->lastnickreg + Config->NSRegDelay) - Anope::CurTime);
source.Reply(NICK_REG_PLEASE_WAIT, (u->lastnickreg + Config->NSRegDelay) - Anope::CurTime);
else if ((na = findnick(u->nick)))
{
/* i.e. there's already such a nick regged */
if (na->HasFlag(NS_FORBIDDEN))
{
Log(NickServ) << u->GetMask() << " tried to register FORBIDden nick " << u->nick;
u->SendMessage(NickServ, NICK_CANNOT_BE_REGISTERED, u->nick.c_str());
source.Reply(NICK_CANNOT_BE_REGISTERED, u->nick.c_str());
}
else
u->SendMessage(NickServ, NICK_ALREADY_REGISTERED, u->nick.c_str());
source.Reply(NICK_ALREADY_REGISTERED, u->nick.c_str());
}
else if (pass.equals_ci(u->nick) || (Config->StrictPasswords && pass.length() < 5))
u->SendMessage(NickServ, MORE_OBSCURE_PASSWORD);
source.Reply(MORE_OBSCURE_PASSWORD);
else if (pass.length() > Config->PassLen)
u->SendMessage(NickServ, PASSWORD_TOO_LONG);
source.Reply(PASSWORD_TOO_LONG);
else if (!email.empty() && !MailValidate(email))
u->SendMessage(NickServ, MAIL_X_INVALID, email.c_str());
source.Reply(MAIL_X_INVALID, email.c_str());
else
{
for (idx = 0; idx < 9; ++idx)
@@ -269,13 +272,13 @@ class CommandNSRegister : public CommandNSConfirm
{
if (SendRegmail(u, nr))
{
u->SendMessage(NickServ, NICK_ENTER_REG_CODE, email.c_str(), Config->s_NickServ.c_str(), Config->s_NickServ.c_str());
source.Reply(NICK_ENTER_REG_CODE, email.c_str(), Config->s_NickServ.c_str(), Config->s_NickServ.c_str());
Log(LOG_COMMAND, u, this) << "send registration verification code to " << nr->email;
}
else
{
Log(LOG_COMMAND, u, this) << "unable to send registration verification mail";
u->SendMessage(NickServ, NICK_REG_UNABLE);
source.Reply(NICK_REG_UNABLE);
delete nr;
return MOD_CONT;
}
@@ -283,7 +286,7 @@ class CommandNSRegister : public CommandNSConfirm
else
{
std::vector<Anope::string> empty_params;
return this->DoConfirm(u, empty_params);
return this->DoConfirm(source, empty_params);
}
}
@@ -318,8 +321,9 @@ class CommandNSResend : public Command
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
NickRequest *nr = NULL;
if (Config->NSEmailReg)
{
@@ -327,13 +331,13 @@ class CommandNSResend : public Command
{
if (Anope::CurTime < nr->lastmail + Config->NSResendDelay)
{
u->SendMessage(NickServ, MAIL_LATER);
source.Reply(MAIL_LATER);
return MOD_CONT;
}
if (!SendRegmail(u, nr))
{
nr->lastmail = Anope::CurTime;
u->SendMessage(NickServ, NICK_REG_RESENT, nr->email.c_str());
source.Reply(NICK_REG_RESENT, nr->email.c_str());
Log(LOG_COMMAND, u, this) << "resend registration verification code for " << nr->nick;
}
else
+11 -10
View File
@@ -21,31 +21,32 @@ class CommandNSRelease : public Command
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params[0];
User *u = source.u;
const Anope::string &nick = params[0];
Anope::string pass = params.size() > 1 ? params[1] : "";
NickAlias *na;
if (!(na = findnick(nick)))
u->SendMessage(NickServ, NICK_X_NOT_REGISTERED, nick.c_str());
source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
else if (na->HasFlag(NS_FORBIDDEN))
u->SendMessage(NickServ, NICK_X_FORBIDDEN, na->nick.c_str());
source.Reply(NICK_X_FORBIDDEN, na->nick.c_str());
else if (na->nc->HasFlag(NI_SUSPENDED))
u->SendMessage(NickServ, NICK_X_SUSPENDED, na->nick.c_str());
source.Reply(NICK_X_SUSPENDED, na->nick.c_str());
else if (!na->HasFlag(NS_HELD))
u->SendMessage(NickServ, NICK_RELEASE_NOT_HELD, nick.c_str());
source.Reply(NICK_RELEASE_NOT_HELD, nick.c_str());
else if (!pass.empty())
{
int res = enc_check_password(pass, na->nc->pass);
if (res == 1)
{
Log(LOG_COMMAND, u, this) << "released " << na->nick;
u->SendMessage(NickServ, NICK_RELEASED);
source.Reply(NICK_RELEASED);
}
else
{
u->SendMessage(NickServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
if (!res)
{
Log(LOG_COMMAND, u, this) << "invalid password for " << nick;
@@ -59,10 +60,10 @@ class CommandNSRelease : public Command
if (u->Account() == na->nc || (!na->nc->HasFlag(NI_SECURE) && is_on_access(u, na->nc)))
{
na->Release();
u->SendMessage(NickServ, NICK_RELEASED);
source.Reply(NICK_RELEASED);
}
else
u->SendMessage(NickServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
}
return MOD_CONT;
}
+10 -9
View File
@@ -23,22 +23,23 @@ class CommandNSResetPass : public Command
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
NickAlias *na;
if (Config->RestrictMail && (!u->Account() || !u->Account()->HasCommand("nickserv/resetpass")))
u->SendMessage(NickServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
if (!(na = findnick(params[0])))
u->SendMessage(NickServ, NICK_X_NOT_REGISTERED, params[0].c_str());
source.Reply(NICK_X_NOT_REGISTERED, params[0].c_str());
else if (na->HasFlag(NS_FORBIDDEN))
u->SendMessage(NickServ, NICK_X_FORBIDDEN, na->nick.c_str());
source.Reply(NICK_X_FORBIDDEN, na->nick.c_str());
else
{
if (SendResetEmail(u, na))
{
Log(LOG_COMMAND, u, this) << "for " << na->nick << " (group: " << na->nc->display << ")";
u->SendMessage(NickServ, NICK_RESETPASS_COMPLETE, na->nick.c_str());
source.Reply(NICK_RESETPASS_COMPLETE, na->nick.c_str());
}
}
@@ -82,7 +83,7 @@ class NSResetPass : public Module
EventReturn OnPreCommand(User *u, BotInfo *service, const Anope::string &command, const std::vector<Anope::string> &params)
{
if (service == findbot(Config->s_NickServ) && command.equals_ci("CONFIRM") && !params.empty())
if (service == NickServ && command.equals_ci("CONFIRM") && !params.empty())
{
NickAlias *na = findnick(u->nick);
@@ -94,7 +95,7 @@ class NSResetPass : public Module
{
na->nc->Shrink("ns_resetpass_code");
na->nc->Shrink("ns_resetpass_time");
u->SendMessage(NickServ, NICK_CONFIRM_EXPIRED);
u->SendMessage(service, NICK_CONFIRM_EXPIRED);
return EVENT_STOP;
}
@@ -114,7 +115,7 @@ class NSResetPass : public Module
FOREACH_MOD(I_OnNickIdentify, OnNickIdentify(u));
Log(LOG_COMMAND, u, &commandnsresetpass) << "confirmed RESETPASS to forcefully identify to " << na->nick;
u->SendMessage(NickServ, NICK_CONFIRM_SUCCESS, Config->s_NickServ.c_str());
u->SendMessage(service, NICK_CONFIRM_SUCCESS, Config->s_NickServ.c_str());
if (ircd->vhost)
do_on_id(u);
@@ -125,7 +126,7 @@ class NSResetPass : public Module
else
{
Log(LOG_COMMAND, u, &commandnsresetpass) << "invalid confirm passcode for " << na->nick;
u->SendMessage(NickServ, NICK_CONFIRM_INVALID);
u->SendMessage(service, NICK_CONFIRM_INVALID);
bad_password(u);
}
+20 -17
View File
@@ -28,24 +28,25 @@ class CommandNSSASet : public Command
this->subcommands.clear();
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params[0];
Anope::string cmd = params[1];
User *u = source.u;
const Anope::string &nick = params[0];
const Anope::string &cmd = params[1];
if (readonly)
{
u->SendMessage(NickServ, NICK_SET_DISABLED);
source.Reply(NICK_SET_DISABLED);
return MOD_CONT;
}
NickAlias *na = findnick(nick);
if (!na)
u->SendMessage(NickServ, NICK_SASET_BAD_NICK, nick.c_str());
source.Reply(NICK_SASET_BAD_NICK, nick.c_str());
else if (na->HasFlag(NS_FORBIDDEN))
u->SendMessage(NickServ, NICK_X_FORBIDDEN, na->nick.c_str());
source.Reply(NICK_X_FORBIDDEN, na->nick.c_str());
else if (na->nc->HasFlag(NI_SUSPENDED))
u->SendMessage(NickServ, NICK_X_SUSPENDED, na->nick.c_str());
source.Reply(NICK_X_SUSPENDED, na->nick.c_str());
else
{
Command *c = this->FindCommand(params[1]);
@@ -63,7 +64,7 @@ class CommandNSSASet : public Command
mod_run_cmd(NickServ, u, c, params[1], cmdparams, false);
}
else
u->SendMessage(NickServ, NICK_SASET_UNKNOWN_OPTION, cmd.c_str());
source.Reply(NICK_SASET_UNKNOWN_OPTION, cmd.c_str());
}
return MOD_CONT;
@@ -128,8 +129,9 @@ class CommandNSSASetDisplay : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
NickAlias *setter_na = findnick(params[0]);
if (!setter_na)
throw CoreException("NULL na in CommandNSSASetDisplay");
@@ -138,7 +140,7 @@ class CommandNSSASetDisplay : public Command
NickAlias *na = findnick(params[1]);
if (!na || na->nc != nc)
{
u->SendMessage(NickServ, NICK_SASET_DISPLAY_INVALID, nc->display.c_str());
source.Reply(NICK_SASET_DISPLAY_INVALID, nc->display.c_str());
return MOD_CONT;
}
@@ -172,8 +174,9 @@ class CommandNSSASetPassword : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
NickAlias *setter_na = findnick(params[0]);
if (!setter_na)
throw CoreException("NULL na in CommandNSSASetPassword");
@@ -183,32 +186,32 @@ class CommandNSSASetPassword : public Command
if (Config->NSSecureAdmins && u->Account() != nc && nc->IsServicesOper())
{
u->SendMessage(NickServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
else if (nc->display.equals_ci(params[1]) || (Config->StrictPasswords && len < 5))
{
u->SendMessage(NickServ, MORE_OBSCURE_PASSWORD);
source.Reply(MORE_OBSCURE_PASSWORD);
return MOD_CONT;
}
else if (len > Config->PassLen)
{
u->SendMessage(NickServ, PASSWORD_TOO_LONG);
source.Reply(PASSWORD_TOO_LONG);
return MOD_CONT;
}
if (enc_encrypt(params[1], nc->pass))
{
Log(NickServ) << "Failed to encrypt password for " << nc->display << " (saset)";
u->SendMessage(NickServ, NICK_SASET_PASSWORD_FAILED, nc->display.c_str());
source.Reply(NICK_SASET_PASSWORD_FAILED, nc->display.c_str());
return MOD_CONT;
}
Anope::string tmp_pass;
if (enc_decrypt(nc->pass, tmp_pass) == 1)
u->SendMessage(NickServ, NICK_SASET_PASSWORD_CHANGED_TO, nc->display.c_str(), tmp_pass.c_str());
source.Reply(NICK_SASET_PASSWORD_CHANGED_TO, nc->display.c_str(), tmp_pass.c_str());
else
u->SendMessage(NickServ, NICK_SASET_PASSWORD_CHANGED, nc->display.c_str());
source.Reply(NICK_SASET_PASSWORD_CHANGED, nc->display.c_str());
if (Config->WallSetpass)
ircdproto->SendGlobops(NickServ, "\2%s\2 used SASET PASSWORD on \2%s\2", u->nick.c_str(), nc->display.c_str());
+4 -3
View File
@@ -20,8 +20,9 @@ class CommandNSSASetNoexpire : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
NickAlias *na = findnick(params[0]);
if (!na)
throw CoreException("NULL na in CommandNSSASsetNoexpire");
@@ -31,12 +32,12 @@ class CommandNSSASetNoexpire : public Command
if (param.equals_ci("ON"))
{
na->SetFlag(NS_NO_EXPIRE);
u->SendMessage(NickServ, NICK_SASET_NOEXPIRE_ON, na->nick.c_str());
source.Reply(NICK_SASET_NOEXPIRE_ON, na->nick.c_str());
}
else if (param.equals_ci("OFF"))
{
na->UnsetFlag(NS_NO_EXPIRE);
u->SendMessage(NickServ, NICK_SASET_NOEXPIRE_OFF, na->nick.c_str());
source.Reply(NICK_SASET_NOEXPIRE_OFF, na->nick.c_str());
}
else
this->OnSyntaxError(u, "NOEXPIRE");
+8 -7
View File
@@ -23,17 +23,18 @@ class CommandNSSendPass : public Command
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string nick = params[0];
User *u = source.u;
const Anope::string &nick = params[0];
NickAlias *na;
if (Config->RestrictMail && (!u->Account() || !u->Account()->HasCommand("nickserv/sendpass")))
u->SendMessage(NickServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
else if (!(na = findnick(nick)))
u->SendMessage(NickServ, NICK_X_NOT_REGISTERED, nick.c_str());
source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
else if (na->HasFlag(NS_FORBIDDEN))
u->SendMessage(NickServ, NICK_X_FORBIDDEN, na->nick.c_str());
source.Reply(NICK_X_FORBIDDEN, na->nick.c_str());
else
{
Anope::string tmp_pass;
@@ -42,11 +43,11 @@ class CommandNSSendPass : public Command
if (SendPassMail(u, na, tmp_pass))
{
Log(Config->RestrictMail ? LOG_ADMIN : LOG_COMMAND, u, this) << "for " << na->nick;
u->SendMessage(NickServ, NICK_SENDPASS_OK, nick.c_str());
source.Reply(NICK_SENDPASS_OK, nick.c_str());
}
}
else
u->SendMessage(NickServ, NICK_SENDPASS_UNAVAILABLE);
source.Reply(NICK_SENDPASS_UNAVAILABLE);
}
return MOD_CONT;
+17 -13
View File
@@ -28,17 +28,19 @@ class CommandNSSet : public Command
this->subcommands.clear();
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
if (readonly)
{
u->SendMessage(NickServ, NICK_SET_DISABLED);
source.Reply(NICK_SET_DISABLED);
return MOD_CONT;
}
if (u->Account()->HasFlag(NI_SUSPENDED))
{
u->SendMessage(NickServ, NICK_X_SUSPENDED, u->Account()->display.c_str());
source.Reply(NICK_X_SUSPENDED, u->Account()->display.c_str());
return MOD_CONT;
}
@@ -57,7 +59,7 @@ class CommandNSSet : public Command
mod_run_cmd(NickServ, u, c, params[0], cmdparams, false);
}
else
u->SendMessage(NickServ, NICK_SET_UNKNOWN_OPTION, params[0].c_str());
source.Reply(NICK_SET_UNKNOWN_OPTION, params[0].c_str());
return MOD_CONT;
}
@@ -121,13 +123,14 @@ class CommandNSSetDisplay : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
NickAlias *na = findnick(params[1]);
if (!na || na->nc != u->Account())
{
u->SendMessage(NickServ, NICK_SASET_DISPLAY_INVALID, u->Account()->display.c_str());
source.Reply(NICK_SASET_DISPLAY_INVALID, u->Account()->display.c_str());
return MOD_CONT;
}
@@ -161,35 +164,36 @@ class CommandNSSetPassword : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
Anope::string param = params[1];
User *u = source.u;
const Anope::string &param = params[1];
unsigned len = param.length();
if (u->Account()->display.equals_ci(param) || (Config->StrictPasswords && len < 5))
{
u->SendMessage(NickServ, MORE_OBSCURE_PASSWORD);
source.Reply(MORE_OBSCURE_PASSWORD);
return MOD_CONT;
}
else if (len > Config->PassLen)
{
u->SendMessage(NickServ, PASSWORD_TOO_LONG);
source.Reply(PASSWORD_TOO_LONG);
return MOD_CONT;
}
if (enc_encrypt(param, u->Account()->pass) < 0)
{
Log(NickServ) << "Failed to encrypt password for " << u->Account()->display << " (set)";
u->SendMessage(NickServ, NICK_SASET_PASSWORD_FAILED);
source.Reply(NICK_SASET_PASSWORD_FAILED);
return MOD_CONT;
}
Anope::string tmp_pass;
if (enc_decrypt(u->Account()->pass, tmp_pass) == 1)
u->SendMessage(NickServ, NICK_SASET_PASSWORD_CHANGED_TO, u->Account()->display.c_str(), tmp_pass.c_str());
source.Reply(NICK_SASET_PASSWORD_CHANGED_TO, u->Account()->display.c_str(), tmp_pass.c_str());
else
u->SendMessage(NickServ, NICK_SASET_PASSWORD_CHANGED, u->Account()->display.c_str());
source.Reply(NICK_SASET_PASSWORD_CHANGED, u->Account()->display.c_str());
return MOD_CONT;
}
+4 -3
View File
@@ -20,8 +20,9 @@ class CommandNSSetAutoOp : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
NickAlias *na = findnick(params[0]);
if (!na)
throw CoreException("NULL na in CommandNSSetAutoOp");
@@ -32,12 +33,12 @@ class CommandNSSetAutoOp : public Command
if (param.equals_ci("ON"))
{
nc->SetFlag(NI_AUTOOP);
u->SendMessage(NickServ, NICK_SASET_AUTOOP_ON, nc->display.c_str());
source.Reply(NICK_SASET_AUTOOP_ON, nc->display.c_str());
}
else if (param.equals_ci("OFF"))
{
nc->UnsetFlag(NI_AUTOOP);
u->SendMessage(NickServ, NICK_SASET_AUTOOP_OFF, nc->display.c_str());
source.Reply(NICK_SASET_AUTOOP_OFF, nc->display.c_str());
}
else
this->OnSyntaxError(u, "AUTOOP");
+7 -6
View File
@@ -20,8 +20,9 @@ class CommandNSSetEmail : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
User *u = source.u;
NickAlias *na = findnick(params[0]);
if (!na)
throw CoreException("NULL na in CommandNSSetEmail");
@@ -31,29 +32,29 @@ class CommandNSSetEmail : public Command
if (param.empty() && Config->NSForceEmail)
{
u->SendMessage(NickServ, NICK_SET_EMAIL_UNSET_IMPOSSIBLE);
source.Reply(NICK_SET_EMAIL_UNSET_IMPOSSIBLE);
return MOD_CONT;
}
else if (Config->NSSecureAdmins && u->Account() != nc && nc->IsServicesOper())
{
u->SendMessage(NickServ, ACCESS_DENIED);
source.Reply(ACCESS_DENIED);
return MOD_CONT;
}
else if (!param.empty() && !MailValidate(param))
{
u->SendMessage(NickServ, MAIL_X_INVALID, param.c_str());
source.Reply(MAIL_X_INVALID, param.c_str());
return MOD_CONT;
}
if (!param.empty())
{
nc->email = param;
u->SendMessage(NickServ, NICK_SASET_EMAIL_CHANGED, nc->display.c_str(), param.c_str());
source.Reply(NICK_SASET_EMAIL_CHANGED, nc->display.c_str(), param.c_str());
}
else
{
nc->email.clear();
u->SendMessage(NickServ, NICK_SASET_EMAIL_UNSET, nc->display.c_str());
source.Reply(NICK_SASET_EMAIL_UNSET, nc->display.c_str());
}
return MOD_CONT;
+3 -3
View File
@@ -20,7 +20,7 @@ class CommandNSSetGreet : public Command
{
}
CommandReturn Execute(User *u, const std::vector<Anope::string> &params)
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> &params)
{
NickAlias *na = findnick(params[0]);
if (!na)
@@ -32,12 +32,12 @@ class CommandNSSetGreet : public Command
if (!param.empty())
{
nc->greet = param;
u->SendMessage(NickServ, NICK_SASET_GREET_CHANGED, nc->display.c_str(), nc->greet.c_str());
source.Reply(NICK_SASET_GREET_CHANGED, nc->display.c_str(), nc->greet.c_str());
}
else
{
nc->greet.clear();
u->SendMessage(NickServ, NICK_SASET_GREET_UNSET, nc->display.c_str());
source.Reply(NICK_SASET_GREET_UNSET, nc->display.c_str());
}
return MOD_CONT;

Some files were not shown because too many files have changed in this diff Show More