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:
@@ -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
@@ -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> ¶ms) = 0;
|
||||
|
||||
/** Called when HELP is requsted for the client this command is on.
|
||||
* @param u The user requesting help
|
||||
|
||||
+2
-3
@@ -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> ¶ms) { 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> ¶ms) { }
|
||||
virtual void OnPostCommand(CommandSource &source, Command *command, const std::vector<Anope::string> ¶ms) { }
|
||||
|
||||
/** Called after the core has finished loading the databases, but before
|
||||
* we connect to the server
|
||||
|
||||
@@ -20,26 +20,27 @@ class CommandBSAct : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -20,42 +20,41 @@ class CommandBSAssign : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -16,70 +16,70 @@
|
||||
class CommandBSBot : public Command
|
||||
{
|
||||
private:
|
||||
CommandReturn DoAdd(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn DoAdd(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn DoChange(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn DoDel(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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, "");
|
||||
|
||||
@@ -20,13 +20,14 @@ class CommandBSBotList : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -22,8 +22,9 @@ class CommandBSHelp : public Command
|
||||
this->SetFlag(CFLAG_STRIP_CHANNEL);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
User *u = source.u;
|
||||
mod_help_cmd(findbot(Config->s_BotServ), u, params[0]);
|
||||
return MOD_CONT;
|
||||
}
|
||||
|
||||
+56
-55
@@ -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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -21,25 +21,26 @@ class CommandBSKick : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -20,30 +20,28 @@ class CommandBSSay : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -21,47 +21,45 @@ class CommandBSSet : public Command
|
||||
this->SetFlag(CFLAG_STRIP_CHANNEL);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,27 +20,28 @@ class CommandBSUnassign : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -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> ¶ms)
|
||||
CommandReturn DoAdd(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn DoDel(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn DoList(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn DoView(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn DoSet(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn DoDisable(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -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> ¶ms)
|
||||
void DoAdd(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
void DoDel(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
void DoList(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
void DoView(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -20,39 +20,35 @@ class CommandCSBan : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -20,20 +20,22 @@ class CommandCSClearUsers : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -20,33 +20,35 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
|
||||
{
|
||||
|
||||
@@ -22,14 +22,16 @@ class CommandCSDrop : public Command
|
||||
this->SetFlag(CFLAG_ALLOW_SUSPENDED);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,13 +21,13 @@ class CommandCSForbid : public Command
|
||||
this->SetFlag(CFLAG_ALLOW_UNREGISTEREDCHANNEL);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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 */
|
||||
|
||||
@@ -20,23 +20,23 @@ class CommandCSGetKey : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,9 +22,9 @@ class CommandCSHelp : public Command
|
||||
this->SetFlag(CFLAG_STRIP_CHANNEL);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
mod_help_cmd(ChanServ, u, params[0]);
|
||||
mod_help_cmd(ChanServ, source.u, params[0]);
|
||||
|
||||
return MOD_CONT;
|
||||
}
|
||||
|
||||
+17
-15
@@ -34,20 +34,22 @@ class CommandCSInfo : public Command
|
||||
this->SetFlag(CFLAG_ALLOW_FORBIDDEN);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -20,16 +20,17 @@ class CommandCSInvite : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -20,35 +20,31 @@ class CommandCSKick : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -22,8 +22,10 @@ public:
|
||||
this->SetFlag(CFLAG_STRIP_CHANNEL);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -15,8 +15,10 @@
|
||||
|
||||
class CommandCSMode : public Command
|
||||
{
|
||||
void DoLock(User *u, ChannelInfo *ci, const std::vector<Anope::string> ¶ms)
|
||||
void DoLock(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
User *u = source.u;
|
||||
ChannelInfo *ci = source.ci;
|
||||
const Anope::string &subcommand = params[2];
|
||||
const Anope::string ¶m = 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> ¶ms)
|
||||
void DoSet(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -68,8 +68,9 @@ class CommandCSOp : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
User *u = source.u;
|
||||
ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OWNER);
|
||||
|
||||
if (!cm)
|
||||
|
||||
@@ -21,32 +21,33 @@ class CommandCSRegister : public Command
|
||||
this->SetFlag(CFLAG_ALLOW_UNREGISTEREDCHANNEL);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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 */
|
||||
|
||||
@@ -28,18 +28,20 @@ class CommandCSSASet : public Command
|
||||
this->subcommands.clear();
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
|
||||
@@ -20,21 +20,22 @@ class CommandCSSASetNoexpire : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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");
|
||||
|
||||
@@ -28,23 +28,25 @@ class CommandCSSet : public Command
|
||||
this->subcommands.clear();
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
|
||||
@@ -20,9 +20,9 @@ class CommandCSSetBanType : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
|
||||
@@ -20,9 +20,10 @@ class CommandCSSetDescription : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
ChannelInfo *ci = cs_findchan(params[0]);
|
||||
User *u = source.u;
|
||||
ChannelInfo *ci = source.ci;
|
||||
if (!ci)
|
||||
throw CoreException("NULL ci in CommandCSSetDescription");
|
||||
|
||||
|
||||
@@ -20,15 +20,16 @@ class CommandCSSetFounder : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,21 +20,22 @@ class CommandCSSetKeepTopic : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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");
|
||||
|
||||
@@ -20,21 +20,22 @@ class CommandCSSetOpNotice : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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");
|
||||
|
||||
@@ -20,21 +20,22 @@ class CommandCSSetPeace : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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");
|
||||
|
||||
@@ -20,9 +20,10 @@ class CommandCSSetPersist : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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");
|
||||
|
||||
@@ -20,21 +20,22 @@ class CommandCSSetPrivate : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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");
|
||||
|
||||
@@ -19,9 +19,10 @@ class CommandCSSetRestricted : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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");
|
||||
|
||||
@@ -20,21 +20,22 @@ class CommandCSSetSecure : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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");
|
||||
|
||||
@@ -20,27 +20,28 @@ class CommandCSSetSecureFounder : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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");
|
||||
|
||||
@@ -20,21 +20,22 @@ class CommandCSSetSecureOps : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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");
|
||||
|
||||
@@ -20,9 +20,10 @@ class CommandCSSetSignKick : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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");
|
||||
|
||||
@@ -20,15 +20,16 @@ class CommandCSSetSuccessor : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -20,21 +20,22 @@ class CommandCSSetTopicLock : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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");
|
||||
|
||||
@@ -21,15 +21,17 @@ class CommandCSSetXOP : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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");
|
||||
|
||||
@@ -20,27 +20,17 @@ class CommandCSStatus : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -20,13 +20,13 @@ class CommandCSSuspend : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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));
|
||||
|
||||
|
||||
@@ -20,18 +20,18 @@ class CommandCSTopic : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -20,39 +20,40 @@ class CommandCSUnban : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -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> ¶ms, ChannelInfo *ci, int level, LanguageString *messages)
|
||||
CommandReturn DoAdd(CommandSource &source, const std::vector<Anope::string> ¶ms, 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> ¶ms, ChannelInfo *ci, int level, LanguageString *messages)
|
||||
CommandReturn DoDel(CommandSource &source, const std::vector<Anope::string> ¶ms, 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> ¶ms, ChannelInfo *ci, int level, LanguageString *messages)
|
||||
CommandReturn DoList(CommandSource &source, const std::vector<Anope::string> ¶ms, 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> ¶ms, int level, LanguageString *messages)
|
||||
CommandReturn DoXop(CommandSource &source, const std::vector<Anope::string> ¶ms, 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> ¶ms) = 0;
|
||||
virtual CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) = 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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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)
|
||||
|
||||
@@ -20,24 +20,26 @@ class CommandHSDel : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,15 +20,16 @@ class CommandHSDelAll : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,19 +20,20 @@ class CommandHSGroup : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -21,9 +21,9 @@ class CommandHSHelp : public Command
|
||||
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
mod_help_cmd(HostServ, u, params[0]);
|
||||
mod_help_cmd(HostServ, source.u, params[0]);
|
||||
return MOD_CONT;
|
||||
}
|
||||
|
||||
|
||||
+13
-11
@@ -20,9 +20,11 @@ class CommandHSList : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -20,17 +20,18 @@ class CommandHSOff : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
|
||||
@@ -20,15 +20,16 @@ class CommandHSOn : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -20,27 +20,26 @@ class CommandHSSet : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -20,23 +20,24 @@ class CommandHSSetAll : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,33 +22,34 @@ class CommandMSCancel : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -20,46 +20,48 @@ class CommandMSCheck : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
|
||||
@@ -21,9 +21,9 @@ class CommandMSHelp : public Command
|
||||
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
mod_help_cmd(MemoServ, u, params[0]);
|
||||
mod_help_cmd(MemoServ, source.u, params[0]);
|
||||
return MOD_CONT;
|
||||
}
|
||||
|
||||
|
||||
+13
-11
@@ -20,8 +20,10 @@ class CommandMSIgnore : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -20,12 +20,14 @@ class CommandMSInfo : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,16 +20,18 @@ class CommandMSRSend : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
|
||||
@@ -20,10 +20,11 @@ class CommandMSSend : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -20,13 +20,14 @@ class CommandMSSendAll : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -16,57 +16,61 @@
|
||||
class CommandMSSet : public Command
|
||||
{
|
||||
private:
|
||||
CommandReturn DoNotify(User *u, const std::vector<Anope::string> ¶ms, MemoInfo *mi)
|
||||
CommandReturn DoNotify(CommandSource &source, const std::vector<Anope::string> ¶ms, MemoInfo *mi)
|
||||
{
|
||||
Anope::string param = params[1];
|
||||
User *u = source.u;
|
||||
const Anope::string ¶m = 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> ¶ms, MemoInfo *mi)
|
||||
CommandReturn DoLimit(CommandSource &source, const std::vector<Anope::string> ¶ms, 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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,13 +20,14 @@ class CommandMSStaff : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -16,37 +16,39 @@
|
||||
class CommandNSAccess : public Command
|
||||
{
|
||||
private:
|
||||
CommandReturn DoServAdminList(User *u, const std::vector<Anope::string> ¶ms, NickCore *nc)
|
||||
CommandReturn DoServAdminList(CommandSource &source, const std::vector<Anope::string> ¶ms, 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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ class CommandNSAList : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
/*
|
||||
* 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
@@ -21,13 +21,14 @@ class CommandNSDrop : public Command
|
||||
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,11 +20,11 @@ class CommandNSForbid : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
|
||||
@@ -24,9 +24,10 @@ class CommandNSGetEMail : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,9 +20,10 @@ class CommandNSGetPass : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -21,39 +21,41 @@ class CommandNSGhost : public Command
|
||||
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -21,71 +21,71 @@ class CommandNSGroup : public Command
|
||||
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -21,9 +21,9 @@ class CommandNSHelp : public Command
|
||||
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
mod_help_cmd(NickServ, u, params[0]);
|
||||
mod_help_cmd(NickServ, source.u, params[0]);
|
||||
return MOD_CONT;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,9 +21,11 @@ class CommandNSIdentify : public Command
|
||||
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -33,10 +33,11 @@ class CommandNSInfo : public Command
|
||||
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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));
|
||||
|
||||
@@ -21,7 +21,7 @@ class CommandNSList : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
/* 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,18 +20,20 @@ class CommandNSLogout : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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 ¶m = 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
@@ -21,23 +21,25 @@ class CommandNSRecover : public Command
|
||||
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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> ¶ms)
|
||||
CommandReturn DoConfirm(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -21,31 +21,32 @@ class CommandNSRelease : public Command
|
||||
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -23,22 +23,23 @@ class CommandNSResetPass : public Command
|
||||
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
{
|
||||
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
@@ -28,24 +28,25 @@ class CommandNSSASet : public Command
|
||||
this->subcommands.clear();
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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());
|
||||
|
||||
@@ -20,8 +20,9 @@ class CommandNSSASetNoexpire : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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");
|
||||
|
||||
@@ -23,17 +23,18 @@ class CommandNSSendPass : public Command
|
||||
this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
@@ -28,17 +28,19 @@ class CommandNSSet : public Command
|
||||
this->subcommands.clear();
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
Anope::string param = params[1];
|
||||
User *u = source.u;
|
||||
|
||||
const Anope::string ¶m = 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;
|
||||
}
|
||||
|
||||
@@ -20,8 +20,9 @@ class CommandNSSetAutoOp : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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");
|
||||
|
||||
@@ -20,8 +20,9 @@ class CommandNSSetEmail : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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;
|
||||
|
||||
@@ -20,7 +20,7 @@ class CommandNSSetGreet : public Command
|
||||
{
|
||||
}
|
||||
|
||||
CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms)
|
||||
CommandReturn Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
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
Reference in New Issue
Block a user