summaryrefslogtreecommitdiff
path: root/modules/core
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2011-08-05 05:35:31 -0400
committerAdam <Adam@anope.org>2011-08-05 05:35:31 -0400
commite66063e6304538d34c40460ca0aa2be5ddb6bdec (patch)
treef50fe31097160f8f794669809e4f4ef87f477672 /modules/core
parent9ec18a3b020932eee6242c878149c484f49b13cb (diff)
Rewrote the example configurations and split them
up into seperate files for each pseudo client. Also reorganized how the modules are stored, and made most of the old "extra" modules "core"
Diffstat (limited to 'modules/core')
-rw-r--r--modules/core/botserv.h63
-rw-r--r--modules/core/bs_assign.cpp168
-rw-r--r--modules/core/bs_badwords.cpp331
-rw-r--r--modules/core/bs_bot.cpp414
-rw-r--r--modules/core/bs_botlist.cpp91
-rw-r--r--modules/core/bs_control.cpp158
-rw-r--r--modules/core/bs_info.cpp244
-rw-r--r--modules/core/bs_kick.cpp1011
-rw-r--r--modules/core/bs_main.cpp204
-rw-r--r--modules/core/bs_set.cpp307
-rw-r--r--modules/core/cs_access.cpp915
-rw-r--r--modules/core/cs_akick.cpp564
-rw-r--r--modules/core/cs_ban.cpp109
-rw-r--r--modules/core/cs_clearusers.cpp83
-rw-r--r--modules/core/cs_clone.cpp186
-rw-r--r--modules/core/cs_drop.cpp102
-rw-r--r--modules/core/cs_flags.cpp455
-rw-r--r--modules/core/cs_getkey.cpp80
-rw-r--r--modules/core/cs_info.cpp142
-rw-r--r--modules/core/cs_invite.cpp102
-rw-r--r--modules/core/cs_kick.cpp91
-rw-r--r--modules/core/cs_list.cpp136
-rw-r--r--modules/core/cs_main.cpp143
-rw-r--r--modules/core/cs_mode.cpp364
-rw-r--r--modules/core/cs_modes.cpp431
-rw-r--r--modules/core/cs_register.cpp193
-rw-r--r--modules/core/cs_saset.cpp74
-rw-r--r--modules/core/cs_saset_noexpire.cpp81
-rw-r--r--modules/core/cs_set.cpp74
-rw-r--r--modules/core/cs_set_bantype.cpp98
-rw-r--r--modules/core/cs_set_description.cpp89
-rw-r--r--modules/core/cs_set_founder.cpp105
-rw-r--r--modules/core/cs_set_keeptopic.cpp94
-rw-r--r--modules/core/cs_set_opnotice.cpp93
-rw-r--r--modules/core/cs_set_peace.cpp93
-rw-r--r--modules/core/cs_set_persist.cpp180
-rw-r--r--modules/core/cs_set_private.cpp93
-rw-r--r--modules/core/cs_set_restricted.cpp91
-rw-r--r--modules/core/cs_set_secure.cpp94
-rw-r--r--modules/core/cs_set_securefounder.cpp95
-rw-r--r--modules/core/cs_set_secureops.cpp92
-rw-r--r--modules/core/cs_set_signkick.cpp104
-rw-r--r--modules/core/cs_set_successor.cpp119
-rw-r--r--modules/core/cs_set_topiclock.cpp92
-rw-r--r--modules/core/cs_suspend.cpp158
-rw-r--r--modules/core/cs_topic.cpp84
-rw-r--r--modules/core/cs_unban.cpp94
-rw-r--r--modules/core/cs_xop.cpp880
-rw-r--r--modules/core/db_mysql.cpp1566
-rw-r--r--modules/core/db_mysql_live.cpp287
-rw-r--r--modules/core/db_plain.cpp908
-rw-r--r--modules/core/enc_md5.cpp372
-rw-r--r--modules/core/enc_none.cpp74
-rw-r--r--modules/core/enc_old.cpp382
-rw-r--r--modules/core/enc_sha1.cpp222
-rw-r--r--modules/core/enc_sha256.cpp314
-rw-r--r--modules/core/gl_global.cpp64
-rw-r--r--modules/core/gl_main.cpp93
-rw-r--r--modules/core/global.h20
-rw-r--r--modules/core/help.cpp130
-rw-r--r--modules/core/hs_del.cpp107
-rw-r--r--modules/core/hs_group.cpp80
-rw-r--r--modules/core/hs_list.cpp137
-rw-r--r--modules/core/hs_main.cpp85
-rw-r--r--modules/core/hs_off.cpp67
-rw-r--r--modules/core/hs_on.cpp77
-rw-r--r--modules/core/hs_set.cpp236
-rw-r--r--modules/core/memoserv.h41
-rw-r--r--modules/core/ms_cancel.cpp77
-rw-r--r--modules/core/ms_check.cpp89
-rw-r--r--modules/core/ms_del.cpp163
-rw-r--r--modules/core/ms_ignore.cpp110
-rw-r--r--modules/core/ms_info.cpp219
-rw-r--r--modules/core/ms_list.cpp168
-rw-r--r--modules/core/ms_main.cpp228
-rw-r--r--modules/core/ms_read.cpp195
-rw-r--r--modules/core/ms_rsend.cpp106
-rw-r--r--modules/core/ms_send.cpp70
-rw-r--r--modules/core/ms_sendall.cpp74
-rw-r--r--modules/core/ms_set.cpp313
-rw-r--r--modules/core/ms_staff.cpp71
-rw-r--r--modules/core/nickserv.h15
-rw-r--r--modules/core/ns_access.cpp195
-rw-r--r--modules/core/ns_ajoin.cpp239
-rw-r--r--modules/core/ns_alist.cpp96
-rw-r--r--modules/core/ns_cert.cpp231
-rw-r--r--modules/core/ns_drop.cpp130
-rw-r--r--modules/core/ns_getemail.cpp82
-rw-r--r--modules/core/ns_getpass.cpp79
-rw-r--r--modules/core/ns_ghost.cpp122
-rw-r--r--modules/core/ns_group.cpp305
-rw-r--r--modules/core/ns_identify.cpp93
-rw-r--r--modules/core/ns_info.cpp173
-rw-r--r--modules/core/ns_list.cpp169
-rw-r--r--modules/core/ns_logout.cpp97
-rw-r--r--modules/core/ns_main.cpp307
-rw-r--r--modules/core/ns_recover.cpp132
-rw-r--r--modules/core/ns_register.cpp355
-rw-r--r--modules/core/ns_release.cpp110
-rw-r--r--modules/core/ns_resetpass.cpp152
-rw-r--r--modules/core/ns_saset.cpp173
-rw-r--r--modules/core/ns_saset_noexpire.cpp76
-rw-r--r--modules/core/ns_sendpass.cpp108
-rw-r--r--modules/core/ns_set.cpp158
-rw-r--r--modules/core/ns_set_autoop.cpp107
-rw-r--r--modules/core/ns_set_email.cpp186
-rw-r--r--modules/core/ns_set_greet.cpp108
-rw-r--r--modules/core/ns_set_hide.cpp149
-rw-r--r--modules/core/ns_set_kill.cpp149
-rw-r--r--modules/core/ns_set_language.cpp121
-rw-r--r--modules/core/ns_set_message.cpp114
-rw-r--r--modules/core/ns_set_private.cpp114
-rw-r--r--modules/core/ns_set_secure.cpp114
-rw-r--r--modules/core/ns_status.cpp94
-rw-r--r--modules/core/ns_suspend.cpp160
-rw-r--r--modules/core/ns_update.cpp70
-rw-r--r--modules/core/os_akill.cpp464
-rw-r--r--modules/core/os_chankill.cpp120
-rw-r--r--modules/core/os_config.cpp217
-rw-r--r--modules/core/os_forbid.cpp342
-rw-r--r--modules/core/os_forbid.h37
-rw-r--r--modules/core/os_ignore.cpp350
-rw-r--r--modules/core/os_ignore.h39
-rw-r--r--modules/core/os_jupe.cpp79
-rw-r--r--modules/core/os_kick.cpp83
-rw-r--r--modules/core/os_kill.cpp72
-rw-r--r--modules/core/os_list.cpp187
-rw-r--r--modules/core/os_login.cpp97
-rw-r--r--modules/core/os_main.cpp371
-rw-r--r--modules/core/os_mode.cpp109
-rw-r--r--modules/core/os_modinfo.cpp245
-rw-r--r--modules/core/os_module.cpp202
-rw-r--r--modules/core/os_news.cpp450
-rw-r--r--modules/core/os_news.h39
-rw-r--r--modules/core/os_noop.cpp94
-rw-r--r--modules/core/os_oline.cpp83
-rw-r--r--modules/core/os_oper.cpp219
-rw-r--r--modules/core/os_reload.cpp72
-rw-r--r--modules/core/os_session.cpp749
-rw-r--r--modules/core/os_session.h32
-rw-r--r--modules/core/os_set.cpp261
-rw-r--r--modules/core/os_shutdown.cpp117
-rw-r--r--modules/core/os_stats.cpp224
-rw-r--r--modules/core/os_svsnick.cpp92
-rw-r--r--modules/core/os_sxline.cpp807
-rw-r--r--modules/core/os_update.cpp56
146 files changed, 0 insertions, 28601 deletions
diff --git a/modules/core/botserv.h b/modules/core/botserv.h
deleted file mode 100644
index 5fa03f870..000000000
--- a/modules/core/botserv.h
+++ /dev/null
@@ -1,63 +0,0 @@
-#ifndef BOTSERV_H
-#define BOTSERV_H
-
-struct UserData
-{
- UserData()
- {
- this->Clear();
- }
-
- void Clear()
- {
- last_use = last_start = Anope::CurTime;
- lines = times = 0;
- lastline.clear();
- }
-
- /* Data validity */
- time_t last_use;
-
- /* for flood kicker */
- int16 lines;
- time_t last_start;
-
- /* for repeat kicker */
- Anope::string lastline;
- Anope::string lasttarget;
- int16 times;
-};
-
-struct BanData
-{
- Anope::string mask;
- time_t last_use;
- int16 ttb[TTB_SIZE];
-
- BanData()
- {
- this->Clear();
- }
-
- void Clear()
- {
- last_use = 0;
- for (int i = 0; i < TTB_SIZE; ++i)
- this->ttb[i] = 0;
- }
-};
-
-class BotServService : public Service
-{
- public:
- BotServService(Module *m) : Service(m, "BotServ") { }
-
- virtual UserData *GetUserData(User *u, Channel *c) = 0;
-
- virtual BanData *GetBanData(User *u, Channel *c) = 0;
-};
-
-static service_reference<BotServService> botserv("BotServ");
-
-#endif // BOTSERV_H
-
diff --git a/modules/core/bs_assign.cpp b/modules/core/bs_assign.cpp
deleted file mode 100644
index 803368994..000000000
--- a/modules/core/bs_assign.cpp
+++ /dev/null
@@ -1,168 +0,0 @@
-/* BotServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandBSAssign : public Command
-{
- public:
- CommandBSAssign(Module *creator) : Command(creator, "botserv/assign", 2, 2)
- {
- this->SetDesc(_("Assigns a bot to a channel"));
- this->SetSyntax(_("\037channel\037 \037nick\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &chan = params[0];
- const Anope::string &nick = params[1];
-
- User *u = source.u;
-
- if (readonly)
- {
- source.Reply(BOT_ASSIGN_READONLY);
- return;
- }
-
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- BotInfo *bi = findbot(nick);
- if (!bi)
- {
- source.Reply(BOT_DOES_NOT_EXIST, nick.c_str());
- return;
- }
-
- if (ci->botflags.HasFlag(BS_NOBOT) || (!ci->HasPriv(u, CA_ASSIGN) && !u->HasPriv("botserv/administration")))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (bi->HasFlag(BI_PRIVATE) && !u->HasCommand("botserv/botserv/assign/private"))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (ci->bi == bi)
- {
- source.Reply(_("Bot \002%s\002 is already assigned to channel \002%s\002."), ci->bi->nick.c_str(), chan.c_str());
- return;
- }
-
- bool override = !ci->HasPriv(u, CA_ASSIGN);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "for " << bi->nick;
-
- bi->Assign(u, ci);
- source.Reply(_("Bot \002%s\002 has been assigned to %s."), bi->nick.c_str(), ci->name.c_str());
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Assigns a bot pointed out by nick to the channel chan. You\n"
- "can then configure the bot for the channel so it fits\n"
- "your needs."));
- return true;
- }
-};
-
-class CommandBSUnassign : public Command
-{
- public:
- CommandBSUnassign(Module *creator) : Command(creator, "botserv/unassign", 1, 1)
- {
- this->SetDesc(_("Unassigns a bot from a channel"));
- this->SetSyntax(_("\037channel\037 \037nick\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- if (readonly)
- {
- source.Reply(BOT_ASSIGN_READONLY);
- return;
- }
-
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (!u->HasPriv("botserv/administration") && !ci->HasPriv(u, CA_ASSIGN))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (!ci->bi)
- {
- source.Reply(BOT_NOT_ASSIGNED);
- return;
- }
-
- if (ci->HasFlag(CI_PERSIST) && !ModeManager::FindChannelModeByName(CMODE_PERM))
- {
- source.Reply(_("You can not unassign bots while persist is set on the channel."));
- return;
- }
-
- bool override = !ci->HasPriv(u, CA_ASSIGN);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "for " << ci->bi->nick;
-
- ci->bi->UnAssign(u, ci);
- source.Reply(_("There is no bot assigned to %s anymore."), ci->name.c_str());
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Unassigns a bot from a channel. When you use this command,\n"
- "the bot won't join the channel anymore. However, bot\n"
- "configuration for the channel is kept, so you will always\n"
- "be able to reassign a bot later without have to reconfigure\n"
- "it entirely."));
- return true;
- }
-};
-
-class BSAssign : public Module
-{
- CommandBSAssign commandbsassign;
- CommandBSUnassign commandbsunassign;
-
- public:
- BSAssign(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandbsassign(this), commandbsunassign(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandbsassign);
- ModuleManager::RegisterService(&commandbsunassign);
- }
-};
-
-MODULE_INIT(BSAssign)
diff --git a/modules/core/bs_badwords.cpp b/modules/core/bs_badwords.cpp
deleted file mode 100644
index a27dca2d4..000000000
--- a/modules/core/bs_badwords.cpp
+++ /dev/null
@@ -1,331 +0,0 @@
-/* BotServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class BadwordsListCallback : public NumberList
-{
- CommandSource &source;
- ChannelInfo *ci;
- bool SentHeader;
- public:
- BadwordsListCallback(CommandSource &_source, ChannelInfo *_ci, const Anope::string &list) : NumberList(list, false), source(_source), ci(_ci), SentHeader(false)
- {
- }
-
- ~BadwordsListCallback()
- {
- if (!SentHeader)
- source.Reply(_("No matching entries on %s bad words list."), ci->name.c_str());
- }
-
- void HandleNumber(unsigned Number)
- {
- if (!Number || Number > ci->GetBadWordCount())
- return;
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Bad words list for %s:\n"
- " Num Word Type"), ci->name.c_str());
- }
-
- DoList(source, Number - 1, ci->GetBadWord(Number - 1));
- }
-
- static void DoList(CommandSource &source, unsigned Number, BadWord *bw)
- {
- source.Reply(_(" %3d %-30s %s"), 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
-{
- CommandSource &source;
- ChannelInfo *ci;
- Command *c;
- unsigned Deleted;
- bool override;
- public:
- BadwordsDelCallback(CommandSource &_source, ChannelInfo *_ci, Command *_c, const Anope::string &list) : NumberList(list, true), source(_source), ci(_ci), c(_c), Deleted(0), override(false)
- {
- if (!ci->HasPriv(source.u, CA_BADWORDS) && source.u->HasPriv("botserv/administration"))
- this->override = true;
- }
-
- ~BadwordsDelCallback()
- {
- if (!Deleted)
- source.Reply(_("No matching entries on %s bad words list."), ci->name.c_str());
- else if (Deleted == 1)
- source.Reply(_("Deleted 1 entry from %s bad words list."), ci->name.c_str());
- else
- source.Reply(_("Deleted %d entries from %s bad words list."), Deleted, ci->name.c_str());
- }
-
- void HandleNumber(unsigned Number)
- {
- if (!Number || Number > ci->GetBadWordCount())
- return;
-
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, c, ci) << "DEL " << ci->GetBadWord(Number - 1)->word;
- ++Deleted;
- ci->EraseBadWord(Number - 1);
- }
-};
-
-class CommandBSBadwords : public Command
-{
- private:
- void DoList(CommandSource &source, ChannelInfo *ci, const Anope::string &word)
- {
- bool override = !ci->HasPriv(source.u, CA_BADWORDS);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, this, ci) << "LIST";
-
- if (!ci->GetBadWordCount())
- source.Reply(_("%s bad words list is empty."), ci->name.c_str());
- else if (!word.empty() && word.find_first_not_of("1234567890,-") == Anope::string::npos)
- {
- BadwordsListCallback list(source, ci, word);
- list.Process();
- }
- else
- {
- bool SentHeader = false;
-
- for (unsigned i = 0, end = ci->GetBadWordCount(); i < end; ++i)
- {
- BadWord *bw = ci->GetBadWord(i);
-
- if (!word.empty() && !Anope::Match(bw->word, word))
- continue;
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Bad words list for %s:\n"
- " Num Word Type"), ci->name.c_str());
-
- }
-
- BadwordsListCallback::DoList(source, i, bw);
- }
-
- if (!SentHeader)
- source.Reply(_("No matching entries on %s bad words list."), ci->name.c_str());
- }
-
- return;
- }
-
- void DoAdd(CommandSource &source, ChannelInfo *ci, const Anope::string &word)
- {
- size_t pos = word.rfind(' ');
- BadWordType type = BW_ANY;
- Anope::string realword = word;
-
- if (pos != Anope::string::npos)
- {
- Anope::string opt = word.substr(pos + 1);
- if (!opt.empty())
- {
- if (opt.equals_ci("SINGLE"))
- type = BW_SINGLE;
- else if (opt.equals_ci("START"))
- type = BW_START;
- else if (opt.equals_ci("END"))
- type = BW_END;
- }
- realword = word.substr(0, pos);
- }
-
- if (ci->GetBadWordCount() >= Config->BSBadWordsMax)
- {
- source.Reply(_("Sorry, you can only have %d bad words entries on a channel."), Config->BSBadWordsMax);
- return;
- }
-
- for (unsigned i = 0, end = ci->GetBadWordCount(); i < end; ++i)
- {
- BadWord *bw = ci->GetBadWord(i);
-
- if (!bw->word.empty() && ((Config->BSCaseSensitive && realword.equals_cs(bw->word)) || (!Config->BSCaseSensitive && realword.equals_ci(bw->word))))
- {
- source.Reply(_("\002%s\002 already exists in %s bad words list."), bw->word.c_str(), ci->name.c_str());
- return;
- }
- }
-
- bool override = !ci->HasPriv(source.u, CA_BADWORDS);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, this, ci) << "ADD " << realword;
- ci->AddBadWord(realword, type);
-
- source.Reply(_("\002%s\002 added to %s bad words list."), realword.c_str(), ci->name.c_str());
-
- return;
- }
-
- void DoDelete(CommandSource &source, ChannelInfo *ci, const Anope::string &word)
- {
- /* 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(source, ci, this, word);
- list.Process();
- }
- else
- {
- unsigned i, end;
- BadWord *badword;
-
- for (i = 0, end = ci->GetBadWordCount(); i < end; ++i)
- {
- badword = ci->GetBadWord(i);
-
- if (word.equals_ci(badword->word))
- break;
- }
-
- if (i == end)
- {
- source.Reply(_("\002%s\002 not found on %s bad words list."), word.c_str(), ci->name.c_str());
- return;
- }
-
- bool override = !ci->HasPriv(source.u, CA_BADWORDS);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, this, ci) << "DEL " << badword->word;
-
- source.Reply(_("\002%s\002 deleted from %s bad words list."), badword->word.c_str(), ci->name.c_str());
-
- ci->EraseBadWord(i);
- }
-
- return;
- }
-
- void DoClear(CommandSource &source, ChannelInfo *ci)
- {
- bool override = !ci->HasPriv(source.u, CA_BADWORDS);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, this, ci) << "CLEAR";
-
- ci->ClearBadWords();
- source.Reply(_("Bad words list is now empty."));
- return;
- }
- public:
- CommandBSBadwords(Module *creator) : Command(creator, "botserv/badwords", 2, 3)
- {
- this->SetDesc(_("Maintains bad words list"));
- this->SetSyntax(_("\037channel\037 ADD \037word\037 [\037SINGLE\037 | \037START\037 | \037END\037]"));
- this->SetSyntax(_("\037channel\037 DEL {\037word\037 | \037entry-num\037 | \037list\037}"));
- this->SetSyntax(_("\037channel\037 LIST [\037mask\037 | \037list\037]"));
- this->SetSyntax(_("\037channel\037 CLEAR"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &cmd = params[1];
- const Anope::string &word = params.size() > 2 ? params[2] : "";
- User *u = source.u;
- bool need_args = cmd.equals_ci("LIST") || cmd.equals_ci("CLEAR");
-
- if (!need_args && word.empty())
- {
- this->OnSyntaxError(source, cmd);
- return;
- }
-
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
-
- if (!ci->HasPriv(u, CA_BADWORDS) && (!need_args || !u->HasPriv("botserv/administration")))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (readonly)
- {
- source.Reply(_("Sorry, channel bad words list modification is temporarily disabled."));
- return;
- }
-
- if (cmd.equals_ci("ADD"))
- return this->DoAdd(source, ci, word);
- else if (cmd.equals_ci("DEL"))
- return this->DoDelete(source, ci, word);
- else if (cmd.equals_ci("LIST"))
- return this->DoList(source, ci, word);
- else if (cmd.equals_ci("CLEAR"))
- return this->DoClear(source, ci);
- else
- this->OnSyntaxError(source, "");
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Maintains the \002bad words list\002 for a channel. The bad\n"
- "words list determines which words are to be kicked\n"
- "when the bad words kicker is enabled. For more information,\n"
- "type \002%s%s HELP KICK %s\002.\n"
- " \n"
- "The \002ADD\002 command adds the given word to the\n"
- "badword list. If SINGLE is specified, a kick will be\n"
- "done only if a user says the entire word. If START is \n"
- "specified, a kick will be done if a user says a word\n"
- "that starts with \037word\037. If END is specified, a kick\n"
- "will be done if a user says a word that ends with\n"
- "\037word\037. If you don't specify anything, a kick will\n"
- "be issued every time \037word\037 is said by a user.\n"
- " \n"), Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str(), source.command.c_str());
- source.Reply(_("The \002DEL\002 command removes the given word from the\n"
- "bad words list. If a list of entry numbers is given, those\n"
- "entries are deleted. (See the example for LIST below.)\n"
- " \n"
- "The \002LIST\002 command displays the bad words list. If\n"
- "a wildcard mask is given, only those entries matching the\n"
- "mask are displayed. If a list of entry numbers is given,\n"
- "only those entries are shown; for example:\n"
- " \002#channel LIST 2-5,7-9\002\n"
- " Lists bad words entries numbered 2 through 5 and\n"
- " 7 through 9.\n"
- " \n"
- "The \002CLEAR\002 command clears all entries of the\n"
- "bad words list."));
- return true;
- }
-};
-
-class BSBadwords : public Module
-{
- CommandBSBadwords commandbsbadwords;
-
- public:
- BSBadwords(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandbsbadwords(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandbsbadwords);
- }
-};
-
-MODULE_INIT(BSBadwords)
diff --git a/modules/core/bs_bot.cpp b/modules/core/bs_bot.cpp
deleted file mode 100644
index 7500d1926..000000000
--- a/modules/core/bs_bot.cpp
+++ /dev/null
@@ -1,414 +0,0 @@
-/* BotServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandBSBot : public Command
-{
- private:
- void DoAdd(CommandSource &source, const std::vector<Anope::string> &params)
- {
- 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))
- {
- source.Reply(_("Bot \002%s\002 already exists."), nick.c_str());
- return;
- }
-
- if (nick.length() > Config->NickLen)
- {
- source.Reply(_("Bot Nicks may only contain valid nick characters."));
- return;
- }
-
- if (user.length() > Config->UserLen)
- {
- source.Reply(_("Bot Idents may only contain %d characters."), Config->UserLen);
- return;
- }
-
- if (host.length() > Config->HostLen)
- {
- source.Reply(_("Bot Hosts may only contain %d characters."), Config->HostLen);
- return;
- }
-
- /* Check the nick is valid re RFC 2812 */
- if (isdigit(nick[0]) || nick[0] == '-')
- {
- source.Reply(_("Bot Nicks may only contain valid nick characters."));
- return;
- }
-
- for (unsigned i = 0, end = nick.length(); i < end && i < Config->NickLen; ++i)
- if (!isvalidnick(nick[i]))
- {
- source.Reply(_("Bot Nicks may only contain valid nick characters."));
- return;
- }
-
- /* check for hardcored ircd forbidden nicks */
- if (!ircdproto->IsNickValid(nick))
- {
- source.Reply(_("Bot Nicks may only contain valid nick characters."));
- return;
- }
-
- /* Check the host is valid re RFC 2812 */
- if (!isValidHost(host, 3))
- {
- source.Reply(_("Bot Hosts may only contain valid host characters."));
- return;
- }
-
- for (unsigned i = 0, end = user.length(); i < end && i < Config->UserLen; ++i)
- if (!isalnum(user[i]))
- {
- source.Reply(_("Bot Idents may only contain valid characters."), Config->UserLen);
- return;
- }
-
- /* We check whether the nick is registered, and inform the user
- * if so. You need to drop the nick manually before you can use
- * it as a bot nick from now on -GD
- */
- if (findnick(nick))
- {
- source.Reply(NICK_ALREADY_REGISTERED, nick.c_str());
- return;
- }
-
- bi = new BotInfo(nick, user, host, real);
-
- Log(LOG_ADMIN, source.u, this) << "ADD " << bi->GetMask() << " " << bi->realname;
-
- source.Reply(_("%s!%s@%s (%s) added to the bot list."), bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str(), bi->realname.c_str());
-
- FOREACH_MOD(I_OnBotCreate, OnBotCreate(bi));
- return;
- }
-
- void DoChange(CommandSource &source, const std::vector<Anope::string> &params)
- {
- 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(source, "CHANGE");
- return;
- }
-
- if (!(bi = findbot(oldnick)))
- {
- source.Reply(BOT_DOES_NOT_EXIST, oldnick.c_str());
- return;
- }
-
- if (!oldnick.equals_ci(nick) && nickIsServices(oldnick, false))
- {
- source.Reply(BOT_DOES_NOT_EXIST, oldnick.c_str());
- return;
- }
-
- if (nick.length() > Config->NickLen)
- {
- source.Reply(_("Bot Nicks may only contain valid nick characters."));
- return;
- }
-
- if (!user.empty() && user.length() > Config->UserLen)
- {
- source.Reply(_("Bot Idents may only contain %d characters."), Config->UserLen);
- return;
- }
-
- if (!host.empty() && host.length() > Config->HostLen)
- {
- source.Reply(_("Bot Hosts may only contain %d characters."), Config->HostLen);
- return;
- }
-
- if (!oldnick.equals_ci(nick) && nickIsServices(nick, false))
- {
- source.Reply(BOT_DOES_NOT_EXIST, oldnick.c_str());
- return;
- }
-
- /* Checks whether there *are* changes.
- * Case sensitive because we may want to change just the case.
- * And we must finally check that the nick is not already
- * taken by another bot.
- */
- 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))
- {
- source.Reply(_("Old info is equal to the new one."));
- return;
- }
-
- /* Check the nick is valid re RFC 2812 */
- if (isdigit(nick[0]) || nick[0] == '-')
- {
- source.Reply(_("Bot Nicks may only contain valid nick characters."));
- return;
- }
-
- for (unsigned i = 0, end = nick.length(); i < end && i < Config->NickLen; ++i)
- if (!isvalidnick(nick[i]))
- {
- source.Reply(_("Bot Nicks may only contain valid nick characters."));
- return;
- }
-
- /* check for hardcored ircd forbidden nicks */
- if (!ircdproto->IsNickValid(nick))
- {
- source.Reply(_("Bot Nicks may only contain valid nick characters."));
- return;
- }
-
- if (!host.empty() && !isValidHost(host, 3))
- {
- source.Reply(_("Bot Hosts may only contain valid host characters."));
- return;
- }
-
- if (!user.empty())
- for (unsigned i = 0, end = user.length(); i < end && i < Config->UserLen; ++i)
- if (!isalnum(user[i]))
- {
- source.Reply(_("Bot Idents may only contain valid characters."), Config->UserLen);
- return;
- }
-
- if (!nick.equals_ci(bi->nick) && findbot(nick))
- {
- source.Reply(_("Bot \002%s\002 already exists."), nick.c_str());
- return;
- }
-
- if (!nick.equals_ci(bi->nick))
- {
- /* We check whether the nick is registered, and inform the user
- * if so. You need to drop the nick manually before you can use
- * it as a bot nick from now on -GD
- */
- if (findnick(nick))
- {
- source.Reply(NICK_ALREADY_REGISTERED, nick.c_str());
- return;
- }
-
- /* The new nick is really different, so we remove the Q line for the old nick. */
- if (ircd->sqline)
- {
- XLine x(bi->nick);
- ircdproto->SendSQLineDel(&x);
- }
-
- /* Add a Q line for the new nick */
- XLine x(nick, "Reserved for services");
- ircdproto->SendSQLine(NULL, &x);
- }
-
- if (!user.empty())
- ircdproto->SendQuit(bi, "Quit: Be right back");
- else
- {
- ircdproto->SendChangeBotNick(bi, nick);
- }
-
- if (!nick.equals_cs(bi->nick))
- bi->SetNewNick(nick);
-
- if (!user.empty() && !user.equals_cs(bi->GetIdent()))
- bi->SetIdent(user);
- if (!host.empty() && !host.equals_cs(bi->host))
- bi->host = host;
- if (!real.empty() && !real.equals_cs(bi->realname))
- bi->realname = real;
-
- if (!user.empty())
- {
- ircdproto->SendClientIntroduction(bi, ircd->pseudoclient_mode);
- bi->RejoinAll();
- }
-
- source.Reply(_("Bot \002%s\002 has been changed to %s!%s@%s (%s)"), 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;
- }
-
- void DoDel(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &nick = params[1];
- BotInfo *bi;
-
- if (nick.empty())
- {
- this->OnSyntaxError(source, "DEL");
- return;
- }
-
- if (!(bi = findbot(nick)))
- {
- source.Reply(BOT_DOES_NOT_EXIST, nick.c_str());
- return;
- }
-
- if (nickIsServices(nick, false))
- {
- source.Reply(BOT_DOES_NOT_EXIST, nick.c_str());
- return;
- }
-
- FOREACH_MOD(I_OnBotDelete, OnBotDelete(bi));
-
- Log(LOG_ADMIN, source.u, this) << "DEL " << bi->nick;
-
- source.Reply(_("Bot \002%s\002 has been deleted."), nick.c_str());
- delete bi;
- return;
- }
- public:
- CommandBSBot(Module *creator) : Command(creator, "botserv/bot", 1, 6)
- {
- this->SetDesc(_("Maintains network bot list"));
- this->SetSyntax(_("\002ADD \037nick\037 \037user\037 \037host\037 \037real\037\002"));
- this->SetSyntax(_("\002CHANGE \037oldnick\037 \037newnick\037 [\037user\037 [\037host\037 [\037real\037]]]\002"));
- this->SetSyntax(_("\002DEL \037nick\037\002"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &cmd = params[0];
- User *u = source.u;
-
- if (readonly)
- {
- source.Reply(_("Sorry, bot modification is temporarily disabled."));
- return;
- }
-
- if (cmd.equals_ci("ADD"))
- {
- // ADD nick user host real - 5
- if (!u->HasCommand("botserv/bot/add"))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (params.size() < 5)
- {
- this->OnSyntaxError(source, "ADD");
- return;
- }
-
- std::vector<Anope::string> tempparams = params;
- // ADD takes less params than CHANGE, so we need to take 6 if given and append it with a space to 5.
- if (tempparams.size() >= 6)
- tempparams[4] = tempparams[4] + " " + tempparams[5];
-
- return this->DoAdd(source, tempparams);
- }
- else if (cmd.equals_ci("CHANGE"))
- {
- // CHANGE oldn newn user host real - 6
- // but only oldn and newn are required
- if (!u->HasCommand("botserv/bot/change"))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (params.size() < 3)
- {
- this->OnSyntaxError(source, "CHANGE");
- return;
- }
-
- return this->DoChange(source, params);
- }
- else if (cmd.equals_ci("DEL"))
- {
- // DEL nick
- if (!u->HasCommand("botserv/bot/del"))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (params.size() < 1)
- {
- this->OnSyntaxError(source, "DEL");
- return;
- }
-
- return this->DoDel(source, params);
- }
- else
- this->OnSyntaxError(source, "");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows Services Operators to create, modify, and delete\n"
- "bots that users will be able to use on their own\n"
- "channels.\n"
- " \n"
- "\002BOT ADD\002 adds a bot with the given nickname, username,\n"
- "hostname and realname. Since no integrity checks are done \n"
- "for these settings, be really careful.\n"
- "\002BOT CHANGE\002 allows to change nickname, username, hostname\n"
- "or realname of a bot without actually delete it (and all\n"
- "the data associated with it).\n"
- "\002BOT DEL\002 removes the given bot from the bot list. \n"
- " \n"
- "\002Note\002: you cannot create a bot that has a nick that is\n"
- "currently registered. If an unregistered user is currently\n"
- "using the nick, they will be killed."));
- return true;
- }
-};
-
-class BSBot : public Module
-{
- CommandBSBot commandbsbot;
-
- public:
- BSBot(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandbsbot(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandbsbot);
- }
-};
-
-MODULE_INIT(BSBot)
diff --git a/modules/core/bs_botlist.cpp b/modules/core/bs_botlist.cpp
deleted file mode 100644
index ee7e4d2d8..000000000
--- a/modules/core/bs_botlist.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-/* BotServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandBSBotList : public Command
-{
- public:
- CommandBSBotList(Module *creator) : Command(creator, "botserv/botlist", 0, 0)
- {
- this->SetDesc(_("Lists available bots"));
- this->SetSyntax("");
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- unsigned count = 0;
-
- for (Anope::insensitive_map<BotInfo *>::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it)
- {
- BotInfo *bi = it->second;
-
- if (!bi->HasFlag(BI_PRIVATE))
- {
- if (!count)
- source.Reply(_("Bot list:"));
- ++count;
- source.Reply(" %-15s (%s@%s)", bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str());
- }
- }
-
- if (u->HasCommand("botserv/botserv/botlist") && count < BotListByNick.size())
- {
- source.Reply(_("Bots reserved to IRC operators:"));
-
- for (Anope::insensitive_map<BotInfo *>::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it)
- {
- BotInfo *bi = it->second;
-
- if (bi->HasFlag(BI_PRIVATE))
- {
- source.Reply(" %-15s (%s@%s)", bi->nick.c_str(), bi->GetIdent().c_str(), bi->host.c_str());
- ++count;
- }
- }
- }
-
- if (!count)
- source.Reply(_("There are no bots available at this time.\n"
- "Ask a Services Operator to create one!"));
- else
- source.Reply(_("%d bots available."), count);
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Lists all available bots on this network."));
- return true;
- }
-};
-
-class BSBotList : public Module
-{
- CommandBSBotList commandbsbotlist;
-
- public:
- BSBotList(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandbsbotlist(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandbsbotlist);
- }
-};
-
-MODULE_INIT(BSBotList)
diff --git a/modules/core/bs_control.cpp b/modules/core/bs_control.cpp
deleted file mode 100644
index 16a5b372a..000000000
--- a/modules/core/bs_control.cpp
+++ /dev/null
@@ -1,158 +0,0 @@
-/* BotServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandBSSay : public Command
-{
- public:
- CommandBSSay(Module *creator) : Command(creator, "botserv/say", 2, 2)
- {
- this->SetDesc(_("Makes the bot say the given text on the given channel"));
- this->SetSyntax(_("\037channel\037 \037text\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &text = params[1];
-
- User *u = source.u;
-
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (!ci->HasPriv(u, CA_SAY))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (!ci->bi)
- {
- source.Reply(BOT_NOT_ASSIGNED);
- return;
- }
-
- if (!ci->c || !ci->c->FindUser(ci->bi))
- {
- source.Reply(BOT_NOT_ON_CHANNEL, ci->name.c_str());
- return;
- }
-
- if (text[0] == '\001')
- {
- this->OnSyntaxError(source, "");
- return;
- }
-
- ircdproto->SendPrivmsg(ci->bi, ci->name, "%s", text.c_str());
- ci->bi->lastmsg = Anope::CurTime;
-
- // XXX need a way to find if someone is overriding this
- Log(LOG_COMMAND, u, this, ci) << text;
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Makes the bot say the given text on the given channel."));
- return true;
- }
-};
-
-class CommandBSAct : public Command
-{
- public:
- CommandBSAct(Module *creator) : Command(creator, "botserv/act", 2, 2)
- {
- this->SetDesc(_("Makes the bot do the equivalent of a \"/me\" command"));
- this->SetSyntax(_("\037channel\037 \037text\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- Anope::string message = params[1];
-
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (!ci->HasPriv(u, CA_SAY))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (!ci->bi)
- {
- source.Reply(BOT_NOT_ASSIGNED);
- return;
- }
-
- if (!ci->c || !ci->c->FindUser(ci->bi))
- {
- source.Reply(BOT_NOT_ON_CHANNEL, ci->name.c_str());
- return;
- }
-
- size_t i = 0;
- while ((i = message.find(1)) && i != Anope::string::npos)
- message.erase(i, 1);
-
- ircdproto->SendAction(ci->bi, ci->name, "%s", message.c_str());
- ci->bi->lastmsg = Anope::CurTime;
-
- // XXX Need to be able to find if someone is overriding this.
- Log(LOG_COMMAND, u, this, ci) << message;
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Makes the bot do the equivalent of a \"/me\" command\n"
- "on the given channel using the given text."));
- return true;
- }
-};
-
-class BSControl : public Module
-{
- CommandBSSay commandbssay;
- CommandBSAct commandbsact;
-
- public:
- BSControl(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandbssay(this), commandbsact(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandbssay);
- ModuleManager::RegisterService(&commandbsact);
- }
-};
-
-MODULE_INIT(BSControl)
diff --git a/modules/core/bs_info.cpp b/modules/core/bs_info.cpp
deleted file mode 100644
index b48a0b296..000000000
--- a/modules/core/bs_info.cpp
+++ /dev/null
@@ -1,244 +0,0 @@
-/* BotServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- *
- *
- */
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandBSInfo : public Command
-{
- private:
- 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)
- {
- ChannelInfo *ci = it->second;
-
- if (ci->bi == bi)
- {
- if (buf.length() + ci->name.length() > 300)
- {
- source.Reply("%s", buf.c_str());
- buf.clear();
- }
- buf += " " + ci->name + " ";
- }
- }
-
- if (!buf.empty())
- source.Reply("%s", buf.c_str());
- return;
- }
- public:
- CommandBSInfo(Module *creator) : Command(creator, "botserv/info", 1, 1)
- {
- this->SetDesc(_("Allows you to see BotServ information about a channel or a bot"));
- this->SetSyntax(_("\002INFO {\037chan\037 | \037nick\037}\002"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &query = params[0];
-
- bool need_comma = false;
- char buf[BUFSIZE], *end;
-
- User *u = source.u;
- BotInfo *bi = findbot(query);
- ChannelInfo *ci;
- if (bi)
- {
- source.Reply(_("Information for bot \002%s\002:"), bi->nick.c_str());
- source.Reply(_(" Mask : %s@%s"), bi->GetIdent().c_str(), bi->host.c_str());
- source.Reply(_(" Real name : %s"), bi->realname.c_str());
- source.Reply(_(" Created : %s"), do_strftime(bi->created).c_str());
- source.Reply(_(" Options : %s"), bi->HasFlag(BI_PRIVATE) ? _("Private") : _("None"));
- source.Reply(_(" Used on : %d channel(s)"), bi->chancount);
-
- if (u->HasPriv("botserv/administration"))
- this->send_bot_channels(source, bi);
- }
- else if ((ci = cs_findchan(query)))
- {
- if (!ci->HasPriv(u, CA_FOUNDER) && !u->HasPriv("botserv/administration"))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- source.Reply(CHAN_INFO_HEADER, ci->name.c_str());
- if (ci->bi)
- source.Reply(_(" Bot nick : %s"), ci->bi->nick.c_str());
- else
- source.Reply(_(" Bot nick : not assigned yet."));
-
- if (ci->botflags.HasFlag(BS_KICK_BADWORDS))
- {
- if (ci->ttb[TTB_BADWORDS])
- source.Reply(_(" Bad words kicker : %s (%d kick(s) to ban)"), ENABLED, ci->ttb[TTB_BADWORDS]);
- else
- source.Reply(_(" Bad words kicker : %s"), ENABLED);
- }
- else
- source.Reply(_(" Bad words kicker : %s"), DISABLED);
- if (ci->botflags.HasFlag(BS_KICK_BOLDS))
- {
- if (ci->ttb[TTB_BOLDS])
- source.Reply(_(" Bolds kicker : %s (%d kick(s) to ban)"), ENABLED, ci->ttb[TTB_BOLDS]);
- else
- source.Reply(_(" Bolds kicker : %s"), ENABLED);
- }
- else
- source.Reply(_(" Bolds kicker : %s"), DISABLED);
- if (ci->botflags.HasFlag(BS_KICK_CAPS))
- {
- if (ci->ttb[TTB_CAPS])
- source.Reply(_(" Caps kicker : %s (%d kick(s) to ban; minimum %d/%d%%)"), ENABLED, ci->ttb[TTB_CAPS], ci->capsmin, ci->capspercent);
- else
- source.Reply(_(" Caps kicker : %s (minimum %d/%d%%)"), ENABLED, ci->capsmin, ci->capspercent);
- }
- else
- source.Reply(_(" Caps kicker : %s"), DISABLED);
- if (ci->botflags.HasFlag(BS_KICK_COLORS))
- {
- if (ci->ttb[TTB_COLORS])
- source.Reply(_(" Colors kicker : %s (%d kick(s) to ban)"), ENABLED, ci->ttb[TTB_COLORS]);
- else
- source.Reply(_(" Colors kicker : %s"), ENABLED);
- }
- else
- source.Reply(_(" Colors kicker : %s"), DISABLED);
- if (ci->botflags.HasFlag(BS_KICK_FLOOD))
- {
- if (ci->ttb[TTB_FLOOD])
- source.Reply(_(" Flood kicker : %s (%d kick(s) to ban; %d lines in %ds)"), ENABLED, ci->ttb[TTB_FLOOD], ci->floodlines, ci->floodsecs);
- else
- source.Reply(_(" Flood kicker : %s (%d lines in %ds)"), ENABLED, ci->floodlines, ci->floodsecs);
- }
- else
- source.Reply(_(" Flood kicker : %s"), DISABLED);
- if (ci->botflags.HasFlag(BS_KICK_REPEAT))
- {
- if (ci->ttb[TTB_REPEAT])
- source.Reply(_(" Repeat kicker : %s (%d kick(s) to ban; %d times)"), ENABLED, ci->ttb[TTB_REPEAT], ci->repeattimes);
- else
- source.Reply(_(" Repeat kicker : %s (%d times)"), ENABLED, ci->repeattimes);
- }
- else
- source.Reply(_(" Repeat kicker : %s"), DISABLED);
- if (ci->botflags.HasFlag(BS_KICK_REVERSES))
- {
- if (ci->ttb[TTB_REVERSES])
- source.Reply(_(" Reverses kicker : %s (%d kick(s) to ban)"), ENABLED, ci->ttb[TTB_REVERSES]);
- else
- source.Reply(_(" Reverses kicker : %s"), ENABLED);
- }
- else
- source.Reply(_(" Reverses kicker : %s"), DISABLED);
- if (ci->botflags.HasFlag(BS_KICK_UNDERLINES))
- {
- if (ci->ttb[TTB_UNDERLINES])
- source.Reply(_(" Underlines kicker : %s (%d kick(s) to ban)"), ENABLED, ci->ttb[TTB_UNDERLINES]);
- else
- source.Reply(_(" Underlines kicker : %s"), ENABLED);
- }
- else
- source.Reply(_(" Underlines kicker : %s"), DISABLED);
- if (ci->botflags.HasFlag(BS_KICK_ITALICS))
- {
- if (ci->ttb[TTB_ITALICS])
- source.Reply(_(" Italics kicker : %s (%d kick(s) to ban)"), ENABLED, ci->ttb[TTB_ITALICS]);
- else
- source.Reply(_(" Italics kicker : %s"), ENABLED);
- }
- else
- source.Reply(_(" Italics kicker : %s"), DISABLED);
- if (ci->botflags.HasFlag(BS_KICK_AMSGS))
- {
- if (ci->ttb[TTB_AMSGS])
- source.Reply(_(" AMSG kicker : %s (%d kick(s) to ban)"), ENABLED, ci->ttb[TTB_AMSGS]);
- else
- source.Reply(_(" AMSG kicker : %s"), ENABLED);
- }
- else
- source.Reply(_(" AMSG kicker : %s"), DISABLED);
-
- if (ci->botflags.HasFlag(BS_MSG_PRIVMSG))
- source.Reply(_(" Fantasy reply : %s"), "PRIVMSG");
- else if (ci->botflags.HasFlag(BS_MSG_NOTICE))
- source.Reply(_(" Fantasy reply : %s"), "NOTICE");
- else if (ci->botflags.HasFlag(BS_MSG_NOTICEOPS))
- source.Reply(_(" Fantasy reply : %s"), "NOTICEOPS");
-
- end = buf;
- *end = 0;
- if (ci->botflags.HasFlag(BS_DONTKICKOPS))
- {
- end += snprintf(end, sizeof(buf) - (end - buf), "%s", _("Ops protection"));
- need_comma = true;
- }
- if (ci->botflags.HasFlag(BS_DONTKICKVOICES))
- {
- end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", _("Voices protection"));
- need_comma = true;
- }
- if (ci->botflags.HasFlag(BS_FANTASY))
- {
- end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", _("Fantasy"));
- need_comma = true;
- }
- if (ci->botflags.HasFlag(BS_GREET))
- {
- end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", _("Greet"));
- need_comma = true;
- }
- if (ci->botflags.HasFlag(BS_NOBOT))
- {
- end += snprintf(end, sizeof(buf) - (end - buf), "%s%s", need_comma ? ", " : "", _("No bot"));
- need_comma = true;
- }
- source.Reply(_(" Options : %s"), *buf ? buf : _("None"));
- }
- else
- source.Reply(_("\002%s\002 is not a valid bot or registered channel."), query.c_str());
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows you to see %s information about a channel or a bot.\n"
- "If the parameter is a channel, then you'll get information\n"
- "such as enabled kickers. If the parameter is a nick,\n"
- "you'll get information about a bot, such as creation\n"
- "time or number of channels it is on."), source.owner->nick.c_str());
- return true;
- }
-};
-
-class BSInfo : public Module
-{
- CommandBSInfo commandbsinfo;
-
- public:
- BSInfo(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandbsinfo(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandbsinfo);
- }
-};
-
-MODULE_INIT(BSInfo)
diff --git a/modules/core/bs_kick.cpp b/modules/core/bs_kick.cpp
deleted file mode 100644
index 3f433f773..000000000
--- a/modules/core/bs_kick.cpp
+++ /dev/null
@@ -1,1011 +0,0 @@
-/* BotServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- *
- *
- */
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandBSKick : public Command
-{
- public:
- CommandBSKick(Module *creator) : Command(creator, "botserv/kick", 3, 6)
- {
- this->SetDesc(_("Configures kickers"));
- this->SetSyntax(_("\037channel\037 \037option\037 {\037ON|\037} [\037settings\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- 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] : "";
-
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
-
- if (readonly)
- source.Reply(_("Sorry, kicker configuration is temporarily disabled."));
- else if (ci == NULL)
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- else if (chan.empty() || option.empty() || value.empty())
- this->OnSyntaxError(source, "");
- else if (!value.equals_ci("ON") && !value.equals_ci("OFF"))
- this->OnSyntaxError(source, "");
- else if (!ci->HasPriv(u, CA_SET) && !u->HasPriv("botserv/administration"))
- source.Reply(ACCESS_DENIED);
- else if (!ci->bi)
- source.Reply(BOT_NOT_ASSIGNED);
- else
- {
- bool override = !ci->HasPriv(u, CA_SET);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << option << " " << value;
-
- if (option.equals_ci("BADWORDS"))
- {
- if (value.equals_ci("ON"))
- {
- if (!ttb.empty())
- {
- try
- {
- ci->ttb[TTB_BADWORDS] = convertTo<int16>(ttb);
- if (ci->ttb[TTB_BADWORDS] < 0)
- throw ConvertException();
- }
- catch (const ConvertException &)
- {
- /* reset the value back to 0 - TSL */
- ci->ttb[TTB_BADWORDS] = 0;
- source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
- return;
- }
- }
- else
- ci->ttb[TTB_BADWORDS] = 0;
-
- ci->botflags.SetFlag(BS_KICK_BADWORDS);
- if (ci->ttb[TTB_BADWORDS])
- source.Reply(_("Bot will now kick \002bad words\002, and will place a ban after \n"
- "%d kicks for the same user. Use the BADWORDS command\n"
- "to add or remove a bad word."), ci->ttb[TTB_BADWORDS]);
- else
- source.Reply(_("Bot will now kick \002bad words\002. Use the BADWORDS command\n"
- "to add or remove a bad word."));
- }
- else
- {
- ci->botflags.UnsetFlag(BS_KICK_BADWORDS);
- source.Reply(_("Bot won't kick \002bad words\002 anymore."));
- }
- }
- else if (option.equals_ci("BOLDS"))
- {
- if (value.equals_ci("ON"))
- {
- if (!ttb.empty())
- {
- try
- {
- ci->ttb[TTB_BOLDS] = convertTo<int16>(ttb);
- if (ci->ttb[TTB_BOLDS] < 0)
- throw ConvertException();
- }
- catch (const ConvertException &)
- {
- ci->ttb[TTB_BOLDS] = 0;
- source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
- return;
- }
- }
- else
- ci->ttb[TTB_BOLDS] = 0;
- ci->botflags.SetFlag(BS_KICK_BOLDS);
- if (ci->ttb[TTB_BOLDS])
- source.Reply(_("Bot will now kick \002bolds\002, and will place a ban after\n%d kicks to the same user."), ci->ttb[TTB_BOLDS]);
- else
- source.Reply(_("Bot will now kick \002bolds\002."));
- }
- else
- {
- ci->botflags.UnsetFlag(BS_KICK_BOLDS);
- source.Reply(_("Bot won't kick \002bolds\002 anymore."));
- }
- }
- else if (option.equals_ci("CAPS"))
- {
- if (value.equals_ci("ON"))
- {
- Anope::string min = params.size() > 4 ? params[4] : "";
- Anope::string percent = params.size() > 5 ? params[5] : "";
-
- if (!ttb.empty())
- {
- try
- {
- ci->ttb[TTB_CAPS] = convertTo<int16>(ttb);
- if (ci->ttb[TTB_CAPS] < 0)
- throw ConvertException();
- }
- catch (const ConvertException &)
- {
- ci->ttb[TTB_CAPS] = 0;
- source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
- return;
- }
- }
- else
- ci->ttb[TTB_CAPS] = 0;
-
- ci->capsmin = 10;
- try
- {
- ci->capsmin = convertTo<int16>(min);
- }
- catch (const ConvertException &) { }
- if (ci->capsmin < 1)
- ci->capsmin = 10;
-
- ci->capspercent = 25;
- try
- {
- ci->capspercent = convertTo<int16>(percent);
- }
- catch (const ConvertException &) { }
- if (ci->capspercent < 1 || ci->capspercent > 100)
- ci->capspercent = 25;
-
- ci->botflags.SetFlag(BS_KICK_CAPS);
- if (ci->ttb[TTB_CAPS])
- source.Reply(_("Bot will now kick \002caps\002 (they must constitute at least\n"
- "%d characters and %d%% of the entire message), and will \n"
- "place a ban after %d kicks for the same user."), ci->capsmin, ci->capspercent, ci->ttb[TTB_CAPS]);
- else
- source.Reply(_("Bot will now kick \002caps\002 (they must constitute at least\n"
- "%d characters and %d%% of the entire message)."), ci->capsmin, ci->capspercent);
- }
- else
- {
- ci->botflags.UnsetFlag(BS_KICK_CAPS);
- source.Reply(_("Bot won't kick \002caps\002 anymore."));
- }
- }
- else if (option.equals_ci("COLORS"))
- {
- if (value.equals_ci("ON"))
- {
- if (!ttb.empty())
- {
- try
- {
- ci->ttb[TTB_COLORS] = convertTo<int16>(ttb);
- if (ci->ttb[TTB_COLORS] < 1)
- throw ConvertException();
- }
- catch (const ConvertException &)
- {
- ci->ttb[TTB_COLORS] = 0;
- source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
- return;
- }
- }
- else
- ci->ttb[TTB_COLORS] = 0;
-
- ci->botflags.SetFlag(BS_KICK_COLORS);
- if (ci->ttb[TTB_COLORS])
- source.Reply(_("Bot will now kick \002colors\002, and will place a ban after %d\nkicks for the same user."), ci->ttb[TTB_COLORS]);
- else
- source.Reply(_("Bot will now kick \002colors\002."));
- }
- else
- {
- ci->botflags.UnsetFlag(BS_KICK_COLORS);
- source.Reply(_("Bot won't kick \002colors\002 anymore."));
- }
- }
- else if (option.equals_ci("FLOOD"))
- {
- if (value.equals_ci("ON"))
- {
- Anope::string lines = params.size() > 4 ? params[4] : "";
- Anope::string secs = params.size() > 5 ? params[5] : "";
-
- if (!ttb.empty())
- {
- try
- {
- ci->ttb[TTB_FLOOD] = convertTo<int16>(ttb);
- if (ci->ttb[TTB_FLOOD] < 1)
- throw ConvertException();
- }
- catch (const ConvertException &)
- {
- ci->ttb[TTB_FLOOD] = 0;
- source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
- return;
- }
- }
- else
- ci->ttb[TTB_FLOOD] = 0;
-
- ci->floodlines = 6;
- try
- {
- ci->floodlines = convertTo<int16>(lines);
- }
- catch (const ConvertException &) { }
- if (ci->floodlines < 2)
- ci->floodlines = 6;
-
- ci->floodsecs = 10;
- try
- {
- ci->floodsecs = convertTo<int16>(secs);
- }
- catch (const ConvertException &) { }
- if (ci->floodsecs < 1)
- ci->floodsecs = 10;
- if (ci->floodsecs > Config->BSKeepData)
- ci->floodsecs = Config->BSKeepData;
-
- ci->botflags.SetFlag(BS_KICK_FLOOD);
- if (ci->ttb[TTB_FLOOD])
- source.Reply(_("Bot will now kick \002flood\002 (%d lines in %d seconds and\nwill place a ban after %d kicks for the same user."), ci->floodlines, ci->floodsecs, ci->ttb[TTB_FLOOD]);
- else
- source.Reply(_("Bot will now kick \002flood\002 (%d lines in %d seconds)."), ci->floodlines, ci->floodsecs);
- }
- else
- {
- ci->botflags.UnsetFlag(BS_KICK_FLOOD);
- source.Reply(_("Bot won't kick \002flood\002 anymore."));
- }
- }
- else if (option.equals_ci("REPEAT"))
- {
- if (value.equals_ci("ON"))
- {
- Anope::string times = params.size() > 4 ? params[4] : "";
-
- if (!ttb.empty())
- {
- try
- {
- ci->ttb[TTB_REPEAT] = convertTo<int16>(ttb);
- if (ci->ttb[TTB_REPEAT] < 0)
- throw ConvertException();
- }
- catch (const ConvertException &)
- {
- ci->ttb[TTB_REPEAT] = 0;
- source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
- return;
- }
- }
- else
- ci->ttb[TTB_REPEAT] = 0;
-
- ci->repeattimes = 3;
- try
- {
- ci->repeattimes = convertTo<int16>(times);
- }
- catch (const ConvertException &) { }
- if (ci->repeattimes < 2)
- ci->repeattimes = 3;
-
- ci->botflags.SetFlag(BS_KICK_REPEAT);
- if (ci->ttb[TTB_REPEAT])
- source.Reply(_("Bot will now kick \002repeats\002 (users that say %d times\n"
- "the same thing), and will place a ban after %d \n"
- "kicks for the same user."), ci->repeattimes, ci->ttb[TTB_REPEAT]);
- else
- source.Reply(_("Bot will now kick \002repeats\002 (users that say %d times\n"
- "the same thing)."), ci->repeattimes);
- }
- else
- {
- ci->botflags.UnsetFlag(BS_KICK_REPEAT);
- source.Reply(_("Bot won't kick \002repeats\002 anymore."));
- }
- }
- else if (option.equals_ci("REVERSES"))
- {
- if (value.equals_ci("ON"))
- {
- if (!ttb.empty())
- {
- try
- {
- ci->ttb[TTB_REVERSES] = convertTo<int16>(ttb);
- if (ci->ttb[TTB_REVERSES] < 0)
- throw ConvertException();
- }
- catch (const ConvertException &)
- {
- ci->ttb[TTB_REVERSES] = 0;
- source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
- return;
- }
- }
- else
- ci->ttb[TTB_REVERSES] = 0;
- ci->botflags.SetFlag(BS_KICK_REVERSES);
- if (ci->ttb[TTB_REVERSES])
- source.Reply(_("Bot will now kick \002reverses\002, and will place a ban after %d\nkicks for the same user."), ci->ttb[TTB_REVERSES]);
- else
- source.Reply(_("Bot will now kick \002reverses\002."));
- }
- else
- {
- ci->botflags.UnsetFlag(BS_KICK_REVERSES);
- source.Reply(_("Bot won't kick \002reverses\002 anymore."));
- }
- }
- else if (option.equals_ci("UNDERLINES"))
- {
- if (value.equals_ci("ON"))
- {
- if (!ttb.empty())
- {
- try
- {
- ci->ttb[TTB_UNDERLINES] = convertTo<int16>(ttb);
- if (ci->ttb[TTB_REVERSES] < 0)
- throw ConvertException();
- }
- catch (const ConvertException &)
- {
- ci->ttb[TTB_UNDERLINES] = 0;
- source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
- return;
- }
- }
- else
- ci->ttb[TTB_UNDERLINES] = 0;
-
- ci->botflags.SetFlag(BS_KICK_UNDERLINES);
- if (ci->ttb[TTB_UNDERLINES])
- source.Reply(_("Bot will now kick \002underlines\002, and will place a ban after %d\nkicks for the same user."), ci->ttb[TTB_UNDERLINES]);
- else
- source.Reply(_("Bot will now kick \002underlines\002."));
- }
- else
- {
- ci->botflags.UnsetFlag(BS_KICK_UNDERLINES);
- source.Reply(_("Bot won't kick \002underlines\002 anymore."));
- }
- }
- else if (option.equals_ci("ITALICS"))
- {
- if (value.equals_ci("ON"))
- {
- if (!ttb.empty())
- {
- try
- {
- ci->ttb[TTB_ITALICS] = convertTo<int16>(ttb);
- if (ci->ttb[TTB_ITALICS] < 0)
- throw ConvertException();
- }
- catch (const ConvertException &)
- {
- ci->ttb[TTB_ITALICS] = 0;
- source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
- return;
- }
- }
- else
- ci->ttb[TTB_ITALICS] = 0;
-
- ci->botflags.SetFlag(BS_KICK_ITALICS);
- if (ci->ttb[TTB_ITALICS])
- source.Reply(_("Bot will now kick \002italics\002, and will place a ban after\n%d kicks for the same user."), ci->ttb[TTB_ITALICS]);
- else
- source.Reply(_("Bot will now kick \002italics\002."));
- }
- else
- {
- ci->botflags.UnsetFlag(BS_KICK_ITALICS);
- source.Reply(_("Bot won't kick \002italics\002 anymore."));
- }
- }
- else if (option.equals_ci("AMSGS"))
- {
- if (value.equals_ci("ON"))
- {
- if (!ttb.empty())
- {
- try
- {
- ci->ttb[TTB_AMSGS] = convertTo<int16>(ttb);
- if (ci->ttb[TTB_AMSGS] < 0)
- throw ConvertException();
- }
- catch (const ConvertException &)
- {
- ci->ttb[TTB_AMSGS] = 0;
- source.Reply(_("\002%s\002 cannot be taken as times to ban."), ttb.c_str());
- return;
- }
- }
- else
- ci->ttb[TTB_AMSGS] = 0;
-
- ci->botflags.SetFlag(BS_KICK_AMSGS);
- if (ci->ttb[TTB_AMSGS])
- source.Reply(_("Bot will now kick for \002amsgs\002, and will place a ban after %d\nkicks for the same user."), ci->ttb[TTB_AMSGS]);
- else
- source.Reply(_("Bot will now kick for \002amsgs\002"));
- }
- else
- {
- ci->botflags.UnsetFlag(BS_KICK_AMSGS);
- source.Reply(_("Bot won't kick for \002amsgs\002 anymore."));
- }
- }
- else
- source.Reply(UNKNOWN_OPTION, Config->UseStrictPrivMsgString.c_str(), option.c_str(), this->name.c_str());
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- if (subcommand.empty())
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Configures bot kickers. \037option\037 can be one of:\n"
- " \n"
- " AMSGS Sets if the bot kicks for amsgs\n"
- " BOLDS Sets if the bot kicks bolds\n"
- " BADWORDS Sets if the bot kicks bad words\n"
- " CAPS Sets if the bot kicks caps\n"
- " COLORS Sets if the bot kicks colors\n"
- " FLOOD Sets if the bot kicks flooding users\n"
- " REPEAT Sets if the bot kicks users who repeat\n"
- " themselves\n"
- " REVERSES Sets if the bot kicks reverses\n"
- " UNDERLINES Sets if the bot kicks underlines\n"
- " ITALICS Sets if the bot kicks italics\n"
- " \n"
- "Type \002%s%s HELP KICK \037option\037\002 for more information\n"
- "on a specific option.\n"
- " \n"
- "Note: access to this command is controlled by the\n"
- "level SET."), Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str());
- }
- else if (subcommand.equals_ci("BADWORDS"))
- source.Reply(_("Syntax: \002\037#channel\037 BADWORDS {\037ON|OFF\037} [\037ttb\037]\002\n"
- "Sets the bad words kicker on or off. When enabled, this\n"
- "option tells the bot to kick users who say certain words\n"
- "on the channels.\n"
- "You can define bad words for your channel using the\n"
- "\002BADWORDS\002 command. Type \002%s%s HELP BADWORDS\002 for\n"
- "more information.\n"
- "ttb is the number of times a user can be kicked\n"
- "before it get banned. Don't give ttb to disable\n"
- "the ban system once activated."), Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str());
- else if (subcommand.equals_ci("BOLDS"))
- source.Reply(_("Syntax: \002\037channel\037 BOLDS {\037ON|OFF\037} [\037ttb\037]\002\n"
- "Sets the bolds kicker on or off. When enabled, this\n"
- "option tells the bot to kick users who use bolds.\n"
- "ttb is the number of times a user can be kicked\n"
- "before it get banned. Don't give ttb to disable\n"
- "the ban system once activated."));
- else if (subcommand.equals_ci("CAPS"))
- source.Reply(_("Syntax: \002\037channel\037 CAPS {\037ON|OFF\037} [\037ttb\037 [\037min\037 [\037percent\037]]]\002\n"
- "Sets the caps kicker on or off. When enabled, this\n"
- "option tells the bot to kick users who are talking in\n"
- "CAPS.\n"
- "The bot kicks only if there are at least \002min\002 caps\n"
- "and they constitute at least \002percent\002%% of the total \n"
- "text line (if not given, it defaults to 10 characters\n"
- "and 25%%).\n"
- "ttb is the number of times a user can be kicked\n"
- "before it get banned. Don't give ttb to disable\n"
- "the ban system once activated."));
- else if (subcommand.equals_ci("COLORS"))
- source.Reply(_("Syntax: \002\037channel\037 COLORS {\037ON|OFF\037} [\037ttb\037]\002\n"
- "Sets the colors kicker on or off. When enabled, this\n"
- "option tells the bot to kick users who use colors.\n"
- "ttb is the number of times a user can be kicked\n"
- "before it get banned. Don't give ttb to disable\n"
- "the ban system once activated."));
- else if (subcommand.equals_ci("FLOOD"))
- source.Reply(_("Syntax: \002\037channel\037 FLOOD {\037ON|OFF\037} [\037ttb\037 [\037ln\037 [\037secs\037]]]\002\n"
- "Sets the flood kicker on or off. When enabled, this\n"
- "option tells the bot to kick users who are flooding\n"
- "the channel using at least \002ln\002 lines in \002secs\002 seconds\n"
- "(if not given, it defaults to 6 lines in 10 seconds).\n"
- " \n"
- "ttb is the number of times a user can be kicked\n"
- "before it get banned. Don't give ttb to disable\n"
- "the ban system once activated."));
- else if (subcommand.equals_ci("REPEAT"))
- source.Reply(_("Syntax: \002\037#channel\037 REPEAT {\037ON|OFF\037} [\037ttb\037 [\037num\037]]\002\n"
- "Sets the repeat kicker on or off. When enabled, this\n"
- "option tells the bot to kick users who are repeating\n"
- "themselves \002num\002 times (if num is not given, it\n"
- "defaults to 3).\n"
- "ttb is the number of times a user can be kicked\n"
- "before it get banned. Don't give ttb to disable\n"
- "the ban system once activated."));
- else if (subcommand.equals_ci("REVERSES"))
- source.Reply(_("Syntax: \002\037channel\037 REVERSES {\037ON|OFF\037} [\037ttb\037]\002\n"
- "Sets the reverses kicker on or off. When enabled, this\n"
- "option tells the bot to kick users who use reverses.\n"
- "ttb is the number of times a user can be kicked\n"
- "before it get banned. Don't give ttb to disable\n"
- "the ban system once activated."));
- else if (subcommand.equals_ci("UNDERLINES"))
- source.Reply(_("Syntax: \002\037channel\037 UNDERLINES {\037ON|OFF\037} [\037ttb\037]\002\n"
- "Sets the underlines kicker on or off. When enabled, this\n"
- "option tells the bot to kick users who use underlines.\n"
- "ttb is the number of times a user can be kicked\n"
- "before it get banned. Don't give ttb to disable\n"
- "the ban system once activated."));
- else if (subcommand.equals_ci("ITALICS"))
- source.Reply(_("Syntax: \002\037channel\037 ITALICS {\037ON|OFF\037} [\037ttb\037]\002\n"
- "Sets the italics kicker on or off. When enabled, this\n"
- "option tells the bot to kick users who use italics.\n"
- "ttb is the number of times a user can be kicked\n"
- "before it get banned. Don't give ttb to disable\n"
- "the ban system once activated."));
- else if (subcommand.equals_ci("AMSGS"))
- source.Reply(_("Syntax: \002\037channel\037 AMSGS {\037ON|OFF\037} [\037ttb\037]\002\n"
- "Sets the amsg kicker on or off. When enabled, the bot will\n"
- "kick users who send the same message to multiple channels\n"
- "where BotServ bots are.\n"
- "Ttb is the number of times a user can be kicked\n"
- "before it get banned. Don't give ttb to disable\n"
- "the ban system once activated."));
- else
- return false;
-
- return true;
- }
-};
-
-struct BanData
-{
- Anope::string mask;
- time_t last_use;
- int16 ttb[TTB_SIZE];
-
- BanData()
- {
- this->Clear();
- }
-
- void Clear()
- {
- last_use = 0;
- for (int i = 0; i < TTB_SIZE; ++i)
- this->ttb[i] = 0;
- }
-};
-
-struct UserData
-{
- UserData()
- {
- this->Clear();
- }
-
- void Clear()
- {
- last_use = last_start = Anope::CurTime;
- lines = times = 0;
- lastline.clear();
- }
-
- /* Data validity */
- time_t last_use;
-
- /* for flood kicker */
- int16 lines;
- time_t last_start;
-
- /* for repeat kicker */
- Anope::string lastline;
- Anope::string lasttarget;
- int16 times;
-};
-
-
-class BanDataPurger : public CallBack
-{
- public:
- BanDataPurger(Module *owner) : CallBack(owner, 300, Anope::CurTime, true) { }
-
- void Tick(time_t)
- {
- Log(LOG_DEBUG) << "bs_main: Running bandata purger";
-
- for (channel_map::iterator it = ChannelList.begin(), it_end = ChannelList.end(); it != it_end; ++it)
- {
- Channel *c = it->second;
-
- std::map<Anope::string, BanData> bandata;
- if (c->GetExtRegular("bs_main_bandata", bandata))
- {
- for (std::map<Anope::string, BanData>::iterator it2 = bandata.begin(), it2_end = bandata.end(); it2 != it2_end;)
- {
- const Anope::string &user = it->first;
- BanData *bd = &it2->second;
- ++it2;
-
- if (Anope::CurTime - bd->last_use > Config->BSKeepData)
- {
- bandata.erase(user);
- continue;
- }
- }
-
- if (bandata.empty())
- c->Shrink("bs_main_bandata");
- }
- }
- }
-};
-
-class BSKick : public Module
-{
- CommandBSKick commandbskick;
- BanDataPurger purger;
-
- BanData *GetBanData(User *u, Channel *c)
- {
- std::map<Anope::string, BanData> bandatamap;
- if (!c->GetExtRegular("bs_main_bandata", bandatamap));
- c->Extend("bs_main_bandata", new ExtensibleItemRegular<std::map<Anope::string, BanData> >(bandatamap));
- c->GetExtRegular("bs_main_bandata", bandatamap);
-
- BanData *bd = &bandatamap[u->GetMask()];
- if (bd->last_use && Anope::CurTime - bd->last_use > Config->BSKeepData)
- bd->Clear();
- bd->last_use = Anope::CurTime;
- return bd;
- }
-
- UserData *GetUserData(User *u, Channel *c)
- {
- UserData *ud = NULL;
- UserContainer *uc = c->FindUser(u);
- if (uc != NULL && !uc->GetExtPointer("bs_main_userdata", ud))
- {
- ud = new UserData();
- uc->Extend("bs_main_userdata", new ExtensibleItemPointer<UserData>(ud));
- }
- return ud;
- }
-
- void check_ban(ChannelInfo *ci, User *u, int ttbtype)
- {
- /* Don't ban ulines */
- if (u->server->IsULined())
- return;
-
- BanData *bd = this->GetBanData(u, ci->c);
-
- ++bd->ttb[ttbtype];
- if (ci->ttb[ttbtype] && bd->ttb[ttbtype] >= ci->ttb[ttbtype])
- {
- /* Should not use == here because bd->ttb[ttbtype] could possibly be > ci->ttb[ttbtype]
- * if the TTB was changed after it was not set (0) before and the user had already been
- * kicked a few times. Bug #1056 - Adam */
- Anope::string mask;
-
- bd->ttb[ttbtype] = 0;
-
- get_idealban(ci, u, mask);
-
- if (ci->c)
- ci->c->SetMode(NULL, CMODE_BAN, mask);
- FOREACH_MOD(I_OnBotBan, OnBotBan(u, ci, mask));
- }
- }
-
- void bot_kick(ChannelInfo *ci, User *u, const char *message, ...)
- {
- va_list args;
- char buf[1024];
-
- if (!ci || !ci->bi || !ci->c || !u || u->server->IsULined())
- return;
-
- Anope::string fmt = translate(u, message);
- va_start(args, message);
- vsnprintf(buf, sizeof(buf), fmt.c_str(), args);
- va_end(args);
-
- ci->c->Kick(ci->bi, u, "%s", buf);
- }
-
- public:
- BSKick(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandbskick(this), purger(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandbskick);
-
- ModuleManager::Attach(I_OnPrivmsg, this);
- }
-
- ~BSKick()
- {
- for (channel_map::const_iterator cit = ChannelList.begin(), cit_end = ChannelList.end(); cit != cit_end; ++cit)
- {
- cit->second->Shrink("bs_main_userdata");
- cit->second->Shrink("bs_main_bandata");
- }
- }
-
- void OnPrivmsg(User *u, Channel *c, Anope::string &msg)
- {
- /* Now we can make kicker stuff. We try to order the checks
- * from the fastest one to the slowest one, since there's
- * no need to process other kickers if a user is kicked before
- * the last kicker check.
- *
- * But FIRST we check whether the user is protected in any
- * way.
- */
- ChannelInfo *ci = c->ci;
- if (ci == NULL)
- return;
-
- bool Allow = true;
- if (ci->HasPriv(u, CA_NOKICK))
- Allow = false;
- else if (ci->botflags.HasFlag(BS_DONTKICKOPS) && (c->HasUserStatus(u, CMODE_HALFOP) || c->HasUserStatus(u, CMODE_OP) || c->HasUserStatus(u, CMODE_PROTECT) || c->HasUserStatus(u, CMODE_OWNER)))
- Allow = false;
- else if (ci->botflags.HasFlag(BS_DONTKICKVOICES) && c->HasUserStatus(u, CMODE_VOICE))
- Allow = false;
-
- if (Allow)
- {
- Anope::string realbuf = msg;
-
- /* If it's a /me, cut the CTCP part because the ACTION will cause
- * problems with the caps or badwords kicker
- */
- if (realbuf.substr(0, 8).equals_ci("\1ACTION ") && realbuf[realbuf.length() - 1] == '\1')
- {
- realbuf.erase(0, 8);
- realbuf.erase(realbuf.length() - 1);
- }
-
- if (realbuf.empty())
- return;
-
- /* Bolds kicker */
- if (ci->botflags.HasFlag(BS_KICK_BOLDS) && realbuf.find(2) != Anope::string::npos)
- {
- check_ban(ci, u, TTB_BOLDS);
- bot_kick(ci, u, _("Don't use bolds on this channel!"));
- return;
- }
-
- /* Color kicker */
- if (ci->botflags.HasFlag(BS_KICK_COLORS) && realbuf.find(3) != Anope::string::npos)
- {
- check_ban(ci, u, TTB_COLORS);
- bot_kick(ci, u, _("Don't use colors on this channel!"));
- return;
- }
-
- /* Reverses kicker */
- if (ci->botflags.HasFlag(BS_KICK_REVERSES) && realbuf.find(22) != Anope::string::npos)
- {
- check_ban(ci, u, TTB_REVERSES);
- bot_kick(ci, u, _("Don't use reverses on this channel!"));
- return;
- }
-
- /* Italics kicker */
- if (ci->botflags.HasFlag(BS_KICK_ITALICS) && realbuf.find(29) != Anope::string::npos)
- {
- check_ban(ci, u, TTB_ITALICS);
- bot_kick(ci, u, _("Don't use italics on this channel!"));
- return;
- }
-
- /* Underlines kicker */
- if (ci->botflags.HasFlag(BS_KICK_UNDERLINES) && realbuf.find(31) != Anope::string::npos)
- {
- check_ban(ci, u, TTB_UNDERLINES);
- bot_kick(ci, u, _("Don't use underlines on this channel!"));
- return;
- }
-
- /* Caps kicker */
- if (ci->botflags.HasFlag(BS_KICK_CAPS) && realbuf.length() >= ci->capsmin)
- {
- int i = 0, l = 0;
-
- for (unsigned j = 0, end = realbuf.length(); j < end; ++j)
- {
- if (isupper(realbuf[j]))
- ++i;
- else if (islower(realbuf[j]))
- ++l;
- }
-
- /* i counts uppercase chars, l counts lowercase chars. Only
- * alphabetic chars (so islower || isupper) qualify for the
- * percentage of caps to kick for; the rest is ignored. -GD
- */
-
- if ((i || l) && i >= ci->capsmin && i * 100 / (i + l) >= ci->capspercent)
- {
- check_ban(ci, u, TTB_CAPS);
- bot_kick(ci, u, _("Turn caps lock OFF!"));
- return;
- }
- }
-
- /* Bad words kicker */
- if (ci->botflags.HasFlag(BS_KICK_BADWORDS))
- {
- bool mustkick = false;
-
- /* Normalize the buffer */
- Anope::string nbuf = normalizeBuffer(realbuf);
-
- for (unsigned i = 0, end = ci->GetBadWordCount(); i < end; ++i)
- {
- BadWord *bw = ci->GetBadWord(i);
-
- if (bw->type == BW_ANY && ((Config->BSCaseSensitive && nbuf.find(bw->word) != Anope::string::npos) || (!Config->BSCaseSensitive && nbuf.find_ci(bw->word) != Anope::string::npos)))
- mustkick = true;
- else if (bw->type == BW_SINGLE)
- {
- size_t len = bw->word.length();
-
- if ((Config->BSCaseSensitive && bw->word.equals_cs(nbuf)) || (!Config->BSCaseSensitive && bw->word.equals_ci(nbuf)))
- mustkick = true;
- else if (nbuf.find(' ') == len && ((Config->BSCaseSensitive && bw->word.equals_cs(nbuf)) || (!Config->BSCaseSensitive && bw->word.equals_ci(nbuf))))
- mustkick = true;
- else
- {
- if (nbuf.rfind(' ') == nbuf.length() - len - 1 && ((Config->BSCaseSensitive && nbuf.find(bw->word) == nbuf.length() - len) || (!Config->BSCaseSensitive && nbuf.find_ci(bw->word) == nbuf.length() - len)))
- mustkick = true;
- else
- {
- Anope::string wordbuf = " " + bw->word + " ";
-
- if ((Config->BSCaseSensitive && nbuf.find(wordbuf) != Anope::string::npos) || (!Config->BSCaseSensitive && nbuf.find_ci(wordbuf) != Anope::string::npos))
- mustkick = true;
- }
- }
- }
- else if (bw->type == BW_START)
- {
- size_t len = bw->word.length();
-
- if ((Config->BSCaseSensitive && nbuf.substr(0, len).equals_cs(bw->word)) || (!Config->BSCaseSensitive && nbuf.substr(0, len).equals_ci(bw->word)))
- mustkick = true;
- else
- {
- Anope::string wordbuf = " " + bw->word;
-
- if ((Config->BSCaseSensitive && nbuf.find(wordbuf) != Anope::string::npos) || (!Config->BSCaseSensitive && nbuf.find_ci(wordbuf) != Anope::string::npos))
- mustkick = true;
- }
- }
- else if (bw->type == BW_END)
- {
- size_t len = bw->word.length();
-
- if ((Config->BSCaseSensitive && nbuf.substr(nbuf.length() - len).equals_cs(bw->word)) || (!Config->BSCaseSensitive && nbuf.substr(nbuf.length() - len).equals_ci(bw->word)))
- mustkick = true;
- else
- {
- Anope::string wordbuf = bw->word + " ";
-
- if ((Config->BSCaseSensitive && nbuf.find(wordbuf) != Anope::string::npos) || (!Config->BSCaseSensitive && nbuf.find_ci(wordbuf) != Anope::string::npos))
- mustkick = true;
- }
- }
-
- if (mustkick)
- {
- check_ban(ci, u, TTB_BADWORDS);
- if (Config->BSGentleBWReason)
- bot_kick(ci, u, _("Watch your language!"));
- else
- bot_kick(ci, u, _("Don't use the word \"%s\" on this channel!"), bw->word.c_str());
-
- return;
- }
- }
-
- UserData *ud = NULL;
-
- /* Flood kicker */
- if (ci->botflags.HasFlag(BS_KICK_FLOOD))
- {
- ud = GetUserData(u, c);
- if (ud)
- {
- if (Anope::CurTime - ud->last_start > ci->floodsecs)
- {
- ud->last_start = Anope::CurTime;
- ud->lines = 0;
- }
-
- ++ud->lines;
- if (ud->lines >= ci->floodlines)
- {
- check_ban(ci, u, TTB_FLOOD);
- bot_kick(ci, u, _("Stop flooding!"));
- return;
- }
- }
- }
-
- /* Repeat kicker */
- if (ci->botflags.HasFlag(BS_KICK_REPEAT))
- {
- if (!ud)
- ud = GetUserData(u, c);
- if (ud)
- {
-
- if (!ud->lastline.empty() && !ud->lastline.equals_ci(realbuf))
- {
- ud->lastline = realbuf;
- ud->times = 0;
- }
- else
- {
- if (ud->lastline.empty())
- ud->lastline = realbuf;
- ++ud->times;
- }
-
- if (ud->times >= ci->repeattimes)
- {
- check_ban(ci, u, TTB_REPEAT);
- bot_kick(ci, u, _("Stop repeating yourself!"));
- return;
- }
- }
- }
-
- if (ud && ud->lastline.equals_ci(realbuf) && !ud->lasttarget.empty() && !ud->lasttarget.equals_ci(ci->name))
- {
- for (UChannelList::iterator it = u->chans.begin(); it != u->chans.end();)
- {
- Channel *chan = (*it)->chan;
- ++it;
-
- if (chan->ci != NULL && chan->ci->botflags.HasFlag(BS_KICK_AMSGS) && !chan->ci->HasPriv(u, CA_NOKICK))
- {
- check_ban(chan->ci, u, TTB_AMSGS);
- bot_kick(chan->ci, u, _("Don't use AMSGs!"));
- }
- }
- }
-
- if (ud)
- ud->lasttarget = ci->name;
- }
- }
- }
-};
-
-MODULE_INIT(BSKick)
diff --git a/modules/core/bs_main.cpp b/modules/core/bs_main.cpp
deleted file mode 100644
index 69eab6040..000000000
--- a/modules/core/bs_main.cpp
+++ /dev/null
@@ -1,204 +0,0 @@
-/* BotServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class BotServCore : public Module
-{
- Channel *fantasy_channel;
- public:
- BotServCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE), fantasy_channel(NULL)
- {
- this->SetAuthor("Anope");
-
- BotInfo *BotServ = findbot(Config->BotServ);
- if (BotServ == NULL)
- throw ModuleException("No bot named " + Config->BotServ);
-
- Implementation i[] = { I_OnPrivmsg, I_OnPreCommand, I_OnJoinChannel, I_OnLeaveChannel,
- I_OnPreHelp, I_OnPostHelp, I_OnChannelModeSet };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
-
- }
-
- void OnPrivmsg(User *u, Channel *c, Anope::string &msg)
- {
- if (!u || !c || !c->ci || !c->ci->bi || msg.empty())
- return;
-
- /* Answer to ping if needed */
- if (msg.substr(0, 6).equals_ci("\1PING ") && msg[msg.length() - 1] == '\1')
- {
- Anope::string ctcp = msg;
- ctcp.erase(ctcp.begin());
- ctcp.erase(ctcp.length() - 1);
- ircdproto->SendCTCP(c->ci->bi, u->nick, "%s", ctcp.c_str());
- }
-
-
- Anope::string realbuf = msg;
-
- bool was_action = false;
- if (realbuf.substr(0, 8).equals_ci("\1ACTION ") && realbuf[realbuf.length() - 1] == '\1')
- {
- realbuf.erase(0, 8);
- realbuf.erase(realbuf.length() - 1);
- was_action = true;
- }
-
- if (realbuf.empty())
- return;
-
- /* Fantaisist commands */
- if (c->ci->botflags.HasFlag(BS_FANTASY) && realbuf[0] == Config->BSFantasyCharacter[0] && !was_action)
- {
- /* Strip off the fantasy character */
- realbuf.erase(realbuf.begin());
-
- size_t space = realbuf.find(' ');
- Anope::string command, rest;
- if (space == Anope::string::npos)
- command = realbuf;
- else
- {
- command = realbuf.substr(0, space);
- rest = realbuf.substr(space + 1);
- }
-
- BotInfo *bi = findbot(Config->ChanServ);
- if (bi == NULL)
- bi = findbot(Config->BotServ);
- if (bi == NULL || !bi->commands.count(command))
- return;
-
- if (c->ci->HasPriv(u, CA_FANTASIA))
- {
-
- this->fantasy_channel = c;
- bi->OnMessage(u, realbuf);
- this->fantasy_channel = NULL;
-
- FOREACH_MOD(I_OnBotFantasy, OnBotFantasy(command, u, c->ci, rest));
- }
- else
- {
- FOREACH_MOD(I_OnBotNoFantasyAccess, OnBotNoFantasyAccess(command, u, c->ci, rest));
- }
- }
- }
-
- EventReturn OnPreCommand(CommandSource &source, Command *command, std::vector<Anope::string> &params)
- {
- if (this->fantasy_channel != NULL)
- {
- if (!command->HasFlag(CFLAG_STRIP_CHANNEL))
- params.insert(params.begin(), this->fantasy_channel->name);
- source.c = this->fantasy_channel;
- }
-
- return EVENT_CONTINUE;
- }
-
- void OnJoinChannel(User *user, Channel *c)
- {
- if (c->ci && c->ci->bi)
- {
- /**
- * We let the bot join even if it was an ignored user, as if we don't,
- * and the ignored user doesnt just leave, the bot will never
- * make it into the channel, leaving the channel botless even for
- * legit users - Rob
- **/
- if (c->users.size() >= Config->BSMinUsers && !c->FindUser(c->ci->bi))
- c->ci->bi->Join(c, &Config->BotModeList);
- /* Only display the greet if the main uplink we're connected
- * to has synced, or we'll get greet-floods when the net
- * recovers from a netsplit. -GD
- */
- if (c->FindUser(c->ci->bi) && c->ci->botflags.HasFlag(BS_GREET) && user->Account() && !user->Account()->greet.empty() && c->ci->HasPriv(user, CA_GREET) && user->server->IsSynced())
- {
- ircdproto->SendPrivmsg(c->ci->bi, c->name, "[%s] %s", user->Account()->display.c_str(), user->Account()->greet.c_str());
- c->ci->bi->lastmsg = Anope::CurTime;
- }
- }
- }
-
- void OnLeaveChannel(User *u, Channel *c)
- {
- /* Channel is persistant, it shouldn't be deleted and the service bot should stay */
- if (c->HasFlag(CH_PERSIST) || (c->ci && c->ci->HasFlag(CI_PERSIST)))
- return;
-
- /* Channel is syncing from a netburst, don't destroy it as more users are probably wanting to join immediatly
- * We also don't part the bot here either, if necessary we will part it after the sync
- */
- if (c->HasFlag(CH_SYNCING))
- return;
-
- /* Additionally, do not delete this channel if ChanServ/a BotServ bot is inhabiting it */
- if (c->HasFlag(CH_INHABIT))
- return;
-
- if (c->ci && c->ci->bi && c->users.size() - 1 <= Config->BSMinUsers && c->FindUser(c->ci->bi))
- {
- bool persist = c->HasFlag(CH_PERSIST);
- c->SetFlag(CH_PERSIST);
- c->ci->bi->Part(c->ci->c);
- if (!persist)
- c->UnsetFlag(CH_PERSIST);
- }
- }
-
- void OnPreHelp(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!params.empty() || source.owner->nick != Config->BotServ)
- return;
- source.Reply(_("\002%s\002 allows you to have a bot on your own channel.\n"
- "It has been created for users that can't host or\n"
- "configure a bot, or for use on networks that don't\n"
- "allow user bots. Available commands are listed \n"
- "below; to use them, type \002%s%s \037command\037\002. For\n"
- "more information on a specific command, type\n"
- "\002%s%s %s \037command\037\002.\n "),
- Config->BotServ.c_str(), Config->UseStrictPrivMsgString.c_str(), Config->BotServ.c_str(),
- Config->UseStrictPrivMsgString.c_str(), Config->BotServ.c_str(), source.command.c_str());
- }
-
- void OnPostHelp(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!params.empty() || source.owner->nick != Config->BotServ)
- return;
- source.Reply(_(" \n"
- "Bot will join a channel whenever there is at least\n"
- "\002%d\002 user(s) on it. Additionally, all %s commands\n"
- "can be used if fantasy is enabled by prefixing the command\n"
- "name with a %c."), Config->BSMinUsers, Config->ChanServ.c_str(), Config->BSFantasyCharacter[0]);
- }
-
- EventReturn OnChannelModeSet(Channel *c, ChannelModeName Name, const Anope::string &param)
- {
- if (Config->BSSmartJoin && Name == CMODE_BAN && c->ci && c->ci->bi && c->FindUser(c->ci->bi))
- {
- BotInfo *bi = c->ci->bi;
-
- Entry ban(CMODE_BAN, param);
- if (ban.Matches(bi))
- c->RemoveMode(bi, CMODE_BAN, param);
- }
-
- return EVENT_CONTINUE;
- }
-};
-
-MODULE_INIT(BotServCore)
-
diff --git a/modules/core/bs_set.cpp b/modules/core/bs_set.cpp
deleted file mode 100644
index ccd1bb615..000000000
--- a/modules/core/bs_set.cpp
+++ /dev/null
@@ -1,307 +0,0 @@
-/* BotServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandBSSet : public Command
-{
- public:
- CommandBSSet(Module *creator) : Command(creator, "botserv/set", 3, 3)
- {
- this->SetDesc(_("Configures bot options"));
- this->SetSyntax(_("\037(channel | bot)\037 \037option\037 \037settings\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- 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)
- source.Reply(_("Sorry, bot option setting is temporarily disabled."));
- else if (u->HasCommand("botserv/botserv/set/private") && option.equals_ci("PRIVATE"))
- {
- BotInfo *bi;
-
- if (!(bi = findbot(chan)))
- {
- source.Reply(BOT_DOES_NOT_EXIST, chan.c_str());
- return;
- }
-
- if (value.equals_ci("ON"))
- {
- bi->SetFlag(BI_PRIVATE);
- source.Reply(_("Private mode of bot %s is now \002on\002."), bi->nick.c_str());
- }
- else if (value.equals_ci("OFF"))
- {
- bi->UnsetFlag(BI_PRIVATE);
- source.Reply(_("Private mode of bot %s is now \002off\002."), bi->nick.c_str());
- }
- else
- this->OnSyntaxError(source, "PRIVATE");
- return;
- }
- else if (!(ci = cs_findchan(chan)))
- source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
- else if (!u->HasPriv("botserv/administration") && !ci->HasPriv(u, CA_SET))
- source.Reply(ACCESS_DENIED);
- else
- {
- bool override = !ci->HasPriv(u, CA_SET);
- Log(override ? LOG_ADMIN : LOG_COMMAND, u, this, ci) << option << " " << value;
-
- if (option.equals_ci("DONTKICKOPS"))
- {
- if (value.equals_ci("ON"))
- {
- ci->botflags.SetFlag(BS_DONTKICKOPS);
- source.Reply(_("Bot \002won't kick ops\002 on channel %s."), ci->name.c_str());
- }
- else if (value.equals_ci("OFF"))
- {
- ci->botflags.UnsetFlag(BS_DONTKICKOPS);
- source.Reply(_("Bot \002will kick ops\002 on channel %s."), ci->name.c_str());
- }
- else
- this->OnSyntaxError(source, "DONTKICKOPS");
- }
- else if (option.equals_ci("DONTKICKVOICES"))
- {
- if (value.equals_ci("ON"))
- {
- ci->botflags.SetFlag(BS_DONTKICKVOICES);
- source.Reply(_("Bot \002won't kick voices\002 on channel %s."), ci->name.c_str());
- }
- else if (value.equals_ci("OFF"))
- {
- ci->botflags.UnsetFlag(BS_DONTKICKVOICES);
- source.Reply(_("Bot \002will kick voices\002 on channel %s."), ci->name.c_str());
- }
- else
- this->OnSyntaxError(source, "DONTKICKVOICE");
- }
- else if (option.equals_ci("FANTASY"))
- {
- if (value.equals_ci("ON"))
- {
- ci->botflags.SetFlag(BS_FANTASY);
- source.Reply(_("Fantasy mode is now \002on\002 on channel %s."), ci->name.c_str());
- }
- else if (value.equals_ci("OFF"))
- {
- ci->botflags.UnsetFlag(BS_FANTASY);
- source.Reply(_("Fantasy mode is now \002off\002 on channel %s."), ci->name.c_str());
- }
- else
- this->OnSyntaxError(source, "FANTASY");
- }
- else if (option.equals_ci("GREET"))
- {
- if (value.equals_ci("ON"))
- {
- ci->botflags.SetFlag(BS_GREET);
- source.Reply(_("Greet mode is now \002on\002 on channel %s."), ci->name.c_str());
- }
- else if (value.equals_ci("OFF"))
- {
- ci->botflags.UnsetFlag(BS_GREET);
- source.Reply(_("Greet mode is now \002off\002 on channel %s."), ci->name.c_str());
- }
- else
- this->OnSyntaxError(source, "GREET");
- }
- else if (u->HasCommand("botserv/botserv/set/nobot") && option.equals_ci("NOBOT"))
- {
- if (value.equals_ci("ON"))
- {
- ci->botflags.SetFlag(BS_NOBOT);
- if (ci->bi)
- ci->bi->UnAssign(u, ci);
- source.Reply(_("No Bot mode is now \002on\002 on channel %s."), ci->name.c_str());
- }
- else if (value.equals_ci("OFF"))
- {
- ci->botflags.UnsetFlag(BS_NOBOT);
- source.Reply(_("No Bot mode is now \002off\002 on channel %s."), ci->name.c_str());
- }
- else
- this->OnSyntaxError(source, "NOBOT");
- }
- else if (option.equals_ci("MSG"))
- {
- if (value.equals_ci("OFF"))
- {
- ci->botflags.UnsetFlag(BS_MSG_PRIVMSG);
- ci->botflags.UnsetFlag(BS_MSG_NOTICE);
- ci->botflags.UnsetFlag(BS_MSG_NOTICEOPS);
- source.Reply(_("Fantasy replies will no longer be sent to %s."), ci->name.c_str());
- }
- else if (value.equals_ci("PRIVMSG"))
- {
- ci->botflags.SetFlag(BS_MSG_PRIVMSG);
- ci->botflags.UnsetFlag(BS_MSG_NOTICE);
- ci->botflags.UnsetFlag(BS_MSG_NOTICEOPS);
- source.Reply(_("Fantasy replies will be sent via PRIVMSG to %s."), ci->name.c_str());
- }
- else if (value.equals_ci("NOTICE"))
- {
- ci->botflags.UnsetFlag(BS_MSG_PRIVMSG);
- ci->botflags.SetFlag(BS_MSG_NOTICE);
- ci->botflags.UnsetFlag(BS_MSG_NOTICEOPS);
- source.Reply(_("Fantasy replies will be sent via NOTICE to %s."), ci->name.c_str());
- }
- else if (value.equals_ci("NOTICEOPS"))
- {
- ci->botflags.UnsetFlag(BS_MSG_PRIVMSG);
- ci->botflags.UnsetFlag(BS_MSG_NOTICE);
- ci->botflags.SetFlag(BS_MSG_NOTICEOPS);
- source.Reply(_("Fantasy replies will be sent via NOTICE to channel ops on %s."), ci->name.c_str());
- }
- else
- this->OnSyntaxError(source, "MSG");
- }
- else
- source.Reply(UNKNOWN_OPTION, option.c_str(), Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str(), this->name.c_str());
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- if (subcommand.empty())
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Configures bot options. \037option\037 can be one of:\n"
- " \n"
- " DONTKICKOPS To protect ops against bot kicks\n"
- " DONTKICKVOICES To protect voices against bot kicks\n"
- " GREET Enable greet messages\n"
- " FANTASY Enable fantaisist commands\n"
- " MSG Configure how fantasy commands should be replied to\n"
- " \n"
- "Type \002%s%s HELP SET \037option\037\002 for more information\n"
- "on a specific option.\n"
- "Note: access to this command is controlled by the\n"
- "level SET."), Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str());
- User *u = source.u;
- if (u->IsServicesOper())
- source.Reply(_("These options are reserved to Services Operators:\n"
- " \n"
- " NOBOT Prevent a bot from being assigned to \n"
- " a channel\n"
- " PRIVATE Prevent a bot from being assigned by\n"
- " non IRC operators"));
- }
- else if (subcommand.equals_ci("DONTKICKOPS"))
- source.Reply(_("Syntax: \002SET \037channel\037 DONTKICKOPS {\037ON|OFF\037}\n"
- " \n"
- "Enables or disables \002ops protection\002 mode on a channel.\n"
- "When it is enabled, ops won't be kicked by the bot\n"
- "even if they don't match the NOKICK level."));
- else if (subcommand.equals_ci("DONTKICKVOICES"))
- source.Reply(_("Syntax: \002SET \037channel\037 DONTKICKVOICES {\037ON|OFF\037}\n"
- " \n"
- "Enables or disables \002voices protection\002 mode on a channel.\n"
- "When it is enabled, voices won't be kicked by the bot\n"
- "even if they don't match the NOKICK level."));
- else if (subcommand.equals_ci("FANTASY"))
- source.Reply(_("Syntax: \002SET \037channel\037 FANTASY {\037ON|OFF\037}\n"
- "Enables or disables \002fantasy\002 mode on a channel.\n"
- "When it is enabled, users will be able to use\n"
- "commands !op, !deop, !voice, !devoice,\n"
- "!kick, !kb, !unban, !seen on a channel (find how \n"
- "to use them; try with or without nick for each, \n"
- "and with a reason for some?).\n"
- " \n"
- "Note that users wanting to use fantaisist\n"
- "commands MUST have enough level for both\n"
- "the FANTASIA and another level depending\n"
- "of the command if required (for example, to use \n"
- "!op, user must have enough access for the OPDEOP\n"
- "level)."));
- else if (subcommand.equals_ci("GREET"))
- source.Reply(_("Syntax: \002SET \037channel\037 GREET {\037ON|OFF\037}\n"
- " \n"
- "Enables or disables \002greet\002 mode on a channel.\n"
- "When it is enabled, the bot will display greet\n"
- "messages of users joining the channel, provided\n"
- "they have enough access to the channel."));
- else if (subcommand.equals_ci("NOBOT"))
- source.Reply(_("Syntax: \002SET \037channel\037 NOBOT {\037ON|OFF\037}\002\n"
- " \n"
- "This option makes a channel be unassignable. If a bot \n"
- "is already assigned to the channel, it is unassigned\n"
- "automatically when you enable the option."));
- else if (subcommand.equals_ci("PRIVATE"))
- source.Reply(_("Syntax: \002SET \037bot-nick\037 PRIVATE {\037ON|OFF\037}\002\n"
- "This option prevents a bot from being assigned to a\n"
- "channel by users that aren't IRC operators."));
- else if (subcommand.equals_ci("MSG"))
- source.Reply(_("Syntax: \002SET \037channel\037 MSG {\037OFF|PRIVMSG|NOTICE|NOTICEOPS\037}\002\n"
- " \n"
- "Configures how fantasy commands should be returned to the channel. Off disables\n"
- "fantasy from replying to the channel. Privmsg, notice, and noticeops message the\n"
- "channel, notice the channel, and notice the channel ops respectively.\n"
- " \n"
- "Note that replies over one line will not use this setting to prevent spam, and will\n"
- "go directly to the user who executed it."));
- else
- return false;
-
- return true;
- }
-
- void OnSyntaxError(CommandSource &source, const Anope::string &subcommand)
- {
- if (subcommand.empty())
- Command::OnSyntaxError(source, "");
- else if (subcommand.equals_ci("PRIVATE"))
- this->SendSyntax(source, "\037botname\037 PRIVATE {\037ON|OFF\037}");
- else if (subcommand.equals_ci("DONTKICKOPS"))
- this->SendSyntax(source, "\037channel\037 DONTKICKOPS {\037ON|OFF\037}");
- else if (subcommand.equals_ci("DONTKICKVOICES"))
- this->SendSyntax(source, "\037channel\037 DONTKICKVOICES {\037ON|OFF\037}");
- else if (subcommand.equals_ci("FANTASY"))
- this->SendSyntax(source, "\037channel\037 FANTASY {\037ON|OFF\037}");
- else if (subcommand.equals_ci("GREET"))
- this->SendSyntax(source, "\037channel\037 GREET {\037ON|OFF\037}");
- else if (subcommand.equals_ci("MSG"))
- this->SendSyntax(source, "\037botname\037 NOBOT {\037ON|OFF\037}");
- else if (subcommand.equals_ci("NOBOT"))
- this->SendSyntax(source, "\037botname\037 NOBOT {\037ON|OFF\037}");
- }
-};
-
-class BSSet : public Module
-{
- CommandBSSet commandbsset;
-
- public:
- BSSet(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandbsset(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandbsset);
- }
-};
-
-MODULE_INIT(BSSet)
diff --git a/modules/core/cs_access.cpp b/modules/core/cs_access.cpp
deleted file mode 100644
index 777b0c176..000000000
--- a/modules/core/cs_access.cpp
+++ /dev/null
@@ -1,915 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-enum
-{
- ACCESS_INVALID = -10000,
- ACCESS_FOUNDER = 10001
-};
-
-static struct AccessLevels
-{
- ChannelAccess priv;
- int default_level;
- Anope::string config_name;
- Anope::string name;
- Anope::string desc;
-} defaultLevels[] = {
- { CA_ACCESS_CHANGE, 10, "level_change", "ACC-CHANGE", _("Allowed to modify the access list") },
- { CA_ACCESS_LIST, 1, "level_list", "ACC-LIST", _("Allowed to view the access list") },
- { CA_AKICK, 10, "level_akick", "AKICK", _("Allowed to use AKICK command") },
- { CA_ASSIGN, ACCESS_FOUNDER, "level_assign", "ASSIGN", _("Allowed to assign/unassign a bot") },
- { CA_AUTOHALFOP, 4, "level_autohalfop", "AUTOHALFOP", _("Automatic mode +h") },
- { CA_AUTOOP, 5, "level_autoop", "AUTOOP", _("Automatic channel operator status") },
- { CA_AUTOOWNER, 10000, "level_autoowner", "AUTOOWNER", _("Automatic mode +q") },
- { CA_AUTOPROTECT, 10, "level_autoprotect", "AUTOPROTECT", _("Automatic mode +a") },
- { CA_AUTOVOICE, 3, "level_autovoice", "AUTOVOICE", _("Automatic mode +v") },
- { CA_BADWORDS, 10, "level_badwords", "BADWORDS", _("Allowed to modify channel badwords list") },
- { CA_BAN, 4, "level_ban", "BAN", _("Allowed to use ban users") },
- { CA_FANTASIA, 3, "level_fantasia", "FANTASIA", _("Allowed to use fantaisist commands") },
- { CA_FOUNDER, ACCESS_FOUNDER, "level_founder", "FOUNDER", _("Allowed to issue commands restricted to channel founders") },
- { CA_GETKEY, 5, "level_getkey", "GETKEY", _("Allowed to use GETKEY command") },
- { CA_GREET, 5, "level_greet", "GREET", _("Greet message displayed") },
- { CA_HALFOP, 5, "level_halfop", "HALFOP", _("Allowed to (de)halfop users") },
- { CA_HALFOPME, 4, "level_halfopme", "HALFOPME", _("Allowed to (de)halfop him/herself") },
- { CA_INFO, 10000, "level_info", "INFO", _("Allowed to use INFO command with ALL option") },
- { CA_INVITE, 5, "level_invite", "INVITE", _("Allowed to use the INVITE command") },
- { CA_KICK, 4, "level_kick", "KICK", _("Allowed to use the KICK command") },
- { CA_MEMO, 10, "level_memo", "MEMO", _("Allowed to read channel memos") },
- { CA_MODE, 5, "level_mode", "MODE", _("Allowed to change channel modes") },
- { CA_NOKICK, 1, "level_nokick", "NOKICK", _("Never kicked by the bot's kickers") },
- { CA_OPDEOP, 5, "level_opdeop", "OPDEOP", _("Allowed to (de)op users") },
- { CA_OPDEOPME, 5, "level_opdeopme", "OPDEOPME", _("Allowed to (de)op him/herself") },
- { CA_OWNER, ACCESS_FOUNDER, "level_owner", "OWNER", _("Allowed to use (de)owner users") },
- { CA_OWNERME, 10000, "level_ownerme", "OWNERME", _("Allowed to (de)owner him/herself") },
- { CA_PROTECT, 10000, "level_protect", "PROTECT", _("Allowed to (de)protect users") },
- { CA_PROTECTME, 10, "level_protectme", "PROTECTME", _("Allowed to (de)protect him/herself"), },
- { CA_SAY, 5, "level_say", "SAY", _("Allowed to use SAY and ACT commands") },
- { CA_SIGNKICK, ACCESS_FOUNDER, "level_signkick", "SIGNKICK", _("No signed kick when SIGNKICK LEVEL is used") },
- { CA_SET, 10000, "level_set", "SET", _("Allowed to set channel settings") },
- { CA_TOPIC, 5, "level_topic", "TOPIC", _("Allowed to change channel topics") },
- { CA_UNBAN, 4, "level_unban", "UNBAN", _("Allowed to unban users") },
- { CA_VOICE, 4, "level_voice", "VOICE", _("Allowed to (de)voice users") },
- { CA_VOICEME, 3, "level_voiceme", "VOICEME", _("Allowed to (de)voice him/herself") },
- { CA_SIZE, -1, "", "", "" }
-};
-
-static void reset_levels(ChannelInfo *ci)
-{
- for (int i = 0; defaultLevels[i].priv != CA_SIZE; ++i)
- ci->levels[defaultLevels[i].priv] = defaultLevels[i].default_level;
-}
-
-class AccessChanAccess : public ChanAccess
-{
- public:
- int level;
-
- AccessChanAccess(AccessProvider *p) : ChanAccess(p)
- {
- }
-
- bool Matches(User *u, NickCore *nc)
- {
- if (u && (Anope::Match(u->nick, this->mask) || Anope::Match(u->GetMask(), this->mask)))
- return true;
- else if (nc && Anope::Match(nc->display, this->mask))
- return true;
- return false;
- }
-
- bool HasPriv(ChannelAccess priv)
- {
- for (int i = 0; defaultLevels[i].priv != CA_SIZE; ++i)
- if (defaultLevels[i].priv == priv)
- return DetermineLevel(this) >= this->ci->levels[priv];
- return false;
- }
-
- Anope::string Serialize()
- {
- return stringify(this->level);
- }
-
- void Unserialize(const Anope::string &data)
- {
- this->level = convertTo<int>(data);
- }
-
- static int DetermineLevel(ChanAccess *access)
- {
- if (access->provider->name == "access/access")
- {
- AccessChanAccess *aaccess = debug_cast<AccessChanAccess *>(access);
- return aaccess->level;
- }
- else
- {
- int highest = 1;
- for (int i = 0; defaultLevels[i].priv != CA_SIZE; ++i)
- if (access->ci->levels[defaultLevels[i].priv] > highest && access->HasPriv(defaultLevels[i].priv))
- highest = access->ci->levels[defaultLevels[i].priv];
- return highest;
- }
- }
-};
-
-class AccessAccessProvider : public AccessProvider
-{
- public:
- AccessAccessProvider(Module *o) : AccessProvider(o, "access/access")
- {
- }
-
- ChanAccess *Create()
- {
- return new AccessChanAccess(this);
- }
-};
-
-class AccessListCallback : public NumberList
-{
- protected:
- CommandSource &source;
- ChannelInfo *ci;
- bool SentHeader;
- public:
- AccessListCallback(CommandSource &_source, ChannelInfo *_ci, const Anope::string &numlist) : NumberList(numlist, false), source(_source), ci(_ci), SentHeader(false)
- {
- }
-
- ~AccessListCallback()
- {
- if (SentHeader)
- source.Reply(_("End of access list."));
- else
- source.Reply(_("No matching entries on %s access list."), ci->name.c_str());
- }
-
- virtual void HandleNumber(unsigned Number)
- {
- if (!Number || Number > ci->GetAccessCount())
- return;
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(CHAN_ACCESS_LIST_HEADER, ci->name.c_str());
- }
-
- DoList(source, ci, Number - 1, ci->GetAccess(Number - 1));
- }
-
- static void DoList(CommandSource &source, ChannelInfo *ci, unsigned Number, ChanAccess *access)
- {
- source.Reply(_(" %3d %4d %s"), Number + 1, AccessChanAccess::DetermineLevel(access), access->mask.c_str());
- }
-};
-
-class AccessViewCallback : public AccessListCallback
-{
- public:
- AccessViewCallback(CommandSource &_source, ChannelInfo *_ci, const Anope::string &numlist) : AccessListCallback(_source, _ci, numlist)
- {
- }
-
- void HandleNumber(unsigned Number)
- {
- if (!Number || Number > ci->GetAccessCount())
- return;
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(CHAN_ACCESS_LIST_HEADER, ci->name.c_str());
- }
-
- DoList(source, ci, Number - 1, ci->GetAccess(Number - 1));
- }
-
- static void DoList(CommandSource &source, ChannelInfo *ci, unsigned Number, ChanAccess *access)
- {
- Anope::string timebuf;
- if (ci->c)
- for (CUserList::const_iterator cit = ci->c->users.begin(), cit_end = ci->c->users.end(); cit != cit_end; ++cit)
- if (access->Matches((*cit)->user, (*cit)->user->Account()))
- timebuf = "Now";
- if (timebuf.empty())
- {
- if (access->last_seen == 0)
- timebuf = "Never";
- else
- timebuf = do_strftime(access->last_seen);
- }
-
- source.Reply(CHAN_ACCESS_VIEW_AXS_FORMAT, Number + 1, AccessChanAccess::DetermineLevel(access), access->mask.c_str(), access->creator.c_str(), timebuf.c_str());
- }
-};
-
-class AccessDelCallback : public NumberList
-{
- CommandSource &source;
- ChannelInfo *ci;
- Command *c;
- unsigned Deleted;
- Anope::string Nicks;
- bool Denied;
- bool override;
- public:
- AccessDelCallback(CommandSource &_source, ChannelInfo *_ci, Command *_c, const Anope::string &numlist) : NumberList(numlist, true), source(_source), ci(_ci), c(_c), Deleted(0), Denied(false)
- {
- if (!ci->HasPriv(source.u, CA_ACCESS_CHANGE) && source.u->HasPriv("chanserv/access/modify"))
- this->override = true;
- }
-
- ~AccessDelCallback()
- {
- if (Denied && !Deleted)
- source.Reply(ACCESS_DENIED);
- else if (!Deleted)
- source.Reply(_("No matching entries on %s access list."), ci->name.c_str());
- else
- {
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, c, ci) << "for user" << (Deleted == 1 ? " " : "s ") << Nicks;
-
- if (Deleted == 1)
- source.Reply(_("Deleted 1 entry from %s access list."), ci->name.c_str());
- else
- source.Reply(_("Deleted %d entries from %s access list."), Deleted, ci->name.c_str());
- }
- }
-
- void HandleNumber(unsigned Number)
- {
- if (!Number || Number > ci->GetAccessCount())
- return;
-
- User *u = source.u;
-
- ChanAccess *access = ci->GetAccess(Number - 1);
-
- AccessGroup u_access = ci->AccessFor(u);
- ChanAccess *u_highest = u_access.Highest();
-
- if (u_highest ? AccessChanAccess::DetermineLevel(u_highest) : 0 <= AccessChanAccess::DetermineLevel(access) && !u->HasPriv("chanserv/access/modify"))
- {
- Denied = true;
- return;
- }
-
- ++Deleted;
- if (!Nicks.empty())
- Nicks += ", " + access->mask;
- else
- Nicks = access->mask;
-
- FOREACH_MOD(I_OnAccessDel, OnAccessDel(ci, u, access));
-
- ci->EraseAccess(Number - 1);
- }
-};
-
-class CommandCSAccess : public Command
-{
- void DoAdd(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- Anope::string mask = params[2];
- int level = ACCESS_INVALID;
-
- try
- {
- level = convertTo<int>(params[3]);
- }
- catch (const ConvertException &) { }
-
- if (!level)
- {
- source.Reply(_("Access level must be non-zero."));
- return;
- }
-
- AccessGroup u_access = ci->AccessFor(u);
- ChanAccess *highest = u_access.Highest();
- int u_level = (highest ? AccessChanAccess::DetermineLevel(highest) : 0);
- if (!ci->HasPriv(u, CA_FOUNDER) && level >= u_level && !u->HasPriv("chanserv/access/modify"))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
- else if (level <= ACCESS_INVALID || level >= ACCESS_FOUNDER)
- {
- source.Reply(CHAN_ACCESS_LEVEL_RANGE, ACCESS_INVALID + 1, ACCESS_FOUNDER - 1);
- return;
- }
-
- bool override = !ci->HasPriv(u, CA_ACCESS_CHANGE) || level >= u_level;
-
- for (unsigned i = ci->GetAccessCount(); i > 0; --i)
- {
- ChanAccess *access = ci->GetAccess(i - 1);
- if (mask.equals_ci(access->mask))
- {
- /* Don't allow lowering from a level >= u_level */
- if (AccessChanAccess::DetermineLevel(access) >= u_level && !u->HasPriv("chanserv/access/modify"))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
- ci->EraseAccess(i - 1);
- break;
- }
- }
-
- if (ci->GetAccessCount() >= Config->CSAccessMax)
- {
- source.Reply(_("Sorry, you can only have %d access entries on a channel."), Config->CSAccessMax);
- return;
- }
-
- if (mask.find_first_of("!*@") == Anope::string::npos && findnick(mask) == NULL)
- mask += "!*@*";
-
- service_reference<AccessProvider> provider("access/access");
- if (!provider)
- return;
- AccessChanAccess *access = debug_cast<AccessChanAccess *>(provider->Create());
- access->ci = ci;
- access->mask = mask;
- access->creator = u->nick;
- access->level = level;
- access->last_seen = 0;
- access->created = Anope::CurTime;
- ci->AddAccess(access);
-
- FOREACH_MOD(I_OnAccessAdd, OnAccessAdd(ci, u, access));
-
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "ADD " << mask << " (level: " << level << ") as level " << u_level;
- source.Reply(_("\002%s\002 added to %s access list at level \002%d\002."), access->mask.c_str(), ci->name.c_str(), level);
-
- return;
- }
-
- void DoDel(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- const Anope::string &mask = params[2];
-
- if (!ci->GetAccessCount())
- source.Reply(_("%s access list is empty."), ci->name.c_str());
- else if (isdigit(mask[0]) && mask.find_first_not_of("1234567890,-") == Anope::string::npos)
- {
- AccessDelCallback list(source, ci, this, mask);
- list.Process();
- }
- else
- {
- AccessGroup u_access = ci->AccessFor(u);
- ChanAccess *highest = u_access.Highest();
- int u_level = (highest ? AccessChanAccess::DetermineLevel(highest) : 0);
-
- for (unsigned i = ci->GetAccessCount(); i > 0; --i)
- {
- ChanAccess *access = ci->GetAccess(i - 1);
- if (mask.equals_ci(access->mask))
- {
- int access_level = AccessChanAccess::DetermineLevel(access);
- if (!access->mask.equals_ci(u->Account()->display) && u_level <= access_level && !u->HasPriv("chanserv/access/modify"))
- source.Reply(ACCESS_DENIED);
- else
- {
- source.Reply(_("\002%s\002 deleted from %s access list."), access->mask.c_str(), ci->name.c_str());
- bool override = !ci->HasPriv(u, CA_ACCESS_CHANGE) && !access->mask.equals_ci(u->Account()->display);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "DEL " << access->mask;
-
- FOREACH_MOD(I_OnAccessDel, OnAccessDel(ci, u, access));
- ci->EraseAccess(access);
- }
- return;
- }
- }
-
- source.Reply(_("\002%s\002 not found on %s access list."), mask.c_str(), ci->name.c_str());
- }
-
- return;
- }
-
- void DoList(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> &params)
- {
- const Anope::string &nick = params.size() > 2 ? params[2] : "";
-
- if (!ci->GetAccessCount())
- source.Reply(_("%s access list is empty."), ci->name.c_str());
- else if (!nick.empty() && nick.find_first_not_of("1234567890,-") == Anope::string::npos)
- {
- AccessListCallback list(source, ci, nick);
- list.Process();
- }
- else
- {
- bool SentHeader = false;
-
- for (unsigned i = 0, end = ci->GetAccessCount(); i < end; ++i)
- {
- ChanAccess *access = ci->GetAccess(i);
-
- if (!nick.empty() && !Anope::Match(access->mask, nick))
- continue;
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(CHAN_ACCESS_LIST_HEADER, ci->name.c_str());
- }
-
- AccessListCallback::DoList(source, ci, i, access);
- }
-
- if (SentHeader)
- source.Reply(_("End of access list."));
- else
- source.Reply(_("No matching entries on %s access list."), ci->name.c_str());
- }
-
- return;
- }
-
- void DoView(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> &params)
- {
- const Anope::string &nick = params.size() > 2 ? params[2] : "";
-
- if (!ci->GetAccessCount())
- source.Reply(_("%s access list is empty."), ci->name.c_str());
- else if (!nick.empty() && nick.find_first_not_of("1234567890,-") == Anope::string::npos)
- {
- AccessViewCallback list(source, ci, nick);
- list.Process();
- }
- else
- {
- bool SentHeader = false;
-
- for (unsigned i = 0, end = ci->GetAccessCount(); i < end; ++i)
- {
- ChanAccess *access = ci->GetAccess(i);
-
- if (!nick.empty() && !Anope::Match(access->mask, nick))
- continue;
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(CHAN_ACCESS_LIST_HEADER, ci->name.c_str());
- }
-
- AccessViewCallback::DoList(source, ci, i, access);
- }
-
- if (SentHeader)
- source.Reply(_("End of access list."));
- else
- source.Reply(_("No matching entries on %s access list."), ci->name.c_str());
- }
-
- return;
- }
-
- void DoClear(CommandSource &source, ChannelInfo *ci)
- {
- User *u = source.u;
-
- if (!IsFounder(u, ci) && !u->HasPriv("chanserv/access/modify"))
- source.Reply(ACCESS_DENIED);
- else
- {
- ci->ClearAccess();
-
- FOREACH_MOD(I_OnAccessClear, OnAccessClear(ci, u));
-
- source.Reply(_("Channel %s access list has been cleared."), ci->name.c_str());
-
- bool override = !IsFounder(u, ci);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "CLEAR";
- }
-
- return;
- }
-
- public:
- CommandCSAccess(Module *creator) : Command(creator, "chanserv/access", 2, 4)
- {
- this->SetDesc(_("Modify the list of privileged users"));
- this->SetSyntax(_("\037channel\037 ADD \037mask\037 \037level\037"));
- this->SetSyntax(_("\037channel\037 DEL {\037mask\037 | \037entry-num\037 | \037list\037}"));
- this->SetSyntax(_("\037channel\037 LIST [\037mask\037 | \037list\037]"));
- this->SetSyntax(_("\037channel\037 VIEW [\037mask\037 | \037list\037]"));
- this->SetSyntax(_("\037channel\037 CLEAR\002"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &cmd = params[1];
- const Anope::string &nick = params.size() > 2 ? params[2] : "";
- const Anope::string &s = params.size() > 3 ? params[3] : "";
-
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- bool is_list = cmd.equals_ci("LIST") || cmd.equals_ci("VIEW");
- bool is_clear = cmd.equals_ci("CLEAR");
- bool is_del = cmd.equals_ci("DEL");
-
- bool has_access = false;
- if (u->HasPriv("chanserv/access/modify"))
- has_access = true;
- else if (is_list && ci->HasPriv(u, CA_ACCESS_LIST))
- has_access = true;
- else if (ci->HasPriv(u, CA_ACCESS_CHANGE))
- has_access = true;
- else if (is_del)
- {
- NickAlias *na = findnick(nick);
- if (na && na->nc == u->Account())
- has_access = true;
- }
-
- /* If LIST, we don't *require* any parameters, but we can take any.
- * If DEL, we require a nick and no level.
- * Else (ADD), we require a level (which implies a nick). */
- if (is_list || is_clear ? 0 : (cmd.equals_ci("DEL") ? (nick.empty() || !s.empty()) : s.empty()))
- this->OnSyntaxError(source, cmd);
- else if (!has_access)
- source.Reply(ACCESS_DENIED);
- else if (readonly && !is_list)
- source.Reply(_("Sorry, channel access list modification is temporarily disabled."));
- else if (cmd.equals_ci("ADD"))
- this->DoAdd(source, ci, params);
- else if (cmd.equals_ci("DEL"))
- this->DoDel(source, ci, params);
- else if (cmd.equals_ci("LIST"))
- this->DoList(source, ci, params);
- else if (cmd.equals_ci("VIEW"))
- this->DoView(source, ci, params);
- else if (cmd.equals_ci("CLEAR"))
- this->DoClear(source, ci);
- else
- this->OnSyntaxError(source, "");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Maintains the \002access list\002 for a channel. The access\n"
- "list specifies which users are allowed chanop status or\n"
- "access to %s commands on the channel. Different\n"
- "user levels allow for access to different subsets of\n"
- "privileges. Any nick not on the access list has\n"
- "a user level of 0."), source.owner->nick.c_str());
- source.Reply(" ");
- source.Reply(_("The \002ACCESS ADD\002 command adds the given mask to the\n"
- "access list with the given user level; if the mask is\n"
- "already present on the list, its access level is changed to\n"
- "the level specified in the command. The \037level\037 specified\n"
- "must be less than that of the user giving the command, and\n"
- "if the \037mask\037 is already on the access list, the current\n"
- "access level of that nick must be less than the access level\n"
- "of the user giving the command. When a user joins the channel\n"
- "the access they receive is from the highest level entry in the\n"
- "access list."));
- source.Reply(" ");
- source.Reply(_("The \002ACCESS DEL\002 command removes the given nick from the\n"
- "access list. If a list of entry numbers is given, those\n"
- "entries are deleted. (See the example for LIST below.)\n"
- "You may remove yourself from an access list, even if you\n"
- "do not have access to modify that list otherwise."));
- source.Reply(" ");
- source.Reply(_("The \002ACCESS LIST\002 command displays the access list. If\n"
- "a wildcard mask is given, only those entries matching the\n"
- "mask are displayed. If a list of entry numbers is given,\n"
- "only those entries are shown; for example:\n"
- " \002ACCESS #channel LIST 2-5,7-9\002\n"
- " Lists access entries numbered 2 through 5 and\n"
- " 7 through 9.\n"
- " \n"
- "The \002ACCESS VIEW\002 command displays the access list similar\n"
- "to \002ACCESS LIST\002 but shows the creator and last used time.\n"
- " \n"
- "The \002ACCESS CLEAR\002 command clears all entries of the\n"
- "access list."));
- source.Reply(_("\002User access levels\002\n"
- " \n"
- "By default, the following access levels are defined:\n"
- " \n"
- " \002Founder\002 Full access to %s functions; automatic\n"
- " opping upon entering channel. Note\n"
- " that only one person may have founder\n"
- " status (it cannot be given using the\n"
- " \002ACCESS\002 command).\n"
- " \002 10\002 Access to AKICK command; automatic opping.\n"
- " \002 5\002 Automatic opping.\n"
- " \002 3\002 Automatic voicing.\n"
- " \002 0\002 No special privileges; can be opped by other\n"
- " ops (unless \002secure-ops\002 is set).\n"
- " \002 <0\002 May not be opped.\n"
- " \n"
- "These levels may be changed, or new ones added, using the\n"
- "\002LEVELS\002 command; type \002%s%s HELP LEVELS\002 for\n"
- "information."), source.owner->nick.c_str(), Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str());
- return true;
- }
-};
-
-class CommandCSLevels : public Command
-{
- int levelinfo_maxwidth;
-
- void DoSet(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- const Anope::string &what = params[2];
- const Anope::string &lev = params[3];
-
- int level;
-
- if (lev.equals_ci("FOUNDER"))
- level = ACCESS_FOUNDER;
- else
- {
- try
- {
- level = convertTo<int>(lev);
- }
- catch (const ConvertException &)
- {
- this->OnSyntaxError(source, "SET");
- return;
- }
- }
-
- if (level <= ACCESS_INVALID || level > ACCESS_FOUNDER)
- source.Reply(_("Level must be between %d and %d inclusive."), ACCESS_INVALID + 1, ACCESS_FOUNDER - 1);
- else
- {
- for (int i = 0; defaultLevels[i].priv != CA_SIZE; ++i)
- {
- AccessLevels &l = defaultLevels[i];
-
- if (what.equals_ci(l.name))
- {
- ci->levels[l.priv] = level;
- FOREACH_MOD(I_OnLevelChange, OnLevelChange(u, ci, i, level));
-
- bool override = !ci->HasPriv(u, CA_FOUNDER);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "SET " << l.name << " to " << level;
-
- if (level == ACCESS_FOUNDER)
- source.Reply(_("Level for %s on channel %s changed to founder only."), l.name.c_str(), ci->name.c_str());
- else
- source.Reply(_("Level for \002%s\002 on channel %s changed to \002%d\002."), l.name.c_str(), ci->name.c_str(), level);
- return;
- }
- }
-
- source.Reply(_("Setting \002%s\002 not known. Type \002%s%s HELP LEVELS \002 for a list of valid settings."), what.c_str(), Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str());
- }
-
- return;
- }
-
- void DoDisable(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- 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"))
- for (int i = 0; defaultLevels[i].priv != CA_SIZE; ++i)
- {
- AccessLevels &l = defaultLevels[i];
-
- if (what.equals_ci(l.name))
- {
- ci->levels[l.priv] = ACCESS_INVALID;
- FOREACH_MOD(I_OnLevelChange, OnLevelChange(u, ci, i, l.priv));
-
- bool override = !ci->HasPriv(u, CA_FOUNDER);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "DISABLE " << l.name;
-
- source.Reply(_("\002%s\002 disabled on channel %s."), l.name.c_str(), ci->name.c_str());
- return;
- }
- }
-
- source.Reply(_("Setting \002%s\002 not known. Type \002%s%s HELP LEVELS \002 for a list of valid settings."), what.c_str(), Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str());
-
- return;
- }
-
- void DoList(CommandSource &source, ChannelInfo *ci)
- {
- source.Reply(_("Access level settings for channel %s:"), ci->name.c_str());
-
- if (!levelinfo_maxwidth)
- for (int i = 0; defaultLevels[i].priv != CA_SIZE; ++i)
- {
- AccessLevels &l = defaultLevels[i];
-
- int len = l.name.length();
- if (len > levelinfo_maxwidth)
- levelinfo_maxwidth = len;
- }
-
- for (int i = 0; defaultLevels[i].priv != CA_SIZE; ++i)
- {
- AccessLevels &l = defaultLevels[i];
- int j = ci->levels[l.priv];
-
- if (j == ACCESS_INVALID)
- source.Reply(_(" %-*s (disabled)"), levelinfo_maxwidth, l.name.c_str());
- else if (j == ACCESS_FOUNDER)
- source.Reply(_(" %-*s (founder only)"), levelinfo_maxwidth, l.name.c_str());
- else
- source.Reply(_(" %-*s %d"), levelinfo_maxwidth, l.name.c_str(), j);
- }
-
- return;
- }
-
- void DoReset(CommandSource &source, ChannelInfo *ci)
- {
- User *u = source.u;
-
- reset_levels(ci);
- FOREACH_MOD(I_OnLevelChange, OnLevelChange(u, ci, -1, 0));
-
- bool override = !ci->HasPriv(u, CA_FOUNDER);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "RESET";
-
- source.Reply(_("Access levels for \002%s\002 reset to defaults."), ci->name.c_str());
- return;
- }
-
- public:
- CommandCSLevels(Module *creator) : Command(creator, "chanserv/levels", 2, 4), levelinfo_maxwidth(0)
- {
- this->SetDesc(_("Redefine the meanings of access levels"));
- this->SetSyntax(_("\037channel\037 SET \037type\037 \037level\037"));
- this->SetSyntax(_("\037channel\037 {DIS | DISABLE} \037type\037"));
- this->SetSyntax(_("\037channel\037 LIST"));
- this->SetSyntax(_("\037channel\037 RESET"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &cmd = params[1];
- const Anope::string &what = params.size() > 2 ? params[2] : "";
- const Anope::string &s = params.size() > 3 ? params[3] : "";
-
- User *u = source.u;
-
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- /* If SET, we want two extra parameters; if DIS[ABLE] or FOUNDER, we want only
- * one; else, we want none.
- */
- if (cmd.equals_ci("SET") ? s.empty() : (cmd.substr(0, 3).equals_ci("DIS") ? (what.empty() || !s.empty()) : !what.empty()))
- this->OnSyntaxError(source, cmd);
- else if (!ci->HasPriv(u, CA_FOUNDER) && !u->HasPriv("chanserv/access/modify"))
- source.Reply(ACCESS_DENIED);
- else if (cmd.equals_ci("SET"))
- this->DoSet(source, ci, params);
- else if (cmd.equals_ci("DIS") || cmd.equals_ci("DISABLE"))
- this->DoDisable(source, ci, params);
- else if (cmd.equals_ci("LIST"))
- this->DoList(source, ci);
- else if (cmd.equals_ci("RESET"))
- this->DoReset(source, ci);
- else
- this->OnSyntaxError(source, "");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- if (subcommand.equals_ci("DESC"))
- {
- source.Reply(_("The following feature/function names are understood."));
- if (!levelinfo_maxwidth)
- for (int i = 0; defaultLevels[i].priv != CA_SIZE; ++i)
- {
- AccessLevels &l = defaultLevels[i];
-
- int len = l.name.length();
- if (len > levelinfo_maxwidth)
- levelinfo_maxwidth = len;
- }
- for (int i = 0; defaultLevels[i].priv != CA_SIZE; ++i)
- {
- AccessLevels &l = defaultLevels[i];
- source.Reply(_(" %-*s %s"), levelinfo_maxwidth, l.name.c_str(), translate(source.u, l.desc.c_str()));
- }
- }
- else
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("The \002LEVELS\002 command allows fine control over the meaning of\n"
- "the numeric access levels used for channels. With this\n"
- "command, you can define the access level required for most\n"
- "of %s's functions. (The \002SET FOUNDER\002 and this command\n"
- "are always restricted to the channel founder.)\n"
- " \n"
- "\002LEVELS SET\002 allows the access level for a function or group of\n"
- "functions to be changed. \002LEVELS DISABLE\002 (or \002DIS\002 for short)\n"
- "disables an automatic feature or disallows access to a\n"
- "function by anyone, INCLUDING the founder (although, the founder\n"
- "can always reenable it).\n"
- " \n"
- "\002LEVELS LIST\002 shows the current levels for each function or\n"
- "group of functions. \002LEVELS RESET\002 resets the levels to the\n"
- "default levels of a newly-created channel (see\n"
- "\002HELP ACCESS LEVELS\002).\n"
- " \n"
- "For a list of the features and functions whose levels can be\n"
- "set, see \002HELP LEVELS DESC\002."), source.owner->nick.c_str());
- }
- return true;
- }
-};
-
-class CSAccess : public Module
-{
- AccessAccessProvider accessprovider;
- CommandCSAccess commandcsaccess;
- CommandCSLevels commandcslevels;
-
- public:
- CSAccess(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- accessprovider(this), commandcsaccess(this), commandcslevels(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&accessprovider);
- ModuleManager::RegisterService(&commandcsaccess);
- ModuleManager::RegisterService(&commandcslevels);
-
- Implementation i[] = { I_OnReload, I_OnChanRegistered };
- ModuleManager::Attach(i, this, 2);
-
- this->OnReload();
- }
-
- void OnReload()
- {
- ConfigReader config;
-
- for (int i = 0; defaultLevels[i].priv != CA_SIZE; ++i)
- {
- AccessLevels &l = defaultLevels[i];
-
- const Anope::string &value = config.ReadValue("chanserv", l.config_name, "", 0);
- if (value.equals_ci("founder"))
- l.default_level = ACCESS_FOUNDER;
- else
- l.default_level = config.ReadInteger("chanserv", l.config_name, 0, false);
- }
- }
-
- void OnChanRegistered(ChannelInfo *ci)
- {
- reset_levels(ci);
- }
-};
-
-MODULE_INIT(CSAccess)
diff --git a/modules/core/cs_akick.cpp b/modules/core/cs_akick.cpp
deleted file mode 100644
index 437bf5572..000000000
--- a/modules/core/cs_akick.cpp
+++ /dev/null
@@ -1,564 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-static void split_usermask(const Anope::string &mask, Anope::string &nick, Anope::string &user, Anope::string &host)
-{
- size_t ex = mask.find('!'), at = mask.find('@', ex == Anope::string::npos ? 0 : ex + 1);
- if (ex == Anope::string::npos)
- {
- if (at == Anope::string::npos)
- {
- nick = mask;
- user = host = "*";
- }
- else
- {
- nick = "*";
- user = mask.substr(0, at);
- host = mask.substr(at + 1);
- }
- }
- else
- {
- nick = mask.substr(0, ex);
- if (at == Anope::string::npos)
- {
- user = mask.substr(ex + 1);
- host = "*";
- }
- else
- {
- user = mask.substr(ex + 1, at - ex - 1);
- host = mask.substr(at + 1);
- }
- }
-}
-
-class AkickListCallback : public NumberList
-{
- protected:
- CommandSource &source;
- ChannelInfo *ci;
- bool SentHeader;
- public:
- AkickListCallback(CommandSource &_source, ChannelInfo *_ci, const Anope::string &numlist) : NumberList(numlist, false), source(_source), ci(_ci), SentHeader(false)
- {
- }
-
- ~AkickListCallback()
- {
- if (!SentHeader)
- source.Reply(_("No matching entries on %s autokick list."), ci->name.c_str());
- }
-
- virtual void HandleNumber(unsigned Number)
- {
- if (!Number || Number > ci->GetAkickCount())
- return;
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Autokick list for %s:"), ci->name.c_str());
- }
-
- DoList(source, ci, Number - 1, ci->GetAkick(Number - 1));
- }
-
- static void DoList(CommandSource &source, ChannelInfo *ci, unsigned index, AutoKick *akick)
- {
- source.Reply(_(" %3d %s (%s)"), index + 1, akick->HasFlag(AK_ISNICK) ? akick->nc->display.c_str() : akick->mask.c_str(), !akick->reason.empty() ? akick->reason.c_str() : NO_REASON);
- }
-};
-
-class AkickViewCallback : public AkickListCallback
-{
- public:
- AkickViewCallback(CommandSource &_source, ChannelInfo *_ci, const Anope::string &numlist) : AkickListCallback(_source, _ci, numlist)
- {
- }
-
- void HandleNumber(unsigned Number)
- {
- if (!Number || Number > ci->GetAkickCount())
- return;
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Autokick list for %s:"), ci->name.c_str());
- }
-
- DoList(source, ci, Number - 1, ci->GetAkick(Number - 1));
- }
-
- static void DoList(CommandSource &source, ChannelInfo *ci, unsigned index, AutoKick *akick)
- {
- Anope::string timebuf;
-
- if (akick->addtime)
- timebuf = do_strftime(akick->addtime);
- else
- timebuf = UNKNOWN;
-
- 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() : UNKNOWN, timebuf.c_str(), !akick->reason.empty() ? akick->reason.c_str() : _(NO_REASON));
-
- if (akick->last_used)
- source.Reply(_(" Last used %s"), do_strftime(akick->last_used).c_str());
- }
-};
-
-class AkickDelCallback : public NumberList
-{
- CommandSource &source;
- ChannelInfo *ci;
- Command *c;
- unsigned Deleted;
- public:
- AkickDelCallback(CommandSource &_source, ChannelInfo *_ci, Command *_c, const Anope::string &list) : NumberList(list, true), source(_source), ci(_ci), c(_c), Deleted(0)
- {
- }
-
- ~AkickDelCallback()
- {
- User *u = source.u;
- bool override = !ci->HasPriv(u, CA_AKICK);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, c, ci) << "DEL on " << Deleted << " users";
-
- if (!Deleted)
- source.Reply(_("No matching entries on %s autokick list."), ci->name.c_str());
- else if (Deleted == 1)
- source.Reply(_("Deleted 1 entry from %s autokick list."), ci->name.c_str());
- else
- source.Reply(_("Deleted %d entries from %s autokick list."), Deleted, ci->name.c_str());
- }
-
- void HandleNumber(unsigned Number)
- {
- if (!Number || Number > ci->GetAkickCount())
- return;
-
- ++Deleted;
- ci->EraseAkick(Number - 1);
- }
-};
-
-class CommandCSAKick : public Command
-{
- void DoAdd(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- Anope::string mask = params[2];
- Anope::string reason = params.size() > 3 ? params[3] : "";
- NickAlias *na = findnick(mask);
- NickCore *nc = NULL;
- AutoKick *akick;
-
- if (!na)
- {
- Anope::string nick, user, host;
-
- split_usermask(mask, nick, user, host);
- mask = nick + "!" + user + "@" + host;
- }
- else
- nc = na->nc;
-
- /* Check excepts BEFORE we get this far */
- if (ci->c)
- {
- std::pair<Channel::ModeList::iterator, Channel::ModeList::iterator> modes = ci->c->GetModeList(CMODE_EXCEPT);
- for (; modes.first != modes.second; ++modes.first)
- {
- if (Anope::Match(modes.first->second, mask))
- {
- source.Reply(CHAN_EXCEPTED, mask.c_str(), ci->name.c_str());
- return;
- }
- }
- }
-
- /* Check whether target nick has equal/higher access
- * or whether the mask matches a user with higher/equal access - Viper */
- if (ci->HasFlag(CI_PEACE) && nc)
- {
- AccessGroup nc_access = ci->AccessFor(nc), u_access = ci->AccessFor(u);
- if (nc == ci->GetFounder() || nc_access >= u_access)
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
- }
- else if (ci->HasFlag(CI_PEACE))
- {
- /* Match against all currently online users with equal or
- * higher access. - Viper */
- for (Anope::insensitive_map<User *>::iterator it = UserListByNick.begin(), it_end = UserListByNick.end(); it != it_end; ++it)
- {
- User *u2 = it->second;
-
- AccessGroup nc_access = ci->AccessFor(nc), u_access = ci->AccessFor(u);
- Entry entry_mask(CMODE_BEGIN, mask);
-
- if ((ci->HasPriv(u2, CA_FOUNDER) || nc_access >= u_access) && entry_mask.Matches(u2))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
- }
-
- /* Match against the lastusermask of all nickalias's with equal
- * or higher access. - Viper */
- for (nickalias_map::const_iterator it = NickAliasList.begin(), it_end = NickAliasList.end(); it != it_end; ++it)
- {
- na = it->second;
-
- AccessGroup nc_access = ci->AccessFor(na->nc), u_access = ci->AccessFor(u);
- if (na->nc && (na->nc == ci->GetFounder() || nc_access >= u_access))
- {
- Anope::string buf = na->nick + "!" + na->last_usermask;
- if (Anope::Match(buf, mask))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
- }
- }
- }
-
- for (unsigned j = 0, end = ci->GetAkickCount(); j < end; ++j)
- {
- akick = ci->GetAkick(j);
- if (akick->HasFlag(AK_ISNICK) ? akick->nc == nc : mask.equals_ci(akick->mask))
- {
- source.Reply(_("\002%s\002 already exists on %s autokick list."), akick->HasFlag(AK_ISNICK) ? akick->nc->display.c_str() : akick->mask.c_str(), ci->name.c_str());
- return;
- }
- }
-
- if (ci->GetAkickCount() >= Config->CSAutokickMax)
- {
- source.Reply(_("Sorry, you can only have %d autokick masks on a channel."), Config->CSAutokickMax);
- return;
- }
-
- if (nc)
- akick = ci->AddAkick(u->nick, nc, reason);
- else
- akick = ci->AddAkick(u->nick, mask, reason);
-
- bool override = !ci->HasPriv(u, CA_AKICK);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "ADD " << mask << ": " << reason;
-
- FOREACH_MOD(I_OnAkickAdd, OnAkickAdd(u, ci, akick));
-
- source.Reply(_("\002%s\002 added to %s autokick list."), mask.c_str(), ci->name.c_str());
-
- this->DoEnforce(source, ci);
- }
-
- void DoDel(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- const Anope::string &mask = params[2];
- AutoKick *akick;
- unsigned i, end;
-
- if (!ci->GetAkickCount())
- {
- source.Reply(_("%s autokick list is 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(source, ci, this, mask);
- list.Process();
- }
- else
- {
- NickAlias *na = findnick(mask);
- NickCore *nc = na ? na->nc : NULL;
-
- for (i = 0, end = ci->GetAkickCount(); i < end; ++i)
- {
- akick = ci->GetAkick(i);
-
- if ((akick->HasFlag(AK_ISNICK) && akick->nc == nc) || (!akick->HasFlag(AK_ISNICK) && mask.equals_ci(akick->mask)))
- break;
- }
-
- if (i == ci->GetAkickCount())
- {
- source.Reply(_("\002%s\002 not found on %s autokick list."), mask.c_str(), ci->name.c_str());
- return;
- }
-
- bool override = !ci->HasPriv(u, CA_AKICK);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "DEL " << mask;
-
- ci->EraseAkick(i);
-
- source.Reply(_("\002%s\002 deleted from %s autokick list."), mask.c_str(), ci->name.c_str());
- }
- }
-
- void DoList(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- const Anope::string &mask = params.size() > 2 ? params[2] : "";
-
- bool override = !ci->HasPriv(u, CA_AKICK);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "LIST";
-
- if (!ci->GetAkickCount())
- {
- source.Reply(_("%s autokick list is empty."), ci->name.c_str());
- return;
- }
-
- if (!mask.empty() && isdigit(mask[0]) && mask.find_first_not_of("1234567890,-") == Anope::string::npos)
- {
- AkickListCallback list(source, ci, mask);
- list.Process();
- }
- else
- {
- bool SentHeader = false;
-
- for (unsigned i = 0, end = ci->GetAkickCount(); i < end; ++i)
- {
- AutoKick *akick = ci->GetAkick(i);
-
- if (!mask.empty())
- {
- if (!akick->HasFlag(AK_ISNICK) && !Anope::Match(akick->mask, mask))
- continue;
- if (akick->HasFlag(AK_ISNICK) && !Anope::Match(akick->nc->display, mask))
- continue;
- }
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Autokick list for %s:"), ci->name.c_str());
- }
-
- AkickListCallback::DoList(source, ci, i, akick);
- }
-
- if (!SentHeader)
- source.Reply(_("No matching entries on %s autokick list."), ci->name.c_str());
- }
- }
-
- void DoView(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- const Anope::string &mask = params.size() > 2 ? params[2] : "";
-
- bool override = !ci->HasPriv(u, CA_AKICK);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "VIEW";
-
- if (!ci->GetAkickCount())
- {
- source.Reply(_("%s autokick list is empty."), ci->name.c_str());
- return;
- }
-
- if (!mask.empty() && isdigit(mask[0]) && mask.find_first_not_of("1234567890,-") == Anope::string::npos)
- {
- AkickViewCallback list(source, ci, mask);
- list.Process();
- }
- else
- {
- bool SentHeader = false;
-
- for (unsigned i = 0, end = ci->GetAkickCount(); i < end; ++i)
- {
- AutoKick *akick = ci->GetAkick(i);
-
- if (!mask.empty())
- {
- if (!akick->HasFlag(AK_ISNICK) && !Anope::Match(akick->mask, mask))
- continue;
- if (akick->HasFlag(AK_ISNICK) && !Anope::Match(akick->nc->display, mask))
- continue;
- }
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Autokick list for %s:"), ci->name.c_str());
- }
-
- AkickViewCallback::DoList(source, ci, i, akick);
- }
-
- if (!SentHeader)
- source.Reply(_("No matching entries on %s autokick list."), ci->name.c_str());
- }
- }
-
- void DoEnforce(CommandSource &source, ChannelInfo *ci)
- {
- User *u = source.u;
- Channel *c = ci->c;
- int count = 0;
-
- if (!c)
- {
- source.Reply(CHAN_X_NOT_IN_USE, ci->name.c_str());
- return;
- }
-
- for (CUserList::iterator it = c->users.begin(), it_end = c->users.end(); it != it_end; )
- {
- UserContainer *uc = *it++;
-
- if (ci->CheckKick(uc->user))
- ++count;
- }
-
- bool override = !ci->HasPriv(u, CA_AKICK);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "ENFORCE, affects " << count << " users";
-
- source.Reply(_("AKICK ENFORCE for \002%s\002 complete; \002%d\002 users were affected."), ci->name.c_str(), count);
- }
-
- void DoClear(CommandSource &source, ChannelInfo *ci)
- {
- User *u = source.u;
- bool override = !ci->HasPriv(u, CA_AKICK);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "CLEAR";
-
- ci->ClearAkick();
- source.Reply(_("Channel %s akick list has been cleared."), ci->name.c_str());
- }
-
- public:
- CommandCSAKick(Module *creator) : Command(creator, "chanserv/akick", 2, 4)
- {
- this->SetDesc(_("Maintain the AutoKick list"));
- this->SetSyntax(_("\037channel\037 ADD {\037nick\037 | \037mask\037} [\037reason\037]"));
- this->SetSyntax(_("\037channel\037 DEL {\037nick\037 | \037mask\037 | \037entry-num\037 | \037list\037}"));
- this->SetSyntax(_("\037channel\037 LIST [\037mask\037 | \037entry-num\037 | \037list\037]"));
- this->SetSyntax(_("\002AKICK \037channel\037 VIEW [\037mask\037 | \037entry-num\037 | \037list\037]"));
- this->SetSyntax(_("\037channel\037 ENFORCE"));
- this->SetSyntax(_("\037channel\037 CLEAR"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- Anope::string chan = params[0];
- Anope::string cmd = params[1];
- Anope::string mask = params.size() > 2 ? params[2] : "";
-
- User *u = source.u;
-
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (mask.empty() && (cmd.equals_ci("ADD") || cmd.equals_ci("DEL")))
- this->OnSyntaxError(source, cmd);
- else if (!ci->HasPriv(u, CA_AKICK) && !u->HasPriv("chanserv/access/modify"))
- source.Reply(ACCESS_DENIED);
- else if (!cmd.equals_ci("LIST") && !cmd.equals_ci("VIEW") && !cmd.equals_ci("ENFORCE") && readonly)
- source.Reply(_("Sorry, channel autokick list modification is temporarily disabled."));
- else if (cmd.equals_ci("ADD"))
- this->DoAdd(source, ci, params);
- else if (cmd.equals_ci("DEL"))
- this->DoDel(source, ci, params);
- else if (cmd.equals_ci("LIST"))
- this->DoList(source, ci, params);
- else if (cmd.equals_ci("VIEW"))
- this->DoView(source, ci, params);
- else if (cmd.equals_ci("ENFORCE"))
- this->DoEnforce(source, ci);
- else if (cmd.equals_ci("CLEAR"))
- this->DoClear(source, ci);
- else
- this->OnSyntaxError(source, "");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Maintains the \002AutoKick list\002 for a channel. If a user\n"
- "on the AutoKick list attempts to join the channel,\n"
- "%s will ban that user from the channel, then kick\n"
- "the user.\n"
- " \n"
- "The \002AKICK ADD\002 command adds the given nick or usermask\n"
- "to the AutoKick list. If a \037reason\037 is given with\n"
- "the command, that reason will be used when the user is\n"
- "kicked; if not, the default reason is \"You have been\n"
- "banned from the channel\".\n"
- "When akicking a \037registered nick\037 the nickserv account\n"
- "will be added to the akick list instead of the mask.\n"
- "All users within that nickgroup will then be akicked.\n"),
- source.owner->nick.c_str());
- source.Reply(_(
- " \n"
- "The \002AKICK DEL\002 command removes the given nick or mask\n"
- "from the AutoKick list. It does not, however, remove any\n"
- "bans placed by an AutoKick; those must be removed\n"
- "manually.\n"
- " \n"
- "The \002AKICK LIST\002 command displays the AutoKick list, or\n"
- "optionally only those AutoKick entries which match the\n"
- "given mask.\n"
- " \n"
- "The \002AKICK VIEW\002 command is a more verbose version of\n"
- "\002AKICK LIST\002 command.\n"
- " \n"
- "The \002AKICK ENFORCE\002 command causes %s to enforce the\n"
- "current AKICK list by removing those users who match an\n"
- "AKICK mask.\n"
- " \n"
- "The \002AKICK CLEAR\002 command clears all entries of the\n"
- "akick list."), source.owner->nick.c_str());
- return true;
- }
-};
-
-class CSAKick : public Module
-{
- CommandCSAKick commandcsakick;
-
- public:
- CSAKick(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcsakick(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcsakick);
- }
-};
-
-MODULE_INIT(CSAKick)
diff --git a/modules/core/cs_ban.cpp b/modules/core/cs_ban.cpp
deleted file mode 100644
index 759649662..000000000
--- a/modules/core/cs_ban.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSBan : public Command
-{
- public:
- CommandCSBan(Module *creator) : Command(creator, "chanserv/ban", 2, 3)
- {
- this->SetDesc(_("Bans a selected nick on a channel"));
- this->SetSyntax(_("\037#channel\037 \037nick\037 [\037reason\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &chan = params[0];
- const Anope::string &target = params[1];
- const Anope::string &reason = params.size() > 2 ? params[2] : "Requested";
-
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- User *u = source.u;
- Channel *c = ci->c;
- bool is_same = target.equals_ci(u->nick);
- User *u2 = is_same ? u : finduser(target);
-
- AccessGroup u_access = ci->AccessFor(u), u2_access = ci->AccessFor(u2);
-
- if (!c)
- source.Reply(CHAN_X_NOT_IN_USE, chan.c_str());
- else if (!u2)
- source.Reply(NICK_X_NOT_IN_USE, target.c_str());
- else if (!ci->HasPriv(u, CA_BAN))
- source.Reply(ACCESS_DENIED);
- else if (!is_same && ci->HasFlag(CI_PEACE) && u2_access >= u_access)
- source.Reply(ACCESS_DENIED);
- /*
- * Dont ban/kick the user on channels where he is excepted
- * to prevent services <-> server wars.
- */
- else if (matches_list(ci->c, u2, CMODE_EXCEPT))
- source.Reply(CHAN_EXCEPTED, u2->nick.c_str(), ci->name.c_str());
- else if (u2->IsProtected())
- source.Reply(ACCESS_DENIED);
- else
- {
- Anope::string mask;
- get_idealban(ci, u2, mask);
-
- // XXX need a way to detect if someone is overriding
- Log(LOG_COMMAND, u, this, ci) << "for " << mask;
-
- c->SetMode(NULL, CMODE_BAN, mask);
-
- /* We still allow host banning while not allowing to kick */
- if (!c->FindUser(u2))
- return;
-
- if (ci->HasFlag(CI_SIGNKICK) || (ci->HasFlag(CI_SIGNKICK_LEVEL) && !ci->HasPriv(u, CA_SIGNKICK)))
- c->Kick(ci->WhoSends(), u2, "%s (%s)", reason.c_str(), u->nick.c_str());
- else
- c->Kick(ci->WhoSends(), u2, "%s", reason.c_str());
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Bans a selected nick on a channel.\n"
- " \n"
- "By default, limited to AOPs or those with level 5 access \n"
- "and above on the channel."));
- return true;
- }
-};
-
-class CSBan : public Module
-{
- CommandCSBan commandcsban;
-
- public:
- CSBan(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE), commandcsban(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcsban);
- }
-};
-
-MODULE_INIT(CSBan)
diff --git a/modules/core/cs_clearusers.cpp b/modules/core/cs_clearusers.cpp
deleted file mode 100644
index 18dc75479..000000000
--- a/modules/core/cs_clearusers.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSClearUsers : public Command
-{
- public:
- CommandCSClearUsers(Module *creator) : Command(creator, "chanserv/clearusers", 1, 1)
- {
- this->SetDesc(_("Kicks all users on a channel"));
- this->SetSyntax(_("\037channel\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &chan = params[0];
-
- User *u = source.u;
- Channel *c = findchan(chan);
- Anope::string modebuf;
-
- if (!c)
- source.Reply(CHAN_X_NOT_IN_USE, chan.c_str());
- else if (!c->ci)
- source.Reply(CHAN_X_NOT_REGISTERED, c->name.c_str());
- else if (!c->ci->HasPriv(u, CA_FOUNDER))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- 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; )
- {
- UserContainer *uc = *it++;
-
- c->Kick(NULL, uc->user, "%s", buf.c_str());
- }
-
- source.Reply(_("All users have been kicked from \2%s\2."), chan.c_str());
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Tells %s to clear (kick) all users certain settings on a channel."
- " \n"
- "By default, limited to those with founder access on the\n"
- "channel."), source.owner->nick.c_str());
- return true;
- }
-};
-
-class CSClearUsers : public Module
-{
- CommandCSClearUsers commandcsclearusers;
-
- public:
- CSClearUsers(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcsclearusers(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcsclearusers);
- }
-};
-
-MODULE_INIT(CSClearUsers)
diff --git a/modules/core/cs_clone.cpp b/modules/core/cs_clone.cpp
deleted file mode 100644
index 5ede6a9e4..000000000
--- a/modules/core/cs_clone.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSClone : public Command
-{
-public:
- CommandCSClone(Module *creator) : Command(creator, "chanserv/clone", 2, 3)
- {
- this->SetDesc(_("Copy all settings from one channel to another"));
- this->SetSyntax(_("\037channel\037 \037target\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &channel = params[0];
- const Anope::string &target = params[1];
- Anope::string what = params.size() > 2 ? params[2] : "";
-
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (!ci->HasPriv(u, CA_SET))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
- ChannelInfo *target_ci = cs_findchan(target);
- if (!target_ci)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, target.c_str());
- return;
- }
- if (!IsFounder(u, ci) || !IsFounder(u, target_ci))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (Config->CSMaxReg && u->Account()->channelcount >= Config->CSMaxReg && !u->HasPriv("chanserv/no-register-limit"))
- {
- source.Reply(u->Account()->channelcount > Config->CSMaxReg ? CHAN_EXCEEDED_CHANNEL_LIMIT : _(CHAN_REACHED_CHANNEL_LIMIT), Config->CSMaxReg);
- return;
- }
-
- if (what.equals_ci("ALL"))
- what.clear();
-
- if (what.empty())
- {
- delete target_ci;
- target_ci = new ChannelInfo(*ci);
- target_ci->name = target;
- RegisteredChannelList[target_ci->name] = target_ci;
- target_ci->c = findchan(target_ci->name);
- if (target_ci->c)
- {
- target_ci->c->ci = target_ci;
-
- check_modes(target_ci->c);
-
- ChannelMode *cm;
- if (u->FindChannel(target_ci->c) != NULL)
- {
- /* On most ircds you do not receive the admin/owner mode till its registered */
- if ((cm = ModeManager::FindChannelModeByName(CMODE_OWNER)))
- target_ci->c->SetMode(NULL, cm, u->nick);
- else if ((cm = ModeManager::FindChannelModeByName(CMODE_PROTECT)))
- target_ci->c->RemoveMode(NULL, cm, u->nick);
- }
-
- /* Mark the channel as persistant */
- if (target_ci->c->HasMode(CMODE_PERM))
- target_ci->SetFlag(CI_PERSIST);
- /* Persist may be in def cflags, set it here */
- else if (target_ci->HasFlag(CI_PERSIST) && (cm = ModeManager::FindChannelModeByName(CMODE_PERM)))
- target_ci->c->SetMode(NULL, CMODE_PERM);
-
- if (target_ci->bi && target_ci->c->FindUser(target_ci->bi) == NULL)
- target_ci->bi->Join(target_ci->c);
- }
-
- if (target_ci->c && !target_ci->c->topic.empty())
- {
- target_ci->last_topic = target_ci->c->topic;
- target_ci->last_topic_setter = target_ci->c->topic_setter;
- target_ci->last_topic_time = target_ci->c->topic_time;
- }
- else
- target_ci->last_topic_setter = source.owner->nick;
-
- FOREACH_MOD(I_OnChanRegistered, OnChanRegistered(target_ci));
-
- source.Reply(_("All settings from \002%s\002 have been transferred to \002%s\002"), channel.c_str(), target.c_str());
- }
- else if (what.equals_ci("ACCESS"))
- {
- /*target_ci->ClearAccess();
- for (unsigned i = 0; i < ci->GetAccessCount(); ++i)
- {
- ChanAccess *access = ci->GetAccess(i);
- target_ci->AddAccess(access->GetMask(), access->level, access->creator, access->last_seen);
- }
-
- source.Reply(_("All access entries from \002%s\002 have been transferred to \002%s\002"), channel.c_str(), target.c_str());
- XXX
- */
- }
- else if (what.equals_ci("AKICK"))
- {
- target_ci->ClearAkick();
- for (unsigned i = 0; i < ci->GetAkickCount(); ++i)
- {
- AutoKick *akick = ci->GetAkick(i);
- if (akick->HasFlag(AK_ISNICK))
- target_ci->AddAkick(akick->creator, akick->nc, akick->reason, akick->addtime, akick->last_used);
- else
- target_ci->AddAkick(akick->creator, akick->mask, akick->reason, akick->addtime, akick->last_used);
- }
-
- source.Reply(_("All akick entries from \002%s\002 have been transferred to \002%s\002"), channel.c_str(), target.c_str());
- }
- else if (what.equals_ci("BADWORDS"))
- {
- target_ci->ClearBadWords();
- for (unsigned i = 0; i < ci->GetBadWordCount(); ++i)
- {
- BadWord *bw = ci->GetBadWord(i);
- target_ci->AddBadWord(bw->word, bw->type);
- }
-
- source.Reply(_("All badword entries from \002%s\002 have been transferred to \002%s\002"), channel.c_str(), target.c_str());
- }
- else
- {
- this->OnSyntaxError(source, "");
- return;
- }
-
- Log(LOG_COMMAND, u, this, ci) << "to clone it to " << target_ci->name;
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Copies all settings, access, akicks, etc from channel to the\n"
- "target channel. If access, akick, or badwords is specified then only\n"
- "the respective settings are transferred. You must have founder level\n"
- "access to \037channel\037 and \037target\037."));
- return true;
- }
-};
-
-class CSClone : public Module
-{
- CommandCSClone commandcsclone;
-
- public:
- CSClone(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE), commandcsclone(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcsclone);
- }
-};
-
-MODULE_INIT(CSClone)
diff --git a/modules/core/cs_drop.cpp b/modules/core/cs_drop.cpp
deleted file mode 100644
index eb01875db..000000000
--- a/modules/core/cs_drop.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSDrop : public Command
-{
- public:
- CommandCSDrop(Module *creator) : Command(creator, "chanserv/drop", 1, 1)
- {
- this->SetDesc(_("Cancel the registration of a channel"));
- this->SetSyntax(_("\037channel\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &chan = params[0];
-
- User *u = source.u;
-
- if (readonly)
- {
- source.Reply(_("Sorry, channel de-registration is temporarily disabled.")); // XXX: READ_ONLY_MODE?
- return;
- }
-
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- ci = cs_findchan(chan);
-
- if (ci->HasFlag(CI_SUSPENDED) && !u->HasCommand("chanserv/chanserv/drop"))
- {
- source.Reply(CHAN_X_SUSPENDED, chan.c_str());
- return;
- }
-
- if ((ci->HasFlag(CI_SECUREFOUNDER) ? !IsFounder(u, ci) : !ci->HasPriv(u, CA_FOUNDER)) && !u->HasCommand("chanserv/chanserv/drop"))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (ci->c && ModeManager::FindChannelModeByName(CMODE_REGISTERED))
- ci->c->RemoveMode(NULL, CMODE_REGISTERED, "", false);
-
- bool override = (ci->HasFlag(CI_SECUREFOUNDER) ? !IsFounder(u, ci) : !ci->HasPriv(u, CA_FOUNDER));
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "founder: " << (ci->GetFounder() ? ci->GetFounder()->display : "none");
-
- delete ci;
-
- source.Reply(_("Channel \002%s\002 has been dropped."), chan.c_str());
-
- FOREACH_MOD(I_OnChanDrop, OnChanDrop(chan));
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- User *u = source.u;
- this->SendSyntax(source);
- source.Reply(" ");
- if (u->IsServicesOper())
- source.Reply(_("Unregisters the named channel. Only \002Services Operators\002\n"
- "can drop a channel for which they have not identified."));
- else
- source.Reply(_("Unregisters the named channel. Can only be used by\n"
- "\002channel founder\002."));
-
- return true;
- }
-};
-
-class CSDrop : public Module
-{
- CommandCSDrop commandcsdrop;
-
- public:
- CSDrop(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE), commandcsdrop(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcsdrop);
- }
-};
-
-MODULE_INIT(CSDrop)
diff --git a/modules/core/cs_flags.cpp b/modules/core/cs_flags.cpp
deleted file mode 100644
index 48f1a22f1..000000000
--- a/modules/core/cs_flags.cpp
+++ /dev/null
@@ -1,455 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-static struct FlagLevels
-{
- ChannelAccess priv;
- char default_char;
- Anope::string config_name;
- Anope::string desc;
-} flagLevels[] = {
- { CA_ACCESS_CHANGE, 'f', "flag_change", _("Allowed to modify the access list") },
- { CA_ACCESS_LIST, 'l', "flag_list", _("Allowed to view the access list") },
- { CA_AKICK, 'K', "flag_akick", _("Allowed to use AKICK command") },
- { CA_ASSIGN, 's', "flag_assign", _("Allowed to assign/unassign a bot") },
- { CA_AUTOHALFOP, 'H', "flag_autohalfop", _("Automatic mode +h") },
- { CA_AUTOOP, 'O', "flag_autoop", _("Automatic channel operator status") },
- { CA_AUTOOWNER, 'Q', "flag_autoowner", _("Automatic mode +q") },
- { CA_AUTOPROTECT, 'A', "flag_autoprotect", _("Automatic mode +a") },
- { CA_AUTOVOICE, 'V', "flag_autovoice", _("Automatic mode +v") },
- { CA_BADWORDS, 'k', "flag_badwords", _("Allowed to modify channel badwords list") },
- { CA_BAN, 'b', "flag_ban", _("Allowed to use ban users") },
- { CA_FANTASIA, 'c', "flag_fantasia", _("Allowed to use fantasy commands") },
- { CA_FOUNDER, 'F', "flag_founder", _("Allowed to issue commands restricted to channel founders") },
- { CA_GETKEY, 'G', "flag_getkey", _("Allowed to use GETKEY command") },
- { CA_GREET, 'g', "flag_greet", _("Greet message displayed") },
- { CA_HALFOP, 'h', "flag_halfop", _("Allowed to (de)halfop users") },
- { CA_HALFOPME, 'h', "flag_halfopme", _("Allowed to (de)halfop him/herself") },
- { CA_INFO, 'I', "flag_info", _("Allowed to use INFO command with ALL option") },
- { CA_INVITE, 'i', "flag_invite", _("Allowed to use the INVITE command") },
- { CA_KICK, 'k', "flag_kick", _("Allowed to use the KICK command") },
- { CA_MEMO, 'm', "flag_memo", _("Allowed to read channel memos") },
- { CA_MODE, 's', "flag_mode", _("Allowed to change channel modes") },
- { CA_NOKICK, 'N', "flag_nokick", _("Prevents users being kicked by Services") },
- { CA_OPDEOP, 'o', "flag_opdeop", _("Allowed to (de)op users") },
- { CA_OPDEOPME, 'o', "flag_opdeopme", _("Allowed to (de)op him/herself") },
- { CA_OWNER, 'q', "flag_owner", _("Allowed to use (de)owner users") },
- { CA_OWNERME, 'q', "flag_ownerme", _("Allowed to (de)owner him/herself") },
- { CA_PROTECT, 'a', "flag_protect", _("Allowed to (de)protect users") },
- { CA_PROTECTME, 'a', "flag_protectme", _("Allowed to (de)protect him/herself"), },
- { CA_SAY, 'B', "flag_say", _("Allowed to use SAY and ACT commands") },
- { CA_SET, 's', "flag_set", _("Allowed to set channel settings") },
- { CA_SIGNKICK, 'K', "flag_signkick", _("Prevents kicks from being signed") },
- { CA_TOPIC, 't', "flag_topic", _("Allowed to change channel topics") },
- { CA_UNBAN, 'u', "flag_unban", _("Allowed to unban users") },
- { CA_VOICE, 'v', "flag_voice", _("Allowed to (de)voice users") },
- { CA_VOICEME, 'v', "flag_voiceme", _("Allowed to (de)voice him/herself") },
- { CA_SIZE, -1, "", "" }
-};
-
-class FlagsChanAccess : public ChanAccess
-{
- public:
- std::set<char> flags;
-
- FlagsChanAccess(AccessProvider *p) : ChanAccess(p)
- {
- }
-
- bool Matches(User *u, NickCore *nc)
- {
- if (u && (Anope::Match(u->nick, this->mask) || Anope::Match(u->GetMask(), this->mask)))
- return true;
- else if (nc && Anope::Match(nc->display, this->mask))
- return true;
- return false;
- }
-
- bool HasPriv(ChannelAccess priv)
- {
- for (int i = 0; flagLevels[i].priv != CA_SIZE; ++i)
- if (flagLevels[i].priv == priv)
- return this->flags.count(flagLevels[i].default_char);
-
- return false;
- }
-
- Anope::string Serialize()
- {
- return Anope::string(this->flags.begin(), this->flags.end());
- }
-
- void Unserialize(const Anope::string &data)
- {
- for (unsigned i = data.length(); i > 0; --i)
- this->flags.insert(data[i - 1]);
- }
-
- static Anope::string DetermineFlags(ChanAccess *access)
- {
- if (access->provider->name == "access/flags")
- return access->Serialize();
-
- std::set<char> buffer;
-
- for (int i = 0; flagLevels[i].priv != CA_SIZE; ++i)
- {
- FlagLevels &l = flagLevels[i];
-
- if (access->HasPriv(l.priv))
- buffer.insert(l.default_char);
- }
-
- return Anope::string(buffer.begin(), buffer.end());
- }
-};
-
-class FlagsAccessProvider : public AccessProvider
-{
- public:
- FlagsAccessProvider(Module *o) : AccessProvider(o, "access/flags")
- {
- }
-
- ChanAccess *Create()
- {
- return new FlagsChanAccess(this);
- }
-};
-
-class CommandCSFlags : public Command
-{
- void DoModify(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- Anope::string mask = params.size() > 2 ? params[2] : "";
- Anope::string flags = params.size() > 3 ? params[3] : "";
-
- if (flags.empty())
- {
- this->OnSyntaxError(source, "");
- return;
- }
-
- AccessGroup u_access = ci->AccessFor(u);
-
- if (mask.find_first_of("!*@") == Anope::string::npos && findnick(mask) == NULL)
- mask += "!*@*";
-
- ChanAccess *current = NULL;
- std::set<char> current_flags;
- for (unsigned i = ci->GetAccessCount(); i > 0; --i)
- {
- ChanAccess *access = ci->GetAccess(i - 1);
- if (mask.equals_ci(access->mask))
- {
- current = access;
- Anope::string cur_flags = FlagsChanAccess::DetermineFlags(access);
- for (unsigned j = cur_flags.length(); j > 0; --j)
- current_flags.insert(cur_flags[j - 1]);
- break;
- }
- }
-
- if (ci->GetAccessCount() >= Config->CSAccessMax)
- {
- source.Reply(_("Sorry, you can only have %d access entries on a channel."), Config->CSAccessMax);
- return;
- }
-
- bool override = false;
- int add = -1;
- for (size_t i = 0; i < flags.length(); ++i)
- {
- char f = flags[i];
- switch (f)
- {
- case '+':
- add = 1;
- break;
- case '-':
- add = 0;
- break;
- case '*':
- if (add == -1)
- break;
- for (int j = 0; flagLevels[j].priv != CA_SIZE; ++j)
- {
- FlagLevels &l = flagLevels[j];
- if (!u_access.HasPriv(l.priv))
- {
- if (u->HasPriv("chanserv/access/modify"))
- override = true;
- else
- continue;
- }
- if (add == 1)
- current_flags.insert(f);
- else if (add == 0)
- current_flags.erase(f);
- }
- break;
- default:
- if (add == -1)
- break;
- for (int j = 0; flagLevels[j].priv != CA_SIZE; ++j)
- {
- FlagLevels &l = flagLevels[j];
- if (f != l.default_char)
- continue;
- else if (!u_access.HasPriv(l.priv))
- {
- if (u->HasPriv("chanserv/access/modify"))
- override = true;
- else
- {
- source.Reply(_("You can not set the \002%c\002 flag."), f);
- continue;
- }
- }
- if (add == 1)
- current_flags.insert(f);
- else if (add == 0)
- current_flags.erase(f);
- break;
- }
- }
- }
- if (current_flags.empty())
- {
- if (current != NULL)
- {
- FOREACH_MOD(I_OnAccessDel, OnAccessDel(ci, u, current));
- ci->EraseAccess(current);
- source.Reply(_("\002%s\002 removed from the %s access list."), mask.c_str(), ci->name.c_str());
- }
- else
- {
- source.Reply(_("Insufficient flags given"));
- }
- return;
- }
-
- service_reference<AccessProvider> provider("access/flags");
- if (!provider)
- return;
- FlagsChanAccess *access = debug_cast<FlagsChanAccess *>(provider->Create());
- access->ci = ci;
- access->mask = mask;
- access->creator = u->nick;
- access->last_seen = current ? current->last_seen : 0;
- access->created = Anope::CurTime;
- access->flags = current_flags;
-
- if (current != NULL)
- ci->EraseAccess(current);
-
- ci->AddAccess(access);
-
- FOREACH_MOD(I_OnAccessAdd, OnAccessAdd(ci, u, access));
-
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "MODIFY " << mask << " with flags " << access->Serialize();
- source.Reply(_("Access for \002%s\002 on %s set to +\002%s\002"), access->mask.c_str(), ci->name.c_str(), access->Serialize().c_str());
-
- return;
- }
-
- void DoList(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> &params)
- {
- const Anope::string &arg = params.size() > 2 ? params[2] : "";
-
- if (!ci->GetAccessCount())
- source.Reply(_("%s access list is empty."), ci->name.c_str());
- else
- {
- unsigned total = 0;
-
- for (unsigned i = 0, end = ci->GetAccessCount(); i < end; ++i)
- {
- ChanAccess *access = ci->GetAccess(i);
- const Anope::string &flags = FlagsChanAccess::DetermineFlags(access);
-
- if (!arg.empty())
- {
- if (arg[0] == '+')
- {
- bool pass = true;
- for (size_t j = 1; j < arg.length(); ++j)
- if (flags.find(arg[j]) == Anope::string::npos)
- pass = false;
- if (pass == false)
- continue;
- }
- else if (!Anope::Match(access->mask, arg))
- continue;
- }
-
- if (++total == 1)
- {
- source.Reply(_("Flags list for %s"), ci->name.c_str());
- }
-
- source.Reply(_(" %3d %-10s +%-10s [last modified on %s by %s]"), i + 1, access->mask.c_str(), FlagsChanAccess::DetermineFlags(access).c_str(), do_strftime(access->created, source.u->Account(), true).c_str(), access->creator.c_str());
- }
-
- if (total == 0)
- source.Reply(_("No matching entries on %s access list."), ci->name.c_str());
- else if (total == ci->GetAccessCount())
- source.Reply(_("End of access list."));
- else
- source.Reply(_("End of access list - %d/%d entries shown."), total, ci->GetAccessCount());
- }
- }
-
- void DoClear(CommandSource &source, ChannelInfo *ci)
- {
- User *u = source.u;
-
- if (!IsFounder(u, ci) && !u->HasPriv("chanserv/access/modify"))
- source.Reply(ACCESS_DENIED);
- else
- {
- ci->ClearAccess();
-
- FOREACH_MOD(I_OnAccessClear, OnAccessClear(ci, u));
-
- source.Reply(_("Channel %s access list has been cleared."), ci->name.c_str());
-
- bool override = !IsFounder(u, ci);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "CLEAR";
- }
-
- return;
- }
-
- public:
- CommandCSFlags(Module *creator) : Command(creator, "chanserv/flags", 2, 4)
- {
- this->SetDesc(_("Modify the list of privileged users"));
- this->SetSyntax(_("\037channel\037 MODIFY \037mask\037 \037changes\037"));
- this->SetSyntax(_("\037channel\037 LIST [\037mask\037 | +\037flags\037]"));
- this->SetSyntax(_("\037channel\037 CLEAR\002"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &chan = params[0];
- const Anope::string &cmd = params[1];
-
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(chan);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
- return;
- }
-
- bool is_list = cmd.equals_ci("LIST");
- bool has_access = false;
- if (u->HasPriv("chanserv/access/modify"))
- has_access = true;
- else if (is_list && ci->HasPriv(u, CA_ACCESS_LIST))
- has_access = true;
- else if (ci->HasPriv(u, CA_ACCESS_CHANGE))
- has_access = true;
-
- if (!has_access)
- source.Reply(ACCESS_DENIED);
- else if (readonly && !is_list)
- source.Reply(_("Sorry, channel access list modification is temporarily disabled."));
- else if (cmd.equals_ci("MODIFY"))
- this->DoModify(source, ci, params);
- else if (cmd.equals_ci("LIST"))
- this->DoList(source, ci, params);
- else if (cmd.equals_ci("CLEAR"))
- this->DoClear(source, ci);
- else
- this->OnSyntaxError(source, cmd);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("%s is another way to modify the channel access list, similar to\n"
- "the XOP and ACCESS methods."), source.command.c_str());
- source.Reply(" ");
- source.Reply(_("The MODIFY command allows you to modify the access list. If mask is\n"
- "not already on the access list is it added, then the changes are applied.\n"
- "If the mask has no more flags, then the mask is removed from the access list.\n"
- "Additionally, you may use +* or -* to add or remove all flags, respectively. You are\n"
- "only able to modify the access list if you have the proper permission on the channel,\n"
- "and even then you can only give other people access to up what you already have."));
- source.Reply(" ");
- source.Reply(_("The LIST command allows you to list existing entries on the channel access list.\n"
- "If a mask is given, the mask is wildcard matched against all existing entries on the\n"
- "access list, and only those entries are returned. If a set of flags is given, only those\n"
- "on the access list with the specified flags are returned."));
- source.Reply(" ");
- source.Reply(_("The CLEAR command clears the channel access list, which requires channel founder."));
- source.Reply(" ");
- source.Reply(_("The available flags are:"));
-
- std::multimap<char, FlagLevels *, std::less<ci::string> > levels;
- for (int i = 0; flagLevels[i].priv != CA_SIZE; ++i)
- levels.insert(std::make_pair(flagLevels[i].default_char, &flagLevels[i]));
- for (std::multimap<char, FlagLevels *, std::less<ci::string> >::iterator it = levels.begin(), it_end = levels.end(); it != it_end; ++it)
- {
- FlagLevels *l = it->second;
- source.Reply(" %c - %s", l->default_char, translate(source.u->Account(), l->desc.c_str()));
- }
-
- return true;
- }
-};
-
-class CSFlags : public Module
-{
- FlagsAccessProvider accessprovider;
- CommandCSFlags commandcsflags;
-
- public:
- CSFlags(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- accessprovider(this), commandcsflags(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&accessprovider);
- ModuleManager::RegisterService(&commandcsflags);
-
- Implementation i[] = { I_OnReload };
- ModuleManager::Attach(i, this, 1);
-
- this->OnReload();
- }
-
- void OnReload()
- {
- ConfigReader config;
-
- for (int i = 0; flagLevels[i].priv != CA_SIZE; ++i)
- {
- FlagLevels &l = flagLevels[i];
-
- const Anope::string &value = config.ReadValue("chanserv", l.config_name, "", 0);
- if (value.empty())
- continue;
- l.default_char = value[0];
- }
- }
-};
-
-MODULE_INIT(CSFlags)
diff --git a/modules/core/cs_getkey.cpp b/modules/core/cs_getkey.cpp
deleted file mode 100644
index 4a6d62442..000000000
--- a/modules/core/cs_getkey.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSGetKey : public Command
-{
- public:
- CommandCSGetKey(Module *creator) : Command(creator, "chanserv/getkey", 1, 1)
- {
- this->SetDesc(_("Returns the key of the given channel"));
- this->SetSyntax(_("\037channel\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &chan = params[0];
-
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
-
- if (!ci->HasPriv(u, CA_GETKEY) && !u->HasCommand("chanserv/chanserv/getkey"))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- Anope::string key;
- if (!ci->c || !ci->c->GetParam(CMODE_KEY, key))
- {
- source.Reply(_("The channel \002%s\002 has no key."), chan.c_str());
- return;
- }
-
- bool override = !ci->HasPriv(u, CA_GETKEY);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci);
-
- source.Reply(_("Key for channel \002%s\002 is \002%s\002."), chan.c_str(), key.c_str());
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Returns the key of the given channel."));
- return true;
- }
-};
-
-class CSGetKey : public Module
-{
- CommandCSGetKey commandcsgetkey;
-
- public:
- CSGetKey(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE), commandcsgetkey(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcsgetkey);
- }
-};
-
-MODULE_INIT(CSGetKey)
diff --git a/modules/core/cs_info.cpp b/modules/core/cs_info.cpp
deleted file mode 100644
index ef026563e..000000000
--- a/modules/core/cs_info.cpp
+++ /dev/null
@@ -1,142 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSInfo : public Command
-{
- void CheckOptStr(Anope::string &buf, ChannelInfoFlag opt, const Anope::string &str, ChannelInfo *ci, const NickCore *nc)
- {
- if (ci->HasFlag(opt))
- {
- if (!buf.empty())
- buf += ", ";
-
- buf += str;
- }
- }
-
- public:
- CommandCSInfo(Module *creator) : Command(creator, "chanserv/info", 1, 2)
- {
- this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
- this->SetDesc(_("Lists information about the named registered channel"));
- this->SetSyntax(_("\037channel\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &chan = params[0];
-
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- bool has_auspex = u->IsIdentified() && u->HasPriv("chanserv/auspex");
- bool show_all = false;
-
- /* Should we show all fields? Only for sadmins and identified users */
- if (has_auspex || ci->HasPriv(u, CA_INFO))
- show_all = true;
-
- source.Reply(CHAN_INFO_HEADER, chan.c_str());
- if (ci->GetFounder())
- source.Reply(_(" Founder: %s"), ci->GetFounder()->display.c_str());
-
- if (show_all && ci->successor)
- source.Reply(_(" Successor: %s"), ci->successor->display.c_str());
-
- if (!ci->desc.empty())
- source.Reply(_(" Description: %s"), ci->desc.c_str());
- source.Reply(_(" Registered: %s"), do_strftime(ci->time_registered).c_str());
- source.Reply(_(" Last used: %s"), do_strftime(ci->last_used).c_str());
-
- ModeLock *secret = ci->GetMLock(CMODE_SECRET);
- if (!ci->last_topic.empty() && (show_all || ((!secret || secret->set == false) && (!ci->c || !ci->c->HasMode(CMODE_SECRET)))))
- {
- source.Reply(_(" Last topic: %s"), ci->last_topic.c_str());
- source.Reply(_(" Topic set by: %s"), ci->last_topic_setter.c_str());
- }
-
- if (show_all)
- {
- source.Reply(_(" Ban type: %d"), ci->bantype);
- Anope::string optbuf;
-
- CheckOptStr(optbuf, CI_KEEPTOPIC, _("Topic Retention"), ci, u->Account());
- CheckOptStr(optbuf, CI_OPNOTICE, _("OP Notice"), ci, u->Account());
- CheckOptStr(optbuf, CI_PEACE, _("Peace"), ci, u->Account());
- CheckOptStr(optbuf, CI_PRIVATE, _("Private"), ci, u->Account());
- CheckOptStr(optbuf, CI_RESTRICTED, _("Restricted Access"), ci, u->Account());
- CheckOptStr(optbuf, CI_SECURE, _("Secure"), ci, u->Account());
- CheckOptStr(optbuf, CI_SECUREFOUNDER, _("Secure Founder"), ci, u->Account());
- CheckOptStr(optbuf, CI_SECUREOPS, _("Secure Ops"), ci, u->Account());
- if (ci->HasFlag(CI_SIGNKICK))
- CheckOptStr(optbuf, CI_SIGNKICK, _("Signed kicks"), ci, u->Account());
- else
- CheckOptStr(optbuf, CI_SIGNKICK_LEVEL, _("Signed kicks"), ci, u->Account());
- CheckOptStr(optbuf, CI_TOPICLOCK, _("Topic Lock"), ci, u->Account());
- CheckOptStr(optbuf, CI_PERSIST, _("Persistant"), ci, u->Account());
- CheckOptStr(optbuf, CI_NO_EXPIRE, _("No expire"), ci, u->Account());
-
- source.Reply(NICK_INFO_OPTIONS, optbuf.empty() ? _("None") : optbuf.c_str());
- source.Reply(_(" Mode lock: %s"), ci->GetMLockAsString(true).c_str());
-
- if (!ci->HasFlag(CI_NO_EXPIRE))
- source.Reply(_(" Expires on: %s"), do_strftime(ci->last_used + Config->CSExpire).c_str());
- }
- if (ci->HasFlag(CI_SUSPENDED))
- {
- Anope::string by, reason;
- ci->GetExtRegular("suspend_by", by);
- ci->GetExtRegular("suspend_reason", reason);
- source.Reply(_(" Suspended: [%s] %s"), by.c_str(), !reason.empty() ? reason.c_str() : NO_REASON);
- }
-
- FOREACH_MOD(I_OnChanInfo, OnChanInfo(source, ci, show_all));
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Lists information about the named registered channel,\n"
- "including its founder, time of registration, last time\n"
- "used, description, and mode lock, if any. If \002ALL\002 is \n"
- "specified, the entry message and successor will also \n"
- "be displayed."));
- return true;
- }
-};
-
-class CSInfo : public Module
-{
- CommandCSInfo commandcsinfo;
-
- public:
- CSInfo(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcsinfo(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcsinfo);
- }
-};
-
-MODULE_INIT(CSInfo)
diff --git a/modules/core/cs_invite.cpp b/modules/core/cs_invite.cpp
deleted file mode 100644
index 27b4b03a3..000000000
--- a/modules/core/cs_invite.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSInvite : public Command
-{
- public:
- CommandCSInvite(Module *creator) : Command(creator, "chanserv/invite", 1, 3)
- {
- this->SetDesc(_("Invites you into a channel"));
- this->SetSyntax(_("\037channel\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &chan = params[0];
-
- User *u = source.u;
- Channel *c = findchan(chan);
-
- if (!c)
- {
- source.Reply(CHAN_X_NOT_IN_USE, chan.c_str());
- return;
- }
-
- ChannelInfo *ci = c->ci;
- if (!ci)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
- return;
- }
-
- if (!ci->HasPriv(u, CA_INVITE))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- User *u2;
- if (params.size() == 1)
- u2 = u;
- else
- {
- if (!(u2 = finduser(params[1])))
- {
- source.Reply(NICK_X_NOT_IN_USE, params[1].c_str());
- return;
- }
- }
-
- // XXX need a check for override...
- Log(LOG_COMMAND, u, this, ci) << "for " << u2->nick;
-
- if (c->FindUser(u2))
- source.Reply(_("You are already in \002%s\002! "), c->name.c_str());
- else
- {
- ircdproto->SendInvite(ci->WhoSends(), chan, u2->nick);
- source.Reply(_("\002%s\002 has been invited to \002%s\002."), u2->nick.c_str(), c->name.c_str());
- u2->SendMessage(ci->WhoSends(), _("You have been invited to \002%s\002."), c->name.c_str());
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Tells %s to invite you into the given channel.\n"
- " \n"
- "By default, limited to AOPs or those with level 5 and above\n"
- "on the channel."), source.owner->nick.c_str());
- return true;
- }
-};
-
-class CSInvite : public Module
-{
- CommandCSInvite commandcsinvite;
-
- public:
- CSInvite(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE), commandcsinvite(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcsinvite);
- }
-};
-
-MODULE_INIT(CSInvite)
diff --git a/modules/core/cs_kick.cpp b/modules/core/cs_kick.cpp
deleted file mode 100644
index b98d0953d..000000000
--- a/modules/core/cs_kick.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSKick : public Command
-{
- public:
- CommandCSKick(Module *creator) : Command(creator, "chanserv/kick", 2, 3)
- {
- this->SetDesc(_("Kicks a selected nick from a channel"));
- this->SetSyntax(_("\037channel\037 \037nick\037 [\037reason\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &chan = params[0];
- const Anope::string &target = params[1];
- const Anope::string &reason = params.size() > 2 ? params[2] : "Requested";
-
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- Channel *c = findchan(params[0]);
- bool is_same = target.equals_ci(u->nick);
- User *u2 = is_same ? u : finduser(target);
-
- AccessGroup u_access = ci->AccessFor(u), u2_access = ci->AccessFor(u2);
-
- if (!c)
- source.Reply(CHAN_X_NOT_IN_USE, chan.c_str());
- else if (!ci)
- source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
- else if (!u2)
- source.Reply(NICK_X_NOT_IN_USE, target.c_str());
- else if (!ci->HasPriv(u, CA_KICK))
- source.Reply(ACCESS_DENIED);
- else if (!is_same && (ci->HasFlag(CI_PEACE)) && u2_access >= u_access)
- source.Reply(ACCESS_DENIED);
- else if (u2->IsProtected())
- source.Reply(ACCESS_DENIED);
- else if (!c->FindUser(u2))
- source.Reply(NICK_X_NOT_ON_CHAN, u2->nick.c_str(), c->name.c_str());
- else
- {
- // XXX
- Log(LOG_COMMAND, u, this, ci) << "for " << u2->nick;
-
- if (ci->HasFlag(CI_SIGNKICK) || (ci->HasFlag(CI_SIGNKICK_LEVEL) && !ci->HasPriv(u, CA_SIGNKICK)))
- ci->c->Kick(ci->WhoSends(), u2, "%s (%s)", reason.c_str(), u->nick.c_str());
- else
- ci->c->Kick(ci->WhoSends(), u2, "%s", reason.c_str());
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Kicks a selected nick on a channel.\n"
- " \n"
- "By default, limited to AOPs or those with level 5 access \n"
- "and above on the channel."));
- return true;
- }
-};
-
-class CSKick : public Module
-{
- CommandCSKick commandcskick;
-
- public:
- CSKick(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE), commandcskick(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcskick);
- }
-};
-
-MODULE_INIT(CSKick)
diff --git a/modules/core/cs_list.cpp b/modules/core/cs_list.cpp
deleted file mode 100644
index a79c047c4..000000000
--- a/modules/core/cs_list.cpp
+++ /dev/null
@@ -1,136 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSList : public Command
-{
- public:
- CommandCSList(Module *creator) : Command(creator, "chanserv/list", 1, 2)
- {
- this->SetFlag(CFLAG_STRIP_CHANNEL);
- this->SetDesc(_("Lists all registered channels matching the given pattern"));
- this->SetSyntax(_("\037pattern\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- Anope::string pattern = params[0];
- unsigned nchans;
- bool is_servadmin = u->HasCommand("chanserv/chanserv/list");
- int count = 0, from = 0, to = 0;
- bool suspended = false, channoexpire = false;
-
- if (pattern[0] == '#')
- {
- Anope::string n1 = myStrGetToken(pattern.substr(1), '-', 0), /* Read FROM out */
- n2 = myStrGetTokenRemainder(pattern, '-', 1);
-
- try
- {
- from = convertTo<int>(n1);
- to = convertTo<int>(n2);
- }
- catch (const ConvertException &)
- {
- source.Reply(LIST_INCORRECT_RANGE);
- source.Reply(_("To search for channels starting with #, search for the channel\n"
- "name without the #-sign prepended (\002anope\002 instead of \002#anope\002)."));
- return;
- }
-
- pattern = "*";
- }
-
- nchans = 0;
-
- if (is_servadmin && params.size() > 1)
- {
- Anope::string keyword;
- spacesepstream keywords(params[1]);
- while (keywords.GetToken(keyword))
- {
- if (keyword.equals_ci("SUSPENDED"))
- suspended = true;
- if (keyword.equals_ci("NOEXPIRE"))
- channoexpire = true;
- }
- }
-
- Anope::string spattern = "#" + pattern;
-
- source.Reply(LIST_HEADER, pattern.c_str());
-
- for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it)
- {
- ChannelInfo *ci = it->second;
-
- if (!is_servadmin && (ci->HasFlag(CI_PRIVATE) || ci->HasFlag(CI_SUSPENDED)))
- continue;
- else if (suspended && !ci->HasFlag(CI_SUSPENDED))
- continue;
- else if (channoexpire && !ci->HasFlag(CI_NO_EXPIRE))
- continue;
-
- if (pattern.equals_ci(ci->name) || ci->name.equals_ci(spattern) || Anope::Match(ci->name, pattern) || Anope::Match(ci->name, spattern))
- {
- if (((count + 1 >= from && count + 1 <= to) || (!from && !to)) && ++nchans <= Config->CSListMax)
- {
- char noexpire_char = ' ';
- if (is_servadmin && (ci->HasFlag(CI_NO_EXPIRE)))
- noexpire_char = '!';
-
- Anope::string buf;
- if (ci->HasFlag(CI_SUSPENDED))
- buf = Anope::printf("%-20s [Suspended]", ci->name.c_str());
- else
- buf = Anope::printf("%-20s %s", ci->name.c_str(), !ci->desc.empty() ? ci->desc.c_str() : "");
-
- source.Reply(" %c%s", noexpire_char, buf.c_str());
- }
- ++count;
- }
- }
-
- source.Reply(_("End of list - %d/%d matches shown."), nchans > Config->CSListMax ? Config->CSListMax : nchans, nchans);
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Lists all registered channels matching the given pattern.\n"
- "(Channels with the \002PRIVATE\002 option set are not listed.)\n"
- "Note that a preceding '#' specifies a range, channel names\n"
- "are to be written without '#'."));
- return true;
- }
-};
-
-class CSList : public Module
-{
- CommandCSList commandcslist;
-
- public:
- CSList(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE), commandcslist(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcslist);
- }
-};
-
-MODULE_INIT(CSList)
diff --git a/modules/core/cs_main.cpp b/modules/core/cs_main.cpp
deleted file mode 100644
index 5c490e4ff..000000000
--- a/modules/core/cs_main.cpp
+++ /dev/null
@@ -1,143 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class ChanServCore : public Module
-{
- public:
- ChanServCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE)
- {
- this->SetAuthor("Anope");
-
- BotInfo *ChanServ = findbot(Config->ChanServ);
- if (ChanServ == NULL)
- throw ModuleException("No bot named " + Config->ChanServ);
-
- Implementation i[] = { I_OnBotPrivmsg, I_OnDelCore, I_OnPreHelp, I_OnPostHelp };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
- }
-
- EventReturn OnBotPrivmsg(User *u, BotInfo *bi, Anope::string &message)
- {
- if (Config->CSOpersOnly && !u->HasMode(UMODE_OPER) && bi->nick == Config->ChanServ)
- {
- u->SendMessage(bi, ACCESS_DENIED);
- return EVENT_STOP;
- }
-
- return EVENT_CONTINUE;
- }
-
- void OnDelCore(NickCore *nc)
- {
- // XXX this is slightly inefficient
- for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end;)
- {
- ChannelInfo *ci = it->second;
- ++it;
-
- if (ci->GetFounder() == nc)
- {
- NickCore *newowner = NULL;
- if (ci->successor && (ci->successor->IsServicesOper() || !Config->CSMaxReg || ci->successor->channelcount < Config->CSMaxReg))
- newowner = ci->successor;
- else
- {
- ChanAccess *highest = NULL;
- for (unsigned j = 0; j < ci->GetAccessCount(); ++j)
- {
- ChanAccess *ca = ci->GetAccess(j);
- NickCore *anc = findcore(ca->mask);
-
- if (!anc || (!anc->IsServicesOper() && Config->CSMaxReg && anc->channelcount >= Config->CSMaxReg) || (anc == nc))
- continue;
- if (!highest || *ca > *highest)
- highest = ca;
- }
- if (highest)
- newowner = findcore(highest->mask);
- }
-
- if (newowner)
- {
- Log(LOG_NORMAL, "chanserv/expire") << "Transferring foundership of " << ci->name << " from deleted nick " << nc->display << " to " << newowner->display;
- ci->SetFounder(newowner);
- ci->successor = NULL;
- }
- else
- {
- Log(LOG_NORMAL, "chanserv/expire") << "Deleting channel " << ci->name << " owned by deleted nick " << nc->display;
-
- delete ci;
- continue;
- }
- }
-
- if (ci->successor == nc)
- ci->successor = NULL;
-
- for (unsigned j = 0; j < ci->GetAccessCount(); ++j)
- {
- ChanAccess *ca = ci->GetAccess(j);
- NickCore *anc = findcore(ca->mask);
-
- if (anc && anc == nc)
- {
- ci->EraseAccess(j);
- break;
- }
- }
-
- for (unsigned j = ci->GetAkickCount(); j > 0; --j)
- {
- AutoKick *akick = ci->GetAkick(j - 1);
- if (akick->HasFlag(AK_ISNICK) && akick->nc == nc)
- ci->EraseAkick(j - 1);
- }
- }
- }
-
- void OnPreHelp(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!params.empty() || source.owner->nick != Config->ChanServ)
- return;
- source.Reply(_("\002%s\002 allows you to register and control various\n"
- "aspects of channels. %s can often prevent\n"
- "malicious users from \"taking over\" channels by limiting\n"
- "who is allowed channel operator privileges. Available\n"
- "commands are listed below; to use them, type\n"
- "\002%s%s \037command\037\002. For more information on a\n"
- "specific command, type \002%s%s HELP \037command\037\002.\n "),
- Config->ChanServ.c_str(), Config->ChanServ.c_str(), Config->UseStrictPrivMsgString.c_str(), Config->ChanServ.c_str(), Config->UseStrictPrivMsgString.c_str(), Config->ChanServ.c_str(), Config->ChanServ.c_str(), source.command.c_str());
- }
-
- void OnPostHelp(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!params.empty() || source.owner->nick != Config->ChanServ)
- return;
- if (Config->CSExpire >= 86400)
- source.Reply(_(" \n"
- "Note that any channel which is not used for %d days\n"
- "(i.e. which no user on the channel's access list enters\n"
- "for that period of time) will be automatically dropped."), Config->CSExpire / 86400);
- if (source.u->IsServicesOper())
- source.Reply(_(" \n"
- "Services Operators can also drop any channel without needing\n"
- "to identify via password, and may view the access, akick,\n"
- "and level setting lists for any channel."));
- }
-};
-
-MODULE_INIT(ChanServCore)
-
diff --git a/modules/core/cs_mode.cpp b/modules/core/cs_mode.cpp
deleted file mode 100644
index e67abd85a..000000000
--- a/modules/core/cs_mode.cpp
+++ /dev/null
@@ -1,364 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSMode : public Command
-{
- bool CanSet(User *u, ChannelInfo *ci, ChannelModeName mode)
- {
- switch (mode)
- {
- case CMODE_OWNER:
- return ci->HasPriv(u, CA_OWNER);
- case CMODE_PROTECT:
- return ci->HasPriv(u, CA_PROTECT);
- case CMODE_OP:
- return ci->HasPriv(u, CA_OPDEOP);
- case CMODE_HALFOP:
- return ci->HasPriv(u, CA_HALFOP);
- case CMODE_VOICE:
- return ci->HasPriv(u, CA_VOICE);
- default:
- break;
- }
-
- return false;
- }
-
- void DoLock(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &subcommand = params[2];
- const Anope::string &param = params.size() > 3 ? params[3] : "";
-
- if (subcommand.equals_ci("ADD") && !param.empty())
- {
- spacesepstream sep(param);
- Anope::string modes;
-
- sep.GetToken(modes);
-
- int adding = -1;
- for (size_t i = 0; i < modes.length(); ++i)
- {
- switch (modes[i])
- {
- case '+':
- adding = 1;
- break;
- case '-':
- adding = 0;
- break;
- default:
- if (adding == -1)
- break;
- ChannelMode *cm = ModeManager::FindChannelModeByChar(modes[i]);
- if (!cm || !cm->CanSet(u))
- {
- source.Reply(_("Unknown mode character %c ignored."), 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)))
- source.Reply(_("Missing parameter for mode %c."), cm->ModeChar);
- else
- {
- ci->SetMLock(cm, adding, mode_param, u->nick);
- if (!mode_param.empty())
- mode_param = " " + mode_param;
- source.Reply(_("%c%c%s locked on %s"), adding ? '+' : '-', cm->ModeChar, mode_param.c_str(), ci->name.c_str());
- }
- }
- }
-
- if (ci->c)
- check_modes(ci->c);
- }
- else if (subcommand.equals_ci("DEL") && !param.empty())
- {
- spacesepstream sep(param);
- Anope::string modes;
-
- sep.GetToken(modes);
-
- int adding = -1;
- for (size_t i = 0; i < modes.length(); ++i)
- {
- switch (modes[i])
- {
- case '+':
- adding = 1;
- break;
- case '-':
- adding = 0;
- break;
- default:
- if (adding == -1)
- break;
- ChannelMode *cm = ModeManager::FindChannelModeByChar(modes[i]);
- if (!cm || !cm->CanSet(u))
- {
- source.Reply(_("Unknown mode character %c ignored."), modes[i]);
- break;
- }
- Anope::string mode_param;
- if (!cm->Type == MODE_REGULAR && !sep.GetToken(mode_param))
- source.Reply(_("Missing parameter for mode %c."), cm->ModeChar);
- else
- {
- if (ci->RemoveMLock(cm, mode_param))
- {
- if (!mode_param.empty())
- mode_param = " " + mode_param;
- source.Reply(_("%c%c%s has been unlocked from %s."), adding == 1 ? '+' : '-', cm->ModeChar, mode_param.c_str(), ci->name.c_str());
- }
- else
- source.Reply(_("%c is not locked on %s."), cm->ModeChar, ci->name.c_str());
- }
- }
- }
- }
- else if (subcommand.equals_ci("LIST"))
- {
- const std::multimap<ChannelModeName, ModeLock> &mlocks = ci->GetMLock();
- if (mlocks.empty())
- {
- source.Reply(_("Channel %s has no mode locks."), ci->name.c_str());
- }
- else
- {
- source.Reply(_("Mode locks for %s:"), 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;
- ChannelMode *cm = ModeManager::FindChannelModeByName(ml.name);
- if (!cm)
- continue;
-
- Anope::string modeparam = ml.param;
- if (!modeparam.empty())
- modeparam = " " + modeparam;
- source.Reply(_("%c%c%s, by %s on %s"), ml.set ? '+' : '-', cm->ModeChar, modeparam.c_str(), ml.setter.c_str(), do_strftime(ml.created).c_str());
- }
- }
- }
- else
- this->OnSyntaxError(source, subcommand);
- }
-
- void DoSet(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- spacesepstream sep(params.size() > 3 ? params[3] : "");
- Anope::string modes = params[2], param;
-
- Log(LOG_COMMAND, u, this, ci) << "to set " << params[2];
-
- int adding = -1;
- for (size_t i = 0; i < modes.length(); ++i)
- {
- switch (modes[i])
- {
- case '+':
- adding = 1;
- break;
- case '-':
- adding = 0;
- break;
- case '*':
- if (adding == -1)
- break;
- for (unsigned j = 0; j < ModeManager::ChannelModes.size(); ++j)
- {
- ChannelMode *cm = ModeManager::ChannelModes[j];
- if (cm->CanSet(u))
- {
- if (cm->Type == MODE_REGULAR || (!adding && cm->Type == MODE_PARAM))
- {
- if (adding)
- ci->c->SetMode(NULL, cm);
- else
- ci->c->RemoveMode(NULL, cm);
- }
- }
- }
- break;
- default:
- if (adding == -1)
- break;
- ChannelMode *cm = ModeManager::FindChannelModeByChar(modes[i]);
- if (!cm || !cm->CanSet(u))
- continue;
- switch (cm->Type)
- {
- case MODE_REGULAR:
- if (adding)
- ci->c->SetMode(NULL, cm);
- else
- ci->c->RemoveMode(NULL, cm);
- break;
- case MODE_PARAM:
- if (adding && !sep.GetToken(param))
- break;
- if (adding)
- ci->c->SetMode(NULL, cm, param);
- else
- ci->c->RemoveMode(NULL, cm);
- break;
- case MODE_STATUS:
- {
- if (!sep.GetToken(param))
- break;
-
- if (!this->CanSet(u, ci, cm->Name))
- {
- source.Reply(_("You do not have access to set mode %c."), cm->ModeChar);
- break;
- }
-
- AccessGroup u_access = ci->AccessFor(u);
-
- if (str_is_wildcard(param))
- {
- for (CUserList::const_iterator it = ci->c->users.begin(), it_end = ci->c->users.end(); it != it_end; ++it)
- {
- UserContainer *uc = *it;
-
- AccessGroup targ_access = ci->AccessFor(uc->user);
-
- if (targ_access > u_access)
- {
- source.Reply(_("You do not have the access to change %s's modes."), uc->user->nick.c_str());
- continue;
- }
-
- if (Anope::Match(uc->user->GetMask(), param))
- {
- if (adding)
- ci->c->SetMode(NULL, cm, uc->user->nick);
- else
- ci->c->RemoveMode(NULL, cm, uc->user->nick);
- }
- }
- }
- else
- {
- User *target = finduser(param);
- if (target != NULL)
- {
- AccessGroup targ_access = ci->AccessFor(target);
- if (targ_access > u_access)
- {
- source.Reply(_("You do not have the access to change %s's modes."), target->nick.c_str());
- break;
- }
- }
- if (adding)
- ci->c->SetMode(NULL, cm, param);
- else
- ci->c->RemoveMode(NULL, cm, param);
- }
- break;
- }
- case MODE_LIST:
- if (!sep.GetToken(param))
- break;
- if (adding)
- ci->c->SetMode(NULL, cm, param);
- else
- {
- std::pair<Channel::ModeList::iterator, Channel::ModeList::iterator> its = ci->c->GetModeList(cm->Name);
- for (; its.first != its.second;)
- {
- const Anope::string &mask = its.first->second;
- ++its.first;
-
- if (Anope::Match(mask, param))
- ci->c->RemoveMode(NULL, cm, mask);
- }
- }
- }
- }
- }
- }
-
- public:
- CommandCSMode(Module *creator) : Command(creator, "chanserv/mode", 3, 4)
- {
- this->SetDesc(_("Control modes and mode locks on a channel"));
- this->SetSyntax(_("\037channel\037 LOCK {ADD|DEL|LIST} [\037what\037]"));
- this->SetSyntax(_("\037channel\037 SET \037modes\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &subcommand = params[1];
-
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
-
- if (!ci || !ci->c)
- source.Reply(CHAN_X_NOT_IN_USE, ci->name.c_str());
- else if (!ci->HasPriv(u, CA_MODE) && !u->HasCommand("chanserv/chanserv/mode"))
- source.Reply(ACCESS_DENIED);
- else if (subcommand.equals_ci("LOCK"))
- this->DoLock(source, ci, params);
- else if (subcommand.equals_ci("SET"))
- this->DoSet(source, ci, params);
- else
- this->OnSyntaxError(source, "");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Mainly controls mode locks and mode access (which is different from channel access)\n"
- "on a channel.\n"
- " \n"
- "The \002MODE LOCK\002 command allows you to add, delete, and view mode locks on a channel.\n"
- "If a mode is locked on or off, services will not allow that mode to be changed.\n"
- "Example:\n"
- " \002MODE #channel LOCK ADD +bmnt *!*@*aol*\002\n"
- " \n"
- "The \002MODE SET\002 command allows you to set modes through services. Wildcards * and ? may\n"
- "be given as parameters for list and status modes.\n"
- "Example:\n"
- " \002MODE #channel SET +v *\002\n"
- " Sets voice status to all users in the channel.\n"
- " \n"
- " \002MODE #channel SET -b ~c:*\n"
- " Clears all extended bans that start with ~c:"));
- return true;
- }
-};
-
-class CSMode : public Module
-{
- CommandCSMode commandcsmode;
-
- public:
- CSMode(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcsmode(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcsmode);
- }
-};
-
-MODULE_INIT(CSMode)
diff --git a/modules/core/cs_modes.cpp b/modules/core/cs_modes.cpp
deleted file mode 100644
index cee2f9460..000000000
--- a/modules/core/cs_modes.cpp
+++ /dev/null
@@ -1,431 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandModeBase : public Command
-{
- void do_mode(CommandSource &source, Command *com, ChannelMode *cm, const Anope::string &chan, const Anope::string &nick, bool set, ChannelAccess level, ChannelAccess levelself, ChannelInfoFlag notice)
- {
- User *u = source.u;
- User *u2 = finduser(nick);
- Channel *c = findchan(chan);
- ChannelInfo *ci = c ? c->ci : NULL;
-
- bool is_same = u == u2;
-
- AccessGroup u_access = ci ? ci->AccessFor(u) : AccessGroup(), u2_access = ci && u2 ? ci->AccessFor(u2) : AccessGroup();
-
- if (!c)
- source.Reply(CHAN_X_NOT_IN_USE, chan.c_str());
- else if (!ci)
- source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
- else if (!u2)
- source.Reply(NICK_X_NOT_IN_USE, nick.c_str());
- else if (is_same ? !ci->HasPriv(u, levelself) : !ci->HasPriv(u, level))
- source.Reply(ACCESS_DENIED);
- else if (!set && !is_same && ci->HasFlag(CI_PEACE) && u2_access >= u_access)
- source.Reply(ACCESS_DENIED);
- else if (!set && u2->IsProtected() && !is_same)
- source.Reply(ACCESS_DENIED);
- else if (!c->FindUser(u2))
- source.Reply(NICK_X_NOT_ON_CHAN, u2->nick.c_str(), c->name.c_str());
- else
- {
- if (set)
- c->SetMode(NULL, cm, u2->nick);
- else
- c->RemoveMode(NULL, cm, u2->nick);
-
- Log(LOG_COMMAND, u, com, ci) << "for " << u2->nick;
- if (notice && ci->HasFlag(notice))
- ircdproto->SendMessage(ci->WhoSends(), c->name, "%s command used for %s by %s", com->name.c_str(), u2->nick.c_str(), u->nick.c_str());
- }
- }
-
- protected:
- /** do_util: not a command, but does the job of others
- * @param source The source of the command
- * @param com The command calling this function
- * @param cm A channel mode class
- * @param chan The channel its being set on
- * @param nick The nick the modes being set on
- * @param set Is the mode being set or removed
- * @param level The acecss level required to set this mode on someone else
- * @param levelself The access level required to set this mode on yourself
- * @param notice Flag required on a channel to send a notice
- */
- void do_util(CommandSource &source, Command *com, ChannelMode *cm, const Anope::string &chan, const Anope::string &nick, bool set, ChannelAccess level, ChannelAccess levelself, ChannelInfoFlag notice)
- {
- User *u = source.u;
-
- if (chan.empty())
- for (UChannelList::iterator it = u->chans.begin(); it != u->chans.end(); ++it)
- do_mode(source, com, cm, (*it)->chan->name, u->nick, set, level, levelself, notice);
- else
- do_mode(source, com, cm, chan, !nick.empty() ? nick : u->nick, set, level, levelself, notice);
-
- return;
- }
-
- public:
- CommandModeBase(Module *creator, const Anope::string &cname) : Command(creator, cname, 0, 2)
- {
- this->SetSyntax(_("[\037#channel\037] [\037nick\037]"));
- }
-};
-
-class CommandCSOp : public CommandModeBase
-{
- public:
- CommandCSOp(Module *creator) : CommandModeBase(creator, "chanserv/op")
- {
- this->SetDesc(_("Gives Op status to a selected nick on a channel"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OP);
-
- return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", true, CA_OPDEOP, CA_OPDEOPME, CI_OPNOTICE);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Ops a selected nick on a channel. If nick is not given,\n"
- "it will op you. If channel is not given, it will op you\n"
- "on every channel.\n"
- " \n"
- "By default, limited to AOPs or those with level 5 access \n"
- "and above on the channel."));
- return true;
- }
-};
-
-class CommandCSDeOp : public CommandModeBase
-{
- public:
- CommandCSDeOp(Module *creator) : CommandModeBase(creator, "chanserv/deop")
- {
- this->SetDesc(_("Deops a selected nick on a channel"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OP);
-
- return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", false, CA_OPDEOP, CA_OPDEOPME, CI_OPNOTICE);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply("Deops a selected nick on a channel. If nick is not given,\n"
- "it will deop you. If channel is not given, it will deop\n"
- "you on every channel.\n"
- " \n"
- "By default, limited to AOPs or those with level 5 access \n"
- "and above on the channel.");
- return true;
- }
-};
-
-class CommandCSVoice : public CommandModeBase
-{
- public:
- CommandCSVoice(Module *creator) : CommandModeBase(creator, "chanserv/voice")
- {
- this->SetDesc(_("Voices a selected nick on a channel"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_VOICE);
-
- return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", true, CA_VOICE, CA_VOICEME, CI_BEGIN);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Voices a selected nick on a channel. If nick is not given,\n"
- "it will voice you. If channel is not given, it will voice you\n"
- "on every channel.\n"
- " \n"
- "By default, limited to AOPs or those with level 5 access \n"
- "and above on the channel, or to VOPs or those with level 3 \n"
- "and above for self voicing."));
- return true;
- }
-};
-
-class CommandCSDeVoice : public CommandModeBase
-{
- public:
- CommandCSDeVoice(Module *creator) : CommandModeBase(creator, "chanserv/devoice")
- {
- this->SetDesc(_("Devoices a selected nick on a channel"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_VOICE);
-
- return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", false, CA_VOICE, CA_VOICEME, CI_BEGIN);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Devoices a selected nick on a channel. If nick is not given,\n"
- "it will devoice you. If channel is not given, it will devoice\n"
- "you on every channel.\n"
- " \n"
- "By default, limited to AOPs or those with level 5 access \n"
- "and above on the channel, or to VOPs or those with level 3 \n"
- "and above for self devoicing."));
- return true;
- }
-};
-
-class CommandCSHalfOp : public CommandModeBase
-{
- public:
- CommandCSHalfOp(Module *creator) : CommandModeBase(creator, "chanserv/halfop")
- {
- this->SetDesc(_("Halfops a selected nick on a channel"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_HALFOP);
-
- if (!cm)
- return;
-
- return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", true, CA_HALFOP, CA_HALFOPME, CI_BEGIN);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Halfops a selected nick on a channel. If nick is not given,\n"
- "it will halfop you. If channel is not given, it will halfop\n"
- "you on every channel.\n"
- " \n"
- "By default, limited to AOPs and those with level 5 access \n"
- "and above on the channel, or to HOPs or those with level 4 \n"));
- return true;
- }
-};
-
-class CommandCSDeHalfOp : public CommandModeBase
-{
- public:
- CommandCSDeHalfOp(Module *creator) : CommandModeBase(creator, "chanserv/dehalfop")
- {
- this->SetDesc(_("Dehalfops a selected nick on a channel"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_HALFOP);
-
- if (!cm)
- return;
-
- return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", false, CA_HALFOP, CA_HALFOPME, CI_BEGIN);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Dehalfops a selected nick on a channel. If nick is not given,\n"
- "it will dehalfop you. If channel is not given, it will dehalfop\n"
- "you on every channel.\n"
- " \n"
- "By default, limited to AOPs and those with level 5 access \n"
- "and above on the channel, or to HOPs or those with level 4 \n"
- "and above for self dehalfopping."));
- return true;
- }
-};
-
-class CommandCSProtect : public CommandModeBase
-{
- public:
- CommandCSProtect(Module *creator) : CommandModeBase(creator, "chanserv/protect")
- {
- this->SetDesc(_("Protects a selected nick on a channel"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_PROTECT);
-
- if (!cm)
- return;
-
- return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", true, CA_PROTECT, CA_PROTECTME, CI_BEGIN);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Protects a selected nick on a channel. If nick is not given,\n"
- "it will protect you. If channel is not given, it will protect\n"
- "you on every channel.\n"
- " \n"
- "By default, limited to the founder, or to SOPs or those with \n"
- "level 10 and above on the channel for self protecting."));
- return true;
- }
-};
-
-class CommandCSDeProtect : public CommandModeBase
-{
- public:
- CommandCSDeProtect(Module *creator) : CommandModeBase(creator, "chanserv/deprotect")
- {
- this->SetDesc(_("Deprotects a selected nick on a channel"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_PROTECT);
-
- if (!cm)
- return;
-
- return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", false, CA_PROTECT, CA_PROTECTME, CI_BEGIN);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Deprotects a selected nick on a channel. If nick is not given,\n"
- "it will deprotect you. If channel is not given, it will deprotect\n"
- "you on every channel.\n"
- " \n"
- "By default, limited to the founder, or to SOPs or those with \n"));
- return true;
- }
-};
-
-class CommandCSOwner : public CommandModeBase
-{
- public:
- CommandCSOwner(Module *creator) : CommandModeBase(module, "chanserv/owner")
- {
- this->SetDesc(_("Gives you owner status on channel"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OWNER);
-
- if (!cm)
- return;
-
- return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", true, CA_OWNER, CA_OWNERME, CI_BEGIN);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Gives the selected nick owner status on \002channel\002. If nick is not\n"
- "given, it will give you owner. If channel is not given, it will\n"
- "give you owner on every channel.\n"
- " \n"
- "Limited to those with founder access on the channel."));
- return true;
- }
-};
-
-class CommandCSDeOwner : public CommandModeBase
-{
- public:
- CommandCSDeOwner(Module *creator) : CommandModeBase(creator, "chanserv/deowner")
- {
- this->SetDesc(_("Removes your owner status on a channel"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OWNER);
-
- if (!cm)
- return;
-
- return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", false, CA_OWNER, CA_OWNERME, CI_BEGIN);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Removes owner status from the selected nick on \002channel\002. If nick\n"
- "is not given, it will deowner you. If channel is not given, it will\n"
- "deowner you on every channel.\n"
- " \n"
- "Limited to those with founder access on the channel."));
- return true;
- }
-};
-
-class CSModes : public Module
-{
- CommandCSOwner commandcsowner;
- CommandCSDeOwner commandcsdeowner;
- CommandCSProtect commandcsprotect;
- CommandCSDeProtect commandcsdeprotect;
- CommandCSOp commandcsop;
- CommandCSDeOp commandcsdeop;
- CommandCSHalfOp commandcshalfop;
- CommandCSDeHalfOp commandcsdehalfop;
- CommandCSVoice commandcsvoice;
- CommandCSDeVoice commandcsdevoice;
-
- public:
- CSModes(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcsowner(this), commandcsdeowner(this), commandcsprotect(this), commandcsdeprotect(this),
- commandcsop(this), commandcsdeop(this), commandcshalfop(this), commandcsdehalfop(this),
- commandcsvoice(this), commandcsdevoice(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcsop);
- ModuleManager::RegisterService(&commandcsdeop);
- ModuleManager::RegisterService(&commandcsvoice);
- ModuleManager::RegisterService(&commandcsdevoice);
-
- ModuleManager::RegisterService(&commandcsowner);
- ModuleManager::RegisterService(&commandcsdeowner);
- ModuleManager::RegisterService(&commandcsprotect);
- ModuleManager::RegisterService(&commandcsdeprotect);
- ModuleManager::RegisterService(&commandcshalfop);
- ModuleManager::RegisterService(&commandcsdehalfop);
- }
-};
-
-MODULE_INIT(CSModes)
diff --git a/modules/core/cs_register.cpp b/modules/core/cs_register.cpp
deleted file mode 100644
index 117212519..000000000
--- a/modules/core/cs_register.cpp
+++ /dev/null
@@ -1,193 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSRegister : public Command
-{
- public:
- CommandCSRegister(Module *creator) : Command(creator, "chanserv/register", 1, 2)
- {
- this->SetDesc(_("Register a channel"));
- this->SetSyntax(_("\037channel\037 [\037description\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &chan = params[0];
- const Anope::string &chdesc = params.size() > 1 ? params[1] : "";
-
- User *u = source.u;
- Channel *c = findchan(params[0]);
- ChannelInfo *ci = cs_findchan(params[0]);
-
- if (readonly)
- source.Reply(_("Sorry, channel registration is temporarily disabled."));
- else if (u->Account()->HasFlag(NI_UNCONFIRMED))
- source.Reply(_("You must confirm your account before you can register a channel."));
- else if (chan[0] == '&')
- source.Reply(_("Local channels cannot be registered."));
- else if (chan[0] != '#')
- source.Reply(CHAN_SYMBOL_REQUIRED);
- else if (!ircdproto->IsChannelValid(chan))
- source.Reply(CHAN_X_INVALID, chan.c_str());
- else if (ci)
- source.Reply(_("Channel \002%s\002 is already registered!"), chan.c_str());
- else if (c && !c->HasUserStatus(u, CMODE_OP))
- source.Reply(_("You must be a channel operator to register the channel."));
- else if (Config->CSMaxReg && u->Account()->channelcount >= Config->CSMaxReg && !u->HasPriv("chanserv/no-register-limit"))
- source.Reply(u->Account()->channelcount > Config->CSMaxReg ? CHAN_EXCEEDED_CHANNEL_LIMIT : _(CHAN_REACHED_CHANNEL_LIMIT), Config->CSMaxReg);
- else
- {
- ci = new ChannelInfo(chan);
- ci->SetFounder(u->Account());
- if (!chdesc.empty())
- ci->desc = chdesc;
-
- if (c && !c->topic.empty())
- {
- ci->last_topic = c->topic;
- ci->last_topic_setter = c->topic_setter;
- ci->last_topic_time = c->topic_time;
- }
- else
- ci->last_topic_setter = source.owner->nick;
-
- ci->bi = NULL;
- Log(LOG_COMMAND, u, this, ci);
- source.Reply(_("Channel \002%s\002 registered under your nickname: %s"), chan.c_str(), u->nick.c_str());
-
- /* Implement new mode lock */
- if (c)
- {
- check_modes(c);
-
- ChannelMode *cm;
- if (u->FindChannel(c) != NULL)
- {
- /* On most ircds you do not receive the admin/owner mode till its registered */
- if ((cm = ModeManager::FindChannelModeByName(CMODE_OWNER)))
- c->SetMode(NULL, cm, u->nick);
- else if ((cm = ModeManager::FindChannelModeByName(CMODE_PROTECT)))
- c->RemoveMode(NULL, cm, u->nick);
- }
-
- /* Mark the channel as persistant */
- if (c->HasMode(CMODE_PERM))
- ci->SetFlag(CI_PERSIST);
- /* Persist may be in def cflags, set it here */
- else if (ci->HasFlag(CI_PERSIST) && (cm = ModeManager::FindChannelModeByName(CMODE_PERM)))
- c->SetMode(NULL, CMODE_PERM);
- }
-
- FOREACH_MOD(I_OnChanRegistered, OnChanRegistered(ci));
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Registers a channel in the %s database. In order\n"
- "to use this command, you must first be a channel operator\n"
- "on the channel you're trying to register.\n"
- "The description, which is optional, is a\n"
- "general description of the channel's purpose.\n"
- " \n"
- "When you register a channel, you are recorded as the\n"
- "\"founder\" of the channel. The channel founder is allowed\n"
- "to change all of the channel settings for the channel;\n"
- "%s will also automatically give the founder\n"
- "channel-operator privileges when s/he enters the channel.\n"
- "See the \002ACCESS\002 command (\002%s%s HELP ACCESS\002) for\n"
- "information on giving a subset of these privileges to\n"
- "other channel users.\n"
- " \n"
- "NOTICE: In order to register a channel, you must have\n"
- "first registered your nickname. If you haven't,\n"
- "\002%s%s HELP\002 for information on how to do so."),
- source.owner->nick.c_str(), source.owner->nick.c_str(), Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str(), Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str());
- return true;
- }
-};
-
-class ExpireCallback : public CallBack
-{
- public:
- ExpireCallback(Module *owner) : CallBack(owner, Config->ExpireTimeout, Anope::CurTime, true) { }
-
- void Tick(time_t)
- {
- if (!Config->CSExpire || noexpire || readonly)
- return;
-
- for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; )
- {
- ChannelInfo *ci = it->second;
- ++it;
-
- bool expire = false;
- if (ci->HasFlag(CI_SUSPENDED))
- {
- if (Config->CSSuspendExpire && Anope::CurTime - ci->last_used >= Config->CSSuspendExpire)
- expire = true;
- }
- else if (!ci->c && Config->CSExpire && Anope::CurTime - ci->last_used >= Config->CSExpire)
- expire = true;
-
- if (ci->HasFlag(CI_NO_EXPIRE))
- expire = false;
-
- if (expire)
- {
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnPreChanExpire, OnPreChanExpire(ci));
- if (MOD_RESULT == EVENT_STOP)
- continue;
-
- Anope::string extra;
- if (ci->HasFlag(CI_SUSPENDED))
- extra = "suspended ";
-
- Log(LOG_NORMAL, "chanserv/expire") << "Expiring " << extra << "channel " << ci->name << " (founder: " << (ci->GetFounder() ? ci->GetFounder()->display : "(none)") << ")";
- FOREACH_MOD(I_OnChanExpire, OnChanExpire(ci));
- delete ci;
- }
- }
- }
-};
-
-class CSRegister : public Module
-{
- CommandCSRegister commandcsregister;
- ExpireCallback ecb;
-
- public:
- CSRegister(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcsregister(this), ecb(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcsregister);
- ModuleManager::Attach(I_OnDelChan, this);
- }
-
- void OnDelChan(ChannelInfo *ci)
- {
- if (ci->c && ci->c->HasMode(CMODE_REGISTERED))
- ci->c->RemoveMode(NULL, CMODE_REGISTERED, "", false);
- }
-};
-
-MODULE_INIT(CSRegister)
diff --git a/modules/core/cs_saset.cpp b/modules/core/cs_saset.cpp
deleted file mode 100644
index 699c5bc2c..000000000
--- a/modules/core/cs_saset.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSASet : public Command
-{
- public:
- CommandCSSASet(Module *creator) : Command(creator, "chanserv/saset", 2, 3)
- {
- this->SetDesc(_("Forcefully set channel options and information"));
- this->SetSyntax(_("\037option\037 \037channel\037 \037parameters\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->OnSyntaxError(source, "");
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows Services Operators to forcefully change settings\n"
- "on channels.\n"
- " \n"
- "Available options:"));
- Anope::string this_name = source.command;
- for (BotInfo::command_map::iterator it = source.owner->commands.begin(), it_end = source.owner->commands.end(); it != it_end; ++it)
- {
- const Anope::string &c_name = it->first;
- CommandInfo &info = it->second;
- if (c_name.find_ci(this_name + " ") == 0)
- {
- service_reference<Command> command(info.name);
- if (command)
- {
- source.command = it->first;
- command->OnServHelp(source);
- }
- }
- }
- source.Reply(_("Type \002%s%s HELP SASET \037option\037\002 for more information on a\n"
- "particular option."), Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str());
- return true;
- }
-};
-
-class CSSASet : public Module
-{
- CommandCSSASet commandcssaset;
-
- public:
- CSSASet(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcssaset(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcssaset);
- }
-};
-
-MODULE_INIT(CSSASet)
diff --git a/modules/core/cs_saset_noexpire.cpp b/modules/core/cs_saset_noexpire.cpp
deleted file mode 100644
index 1e085496f..000000000
--- a/modules/core/cs_saset_noexpire.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSASetNoexpire : public Command
-{
- public:
- CommandCSSASetNoexpire(Module *creator) : Command(creator, "chanserv/saset/noexpire", 2, 2)
- {
- this->SetDesc(_("Prevent the channel from expiring"));
- this->SetDesc(_("\037channel\037 {ON | OFF}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (source.permission.empty() && !ci->HasPriv(u, CA_SET))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (params[1].equals_ci("ON"))
- {
- ci->SetFlag(CI_NO_EXPIRE);
- source.Reply(_("Channel %s \002will not\002 expire."), ci->name.c_str());
- }
- else if (params[1].equals_ci("OFF"))
- {
- ci->UnsetFlag(CI_NO_EXPIRE);
- source.Reply(_("Channel %s \002will\002 expire."), ci->name.c_str());
- }
- else
- this->OnSyntaxError(source, "NOEXPIRE");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Sets whether the given channel will expire. Setting this\n"
- "to ON prevents the channel from expiring."));
- return true;
- }
-};
-
-class CSSetNoexpire : public Module
-{
- CommandCSSASetNoexpire commandcssasetnoexpire;
-
- public:
- CSSetNoexpire(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcssasetnoexpire(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcssasetnoexpire);
- }
-};
-
-MODULE_INIT(CSSetNoexpire)
diff --git a/modules/core/cs_set.cpp b/modules/core/cs_set.cpp
deleted file mode 100644
index 65719ce91..000000000
--- a/modules/core/cs_set.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSet : public Command
-{
- public:
- CommandCSSet(Module *creator) : Command(creator, "chanserv/set", 2, 3)
- {
- this->SetDesc(_("Set channel options and information"));
- this->SetSyntax(_("\037option\037 \037channel\037 \037parameters\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->OnSyntaxError(source, "");
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows the channel founder to set various channel options\n"
- "and other information.\n"
- " \n"
- "Available options:"));
- Anope::string this_name = source.command;
- for (BotInfo::command_map::iterator it = source.owner->commands.begin(), it_end = source.owner->commands.end(); it != it_end; ++it)
- {
- const Anope::string &c_name = it->first;
- CommandInfo &info = it->second;
- if (c_name.find_ci(this_name + " ") == 0)
- {
- service_reference<Command> command(info.name);
- if (command)
- {
- source.command = it->first;
- command->OnServHelp(source);
- }
- }
- }
- source.Reply(_("Type \002%s%s HELP SET \037option\037\002 for more information on a\n"
- "particular option."), Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str());
- return true;
- }
-};
-
-class CSSet : public Module
-{
- CommandCSSet commandcsset;
-
- public:
- CSSet(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcsset(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcsset);
- }
-};
-
-MODULE_INIT(CSSet)
diff --git a/modules/core/cs_set_bantype.cpp b/modules/core/cs_set_bantype.cpp
deleted file mode 100644
index 94d2aa151..000000000
--- a/modules/core/cs_set_bantype.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSetBanType : public Command
-{
- public:
- CommandCSSetBanType(Module *creator, const Anope::string &cname = "chanserv/set/bantype") : Command(creator, cname, 2, 2)
- {
- this->SetDesc(_("Set how Services make bans on the channel"));
- this->SetSyntax(_("\037channel\037 \037bantype\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (source.permission.empty() && !ci->HasPriv(u, CA_SET))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- try
- {
- int16 new_type = convertTo<int16>(params[1]);
- if (new_type < 0 || new_type > 3)
- throw ConvertException("Invalid range");
- ci->bantype = new_type;
- source.Reply(_("Ban type for channel %s is now #%d."), ci->name.c_str(), ci->bantype);
- }
- catch (const ConvertException &)
- {
- source.Reply(_("\002%s\002 is not a valid ban type."), params[1].c_str());
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Sets the ban type that will be used by services whenever\n"
- "they need to ban someone from your channel.\n"
- " \n"
- "bantype is a number between 0 and 3 that means:\n"
- " \n"
- "0: ban in the form *!user@host\n"
- "1: ban in the form *!*user@host\n"
- "2: ban in the form *!*@host\n"
- "3: ban in the form *!*user@*.domain"), this->name.c_str());
- return true;
- }
-};
-
-class CommandCSSASetBanType : public CommandCSSetBanType
-{
- public:
- CommandCSSASetBanType(Module *creator) : CommandCSSetBanType(creator, "chanserv/saset/bantype")
- {
- }
-};
-
-class CSSetBanType : public Module
-{
- CommandCSSetBanType commandcssetbantype;
- CommandCSSASetBanType commandcssasetbantype;
-
- public:
- CSSetBanType(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcssetbantype(this), commandcssasetbantype(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcssetbantype);
- ModuleManager::RegisterService(&commandcssasetbantype);
- }
-};
-
-MODULE_INIT(CSSetBanType)
diff --git a/modules/core/cs_set_description.cpp b/modules/core/cs_set_description.cpp
deleted file mode 100644
index 5c2cd447d..000000000
--- a/modules/core/cs_set_description.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSetDescription : public Command
-{
- public:
- CommandCSSetDescription(Module *creator, const Anope::string &cname = "chanserv/set/description") : Command(creator, cname, 1, 2)
- {
- this->SetDesc(_("Set the channel description"));
- this->SetSyntax(_("\037channel\037 [\037description\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (source.permission.empty() && !ci->HasPriv(u, CA_SET))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (params.size() > 1)
- {
- ci->desc = params[1];
- source.Reply(_("Description of %s changed to \002%s\002."), ci->name.c_str(), ci->desc.c_str());
- }
- else
- {
- ci->desc.clear();
- source.Reply(_("Description of %s unset."), ci->name.c_str());
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Sets the description for the channel, which shows up with\n"
- "the \002LIST\002 and \002INFO\002 commands."), this->name.c_str());
- return true;
- }
-};
-
-class CommandCSSASetDescription : public CommandCSSetDescription
-{
- public:
- CommandCSSASetDescription(Module *creator) : CommandCSSetDescription(creator, "chanserv/saset/description")
- {
- }
-};
-
-class CSSetDescription : public Module
-{
- CommandCSSetDescription commandcssetdescription;
- CommandCSSASetDescription commandcssasetdescription;
-
- public:
- CSSetDescription(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcssetdescription(this), commandcssasetdescription(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcssetdescription);
- ModuleManager::RegisterService(&commandcssasetdescription);
- }
-};
-
-MODULE_INIT(CSSetDescription)
diff --git a/modules/core/cs_set_founder.cpp b/modules/core/cs_set_founder.cpp
deleted file mode 100644
index 2169af972..000000000
--- a/modules/core/cs_set_founder.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSetFounder : public Command
-{
- public:
- CommandCSSetFounder(Module *creator, const Anope::string &cname = "chanserv/set/founder") : Command(creator, cname, 2, 2)
- {
- this->SetDesc(_("Set the founder of a channel"));
- this->SetSyntax(_("\037channel\037 \037nick\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (source.permission.empty() && !ci->HasPriv(u, CA_SET))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (source.permission.empty() && (ci->HasFlag(CI_SECUREFOUNDER) ? !IsFounder(u, ci) : !ci->HasPriv(u, CA_FOUNDER)))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- NickAlias *na = findnick(params[1]);
-
- if (!na)
- {
- source.Reply(NICK_X_NOT_REGISTERED, params[1].c_str());
- return;
- }
-
- NickCore *nc = na->nc;
- if (Config->CSMaxReg && nc->channelcount >= Config->CSMaxReg && !u->HasPriv("chanserv/no-register-limit"))
- {
- source.Reply(_("\002%s\002 has too many channels registered."), na->nick.c_str());
- return;
- }
-
- Log(!source.permission.empty() ? LOG_ADMIN : LOG_COMMAND, u, this, ci) << "to change the founder to " << nc->display;
-
- ci->SetFounder(nc);
-
- source.Reply(_("Founder of %s changed to \002%s\002."), ci->name.c_str(), na->nick.c_str());
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Changes the founder of a channel. The new nickname must\n"
- "be a registered one."), this->name.c_str());
- return true;
- }
-};
-
-class CommandCSSASetFounder : public CommandCSSetFounder
-{
- public:
- CommandCSSASetFounder(Module *creator) : CommandCSSetFounder(creator, "chanserv/saset/founder")
- {
- }
-};
-
-class CSSetFounder : public Module
-{
- CommandCSSetFounder commandcssetfounder;
- CommandCSSASetFounder commandcssasetfounder;
-
- public:
- CSSetFounder(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcssetfounder(this), commandcssasetfounder(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcssetfounder);
- ModuleManager::RegisterService(&commandcssasetfounder);
- }
-};
-
-MODULE_INIT(CSSetFounder)
diff --git a/modules/core/cs_set_keeptopic.cpp b/modules/core/cs_set_keeptopic.cpp
deleted file mode 100644
index 05578a2e5..000000000
--- a/modules/core/cs_set_keeptopic.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSetKeepTopic : public Command
-{
- public:
- CommandCSSetKeepTopic(Module *creator, const Anope::string &cname = "chanserv/set/keeptopic") : Command(creator, cname, 2, 2)
- {
- this->SetDesc(_("Retain topic when channel is not in use"));
- this->SetSyntax(_("\037channel\037 {ON | OFF}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (source.permission.empty() && !ci->HasPriv(u, CA_SET))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (params[1].equals_ci("ON"))
- {
- ci->SetFlag(CI_KEEPTOPIC);
- source.Reply(_("Topic retention option for %s is now \002on\002."), ci->name.c_str());
- }
- else if (params[1].equals_ci("OFF"))
- {
- ci->UnsetFlag(CI_KEEPTOPIC);
- source.Reply(_("Topic retention option for %s is now \002off\002."), ci->name.c_str());
- }
- else
- this->OnSyntaxError(source, "KEEPTOPIC");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Enables or disables the \002topic retention\002 option for a \n"
- "channel. When \002topic retention\002 is set, the topic for the\n"
- "channel will be remembered by %s even after the\n"
- "last user leaves the channel, and will be restored the\n"
- "next time the channel is created."), this->name.c_str(), source.owner->nick.c_str());
- return true;
- }
-};
-
-class CommandCSSASetKeepTopic : public CommandCSSetKeepTopic
-{
- public:
- CommandCSSASetKeepTopic(Module *creator) : CommandCSSetKeepTopic(creator, "chanserv/saset/keeptopic")
- {
- }
-};
-
-class CSSetKeepTopic : public Module
-{
- CommandCSSetKeepTopic commandcssetkeeptopic;
- CommandCSSASetKeepTopic commandcssasetkeeptopic;
-
- public:
- CSSetKeepTopic(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcssetkeeptopic(this), commandcssasetkeeptopic(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcssetkeeptopic);
- ModuleManager::RegisterService(&commandcssasetkeeptopic);
- }
-};
-
-MODULE_INIT(CSSetKeepTopic)
diff --git a/modules/core/cs_set_opnotice.cpp b/modules/core/cs_set_opnotice.cpp
deleted file mode 100644
index 018b89437..000000000
--- a/modules/core/cs_set_opnotice.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSetOpNotice : public Command
-{
- public:
- CommandCSSetOpNotice(Module *creator, const Anope::string &cname = "chanserv/set/notice") : Command(creator, cname, 2, 2)
- {
- this->SetDesc(_("Send a notice when OP/DEOP commands are used"));
- this->SetSyntax(_("\037channel\037 {ON | OFF}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (source.permission.empty() && !ci->HasPriv(u, CA_SET))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (params[1].equals_ci("ON"))
- {
- ci->SetFlag(CI_OPNOTICE);
- source.Reply(_("Op-notice option for %s is now \002on\002."), ci->name.c_str());
- }
- else if (params[1].equals_ci("OFF"))
- {
- ci->UnsetFlag(CI_OPNOTICE);
- source.Reply(_("Op-notice option for %s is now \002off\002."), ci->name.c_str());
- }
- else
- this->OnSyntaxError(source, "OPNOTICE");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Enables or disables the \002op-notice\002 option for a channel.\n"
- "When \002op-notice\002 is set, %s will send a notice to the\n"
- "channel whenever the \002OP\002 or \002DEOP\002 commands are used for a user\n"
- "in the channel."), this->name.c_str(), source.owner->nick.c_str());
- return true;
- }
-};
-
-class CommandCSSASetOpNotice : public CommandCSSetOpNotice
-{
- public:
- CommandCSSASetOpNotice(Module *creator) : CommandCSSetOpNotice(creator, "chanserv/saset/opnotice")
- {
- }
-};
-
-class CSSetOpNotice : public Module
-{
- CommandCSSetOpNotice commandcssetopnotice;
- CommandCSSASetOpNotice commandcssasetopnotice;
-
- public:
- CSSetOpNotice(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcssetopnotice(this), commandcssasetopnotice(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcssetopnotice);
- ModuleManager::RegisterService(&commandcssasetopnotice);
- }
-};
-
-MODULE_INIT(CSSetOpNotice)
diff --git a/modules/core/cs_set_peace.cpp b/modules/core/cs_set_peace.cpp
deleted file mode 100644
index 3a045fc6d..000000000
--- a/modules/core/cs_set_peace.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSetPeace : public Command
-{
- public:
- CommandCSSetPeace(Module *creator, const Anope::string &cname = "chanserv/set/peace") : Command(creator, cname, 2, 2)
- {
- this->SetDesc(_("Regulate the use of critical commands"));
- this->SetSyntax(_("\037channel\037 {ON | OFF}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (source.permission.empty() && !ci->HasPriv(u, CA_SET))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (params[1].equals_ci("ON"))
- {
- ci->SetFlag(CI_PEACE);
- source.Reply(_("Peace option for %s is now \002on\002."), ci->name.c_str());
- }
- else if (params[1].equals_ci("OFF"))
- {
- ci->UnsetFlag(CI_PEACE);
- source.Reply(_("Peace option for %s is now \002off\002."), ci->name.c_str());
- }
- else
- this->OnSyntaxError(source, "PEACE");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Enables or disables the \002peace\002 option for a channel.\n"
- "When \002peace\002 is set, a user won't be able to kick,\n"
- "ban or remove a channel status of a user that has\n"
- "a level superior or equal to his via %s commands."), source.owner->nick.c_str());
- return true;
- }
-};
-
-class CommandCSSASetPeace : public CommandCSSetPeace
-{
- public:
- CommandCSSASetPeace(Module *creator) : CommandCSSetPeace(creator, "chanserv/saset/peace")
- {
- }
-};
-
-class CSSetPeace : public Module
-{
- CommandCSSetPeace commandcssetpeace;
- CommandCSSASetPeace commandcssasetpeace;
-
- public:
- CSSetPeace(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcssetpeace(this), commandcssasetpeace(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcssetpeace);
- ModuleManager::RegisterService(&commandcssasetpeace);
- }
-};
-
-MODULE_INIT(CSSetPeace)
diff --git a/modules/core/cs_set_persist.cpp b/modules/core/cs_set_persist.cpp
deleted file mode 100644
index 3cc9564c4..000000000
--- a/modules/core/cs_set_persist.cpp
+++ /dev/null
@@ -1,180 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSetPersist : public Command
-{
- public:
- CommandCSSetPersist(Module *creator, const Anope::string &cname = "chanserv/set/persist") : Command(creator, cname, 2, 2)
- {
- this->SetDesc(_("Set the channel as permanent"));
- this->SetSyntax(_("\037channel\037 {ON | OFF}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (source.permission.empty() && !ci->HasPriv(u, CA_SET))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_PERM);
-
- if (params[1].equals_ci("ON"))
- {
- if (!ci->HasFlag(CI_PERSIST))
- {
- ci->SetFlag(CI_PERSIST);
- if (ci->c)
- ci->c->SetFlag(CH_PERSIST);
-
- /* Channel doesn't exist, create it */
- if (!ci->c)
- {
- Channel *c = new Channel(ci->name);
- if (ci->bi)
- ci->bi->Join(c);
- }
-
- /* No botserv bot, no channel mode */
- /* Give them ChanServ
- * Yes, this works fine with no Config->s_BotServ
- */
- if (!ci->bi && !cm)
- {
- BotInfo *bi = findbot(Config->ChanServ);
- if (!bi)
- {
- source.Reply(_("ChanServ is required to enable persist on this network."));
- return;
- }
- bi->Assign(NULL, ci);
- if (!ci->c->FindUser(bi))
- bi->Join(ci->c);
- }
-
- /* Set the perm mode */
- if (cm)
- {
- if (ci->c && !ci->c->HasMode(CMODE_PERM))
- ci->c->SetMode(NULL, cm);
- /* Add it to the channels mlock */
- ci->SetMLock(cm, true);
- }
- }
-
- source.Reply(_("Channel \002%s\002 is now persistant."), ci->name.c_str());
- }
- else if (params[1].equals_ci("OFF"))
- {
- if (ci->HasFlag(CI_PERSIST))
- {
- ci->UnsetFlag(CI_PERSIST);
- if (ci->c)
- ci->c->UnsetFlag(CH_PERSIST);
-
- /* Unset perm mode */
- if (cm)
- {
- if (ci->c && ci->c->HasMode(CMODE_PERM))
- ci->c->RemoveMode(NULL, cm);
- /* Remove from mlock */
- ci->RemoveMLock(cm);
- }
-
- /* No channel mode, no BotServ, but using ChanServ as the botserv bot
- * which was assigned when persist was set on
- */
- if (!cm && Config->BotServ.empty() && ci->bi)
- {
- BotInfo *bi = findbot(Config->ChanServ);
- if (!bi)
- {
- source.Reply(_("ChanServ is required to enable persist on this network."));
- return;
- }
- /* Unassign bot */
- bi->UnAssign(NULL, ci);
- }
- }
-
- source.Reply(_("Channel \002%s\002 is no longer persistant."), ci->name.c_str());
- }
- else
- this->OnSyntaxError(source, "PERSIST");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Enables or disables the persistant channel setting.\n"
- "When persistant is set, the service bot will remain\n"
- "in the channel when it has emptied of users.\n"
- " \n"
- "If your IRCd does not a permanent (persistant) channel\n"
- "mode you must have a service bot in your channel to\n"
- "set persist on, and it can not be unassigned while persist\n"
- "is on.\n"
- " \n"
- "If this network does not have BotServ enabled and does\n"
- "not have a permanent channel mode, ChanServ will\n"
- "join your channel when you set persist on (and leave when\n"
- "it has been set off).\n"
- " \n"
- "If your IRCd has a permanent (persistant) channel mode\n"
- "and is is set or unset (for any reason, including MLOCK),\n"
- "persist is automatically set and unset for the channel aswell.\n"
- "Additionally, services will set or unset this mode when you\n"
- "set persist on or off."));
- return true;
- }
-};
-
-class CommandCSSASetPersist : public CommandCSSetPersist
-{
- public:
- CommandCSSASetPersist(Module *creator) : CommandCSSetPersist(creator, "chanserv/saset/persist")
- {
- }
-};
-
-class CSSetPersist : public Module
-{
- CommandCSSetPersist commandcssetpeace;
- CommandCSSASetPersist commandcssasetpeace;
-
- public:
- CSSetPersist(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcssetpeace(this), commandcssasetpeace(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcssetpeace);
- ModuleManager::RegisterService(&commandcssasetpeace);
- }
-};
-
-MODULE_INIT(CSSetPersist)
diff --git a/modules/core/cs_set_private.cpp b/modules/core/cs_set_private.cpp
deleted file mode 100644
index 108b11569..000000000
--- a/modules/core/cs_set_private.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSetPrivate : public Command
-{
- public:
- CommandCSSetPrivate(Module *creator, const Anope::string &cname = "chanserv/set/private") : Command(creator, cname, 2, 2)
- {
- this->SetDesc(_("Hide channel from LIST command"));
- this->SetSyntax(_("\037channel\037 {ON | OFF}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (source.permission.empty() && !ci->HasPriv(u, CA_SET))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (params[1].equals_ci("ON"))
- {
- ci->SetFlag(CI_PRIVATE);
- source.Reply(_("Private option for %s is now \002on\002."), ci->name.c_str());
- }
- else if (params[1].equals_ci("OFF"))
- {
- ci->UnsetFlag(CI_PRIVATE);
- source.Reply(_("Private option for %s is now \002off\002."), ci->name.c_str());
- }
- else
- this->OnSyntaxError(source, "PRIVATE");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Enables or disables the \002private\002 option for a channel.\n"
- "When \002private\002 is set, a \002%s%s LIST\002 will not\n"
- "include the channel in any lists."),
- Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str());
- return true;
- }
-};
-
-class CommandCSSASetPrivate : public CommandCSSetPrivate
-{
- public:
- CommandCSSASetPrivate(Module *creator) : CommandCSSetPrivate(creator, "chanserv/saset/private")
- {
- }
-};
-
-class CSSetPrivate : public Module
-{
- CommandCSSetPrivate commandcssetprivate;
- CommandCSSASetPrivate commandcssasetprivate;
-
- public:
- CSSetPrivate(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcssetprivate(this), commandcssasetprivate(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcssetprivate);
- ModuleManager::RegisterService(&commandcssasetprivate);
- }
-};
-
-MODULE_INIT(CSSetPrivate)
diff --git a/modules/core/cs_set_restricted.cpp b/modules/core/cs_set_restricted.cpp
deleted file mode 100644
index 5d675d2e7..000000000
--- a/modules/core/cs_set_restricted.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSetRestricted : public Command
-{
- public:
- CommandCSSetRestricted(Module *creator, const Anope::string &cname = "chanserv/set/restricted") : Command(creator, cname, 2, 2)
- {
- this->SetDesc(_("Restrict access to the channel"));
- this->SetSyntax(_("\037channel\037 {ON | OFF}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (source.permission.empty() && !ci->HasPriv(u, CA_SET))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (params[1].equals_ci("ON"))
- {
- ci->SetFlag(CI_RESTRICTED);
- source.Reply(_("Restricted access option for %s is now \002on\002."), ci->name.c_str());
- }
- else if (params[1].equals_ci("OFF"))
- {
- ci->UnsetFlag(CI_RESTRICTED);
- source.Reply(_("Restricted access option for %s is now \002off\002."), ci->name.c_str());
- }
- else
- this->OnSyntaxError(source, "RESTRICTED");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Enables or disables the \002restricted access\002 option for a\n"
- "channel. When \002restricted access\002 is set, users not on the access list will\n"
- "instead be kicked and banned from the channel."));
- return true;
- }
-};
-
-class CommandCSSASetRestricted : public CommandCSSetRestricted
-{
- public:
- CommandCSSASetRestricted(Module *creator) : CommandCSSetRestricted(creator, "chanserv/saset/restricted")
- {
- }
-};
-
-class CSSetRestricted : public Module
-{
- CommandCSSetRestricted commandcssetrestricted;
- CommandCSSASetRestricted commandcssasetrestricted;
-
- public:
- CSSetRestricted(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcssetrestricted(this), commandcssasetrestricted(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcssetrestricted);
- ModuleManager::RegisterService(&commandcssasetrestricted);
- }
-};
-
-MODULE_INIT(CSSetRestricted)
diff --git a/modules/core/cs_set_secure.cpp b/modules/core/cs_set_secure.cpp
deleted file mode 100644
index 26e8c5768..000000000
--- a/modules/core/cs_set_secure.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSetSecure : public Command
-{
- public:
- CommandCSSetSecure(Module *creator, const Anope::string &cname = "chanserv/set/secure") : Command(creator, cname, 2, 2)
- {
- this->SetDesc(_("Activate security features"));
- this->SetSyntax(_("\037channel\037 {ON | OFF}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (source.permission.empty() && !ci->HasPriv(u, CA_SET))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (params[1].equals_ci("ON"))
- {
- ci->SetFlag(CI_SECURE);
- source.Reply(_("Secure option for %s is now \002on\002."), ci->name.c_str());
- }
- else if (params[1].equals_ci("OFF"))
- {
- ci->UnsetFlag(CI_SECURE);
- source.Reply(_("Secure option for %s is now \002off\002."), ci->name.c_str());
- }
- else
- this->OnSyntaxError(source, "SECURE");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Enables or disables security features for a\n"
- "channel. When \002%s\002 is set, only users who have\n"
- "registered their nicknames and IDENTIFY'd\n"
- "with their password will be given access to the channel\n"
- "as controlled by the access list."), this->name.c_str());
- return true;
- }
-};
-
-class CommandCSSASetSecure : public CommandCSSetSecure
-{
- public:
- CommandCSSASetSecure(Module *creator) : CommandCSSetSecure(creator, "chanserv/saset/secure")
- {
- }
-};
-
-class CSSetSecure : public Module
-{
- CommandCSSetSecure commandcssetsecure;
- CommandCSSASetSecure commandcssasetsecure;
-
- public:
- CSSetSecure(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcssetsecure(this), commandcssasetsecure(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcssetsecure);
- ModuleManager::RegisterService(&commandcssasetsecure);
- }
-};
-
-MODULE_INIT(CSSetSecure)
diff --git a/modules/core/cs_set_securefounder.cpp b/modules/core/cs_set_securefounder.cpp
deleted file mode 100644
index 7afc2e32d..000000000
--- a/modules/core/cs_set_securefounder.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSetSecureFounder : public Command
-{
- public:
- CommandCSSetSecureFounder(Module *creator, const Anope::string &cname = "chanserv/set/securefounder") : Command(creator, cname, 2, 2)
- {
- this->SetDesc(_("Stricter control of channel founder status"));
- this->SetSyntax(_("\037channel\037 {ON | OFF}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
-
- if (source.permission.empty() && ci->HasFlag(CI_SECUREFOUNDER) ? !IsFounder(u, ci) : !ci->HasPriv(u, CA_FOUNDER))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (params[1].equals_ci("ON"))
- {
- ci->SetFlag(CI_SECUREFOUNDER);
- source.Reply(_("Secure founder option for %s is now \002on\002."), ci->name.c_str());
- }
- else if (params[1].equals_ci("OFF"))
- {
- ci->UnsetFlag(CI_SECUREFOUNDER);
- source.Reply(_("Secure founder option for %s is now \002off\002."), ci->name.c_str());
- }
- else
- this->OnSyntaxError(source, "SECUREFOUNDER");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Enables or disables the \002secure founder\002 option for a channel.\n"
- "When \002secure founder\002 is set, only the real founder will be\n"
- "able to drop the channel, change its password, its founder and its\n"
- "successor, and not those who have founder level access through\n"
- "the access/qop command."));
- return true;
- }
-};
-
-class CommandCSSASetSecureFounder : public CommandCSSetSecureFounder
-{
- public:
- CommandCSSASetSecureFounder(Module *creator) : CommandCSSetSecureFounder(creator, "chanserv/saset/securefounder")
- {
- }
-};
-
-class CSSetSecureFounder : public Module
-{
- CommandCSSetSecureFounder commandcssetsecurefounder;
- CommandCSSASetSecureFounder commandcssasetsecurefounder;
-
- public:
- CSSetSecureFounder(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcssetsecurefounder(this), commandcssasetsecurefounder(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcssetsecurefounder);
- ModuleManager::RegisterService(&commandcssasetsecurefounder);
- }
-};
-
-MODULE_INIT(CSSetSecureFounder)
diff --git a/modules/core/cs_set_secureops.cpp b/modules/core/cs_set_secureops.cpp
deleted file mode 100644
index 4c3c54b05..000000000
--- a/modules/core/cs_set_secureops.cpp
+++ /dev/null
@@ -1,92 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSetSecureOps : public Command
-{
- public:
- CommandCSSetSecureOps(Module *creator, const Anope::string &cname = "chanserv/set/secureops") : Command(creator, cname, 2, 2)
- {
- this->SetDesc(_("Stricter control of chanop status"));
- this->SetSyntax(_("\037channel\037 {ON | OFF}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (source.permission.empty() && !ci->HasPriv(u, CA_SET))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (params[1].equals_ci("ON"))
- {
- ci->SetFlag(CI_SECUREOPS);
- source.Reply(_("Secure ops option for %s is now \002on\002."), ci->name.c_str());
- }
- else if (params[1].equals_ci("OFF"))
- {
- ci->UnsetFlag(CI_SECUREOPS);
- source.Reply(_("Secure ops option for %s is now \002off\002."), ci->name.c_str());
- }
- else
- this->OnSyntaxError(source, "SECUREOPS");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Enables or disables the \002secure ops\002 option for a channel.\n"
- "When \002secure ops\002 is set, users who are not on the userlist\n"
- "will not be allowed chanop status."));
- return true;
- }
-};
-
-class CommandCSSASetSecureOps : public CommandCSSetSecureOps
-{
- public:
- CommandCSSASetSecureOps(Module *creator) : CommandCSSetSecureOps(creator, "chanserv/saset/secureops")
- {
- }
-};
-
-class CSSetSecureOps : public Module
-{
- CommandCSSetSecureOps commandcssetsecureops;
- CommandCSSASetSecureOps commandcssasetsecureops;
-
- public:
- CSSetSecureOps(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcssetsecureops(this), commandcssasetsecureops(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcssetsecureops);
- ModuleManager::RegisterService(&commandcssasetsecureops);
- }
-};
-
-MODULE_INIT(CSSetSecureOps)
diff --git a/modules/core/cs_set_signkick.cpp b/modules/core/cs_set_signkick.cpp
deleted file mode 100644
index 0d421576d..000000000
--- a/modules/core/cs_set_signkick.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSetSignKick : public Command
-{
- public:
- CommandCSSetSignKick(Module *creator, const Anope::string &cname = "chanserv/set/signkick") : Command(creator, cname, 2, 2)
- {
- this->SetDesc(_("Sign kicks that are done with KICK command"));
- this->SetSyntax(_("\037channel\037 SIGNKICK {ON | LEVEL | OFF}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (source.permission.empty() && !ci->HasPriv(u, CA_SET))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (params[1].equals_ci("ON"))
- {
- ci->SetFlag(CI_SIGNKICK);
- ci->UnsetFlag(CI_SIGNKICK_LEVEL);
- source.Reply(_("Signed kick option for %s is now \002on\002."), ci->name.c_str());
- }
- else if (params[1].equals_ci("LEVEL"))
- {
- ci->SetFlag(CI_SIGNKICK_LEVEL);
- ci->UnsetFlag(CI_SIGNKICK);
- source.Reply(_("Signed kick option for %s is now \002ON\002, but depends of the\n"
- "level of the user that is using the command."), ci->name.c_str());
- }
- else if (params[1].equals_ci("OFF"))
- {
- ci->UnsetFlag(CI_SIGNKICK);
- ci->UnsetFlag(CI_SIGNKICK_LEVEL);
- source.Reply(_("Signed kick option for %s is now \002off\002."), ci->name.c_str());
- }
- else
- this->OnSyntaxError(source, "SIGNKICK");
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Enables or disables signed kicks for a\n"
- "channel. When \002SIGNKICK\002 is set, kicks issued with\n"
- "KICK command will have the nick that used the\n"
- "command in their reason.\n"
- " \n"
- "If you use \002LEVEL\002, those who have a level that is superior \n"
- "or equal to the SIGNKICK level on the channel won't have their \n"
- "kicks signed."));
- return true;
- }
-};
-
-class CommandCSSASetSignKick : public CommandCSSetSignKick
-{
- public:
- CommandCSSASetSignKick(Module *creator) : CommandCSSetSignKick(creator, "chanserv/saset/signkick")
- {
- }
-};
-
-class CSSetSignKick : public Module
-{
- CommandCSSetSignKick commandcssetsignkick;
- CommandCSSASetSignKick commandcssasetsignkick;
-
- public:
- CSSetSignKick(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcssetsignkick(this), commandcssasetsignkick(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcssetsignkick);
- ModuleManager::RegisterService(&commandcssasetsignkick);
- }
-};
-
-MODULE_INIT(CSSetSignKick)
diff --git a/modules/core/cs_set_successor.cpp b/modules/core/cs_set_successor.cpp
deleted file mode 100644
index f7ed8dba9..000000000
--- a/modules/core/cs_set_successor.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSetSuccessor : public Command
-{
- public:
- CommandCSSetSuccessor(Module *creator, const Anope::string &cname = "chanserv/set/successor") : Command(creator, cname, 1, 2)
- {
- this->SetDesc(_("Set the successor for a channel"));
- this->SetSyntax(_("\037channel\037 \037nick\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (source.permission.empty() && !ci->HasPriv(u, CA_SET))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (source.permission.empty() && ci->HasFlag(CI_SECUREFOUNDER) ? !IsFounder(u, ci) : !ci->HasPriv(u, CA_FOUNDER))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- NickCore *nc;
-
- if (params.size() > 1)
- {
- NickAlias *na = findnick(params[1]);
-
- if (!na)
- {
- source.Reply(NICK_X_NOT_REGISTERED, params[1].c_str());
- return;
- }
- if (na->nc == ci->GetFounder())
- {
- source.Reply(_("%s cannot be the successor on channel %s they are the founder."), na->nick.c_str(), ci->name.c_str());
- return;
- }
- nc = na->nc;
- }
- else
- nc = NULL;
-
- Log(!source.permission.empty() ? LOG_ADMIN : LOG_COMMAND, u, this, ci) << "to change the successor from " << (ci->successor ? ci->successor->display : "none") << " to " << (nc ? nc->display : "none");
-
- ci->successor = nc;
-
- if (nc)
- source.Reply(_("Successor for %s changed to \002%s\002."), ci->name.c_str(), nc->display.c_str());
- else
- source.Reply(_("Successor for \002%s\002 unset."), ci->name.c_str());
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Changes the successor of a channel. If the founder's\n"
- "nickname expires or is dropped while the channel is still\n"
- "registered, the successor will become the new founder of the\n"
- "channel. However, if the successor already has too many\n"
- "channels registered (%d), the channel will be dropped\n"
- "instead, just as if no successor had been set. The new\n"
- "nickname must be a registered one."), Config->CSMaxReg);
- return true;
- }
-};
-
-class CommandCSSASetSuccessor : public CommandCSSetSuccessor
-{
- public:
- CommandCSSASetSuccessor(Module *creator) : CommandCSSetSuccessor(creator, "chanserv/saset/successor")
- {
- }
-};
-
-class CSSetSuccessor : public Module
-{
- CommandCSSetSuccessor commandcssetsuccessor;
- CommandCSSASetSuccessor commandcssasetsuccessor;
-
- public:
- CSSetSuccessor(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcssetsuccessor(this), commandcssasetsuccessor(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcssetsuccessor);
- ModuleManager::RegisterService(&commandcssasetsuccessor);
- }
-};
-
-MODULE_INIT(CSSetSuccessor)
diff --git a/modules/core/cs_set_topiclock.cpp b/modules/core/cs_set_topiclock.cpp
deleted file mode 100644
index e670385ba..000000000
--- a/modules/core/cs_set_topiclock.cpp
+++ /dev/null
@@ -1,92 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSetTopicLock : public Command
-{
- public:
- CommandCSSetTopicLock(Module *creator, const Anope::string &cname = "chanserv/set/topiclock") : Command(creator, cname, 2, 2)
- {
- this->SetDesc(_("Topic can only be changed with TOPIC"));
- this->SetSyntax(_("\037channel\037 {ON | OFF}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (source.permission.empty() && !ci->HasPriv(u, CA_SET))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- if (params[1].equals_ci("ON"))
- {
- ci->SetFlag(CI_TOPICLOCK);
- source.Reply(_("Topic lock option for %s is now \002on\002."), ci->name.c_str());
- }
- else if (params[1].equals_ci("OFF"))
- {
- ci->UnsetFlag(CI_TOPICLOCK);
- source.Reply(_("Topic lock option for %s is now \002off\002."), ci->name.c_str());
- }
- else
- this->OnSyntaxError(source, "TOPICLOCK");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Enables or disables the \002topic lock\002 option for a channel.\n"
- "When \002topic lock\002 is set, the channel topic will be unchangable\n"
- " except via the \002TOPIC\002 command."));
- return true;
- }
-};
-
-class CommandCSSASetTopicLock : public CommandCSSetTopicLock
-{
- public:
- CommandCSSASetTopicLock(Module *creator) : CommandCSSetTopicLock(creator, "chanserv/saset/topiclock")
- {
- }
-};
-
-class CSSetTopicLock : public Module
-{
- CommandCSSetTopicLock commandcssettopiclock;
- CommandCSSASetTopicLock commandcssasettopiclock;
-
- public:
- CSSetTopicLock(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcssettopiclock(this), commandcssasettopiclock(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcssettopiclock);
- ModuleManager::RegisterService(&commandcssasettopiclock);
- }
-};
-
-MODULE_INIT(CSSetTopicLock)
diff --git a/modules/core/cs_suspend.cpp b/modules/core/cs_suspend.cpp
deleted file mode 100644
index d59ffb44b..000000000
--- a/modules/core/cs_suspend.cpp
+++ /dev/null
@@ -1,158 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSSuspend : public Command
-{
- public:
- CommandCSSuspend(Module *creator) : Command(creator, "chanserv/suspend", 1, 2)
- {
- this->SetDesc(_("Prevent a channel from being used preserving channel data and settings"));
- this->SetSyntax(_("\037channel\037 [\037reason\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &reason = params.size() > 1 ? params[1] : "";
-
- User *u = source.u;
-
- if (Config->ForceForbidReason && reason.empty())
- {
- this->OnSyntaxError(source, "");
- return;
- }
-
- if (readonly)
- source.Reply(READ_ONLY_MODE);
-
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- ci->SetFlag(CI_SUSPENDED);
- ci->Extend("suspend_by", new ExtensibleItemRegular<Anope::string>(u->nick));
- if (!reason.empty())
- ci->Extend("suspend_reason", new ExtensibleItemRegular<Anope::string>(u->nick));
-
- if (ci->c)
- {
- for (CUserList::iterator it = ci->c->users.begin(), it_end = ci->c->users.end(); it != it_end; )
- {
- UserContainer *uc = *it++;
-
- if (uc->user->HasMode(UMODE_OPER))
- continue;
-
- ci->c->Kick(NULL, uc->user, "%s", !reason.empty() ? reason.c_str() : translate(uc->user, _("This channel has been suspended.")));
- }
- }
-
- Log(LOG_ADMIN, u, this, ci) << (!reason.empty() ? reason : "No reason");
- source.Reply(_("Channel \002%s\002 is now suspended."), ci->name.c_str());
-
- FOREACH_MOD(I_OnChanSuspend, OnChanSuspend(ci));
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Disallows anyone from using the given channel.\n"
- "May be cancelled by using the UNSUSPEND\n"
- "command to preserve all previous channel data/settings.\n"
- " \n"
- "Reason may be required on certain networks."));
- return true;
- }
-};
-
-class CommandCSUnSuspend : public Command
-{
- public:
- CommandCSUnSuspend(Module *creator) : Command(creator, "chanserv/unsuspend", 1, 1)
- {
- this->SetDesc(_("Releases a suspended channel"));
- this->SetSyntax(_("\037channel\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- if (readonly)
- source.Reply(READ_ONLY_MODE);
-
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- /* Only UNSUSPEND already suspended channels */
- if (!ci->HasFlag(CI_SUSPENDED))
- {
- source.Reply(_("Couldn't release channel \002%s\002!"), ci->name.c_str());
- return;
- }
-
- Anope::string by, reason;
- ci->GetExtRegular("suspend_by", by);
- ci->GetExtRegular("suspend_reason", reason);
- Log(LOG_ADMIN, u, this, ci) << " which was suspended by " << by << " for: " << (!reason.empty() ? reason : "No reason");
-
- ci->UnsetFlag(CI_SUSPENDED);
- ci->Shrink("suspend_by");
- ci->Shrink("suspend_reason");
-
- source.Reply(_("Channel \002%s\002 is now released."), ci->name.c_str());
-
- FOREACH_MOD(I_OnChanUnsuspend, OnChanUnsuspend(ci));
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Releases a suspended channel. All data and settings\n"
- "are preserved from before the suspension."));
- return true;
- }
-};
-
-class CSSuspend : public Module
-{
- CommandCSSuspend commandcssuspend;
- CommandCSUnSuspend commandcsunsuspend;
-
- public:
- CSSuspend(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcssuspend(this), commandcsunsuspend(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcssuspend);
- ModuleManager::RegisterService(&commandcsunsuspend);
- }
-};
-
-MODULE_INIT(CSSuspend)
diff --git a/modules/core/cs_topic.cpp b/modules/core/cs_topic.cpp
deleted file mode 100644
index 1b5de11c3..000000000
--- a/modules/core/cs_topic.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSTopic : public Command
-{
- public:
- CommandCSTopic(Module *creator) : Command(creator, "chanserv/topic", 1, 2)
- {
- this->SetDesc(_("Manipulate the topic of the specified channel"));
- this->SetSyntax(_("\037channel\037 [\037topic\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &topic = params.size() > 1 ? params[1] : "";
-
- User *u = source.u;
-
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (!ci->c)
- source.Reply(CHAN_X_NOT_IN_USE, ci->name.c_str());
- else if (!ci->HasPriv(u, CA_TOPIC) && !u->HasCommand("chanserv/chanserv/topic"))
- source.Reply(ACCESS_DENIED);
- else
- {
- bool has_topiclock = ci->HasFlag(CI_TOPICLOCK);
- ci->UnsetFlag(CI_TOPICLOCK);
- ci->c->ChangeTopic(u->nick, topic, Anope::CurTime);
- if (has_topiclock)
- ci->SetFlag(CI_TOPICLOCK);
-
- bool override = !ci->HasPriv(u, CA_TOPIC);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "to change the topic to " << (!topic.empty() ? topic : "No topic");
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Causes %s to set the channel topic to the one\n"
- "specified. If \002topic\002 is not given, then an empty topic\n"
- "is set. This command is most useful in conjunction\n"
- "with topic lock.\n"
- "By default, limited to those with founder access on the\n"
- "channel."), source.owner->nick.c_str());
- return true;
- }
-};
-
-class CSTopic : public Module
-{
- CommandCSTopic commandcstopic;
-
- public:
- CSTopic(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcstopic(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcstopic);
- }
-};
-
-MODULE_INIT(CSTopic)
diff --git a/modules/core/cs_unban.cpp b/modules/core/cs_unban.cpp
deleted file mode 100644
index cc3c68e91..000000000
--- a/modules/core/cs_unban.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandCSUnban : public Command
-{
- public:
- CommandCSUnban(Module *creator) : Command(creator, "chanserv/unban", 1, 2)
- {
- this->SetDesc(_("Remove all bans preventing a user from entering a channel"));
- this->SetSyntax(_("\037channel\037 [\037nick\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- if (ci->c == NULL)
- {
- source.Reply(CHAN_X_NOT_IN_USE, ci->name.c_str());
- return;
- }
-
- if (!ci->HasPriv(u, CA_UNBAN))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- User *u2 = u;
- if (params.size() > 1)
- u2 = finduser(params[1]);
-
- if (!u2)
- {
- source.Reply(NICK_X_NOT_IN_USE, params[1].c_str());
- return;
- }
-
- common_unban(ci, u2, u == u2);
- if (u2 == u)
- source.Reply(_("You have been unbanned from \002%s\002."), ci->c->name.c_str());
- else
- source.Reply(_("\002%s\002 has been unbanned from \002%s\002."), u2->nick.c_str(), ci->c->name.c_str());
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Tells %s to remove all bans preventing you or the given\n"
- "user from entering the given channel. \n"
- " \n"
- "By default, limited to AOPs or those with level 5 and above\n"
- "on the channel."), source.owner->nick.c_str());
- return true;
- }
-};
-
-class CSUnban : public Module
-{
- CommandCSUnban commandcsunban;
-
- public:
- CSUnban(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandcsunban(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandcsunban);
- }
-};
-
-MODULE_INIT(CSUnban)
diff --git a/modules/core/cs_xop.cpp b/modules/core/cs_xop.cpp
deleted file mode 100644
index 1b9348026..000000000
--- a/modules/core/cs_xop.cpp
+++ /dev/null
@@ -1,880 +0,0 @@
-/* ChanServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-enum XOPType
-{
- XOP_QOP,
- XOP_SOP,
- XOP_AOP,
- XOP_HOP,
- XOP_VOP,
- XOP_UNKNOWN
-};
-
-static struct XOPAccess
-{
- XOPType type;
- Anope::string name;
- ChannelAccess access[CA_SIZE];
-} xopAccess[] = {
- { XOP_QOP, "QOP",
- {
- CA_SIGNKICK,
- CA_SET,
- CA_AUTOOWNER,
- CA_OWNERME,
- CA_PROTECT,
- CA_INFO,
- CA_SIZE
- }
- },
- { XOP_SOP, "SOP",
- {
- CA_AUTOPROTECT,
- CA_AKICK,
- CA_BADWORDS,
- CA_ASSIGN,
- CA_MEMO,
- CA_ACCESS_CHANGE,
- CA_PROTECTME,
- CA_OPDEOP,
- CA_SIZE
- }
- },
- { XOP_AOP, "AOP",
- {
- CA_TOPIC,
- CA_MODE,
- CA_GETKEY,
- CA_INVITE,
- CA_UNBAN,
- CA_AUTOOP,
- CA_OPDEOPME,
- CA_HALFOP,
- CA_SAY,
- CA_NOKICK,
- CA_SIZE
- }
- },
- { XOP_HOP, "HOP",
- {
- CA_AUTOHALFOP,
- CA_HALFOPME,
- CA_KICK,
- CA_BAN,
- CA_FANTASIA,
- CA_SIZE
- }
- },
- { XOP_VOP, "VOP",
- {
- CA_AUTOVOICE,
- CA_VOICEME,
- CA_ACCESS_LIST,
- CA_SIZE
- }
- },
- { XOP_UNKNOWN, "", { }
- }
-};
-
-class XOPChanAccess : public ChanAccess
-{
- public:
- XOPType type;
-
- XOPChanAccess(AccessProvider *p) : ChanAccess(p)
- {
- }
-
- bool Matches(User *u, NickCore *nc)
- {
- if (u && (Anope::Match(u->nick, this->mask) || Anope::Match(u->GetMask(), this->mask)))
- return true;
- else if (nc && Anope::Match(nc->display, this->mask))
- return true;
- return false;
- }
-
- bool HasPriv(ChannelAccess priv)
- {
- for (int i = 0; xopAccess[i].type != XOP_UNKNOWN; ++i)
- {
- XOPAccess &x = xopAccess[i];
-
- if (this->type > x.type)
- continue;
-
- for (int j = 0; x.access[j] != CA_SIZE; ++j)
- if (x.access[j] == priv)
- return true;
- }
-
- return false;
- }
-
- Anope::string Serialize()
- {
- for (int i = 0; xopAccess[i].type != XOP_UNKNOWN; ++i)
- {
- XOPAccess &x = xopAccess[i];
-
- if (this->type == x.type)
- return x.name;
- }
-
- return "";
- }
-
- void Unserialize(const Anope::string &data)
- {
- for (int i = 0; xopAccess[i].type != XOP_UNKNOWN; ++i)
- {
- XOPAccess &x = xopAccess[i];
-
- if (data == x.name)
- {
- this->type = x.type;
- return;
- }
- }
-
- this->type = XOP_UNKNOWN;
- }
-
- static XOPType DetermineLevel(ChanAccess *access)
- {
- if (access->provider->name == "access/xop")
- {
- XOPChanAccess *xaccess = debug_cast<XOPChanAccess *>(access);
- return xaccess->type;
- }
- else
- {
- int count[XOP_UNKNOWN];
- for (int i = 0; i < XOP_UNKNOWN; ++i)
- count[i] = 0;
-
- for (int i = 0; xopAccess[i].type != XOP_UNKNOWN; ++i)
- {
- XOPAccess &x = xopAccess[i];
-
- for (int j = 0; x.access[j] != CA_SIZE; ++j)
- if (access->HasPriv(x.access[j]))
- ++count[x.type];
- }
-
- XOPType max = XOP_UNKNOWN;
- int maxn = 0;
- for (int i = 0; i < XOP_UNKNOWN; ++i)
- if (count[i] > maxn)
- {
- max = static_cast<XOPType>(i);
- maxn = count[i];
- }
-
- return max;
- }
- }
-};
-
-class XOPAccessProvider : public AccessProvider
-{
- public:
- XOPAccessProvider(Module *o) : AccessProvider(o, "access/xop")
- {
- }
-
- ChanAccess *Create()
- {
- return new XOPChanAccess(this);
- }
-};
-
-class XOPListCallback : public NumberList
-{
- CommandSource &source;
- ChannelInfo *ci;
- XOPType type;
- Command *c;
- bool SentHeader;
- public:
- XOPListCallback(CommandSource &_source, ChannelInfo *_ci, const Anope::string &numlist, XOPType _type, Command *_c) : NumberList(numlist, false), source(_source), ci(_ci), type(_type), c(_c), SentHeader(false)
- {
- }
-
- void HandleNumber(unsigned Number)
- {
- if (!Number || Number > ci->GetAccessCount())
- return;
-
- ChanAccess *access = ci->GetAccess(Number - 1);
-
- if (this->type != XOPChanAccess::DetermineLevel(access))
- return;
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("%s list for %s:\n Num Nick"), source.command.c_str(), ci->name.c_str());
- }
-
- DoList(source, access, Number - 1, this->type);
- }
-
- static void DoList(CommandSource &source, ChanAccess *access, unsigned index, XOPType type)
- {
- source.Reply(_(" %3d %s"), index, access->mask.c_str());
- }
-};
-
-class XOPDelCallback : public NumberList
-{
- CommandSource &source;
- ChannelInfo *ci;
- Command *c;
- unsigned Deleted;
- Anope::string Nicks;
- bool override;
- XOPType type;
- public:
- XOPDelCallback(CommandSource &_source, ChannelInfo *_ci, Command *_c, bool _override, XOPType _type, const Anope::string &numlist) : NumberList(numlist, true), source(_source), ci(_ci), c(_c), Deleted(0), override(_override), type(_type)
- {
- }
-
- ~XOPDelCallback()
- {
- if (!Deleted)
- source.Reply(_("No matching entries on %s %s list."), ci->name.c_str(), source.command.c_str());
- else
- {
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, source.u, c, ci) << "deleted access of users " << Nicks;
-
- if (Deleted == 1)
- source.Reply(_("Deleted one entry from %s %s list."), ci->name.c_str(), source.command.c_str());
- else
- source.Reply(_("Deleted %d entries from %s %s list."), Deleted, ci->name.c_str(), source.command.c_str());
- }
- }
-
- void HandleNumber(unsigned Number)
- {
- if (!Number || Number > ci->GetAccessCount())
- return;
-
- ChanAccess *access = ci->GetAccess(Number - 1);
-
- if (this->type != XOPChanAccess::DetermineLevel(access))
- return;
-
- ++Deleted;
- if (!Nicks.empty())
- Nicks += ", " + access->mask;
- else
- Nicks = access->mask;
-
- FOREACH_MOD(I_OnAccessDel, OnAccessDel(ci, source.u, access));
-
- ci->EraseAccess(Number - 1);
- }
-};
-
-class XOPBase : public Command
-{
- private:
- void DoAdd(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> &params, XOPType level)
- {
- User *u = source.u;
-
- Anope::string mask = params.size() > 2 ? params[2] : "";
-
- if (mask.empty())
- {
- this->OnSyntaxError(source, "ADD");
- return;
- }
-
- if (readonly)
- {
- source.Reply(_("Sorry, channel %s list modification is temporarily disabled."), source.command.c_str());
- return;
- }
-
- AccessGroup access = ci->AccessFor(u);
- ChanAccess *highest = access.Highest();
- int u_level = (highest ? XOPChanAccess::DetermineLevel(highest) : 0);
-
- if (((access.HasPriv(CA_FOUNDER) || level >= u_level) || !access.HasPriv(CA_ACCESS_CHANGE)) && !u->HasPriv("chanserv/access/modify"))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- for (unsigned i = 0; i < ci->GetAccessCount(); ++i)
- {
- ChanAccess *a = ci->GetAccess(i);
-
- if (a->mask.equals_ci(mask))
- {
- if (XOPChanAccess::DetermineLevel(a) >= u_level && !u->HasPriv("chanserv/access/modify"))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- ci->EraseAccess(i);
- break;
- }
- }
-
- if (ci->GetAccessCount() >= Config->CSAccessMax)
- {
- source.Reply(_("Sorry, you can only have %d %s entries on a channel."), Config->CSAccessMax, source.command.c_str());
- return;
- }
-
- if (mask.find_first_of("!*@") == Anope::string::npos && findnick(mask) == NULL)
- mask += "!*@*";
-
- service_reference<AccessProvider> provider("access/xop");
- if (!provider)
- return;
- XOPChanAccess *acc = debug_cast<XOPChanAccess *>(provider->Create());
- acc->ci = ci;
- acc->mask = mask;
- acc->creator = u->nick;
- acc->type = level;
- acc->last_seen = 0;
- acc->created = Anope::CurTime;
- ci->AddAccess(acc);
-
- bool override = level >= u_level || !access.HasPriv(CA_ACCESS_CHANGE);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "ADD " << mask << " as level " << level;
-
- FOREACH_MOD(I_OnAccessAdd, OnAccessAdd(ci, u, acc));
- source.Reply(("\002%s\002 added to %s %s list."), acc->mask.c_str(), ci->name.c_str(), source.command.c_str());
- }
-
- void DoDel(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> &params, XOPType level)
- {
- User *u = source.u;
-
- const Anope::string &mask = params.size() > 2 ? params[2] : "";
-
- if (mask.empty())
- {
- this->OnSyntaxError(source, "DEL");
- return;
- }
-
- if (readonly)
- {
- source.Reply(_("Sorry, channel %s list modification is temporarily disabled."), source.command.c_str());
- return;
- }
-
- if (!ci->GetAccessCount())
- {
- source.Reply(_("%s %s list is empty."), ci->name.c_str(), source.command.c_str());
- return;
- }
-
- AccessGroup access = ci->AccessFor(u);
- ChanAccess *highest = access.Highest();
- bool override = false;
- if (!mask.equals_ci(u->Account()->display) && !access.HasPriv(CA_ACCESS_CHANGE) && (!highest || level >= XOPChanAccess::DetermineLevel(highest)))
- {
- if (u->HasPriv("chanserv/access/modify"))
- override = true;
- else
- {
- source.Reply(ACCESS_DENIED);
- 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)
- {
- XOPDelCallback list(source, ci, this, override, level, mask);
- list.Process();
- }
- else
- {
- for (unsigned i = 0; i < ci->GetAccessCount(); ++i)
- {
- ChanAccess *a = ci->GetAccess(i);
-
- if (a->mask.equals_ci(mask) && XOPChanAccess::DetermineLevel(a) == level)
- {
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "DEL " << a->mask;
-
- source.Reply(_("\002%s\002 deleted from %s %s list."), a->mask.c_str(), ci->name.c_str(), source.command.c_str());
-
- FOREACH_MOD(I_OnAccessDel, OnAccessDel(ci, u, a));
- ci->EraseAccess(a);
-
- return;
- }
- }
-
- source.Reply(_("\002%s\002 not found on %s %s list."), mask.c_str(), ci->name.c_str(), source.command.c_str());
- }
- }
-
- void DoList(CommandSource &source, ChannelInfo *ci, const std::vector<Anope::string> &params, XOPType level)
- {
- User *u = source.u;
-
- const Anope::string &nick = params.size() > 2 ? params[2] : "";
-
- AccessGroup access = ci->AccessFor(u);
- bool override = false;
-
- if (!access.HasPriv(CA_ACCESS_LIST))
- {
- if (u->HasCommand("chanserv/access/list"))
- override = true;
- else
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
- }
-
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci);
-
- if (!ci->GetAccessCount())
- {
- source.Reply(_("%s %s list is empty."), ci->name.c_str(), source.command.c_str());
- return;
- }
-
- if (!nick.empty() && nick.find_first_not_of("1234567890,-") == Anope::string::npos)
- {
- XOPListCallback list(source, ci, nick, level, this);
- list.Process();
- }
- else
- {
- bool SentHeader = false;
-
- for (unsigned i = 0, end = ci->GetAccessCount(); i < end; ++i)
- {
- ChanAccess *a = ci->GetAccess(i);
-
- if (XOPChanAccess::DetermineLevel(a) != level)
- continue;
- else if (!nick.empty() && !Anope::Match(a->mask, nick))
- continue;
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("%s list for %s:\n Num Nick"), source.command.c_str(), ci->name.c_str());
- }
-
- XOPListCallback::DoList(source, a, i + 1, level);
- }
-
- if (!SentHeader)
- source.Reply(_("No matching entries on %s %s list."), ci->name.c_str(), source.command.c_str());
- }
-
- return;
- }
-
- void DoClear(CommandSource &source, ChannelInfo *ci, XOPType level)
- {
- User *u = source.u;
-
- if (readonly)
- {
- source.Reply(_("Sorry, channel %s list modification is temporarily disabled."), source.command.c_str());
- return;
- }
-
- if (!ci->GetAccessCount())
- {
- source.Reply(_("%s %s list is empty."), ci->name.c_str(), source.command.c_str());
- return;
- }
-
- if (!ci->HasPriv(u, CA_FOUNDER) && !u->HasPriv("chanserv/access/modify"))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- bool override = !ci->HasPriv(u, CA_FOUNDER);
- Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "CLEAR level " << level;
-
- for (unsigned i = ci->GetAccessCount(); i > 0; --i)
- {
- ChanAccess *access = ci->GetAccess(i - 1);
- if (XOPChanAccess::DetermineLevel(access) == level)
- ci->EraseAccess(i - 1);
- }
-
- FOREACH_MOD(I_OnAccessClear, OnAccessClear(ci, u));
-
- source.Reply(_("Channel %s %s list has been cleared."), ci->name.c_str(), source.command.c_str());
-
- return;
- }
-
- protected:
- void DoXop(CommandSource &source, const std::vector<Anope::string> &params, XOPType level)
- {
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci == NULL)
- {
- source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- const Anope::string &cmd = params[1];
-
- if (cmd.equals_ci("ADD"))
- return this->DoAdd(source, ci, params, level);
- else if (cmd.equals_ci("DEL"))
- return this->DoDel(source, ci, params, level);
- else if (cmd.equals_ci("LIST"))
- return this->DoList(source, ci, params, level);
- else if (cmd.equals_ci("CLEAR"))
- return this->DoClear(source, ci, level);
- else
- this->OnSyntaxError(source, "");
-
- return;
- }
- public:
- XOPBase(Module *modname, const Anope::string &command) : Command(modname, command, 2, 4)
- {
- this->SetSyntax("\037channel\037 ADD \037mask\037");
- this->SetSyntax("\037channel\037 DEL {\037mask\037 | \037entry-num\037 | \037list\037}");
- this->SetSyntax("\037channel\037 LIST [\037mask\037 | \037list\037]");
- this->SetSyntax("\037channel\037 CLEAR");
- }
-
- virtual ~XOPBase()
- {
- }
-
- virtual void Execute(CommandSource &source, const std::vector<Anope::string> &params) = 0;
-
- virtual bool OnHelp(CommandSource &source, const Anope::string &subcommand) = 0;
-};
-
-class CommandCSQOP : public XOPBase
-{
- public:
- CommandCSQOP(Module *creator) : XOPBase(creator, "chanserv/qop")
- {
- this->SetDesc(_("Modify the list of QOP users"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- return this->DoXop(source, params, XOP_QOP);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Maintains the \002QOP\002 (AutoOwner) \002list\002 for a channel. The QOP \n"
- "list gives users the right to be auto-owner on your channel,\n"
- "which gives them almost (or potentially, total) access.\n"
- " \n"
- "The \002QOP ADD\002 command adds the given nickname to the\n"
- "QOP list.\n"
- " \n"
- "The \002QOP DEL\002 command removes the given nick from the\n"
- "QOP list. If a list of entry numbers is given, those\n"
- "entries are deleted. (See the example for LIST below.)\n"
- " \n"
- "The \002QOP LIST\002 command displays the QOP list. If\n"
- "a wildcard mask is given, only those entries matching the\n"
- "mask are displayed. If a list of entry numbers is given,\n"
- "only those entries are shown; for example:\n"
- " \002QOP #channel LIST 2-5,7-9\002\n"
- " Lists QOP entries numbered 2 through 5 and\n"
- " 7 through 9.\n"
- " \n"
- "The \002QOP CLEAR\002 command clears all entries of the\n"
- "QOP list.\n"));
- source.Reply(_(" \n"
- "The \002QOP\002 commands are limited to\n"
- "founders (unless SECUREOPS is off). However, any user on the\n"
- "QOP list may use the \002QOP LIST\002 command.\n"
- " \n"));
- source.Reply(_("This command may have been disabled for your channel, and\n"
- "in that case you need to use the access list. See \n"
- "\002%s%s HELP ACCESS\002 for information about the access list,\n"
- "and \002%s%s HELP SET XOP\002 to know how to toggle between \n"
- "the access list and xOP list systems."),
- Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str(),
- Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str());
- return true;
- }
-};
-
-class CommandCSAOP : public XOPBase
-{
- public:
- CommandCSAOP(Module *creator) : XOPBase(creator, "chanserv/aop")
- {
- this->SetDesc(_("Modify the list of AOP users"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- return this->DoXop(source, params, XOP_AOP);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Maintains the \002AOP\002 (AutoOP) \002list\002 for a channel. The AOP \n"
- "list gives users the right to be auto-opped on your channel,\n"
- "to unban or invite themselves if needed, to have their\n"
- "greet message showed on join, and so on.\n"
- " \n"
- "The \002AOP ADD\002 command adds the given nickname to the\n"
- "AOP list.\n"
- " \n"
- "The \002AOP DEL\002 command removes the given nick from the\n"
- "AOP list. If a list of entry numbers is given, those\n"
- "entries are deleted. (See the example for LIST below.)\n"
- " \n"
- "The \002AOP LIST\002 command displays the AOP list. If\n"
- "a wildcard mask is given, only those entries matching the\n"
- "mask are displayed. If a list of entry numbers is given,\n"
- "only those entries are shown; for example:\n"
- " \002AOP #channel LIST 2-5,7-9\002\n"
- " Lists AOP entries numbered 2 through 5 and\n"
- " 7 through 9.\n"
- " \n"
- "The \002AOP CLEAR\002 command clears all entries of the\n"
- "AOP list.\n"));
- source.Reply(_(" \n"
- "The \002AOP ADD\002 and \002AOP DEL\002 commands are limited to\n"
- "SOPs or above, while the \002AOP CLEAR\002 command can only\n"
- "be used by the channel founder. However, any user on the\n"
- "AOP list may use the \002AOP LIST\002 command.\n"
- " \n"));
- source.Reply(_("This command may have been disabled for your channel, and\n"
- "in that case you need to use the access list. See \n"
- "\002%s%s HELP ACCESS\002 for information about the access list,\n"
- "and \002%s%s HELP SET XOP\002 to know how to toggle between \n"
- "the access list and xOP list systems."),
- Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str(),
- Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str());
- return true;
- }
-};
-
-class CommandCSHOP : public XOPBase
-{
- public:
- CommandCSHOP(Module *creator) : XOPBase(creator, "chanserv/hop")
- {
- this->SetDesc(_("Maintains the HOP (HalfOP) list for a channel"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- return this->DoXop(source, params, XOP_HOP);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Maintains the \002HOP\002 (HalfOP) \002list\002 for a channel. The HOP \n"
- "list gives users the right to be auto-halfopped on your \n"
- "channel.\n"
- " \n"
- "The \002HOP ADD\002 command adds the given nickname to the\n"
- "HOP list.\n"
- " \n"
- "The \002HOP DEL\002 command removes the given nick from the\n"
- "HOP list. If a list of entry numbers is given, those\n"
- "entries are deleted. (See the example for LIST below.)\n"
- " \n"
- "The \002HOP LIST\002 command displays the HOP list. If\n"
- "a wildcard mask is given, only those entries matching the\n"
- "mask are displayed. If a list of entry numbers is given,\n"
- "only those entries are shown; for example:\n"
- " \002HOP #channel LIST 2-5,7-9\002\n"
- " Lists HOP entries numbered 2 through 5 and\n"
- " 7 through 9.\n"
- " \n"
- "The \002HOP CLEAR\002 command clears all entries of the\n"
- "HOP list.\n"));
- source.Reply(_(" \n"
- "The \002HOP ADD\002, \002HOP DEL\002 and \002HOP LIST\002 commands are \n"
- "limited to AOPs or above, while the \002HOP CLEAR\002 command \n"
- "can only be used by the channel founder.\n"
- " \n"));
- source.Reply(_("This command may have been disabled for your channel, and\n"
- "in that case you need to use the access list. See \n"
- "\002%s%s HELP ACCESS\002 for information about the access list,\n"
- "and \002%s%s HELP SET XOP\002 to know how to toggle between \n"
- "the access list and xOP list systems."),
- Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str(),
- Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str());
- return true;
- }
-};
-
-class CommandCSSOP : public XOPBase
-{
- public:
- CommandCSSOP(Module *creator) : XOPBase(creator, "chanserv/sop")
- {
- this->SetDesc(_("Modify the list of SOP users"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- return this->DoXop(source, params, XOP_SOP);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Maintains the \002SOP\002 (SuperOP) \002list\002 for a channel. The SOP \n"
- "list gives users all rights given by the AOP list, and adds\n"
- "those needed to use the AutoKick and the BadWords lists, \n"
- "to send and read channel memos, and so on.\n"
- " \n"
- "The \002SOP ADD\002 command adds the given nickname to the\n"
- "SOP list.\n"
- " \n"
- "The \002SOP DEL\002 command removes the given nick from the\n"
- "SOP list. If a list of entry numbers is given, those\n"
- "entries are deleted. (See the example for LIST below.)\n"
- " \n"
- "The \002SOP LIST\002 command displays the SOP list. If\n"
- "a wildcard mask is given, only those entries matching the\n"
- "mask are displayed. If a list of entry numbers is given,\n"
- "only those entries are shown; for example:\n"
- " \002SOP #channel LIST 2-5,7-9\002\n"
- " Lists AOP entries numbered 2 through 5 and\n"
- " 7 through 9.\n"
- " \n"
- "The \002SOP CLEAR\002 command clears all entries of the\n"
- "SOP list.\n"));
- source.Reply(_(
- " \n"
- "The \002SOP ADD\002, \002SOP DEL\002 and \002SOP CLEAR\002 commands are \n"
- "limited to the channel founder. However, any user on the\n"
- "AOP list may use the \002SOP LIST\002 command.\n"
- " \n"));
- source.Reply(_("This command may have been disabled for your channel, and\n"
- "in that case you need to use the access list. See \n"
- "\002%s%s HELP ACCESS\002 for information about the access list,\n"
- "and \002%s%s HELP SET XOP\002 to know how to toggle between \n"
- "the access list and xOP list systems."),
- Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str(),
- Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str());
- return true;
- }
-};
-
-class CommandCSVOP : public XOPBase
-{
- public:
- CommandCSVOP(Module *creator) : XOPBase(creator, "chanserv/vop")
- {
- this->SetDesc(_("Maintains the VOP (VOicePeople) list for a channel"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- return this->DoXop(source, params, XOP_VOP);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Maintains the \002VOP\002 (VOicePeople) \002list\002 for a channel. \n"
- "The VOP list allows users to be auto-voiced and to voice \n"
- "themselves if they aren't.\n"
- " \n"
- "The \002VOP ADD\002 command adds the given nickname to the\n"
- "VOP list.\n"
- " \n"
- "The \002VOP DEL\002 command removes the given nick from the\n"
- "VOP list. If a list of entry numbers is given, those\n"
- "entries are deleted. (See the example for LIST below.)\n"
- " \n"
- "The \002VOP LIST\002 command displays the VOP list. If\n"
- "a wildcard mask is given, only those entries matching the\n"
- "mask are displayed. If a list of entry numbers is given,\n"
- "only those entries are shown; for example:\n"
- " \002VOP #channel LIST 2-5,7-9\002\n"
- " Lists VOP entries numbered 2 through 5 and\n"
- " 7 through 9.\n"
- " \n"
- "The \002VOP CLEAR\002 command clears all entries of the\n"
- "VOP list.\n"));
- source.Reply(_(
- " \n"
- "The \002VOP ADD\002, \002VOP DEL\002 and \002VOP LIST\002 commands are \n"
- "limited to AOPs or above, while the \002VOP CLEAR\002 command \n"
- "can only be used by the channel founder.\n"
- " \n"));
- source.Reply(_("This command may have been disabled for your channel, and\n"
- "in that case you need to use the access list. See \n"
- "\002%s%s HELP ACCESS\002 for information about the access list,\n"
- "and \002%s%s HELP SET XOP\002 to know how to toggle between \n"
- "the access list and xOP list systems."),
- Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str(),
- Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str());
- return true;
- }
-};
-
-class CSXOP : public Module
-{
- XOPAccessProvider accessprovider;
- CommandCSQOP commandcsqop;
- CommandCSSOP commandcssop;
- CommandCSAOP commandcsaop;
- CommandCSHOP commandcshop;
- CommandCSVOP commandcsvop;
-
- public:
- CSXOP(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- accessprovider(this), commandcsqop(this), commandcssop(this), commandcsaop(this), commandcshop(this), commandcsvop(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&accessprovider);
- ModuleManager::RegisterService(&commandcssop);
- ModuleManager::RegisterService(&commandcsaop);
- ModuleManager::RegisterService(&commandcsqop);
- ModuleManager::RegisterService(&commandcsvop);
- ModuleManager::RegisterService(&commandcshop);
- }
-};
-
-MODULE_INIT(CSXOP)
diff --git a/modules/core/db_mysql.cpp b/modules/core/db_mysql.cpp
deleted file mode 100644
index 4e6a7de4f..000000000
--- a/modules/core/db_mysql.cpp
+++ /dev/null
@@ -1,1566 +0,0 @@
-#include "module.h"
-#include "../extra/sql.h"
-#include "os_session.h"
-
-static Anope::string ToString(const std::vector<Anope::string> &strings)
-{
- Anope::string ret;
-
- for (unsigned i = 0; i < strings.size(); ++i)
- ret += " " + strings[i];
-
- if (!ret.empty())
- ret.erase(ret.begin());
-
- return ret;
-}
-
-static std::vector<Anope::string> MakeVector(const Anope::string &buf)
-{
- Anope::string s;
- spacesepstream sep(buf);
- std::vector<Anope::string> params;
-
- while (sep.GetToken(s))
- {
- if (s[0] == ':')
- {
- s.erase(s.begin());
- if (!s.empty() && !sep.StreamEnd())
- params.push_back(s + " " + sep.GetRemaining());
- else if (!s.empty())
- params.push_back(s);
- }
- else
- params.push_back(s);
- }
-
- return params;
-}
-
-static NickAlias *CurNick = NULL;
-static NickCore *CurCore = NULL;
-static ChannelInfo *CurChannel = NULL;
-static BotInfo *CurBot = NULL;
-
-static void Write(const Anope::string &data);
-static void WriteNickMetadata(const Anope::string &key, const Anope::string &data);
-static void WriteCoreMetadata(const Anope::string &key, const Anope::string &data);
-static void WriteChannelMetadata(const Anope::string &key, const Anope::string &data);
-static void WriteBotMetadata(const Anope::string &key, const Anope::string &data);
-
-class CommandSQLSync : public Command
-{
- public:
- CommandSQLSync(Module *creator) : Command(creator, "SQLSYNC", 0, 0)
- {
- this->SetDesc(_("Import your databases to SQL"));
- this->SetSyntax("");
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params);
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("This command syncs your databases with SQL. You should\n"
- "only have to execute this command once, when you initially\n"
- "import your databases into SQL."));
- return true;
- }
-};
-
-class MySQLInterface : public SQLInterface
-{
- public:
- MySQLInterface(Module *o) : SQLInterface(o) { }
-
- void OnResult(const SQLResult &r);
-
- void OnError(const SQLResult &r);
-};
-
-class DBMySQL;
-static DBMySQL *me;
-class DBMySQL : public Module
-{
- private:
- CommandSQLSync commandsqlsync;
- MySQLInterface sqlinterface;
- service_reference<SQLProvider> SQL;
-
- public:
- service_reference<SessionService> SessionInterface;
- time_t lastwarn;
- bool ro;
-
- void RunQuery(const SQLQuery &query)
- {
- if (SQL)
- {
- if (readonly && this->ro)
- {
- readonly = this->ro = false;
- BotInfo *bi = findbot(Config->OperServ);
- if (bi)
- ircdproto->SendGlobops(bi, "Found SQL again, going out of readonly mode...");
- }
-
- SQL->Run(&sqlinterface, query);
- }
- else
- {
- if (Anope::CurTime - Config->UpdateTimeout > lastwarn)
- {
- BotInfo *bi = findbot(Config->OperServ);
- if (bi)
- ircdproto->SendGlobops(bi, "Unable to locate SQL reference, is m_mysql loaded? Going to readonly...");
- readonly = this->ro = true;
- this->lastwarn = Anope::CurTime;
- }
- }
- }
-
- DBMySQL(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, DATABASE), commandsqlsync(this), sqlinterface(this), SQL("mysql/main"), SessionInterface("session")
- {
- me = this;
-
- this->lastwarn = 0;
- this->ro = false;
-
- Implementation i[] = {
- I_OnLoadDatabase, I_OnServerConnect
- };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
-
- ModuleManager::RegisterService(&commandsqlsync);
-
- if (CurrentUplink)
- OnServerConnect();
- }
-
- void OnServerConnect()
- {
- Implementation i[] = {
- /* Misc */
- I_OnSaveDatabase, I_OnPostCommand,
- /* NickServ */
- I_OnNickAddAccess, I_OnNickEraseAccess, I_OnNickClearAccess,
- I_OnDelCore, I_OnNickForbidden, I_OnNickGroup,
- I_OnNickRegister, I_OnChangeCoreDisplay,
- I_OnNickSuspended, I_OnDelNick,
- /* ChanServ */
- I_OnAccessAdd, I_OnAccessDel, I_OnAccessClear, I_OnLevelChange,
- I_OnChanForbidden, I_OnDelChan, I_OnChanRegistered, I_OnChanSuspend,
- I_OnAkickAdd, I_OnAkickDel, I_OnMLock, I_OnUnMLock,
- /* BotServ */
- I_OnBotCreate, I_OnBotChange, I_OnBotDelete,
- I_OnBotAssign, I_OnBotUnAssign,
- I_OnBadWordAdd, I_OnBadWordDel,
- /* MemoServ */
- I_OnMemoSend, I_OnMemoDel,
- /* OperServ */
- I_OnExceptionAdd, I_OnExceptionDel,
- I_OnAddXLine, I_OnDelXLine,
- /* HostServ */
- I_OnSetVhost, I_OnDeleteVhost
- };
- ModuleManager::Attach(i, this, 40);
- }
-
- EventReturn OnLoadDatabase()
- {
- if (!SQL)
- {
- Log() << "Error, unable to find service reference for SQL, is m_mysql loaded and configured properly?";
- return EVENT_CONTINUE;
- }
-
- SQLQuery query;
-
- query = "SELECT * FROM `anope_ns_core`";
- SQLResult r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- NickCore *nc = new NickCore(r.Get(i, "display"));
- nc->pass = r.Get(i, "pass");
- nc->email = r.Get(i, "email");
- nc->greet = r.Get(i, "greet");
-
- spacesepstream sep(r.Get(i, "flags"));
- Anope::string buf;
- std::vector<Anope::string> flags;
- while (sep.GetToken(buf))
- flags.push_back(buf);
- nc->FromString(flags);
-
- nc->language = r.Get(i, "language");
- nc->memos.memomax = r.Get(i, "memomax").is_number_only() ? convertTo<int16>(r.Get(i, "memomax")) : 20;
- }
-
- query = "SELECT * FROM `anope_ns_access`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- NickCore *nc = findcore(r.Get(i, "display"));
- if (!nc)
- {
- Log() << "MySQL: Got NickCore access entry for nonexistant core " << r.Get(i, "display");
- continue;
- }
-
- nc->AddAccess(r.Get(i, "access"));
- }
-
- query = "SELECT * FROM `anope_ns_core_metadata`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- NickCore *nc = findcore(r.Get(i, "display"));
- if (!nc)
- {
- Log() << "MySQL: Got NickCore access entry for nonexistant core " << r.Get(i, "display");
- continue;
- }
-
- EventReturn MOD_RESULT;;
- std::vector<Anope::string> Params = MakeVector(r.Get(i, "value"));
- FOREACH_RESULT(I_OnDatabaseReadMetadata, OnDatabaseReadMetadata(nc, r.Get(i, "name"), Params));
- }
-
- query = "SELECT * FROM `anope_ns_alias`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- NickCore *nc = findcore(r.Get(i, "display"));
- if (!nc)
- {
- Log() << "MySQL: Got NickAlias for nick " << r.Get(i, "nick") << " with nonexistant core " << r.Get(i, "display");
- continue;
- }
-
- NickAlias *na = new NickAlias(r.Get(i, "nick"), nc);
- na->last_quit = r.Get(i, "last_quit");
- na->last_realname = r.Get(i, "last_realname");
- na->last_usermask = r.Get(i, "last_usermask");
- na->time_registered = r.Get(i, "time_registered").is_pos_number_only() ? convertTo<time_t>(r.Get(i, "time_registered")) : Anope::CurTime;
- na->last_seen = r.Get(i, "last_seen").is_pos_number_only() ? convertTo<time_t>(r.Get(i, "last_seen")) : Anope::CurTime;
-
- spacesepstream sep(r.Get(i, "flags"));
- Anope::string buf;
- std::vector<Anope::string> flags;
- while (sep.GetToken(buf))
- flags.push_back(buf);
-
- na->FromString(flags);
- }
-
- query = "SELECT * FROM `anope_ns_alias_metadata`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- NickAlias *na = findnick(r.Get(i, "nick"));
- if (!na)
- {
- Log() << "MySQL: Got metadata for nonexistant nick " << r.Get(i, "nick");
- continue;
- }
-
- EventReturn MOD_RESULT;
- std::vector<Anope::string> Params = MakeVector(r.Get(i, "value"));
- FOREACH_RESULT(I_OnDatabaseReadMetadata, OnDatabaseReadMetadata(na, na->nick, Params));
- }
-
- query = "SELECT * FROM `anope_hs_core`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- NickAlias *na = findnick(r.Get(i, "nick"));
- if (!na)
- {
- Log() << "MySQL: Got vhost entry for nonexistant nick " << r.Get(i, "nick");
- continue;
- }
-
- time_t creation = r.Get(i, "time").is_pos_number_only() ? convertTo<time_t>(r.Get(i, "time")) : Anope::CurTime;
- na->hostinfo.SetVhost(r.Get(i, "vident"), r.Get(i, "vhost"), r.Get(i, "creator"), creation);
- }
-
- query = "SELECT * FROM `anope_bs_core`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- BotInfo *bi = findbot(r.Get(i, "nick"));
- if (!bi)
- bi = new BotInfo(r.Get(i, "nick"), r.Get(i, "user"), r.Get(i, "host"));
- bi->realname = r.Get(i, "rname");
- bi->created = r.Get(i, "created").is_pos_number_only() ? convertTo<time_t>(r.Get(i, "created")) : Anope::CurTime;
-
- spacesepstream sep(r.Get(i, "flags"));
- Anope::string buf;
- std::vector<Anope::string> flags;
- while (sep.GetToken(buf))
- flags.push_back(buf);
-
- bi->FromString(flags);
- }
-
- query = "SELECT * FROM `anope_bs_info_metadata`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- BotInfo *bi = findbot(r.Get(i, "botname"));
- if (!bi)
- {
- Log() << "MySQL: BotInfo metadata for nonexistant bot " << r.Get(i, "botname");
- continue;
- }
-
- EventReturn MOD_RESULT;
- std::vector<Anope::string> Params = MakeVector(r.Get(i, "value"));
- FOREACH_RESULT(I_OnDatabaseReadMetadata, OnDatabaseReadMetadata(bi, bi->nick, Params));
- }
-
- query = "SELECT * FROM `anope_cs_info`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- NickCore *nc = NULL;
-
- if (!r.Get(i, "founder").empty())
- {
- nc = findcore(r.Get(i, "founder"));
- if (!nc)
- {
- Log() << "MySQL: Channel " << r.Get(i, "name") << " with nonexistant founder " << r.Get(i, "founder");
- continue;
- }
-
- ChannelInfo *ci = new ChannelInfo(r.Get(i, "name"));
- ci->SetFounder(nc);
- if (!r.Get(i, "successor").empty())
- ci->successor = findcore(r.Get(i, "successor"));
- ci->desc = r.Get(i, "descr");
- ci->time_registered = r.Get(i, "time_registered").is_pos_number_only() ? convertTo<time_t>(r.Get(i, "time_registered")) : Anope::CurTime;
- ci->last_used = r.Get(i, "last_used").is_pos_number_only() ? convertTo<time_t>(r.Get(i, "last_used")) : Anope::CurTime;
- ci->last_topic = r.Get(i, "last_topic");
- ci->last_topic_setter = r.Get(i, "last_topic_setter");
- ci->last_topic_time = r.Get(i, "last_topic_time").is_number_only() ? convertTo<int>(r.Get(i, "last_topic_time")) : Anope::CurTime;
- ci->bantype = r.Get(i, "bantype").is_number_only() ? convertTo<int>(r.Get(i, "bantype")) : 2;
- ci->memos.memomax = r.Get(i, "memomax").is_number_only() ? convertTo<int16>(r.Get(i, "memomax")) : 20;
- ci->capsmin = r.Get(i, "capsmin").is_number_only() ? convertTo<int>(r.Get(i, "capsmin")) : 0;
- ci->capspercent = r.Get(i, "capspercent").is_number_only() ? convertTo<int>(r.Get(i, "capspercent")) : 0;
- ci->floodlines = r.Get(i, "floodlines").is_number_only() ? convertTo<int>(r.Get(i, "floodlines")) : 0;
- ci->floodsecs = r.Get(i, "floodsecs").is_number_only() ? convertTo<int>(r.Get(i, "floodsecs")) : 0;
- ci->repeattimes = r.Get(i, "repeattimes").is_number_only() ? convertTo<int>(r.Get(i, "repeattimes")) : 0;
- ci->bi = findbot(r.Get(i, "botnick"));
- if (ci->bi && !r.Get(i, "botflags").empty())
- {
- spacesepstream sep(r.Get(i, "botflags"));
- Anope::string buf;
- std::vector<Anope::string> flags;
- while (sep.GetToken(buf))
- flags.push_back(buf);
-
- ci->botflags.FromString(flags);
- }
-
- if (!r.Get(i, "flags").empty())
- {
- spacesepstream sep(r.Get(i, "flags"));
- Anope::string buf;
- std::vector<Anope::string> flags;
- while (sep.GetToken(buf))
- flags.push_back(buf);
-
- ci->FromString(flags);
- }
- }
- }
-
- query = "SELECT * FROM `anope_cs_ttb`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- ChannelInfo *ci = cs_findchan(r.Get(i, "channel"));
- if (!ci)
- {
- Log() << "MySQL: Channel ttb for nonexistant channel " << r.Get(i, "channel");
- continue;
- }
-
- ci->ttb[atoi(r.Get(i, "ttb_id").c_str())] = atoi(r.Get(i, "value").c_str());
- }
-
- query = "SELECT * FROM `anope_bs_badwords`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- ChannelInfo *ci = cs_findchan(r.Get(i, "channel"));
- if (!ci)
- {
- Log() << "MySQL: Channel badwords entry for nonexistant channel " << r.Get(i, "channel");
- continue;
- }
-
- BadWordType BWTYPE = BW_ANY;
- if (r.Get(i, "type").equals_cs("SINGLE"))
- BWTYPE = BW_SINGLE;
- else if (r.Get(i, "type").equals_cs("START"))
- BWTYPE = BW_START;
- else if (r.Get(i, "type").equals_cs("END"))
- BWTYPE = BW_END;
- ci->AddBadWord(r.Get(i, "word"), BWTYPE);
- }
-
- query = "SELECT * FROM `anope_cs_access`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- ChannelInfo *ci = cs_findchan(r.Get(i, "channel"));
- if (!ci)
- {
- Log() << "MySQL: Channel access entry for nonexistant channel " << r.Get(i, "channel");
- continue;
- }
-
- const Anope::string &provider = r.Get(i, "provider"), &data = r.Get(i, "data");
- service_reference<AccessProvider> ap(provider);
- if (!ap)
- {
- Log() << "MySQL: Access entry for " << ci->name << " using nonexistant provider " << provider;
- continue;
- }
-
- ChanAccess *access = ap->Create();
- access->ci = ci;
- access->mask = r.Get(i, "mask");
- access->creator = r.Get(i, "creator");
- access->last_seen = r.Get(i, "last_seen").is_pos_number_only() ? convertTo<time_t>(r.Get(i, "last_seen")) : Anope::CurTime;
- access->created = r.Get(i, "created").is_pos_number_only() ? convertTo<time_t>(r.Get(i, "created")) : Anope::CurTime;
- access->Unserialize(data);
- ci->AddAccess(access);
- }
-
- query = "SELECT * FROM `anope_cs_akick`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- ChannelInfo *ci = cs_findchan(r.Get(i, "channel"));
- if (!ci)
- {
- Log() << "MySQL: Channel access entry for nonexistant channel " << r.Get(i, "channel");
- continue;
- }
-
- NickCore *nc = NULL;
- spacesepstream sep(r.Get(i, "flags"));
- Anope::string flag, mask;
- while (sep.GetToken(flag))
- {
- if (flag.equals_cs("ISNICK"))
- nc = findcore(r.Get(i, "mask"));
-
- AutoKick *ak;
- if (nc)
- ak = ci->AddAkick(r.Get(i, "creator"), nc, r.Get(i, "reason"), atol(r.Get(i, "created").c_str()), atol(r.Get(i, "last_used").c_str()));
- else
- ak = ci->AddAkick(r.Get(i, "creator"), r.Get(i, "mask"), r.Get(i, "reason"), atol(r.Get(i, "created").c_str()), atol(r.Get(i, "last_used").c_str()));
- if (nc)
- ak->SetFlag(AK_ISNICK);
- }
- }
-
- query = "SELECT * FROM `anope_cs_levels`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- ChannelInfo *ci = cs_findchan(r.Get(i, "channel"));
- if (!ci)
- {
- Log() << "MySQL: Channel level entry for nonexistant channel " << r.Get(i, "channel");
- continue;
- }
-
- ci->levels[atoi(r.Get(i, "position").c_str())] = atoi(r.Get(i, "level").c_str());
- }
-
- query = "SELECT * FROM `anope_cs_info_metadata`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- ChannelInfo *ci = cs_findchan(r.Get(i, "channel"));
- if (!ci)
- {
- Log() << "MySQL: Channel metadata for nonexistant channel " << r.Get(i, "channel");
- continue;
- }
-
- EventReturn MOD_RESULT;
- std::vector<Anope::string> Params = MakeVector(r.Get(i, "value"));
- FOREACH_RESULT(I_OnDatabaseReadMetadata, OnDatabaseReadMetadata(ci, ci->name, Params));
- }
-
- query = "SELECT * FROM `anope_cs_mlock`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- ChannelInfo *ci = cs_findchan(r.Get(i, "channel"));
- if (!ci)
- {
- Log() << "MySQL: Channel mlock for nonexistant channel " << r.Get(i, "channel");
- continue;
- }
-
- std::vector<Anope::string> mlocks;
- ci->GetExtRegular("db_mlock", mlocks);
-
- Anope::string modestring = r.Get(i, "status") + " " + r.Get(i, "mode") + " " + r.Get(i, "setter") + " " + r.Get(i, "created") + " " + r.Get(i, "param");
-
- mlocks.push_back(modestring);
-
- ci->Extend("db_mlock", new ExtensibleItemRegular<std::vector<Anope::string> >(mlocks));
- }
-
- query = "SELECT * FROM `anope_ms_info`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- MemoInfo *mi = NULL;
- if (r.Get(i, "serv").equals_cs("NICK"))
- {
- NickCore *nc = findcore(r.Get(i, "receiver"));
- if (nc)
- mi = &nc->memos;
- }
- else if (r.Get(i, "serv").equals_cs("CHAN"))
- {
- ChannelInfo *ci = cs_findchan(r.Get(i, "receiver"));
- if (ci)
- mi = &ci->memos;
- }
- if (mi)
- {
- Memo *m = new Memo();
- mi->memos.push_back(m);
- m->sender = r.Get(i, "sender");
- m->time = r.Get(i, "time").is_pos_number_only() ? convertTo<time_t>(r.Get(i, "time")) : Anope::CurTime;
- m->text = r.Get(i, "text");
-
- if (!r.Get(i, "flags").empty())
- {
- spacesepstream sep(r.Get(i, "flags"));
- Anope::string buf;
- std::vector<Anope::string> flags;
- while (sep.GetToken(buf))
- flags.push_back(buf);
-
- m->FromString(flags);
- }
- }
- }
-
- for (std::list<XLineManager *>::iterator it = XLineManager::XLineManagers.begin(), it_end = XLineManager::XLineManagers.end(); it != it_end; ++it)
- {
- XLineManager *xm = *it;
-
- query = "SELECT * FROM `anope_os_xlines` WHERE `type` = @type";
- query.setValue("type", Anope::string(xm->Type()));
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- Anope::string user = r.Get(i, "user");
- Anope::string host = r.Get(i, "host");
- Anope::string by = r.Get(i, "xby");
- Anope::string reason = r.Get(i, "reason");
- time_t seton = r.Get(i, "seton").is_pos_number_only() ? convertTo<time_t>(r.Get(i, "seton")) : Anope::CurTime;
- time_t expires = r.Get(i, "expires").is_pos_number_only() ? convertTo<time_t>(r.Get(i, "expires")) : Anope::CurTime;
-
- XLine *x = xm->Add(user + "@" + host, by, expires, reason);
- if (x)
- x->Created = seton;
- }
- }
-
- query = "SELECT * FROM `anope_os_exceptions`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- Anope::string mask = r.Get(i, "mask");
- unsigned limit = convertTo<unsigned>(r.Get(i, "slimit"));
- Anope::string creator = r.Get(i, "who");
- Anope::string reason = r.Get(i, "reason");
- time_t expires = convertTo<time_t>(r.Get(i, "expires"));
-
- if (SessionInterface)
- {
- Exception *e = new Exception();
- e->mask = mask;
- e->limit = limit;
- e->who = creator;
- e->reason = reason;
- e->time = expires;
- SessionInterface->AddException(e);
- }
- }
-
- query = "SELECT * FROM `anope_extra`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- std::vector<Anope::string> params = MakeVector(r.Get(i, "data"));
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnDatabaseRead, OnDatabaseRead(params));
- }
-
- query = "SELECT * FROM `anope_ns_core_metadata`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- NickCore *nc = findcore(r.Get(i, "nick"));
- if (!nc)
- continue;
- if (r.Get(i, "name") == "MEMO_IGNORE")
- nc->memos.ignores.push_back(r.Get(i, "value").ci_str());
- }
-
- query = "SELECT * FROM `anope_cs_info_metadata`";
- r = SQL->RunQuery(query);
- for (int i = 0; i < r.Rows(); ++i)
- {
- ChannelInfo *ci = cs_findchan(r.Get(i, "channel"));
- if (!ci)
- continue;
- if (r.Get(i, "name") == "MEMO_IGNORE")
- ci->memos.ignores.push_back(r.Get(i, "value").ci_str());
- }
-
- return EVENT_STOP;
- }
-
- EventReturn OnSaveDatabase()
- {
- SQLQuery query;
-
- query = "TRUNCATE TABLE `anope_os_core`";
- this->RunQuery(query);
-
- query = "INSERT INTO `anope_os_core` (maxusercnt, maxusertime, akills_count, snlines_count, sqlines_count, szlines_count) VALUES(@maxusercnt, @maxusertime, @akills_count, @snlines_count, @sqlines_count, @szlines_count)";
- query.setValue("maxusercnt", maxusercnt);
- query.setValue("maxusertime", maxusertime);
- this->RunQuery(query);
-
- for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it)
- {
- CurCore = it->second;
- FOREACH_MOD(I_OnDatabaseWriteMetadata, OnDatabaseWriteMetadata(WriteCoreMetadata, CurCore));
- }
-
- for (nickalias_map::const_iterator it = NickAliasList.begin(), it_end = NickAliasList.end(); it != it_end; ++it)
- {
- CurNick = it->second;
- FOREACH_MOD(I_OnDatabaseWriteMetadata, OnDatabaseWriteMetadata(WriteNickMetadata, CurNick));
- }
-
- for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it)
- {
- CurChannel = it->second;
- FOREACH_MOD(I_OnDatabaseWriteMetadata, OnDatabaseWriteMetadata(WriteChannelMetadata, CurChannel));
- }
-
- for (Anope::insensitive_map<BotInfo *>::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it)
- {
- if (it->second->HasFlag(BI_CONF))
- continue;
-
- CurBot = it->second;
- FOREACH_MOD(I_OnDatabaseWriteMetadata, OnDatabaseWriteMetadata(WriteBotMetadata, CurBot));
-
- query = "INSERT INTO `anope_bs_core` (nick, user, host, rname, flags, created, chancount) VALUES(@nick, @user, @host, @rname, @flags, @created, @chancount) ON DUPLICATE KEY UPDATE nick=VALUES(nick), user=VALUES(user), host=VALUES(host), rname=VALUES(rname), flags=VALUES(flags), created=VALUES(created), chancount=VALUES(chancount)";
- query.setValue("nick", CurBot->nick);
- query.setValue("user", CurBot->GetIdent());
- query.setValue("host", CurBot->host);
- query.setValue("rname", CurBot->realname);
- query.setValue("flags", ToString(CurBot->ToString()));
- query.setValue("created", CurBot->created);
- query.setValue("chancount", CurBot->chancount);
- this->RunQuery(query);
- }
-
- query = "TRUNCATE TABLE `anope_extra`";
- this->RunQuery(query);
- FOREACH_MOD(I_OnDatabaseWrite, OnDatabaseWrite(Write));
-
- return EVENT_CONTINUE;
- }
-
- void OnPostCommand(CommandSource &source, Command *command, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- if (command->name.find("nickserv/set/") == 0 || command->name.find("nickserv/saset/") == 0)
- {
- NickAlias *na = findnick(command->name.find("nickserv/set/") == 0 ? source.u->nick : params[1]);
- if (!na)
- return;
-
- if (command->name == "nickserv/set/password" || command->name == "nickserv/saset/password")
- {
- SQLQuery query("UPDATE `anope_ns_core` SET `pass` = @pass WHERE `display` = @display");
- query.setValue("pass", na->nc->pass);
- query.setValue("display", na->nc->display);
- this->RunQuery(query);
- }
- else if (command->name == "nickserv/set/language" || command->name == "nickserv/saset/language")
- {
- SQLQuery query("UPDATE `anope_ns_core` SET `language` = @language WHERE `display` = @display");
- query.setValue("language", na->nc->language);
- query.setValue("display", na->nc->display);
- this->RunQuery(query);
- }
- else if (command->name == "nickserv/set/email" || command->name == "nickserv/saset/email")
- {
- SQLQuery query("UPDATE `anope_ns_core` SET `email` = @email WHERE `display` = @display");
- query.setValue("email", na->nc->email);
- query.setValue("display", na->nc->display);
- this->RunQuery(query);
- }
- else if (command->name == "nickserv/set/greet" || command->name == "nickserv/saset/greet")
- {
- SQLQuery query("UPDATE `anope_ns_core` SET `greet` = @greet WHERE `display` = @display");
- query.setValue("greet", na->nc->greet);
- query.setValue("display", na->nc->display);
- this->RunQuery(query);
- }
- else
- {
- SQLQuery query("UPDATE `anope_ns_core` SET `flags` = @flags WHERE `display` = @display");
- query.setValue("flags", ToString(na->nc->ToString()));
- query.setValue("display", na->nc->display);
- this->RunQuery(query);
- }
- }
- else if (command->name.find("chanserv/set") == 0 || command->name.find("chanserv/saset") == 0)
- {
- ChannelInfo *ci = params.size() > 0 ? cs_findchan(params[0]) : NULL;
- if (!ci)
- return;
-
- if (command->name == "chanserv/set/founder" || command->name == "chanserv/saset/founder")
- {
- SQLQuery query("UPDATE `anope_cs_info` SET `founder` = @founder WHERE `name` = @name");
- query.setValue("founder", ci->GetFounder() ? ci->GetFounder()->display : "");
- query.setValue("name", ci->name);
- this->RunQuery(query);
- }
- else if (command->name == "chanserv/set/successor" || command->name == "chanserv/saset/successor")
- {
- SQLQuery query("UPDATE `anope_cs_info` SET `successor` = @successor WHERE `name` = @name");
- query.setValue("successor", ci->successor ? ci->successor->display : "");
- query.setValue("name", ci->name);
- this->RunQuery(query);
- }
- else if (command->name == "chanserv/set/desc" || command->name == "chanserv/saset/desc")
- {
- SQLQuery query("UPDATE `anope_cs_info` SET `descr` = @descr WHERE `name` = @name");
- query.setValue("descr", ci->desc);
- query.setValue("name", ci->name);
- this->RunQuery(query);
- }
- else if (command->name == "chanserv/set/bantype" || command->name == "chanserv/saset/bantype")
- {
- SQLQuery query("UPDATE `anope_cs_info` SET `bantype` = @bantype WHERE `name` = @name");
- query.setValue("bantype", ci->bantype);
- query.setValue("name", ci->name);
- this->RunQuery(query);
- }
- else
- {
- SQLQuery query("UPDATE `anope_cs_info` SET `flags` = @flags WHERE `name` = @name");
- query.setValue("flags", ToString(ci->ToString()));
- query.setValue("name", ci->name);
- this->RunQuery(query);
- }
- }
- else if (command->name == "botserv/kick" && params.size() > 2)
- {
- ChannelInfo *ci = cs_findchan(params[0]);
- if (!ci)
- return;
- if (!ci->HasPriv(u, CA_SET) && !u->HasPriv("botserv/administration"))
- return;
- if (params[1].equals_ci("BADWORDS") || params[1].equals_ci("BOLDS") || params[1].equals_ci("CAPS") || params[1].equals_ci("COLORS") || params[1].equals_ci("FLOOD") || params[1].equals_ci("REPEAT") || params[1].equals_ci("REVERSES") || params[1].equals_ci("UNDERLINES"))
- {
- if (params[2].equals_ci("ON") || params[2].equals_ci("OFF"))
- {
- for (int i = 0; i < TTB_SIZE; ++i)
- {
- SQLQuery query("INSERT INTO `anope_cs_ttb` (channel, ttb_id, value) VALUES(@channel, @ttb_id, @value) ON DUPLICATE KEY UPDATE channel=VALUES(channel), ttb_id=VALUES(ttb_id), value=VALUES(value)");
- query.setValue("channel", ci->name);
- query.setValue("ttb_id", i);
- query.setValue("value", ci->ttb[i]);
- this->RunQuery(query);
- }
-
- {
- SQLQuery query("UPDATE `anope_cs_info` SET `botflags` = @botflags WHERE `name` = @name");
- query.setValue("botflags", ToString(ci->botflags.ToString()));
- query.setValue("name", ci->name);
- this->RunQuery(query);
- }
-
- if (params[1].equals_ci("CAPS"))
- {
- SQLQuery query("UPDATE `anope_cs_info` SET `capsmin` = @capsmin, `capspercent` = @capspercent WHERE `name` = @name");
- query.setValue("capsmin", ci->capsmin);
- query.setValue("capspercent", ci->capspercent);
- query.setValue("name", ci->name);
- this->RunQuery(query);
- }
- else if (params[1].equals_ci("FLOOD"))
- {
- SQLQuery query("UPDATE `anope_cs_info` SET `floodlines` = @floodlines, `floodsecs` = @floodsecs WHERE `name` = @name");
- query.setValue("floodlines", ci->floodlines);
- query.setValue("floodsecs", ci->floodsecs);
- query.setValue("name", ci->name);
- this->RunQuery(query);
- }
- else if (params[1].equals_ci("REPEAT"))
- {
- SQLQuery query("UPDATE `anope_cs_info` SET `repeattimes` = @ WHERE `name` = @");
- query.setValue("repeattimes", ci->repeattimes);
- query.setValue("name", ci->name);
- this->RunQuery(query);
- }
- }
- }
- }
- else if (command->name == "botserv/set" && params.size() > 1)
- {
- ChannelInfo *ci = cs_findchan(params[0]);
- if (ci && !ci->HasPriv(u, CA_SET) && !u->HasPriv("botserv/administration"))
- return;
- BotInfo *bi = NULL;
- if (!ci)
- bi = findbot(params[0]);
- if (bi && params[1].equals_ci("PRIVATE") && u->HasPriv("botserv/set/private"))
- {
- SQLQuery query("UPDATE `anope_bs_core` SET `flags` = @ WHERE `nick` = @");
- query.setValue("flags", ToString(bi->ToString()));
- query.setValue("nick", bi->nick);
- this->RunQuery(query);
- }
- else if (!ci)
- return;
- else if (params[1].equals_ci("DONTKICKOPS") || params[1].equals_ci("DONTKICKVOICES") || params[1].equals_ci("FANTASY") || params[1].equals_ci("GREET") || params[1].equals_ci("SYMBIOSIS") || params[1].equals_ci("NOBOT"))
- {
- SQLQuery query("UPDATE `anope_cs_info` SET `botflags` = @ WHERE `name` = @");
- query.setValue("botflags", ToString(ci->botflags.ToString()));
- query.setValue("name", ci->name);
- this->RunQuery(query);
- }
- }
- else if (command->name == "memoserv/ignore" && params.size() > 0)
- {
- Anope::string target = params[0];
- NickCore *nc = NULL;
- ChannelInfo *ci = NULL;
- if (target[0] != '#')
- {
- target = u->nick;
- nc = u->Account();
- if (!nc)
- return;
- }
- else
- {
- ci = cs_findchan(target);
- if (!ci || !ci->HasPriv(u, CA_MEMO))
- return;
- }
-
- MemoInfo *mi = ci ? &ci->memos : &nc->memos;
- Anope::string table = ci ? "anope_cs_info_metadata" : "anope_ns_core_metadata";
- Anope::string ename = ci ? "channel" : "nick";
-
- SQLQuery query("DELETE FROM `" + table + "` WHERE `" + ename + "` = @target AND `name` = 'MEMO_IGNORE'");
- query.setValue("target", target);
- this->RunQuery(query);
-
- query = "INSERT INTO `" + table + "` VALUES(" + ename + ", name, value) (@target, 'MEMO_IGNORE, @ignore)";
- query.setValue("target", target);
- for (unsigned j = 0; j < mi->ignores.size(); ++j)
- {
- query.setValue("ignore", mi->ignores[j]);
- this->RunQuery(query);
- }
- }
- }
-
- void OnNickAddAccess(NickCore *nc, const Anope::string &entry)
- {
- SQLQuery query("INSERT INTO `anope_ns_access` (display, access) VALUES(@display, @access)");
- query.setValue("display", nc->display);
- query.setValue("access", entry);
- this->RunQuery(query);
- }
-
- void OnNickEraseAccess(NickCore *nc, const Anope::string &entry)
- {
- SQLQuery query("DELETE FROM `anope_ns_access` WHERE `display` = @display AND `access` = @access");
- query.setValue("display", nc->display);
- query.setValue("access", entry);
- this->RunQuery(query);
- }
-
- void OnNickClearAccess(NickCore *nc)
- {
- SQLQuery query("DELETE FROM `anope_ns_access` WHERE `display` = @display");
- query.setValue("display", nc->display);
- this->RunQuery(query);
- }
-
- void OnDelCore(NickCore *nc)
- {
- SQLQuery query("DELETE FROM `anope_ns_core` WHERE `display` = @display");
- query.setValue("display", nc->display);
- this->RunQuery(query);
- }
-
- void OnNickForbidden(NickAlias *na)
- {
- SQLQuery query("UPDATE `anope_ns_alias` SET `flags` = @flags WHERE `nick` = @nick");
- query.setValue("flags", ToString(na->ToString()));
- query.setValue("nick", na->nick);
- this->RunQuery(query);
- }
-
- void OnNickGroup(User *u, NickAlias *)
- {
- OnNickRegister(findnick(u->nick));
- }
-
- void InsertAlias(NickAlias *na)
- {
- SQLQuery query("INSERT INTO `anope_ns_alias` (nick, last_quit, last_realname, last_usermask, time_registered, last_seen, flags, display) VALUES(@nick, @last_quit, @last_realname, @last_usermask, @time_registered, @last_seen, @flags, @display) ON DUPLICATE KEY UPDATE last_quit=VALUES(last_quit), last_realname=VALUES(last_realname), last_usermask=VALUES(last_usermask), time_registered=VALUES(time_registered), last_seen=VALUES(last_seen), flags=VALUES(flags), display=VALUES(display)");
- query.setValue("nick", na->nick);
- query.setValue("last_quit", na->last_quit);
- query.setValue("last_realname", na->last_realname);
- query.setValue("last_usermask", na->last_usermask);
- query.setValue("time_registered", na->time_registered);
- query.setValue("last_seen", na->last_seen);
- query.setValue("flags", ToString(na->ToString()));
- query.setValue("display", na->nc->display);
- this->RunQuery(query);
- }
-
- void InsertCore(NickCore *nc)
- {
- SQLQuery query("INSERT INTO `anope_ns_core` (display, pass, email, greet, flags, language, memomax) VALUES(@display, @pass, @email, @greet, @flags, @language, @memomax) ON DUPLICATE KEY UPDATE pass=VALUES(pass), email=VALUES(email), greet=VALUES(greet), flags=VALUES(flags), language=VALUES(language), memomax=VALUES(memomax)");
- query.setValue("display", nc->display);
- query.setValue("pass", nc->pass);
- query.setValue("email", nc->email);
- query.setValue("greet", nc->greet);
- query.setValue("flags", ToString(nc->ToString()));
- query.setValue("language", nc->language);
- query.setValue("memomax", nc->memos.memomax);
- this->RunQuery(query);
- }
-
- void OnNickRegister(NickAlias *na)
- {
- this->InsertCore(na->nc);
- this->InsertAlias(na);
- }
-
- void OnChangeCoreDisplay(NickCore *nc, const Anope::string &newdisplay)
- {
- SQLQuery query("UPDATE `anope_ns_core` SET `display` = @newdisplay WHERE `display` = @olddisplay");
- query.setValue("newdisplay", newdisplay);
- query.setValue("olddisplay", nc->display);
- this->RunQuery(query);
- }
-
- void OnNickSuspend(NickAlias *na)
- {
- SQLQuery query("UPDATE `anope_ns_core` SET `flags` = @flags WHERE `display` = @display");
- query.setValue("flags", ToString(na->nc->ToString()));
- query.setValue("display", na->nc->display);
- this->RunQuery(query);
- }
-
- void OnDelNick(NickAlias *na)
- {
- SQLQuery query("DELETE FROM `anope_ns_alias` WHERE `nick` = @nick");
- query.setValue("nick", na->nick);
- this->RunQuery(query);
- }
-
- void OnAccessAdd(ChannelInfo *ci, User *, ChanAccess *access)
- {
- SQLQuery query("INSERT INTO `anope_cs_access` (provider, data, mask, channel, last_seen, creator) VALUES (@provider, @data, @mask, @channel, @last_seen, @creator) ON DUPLICATE KEY UPDATE level=VALUES(level), display=VALUES(display), channel=VALUES(channel), last_seen=VALUES(last_seen), creator=VALUES(creator)");
- query.setValue("provider", access->provider->name);
- query.setValue("data", access->Serialize());
- query.setValue("mask", access->mask);
- query.setValue("channel", ci->name);
- query.setValue("last_seen", access->last_seen);
- query.setValue("creator", access->creator);
- this->RunQuery(query);
- }
-
- void OnAccessDel(ChannelInfo *ci, User *u, ChanAccess *access)
- {
- SQLQuery query("DELETE FROM `anope_cs_access` WHERE `mask` = @mask AND `channel` = @channel");
- query.setValue("mask", access->mask);
- query.setValue("channel", ci->name);
- this->RunQuery(query);
- }
-
- void OnAccessClear(ChannelInfo *ci, User *u)
- {
- SQLQuery query("DELETE FROM `anope_cs_access` WHERE `channel` = @channel");
- query.setValue("channel", ci->name);
- this->RunQuery(query);
- }
-
- void OnLevelChange(User *u, ChannelInfo *ci, int pos, int what)
- {
- SQLQuery query("UPDATE `anope_cs_levels` SET `level` = @level WHERE `channel` = @channel AND `position` = @pos ON DUPLICATE KEY UPDATE level=VALUES(level), position=VALUES(position)");
- if (pos >= 0)
- {
- query.setValue("level", what);
- query.setValue("channel", ci->name);
- query.setValue("pos", pos);
- this->RunQuery(query);
- }
- else
- {
- query.setValue("channel", ci->name);
- for (int i = 0; i < CA_SIZE; ++i)
- {
- query.setValue("level", ci->levels[i]);
- query.setValue("pos", i);
- this->RunQuery(query);
- }
- }
- }
-
- void OnChanForbidden(ChannelInfo *ci)
- {
- SQLQuery query("INSERT INTO `anope_cs_info` (name, time_registered, last_used, flags) VALUES (@name, @time_registered, @last_used, @flags)");
- query.setValue("name", ci->name);
- query.setValue("time_registered", ci->time_registered);
- query.setValue("last_used", ci->last_used);
- query.setValue("flags", ToString(ci->ToString()));
- this->RunQuery(query);
- }
-
- void OnDelChan(ChannelInfo *ci)
- {
- SQLQuery query("DELETE FROM `anope_cs_info` WHERE `name` = @name");
- query.setValue("name", ci->name);
- this->RunQuery(query);
- }
-
- void OnChanRegistered(ChannelInfo *ci)
- {
- SQLQuery query("INSERT INTO `anope_cs_info` (name, founder, successor, descr, time_registered, last_used, last_topic, last_topic_setter, last_topic_time, flags, bantype, memomax, botnick, botflags, capsmin, capspercent, floodlines, floodsecs, repeattimes) VALUES(@name, @founder, @successor, @descr, @time_registered, @last_used, @last_topic_text, @last_topic_setter, @last_topic_time, @flags, @bantype, @memomax, @botnick, @botflags, @capsmin, @capspercent, @floodlines, @floodsecs, @repeattimes) ON DUPLICATE KEY UPDATE founder=VALUES(founder), successor=VALUES(successor), descr=VALUES(descr), time_registered=VALUES(time_registered), last_used=VALUES(last_used), last_topic=VALUES(last_topic), last_topic_setter=VALUES(last_topic_setter), last_topic_time=VALUES(last_topic_time), flags=VALUES(flags), bantype=VALUES(bantype), memomax=VALUES(memomax), botnick=VALUES(botnick), botflags=VALUES(botflags), capsmin=VALUES(capsmin), capspercent=VALUES(capspercent), floodlines=VALUES(floodlines), floodsecs=VALUES(floodsecs), repeattimes=VALUES(repeattimes)");
- query.setValue("name", ci->name);
- query.setValue("founder", ci->GetFounder() ? ci->GetFounder()->display : "");
- query.setValue("successor", ci->successor ? ci->successor->display : "");
- query.setValue("descr", ci->desc);
- query.setValue("time_registered", ci->time_registered);
- query.setValue("last_used", ci->last_used);
- query.setValue("last_topic_text", ci->last_topic);
- query.setValue("last_topic_setter", ci->last_topic_setter);
- query.setValue("last_topic_time", ci->last_topic_time);
- query.setValue("flags", ToString(ci->ToString()));
- query.setValue("bantype", ci->bantype);
- query.setValue("memomax", ci->memos.memomax);
- query.setValue("botnick", ci->bi ? ci->bi->nick : "");
- query.setValue("botflags", ToString(ci->botflags.ToString()));
- query.setValue("capsmin", ci->capsmin);
- query.setValue("capspercent", ci->capspercent);
- query.setValue("floodlines", ci->floodlines);
- query.setValue("floodsecs", ci->floodsecs);
- query.setValue("repeattimes", ci->repeattimes);
- this->RunQuery(query);
-
- query = "DELETE from `anope_cs_mlock` WHERE `channel` = @name";
- query.setValue("name", ci->name);
- this->RunQuery(query);
- for (std::multimap<ChannelModeName, ModeLock>::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it)
- {
- const ModeLock &ml = it->second;
- ChannelMode *cm = ModeManager::FindChannelModeByName(ml.name);
-
- if (cm != NULL)
- {
- query = "INSERT INTO `anope_cs_mlock` (channel, mode, status, setter, created, param) VALUES(@channel, @mode, @status, @setter, @created, @param)";
- query.setValue("channel", ci->name);
- query.setValue("mode", cm->NameAsString());
- query.setValue("status", ml.set ? 1 : 0);
- query.setValue("setter", ml.setter);
- query.setValue("created", ml.created);
- query.setValue("param", ml.param);
- this->RunQuery(query);
- }
- }
- }
-
- void OnChanSuspend(ChannelInfo *ci)
- {
- SQLQuery query("UPDATE `anope_cs_info` SET `flags` = @flags WHERE `name` = @name");
- query.setValue("flags", ToString(ci->ToString()));
- query.setValue("name", ci->name);
- this->RunQuery(query);
- }
-
- void OnAkickAdd(ChannelInfo *ci, AutoKick *ak)
- {
- SQLQuery query("INSERT INTO `anope_cs_akick` (channel, flags, mask, reason, creator, created, last_used) VALUES(@channel, @flags, @mask, @reason, @creator, @created, @last_used)");
- query.setValue("channel", ci->name);
- query.setValue("flags", ak->HasFlag(AK_ISNICK) ? "ISNICK" : "");
- query.setValue("mask", ak->HasFlag(AK_ISNICK) ? ak->nc->display : ak->mask);
- query.setValue("reason", ak->reason);
- query.setValue("creator", ak->creator);
- query.setValue("created", ak->addtime);
- query.setValue("last_used", ak->last_used);
- this->RunQuery(query);
- }
-
- void OnAkickDel(ChannelInfo *ci, AutoKick *ak)
- {
- SQLQuery query("DELETE FROM `anope_cs_akick` WHERE `channel`= @mask AND `mask` = @mask");
- query.setValue("channel", ci->name);
- query.setValue("mask", ak->HasFlag(AK_ISNICK) ? ak->nc->display : ak->mask);
- this->RunQuery(query);
- }
-
- EventReturn OnMLock(ChannelInfo *ci, ModeLock *lock)
- {
- ChannelMode *cm = ModeManager::FindChannelModeByName(lock->name);
- if (cm != NULL)
- {
- SQLQuery query("INSERT INTO `anope_cs_mlock` (channel, mode, status, setter, created, param) VALUES(@channel, @mode, @status, @setter, @created, @param)");
- query.setValue("channel", ci->name);
- query.setValue("mode", cm->NameAsString());
- query.setValue("status", lock->set ? 1 : 0);
- query.setValue("setter", lock->setter);
- query.setValue("created", lock->created);
- query.setValue("param", lock->param);
- this->RunQuery(query);
- }
- return EVENT_CONTINUE;
- }
-
- EventReturn OnUnMLock(ChannelInfo *ci, ChannelMode *mode, const Anope::string &param)
- {
- ChannelMode *cm = ModeManager::FindChannelModeByName(mode->Name);
- if (cm != NULL)
- {
- SQLQuery query("DELETE FROM `anope_cs_mlock` WHERE `channel` = @channel AND `mode` = @mode AND `param` = @param");
- query.setValue("channel", ci->name);
- query.setValue("mode", mode->NameAsString());
- query.setValue("param", param);
- this->RunQuery(query);
- }
- return EVENT_CONTINUE;
- }
-
- void OnBotCreate(BotInfo *bi)
- {
- SQLQuery query("INSERT INTO `anope_bs_core` (nick, user, host, rname, flags, created, chancount) VALUES(@nick, @user, @host, @rname, @flags, @created, @chancuont) ON DUPLICATE KEY UPDATE nick=VALUES(nick), user=VALUES(user), host=VALUES(host), rname=VALUES(rname), flags=VALUES(flags), created=VALUES(created), chancount=VALUES(chancount)");
- query.setValue("nick", bi->nick);
- query.setValue("user", bi->GetIdent());
- query.setValue("host", bi->host);
- query.setValue("rname", bi->realname);
- query.setValue("flags", ToString(bi->ToString()));
- query.setValue("created", bi->created);
- query.setValue("chancount", bi->chancount);
- this->RunQuery(query);
- }
-
- void OnBotChange(BotInfo *bi)
- {
- OnBotCreate(bi);
- }
-
- void OnBotDelete(BotInfo *bi)
- {
- SQLQuery query("UPDATE `anope_cs_info` SET `botnick` = '' WHERE `botnick` = @botnick");
- query.setValue("botnick", bi->nick);
- this->RunQuery(query);
- }
-
- EventReturn OnBotAssign(User *sender, ChannelInfo *ci, BotInfo *bi)
- {
- SQLQuery query("UPDATE `anope_cs_info` SET `botnick` = @botnick WHERE `name` = @channel");
- query.setValue("botnick", bi->nick);
- query.setValue("channel", ci->name);
- this->RunQuery(query);
- return EVENT_CONTINUE;
- }
-
- EventReturn OnBotUnAssign(User *sender, ChannelInfo *ci)
- {
- SQLQuery query("UPDATE `anope_cs_info` SET `botnick` = '' WHERE `name` = @channel");
- query.setValue("channel", ci->name);
- this->RunQuery(query);
- return EVENT_CONTINUE;
- }
-
- void OnBadWordAdd(ChannelInfo *ci, BadWord *bw)
- {
- SQLQuery query("INSERT INTO `anope_bs_badwords` (channel, word, type) VALUES(@channel, @word, @type) ON DUPLICATE KEY UPDATE channel=VALUES(channel), word=VALUES(word), type=VALUES(type)");
- query.setValue("channel", ci->name);
- query.setValue("word", bw->word);
- switch (bw->type)
- {
- case BW_SINGLE:
- query.setValue("type", "SINGLE");
- break;
- case BW_START:
- query.setValue("type", "START");
- break;
- case BW_END:
- query.setValue("type", "END");
- break;
- default:
- query.setValue("type", "ANY");
- }
- this->RunQuery(query);
- }
-
- void OnBadWordDel(ChannelInfo *ci, BadWord *bw)
- {
- SQLQuery query("DELETE FROM `anope_bs_badwords` WHERE `channel` = @channel AND `word` = @word AND `type` = @type");
- query.setValue("channel", ci->name);
- query.setValue("word", bw->word);
- switch (bw->type)
- {
- case BW_SINGLE:
- query.setValue("type", "SINGLE");
- break;
- case BW_START:
- query.setValue("type", "START");
- break;
- case BW_END:
- query.setValue("type", "END");
- break;
- default:
- query.setValue("type", "ANY");
- }
- this->RunQuery(query);
- }
-
- void OnMemoSend(const Anope::string &source, const Anope::string &target, MemoInfo *mi, Memo *m)
- {
- const Anope::string &mtype = (!target.empty() && target[0] == '#' ? "CHAN" : "NICK");
- SQLQuery query("INSERT INTO `anope_ms_info` (receiver, flags, time, sender, text, serv) VALUES(@receiver, @flags, @time, @sender, @text, @serv)");
- query.setValue("receiver", target);
- query.setValue("flags", ToString(m->ToString()));
- query.setValue("time", m->time);
- query.setValue("sender", source);
- query.setValue("text", m->text);
- query.setValue("serv", mtype);
- this->RunQuery(query);
- }
-
- void OnMemoDel(const NickCore *nc, MemoInfo *mi, Memo *m)
- {
- SQLQuery query;
-
- if (m)
- {
- query = "DELETE FROM `anope_ms_info` WHERE `receiver` = @receiver AND `time` = @time";
- query.setValue("receiver", nc->display);
- query.setValue("time", m->time);
- }
- else
- {
- query = "DELETE FROM `anope_ms_info` WHERE `receiver` = @receiver";
- query.setValue("receiver", nc->display);
- }
-
- this->RunQuery(query);
- }
-
- void OnMemoDel(ChannelInfo *ci, MemoInfo *mi, Memo *m)
- {
- SQLQuery query;
-
- if (m)
- {
- query = "DELETE FROM `anope_ms_info` WHERE `receiver` = @receiver AND `time` = @time";
- query.setValue("receiver", ci->name);
- query.setValue("time", m->time);
- }
- else
- {
- query = "DELETE FROM `anope_ms_info` WHERE `receiver` = @receiver";
- query.setValue("receiver", ci->name);
- }
-
- this->RunQuery(query);
- }
-
- EventReturn OnExceptionAdd(Exception *ex)
- {
- SQLQuery query("INSERT INTO `anope_os_exceptions` (mask, slimit, who, reason, time, expires) VALUES(@mask, @slimit, @who, @reason, @time, @expires)");
- query.setValue("mask", ex->mask);
- query.setValue("slimit", ex->limit);
- query.setValue("who", ex->who);
- query.setValue("reason", ex->reason);
- query.setValue("time", ex->time);
- query.setValue("expires", ex->expires);
- return EVENT_CONTINUE;
- }
-
- void OnExceptionDel(User *, Exception *ex)
- {
- SQLQuery query("DELETE FROM `anope_os_exceptions` WHERE `mask` = @mask");
- query.setValue("mask", ex->mask);
- this->RunQuery(query);
- }
-
- EventReturn OnAddXLine(XLine *x, XLineManager *xlm)
- {
- SQLQuery query("INSERT INTO `anope_os_xlines` (type, mask, xby, reason, seton, expire) VALUES(@type, @mask, @xby, @reason, @seton, @expire)");
- query.setValue("type", Anope::string(xlm->Type()));
- query.setValue("mask", x->Mask);
- query.setValue("xby", x->By);
- query.setValue("reason", x->Reason);
- query.setValue("seton", x->Created);
- query.setValue("expire", x->Expires);
- this->RunQuery(query);
- return EVENT_CONTINUE;
- }
-
- void OnDelXLine(User *, XLine *x, XLineManager *xlm)
- {
- SQLQuery query;
-
- if (x)
- {
- query = "DELETE FROM `anope_os_xlines` WHERE `mask` = @mask AND `type` = @type";
- query.setValue("mask", x->Mask);
- query.setValue("type", Anope::string(xlm->Type()));
- }
- else
- {
- query = "DELETE FROM `anope_os_xlines` WHERE `type` = @type";
- query.setValue("type", Anope::string(xlm->Type()));
- }
-
- this->RunQuery(query);
- }
-
- void OnDeleteVhost(NickAlias *na)
- {
- SQLQuery query("DELETE FROM `anope_hs_core` WHERE `nick` = @nick");
- query.setValue("nick", na->nick);
- this->RunQuery(query);
- }
-
- void OnSetVhost(NickAlias *na)
- {
- SQLQuery query("INSERT INTO `anope_hs_core` (nick, vident, vhost, creator, time) VALUES(@nick, @vident, @vhost, @creator, @time)");
- query.setValue("nick", na->nick);
- query.setValue("vident", na->hostinfo.GetIdent());
- query.setValue("vhost", na->hostinfo.GetHost());
- query.setValue("creator", na->hostinfo.GetCreator());
- query.setValue("time", na->hostinfo.GetTime());
- this->RunQuery(query);
- }
-};
-
-void MySQLInterface::OnResult(const SQLResult &r)
-{
- Log(LOG_DEBUG) << "MySQL successfully executed query: " << r.finished_query;
-}
-
-void MySQLInterface::OnError(const SQLResult &r)
-{
- if (!r.GetQuery().query.empty())
- Log(LOG_DEBUG) << "Error executing query " << r.finished_query << ": " << r.GetError();
- else
- Log(LOG_DEBUG) << "Error executing query: " << r.GetError();
-}
-
-
-static void Write(const Anope::string &data)
-{
- SQLQuery query("INSERT INTO `anope_extra` (data) VALUES(@data)");
- query.setValue("data", data);
- me->RunQuery(data);
-}
-
-static void WriteNickMetadata(const Anope::string &key, const Anope::string &data)
-{
- if (!CurNick)
- throw CoreException("WriteNickMetadata without a nick to write");
-
- SQLQuery query("INSERT INTO `anope_ns_alias_metadata` (nick, name, value) VALUES(@nick, @name, @value)");
- query.setValue("nick", CurNick->nick);
- query.setValue("name", key);
- query.setValue("value", data);
- me->RunQuery(query);
-}
-
-static void WriteCoreMetadata(const Anope::string &key, const Anope::string &data)
-{
- if (!CurCore)
- throw CoreException("WritCoreMetadata without a core to write");
-
- SQLQuery query("INSERT INTO `anope_ns_core_metadata` (nick, name, value) VALUES(@nick, @name, @value)");
- query.setValue("nick", CurCore->display);
- query.setValue("name", key);
- query.setValue("value", data);
- me->RunQuery(query);
-}
-
-static void WriteChannelMetadata(const Anope::string &key, const Anope::string &data)
-{
- if (!CurChannel)
- throw CoreException("WriteChannelMetadata without a channel to write");
-
- SQLQuery query("INSERT INTO `anope_cs_info_metadata` (channel, name, value) VALUES(@channel, @name, @value)");
- query.setValue("channel", CurChannel->name);
- query.setValue("name", key);
- query.setValue("value", data);
- me->RunQuery(query);
-}
-
-static void WriteBotMetadata(const Anope::string &key, const Anope::string &data)
-{
- if (!CurBot)
- throw CoreException("WriteBotMetadata without a bot to write");
-
- SQLQuery query("INSERT INTO `anope_bs_info_metadata` (botname, name, value) VALUES(@botname, @name, @value)");
- query.setValue("botname", CurBot->nick);
- query.setValue("name", key);
- query.setValue("value", data);
- me->RunQuery(query);
-}
-
-static void SaveDatabases()
-{
- SQLQuery query;
-
- query = "TRUNCATE TABLE `anope_ns_core`";
- me->RunQuery(query);
-
- query = "TRUNCATE TABLE `anope_ms_info`";
- me->RunQuery(query);
-
- query = "TRUNCATE TABLE `anope_ns_alias`";
- me->RunQuery(query);
-
- for (nickcore_map::const_iterator nit = NickCoreList.begin(), nit_end = NickCoreList.end(); nit != nit_end; ++nit)
- {
- NickCore *nc = nit->second;
-
- me->InsertCore(nc);
-
- for (std::list<NickAlias *>::iterator it = nc->aliases.begin(), it_end = nc->aliases.end(); it != it_end; ++it)
- {
- me->InsertAlias(*it);
- if ((*it)->hostinfo.HasVhost())
- me->OnSetVhost(*it);
- }
-
- for (std::vector<Anope::string>::iterator it = nc->access.begin(), it_end = nc->access.end(); it != it_end; ++it)
- {
- query = "INSERT INTO `anope_ns_access` (display, access) VALUES(@display, @access)";
- query.setValue("display", nc->display);
- query.setValue("access", *it);
- me->RunQuery(query);
- }
-
- for (unsigned j = 0, end = nc->memos.memos.size(); j < end; ++j)
- {
- Memo *m = nc->memos.memos[j];
-
- me->OnMemoSend(m->sender, nc->display, &nc->memos, m);
- }
- }
-
- query = "TRUNCATE TABLE `anope_bs_core`";
- me->RunQuery(query);
-
- for (Anope::insensitive_map<BotInfo *>::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it)
- me->OnBotCreate(it->second);
-
- query = "TRUNCATE TABLE `anope_cs_info`";
- me->RunQuery(query);
-
- query = "TRUNCATE TABLE `anope_bs_badwords`";
- me->RunQuery(query);
-
- query = "TRUNCATE TABLE `anope_cs_access`";
- me->RunQuery(query);
-
- query = "TRUNCATE TABLE `anope_cs_akick`";
- me->RunQuery(query);
-
- query = "TRUNCATE TABLE `anope_cs_levels`";
- me->RunQuery(query);
-
- for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it)
- {
- ChannelInfo *ci = it->second;
-
- me->OnChanRegistered(ci);
-
- for (unsigned j = 0, end = ci->GetBadWordCount(); j < end; ++j)
- {
- BadWord *bw = ci->GetBadWord(j);
-
- me->OnBadWordAdd(ci, bw);
- }
-
- for (unsigned j = 0, end = ci->GetAccessCount(); j < end; ++j)
- {
- ChanAccess *access = ci->GetAccess(j);
-
- me->OnAccessAdd(ci, NULL, access);
- }
-
- for (unsigned j = 0, end = ci->GetAkickCount(); j < end; ++j)
- {
- AutoKick *ak = ci->GetAkick(j);
-
- me->OnAkickAdd(ci, ak);
- }
-
- for (int k = 0; k < CA_SIZE; ++k)
- me->OnLevelChange(NULL, ci, -1, -1);
-
- for (unsigned j = 0, end = ci->memos.memos.size(); j < end; ++j)
- {
- Memo *m = ci->memos.memos[j];
-
- me->OnMemoSend(m->sender, ci->name, &ci->memos, m);
- }
- }
-
- for (std::list<XLineManager *>::iterator it = XLineManager::XLineManagers.begin(), it_end = XLineManager::XLineManagers.end(); it != it_end; ++it)
- for (unsigned i = 0, end = (*it)->GetCount(); i < end; ++i)
- me->OnAddXLine((*it)->GetEntry(i), *it);
-
- if (me->SessionInterface)
- for (SessionService::ExceptionVector::iterator it = me->SessionInterface->GetExceptions().begin(); it != me->SessionInterface->GetExceptions().end(); ++it)
- me->OnExceptionAdd(*it);
-}
-
-void CommandSQLSync::Execute(CommandSource &source, const std::vector<Anope::string> &params)
-{
- SaveDatabases();
- source.Reply(_("Updating MySQL."));
- return;
-}
-
-MODULE_INIT(DBMySQL)
-
diff --git a/modules/core/db_mysql_live.cpp b/modules/core/db_mysql_live.cpp
deleted file mode 100644
index ecfdc70d1..000000000
--- a/modules/core/db_mysql_live.cpp
+++ /dev/null
@@ -1,287 +0,0 @@
-#include "module.h"
-#include "../extra/async_commands.h"
-#include "../extra/sql.h"
-
-class SQLCache : public Timer
-{
- typedef std::map<Anope::string, time_t, std::less<ci::string> > cache_map;
- cache_map cache;
- public:
-
- SQLCache() : Timer(300, Anope::CurTime, true) { }
-
- bool Check(const Anope::string &item)
- {
- cache_map::iterator it = this->cache.find(item);
- if (it != this->cache.end() && Anope::CurTime - it->second < 5)
- return true;
-
- this->cache[item] = Anope::CurTime;
- return false;
- }
-
- void Tick(time_t)
- {
- for (cache_map::iterator it = this->cache.begin(), next_it; it != this->cache.end(); it = next_it)
- {
- next_it = it;
- ++next_it;
-
- if (Anope::CurTime - it->second > 5)
- this->cache.erase(it);
- }
- }
-};
-
-static void ChanInfoUpdate(const SQLResult &res)
-{
- try
- {
- ChannelInfo *ci = cs_findchan(res.Get(0, "name"));
- if (!ci)
- ci = new ChannelInfo(res.Get(0, "name"));
- ci->SetFounder(findcore(res.Get(0, "founder")));
- ci->successor = findcore(res.Get(0, "successor"));
- ci->desc = res.Get(0, "descr");
- ci->time_registered = convertTo<time_t>(res.Get(0, "time_registered"));
- ci->ClearFlags();
- ci->FromString(BuildStringVector(res.Get(0, "flags")));
- ci->bantype = convertTo<int>(res.Get(0, "bantype"));
- ci->memos.memomax = convertTo<unsigned>(res.Get(0, "memomax"));
-
- if (res.Get(0, "botnick").equals_cs(ci->bi ? ci->bi->nick : "") == false)
- {
- if (ci->bi)
- ci->bi->UnAssign(NULL, ci);
- BotInfo *bi = findbot(res.Get(0, "botnick"));
- if (bi)
- bi->Assign(NULL, ci);
- }
-
- ci->capsmin = convertTo<int16>(res.Get(0, "capsmin"));
- ci->capspercent = convertTo<int16>(res.Get(0, "capspercent"));
- ci->floodlines = convertTo<int16>(res.Get(0, "floodlines"));
- ci->floodsecs = convertTo<int16>(res.Get(0, "floodsecs"));
- ci->repeattimes = convertTo<int16>(res.Get(0, "repeattimes"));
-
- if (ci->c)
- check_modes(ci->c);
- }
- catch (const SQLException &ex)
- {
- Log(LOG_DEBUG) << ex.GetReason();
- }
- catch (const ConvertException &) { }
-}
-
-static void NickInfoUpdate(const SQLResult &res)
-{
- try
- {
- NickCore *nc = findcore(res.Get(0, "display"));
- if (!nc)
- return;
- NickAlias *na = findnick(res.Get(0, "nick"));
- if (!na)
- na = new NickAlias(res.Get(0, "nick"), nc);
-
- na->last_quit = res.Get(0, "last_quit");
- na->last_realname = res.Get(0, "last_realname");
- na->last_usermask = res.Get(0, "last_usermask");
- na->time_registered = convertTo<time_t>(res.Get(0, "time_registered"));
- na->last_seen = convertTo<time_t>(res.Get(0, "last_seen"));
- na->ClearFlags();
- na->FromString(BuildStringVector(res.Get(0, "flags")));
-
- if (na->nc != nc)
- {
- std::list<NickAlias *>::iterator it = std::find(na->nc->aliases.begin(), na->nc->aliases.end(), na);
- if (it != na->nc->aliases.end())
- na->nc->aliases.erase(it);
-
- na->nc = nc;
- na->nc->aliases.push_back(na);
- }
- }
- catch (const SQLException &ex)
- {
- Log(LOG_DEBUG) << ex.GetReason();
- }
- catch (const ConvertException &) { }
-}
-
-static void NickCoreUpdate(const SQLResult &res)
-{
- try
- {
- NickCore *nc = findcore(res.Get(0, "display"));
- if (!nc)
- nc = new NickCore(res.Get(0, "display"));
-
- nc->pass = res.Get(0, "pass");
- nc->email = res.Get(0, "email");
- nc->greet = res.Get(0, "greet");
- nc->ClearFlags();
- nc->FromString(BuildStringVector(res.Get(0, "flags")));
- nc->language = res.Get(0, "language");
- }
- catch (const SQLException &ex)
- {
- Log(LOG_DEBUG) << ex.GetReason();
- }
- catch (const ConvertException &) { }
-}
-
-class MySQLLiveModule : public Module
-{
- service_reference<SQLProvider> SQL;
- service_reference<AsynchCommandsService> ACS;
-
- SQLCache chan_cache, nick_cache, core_cache;
-
- SQLResult RunQuery(const SQLQuery &query)
- {
- if (!this->SQL)
- throw SQLException("Unable to locate SQL reference, is m_mysql loaded and configured correctly?");
-
- SQLResult res = SQL->RunQuery(query);
- if (!res.GetError().empty())
- throw SQLException(res.GetError());
- return res;
- }
-
- CommandMutex *CurrentCommand()
- {
- if (this->ACS)
- return this->ACS->CurrentCommand();
- return NULL;
- }
-
- public:
- MySQLLiveModule(const Anope::string &modname, const Anope::string &creator) :
- Module(modname, creator, DATABASE), SQL("mysql/main"), ACS("asynch_commands")
- {
- Implementation i[] = { I_OnFindChan, I_OnFindNick, I_OnFindCore, I_OnShutdown };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
- }
-
- void OnShutdown()
- {
- Implementation i[] = { I_OnFindChan, I_OnFindNick, I_OnFindCore };
- for (size_t j = 0; j < 3; ++j)
- ModuleManager::Detach(i[j], this);
- }
-
- void OnFindChan(const Anope::string &chname)
- {
- if (chan_cache.Check(chname))
- return;
-
- try
- {
- SQLQuery query("SELECT * FROM `anope_cs_info` WHERE `name` = @name");
- query.setValue("name", chname);
- CommandMutex *current_command = this->CurrentCommand();
- if (current_command)
- {
- current_command->Unlock();
- try
- {
- SQLResult res = this->RunQuery(query);
- current_command->Lock();
- ChanInfoUpdate(res);
- }
- catch (const SQLException &)
- {
- current_command->Lock();
- throw;
- }
- }
- else
- {
- SQLResult res = this->RunQuery(query);
- ChanInfoUpdate(res);
- }
- }
- catch (const SQLException &ex)
- {
- Log(LOG_DEBUG) << "OnFindChan: " << ex.GetReason();
- }
- }
-
- void OnFindNick(const Anope::string &nick)
- {
- if (nick_cache.Check(nick))
- return;
-
- try
- {
- SQLQuery query("SELECT * FROM `anope_ns_alias` WHERE `nick` = @nick");
- query.setValue("nick", nick);
- CommandMutex *current_command = this->CurrentCommand();
- if (current_command)
- {
- current_command->Unlock();
- try
- {
- SQLResult res = this->RunQuery(query);
- current_command->Lock();
- NickInfoUpdate(res);
- }
- catch (const SQLException &)
- {
- current_command->Lock();
- throw;
- }
- }
- else
- {
- SQLResult res = this->RunQuery(query);
- NickInfoUpdate(res);
- }
- }
- catch (const SQLException &ex)
- {
- Log(LOG_DEBUG) << "OnFindNick: " << ex.GetReason();
- }
- }
-
- void OnFindCore(const Anope::string &nick)
- {
- if (core_cache.Check(nick))
- return;
-
- try
- {
- SQLQuery query("SELECT * FROM `anope_ns_core` WHERE `display` = @display");
- query.setValue("display", nick);
- CommandMutex *current_command = this->CurrentCommand();
- if (current_command)
- {
- current_command->Unlock();
- try
- {
- SQLResult res = this->RunQuery(query);
- current_command->Lock();
- NickCoreUpdate(res);
- }
- catch (const SQLException &)
- {
- current_command->Lock();
- throw;
- }
- }
- else
- {
- SQLResult res = this->RunQuery(query);
- NickCoreUpdate(res);
- }
- }
- catch (const SQLException &ex)
- {
- Log(LOG_DEBUG) << "OnFindCore: " << ex.GetReason();
- }
- }
-};
-
-MODULE_INIT(MySQLLiveModule)
diff --git a/modules/core/db_plain.cpp b/modules/core/db_plain.cpp
deleted file mode 100644
index c41cea2d2..000000000
--- a/modules/core/db_plain.cpp
+++ /dev/null
@@ -1,908 +0,0 @@
-/*
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-#include "os_session.h"
-
-Anope::string DatabaseFile;
-std::stringstream db_buffer;
-service_reference<SessionService> SessionInterface("session");
-
-/** Enum used for what METADATA type we are reading
- */
-enum MDType
-{
- MD_NONE,
- MD_NC,
- MD_NA,
- MD_BI,
- MD_CH
-};
-
-/* Character for newlines, in my research I have concluded it is significantly faster
- * to use \n instead of std::endl because std::endl also flushes the buffer, which
- * is not necessary here
- */
-static const char endl = '\n';
-
-/** Read from the database and call the events
- * @param m If specified it only calls the read events for the specific module
- */
-static void ReadDatabase(Module *m = NULL)
-{
- EventReturn MOD_RESULT;
- MDType Type = MD_NONE;
-
- std::fstream db;
- db.open(DatabaseFile.c_str(), std::ios_base::in);
-
- if (!db.is_open())
- {
- Log() << "Unable to open " << DatabaseFile << " for reading!";
- return;
- }
-
- NickCore *nc = NULL;
- NickAlias *na = NULL;
- BotInfo *bi = NULL;
- ChannelInfo *ci = NULL;
-
- Anope::string buf;
- while (std::getline(db, buf.str()))
- {
- if (buf.empty())
- continue;
-
- spacesepstream sep(buf);
- std::vector<Anope::string> params;
- while (sep.GetToken(buf))
- {
- if (buf[0] == ':')
- {
- buf.erase(buf.begin());
- if (!buf.empty() && !sep.StreamEnd())
- params.push_back(buf + " " + sep.GetRemaining());
- else if (!sep.StreamEnd())
- params.push_back(sep.GetRemaining());
- else if (!buf.empty())
- params.push_back(buf);
- break;
- }
- else
- params.push_back(buf);
- }
-
- if (m)
- MOD_RESULT = m->OnDatabaseRead(params);
- else
- FOREACH_RESULT(I_OnDatabaseRead, OnDatabaseRead(params));
- if (MOD_RESULT == EVENT_STOP)
- continue;
-
- if (!params.empty())
- {
- if (params[0].equals_ci("NC"))
- {
- nc = findcore(params[1]);
- Type = MD_NC;
- }
- else if (params[0].equals_ci("NA"))
- {
- na = findnick(params[2]);
- Type = MD_NA;
- }
- else if (params[0].equals_ci("BI"))
- {
- bi = findbot(params[1]);
- Type = MD_BI;
- }
- else if (params[0].equals_ci("CH"))
- {
- ci = cs_findchan(params[1]);
- Type = MD_CH;
- }
- else if (params[0].equals_ci("MD"))
- {
- Anope::string key = params[1];
- params.erase(params.begin());
- params.erase(params.begin());
-
- if (Type == MD_NC && nc)
- {
- try
- {
- if (m)
- m->OnDatabaseReadMetadata(nc, key, params);
- else
- FOREACH_RESULT(I_OnDatabaseReadMetadata, OnDatabaseReadMetadata(nc, key, params));
- }
- catch (const DatabaseException &ex)
- {
- Log() << "[db_plain]: " << ex.GetReason();
- }
- }
- else if (Type == MD_NA && na)
- {
- try
- {
- if (m)
- m->OnDatabaseReadMetadata(na, key, params);
- else
- FOREACH_RESULT(I_OnDatabaseReadMetadata, OnDatabaseReadMetadata(na, key, params));
- }
- catch (const DatabaseException &ex)
- {
- Log() << "[db_plain]: " << ex.GetReason();
- }
- }
- else if (Type == MD_BI && bi)
- {
- try
- {
- if (m)
- m->OnDatabaseReadMetadata(bi, key, params);
- else
- FOREACH_RESULT(I_OnDatabaseReadMetadata, OnDatabaseReadMetadata(bi, key, params));
- }
- catch (const DatabaseException &ex)
- {
- Log() << "[db_plain]: " << ex.GetReason();
- }
- }
- else if (Type == MD_CH && ci)
- {
- try
- {
- if (m)
- m->OnDatabaseReadMetadata(ci, key, params);
- else
- FOREACH_RESULT(I_OnDatabaseReadMetadata, OnDatabaseReadMetadata(ci, key, params));
- }
- catch (const DatabaseException &ex)
- {
- Log() << "[db_plain]: " << ex.GetReason();
- }
- }
- }
- }
- }
-
- db.close();
-}
-
-struct ChannelLevel
-{
- ChannelAccess Level;
- Anope::string Name;
-};
-
-ChannelLevel ChannelLevels[] = {
- { CA_ACCESS_LIST, "ACCESS_LIST" },
- { CA_NOKICK, "NOKICK" },
- { CA_FANTASIA, "FANTASIA" },
- { CA_GREET, "GREET" },
- { CA_AUTOVOICE, "AUTOVOICE" },
- { CA_VOICEME, "VOICEME" },
- { CA_VOICE, "VOICE" },
- { CA_INFO, "INFO" },
- { CA_SAY, "SAY" },
- { CA_AUTOHALFOP, "AUTOHALFOP" },
- { CA_HALFOPME, "HALFOPME" },
- { CA_HALFOP, "HALFOP" },
- { CA_KICK, "KICK" },
- { CA_SIGNKICK, "SIGNKICK" },
- { CA_BAN, "BAN" },
- { CA_TOPIC, "TOPIC" },
- { CA_MODE, "MODE" },
- { CA_GETKEY, "GETKEY" },
- { CA_INVITE, "INVITE" },
- { CA_UNBAN, "UNBAN" },
- { CA_AUTOOP, "AUTOOP" },
- { CA_OPDEOPME, "OPDEOPME" },
- { CA_OPDEOP, "OPDEOP" },
- { CA_AUTOPROTECT, "AUTOPROTECT" },
- { CA_AKICK, "AKICK" },
- { CA_BADWORDS, "BADWORDS" },
- { CA_ASSIGN, "ASSIGN" },
- { CA_MEMO, "MEMO" },
- { CA_ACCESS_CHANGE, "ACCESS_CHANGE" },
- { CA_PROTECTME, "PROTECTME" },
- { CA_PROTECT, "PROTECT" },
- { CA_SET, "SET" },
- { CA_AUTOOWNER, "AUTOPROTECT" },
- { CA_OWNERME, "OWNERME" },
- { CA_OWNER, "OWNER" },
- { CA_FOUNDER, "FOUNDER" },
- { CA_SIZE, "" }
-};
-
-static Anope::string ToString(const std::vector<Anope::string> &strings)
-{
- Anope::string ret;
-
- for (unsigned i = 0; i < strings.size(); ++i)
- ret += " " + strings[i];
-
- if (!ret.empty())
- ret.erase(ret.begin());
-
- return ret;
-}
-
-static void LoadNickCore(const std::vector<Anope::string> &params)
-{
- NickCore *nc = new NickCore(params[0]);
- /* Clear default flags */
- nc->ClearFlags();
-
- nc->pass = params.size() > 1 ? params[1] : "";
-
- Log(LOG_DEBUG_2) << "[db_plain]: Loaded NickCore " << nc->display;
-}
-
-static void LoadNickAlias(const std::vector<Anope::string> &params)
-{
- NickCore *nc = findcore(params[0]);
- if (!nc)
- {
- Log() << "[db_plain]: Unable to find core " << params[0];
- return;
- }
-
- NickAlias *na = new NickAlias(params[1], nc);
-
- na->time_registered = params[2].is_pos_number_only() ? convertTo<time_t>(params[2]) : 0;
-
- na->last_seen = params[3].is_pos_number_only() ? convertTo<time_t>(params[3]) : 0;
-
- Log(LOG_DEBUG_2) << "[db_plain}: Loaded nickalias for " << na->nick;
-}
-
-static void LoadBotInfo(const std::vector<Anope::string> &params)
-{
- BotInfo *bi = findbot(params[0]);
- if (!bi)
- bi = new BotInfo(params[0], params[1], params[2]);
-
- bi->created = params[3].is_pos_number_only() ? convertTo<time_t>(params[3]) : 0;
- bi->chancount = params[4].is_pos_number_only() ? convertTo<uint32>(params[4]) : 0;
- bi->realname = params[5];
-
- Log(LOG_DEBUG_2) << "[db_plain]: Loaded botinfo for " << bi->nick;
-}
-
-static void LoadChanInfo(const std::vector<Anope::string> &params)
-{
- ChannelInfo *ci = new ChannelInfo(params[0]);
- /* CLear default mlock */
- ci->ClearMLock();
- /* Remove default channel flags */
- ci->ClearFlags();
- ci->botflags.ClearFlags();
-
- ci->time_registered = params[1].is_pos_number_only() ? convertTo<time_t>(params[1]) : 0;
-
- ci->last_used = params[2].is_pos_number_only() ? convertTo<time_t>(params[2]) : 0;
-
- Log(LOG_DEBUG_2) << "[db_plain]: loaded channel " << ci->name;
-}
-
-static void LoadOperInfo(const std::vector<Anope::string> &params)
-{
- if (params[0].equals_ci("STATS"))
- {
- maxusercnt = params[1].is_pos_number_only() ? convertTo<uint32>(params[1]) : 0;
- maxusertime = params[2].is_pos_number_only() ? convertTo<time_t>(params[2]) : 0;
- }
- else if (params[0].equals_ci("SXLINE"))
- {
- char type = params[1][0];
- for (std::list<XLineManager *>::iterator it = XLineManager::XLineManagers.begin(), it_end = XLineManager::XLineManagers.end(); it != it_end; ++it)
- {
- XLineManager *xl = *it;
- if (xl->Type() == type)
- {
- Anope::string mask = params[2];
- Anope::string by = params[3];
- time_t seton = params[4].is_pos_number_only() ? convertTo<time_t>(params[4]) : 0;
- time_t expires = params[5].is_pos_number_only() ? convertTo<time_t>(params[5]) : 0;
- Anope::string reason = params[6];
-
- XLine *x = xl->Add(mask, by, expires, reason);
- if (x)
- x->Created = seton;
- break;
- }
- }
- }
- else if (params[0].equals_ci("EXCEPTION") && SessionInterface)
- {
- Exception *exception = new Exception();
- exception->mask = params[1];
- exception->limit = params[2].is_pos_number_only() ? convertTo<int>(params[2]) : 1;
- exception->who = params[3];
- exception->time = params[4].is_pos_number_only() ? convertTo<time_t>(params[4]) : 0;
- exception->expires = params[5].is_pos_number_only() ? convertTo<time_t>(params[5]) : 0;
- exception->reason = params[6];
- SessionInterface->AddException(exception);
- }
-}
-
-void Write(const Anope::string &buf)
-{
- db_buffer << buf << endl;
-}
-
-void WriteMetadata(const Anope::string &key, const Anope::string &data)
-{
- Write("MD " + key + " " + data);
-}
-
-class DBPlain : public Module
-{
- /* Day the last backup was on */
- int LastDay;
- /* Backup file names */
- std::list<Anope::string> Backups;
- public:
- DBPlain(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, DATABASE)
- {
- this->SetAuthor("Anope");
-
- Implementation i[] = { I_OnReload, I_OnDatabaseRead, I_OnLoadDatabase, I_OnDatabaseReadMetadata, I_OnSaveDatabase, I_OnModuleLoad };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
-
- OnReload();
-
- LastDay = 0;
- }
-
- ~DBPlain()
- {
- }
-
- void BackupDatabase()
- {
- /* Do not backup a database that doesn't exist */
- if (!IsFile(DatabaseFile))
- return;
-
- time_t now = Anope::CurTime;
- tm *tm = localtime(&now);
-
- if (tm->tm_mday != LastDay)
- {
- LastDay = tm->tm_mday;
- Anope::string newname = "backups/" + DatabaseFile + "." + stringify(tm->tm_year) + stringify(tm->tm_mon) + stringify(tm->tm_mday);
-
- /* Backup already exists */
- if (IsFile(newname))
- return;
-
- Log(LOG_DEBUG) << "db_plain: Attemping to rename " << DatabaseFile << " to " << newname;
- if (rename(DatabaseFile.c_str(), newname.c_str()))
- {
- Log() << "Unable to back up database!";
-
- if (!Config->NoBackupOkay)
- quitting = true;
-
- return;
- }
-
- Backups.push_back(newname);
-
- unsigned KeepBackups = Config->KeepBackups;
- if (KeepBackups && Backups.size() > KeepBackups)
- {
- DeleteFile(Backups.front().c_str());
- Backups.pop_front();
- }
- }
- }
-
- void OnReload()
- {
- ConfigReader config;
- DatabaseFile = config.ReadValue("db_plain", "database", "anope.db", 0);
- }
-
- EventReturn OnDatabaseRead(const std::vector<Anope::string> &params)
- {
- Anope::string key = params[0];
- std::vector<Anope::string> otherparams = params;
- otherparams.erase(otherparams.begin());
-
- if (key.equals_ci("NC"))
- LoadNickCore(otherparams);
- else if (key.equals_ci("NA"))
- LoadNickAlias(otherparams);
- else if (key.equals_ci("BI"))
- LoadBotInfo(otherparams);
- else if (key.equals_ci("CH"))
- LoadChanInfo(otherparams);
- else if (key.equals_ci("OS"))
- LoadOperInfo(otherparams);
-
- return EVENT_CONTINUE;
- }
-
- EventReturn OnLoadDatabase()
- {
- ReadDatabase();
-
- /* No need to ever reload this again, although this should never be trigged again */
- ModuleManager::Detach(I_OnLoadDatabase, this);
- ModuleManager::Detach(I_OnDatabaseReadMetadata, this);
-
- return EVENT_STOP;
- }
-
- EventReturn OnDatabaseReadMetadata(NickCore *nc, const Anope::string &key, const std::vector<Anope::string> &params)
- {
- try
- {
- if (key.equals_ci("LANGUAGE"))
- nc->language = params[0];
- else if (key.equals_ci("MEMOMAX"))
- nc->memos.memomax = params[0].is_pos_number_only() ? convertTo<int16>(params[0]) : -1;
- else if (key.equals_ci("EMAIL"))
- nc->email = params[0];
- else if (key.equals_ci("GREET"))
- nc->greet = params[0];
- else if (key.equals_ci("ACCESS"))
- nc->AddAccess(params[0]);
- else if (key.equals_ci("CERT"))
- nc->AddCert(params[0]);
- else if (key.equals_ci("FLAGS"))
- nc->FromString(params);
- else if (key.equals_ci("MI"))
- {
- Memo *m = new Memo;
- m->time = params[0].is_pos_number_only() ? convertTo<time_t>(params[0]) : 0;
- m->sender = params[1];
- for (unsigned j = 2; params[j].equals_ci("UNREAD") || params[j].equals_ci("RECEIPT"); ++j)
- {
- if (params[j].equals_ci("UNREAD"))
- m->SetFlag(MF_UNREAD);
- else if (params[j].equals_ci("RECEIPT"))
- m->SetFlag(MF_RECEIPT);
- }
- m->text = params[params.size() - 1];
- nc->memos.memos.push_back(m);
- }
- else if (key.equals_ci("MIG"))
- nc->memos.ignores.push_back(params[0].ci_str());
- }
- catch (const ConvertException &ex)
- {
- throw DatabaseException(ex.GetReason());
- }
-
- return EVENT_CONTINUE;
- }
-
- EventReturn OnDatabaseReadMetadata(NickAlias *na, const Anope::string &key, const std::vector<Anope::string> &params)
- {
- if (key.equals_ci("LAST_USERMASK"))
- na->last_usermask = params[0];
- else if (key.equals_ci("LAST_REALNAME"))
- na->last_realname = params[0];
- else if (key.equals_ci("LAST_QUIT"))
- na->last_quit = params[0];
- else if (key.equals_ci("FLAGS"))
- na->FromString(params);
- else if (key.equals_ci("VHOST"))
- na->hostinfo.SetVhost(params.size() > 3 ? params[3] : "", params[2], params[0], params[1].is_pos_number_only() ? convertTo<time_t>(params[1]) : 0);
-
- return EVENT_CONTINUE;
- }
-
- EventReturn OnDatabaseReadMetadata(BotInfo *bi, const Anope::string &key, const std::vector<Anope::string> &params)
- {
- if (key.equals_ci("FLAGS"))
- bi->FromString(params);
-
- return EVENT_CONTINUE;
- }
-
- EventReturn OnDatabaseReadMetadata(ChannelInfo *ci, const Anope::string &key, const std::vector<Anope::string> &params)
- {
- try
- {
- if (key.equals_ci("BANTYPE"))
- ci->bantype = params[0].is_pos_number_only() ? convertTo<int16>(params[0]) : Config->CSDefBantype;
- else if (key.equals_ci("MEMOMAX"))
- ci->memos.memomax = params[0].is_pos_number_only() ? convertTo<int16>(params[0]) : -1;
- else if (key.equals_ci("FOUNDER"))
- ci->SetFounder(findcore(params[0]));
- else if (key.equals_ci("SUCCESSOR"))
- ci->successor = findcore(params[0]);
- else if (key.equals_ci("LEVELS"))
- {
- for (unsigned j = 0, end = params.size(); j < end; j += 2)
- for (int i = 0; ChannelLevels[i].Level != CA_SIZE; ++i)
- if (params[j].equals_ci(ChannelLevels[i].Name))
- ci->levels[ChannelLevels[i].Level] = params[j + 1].is_number_only() ? convertTo<int16>(params[j + 1]) : 0;
- }
- else if (key.equals_ci("FLAGS"))
- ci->FromString(params);
- else if (key.equals_ci("DESC"))
- ci->desc = params[0];
- else if (key.equals_ci("TOPIC"))
- {
- ci->last_topic_setter = params[0];
- ci->last_topic_time = params[1].is_pos_number_only() ? convertTo<time_t>(params[1]) : 0;
- ci->last_topic = params[2];
- }
- else if (key.equals_ci("SUSPEND"))
- {
- ci->Extend("suspend_by", new ExtensibleItemRegular<Anope::string>(params[0]));
- ci->Extend("suspend_reason", new ExtensibleItemRegular<Anope::string>(params[1]));
- }
- else if (key.equals_ci("ACCESS"))
- {
- service_reference<AccessProvider> provider(params[0]);
- if (!provider)
- throw DatabaseException("Access entry for nonexistant provider " + params[0]);
-
- ChanAccess *access = provider->Create();
- access->ci = ci;
- access->mask = params[1];
- access->Unserialize(params[2]);
- access->last_seen = params[3].is_pos_number_only() ? convertTo<time_t>(params[3]) : 0;
- access->creator = params[4];
- access->created = params.size() > 5 && params[5].is_pos_number_only() ? convertTo<time_t>(params[5]) : Anope::CurTime;
-
- ci->AddAccess(access);
- }
- else if (key.equals_ci("AKICK"))
- {
- // 0 is the old stuck
- bool Nick = params[1].equals_ci("NICK");
- NickCore *nc = NULL;
- if (Nick)
- {
- nc = findcore(params[2]);
- if (!nc)
- throw DatabaseException("Akick for nonexistant core " + params[2] + " on " + ci->name);
- }
-
- AutoKick *ak;
- if (Nick)
- ak = ci->AddAkick(params[3], nc, params.size() > 6 ? params[6] : "", params[4].is_pos_number_only() ? convertTo<time_t>(params[4]) : 0, params[5].is_pos_number_only() ? convertTo<time_t>(params[5]) : 0);
- else
- ak = ci->AddAkick(params[3], params[2], params.size() > 6 ? params[6] : "", params[4].is_pos_number_only() ? convertTo<time_t>(params[4]) : 0, params[5].is_pos_number_only() ? convertTo<time_t>(params[5]) : 0);
- if (Nick)
- ak->SetFlag(AK_ISNICK);
-
- }
- else if (key.equals_ci("MLOCK"))
- {
- std::vector<Anope::string> mlocks;
- ci->GetExtRegular("db_mlock", mlocks);
-
- Anope::string mlock_string = params[0] + " " + params[1] + " " + params[2] + " " + params[3];
- if (params.size() > 4)
- mlock_string += " " + params[4];
-
- mlocks.push_back(mlock_string);
- ci->Extend("db_mlock", new ExtensibleItemRegular<std::vector<Anope::string> >(mlocks));
- }
- else if (key.equals_ci("MI"))
- {
- Memo *m = new Memo;
- m->time = params[0].is_pos_number_only() ? convertTo<time_t>(params[0]) : 0;
- m->sender = params[1];
- for (unsigned j = 2; params[j].equals_ci("UNREAD") || params[j].equals_ci("RECEIPT"); ++j)
- {
- if (params[j].equals_ci("UNREAD"))
- m->SetFlag(MF_UNREAD);
- else if (params[j].equals_ci("RECEIPT"))
- m->SetFlag(MF_RECEIPT);
- }
- m->text = params[params.size() - 1];
- ci->memos.memos.push_back(m);
- }
- else if (key.equals_ci("MIG"))
- ci->memos.ignores.push_back(params[0].ci_str());
- else if (key.equals_ci("BI"))
- {
- if (params[0].equals_ci("NAME"))
- ci->bi = findbot(params[1]);
- else if (params[0].equals_ci("FLAGS"))
- ci->botflags.FromString(params);
- else if (params[0].equals_ci("TTB"))
- {
- for (unsigned j = 1, end = params.size(); j < end; j += 2)
- {
- if (params[j].equals_ci("BOLDS"))
- ci->ttb[0] = params[j + 1].is_pos_number_only() ? convertTo<int16>(params[j + 1]) : 0;
- else if (params[j].equals_ci("COLORS"))
- ci->ttb[1] = params[j + 1].is_pos_number_only() ? convertTo<int16>(params[j + 1]) : 0;
- else if (params[j].equals_ci("REVERSES"))
- ci->ttb[2] = params[j + 1].is_pos_number_only() ? convertTo<int16>(params[j + 1]) : 0;
- else if (params[j].equals_ci("UNDERLINES"))
- ci->ttb[3] = params[j + 1].is_pos_number_only() ? convertTo<int16>(params[j + 1]) : 0;
- else if (params[j].equals_ci("BADWORDS"))
- ci->ttb[4] = params[j + 1].is_pos_number_only() ? convertTo<int16>(params[j + 1]) : 0;
- else if (params[j].equals_ci("CAPS"))
- ci->ttb[5] = params[j + 1].is_pos_number_only() ? convertTo<int16>(params[j + 1]) : 0;
- else if (params[j].equals_ci("FLOOD"))
- ci->ttb[6] = params[j + 1].is_pos_number_only() ? convertTo<int16>(params[j + 1]) : 0;
- else if (params[j].equals_ci("REPEAT"))
- ci->ttb[7] = params[j + 1].is_pos_number_only() ? convertTo<int16>(params[j + 1]) : 0;
- else if (params[j].equals_ci("ITALICS"))
- ci->ttb[8] = params[j + 1].is_pos_number_only() ? convertTo<int16>(params[j + 1]) : 0;
- else if (params[j].equals_ci("AMSGS"))
- ci->ttb[9] = params[j + 1].is_pos_number_only() ? convertTo<int16>(params[j + 1]) : 0;
- }
- }
- else if (params[0].equals_ci("CAPSMIN"))
- ci->capsmin = params[1].is_pos_number_only() ? convertTo<int16>(params[1]) : 0;
- else if (params[0].equals_ci("CAPSPERCENT"))
- ci->capspercent = params[1].is_pos_number_only() ? convertTo<int16>(params[1]) : 0;
- else if (params[0].equals_ci("FLOODLINES"))
- ci->floodlines = params[1].is_pos_number_only() ? convertTo<int16>(params[1]) : 0;
- else if (params[0].equals_ci("FLOODSECS"))
- ci->floodsecs = params[1].is_pos_number_only() ? convertTo<int16>(params[1]) : 0;
- else if (params[0].equals_ci("REPEATTIMES"))
- ci->repeattimes = params[1].is_pos_number_only() ? convertTo<int16>(params[1]) : 0;
- else if (params[0].equals_ci("BADWORD"))
- {
- BadWordType Type;
- if (params[1].equals_ci("SINGLE"))
- Type = BW_SINGLE;
- else if (params[1].equals_ci("START"))
- Type = BW_START;
- else if (params[1].equals_ci("END"))
- Type = BW_END;
- else
- Type = BW_ANY;
- ci->AddBadWord(params[2], Type);
- }
- }
- }
- catch (const ConvertException &ex)
- {
- throw DatabaseException(ex.GetReason());
- }
-
- return EVENT_CONTINUE;
- }
-
- EventReturn OnSaveDatabase()
- {
- BackupDatabase();
-
- db_buffer << "VER 2" << endl;
-
- for (nickcore_map::const_iterator nit = NickCoreList.begin(), nit_end = NickCoreList.end(); nit != nit_end; ++nit)
- {
- NickCore *nc = nit->second;
-
- db_buffer << "NC " << nc->display << " " << nc->pass << endl;
-
- db_buffer << "MD MEMOMAX " << nc->memos.memomax << endl;
-
- if (!nc->language.empty())
- db_buffer << "MD LANGUAGE " << nc->language << endl;
- if (!nc->email.empty())
- db_buffer << "MD EMAIL " << nc->email << endl;
- if (!nc->greet.empty())
- db_buffer << "MD GREET :" << nc->greet << endl;
-
- if (!nc->access.empty())
- {
- for (std::vector<Anope::string>::iterator it = nc->access.begin(), it_end = nc->access.end(); it != it_end; ++it)
- db_buffer << "MD ACCESS " << *it << endl;
- }
- if (!nc->cert.empty())
- {
- for (std::vector<Anope::string>::iterator it = nc->cert.begin(), it_end = nc->cert.end(); it != it_end; ++it)
- db_buffer << "MD CERT " << *it << endl;
- }
- if (nc->FlagCount())
- db_buffer << "MD FLAGS " << ToString(nc->ToString()) << endl;
- MemoInfo *mi = &nc->memos;
- for (unsigned k = 0, end = mi->memos.size(); k < end; ++k)
- {
- db_buffer << "MD MI " << mi->memos[k]->time << " " << mi->memos[k]->sender;
- if (mi->memos[k]->HasFlag(MF_UNREAD))
- db_buffer << " UNREAD";
- if (mi->memos[k]->HasFlag(MF_RECEIPT))
- db_buffer << " RECEIPT";
- db_buffer << " :" << mi->memos[k]->text << endl;
- }
- for (unsigned k = 0, end = mi->ignores.size(); k < end; ++k)
- db_buffer << "MD MIG " << Anope::string(mi->ignores[k]) << endl;
- FOREACH_MOD(I_OnDatabaseWriteMetadata, OnDatabaseWriteMetadata(WriteMetadata, nc));
- }
-
- for (nickalias_map::const_iterator it = NickAliasList.begin(), it_end = NickAliasList.end(); it != it_end; ++it)
- {
- NickAlias *na = it->second;
-
- db_buffer << "NA " << na->nc->display << " " << na->nick << " " << na->time_registered << " " << na->last_seen << endl;
- if (!na->last_usermask.empty())
- db_buffer << "MD LAST_USERMASK " << na->last_usermask << endl;
- if (!na->last_realname.empty())
- db_buffer << "MD LAST_REALNAME :" << na->last_realname << endl;
- if (!na->last_quit.empty())
- db_buffer << "MD LAST_QUIT :" << na->last_quit << endl;
- if (na->FlagCount())
- db_buffer << "MD FLAGS " << ToString(na->ToString()) << endl;
- if (na->hostinfo.HasVhost())
- db_buffer << "MD VHOST " << na->hostinfo.GetCreator() << " " << na->hostinfo.GetTime() << " " << na->hostinfo.GetHost() << " :" << na->hostinfo.GetIdent() << endl;
-
- FOREACH_MOD(I_OnDatabaseWriteMetadata, OnDatabaseWriteMetadata(WriteMetadata, na));
- }
-
- for (Anope::insensitive_map<BotInfo *>::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it)
- {
- BotInfo *bi = it->second;
-
- if (bi->HasFlag(BI_CONF))
- continue;
-
- db_buffer << "BI " << bi->nick << " " << bi->GetIdent() << " " << bi->host << " " << bi->created << " " << bi->chancount << " :" << bi->realname << endl;
- if (bi->FlagCount())
- db_buffer << "MD FLAGS " << ToString(bi->ToString()) << endl;
- }
-
- for (registered_channel_map::const_iterator cit = RegisteredChannelList.begin(), cit_end = RegisteredChannelList.end(); cit != cit_end; ++cit)
- {
- ChannelInfo *ci = cit->second;
-
- db_buffer << "CH " << ci->name << " " << ci->time_registered << " " << ci->last_used << endl;
- db_buffer << "MD BANTYPE " << ci->bantype << endl;
- db_buffer << "MD MEMOMAX " << ci->memos.memomax << endl;
- if (ci->GetFounder())
- db_buffer << "MD FOUNDER " << ci->GetFounder()->display << endl;
- if (ci->successor)
- db_buffer << "MD SUCCESSOR " << ci->successor->display << endl;
- if (!ci->desc.empty())
- db_buffer << "MD DESC :" << ci->desc << endl;
- if (!ci->last_topic.empty())
- db_buffer << "MD TOPIC " << ci->last_topic_setter << " " << ci->last_topic_time << " :" << ci->last_topic << endl;
- db_buffer << "MD LEVELS";
- for (int j = 0; ChannelLevels[j].Level != CA_SIZE; ++j)
- db_buffer << " " << ChannelLevels[j].Name << " " << ci->levels[ChannelLevels[j].Level];
- db_buffer << endl;
- if (ci->FlagCount())
- db_buffer << "MD FLAGS " << ToString(ci->ToString()) << endl;
- if (ci->HasFlag(CI_SUSPENDED))
- {
- Anope::string by, reason;
- ci->GetExtRegular("suspend_by", by);
- ci->GetExtRegular("suspend_reason", reason);
- db_buffer << "MD SUSPEND " << by << " :" << reason << endl;
- }
- for (unsigned k = 0, end = ci->GetAccessCount(); k < end; ++k)
- {
- ChanAccess *access = ci->GetAccess(k);
- db_buffer << "MD ACCESS " << access->provider->name << " " << access->mask << " " << access->Serialize() << " " << access->last_seen << " " << access->creator << " " << access->created << endl;
- }
- for (unsigned k = 0, end = ci->GetAkickCount(); k < end; ++k)
- {
- db_buffer << "MD AKICK 0 " << (ci->GetAkick(k)->HasFlag(AK_ISNICK) ? "NICK " : "MASK ") <<
- (ci->GetAkick(k)->HasFlag(AK_ISNICK) ? ci->GetAkick(k)->nc->display : ci->GetAkick(k)->mask) << " " << ci->GetAkick(k)->creator << " " << ci->GetAkick(k)->addtime << " " << ci->last_used << " :";
- if (!ci->GetAkick(k)->reason.empty())
- db_buffer << ci->GetAkick(k)->reason;
- db_buffer << endl;
- }
- {
- std::vector<Anope::string> mlocks;
- if (ci->GetExtRegular("db_mlock", mlocks))
- for (unsigned i = 0; i < mlocks.size(); ++i)
- db_buffer << mlocks[i] << endl;
- else
- {
- for (std::multimap<ChannelModeName, ModeLock>::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it)
- {
- const ModeLock &ml = it->second;
- ChannelMode *cm = ModeManager::FindChannelModeByName(ml.name);
- if (cm != NULL)
- db_buffer << "MD MLOCK " << (ml.set ? 1 : 0) << " " << cm->NameAsString() << " " << ml.setter << " " << ml.created << " " << ml.param << endl;
- }
- }
- }
- MemoInfo *memos = &ci->memos;
- for (unsigned k = 0, end = memos->memos.size(); k < end; ++k)
- {
- db_buffer << "MD MI " << memos->memos[k]->time << " " << memos->memos[k]->sender;
- if (memos->memos[k]->HasFlag(MF_UNREAD))
- db_buffer << " UNREAD";
- if (memos->memos[k]->HasFlag(MF_RECEIPT))
- db_buffer << " RECEIPT";
- db_buffer << " :" << memos->memos[k]->text << endl;
- }
- for (unsigned k = 0, end = memos->ignores.size(); k < end; ++k)
- db_buffer << "MD MIG " << Anope::string(memos->ignores[k]) << endl;
- if (ci->bi)
- db_buffer << "MD BI NAME " << ci->bi->nick << endl;
- if (ci->botflags.FlagCount())
- db_buffer << "MD BI FLAGS " << ToString(ci->botflags.ToString()) << endl;
- db_buffer << "MD BI TTB BOLDS " << ci->ttb[0] << " COLORS " << ci->ttb[1] << " REVERSES " << ci->ttb[2] << " UNDERLINES " << ci->ttb[3] << " BADWORDS " << ci->ttb[4] << " CAPS " << ci->ttb[5] << " FLOOD " << ci->ttb[6] << " REPEAT " << ci->ttb[7] << " ITALICS " << ci->ttb[8] << " AMSGS " << ci->ttb[9] << endl;
- if (ci->capsmin)
- db_buffer << "MD BI CAPSMIN " << ci->capsmin << endl;
- if (ci->capspercent)
- db_buffer << "MD BI CAPSPERCENT " << ci->capspercent << endl;
- if (ci->floodlines)
- db_buffer << "MD BI FLOODLINES " << ci->floodlines << endl;
- if (ci->floodsecs)
- db_buffer << "MD BI FLOODSECS " << ci->floodsecs << endl;
- if (ci->repeattimes)
- db_buffer << "MD BI REPEATTIMES " << ci->repeattimes << endl;
- for (unsigned k = 0, end = ci->GetBadWordCount(); k < end; ++k)
- db_buffer << "MD BI BADWORD " << (ci->GetBadWord(k)->type == BW_ANY ? "ANY " : "") << (ci->GetBadWord(k)->type == BW_SINGLE ? "SINGLE " : "") << (ci->GetBadWord(k)->type == BW_START ? "START " : "") <<
- (ci->GetBadWord(k)->type == BW_END ? "END " : "") << ":" << ci->GetBadWord(k)->word << endl;
-
- FOREACH_MOD(I_OnDatabaseWriteMetadata, OnDatabaseWriteMetadata(WriteMetadata, ci));
- }
-
- db_buffer << "OS STATS " << maxusercnt << " " << maxusertime << endl;
-
- for (std::list<XLineManager *>::iterator it = XLineManager::XLineManagers.begin(), it_end = XLineManager::XLineManagers.end(); it != it_end; ++it)
- {
- XLineManager *xl = *it;
- for (unsigned i = 0, end = xl->GetCount(); i < end; ++i)
- {
- XLine *x = xl->GetEntry(i);
- db_buffer << "OS SXLINE " << xl->Type() << " " << x->GetUser() << " " << x->GetHost() << " " << x->By << " " << x->Created << " " << x->Expires << " :" << x->Reason << endl;
- }
- }
-
- if (SessionInterface)
- for (SessionService::ExceptionVector::iterator it = SessionInterface->GetExceptions().begin(); it != SessionInterface->GetExceptions().end(); ++it)
- {
- Exception *e = *it;
- db_buffer << "OS EXCEPTION " << e->mask << " " << e->limit << " " << e->who << " " << e->time << " " << e->expires << " " << e->reason << endl;
- }
-
- FOREACH_MOD(I_OnDatabaseWrite, OnDatabaseWrite(Write));
-
- std::fstream db;
- db.open(DatabaseFile.c_str(), std::ios_base::out | std::ios_base::trunc);
-
- if (!db.is_open())
- {
- ircdproto->SendGlobops(NULL, "Unable to open %s for writing!", DatabaseFile.c_str());
- return EVENT_CONTINUE;
- }
-
- db << db_buffer.str();
- db_buffer.str("");
-
- db.close();
-
- return EVENT_CONTINUE;
- }
-
- void OnModuleLoad(User *u, Module *m)
- {
- if (!u)
- return;
-
- Implementation events[] = {I_OnDatabaseRead, I_OnDatabaseReadMetadata};
- for (int i = 0; i < 2; ++i)
- {
- std::vector<Module *>::iterator it = std::find(ModuleManager::EventHandlers[events[i]].begin(), ModuleManager::EventHandlers[events[i]].end(), m);
- /* This module wants to read from the database */
- if (it != ModuleManager::EventHandlers[events[i]].end())
- /* Loop over the database and call the events it would on a normal startup */
- ReadDatabase(m);
- }
- }
-};
-
-MODULE_INIT(DBPlain)
diff --git a/modules/core/enc_md5.cpp b/modules/core/enc_md5.cpp
deleted file mode 100644
index 109f31dfc..000000000
--- a/modules/core/enc_md5.cpp
+++ /dev/null
@@ -1,372 +0,0 @@
-/* Module for encryption using MD5.
- *
- * Modified for Anope.
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Taken from IRC Services and is copyright (c) 1996-2002 Andrew Church.
- * E-mail: <achurch@achurch.org>
- * Parts written by Andrew Kempe and others.
- * This program is free but copyrighted software; see the file COPYING for
- * details.
- */
-
-#include "module.h"
-
-/*************************************************************************/
-
-/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
-rights reserved.
-
-License to copy and use this software is granted provided that it
-is identified as the "RSA Data Security, Inc. MD5 Message-Digest
-Algorithm" in all material mentioning or referencing this software
-or this function.
-
-License is also granted to make and use derivative works provided
-that such works are identified as "derived from the RSA Data
-Security, Inc. MD5 Message-Digest Algorithm" in all material
-mentioning or referencing the derived work.
-
-RSA Data Security, Inc. makes no representations concerning either
-the merchantability of this software or the suitability of this
-software for any particular purpose. It is provided "as is"
-without express or implied warranty of any kind.
-
-These notices must be retained in any copies of any part of this
-documentation and/or software.
- */
-
-/* MD5 context. */
-struct MD5_CTX
-{
- unsigned state[4]; /* state (ABCD) */
- unsigned count[2]; /* number of bits, modulo 2^64 (lsb first) */
- unsigned char buffer[64]; /* input buffer */
-};
-
-/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
- */
-
-/* Constants for MD5Transform routine.
- */
-enum
-{
- S11 = 7,
- S12 = 12,
- S13 = 17,
- S14 = 22,
- S21 = 5,
- S22 = 9,
- S23 = 14,
- S24 = 20,
- S31 = 4,
- S32 = 11,
- S33 = 16,
- S34 = 23,
- S41 = 6,
- S42 = 10,
- S43 = 15,
- S44 = 21
-};
-
-void MD5Transform(unsigned [4], const unsigned char [64]);
-void Encode(unsigned char *, unsigned *, unsigned);
-void Decode(unsigned *, const unsigned char *, unsigned);
-
-static unsigned char PADDING[64] = {
- 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-
-/* F, G, H and I are basic MD5 functions.
- */
-inline static unsigned F(unsigned x, unsigned y, unsigned z) { return (x & y) | (~x & z); }
-inline static unsigned G(unsigned x, unsigned y, unsigned z) { return (x & z) | (y & ~z); }
-inline static unsigned H(unsigned x, unsigned y, unsigned z) { return x ^ y ^ z; }
-inline static unsigned I(unsigned x, unsigned y, unsigned z) { return y ^ (x | ~z); }
-
-/* ROTATE_LEFT rotates x left n bits.
- */
-inline static unsigned ROTATE_LEFT(unsigned x, unsigned n) { return (x << n) | (x >> (32 - n)); }
-
-/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
- * Rotation is separate from addition to prevent recomputation.
- */
-inline static void FF(unsigned &a, unsigned b, unsigned c, unsigned d, unsigned x, unsigned s, unsigned ac)
-{
- a += F(b, c, d) + x + ac;
- a = ROTATE_LEFT(a, s);
- a += b;
-}
-inline static void GG(unsigned &a, unsigned b, unsigned c, unsigned d, unsigned x, unsigned s, unsigned ac)
-{
- a += G(b, c, d) + x + ac;
- a = ROTATE_LEFT(a, s);
- a += b;
-}
-inline static void HH(unsigned &a, unsigned b, unsigned c, unsigned d, unsigned x, unsigned s, unsigned ac)
-{
- a += H(b, c, d) + x + ac;
- a = ROTATE_LEFT(a, s);
- a += b;
-}
-inline static void II(unsigned &a, unsigned b, unsigned c, unsigned d, unsigned x, unsigned s, unsigned ac)
-{
- a += I(b, c, d) + x + ac;
- a = ROTATE_LEFT(a, s);
- a += b;
-}
-
-/* MD5 initialization. Begins an MD5 operation, writing a new context.
- */
-void MD5Init(MD5_CTX *context)
-{
- context->count[0] = context->count[1] = 0;
- /* Load magic initialization constants. */
- context->state[0] = 0x67452301;
- context->state[1] = 0xefcdab89;
- context->state[2] = 0x98badcfe;
- context->state[3] = 0x10325476;
-}
-
-/* MD5 block update operation. Continues an MD5 message-digest
- * operation, processing another message block, and updating the
- * context.
- */
-void MD5Update(MD5_CTX *context, const unsigned char *input, unsigned inputLen)
-{
- unsigned i, index, partLen;
-
- /* Compute number of bytes mod 64 */
- index = (context->count[0] >> 3) & 0x3F;
-
- /* Update number of bits */
- if ((context->count[0] += inputLen << 3) < (inputLen << 3))
- ++context->count[1];
- context->count[1] += inputLen >> 29;
-
- partLen = 64 - index;
-
- /* Transform as many times as possible. */
- if (inputLen >= partLen)
- {
- memcpy(&context->buffer[index], input, partLen);
- MD5Transform(context->state, context->buffer);
-
- for (i = partLen; i + 63 < inputLen; i += 64)
- MD5Transform(context->state, &input[i]);
-
- index = 0;
- }
- else
- i = 0;
-
- /* Buffer remaining input */
- memcpy(&context->buffer[index], &input[i], inputLen - i);
-}
-
-/* MD5 finalization. Ends an MD5 message-digest operation, writing the
- * the message digest and zeroizing the context.
- */
-void MD5Final(unsigned char digest[17], MD5_CTX *context)
-{
- unsigned char bits[8];
- unsigned index, padLen;
-
- /* Save number of bits */
- Encode(bits, context->count, 8);
-
- /* Pad out to 56 mod 64. */
- index = (context->count[0] >> 3) & 0x3f;
- padLen = index < 56 ? 56 - index : 120 - index;
- MD5Update(context, PADDING, padLen);
-
- /* Append length (before padding) */
- MD5Update(context, bits, 8);
- /* Store state in digest */
- Encode(digest, context->state, 16);
-
- /* Zeroize sensitive information. */
- memset(context, 0, sizeof(*context));
-}
-
-/* MD5 basic transformation. Transforms state based on block.
- */
-void MD5Transform(unsigned state[4], const unsigned char block[64])
-{
- unsigned a = state[0], b = state[1], c = state[2], d = state[3], x[16];
-
- Decode(x, block, 64);
-
- /* Round 1 */
- FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */
- FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */
- FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */
- FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */
- FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */
- FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */
- FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */
- FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */
- FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */
- FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */
- FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
- FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
- FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
- FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
- FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
- FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
-
- /* Round 2 */
- GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */
- GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */
- GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
- GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */
- GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */
- GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */
- GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
- GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */
- GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */
- GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
- GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */
- GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */
- GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
- GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */
- GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */
- GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
-
- /* Round 3 */
- HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */
- HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */
- HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
- HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
- HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */
- HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */
- HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */
- HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
- HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
- HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */
- HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */
- HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */
- HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */
- HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
- HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
- HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */
-
- /* Round 4 */
- II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */
- II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */
- II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
- II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */
- II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
- II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */
- II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
- II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */
- II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */
- II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
- II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */
- II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
- II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */
- II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
- II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */
- II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */
-
- state[0] += a;
- state[1] += b;
- state[2] += c;
- state[3] += d;
-
- /* Zeroize sensitive information. */
- memset(x, 0, sizeof(x));
-}
-
-/* Encodes input (unsigned) into output (unsigned char). Assumes len is
- * a multiple of 4.
- */
-void Encode(unsigned char *output, unsigned *input, unsigned len)
-{
- unsigned i, j;
-
- for (i = 0, j = 0; j < len; ++i, j += 4)
- {
- output[j] = static_cast<unsigned char>(input[i] & 0xff);
- output[j + 1] = static_cast<unsigned char>((input[i] >> 8) & 0xff);
- output[j + 2] = static_cast<unsigned char>((input[i] >> 16) & 0xff);
- output[j + 3] = static_cast<unsigned char>((input[i] >> 24) & 0xff);
- }
-}
-
-/* Decodes input (unsigned char) into output (unsigned). Assumes len is
- * a multiple of 4.
- */
-void Decode(unsigned *output, const unsigned char *input, unsigned len)
-{
- unsigned i, j;
-
- for (i = 0, j = 0; j < len; ++i, j += 4)
- output[i] = static_cast<unsigned>(input[j]) | (static_cast<unsigned>(input[j + 1]) << 8) | (static_cast<unsigned>(input[j + 2]) << 16) | (static_cast<unsigned>(input[j + 3]) << 24);
-}
-
-/*************************************************************************/
-
-/* Module stuff. */
-
-class EMD5 : public Module
-{
- public:
- EMD5(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, ENCRYPTION)
- {
- this->SetAuthor("Anope");
-
- Implementation i[] = { I_OnEncrypt, I_OnCheckAuthentication };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
- }
-
- EventReturn OnEncrypt(const Anope::string &src, Anope::string &dest)
- {
- MD5_CTX context;
- char digest[17] = "";
- Anope::string buf = "md5:";
-
- MD5Init(&context);
- MD5Update(&context, reinterpret_cast<const unsigned char *>(src.c_str()), src.length());
- MD5Final(reinterpret_cast<unsigned char *>(digest), &context);
-
- buf += Anope::Hex(digest, 16);
- Log(LOG_DEBUG_2) << "(enc_md5) hashed password from [" << src << "] to [" << buf << "]";
- dest = buf;
- return EVENT_ALLOW;
- }
-
- EventReturn OnCheckAuthentication(Command *c, CommandSource *source, const std::vector<Anope::string> &params, const Anope::string &account, const Anope::string &password)
- {
- NickAlias *na = findnick(account);
- NickCore *nc = na ? na->nc : NULL;
- if (na == NULL)
- return EVENT_CONTINUE;
-
- size_t pos = nc->pass.find(':');
- if (pos == Anope::string::npos)
- return EVENT_CONTINUE;
- Anope::string hash_method(nc->pass.begin(), nc->pass.begin() + pos);
- if (!hash_method.equals_cs("md5"))
- return EVENT_CONTINUE;
-
- Anope::string buf;
- this->OnEncrypt(password, buf);
- if (nc->pass.equals_cs(buf))
- {
- /* if we are NOT the first module in the list,
- * we want to re-encrypt the pass with the new encryption
- */
- if (ModuleManager::FindFirstOf(ENCRYPTION) != this)
- enc_encrypt(password, nc->pass);
- return EVENT_ALLOW;
- }
-
- return EVENT_CONTINUE;
- }
-};
-
-MODULE_INIT(EMD5)
diff --git a/modules/core/enc_none.cpp b/modules/core/enc_none.cpp
deleted file mode 100644
index 180b431c2..000000000
--- a/modules/core/enc_none.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/* Module for plain text encryption.
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * This program is free but copyrighted software; see the file COPYING for
- * details.
- */
-
-#include "module.h"
-
-class ENone : public Module
-{
- public:
- ENone(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, ENCRYPTION)
- {
- this->SetAuthor("Anope");
-
- Implementation i[] = { I_OnEncrypt, I_OnDecrypt, I_OnCheckAuthentication };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
- }
-
- EventReturn OnEncrypt(const Anope::string &src, Anope::string &dest)
- {
- Anope::string buf = "plain:";
- Anope::string cpass;
- Anope::B64Encode(src, cpass);
- buf += cpass;
- Log(LOG_DEBUG_2) << "(enc_none) hashed password from [" << src << "] to [" << buf << "]";
- dest = buf;
- return EVENT_ALLOW;
- }
-
- EventReturn OnDecrypt(const Anope::string &hashm, const Anope::string &src, Anope::string &dest)
- {
- if (!hashm.equals_cs("plain"))
- return EVENT_CONTINUE;
- size_t pos = src.find(':');
- Anope::string buf = src.substr(pos + 1);
- Anope::B64Decode(buf, dest);
- return EVENT_ALLOW;
- }
-
- EventReturn OnCheckAuthentication(Command *c, CommandSource *source, const std::vector<Anope::string> &params, const Anope::string &account, const Anope::string &password)
- {
- NickAlias *na = findnick(account);
- NickCore *nc = na ? na->nc : NULL;
- if (na == NULL)
- return EVENT_CONTINUE;
-
- size_t pos = nc->pass.find(':');
- if (pos == Anope::string::npos)
- return EVENT_CONTINUE;
- Anope::string hash_method(nc->pass.begin(), nc->pass.begin() + pos);
- if (!hash_method.equals_cs("plain"))
- return EVENT_CONTINUE;
-
- Anope::string buf;
- this->OnEncrypt(password, buf);
- if (nc->pass.equals_cs(buf))
- {
- /* if we are NOT the first module in the list,
- * we want to re-encrypt the pass with the new encryption
- */
- if (ModuleManager::FindFirstOf(ENCRYPTION) != this)
- enc_encrypt(password, nc->pass);
- return EVENT_ALLOW;
- }
-
- return EVENT_CONTINUE;
- }
-};
-
-MODULE_INIT(ENone)
diff --git a/modules/core/enc_old.cpp b/modules/core/enc_old.cpp
deleted file mode 100644
index e68887c49..000000000
--- a/modules/core/enc_old.cpp
+++ /dev/null
@@ -1,382 +0,0 @@
-/* Include file for high-level encryption routines.
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-#include "module.h"
-
-/******** Code specific to the type of encryption. ********/
-
-/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
-rights reserved.
-
-License to copy and use this software is granted provided that it
-is identified as the "RSA Data Security, Inc. MD5 Message-Digest
-Algorithm" in all material mentioning or referencing this software
-or this function.
-
-License is also granted to make and use derivative works provided
-that such works are identified as "derived from the RSA Data
-Security, Inc. MD5 Message-Digest Algorithm" in all material
-mentioning or referencing the derived work.
-
-RSA Data Security, Inc. makes no representations concerning either
-the merchantability of this software or the suitability of this
-software for any particular purpose. It is provided "as is"
-without express or implied warranty of any kind.
-
-These notices must be retained in any copies of any part of this
-documentation and/or software.
- */
-
-/* MD5 context. */
-struct MD5_CTX
-{
- unsigned state[4]; /* state (ABCD) */
- unsigned count[2]; /* number of bits, modulo 2^64 (lsb first) */
- unsigned char buffer[64]; /* input buffer */
-};
-
-/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
- */
-
-/* Constants for MD5Transform routine.
- */
-enum
-{
- S11 = 7,
- S12 = 12,
- S13 = 17,
- S14 = 22,
- S21 = 5,
- S22 = 9,
- S23 = 14,
- S24 = 20,
- S31 = 4,
- S32 = 11,
- S33 = 16,
- S34 = 23,
- S41 = 6,
- S42 = 10,
- S43 = 15,
- S44 = 21
-};
-
-static void MD5Transform(unsigned [4], const unsigned char[64]);
-static void Encode(unsigned char *, unsigned *, unsigned);
-static void Decode(unsigned *, const unsigned char *, unsigned);
-
-static unsigned char PADDING[64] = {
- 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-
-/* F, G, H and I are basic MD5 functions.
- */
-inline static unsigned F(unsigned x, unsigned y, unsigned z) { return (x & y) | (~x & z); }
-inline static unsigned G(unsigned x, unsigned y, unsigned z) { return (x & z) | (y & ~z); }
-inline static unsigned H(unsigned x, unsigned y, unsigned z) { return x ^ y ^ z; }
-inline static unsigned MD5_I(unsigned x, unsigned y, unsigned z) { return y ^ (x | ~z); }
-
-/* ROTATE_LEFT rotates x left n bits.
- */
-inline static unsigned ROTATE_LEFT(unsigned x, unsigned n) { return (x << n) | (x >> (32 - n)); }
-
-/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
- * Rotation is separate from addition to prevent recomputation.
- */
-inline static void FF(unsigned &a, unsigned b, unsigned c, unsigned d, unsigned x, unsigned s, unsigned ac)
-{
- a += F(b, c, d) + x + ac;
- a = ROTATE_LEFT(a, s);
- a += b;
-}
-inline static void GG(unsigned &a, unsigned b, unsigned c, unsigned d, unsigned x, unsigned s, unsigned ac)
-{
- a += G(b, c, d) + x + ac;
- a = ROTATE_LEFT(a, s);
- a += b;
-}
-inline static void HH(unsigned &a, unsigned b, unsigned c, unsigned d, unsigned x, unsigned s, unsigned ac)
-{
- a += H(b, c, d) + x + ac;
- a = ROTATE_LEFT(a, s);
- a += b;
-}
-inline static void II(unsigned &a, unsigned b, unsigned c, unsigned d, unsigned x, unsigned s, unsigned ac)
-{
- a += MD5_I(b, c, d) + x + ac;
- a = ROTATE_LEFT(a, s);
- a += b;
-}
-
-/* MD5 initialization. Begins an MD5 operation, writing a new context.
- */
-static void MD5Init(MD5_CTX *context)
-{
- context->count[0] = context->count[1] = 0;
- /* Load magic initialization constants.
- */
- context->state[0] = 0x67452301;
- context->state[1] = 0xefcdab89;
- context->state[2] = 0x98badcfe;
- context->state[3] = 0x10325476;
-}
-
-/* MD5 block update operation. Continues an MD5 message-digest
- * operation, processing another message block, and updating the
- * context.
- */
-static void MD5Update(MD5_CTX *context, const unsigned char *input, unsigned inputLen)
-{
- unsigned i, index, partLen;
-
- /* Compute number of bytes mod 64 */
- index = (context->count[0] >> 3) & 0x3F;
-
- /* Update number of bits */
- if ((context->count[0] += inputLen << 3) < (inputLen << 3))
- ++context->count[1];
- context->count[1] += inputLen >> 29;
-
- partLen = 64 - index;
-
- /* Transform as many times as possible.
- */
- if (inputLen >= partLen)
- {
- memcpy(&context->buffer[index], input, partLen);
- MD5Transform(context->state, context->buffer);
-
- for (i = partLen; i + 63 < inputLen; i += 64)
- MD5Transform(context->state, &input[i]);
-
- index = 0;
- }
- else
- i = 0;
-
- /* Buffer remaining input */
- memcpy(&context->buffer[index], &input[i], inputLen - i);
-}
-
-/* MD5 finalization. Ends an MD5 message-digest operation, writing the
- * the message digest and zeroizing the context.
- */
-static void MD5Final(unsigned char digest[17], MD5_CTX *context)
-{
- unsigned char bits[8];
- unsigned index, padLen;
-
- /* Save number of bits */
- Encode(bits, context->count, 8);
-
- /* Pad out to 56 mod 64.
- */
- index = (context->count[0] >> 3) & 0x3f;
- padLen = index < 56 ? 56 - index : 120 - index;
- MD5Update(context, PADDING, padLen);
-
- /* Append length (before padding) */
- MD5Update(context, bits, 8);
- /* Store state in digest */
- Encode(digest, context->state, 16);
-
- /* Zeroize sensitive information.
- */
- memset(context, 0, sizeof(*context));
-}
-
-/* MD5 basic transformation. Transforms state based on block.
- */
-static void MD5Transform(unsigned state[4], const unsigned char block[64])
-{
- unsigned a = state[0], b = state[1], c = state[2], d = state[3], x[16];
-
- Decode(x, block, 64);
-
- /* Round 1 */
- FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */
- FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */
- FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */
- FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */
- FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */
- FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */
- FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */
- FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */
- FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */
- FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */
- FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
- FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
- FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
- FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
- FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
- FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
-
- /* Round 2 */
- GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */
- GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */
- GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
- GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */
- GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */
- GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */
- GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
- GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */
- GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */
- GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
- GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */
- GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */
- GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
- GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */
- GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */
- GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
-
- /* Round 3 */
- HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */
- HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */
- HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
- HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
- HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */
- HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */
- HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */
- HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
- HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
- HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */
- HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */
- HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */
- HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */
- HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
- HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
- HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */
-
- /* Round 4 */
- II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */
- II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */
- II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
- II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */
- II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
- II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */
- II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
- II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */
- II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */
- II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
- II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */
- II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
- II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */
- II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
- II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */
- II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */
-
- state[0] += a;
- state[1] += b;
- state[2] += c;
- state[3] += d;
-
- /* Zeroize sensitive information.
- */
- memset(x, 0, sizeof(x));
-}
-
-/* Encodes input (unsigned) into output (unsigned char). Assumes len is
- * a multiple of 4.
- */
-static void Encode(unsigned char *output, unsigned *input, unsigned len)
-{
- unsigned i, j;
-
- for (i = 0, j = 0; j < len; ++i, j += 4)
- {
- output[j] = static_cast<unsigned char>(input[i] & 0xff);
- output[j + 1] = static_cast<unsigned char>((input[i] >> 8) & 0xff);
- output[j + 2] = static_cast<unsigned char>((input[i] >> 16) & 0xff);
- output[j + 3] = static_cast<unsigned char>((input[i] >> 24) & 0xff);
- }
-}
-
-/* Decodes input (unsigned char) into output (unsigned). Assumes len is
- * a multiple of 4.
- */
-static void Decode(unsigned *output, const unsigned char *input, unsigned len)
-{
- unsigned i, j;
-
- for (i = 0, j = 0; j < len; ++i, j += 4)
- output[i] = static_cast<unsigned>(input[j]) | (static_cast<unsigned>(input[j + 1]) << 8) | (static_cast<unsigned>(input[j + 2]) << 16) | (static_cast<unsigned>(input[j + 3]) << 24);
-}
-
-/*************************************************************************/
-
-/******** Our own high-level routines. ********/
-
-inline static char XTOI(char c) { return c > 9 ? c - 'A' + 10 : c - '0'; }
-
-class EOld : public Module
-{
- public:
- EOld(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, ENCRYPTION)
- {
- this->SetAuthor("Anope");
-
- Implementation i[] = { I_OnEncrypt, I_OnCheckAuthentication };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
- }
-
- EventReturn OnEncrypt(const Anope::string &src, Anope::string &dest)
- {
- MD5_CTX context;
- char digest[33] = "", digest2[17] = "";
- int i;
- Anope::string buf = "oldmd5:";
-
- memset(&context, 0, sizeof(context));
-
- MD5Init(&context);
- MD5Update(&context, reinterpret_cast<const unsigned char *>(src.c_str()), src.length());
- MD5Final(reinterpret_cast<unsigned char *>(digest), &context);
- for (i = 0; i < 32; i += 2)
- digest2[i / 2] = XTOI(digest[i]) << 4 | XTOI(digest[i + 1]);
-
- buf += Anope::Hex(digest2, 16);
- Log(LOG_DEBUG_2) << "(enc_old) hashed password from [" << src << "] to [" << buf << "]";
- dest = buf;
- return EVENT_ALLOW;
- }
-
- EventReturn OnCheckAuthentication(Command *c, CommandSource *source, const std::vector<Anope::string> &params, const Anope::string &account, const Anope::string &password)
- {
- NickAlias *na = findnick(account);
- NickCore *nc = na ? na->nc : NULL;
- if (na == NULL)
- return EVENT_CONTINUE;
-
- size_t pos = nc->pass.find(':');
- if (pos == Anope::string::npos)
- return EVENT_CONTINUE;
- Anope::string hash_method(nc->pass.begin(), nc->pass.begin() + pos);
- if (!hash_method.equals_cs("oldmd5"))
- return EVENT_CONTINUE;
-
- Anope::string buf;
- this->OnEncrypt(password, buf);
- if (nc->pass.equals_cs(buf))
- {
- /* if we are NOT the first module in the list,
- * we want to re-encrypt the pass with the new encryption
- */
- if (ModuleManager::FindFirstOf(ENCRYPTION) != this)
- enc_encrypt(password, nc->pass);
- return EVENT_ALLOW;
- }
-
- return EVENT_CONTINUE;
- }
-};
-
-MODULE_INIT(EOld)
diff --git a/modules/core/enc_sha1.cpp b/modules/core/enc_sha1.cpp
deleted file mode 100644
index 4fe321bdc..000000000
--- a/modules/core/enc_sha1.cpp
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
-SHA-1 in C
-By Steve Reid <steve@edmweb.com>
-100% Public Domain
-
-Test Vectors (from FIPS PUB 180-1)
-"abc"
- A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
-"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
- 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
-A million repetitions of "a"
- 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
-*/
-
-/* #define LITTLE_ENDIAN * This should be #define'd if true. */
-
-#include "module.h"
-
-struct SHA1_CTX
-{
- uint32 state[5];
- uint32 count[2];
- unsigned char buffer[64];
-};
-
-void SHA1Transform(uint32 state[5], const unsigned char buffer[64]);
-void SHA1Init(SHA1_CTX *context);
-void SHA1Update(SHA1_CTX *context, const unsigned char *data, uint32 len);
-void SHA1Final(unsigned char digest[20], SHA1_CTX *context);
-
-inline static uint32 rol(uint32 value, uint32 bits) { return (value << bits) | (value >> (32 - bits)); }
-
-union CHAR64LONG16
-{
- unsigned char c[64];
- uint32 l[16];
-};
-
-/* blk0() and blk() perform the initial expand. */
-/* I got the idea of expanding during the round function from SSLeay */
-inline static uint32 blk0(CHAR64LONG16 *block, uint32 i)
-{
-#ifdef LITTLE_ENDIAN
- return block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | (rol(block->l[i], 8) & 0x00FF00FF);
-#else
- return block->l[i];
-#endif
-}
-inline static uint32 blk(CHAR64LONG16 *block, uint32 i) { return block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15],1); }
-
-/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
-inline static void R0(CHAR64LONG16 *block, uint32 v, uint32 &w, uint32 x, uint32 y, uint32 &z, uint32 i) { z += ((w & (x ^ y)) ^ y) + blk0(block, i) + 0x5A827999 + rol(v, 5); w = rol(w, 30); }
-inline static void R1(CHAR64LONG16 *block, uint32 v, uint32 &w, uint32 x, uint32 y, uint32 &z, uint32 i) { z += ((w & (x ^ y)) ^ y) + blk(block, i) + 0x5A827999 + rol(v, 5); w = rol(w, 30); }
-inline static void R2(CHAR64LONG16 *block, uint32 v, uint32 &w, uint32 x, uint32 y, uint32 &z, uint32 i) { z += (w ^ x ^ y) + blk(block, i) + 0x6ED9EBA1 + rol(v, 5); w = rol(w, 30); }
-inline static void R3(CHAR64LONG16 *block, uint32 v, uint32 &w, uint32 x, uint32 y, uint32 &z, uint32 i) { z += (((w | x) & y) | (w & x)) + blk(block, i) + 0x8F1BBCDC + rol(v, 5); w = rol(w, 30); }
-inline static void R4(CHAR64LONG16 *block, uint32 v, uint32 &w, uint32 x, uint32 y, uint32 &z, uint32 i) { z += (w ^ x ^ y) + blk(block, i) + 0xCA62C1D6 + rol(v, 5); w = rol(w, 30); }
-
-/* Hash a single 512-bit block. This is the core of the algorithm. */
-
-void SHA1Transform(uint32 state[5], const unsigned char buffer[64])
-{
- uint32 a, b, c, d, e;
- static unsigned char workspace[64];
- CHAR64LONG16 *block = reinterpret_cast<CHAR64LONG16 *>(workspace);
- memcpy(block, buffer, 64);
- /* Copy context->state[] to working vars */
- a = state[0];
- b = state[1];
- c = state[2];
- d = state[3];
- e = state[4];
- /* 4 rounds of 20 operations each. Loop unrolled. */
- R0(block, a, b, c, d, e, 0); R0(block, e, a, b, c, d, 1); R0(block, d, e, a, b, c, 2); R0(block, c, d, e, a, b, 3);
- R0(block, b, c, d, e, a, 4); R0(block, a, b, c, d, e, 5); R0(block, e, a, b, c, d, 6); R0(block, d, e, a, b, c, 7);
- R0(block, c, d, e, a, b, 8); R0(block, b, c, d, e, a, 9); R0(block, a, b, c, d, e, 10); R0(block, e, a, b, c, d, 11);
- R0(block, d, e, a, b, c, 12); R0(block, c, d, e, a, b, 13); R0(block, b, c, d, e, a, 14); R0(block, a, b, c, d, e, 15);
- R1(block, e, a, b, c, d, 16); R1(block, d, e, a, b, c, 17); R1(block, c, d, e, a, b, 18); R1(block, b, c, d, e, a, 19);
- R2(block, a, b, c, d, e, 20); R2(block, e, a, b, c, d, 21); R2(block, d, e, a, b, c, 22); R2(block, c, d, e, a, b, 23);
- R2(block, b, c, d, e, a, 24); R2(block, a, b, c, d, e, 25); R2(block, e, a, b, c, d, 26); R2(block, d, e, a, b, c, 27);
- R2(block, c, d, e, a, b, 28); R2(block, b, c, d, e, a, 29); R2(block, a, b, c, d, e, 30); R2(block, e, a, b, c, d, 31);
- R2(block, d, e, a, b, c, 32); R2(block, c, d, e, a, b, 33); R2(block, b, c, d, e, a, 34); R2(block, a, b, c, d, e, 35);
- R2(block, e, a, b, c, d, 36); R2(block, d, e, a, b, c, 37); R2(block, c, d, e, a, b, 38); R2(block, b, c, d, e, a, 39);
- R3(block, a, b, c, d, e, 40); R3(block, e, a, b, c, d, 41); R3(block, d, e, a, b, c, 42); R3(block, c, d, e, a, b, 43);
- R3(block, b, c, d, e, a, 44); R3(block, a, b, c, d, e, 45); R3(block, e, a, b, c, d, 46); R3(block, d, e, a, b, c, 47);
- R3(block, c, d, e, a, b, 48); R3(block, b, c, d, e, a, 49); R3(block, a, b, c, d, e, 50); R3(block, e, a, b, c, d, 51);
- R3(block, d, e, a, b, c, 52); R3(block, c, d, e, a, b, 53); R3(block, b, c, d, e, a, 54); R3(block, a, b, c, d, e, 55);
- R3(block, e, a, b, c, d, 56); R3(block, d, e, a, b, c, 57); R3(block, c, d, e, a, b, 58); R3(block, b, c, d, e, a, 59);
- R4(block, a, b, c, d, e, 60); R4(block, e, a, b, c, d, 61); R4(block, d, e, a, b, c, 62); R4(block, c, d, e, a, b, 63);
- R4(block, b, c, d, e, a, 64); R4(block, a, b, c, d, e, 65); R4(block, e, a, b, c, d, 66); R4(block, d, e, a, b, c, 67);
- R4(block, c, d, e, a, b, 68); R4(block, b, c, d, e, a, 69); R4(block, a, b, c, d, e, 70); R4(block, e, a, b, c, d, 71);
- R4(block, d, e, a, b, c, 72); R4(block, c, d, e, a, b, 73); R4(block, b, c, d, e, a, 74); R4(block, a, b, c, d, e, 75);
- R4(block, e, a, b, c, d, 76); R4(block, d, e, a, b, c, 77); R4(block, c, d, e, a, b, 78); R4(block, b, c, d, e, a, 79);
- /* Add the working vars back into context.state[] */
- state[0] += a;
- state[1] += b;
- state[2] += c;
- state[3] += d;
- state[4] += e;
- /* Wipe variables */
- a = b = c = d = e = 0;
-}
-
-/* SHA1Init - Initialize new context */
-
-void SHA1Init(SHA1_CTX *context)
-{
- /* SHA1 initialization constants */
- context->state[0] = 0x67452301;
- context->state[1] = 0xEFCDAB89;
- context->state[2] = 0x98BADCFE;
- context->state[3] = 0x10325476;
- context->state[4] = 0xC3D2E1F0;
- context->count[0] = context->count[1] = 0;
-}
-
-/* Run your data through this. */
-
-void SHA1Update(SHA1_CTX *context, const unsigned char *data, uint32 len)
-{
- uint32 i, j;
-
- j = (context->count[0] >> 3) & 63;
- if ((context->count[0] += len << 3) < (len << 3))
- ++context->count[1];
- context->count[1] += len >> 29;
- if (j + len > 63)
- {
- memcpy(&context->buffer[j], data, (i = 64 - j));
- SHA1Transform(context->state, context->buffer);
- for (; i + 63 < len; i += 64)
- SHA1Transform(context->state, &data[i]);
- j = 0;
- }
- else
- i = 0;
- memcpy(&context->buffer[j], &data[i], len - i);
-}
-
-/* Add padding and return the message digest. */
-
-void SHA1Final(unsigned char digest[21], SHA1_CTX *context)
-{
- uint32 i;
- unsigned char finalcount[8];
-
- for (i = 0; i < 8; ++i)
- finalcount[i] = static_cast<unsigned char>((context->count[i >= 4 ? 0 : 1] >> ((3 - (i & 3)) * 8)) & 255); /* Endian independent */
- SHA1Update(context, reinterpret_cast<const unsigned char *>("\200"), 1);
- while ((context->count[0] & 504) != 448)
- SHA1Update(context, reinterpret_cast<const unsigned char *>("\0"), 1);
- SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */
- for (i = 0; i < 20; ++i)
- digest[i] = static_cast<unsigned char>((context->state[i>>2] >> ((3 - (i & 3)) * 8)) & 255);
- /* Wipe variables */
- i = 0;
- memset(context->buffer, 0, 64);
- memset(context->state, 0, 20);
- memset(context->count, 0, 8);
- memset(&finalcount, 0, 8);
- SHA1Transform(context->state, context->buffer);
-}
-
-/*****************************************************************************/
-/*****************************************************************************/
-
-/* Module stuff. */
-
-class ESHA1 : public Module
-{
- public:
- ESHA1(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, ENCRYPTION)
- {
- this->SetAuthor("Anope");
-
- Implementation i[] = { I_OnEncrypt, I_OnCheckAuthentication };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
- }
-
- EventReturn OnEncrypt(const Anope::string &src, Anope::string &dest)
- {
- SHA1_CTX context;
- char digest[21] = "";
- Anope::string buf = "sha1:";
-
- SHA1Init(&context);
- SHA1Update(&context, reinterpret_cast<const unsigned char *>(src.c_str()), src.length());
- SHA1Final(reinterpret_cast<unsigned char *>(digest), &context);
-
- buf += Anope::Hex(digest, 20);
- Log(LOG_DEBUG_2) << "(enc_sha1) hashed password from [" << src << "] to [" << buf << "]";
- dest = buf;
- return EVENT_ALLOW;
- }
-
- EventReturn OnCheckAuthentication(Command *c, CommandSource *source, const std::vector<Anope::string> &params, const Anope::string &account, const Anope::string &password)
- {
- NickAlias *na = findnick(account);
- NickCore *nc = na ? na->nc : NULL;
- if (na == NULL)
- return EVENT_CONTINUE;
-
- size_t pos = nc->pass.find(':');
- if (pos == Anope::string::npos)
- return EVENT_CONTINUE;
- Anope::string hash_method(nc->pass.begin(), nc->pass.begin() + pos);
- if (!hash_method.equals_cs("sha1"))
- return EVENT_CONTINUE;
-
- Anope::string buf;
- this->OnEncrypt(password, buf);
- if (nc->pass.equals_cs(buf))
- {
- if (ModuleManager::FindFirstOf(ENCRYPTION) != this)
- enc_encrypt(password, nc->pass);
- return EVENT_ALLOW;
- }
-
- return EVENT_CONTINUE;
- }
-};
-
-MODULE_INIT(ESHA1)
diff --git a/modules/core/enc_sha256.cpp b/modules/core/enc_sha256.cpp
deleted file mode 100644
index 3034f3731..000000000
--- a/modules/core/enc_sha256.cpp
+++ /dev/null
@@ -1,314 +0,0 @@
-/* This module generates and compares password hashes using SHA256 algorithms.
- * To help reduce the risk of dictionary attacks, the code appends random bytes
- * (so-called "salt") to the original plain text before generating hashes and
- * stores this salt appended to the result. To verify another plain text value
- * against the given hash, this module will retrieve the salt value from the
- * password string and use it when computing a new hash of the plain text.
- *
- * If an intruder gets access to your system or uses a brute force attack,
- * salt will not provide much value.
- * IMPORTANT: DATA HASHES CANNOT BE "DECRYPTED" BACK TO PLAIN TEXT.
- *
- * Modified for Anope.
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Taken from InspIRCd ( www.inspircd.org )
- * see http://wiki.inspircd.org/Credits
- *
- * This program is free but copyrighted software; see
- * the file COPYING for details.
- */
-
-/* FIPS 180-2 SHA-224/256/384/512 implementation
- * Last update: 05/23/2005
- * Issue date: 04/30/2005
- *
- * Copyright (C) 2005 Olivier Gay <olivier.gay@a3.epfl.ch>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the project nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "module.h"
-
-static const unsigned SHA256_DIGEST_SIZE = 256 / 8;
-static const unsigned SHA256_BLOCK_SIZE = 512 / 8;
-
-/** An sha256 context
- */
-class SHA256Context
-{
- public:
- unsigned tot_len;
- unsigned len;
- unsigned char block[2 * SHA256_BLOCK_SIZE];
- uint32 h[8];
-};
-
-inline static uint32 SHFR(uint32 x, uint32 n) { return x >> n; }
-inline static uint32 ROTR(uint32 x, uint32 n) { return (x >> n) | (x << ((sizeof(x) << 3) - n)); }
-inline static uint32 ROTL(uint32 x, uint32 n) { return (x << n) | (x >> ((sizeof(x) << 3) - n)); }
-inline static uint32 CH(uint32 x, uint32 y, uint32 z) { return (x & y) ^ (~x & z); }
-inline static uint32 MAJ(uint32 x, uint32 y, uint32 z) { return (x & y) ^ (x & z) ^ (y & z); }
-
-inline static uint32 SHA256_F1(uint32 x) { return ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22); }
-inline static uint32 SHA256_F2(uint32 x) { return ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25); }
-inline static uint32 SHA256_F3(uint32 x) { return ROTR(x, 7) ^ ROTR(x, 18) ^ SHFR(x, 3); }
-inline static uint32 SHA256_F4(uint32 x) { return ROTR(x, 17) ^ ROTR(x, 19) ^ SHFR(x, 10); }
-
-inline static void UNPACK32(unsigned x, unsigned char *str)
-{
- str[3] = static_cast<uint8>(x);
- str[2] = static_cast<uint8>(x >> 8);
- str[1] = static_cast<uint8>(x >> 16);
- str[0] = static_cast<uint8>(x >> 24);
-}
-
-inline static void PACK32(unsigned char *str, uint32 &x)
-{
- x = static_cast<uint32>(str[3]) | static_cast<uint32>(str[2]) << 8 | static_cast<uint32>(str[1]) << 16 | static_cast<uint32>(str[0]) << 24;
-}
-
-/* Macros used for loops unrolling */
-
-inline static void SHA256_SCR(uint32 w[64], int i)
-{
- w[i] = SHA256_F4(w[i - 2]) + w[i - 7] + SHA256_F3(w[i - 15]) + w[i - 16];
-}
-
-uint32 sha256_k[64] =
-{
- 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
- 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
- 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
- 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
- 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
- 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
- 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
- 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
- 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
- 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
- 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
- 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
- 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
- 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
- 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
- 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
-};
-
-class ESHA256 : public Module
-{
- unsigned iv[8];
- bool use_iv;
-
- /* initializes the IV with a new random value */
- void NewRandomIV()
- {
- for (int i = 0; i < 8; ++i)
- iv[i] = getrandom32();
- }
-
- /* returns the IV as base64-encrypted string */
- Anope::string GetIVString()
- {
- char buf[33];
- for (int i = 0; i < 8; ++i)
- UNPACK32(iv[i], reinterpret_cast<unsigned char *>(&buf[i << 2]));
- buf[32] = '\0';
- return Anope::Hex(buf, 32);
- }
-
- /* splits the appended IV from the password string so it can be used for the next encryption */
- /* password format: <hashmethod>:<password_b64>:<iv_b64> */
- void GetIVFromPass(const Anope::string &password)
- {
- size_t pos = password.find(':');
- Anope::string buf = password.substr(password.find(':', pos + 1) + 1, password.length());
- char buf2[33];
- Anope::Unhex(buf, buf2);
- for (int i = 0 ; i < 8; ++i)
- PACK32(reinterpret_cast<unsigned char *>(&buf2[i << 2]), iv[i]);
- }
-
- void SHA256Init(SHA256Context *ctx)
- {
- for (int i = 0; i < 8; ++i)
- ctx->h[i] = iv[i];
- ctx->len = 0;
- ctx->tot_len = 0;
- }
-
- void SHA256Transform(SHA256Context *ctx, unsigned char *message, unsigned block_nb)
- {
- uint32 w[64], wv[8];
- unsigned char *sub_block;
- for (unsigned i = 1; i <= block_nb; ++i)
- {
- int j;
- sub_block = message + ((i - 1) << 6);
-
- for (j = 0; j < 16; ++j)
- PACK32(&sub_block[j << 2], w[j]);
- for (j = 16; j < 64; ++j)
- SHA256_SCR(w, j);
- for (j = 0; j < 8; ++j)
- wv[j] = ctx->h[j];
- for (j = 0; j < 64; ++j)
- {
- uint32 t1 = wv[7] + SHA256_F2(wv[4]) + CH(wv[4], wv[5], wv[6]) + sha256_k[j] + w[j];
- uint32 t2 = SHA256_F1(wv[0]) + MAJ(wv[0], wv[1], wv[2]);
- wv[7] = wv[6];
- wv[6] = wv[5];
- wv[5] = wv[4];
- wv[4] = wv[3] + t1;
- wv[3] = wv[2];
- wv[2] = wv[1];
- wv[1] = wv[0];
- wv[0] = t1 + t2;
- }
- for (j = 0; j < 8; ++j)
- ctx->h[j] += wv[j];
- }
- }
-
- void SHA256Update(SHA256Context *ctx, const unsigned char *message, unsigned len)
- {
- /*
- * XXX here be dragons!
- * After many hours of pouring over this, I think I've found the problem.
- * When Special created our module from the reference one, he used:
- *
- * unsigned rem_len = SHA256_BLOCK_SIZE - ctx->len;
- *
- * instead of the reference's version of:
- *
- * unsigned tmp_len = SHA256_BLOCK_SIZE - ctx->len;
- * unsigned rem_len = len < tmp_len ? len : tmp_len;
- *
- * I've changed back to the reference version of this code, and it seems to work with no errors.
- * So I'm inclined to believe this was the problem..
- * -- w00t (January 06, 2008)
- */
- unsigned tmp_len = SHA256_BLOCK_SIZE - ctx->len, rem_len = len < tmp_len ? len : tmp_len;
-
- memcpy(&ctx->block[ctx->len], message, rem_len);
- if (ctx->len + len < SHA256_BLOCK_SIZE)
- {
- ctx->len += len;
- return;
- }
- unsigned new_len = len - rem_len, block_nb = new_len / SHA256_BLOCK_SIZE;
- unsigned char *shifted_message = new unsigned char[len - rem_len];
- memcpy(shifted_message, message + rem_len, len - rem_len);
- SHA256Transform(ctx, ctx->block, 1);
- SHA256Transform(ctx, shifted_message, block_nb);
- rem_len = new_len % SHA256_BLOCK_SIZE;
- memcpy(ctx->block, &shifted_message[block_nb << 6], rem_len);
- delete [] shifted_message;
- ctx->len = rem_len;
- ctx->tot_len += (block_nb + 1) << 6;
- }
-
- void SHA256Final(SHA256Context *ctx, unsigned char *digest)
- {
- unsigned block_nb = 1 + ((SHA256_BLOCK_SIZE - 9) < (ctx->len % SHA256_BLOCK_SIZE));
- unsigned len_b = (ctx->tot_len + ctx->len) << 3;
- unsigned pm_len = block_nb << 6;
- memset(ctx->block + ctx->len, 0, pm_len - ctx->len);
- ctx->block[ctx->len] = 0x80;
- UNPACK32(len_b, ctx->block + pm_len - 4);
- SHA256Transform(ctx, ctx->block, block_nb);
- for (int i = 0 ; i < 8; ++i)
- UNPACK32(ctx->h[i], &digest[i << 2]);
- }
-
-/********** ANOPE ******/
- public:
- ESHA256(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, ENCRYPTION)
- {
- this->SetAuthor("Anope");
-
- Implementation i[] = { I_OnEncrypt, I_OnCheckAuthentication };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
-
- use_iv = false;
- }
-
- EventReturn OnEncrypt(const Anope::string &src, Anope::string &dest)
- {
- char digest[SHA256_DIGEST_SIZE + 1];
- SHA256Context ctx;
- std::stringstream buf;
-
- if (!use_iv)
- NewRandomIV();
- else
- use_iv = false;
-
- SHA256Init(&ctx);
- SHA256Update(&ctx, reinterpret_cast<const unsigned char *>(src.c_str()), src.length());
- SHA256Final(&ctx, reinterpret_cast<unsigned char *>(digest));
- digest[SHA256_DIGEST_SIZE] = '\0';
- buf << "sha256:" << Anope::Hex(digest, SHA256_DIGEST_SIZE) << ":" << GetIVString();
- Log(LOG_DEBUG_2) << "(enc_sha256) hashed password from [" << src << "] to [" << buf.str() << " ]";
- dest = buf.str();
- return EVENT_ALLOW;
- }
-
- EventReturn OnCheckAuthentication(Command *c, CommandSource *source, const std::vector<Anope::string> &params, const Anope::string &account, const Anope::string &password)
- {
- NickAlias *na = findnick(account);
- NickCore *nc = na ? na->nc : NULL;
- if (na == NULL)
- return EVENT_CONTINUE;
-
- size_t pos = nc->pass.find(':');
- if (pos == Anope::string::npos)
- return EVENT_CONTINUE;
- Anope::string hash_method(nc->pass.begin(), nc->pass.begin() + pos);
- if (!hash_method.equals_cs("sha256"))
- return EVENT_CONTINUE;
-
- GetIVFromPass(nc->pass);
- use_iv = true;
- Anope::string buf;
- this->OnEncrypt(password, buf);
-
- if (nc->pass.equals_cs(buf))
- {
- /* if we are NOT the first module in the list,
- * we want to re-encrypt the pass with the new encryption
- */
- if (ModuleManager::FindFirstOf(ENCRYPTION) != this)
- enc_encrypt(password, nc->pass);
- return EVENT_ALLOW;
- }
-
- return EVENT_CONTINUE;
- }
-};
-
-MODULE_INIT(ESHA256)
diff --git a/modules/core/gl_global.cpp b/modules/core/gl_global.cpp
deleted file mode 100644
index 80c42e017..000000000
--- a/modules/core/gl_global.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/* Global core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-#include "global.h"
-
-class CommandGLGlobal : public Command
-{
- public:
- CommandGLGlobal(Module *creator) : Command(creator, "global/global", 1, 1)
- {
- this->SetDesc(_("Send a message to all users"));
- this->SetSyntax(_("\037message\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &msg = params[0];
-
- if (!global)
- source.Reply("No global reference, is gl_main loaded?");
- else
- {
- Log(LOG_ADMIN, u, this);
- global->SendGlobal(findbot(Config->Global), u->nick, msg);
- }
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows Administrators to send messages to all users on the \n"
- "network. The message will be sent from the nick \002%s\002."), source.owner->nick.c_str());
- return true;
- }
-};
-
-class GLGlobal : public Module
-{
- CommandGLGlobal commandglglobal;
-
- public:
- GLGlobal(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandglglobal(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandglglobal);
- }
-};
-
-MODULE_INIT(GLGlobal)
diff --git a/modules/core/gl_main.cpp b/modules/core/gl_main.cpp
deleted file mode 100644
index c7ccf9209..000000000
--- a/modules/core/gl_main.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Global core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-#include "global.h"
-
-class MyGlobalService : public GlobalService
-{
- void ServerGlobal(Server *s, const Anope::string &message)
- {
- if (s != Me && !s->HasFlag(SERVER_JUPED))
- notice_server(Config->Global, s, "%s", message.c_str());
- for (unsigned i = 0, j = s->GetLinks().size(); i < j; ++i)
- this->ServerGlobal(s->GetLinks()[i], message);
- }
-
- public:
- MyGlobalService(Module *m) : GlobalService(m) { }
-
- void SendGlobal(BotInfo *sender, const Anope::string &source, const Anope::string &message)
- {
- if (Me->GetLinks().empty())
- return;
-
- Anope::string rmessage;
-
- if (!source.empty() && !Config->AnonymousGlobal)
- rmessage = "[" + source + "] " + message;
- else
- rmessage = message;
-
- this->ServerGlobal(Me->GetLinks().front(), rmessage);
- }
-};
-
-class GlobalCore : public Module
-{
- MyGlobalService myglobalservice;
-
- public:
- GlobalCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- myglobalservice(this)
- {
- this->SetAuthor("Anope");
-
- BotInfo *Global = findbot(Config->Global);
- if (Global == NULL)
- throw ModuleException("No bot named " + Config->Global);
-
- ModuleManager::RegisterService(&this->myglobalservice);
-
- Implementation i[] = { I_OnRestart, I_OnShutdown, I_OnNewServer, I_OnPreHelp };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
- }
-
- void OnRestart()
- {
- if (Config->GlobalOnCycle)
- global->SendGlobal(findbot(Config->Global), "", Config->GlobalOnCycleMessage);
- }
-
- void OnShutdown()
- {
- if (Config->GlobalOnCycle)
- global->SendGlobal(findbot(Config->Global), "", Config->GlobalOnCycleMessage);
- }
-
- void OnNewServer(Server *s)
- {
- if (Config->GlobalOnCycle && !Config->GlobalOnCycleUP.empty())
- notice_server(Config->Global, s, "%s", Config->GlobalOnCycleUP.c_str());
- }
-
- void OnPreHelp(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!params.empty() || source.owner->nick != Config->Global)
- return;
- source.Reply(_("%s commands:\n"), Config->Global.c_str());
- }
-};
-
-MODULE_INIT(GlobalCore)
-
diff --git a/modules/core/global.h b/modules/core/global.h
deleted file mode 100644
index 454e879c2..000000000
--- a/modules/core/global.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef GLOBAL_H
-#define GLOBAL_H
-
-class GlobalService : public Service
-{
- public:
- GlobalService(Module *m) : Service(m, "Global") { }
-
- /** Send out a global message to all users
- * @param sender Our client which should send the global
- * @param source The sender of the global
- * @param message The message
- */
- virtual void SendGlobal(BotInfo *sender, const Anope::string &source, const Anope::string &message) = 0;
-};
-
-static service_reference<GlobalService> global("Global");
-
-#endif // GLOBAL_H
-
diff --git a/modules/core/help.cpp b/modules/core/help.cpp
deleted file mode 100644
index 2a4f25b6c..000000000
--- a/modules/core/help.cpp
+++ /dev/null
@@ -1,130 +0,0 @@
-/* Core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandHelp : public Command
-{
- public:
- CommandHelp(Module *creator) : Command(creator, "generic/help", 0)
- {
- this->SetDesc(_("Displays this list and give information about commands"));
- this->SetFlag(CFLAG_STRIP_CHANNEL);
- this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- FOREACH_MOD(I_OnPreHelp, OnPreHelp(source, params));
-
- User *u = source.u;
- BotInfo *bi = source.owner;
-
- if (params.empty())
- {
- for (BotInfo::command_map::iterator it = bi->commands.begin(), it_end = bi->commands.end(); it != it_end; ++it)
- {
- const Anope::string &c_name = it->first;
- CommandInfo &info = it->second;
-
- // Smaller command exists
- Anope::string cmd = myStrGetToken(c_name, ' ', 0);
- if (cmd != it->first && bi->commands.count(cmd))
- continue;
-
- service_reference<Command> c(info.name);
- if (!c)
- continue;
- if (!Config->HidePrivilegedCommands || info.permission.empty() || u->HasCommand(info.permission))
- {
- source.command = c_name;
- c->OnServHelp(source);
- }
- }
- }
- else
- {
- bool helped = false;
- for (unsigned max = params.size(); max > 0; --max)
- {
- Anope::string full_command;
- for (unsigned i = 0; i < max; ++i)
- full_command += " " + params[i];
- full_command.erase(full_command.begin());
-
- BotInfo::command_map::iterator it = bi->commands.find(full_command);
- if (it == bi->commands.end())
- continue;
-
- CommandInfo &info = it->second;
-
- service_reference<Command> c(info.name);
- if (!c)
- continue;
-
- if (Config->HidePrivilegedCommands && !info.permission.empty() && !u->HasCommand(info.permission))
- continue;
-
- const Anope::string &subcommand = params.size() > max ? params[max] : "";
- source.command = full_command;
- if (!c->OnHelp(source, subcommand))
- continue;
-
- helped = true;
-
- /* Inform the user what permission is required to use the command */
- if (!info.permission.empty())
- {
- source.Reply(" ");
- source.Reply(_("Access to this command requires the permission \002%s\002 to be present in your opertype."), info.permission.c_str());
- }
- if (!c->HasFlag(CFLAG_ALLOW_UNREGISTERED) && !u->IsIdentified())
- {
- if (info.permission.empty())
- source.Reply(" ");
- source.Reply( _("You need to be identified to use this command."));
- }
- /* User doesn't have the proper permission to use this command */
- else if (!info.permission.empty() && !u->HasCommand(info.permission))
- {
- source.Reply(_("You cannot use this command."));
- }
-
- break;
- }
-
- if (helped == false)
- source.Reply(_("No help available for \002%s\002."), params[0].c_str());
- }
-
- FOREACH_MOD(I_OnPostHelp, OnPostHelp(source, params));
-
- return;
- }
-};
-
-class Help : public Module
-{
- CommandHelp commandhelp;
-
- public:
- Help(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandhelp(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandhelp);
- }
-};
-
-MODULE_INIT(Help)
diff --git a/modules/core/hs_del.cpp b/modules/core/hs_del.cpp
deleted file mode 100644
index 541986aff..000000000
--- a/modules/core/hs_del.cpp
+++ /dev/null
@@ -1,107 +0,0 @@
-/* HostServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandHSDel : public Command
-{
- public:
- CommandHSDel(Module *creator) : Command(creator, "hostserv/del", 1, 1)
- {
- this->SetDesc(_("Delete the vhost of another user"));
- this->SetSyntax(_("\037nick\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &nick = params[0];
- NickAlias *na = findnick(nick);
- if (na)
- {
- Log(LOG_ADMIN, u, this) << "for user " << na->nick;
- FOREACH_MOD(I_OnDeleteVhost, OnDeleteVhost(na));
- na->hostinfo.RemoveVhost();
- source.Reply(_("Vhost for \002%s\002 removed."), nick.c_str());
- }
- else
- source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Deletes the vhost assigned to the given nick from the\n"
- "database."));
- return true;
- }
-};
-
-class CommandHSDelAll : public Command
-{
- public:
- CommandHSDelAll(Module *creator) : Command(creator, "hostserv/delall", 1, 1)
- {
- this->SetDesc(_("Delete the vhost for all nicks in a group"));
- this->SetSyntax(_("\037nick\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &nick = params[0];
- User *u = source.u;
- NickAlias *na = findnick(nick);
- if (na)
- {
- FOREACH_MOD(I_OnDeleteVhost, OnDeleteVhost(na));
- NickCore *nc = na->nc;
- for (std::list<NickAlias *>::iterator it = nc->aliases.begin(), it_end = nc->aliases.end(); it != it_end; ++it)
- {
- na = *it;
- na->hostinfo.RemoveVhost();
- }
- Log(LOG_ADMIN, u, this) << "for all nicks in group " << nc->display;
- source.Reply(_("vhosts for group \002%s\002 have been removed."), nc->display.c_str());
- }
- else
- source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Deletes the vhost for all nicks in the same group as\n"
- "that of the given nick."));
- return true;
- }
-};
-
-class HSDel : public Module
-{
- CommandHSDel commandhsdel;
- CommandHSDelAll commandhsdelall;
-
- public:
- HSDel(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandhsdel(this), commandhsdelall(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandhsdel);
- ModuleManager::RegisterService(&commandhsdelall);
- }
-};
-
-MODULE_INIT(HSDel)
diff --git a/modules/core/hs_group.cpp b/modules/core/hs_group.cpp
deleted file mode 100644
index 8d6fbd630..000000000
--- a/modules/core/hs_group.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-/* HostServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandHSGroup : public Command
-{
- void Sync(NickAlias *na)
- {
- if (!na || !na->hostinfo.HasVhost())
- return;
-
- for (std::list<NickAlias *>::iterator it = na->nc->aliases.begin(), it_end = na->nc->aliases.end(); it != it_end; ++it)
- {
- NickAlias *nick = *it;
- nick->hostinfo.SetVhost(na->hostinfo.GetIdent(), na->hostinfo.GetHost(), na->hostinfo.GetCreator());
- }
- }
-
- public:
- CommandHSGroup(Module *creator) : Command(creator, "hostserv/group", 0, 0)
- {
- this->SetDesc(_("Syncs the vhost for all nicks in a group"));
- this->SetSyntax("");
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- NickAlias *na = findnick(u->nick);
- if (na && u->Account() == na->nc && na->hostinfo.HasVhost())
- {
- this->Sync(na);
- if (!na->hostinfo.GetIdent().empty())
- source.Reply(_("All vhost's in the group \002%s\002 have been set to \002%s\002@\002%s\002"), u->Account()->display.c_str(), na->hostinfo.GetIdent().c_str(), na->hostinfo.GetHost().c_str());
- else
- source.Reply(_("All vhost's in the group \002%s\002 have been set to \002%s\002"), u->Account()->display.c_str(), na->hostinfo.GetHost().c_str());
- }
- else
- source.Reply(HOST_NOT_ASSIGNED);
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("This command allows users to set the vhost of their\n"
- "CURRENT nick to be the vhost for all nicks in the same\n"
- "group."));
- return true;
- }
-};
-
-class HSGroup : public Module
-{
- CommandHSGroup commandhsgroup;
-
- public:
- HSGroup(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandhsgroup(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandhsgroup);
- }
-};
-
-MODULE_INIT(HSGroup)
diff --git a/modules/core/hs_list.cpp b/modules/core/hs_list.cpp
deleted file mode 100644
index 589eef3e1..000000000
--- a/modules/core/hs_list.cpp
+++ /dev/null
@@ -1,137 +0,0 @@
-/* HostServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandHSList : public Command
-{
- public:
- CommandHSList(Module *creator) : Command(creator, "hostserv/list", 0, 1)
- {
- this->SetDesc(_("Displays one or more vhost entries."));
- this->SetSyntax(_("\002[<key>|<#X-Y>]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &key = !params.empty() ? params[0] : "";
- int from = 0, to = 0, counter = 1;
- unsigned display_counter = 0;
-
- /**
- * Do a check for a range here, then in the next loop
- * we'll only display what has been requested..
- **/
- if (!key.empty() && key[0] == '#')
- {
- size_t tmp = key.find('-');
- if (tmp == Anope::string::npos || tmp == key.length() || tmp == 1)
- {
- source.Reply(LIST_INCORRECT_RANGE);
- return;
- }
- for (unsigned i = 1, end = key.length(); i < end; ++i)
- {
- if (!isdigit(key[i]) && i != tmp)
- {
- source.Reply(LIST_INCORRECT_RANGE);
- return;
- }
- try
- {
- from = convertTo<int>(key.substr(1, tmp - 1));
- to = convertTo<int>(key.substr(tmp + 1));
- }
- catch (const ConvertException &) { }
- }
- }
-
- for (nickalias_map::const_iterator it = NickAliasList.begin(), it_end = NickAliasList.end(); it != it_end; ++it)
- {
- NickAlias *na = it->second;
-
- if (!na->hostinfo.HasVhost())
- continue;
-
- if (!key.empty() && key[0] != '#')
- {
- if ((Anope::Match(na->nick, key) || Anope::Match(na->hostinfo.GetHost(), key)) && display_counter < Config->NSListMax)
- {
- ++display_counter;
- if (!na->hostinfo.GetIdent().empty())
- source.Reply(_("#%d Nick:\002%s\002, vhost:\002%s\002@\002%s\002 (%s - %s)"), 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
- source.Reply(_("#%d Nick:\002%s\002, vhost:\002%s\002 (%s - %s)"), counter, na->nick.c_str(), na->hostinfo.GetHost().c_str(), na->hostinfo.GetCreator().c_str(), do_strftime(na->hostinfo.GetTime()).c_str());
- }
- }
- else
- {
- /**
- * List the host if its in the display range, and not more
- * than NSListMax records have been displayed...
- **/
- if (((counter >= from && counter <= to) || (!from && !to)) && display_counter < Config->NSListMax)
- {
- ++display_counter;
- if (!na->hostinfo.GetIdent().empty())
- source.Reply(_("#%d Nick:\002%s\002, vhost:\002%s\002@\002%s\002 (%s - %s)"), 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
- source.Reply(_("#%d Nick:\002%s\002, vhost:\002%s\002 (%s - %s)"), 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())
- source.Reply(_("Displayed records matching key \002%s\002 (Count: \002%d\002)"), key.c_str(), display_counter);
- else
- {
- if (from)
- source.Reply(_("Displayed records from \002%d\002 to \002%d\002"), from, to);
- else
- source.Reply(_("Displayed all records (Count: \002%d\002)"), display_counter);
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("This command lists registered vhosts to the operator\n"
- "if a Key is specified, only entries whos nick or vhost match\n"
- "the pattern given in <key> are displayed e.g. Rob* for all\n"
- "entries beginning with \"Rob\"\n"
- "If a #X-Y style is used, only entries between the range of X\n"
- "and Y will be displayed, e.g. #1-3 will display the first 3\n"
- "nick/vhost entries.\n"
- "The list uses the value of NSListMax as a hard limit for the\n"
- "number of items to display to a operator at any 1 time."));
- return true;
- }
-};
-
-class HSList : public Module
-{
- CommandHSList commandhslist;
-
- public:
- HSList(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandhslist(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandhslist);
- }
-};
-
-MODULE_INIT(HSList)
diff --git a/modules/core/hs_main.cpp b/modules/core/hs_main.cpp
deleted file mode 100644
index a6cc6bbb7..000000000
--- a/modules/core/hs_main.cpp
+++ /dev/null
@@ -1,85 +0,0 @@
-/* HostServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class HostServCore : public Module
-{
- public:
- HostServCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE)
- {
- this->SetAuthor("Anope");
-
- if (!ircd || !ircd->vhost)
- throw ModuleException("Your IRCd does not suppor vhosts");
-
- BotInfo *HostServ = findbot(Config->HostServ);
- if (HostServ == NULL)
- throw ModuleException("No bot named " + Config->HostServ);
-
- Implementation i[] = { I_OnNickIdentify, I_OnNickUpdate, I_OnPreHelp };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
- }
-
- void OnNickIdentify(User *u)
- {
- HostInfo *ho = NULL;
- NickAlias *na = findnick(u->nick);
- if (na && na->hostinfo.HasVhost())
- ho = &na->hostinfo;
- else
- {
- na = findnick(u->Account()->display);
- if (na && na->hostinfo.HasVhost())
- ho = &na->hostinfo;
- }
- if (ho == NULL)
- return;
-
- if (u->vhost.empty() || !u->vhost.equals_cs(na->hostinfo.GetHost()) || (!na->hostinfo.GetIdent().empty() && !u->GetVIdent().equals_cs(na->hostinfo.GetIdent())))
- {
- ircdproto->SendVhost(u, na->hostinfo.GetIdent(), na->hostinfo.GetHost());
- if (ircd->vhost)
- {
- u->vhost = na->hostinfo.GetHost();
- u->UpdateHost();
- }
- if (ircd->vident && !na->hostinfo.GetIdent().empty())
- u->SetVIdent(na->hostinfo.GetIdent());
-
- BotInfo *bi = findbot(Config->HostServ);
- if (bi)
- {
- if (!na->hostinfo.GetIdent().empty())
- u->SendMessage(bi, _("Your vhost of \002%s\002@\002%s\002 is now activated."), na->hostinfo.GetIdent().c_str(), na->hostinfo.GetHost().c_str());
- else
- u->SendMessage(bi, _("Your vhost of \002%s\002 is now activated."), na->hostinfo.GetHost().c_str());
- }
- }
- }
-
- void OnNickUpdate(User *u)
- {
- this->OnNickIdentify(u);
- }
-
- void OnPreHelp(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!params.empty() || source.owner->nick != Config->HostServ)
- return;
- source.Reply(_("%s commands:\n"), Config->HostServ.c_str());
- }
-};
-
-MODULE_INIT(HostServCore)
-
diff --git a/modules/core/hs_off.cpp b/modules/core/hs_off.cpp
deleted file mode 100644
index a3f11c2bd..000000000
--- a/modules/core/hs_off.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-/* HostServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandHSOff : public Command
-{
- public:
- CommandHSOff(Module *creator) : Command(creator, "hostserv/off", 0, 0)
- {
- this->SetDesc(_("Deactivates your assigned vhost"));
- this->SetSyntax("");
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- NickAlias *na = findnick(u->nick);
-
- if (!na || !na->hostinfo.HasVhost())
- source.Reply(HOST_NOT_ASSIGNED);
- else
- {
- ircdproto->SendVhostDel(u);
- Log(LOG_COMMAND, u, this) << "to disable their vhost";
- source.Reply(_("Your vhost was removed and the normal cloaking restored."));
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Deactivates the vhost currently assigned to the nick in use.\n"
- "When you use this command any user who performs a /whois\n"
- "on you will see your real IP address."));
- return true;
- }
-};
-
-class HSOff : public Module
-{
- CommandHSOff commandhsoff;
-
- public:
- HSOff(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandhsoff(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandhsoff);
- }
-};
-
-MODULE_INIT(HSOff)
diff --git a/modules/core/hs_on.cpp b/modules/core/hs_on.cpp
deleted file mode 100644
index 0ba124ba1..000000000
--- a/modules/core/hs_on.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/* HostServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandHSOn : public Command
-{
- public:
- CommandHSOn(Module *creator) : Command(creator, "hostserv/on", 0, 0)
- {
- this->SetDesc(_("Activates your assigned vhost"));
- this->SetSyntax("");
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- NickAlias *na = findnick(u->nick);
- if (na && u->Account() == na->nc && na->hostinfo.HasVhost())
- {
- if (!na->hostinfo.GetIdent().empty())
- source.Reply(_("Your vhost of \002%s\002@\002%s\002 is now activated."), na->hostinfo.GetIdent().c_str(), na->hostinfo.GetHost().c_str());
- else
- source.Reply(_("Your vhost of \002%s\002 is now 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)
- u->vhost = na->hostinfo.GetHost();
- if (ircd->vident)
- {
- if (!na->hostinfo.GetIdent().empty())
- u->SetVIdent(na->hostinfo.GetIdent());
- }
- u->UpdateHost();
- }
- else
- source.Reply(HOST_NOT_ASSIGNED);
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Activates the vhost currently assigned to the nick in use.\n"
- "When you use this command any user who performs a /whois\n"
- "on you will see the vhost instead of your real IP address."));
- return true;
- }
-};
-
-class HSOn : public Module
-{
- CommandHSOn commandhson;
-
- public:
- HSOn(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandhson(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandhson);
- }
-};
-
-MODULE_INIT(HSOn)
diff --git a/modules/core/hs_set.cpp b/modules/core/hs_set.cpp
deleted file mode 100644
index 4711022db..000000000
--- a/modules/core/hs_set.cpp
+++ /dev/null
@@ -1,236 +0,0 @@
-/* HostServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandHSSet : public Command
-{
- public:
- CommandHSSet(Module *creator) : Command(creator, "hostserv/set", 2, 2)
- {
- this->SetDesc(_("Set the vhost of another user"));
- this->SetSyntax(_("\037nick\037 \037hostmask\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- const Anope::string &nick = params[0];
-
- NickAlias *na = findnick(nick);
- if (na == NULL)
- {
- source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
- return;
- }
-
- Anope::string rawhostmask = params[1];
-
- Anope::string user, host;
- size_t a = rawhostmask.find('@');
-
- if (a == Anope::string::npos)
- host = rawhostmask;
- else
- {
- user = rawhostmask.substr(0, a);
- host = rawhostmask.substr(a + 1);
- }
-
- if (host.empty())
- {
- this->OnSyntaxError(source, "");
- return;
- }
-
- if (!user.empty())
- {
- if (user.length() > Config->UserLen)
- {
- source.Reply(HOST_SET_IDENTTOOLONG, Config->UserLen);
- return;
- }
- else if (!ircd->vident)
- {
- source.Reply(HOST_NO_VIDENT);
- return;
- }
- for (Anope::string::iterator s = user.begin(), s_end = user.end(); s != s_end; ++s)
- if (!isvalidchar(*s))
- {
- source.Reply(HOST_SET_IDENT_ERROR);
- return;
- }
- }
-
- if (host.length() > Config->HostLen)
- {
- source.Reply(HOST_SET_TOOLONG, Config->HostLen);
- return;
- }
-
- if (!isValidHost(host, 3))
- {
- source.Reply(HOST_SET_ERROR);
- return;
- }
-
- Log(LOG_ADMIN, u, this) << "to set the vhost of " << na->nick << " to " << (!user.empty() ? user + "@" : "") << host;
-
- na->hostinfo.SetVhost(user, host, u->nick);
- FOREACH_MOD(I_OnSetVhost, OnSetVhost(na));
- if (!user.empty())
- source.Reply(_("VHost for \002%s\002 set to \002%s\002@\002%s\002."), nick.c_str(), user.c_str(), host.c_str());
- else
- source.Reply(_("VHost for \002%s\002 set to \002%s\002."), nick.c_str(), host.c_str());
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Sets the vhost for the given nick to that of the given\n"
- "hostmask. If your IRCD supports vIdents, then using\n"
- "SET <nick> <ident>@<hostmask> set idents for users as \n"
- "well as vhosts."));
- return true;
- }
-};
-
-class CommandHSSetAll : public Command
-{
- void Sync(NickAlias *na)
- {
- if (!na || !na->hostinfo.HasVhost())
- return;
-
- for (std::list<NickAlias *>::iterator it = na->nc->aliases.begin(), it_end = na->nc->aliases.end(); it != it_end; ++it)
- {
- NickAlias *nick = *it;
- nick->hostinfo.SetVhost(na->hostinfo.GetIdent(), na->hostinfo.GetHost(), na->hostinfo.GetCreator());
- }
- }
-
- public:
- CommandHSSetAll(Module *creator) : Command(creator, "hostserv/setall", 2, 2)
- {
- this->SetDesc(_("Set the vhost for all nicks in a group"));
- this->SetSyntax(_("\037nick\037 \037hostmask>\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- Anope::string nick = params[0];
-
- NickAlias *na = findnick(nick);
- if (na == NULL)
- {
- source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
- return;
- }
-
- Anope::string rawhostmask = params[1];
-
- Anope::string user, host;
- size_t a = rawhostmask.find('@');
-
- if (a == Anope::string::npos)
- host = rawhostmask;
- else
- {
- user = rawhostmask.substr(0, a);
- host = rawhostmask.substr(a + 1);
- }
-
- if (host.empty())
- {
- this->OnSyntaxError(source, "");
- return;
- }
-
- if (!user.empty())
- {
- if (user.length() > Config->UserLen)
- {
- source.Reply(HOST_SET_IDENTTOOLONG, Config->UserLen);
- return;
- }
- else if (!ircd->vident)
- {
- source.Reply(HOST_NO_VIDENT);
- return;
- }
- for (Anope::string::iterator s = user.begin(), s_end = user.end(); s != s_end; ++s)
- if (!isvalidchar(*s))
- {
- source.Reply(HOST_SET_IDENT_ERROR);
- return;
- }
- }
-
- if (host.length() > Config->HostLen)
- {
- source.Reply(HOST_SET_TOOLONG, Config->HostLen);
- return;
- }
-
- if (!isValidHost(host, 3))
- {
- source.Reply(HOST_SET_ERROR);
- return;
- }
-
- Log(LOG_ADMIN, u, this) << "to set the vhost of " << na->nick << " to " << (!user.empty() ? user + "@" : "") << host;
-
- na->hostinfo.SetVhost(user, host, u->nick);
- this->Sync(na);
- FOREACH_MOD(I_OnSetVhost, OnSetVhost(na));
- if (!user.empty())
- source.Reply(_("VHost for group \002%s\002 set to \002%s\002@\002%s\002."), nick.c_str(), user.c_str(), host.c_str());
- else
- source.Reply(_("VHost for group \002%s\002 set to \002%s\002."), nick.c_str(), host.c_str());
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Sets the vhost for all nicks in the same group as that\n"
- "of the given nick. If your IRCD supports vIdents, then\n"
- "using SETALL <nick> <ident>@<hostmask> will set idents\n"
- "for users as well as vhosts.\n"
- "* NOTE, this will not update the vhost for any nicks\n"
- "added to the group after this command was used."));
- return true;
- }
-};
-
-class HSSet : public Module
-{
- CommandHSSet commandhsset;
- CommandHSSetAll commandhssetall;
-
- public:
- HSSet(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE), commandhsset(this), commandhssetall(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandhsset);
- ModuleManager::RegisterService(&commandhssetall);
- }
-};
-
-MODULE_INIT(HSSet)
diff --git a/modules/core/memoserv.h b/modules/core/memoserv.h
deleted file mode 100644
index 0bf0c79ca..000000000
--- a/modules/core/memoserv.h
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef MEMOSERV_H
-#define MEMOSERV_H
-
-class MemoServService : public Service
-{
- public:
- enum MemoResult
- {
- MEMO_SUCCESS,
- MEMO_INVALID_TARGET,
- MEMO_TOO_FAST,
- MEMO_TARGET_FULL
- };
-
- MemoServService(Module *m) : Service(m, "MemoServ") { }
-
- /** Retrieve the memo info for a nick or channel
- * @param target Target
- * @param ischan Set to true if target is a channel
- * @return A memoinfo structure or NULL
- */
- virtual MemoInfo *GetMemoInfo(const Anope::string &target, bool &ischan) = 0;
-
- /** Sends a memo.
- * @param source The source of the memo, can be anythin.
- * @param target The target of the memo, nick or channel.
- * @param message Memo text
- * @param force true to force the memo, restrictions/delays etc are not checked
- */
- virtual MemoResult Send(const Anope::string &source, const Anope::string &target, const Anope::string &message, bool force = false) = 0;
-
- /** Check for new memos and notify the user if there are any
- * @param u The user
- */
- virtual void Check(User *u) = 0;
-};
-
-static service_reference<MemoServService> memoserv("MemoServ");
-
-#endif // MEMOSERV_H
-
diff --git a/modules/core/ms_cancel.cpp b/modules/core/ms_cancel.cpp
deleted file mode 100644
index e5beffa10..000000000
--- a/modules/core/ms_cancel.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/* MemoServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-#include "memoserv.h"
-
-class CommandMSCancel : public Command
-{
- public:
- CommandMSCancel(Module *creator) : Command(creator, "memoserv/cancel", 1, 1)
- {
- this->SetDesc(_("Cancel the last memo you sent"));
- this->SetSyntax(_("{\037nick\037 | \037channel\037}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- const Anope::string &nname = params[0];
-
- bool ischan;
- MemoInfo *mi = memoserv->GetMemoInfo(nname, ischan);
-
- if (mi == NULL)
- source.Reply(ischan ? CHAN_X_NOT_REGISTERED : _(NICK_X_NOT_REGISTERED), nname.c_str());
- else
- {
- 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))
- {
- FOREACH_MOD(I_OnMemoDel, OnMemoDel(findnick(nname)->nc, mi, mi->memos[i]));
- mi->Del(mi->memos[i]);
- source.Reply(_("Last memo to \002%s\002 has been cancelled."), nname.c_str());
- return;
- }
-
- source.Reply(_("No memo was cancelable."));
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Cancels the last memo you sent to the given nick or channel,\n"
- "provided it has not been read at the time you use the command."));
- return true;
- }
-};
-
-class MSCancel : public Module
-{
- CommandMSCancel commandmscancel;
-
- public:
- MSCancel(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandmscancel(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandmscancel);
- }
-};
-
-MODULE_INIT(MSCancel)
diff --git a/modules/core/ms_check.cpp b/modules/core/ms_check.cpp
deleted file mode 100644
index 3019e270f..000000000
--- a/modules/core/ms_check.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-/* MemoServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandMSCheck : public Command
-{
- public:
- CommandMSCheck(Module *creator) : Command(creator, "memoserv/check", 1, 1)
- {
- this->SetDesc(_("Checks if last memo to a nick was read"));
- this->SetSyntax(_("\037nick\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- const Anope::string &recipient = params[0];
-
- bool found = false;
-
- NickAlias *na = findnick(recipient);
- if (!na)
- {
- source.Reply(NICK_X_NOT_REGISTERED, recipient.c_str());
- return;
- }
-
- 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 (int i = mi->memos.size() - 1; i >= 0; --i)
- {
- if (u->Account()->display.equals_ci(mi->memos[i]->sender))
- {
- found = true; /* Yes, we've found the memo */
-
- if (mi->memos[i]->HasFlag(MF_UNREAD))
- source.Reply(_("The last memo you sent to %s (sent on %s) has not yet been read."), na->nick.c_str(), do_strftime(mi->memos[i]->time).c_str());
- else
- source.Reply(_("The last memo you sent to %s (sent on %s) has been read."), na->nick.c_str(), do_strftime(mi->memos[i]->time).c_str());
- break;
- }
- }
-
- if (!found)
- source.Reply(_("Nick %s doesn't have a memo from you."), na->nick.c_str());
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Checks whether the _last_ memo you sent to \037nick\037 has been read\n"
- "or not. Note that this does only work with nicks, not with chans."));
- return true;
- }
-};
-
-class MSCheck : public Module
-{
- CommandMSCheck commandmscheck;
-
- public:
- MSCheck(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandmscheck(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandmscheck);
- }
-};
-
-MODULE_INIT(MSCheck)
diff --git a/modules/core/ms_del.cpp b/modules/core/ms_del.cpp
deleted file mode 100644
index 991adff2b..000000000
--- a/modules/core/ms_del.cpp
+++ /dev/null
@@ -1,163 +0,0 @@
-/* MemoServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class MemoDelCallback : public NumberList
-{
- CommandSource &source;
- ChannelInfo *ci;
- MemoInfo *mi;
- public:
- MemoDelCallback(CommandSource &_source, ChannelInfo *_ci, MemoInfo *_mi, const Anope::string &list) : NumberList(list, true), source(_source), ci(_ci), mi(_mi)
- {
- }
-
- void HandleNumber(unsigned Number)
- {
- if (!Number || Number > mi->memos.size())
- return;
-
- if (ci)
- FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->memos[Number - 1]));
- else
- FOREACH_MOD(I_OnMemoDel, OnMemoDel(source.u->Account(), mi, mi->memos[Number - 1]));
-
- mi->Del(Number - 1);
- source.Reply(_("Memo %d has been deleted."), Number);
- }
-};
-
-class CommandMSDel : public Command
-{
- public:
- CommandMSDel(Module *creator) : Command(creator, "memoserv/del", 0, 2)
- {
- this->SetDesc(_("Delete a memo or memos"));
- this->SetSyntax(_("[\037channel\037] {\037num\037 | \037list\037 | LAST | ALL}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- MemoInfo *mi;
- ChannelInfo *ci = NULL;
- Anope::string numstr = !params.empty() ? params[0] : "", chan;
-
- if (!numstr.empty() && numstr[0] == '#')
- {
- chan = numstr;
- numstr = params.size() > 1 ? params[1] : "";
-
- if (!(ci = cs_findchan(chan)))
- {
- source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
- return;
- }
- else if (readonly)
- {
- source.Reply(READ_ONLY_MODE);
- return;
- }
- else if (!ci->HasPriv(u, CA_MEMO))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
- mi = &ci->memos;
- }
- else
- mi = &u->Account()->memos;
- if (numstr.empty() || (!isdigit(numstr[0]) && !numstr.equals_ci("ALL") && !numstr.equals_ci("LAST")))
- this->OnSyntaxError(source, numstr);
- else if (mi->memos.empty())
- {
- if (!chan.empty())
- source.Reply(MEMO_X_HAS_NO_MEMOS, chan.c_str());
- else
- source.Reply(MEMO_HAVE_NO_MEMOS);
- }
- else
- {
- if (isdigit(numstr[0]))
- {
- MemoDelCallback list(source, ci, mi, numstr);
- list.Process();
- }
- else if (numstr.equals_ci("LAST"))
- {
- /* Delete last memo. */
- if (ci)
- FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->memos[mi->memos.size() - 1]));
- else
- FOREACH_MOD(I_OnMemoDel, OnMemoDel(u->Account(), mi, mi->memos[mi->memos.size() - 1]));
- mi->Del(mi->memos[mi->memos.size() - 1]);
- source.Reply(_("Memo %d has been deleted."), mi->memos.size() + 1);
- }
- else
- {
- if (ci)
- FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, NULL));
- else
- FOREACH_MOD(I_OnMemoDel, OnMemoDel(u->Account(), mi, NULL));
- /* Delete all memos. */
- for (unsigned i = 0, end = mi->memos.size(); i < end; ++i)
- delete mi->memos[i];
- mi->memos.clear();
- if (!chan.empty())
- source.Reply(_("All memos for channel %s have been deleted."), chan.c_str());
- else
- source.Reply(_("All of your memos have been deleted."));
- }
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Deletes the specified memo or memos. You can supply\n"
- "multiple memo numbers or ranges of numbers instead of a\n"
- "single number, as in the second example below.\n"
- " \n"
- "If \002LAST\002 is given, the last memo will be deleted.\n"
- "If \002ALL\002 is given, deletes all of your memos.\n"
- " \n"
- "Examples:\n"
- " \n"
- " \002DEL 1\002\n"
- " Deletes your first memo.\n"
- " \n"
- " \002DEL 2-5,7-9\002\n"
- " Deletes memos numbered 2 through 5 and 7 through 9."));
- return true;
- }
-};
-
-class MSDel : public Module
-{
- CommandMSDel commandmsdel;
-
- public:
- MSDel(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandmsdel(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandmsdel);
- }
-};
-
-MODULE_INIT(MSDel)
diff --git a/modules/core/ms_ignore.cpp b/modules/core/ms_ignore.cpp
deleted file mode 100644
index c8b9c19e6..000000000
--- a/modules/core/ms_ignore.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-/* MemoServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-#include "memoserv.h"
-
-class CommandMSIgnore : public Command
-{
- public:
- CommandMSIgnore(Module *creator) : Command(creator, "memoserv/ignore", 1, 3)
- {
- this->SetDesc(_("Manage your memo ignore list"));
- this->SetSyntax(_("[\037channel\037] {\002ADD|DEL|LIST\002} [\037entry\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- Anope::string channel = params[0];
- Anope::string command = (params.size() > 1 ? params[1] : "");
- Anope::string param = (params.size() > 2 ? params[2] : "");
-
- if (channel[0] != '#')
- {
- param = command;
- command = channel;
- channel = u->nick;
- }
-
- bool ischan;
- MemoInfo *mi = memoserv->GetMemoInfo(channel, ischan);
- if (!mi)
- source.Reply(ischan ? CHAN_X_NOT_REGISTERED : _(NICK_X_NOT_REGISTERED), channel.c_str());
- else if (ischan && !cs_findchan(channel)->HasPriv(u, CA_MEMO))
- 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());
- source.Reply(_("\002%s\002 added to your ignore list."), param.c_str());
- }
- else
- source.Reply(_("\002%s\002 is already on your ignore list."), param.c_str());
- }
- else if (command.equals_ci("DEL") && !param.empty())
- {
- std::vector<Anope::string>::iterator it = std::find(mi->ignores.begin(), mi->ignores.end(), param.ci_str());
-
- if (it != mi->ignores.end())
- {
- mi->ignores.erase(it);
- source.Reply(_("\002%s\002 removed from your ignore list."), param.c_str());
- }
- else
- source.Reply(_("\002%s\002 is not on your ignore list."), param.c_str());
- }
- else if (command.equals_ci("LIST"))
- {
- if (mi->ignores.empty())
- source.Reply(_("Your memo ignore list is empty."));
- else
- {
- source.Reply(_("Ignore list:"));
- for (unsigned i = 0; i < mi->ignores.size(); ++i)
- source.Reply(" %s", mi->ignores[i].c_str());
- }
- }
- else
- this->OnSyntaxError(source, "");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows you to ignore users by nick or host from memoing you. If someone on your\n"
- "memo ignore list tries to memo you, they will not be told that you have them ignored."));
- return true;
- }
-};
-
-class MSIgnore : public Module
-{
- CommandMSIgnore commandmsignore;
-
- public:
- MSIgnore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandmsignore(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandmsignore);
- }
-};
-
-MODULE_INIT(MSIgnore)
diff --git a/modules/core/ms_info.cpp b/modules/core/ms_info.cpp
deleted file mode 100644
index 9fdb467c9..000000000
--- a/modules/core/ms_info.cpp
+++ /dev/null
@@ -1,219 +0,0 @@
-/* MemoServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandMSInfo : public Command
-{
- public:
- CommandMSInfo(Module *creator) : Command(creator, "memoserv/info", 0, 1)
- {
- this->SetDesc(_("Displays information about your memos"));
- this->SetSyntax(_("[\037nick\037 | \037channel\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- const MemoInfo *mi;
- NickAlias *na = NULL;
- ChannelInfo *ci = NULL;
- const Anope::string &nname = !params.empty() ? params[0] : "";
- int hardmax = 0;
-
- if (!nname.empty() && nname[0] != '#' && u->HasPriv("memoserv/info"))
- {
- na = findnick(nname);
- if (!na)
- {
- source.Reply(NICK_X_NOT_REGISTERED, nname.c_str());
- return;
- }
- mi = &na->nc->memos;
- hardmax = na->nc->HasFlag(NI_MEMO_HARDMAX) ? 1 : 0;
- }
- else if (!nname.empty() && nname[0] == '#')
- {
- if (!(ci = cs_findchan(nname)))
- {
- source.Reply(CHAN_X_NOT_REGISTERED, nname.c_str());
- return;
- }
- else if (!ci->HasPriv(u, CA_MEMO))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
- mi = &ci->memos;
- hardmax = ci->HasFlag(CI_MEMO_HARDMAX) ? 1 : 0;
- }
- else if (!nname.empty()) /* It's not a chan and we aren't services admin */
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
- else
- {
- mi = &u->Account()->memos;
- hardmax = u->Account()->HasFlag(NI_MEMO_HARDMAX) ? 1 : 0;
- }
-
- if (!nname.empty() && (ci || na->nc != u->Account()))
- {
- if (mi->memos.empty())
- source.Reply(_("%s currently has no memos."), nname.c_str());
- else if (mi->memos.size() == 1)
- {
- if (mi->memos[0]->HasFlag(MF_UNREAD))
- source.Reply(_("%s currently has \0021\002 memo, and it has not yet been read."), nname.c_str());
- else
- source.Reply(_("%s currently has \0021\002 memo."), nname.c_str());
- }
- else
- {
- unsigned count = 0, i, end;
- for (i = 0, end = mi->memos.size(); i < end; ++i)
- if (mi->memos[i]->HasFlag(MF_UNREAD))
- ++count;
- if (count == mi->memos.size())
- source.Reply(_("%s currently has \002%d\002 memos; all of them are unread."), nname.c_str(), count);
- else if (!count)
- source.Reply(_("%s currently has \002%d\002 memos."), nname.c_str(), mi->memos.size());
- else if (count == 1)
- source.Reply(_("%s currently has \002%d\002 memos, of which \0021\002 is unread."), nname.c_str(), mi->memos.size());
- else
- source.Reply(_("%s currently has \002%d\002 memos, of which \002%d\002 are unread."), nname.c_str(), mi->memos.size(), count);
- }
- if (!mi->memomax)
- {
- if (hardmax)
- source.Reply(_("%s's memo limit is \002%d\002, and may not be changed."), nname.c_str(), mi->memomax);
- else
- source.Reply(_("%s's memo limit is \002%d\002."), nname.c_str(), mi->memomax);
- }
- else if (mi->memomax > 0)
- {
- if (hardmax)
- source.Reply(_("%s's memo limit is \002%d\002, and may not be changed."), nname.c_str(), mi->memomax);
- else
- source.Reply(_("%s's memo limit is \002%d\002."), nname.c_str(), mi->memomax);
- }
- else
- source.Reply(_("%s has no memo 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))
- source.Reply(_("%s is notified of new memos at logon and when they arrive."), nname.c_str());
- else if (na->nc->HasFlag(NI_MEMO_RECEIVE))
- source.Reply(_("%s is notified when new memos arrive."), nname.c_str());
- else if (na->nc->HasFlag(NI_MEMO_SIGNON))
- source.Reply(_("%s is notified of news memos at logon."), nname.c_str());
- else
- source.Reply(_("%s is not notified of new memos."), nname.c_str());
- }
- }
- else /* !nname || (!ci || na->nc == u->Account()) */
- {
- if (mi->memos.empty())
- source.Reply(_("You currently have no memos."));
- else if (mi->memos.size() == 1)
- {
- if (mi->memos[0]->HasFlag(MF_UNREAD))
- source.Reply(_("You currently have \0021\002 memo, and it has not yet been read."));
- else
- source.Reply(_("You currently have \0021\002 memo."));
- }
- else
- {
- unsigned count = 0, i, end;
- for (i = 0, end = mi->memos.size(); i < end; ++i)
- if (mi->memos[i]->HasFlag(MF_UNREAD))
- ++count;
- if (count == mi->memos.size())
- source.Reply(_("You currently have \002%d\002 memos; all of them are unread."), count);
- else if (!count)
- source.Reply(_("You currently have \002%d\002 memos."), mi->memos.size());
- else if (count == 1)
- source.Reply(_("You currently have \002%d\002 memos, of which \0021\002 is unread."), mi->memos.size());
- else
- source.Reply(_("You currently have \002%d\002 memos, of which \002%d\002 are unread."), mi->memos.size(), count);
- }
-
- if (!mi->memomax)
- {
- if (!u->IsServicesOper() && hardmax)
- source.Reply(_("Your memo limit is \0020\002; you will not receive any new memos. You cannot change this limit."));
- else
- source.Reply(_("Your memo limit is \0020\002; you will not receive any new memos."));
- }
- else if (mi->memomax > 0)
- {
- if (!u->IsServicesOper() && hardmax)
- source.Reply(_("Your memo limit is \002%d\002, and may not be changed."), mi->memomax);
- else
- source.Reply(_("Your memo limit is \002%d\002."), mi->memomax);
- }
- else
- source.Reply(_("You have no limit on the number of memos you may keep."));
-
- /* Ripped too. But differently because of a seg fault (loughs) */
- if (u->Account()->HasFlag(NI_MEMO_RECEIVE) && u->Account()->HasFlag(NI_MEMO_SIGNON))
- source.Reply(_("You will be notified of new memos at logon and when they arrive."));
- else if (u->Account()->HasFlag(NI_MEMO_RECEIVE))
- source.Reply(_("You will be notified when new memos arrive."));
- else if (u->Account()->HasFlag(NI_MEMO_SIGNON))
- source.Reply(_("You will be notified of new memos at logon."));
- else
- source.Reply(_("You will not be notified of new memos."));
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Without a parameter, displays information on the number of\n"
- "memos you have, how many of them are unread, and how many\n"
- "total memos you can receive.\n"
- " \n"
- "With a channel parameter, displays the same information for\n"
- "the given channel.\n"
- " \n"
- "With a nickname parameter, displays the same information\n"
- "for the given nickname. This use limited to \002Services\n"
- "Operators\002."));
-
- return true;
- }
-};
-
-class MSInfo : public Module
-{
- CommandMSInfo commandmsinfo;
-
- public:
- MSInfo(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandmsinfo(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandmsinfo);
- }
-};
-
-MODULE_INIT(MSInfo)
diff --git a/modules/core/ms_list.cpp b/modules/core/ms_list.cpp
deleted file mode 100644
index 26821a413..000000000
--- a/modules/core/ms_list.cpp
+++ /dev/null
@@ -1,168 +0,0 @@
-/* MemoServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class MemoListCallback : public NumberList
-{
- CommandSource &source;
- ChannelInfo *ci;
- const MemoInfo *mi;
- bool SentHeader;
- public:
- MemoListCallback(CommandSource &_source, ChannelInfo *_ci, const MemoInfo *_mi, const Anope::string &list) : NumberList(list, false), source(_source), ci(_ci), mi(_mi), SentHeader(false)
- {
- }
-
- void HandleNumber(unsigned Number)
- {
- if (!Number || Number > mi->memos.size())
- return;
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Memos for %s:"), ci ? ci->name.c_str() : source.u->nick.c_str());
- source.Reply(_(" Num Sender Date/Time"));
- }
-
- DoList(source, mi, Number - 1);
- }
-
- static void DoList(CommandSource &source, const MemoInfo *mi, unsigned index)
- {
- Memo *m = mi->memos[index];
- source.Reply(_("%c%3d %-16s %s"), (m->HasFlag(MF_UNREAD)) ? '*' : ' ', index + 1, m->sender.c_str(), do_strftime(m->time).c_str());
- }
-};
-
-class CommandMSList : public Command
-{
- public:
- CommandMSList(Module *creator) : Command(creator, "memoserv/list", 0, 2)
- {
- this->SetDesc(_("List your memos"));
- this->SetSyntax(_("[\037channel\037] [\037list\037 | NEW]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- Anope::string param = !params.empty() ? params[0] : "", chan;
- ChannelInfo *ci = NULL;
- const MemoInfo *mi;
- int i, end;
-
- if (!param.empty() && param[0] == '#')
- {
- chan = param;
- param = params.size() > 1 ? params[1] : "";
-
- if (!(ci = cs_findchan(chan)))
- {
- source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
- return;
- }
- else if (!ci->HasPriv(u, CA_MEMO))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
- mi = &ci->memos;
- }
- else
- mi = &u->Account()->memos;
- if (!param.empty() && !isdigit(param[0]) && !param.equals_ci("NEW"))
- this->OnSyntaxError(source, param);
- else if (!mi->memos.size())
- {
- if (!chan.empty())
- source.Reply(MEMO_X_HAS_NO_MEMOS, chan.c_str());
- else
- source.Reply(MEMO_HAVE_NO_MEMOS);
- }
- else
- {
- if (!param.empty() && isdigit(param[0]))
- {
- MemoListCallback list(source, ci, mi, param);
- list.Process();
- }
- else
- {
- if (!param.empty())
- {
- for (i = 0, end = mi->memos.size(); i < end; ++i)
- if (mi->memos[i]->HasFlag(MF_UNREAD))
- break;
- if (i == end)
- {
- if (!chan.empty())
- source.Reply(MEMO_X_HAS_NO_NEW_MEMOS, chan.c_str());
- else
- source.Reply(MEMO_HAVE_NO_NEW_MEMOS);
- return;
- }
- }
-
- bool SentHeader = false;
-
- for (i = 0, end = mi->memos.size(); i < end; ++i)
- {
- if (!param.empty() && !mi->memos[i]->HasFlag(MF_UNREAD))
- continue;
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("New memo for %s."), ci ? ci->name.c_str() : u->nick.c_str());
- source.Reply(_(" Num Sender Date/Time"));
- }
-
- MemoListCallback::DoList(source, mi, i);
- }
- }
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Lists any memos you currently have. With \002NEW\002, lists only\n"
- "new (unread) memos. Unread memos are marked with a \"*\"\n"
- "to the left of the memo number. You can also specify a list\n"
- "of numbers, as in the example below:\n"
- " \002LIST 2-5,7-9\002\n"
- " Lists memos numbered 2 through 5 and 7 through 9."));
- return true;
- }
-};
-
-class MSList : public Module
-{
- CommandMSList commandmslist;
-
- public:
- MSList(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandmslist(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandmslist);
- }
-};
-
-MODULE_INIT(MSList)
diff --git a/modules/core/ms_main.cpp b/modules/core/ms_main.cpp
deleted file mode 100644
index bb6d7847e..000000000
--- a/modules/core/ms_main.cpp
+++ /dev/null
@@ -1,228 +0,0 @@
-/* MemoServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-#include "memoserv.h"
-
-static BotInfo *MemoServ;
-
-static bool SendMemoMail(NickCore *nc, MemoInfo *mi, Memo *m)
-{
- Anope::string message = Anope::printf(translate(nc, _(
- "Hi %s\n"
- " \n"
- "You've just received a new memo from %s. This is memo number %d.\n"
- " \n"
- "Memo text:\n"
- " \n"
- "%s")), nc->display.c_str(), m->sender.c_str(), mi->GetIndex(m), m->text.c_str());
-
- return Mail(nc, translate(nc, _("New memo")), message);
-}
-
-class MyMemoServService : public MemoServService
-{
- public:
- MyMemoServService(Module *m) : MemoServService(m) { }
-
- MemoInfo *GetMemoInfo(const Anope::string &target, bool &ischan)
- {
- if (!target.empty() && target[0] == '#')
- {
- ischan = true;
- ChannelInfo *ci = cs_findchan(target);
- if (ci != NULL)
- return &ci->memos;
- }
- else
- {
- ischan = false;
- NickAlias *na = findnick(target);
- if (na != NULL)
- return &na->nc->memos;
- }
-
- return NULL;
- }
-
- MemoResult Send(const Anope::string &source, const Anope::string &target, const Anope::string &message, bool force)
- {
- bool ischan;
- MemoInfo *mi = this->GetMemoInfo(target, ischan);
-
- if (mi == NULL)
- return MEMO_INVALID_TARGET;
-
- User *sender = finduser(source);
- if (sender != NULL && !sender->HasPriv("memoserv/no-limit") && !force)
- {
- if (Config->MSSendDelay > 0 && sender->lastmemosend + Config->MSSendDelay > Anope::CurTime)
- return MEMO_TOO_FAST;
- else if (!mi->memomax)
- return MEMO_TARGET_FULL;
- else if (mi->memomax > 0 && mi->memos.size() >= mi->memomax)
- return MEMO_TARGET_FULL;
- else if (mi->HasIgnore(sender))
- return MEMO_SUCCESS;
- }
-
- if (sender != NULL)
- sender->lastmemosend = Anope::CurTime;
-
- Memo *m = new Memo();
- mi->memos.push_back(m);
- m->sender = source;
- m->time = Anope::CurTime;
- m->text = message;
- m->SetFlag(MF_UNREAD);
-
- FOREACH_MOD(I_OnMemoSend, OnMemoSend(source, target, mi, m));
-
- if (ischan)
- {
- ChannelInfo *ci = cs_findchan(target);
-
- if (ci->c)
- {
- for (CUserList::iterator it = ci->c->users.begin(), it_end = ci->c->users.end(); it != it_end; ++it)
- {
- UserContainer *cu = *it;
-
- if (ci->HasPriv(cu->user, CA_MEMO))
- {
- if (cu->user->Account() && cu->user->Account()->HasFlag(NI_MEMO_RECEIVE))
- cu->user->SendMessage(MemoServ, MEMO_NEW_X_MEMO_ARRIVED, ci->name.c_str(), Config->UseStrictPrivMsgString.c_str(), Config->MemoServ.c_str(), ci->name.c_str(), mi->memos.size());
- }
- }
- }
- }
- else
- {
- NickCore *nc = findnick(target)->nc;
-
- if (nc->HasFlag(NI_MEMO_RECEIVE))
- {
- for (std::list<NickAlias *>::iterator it = nc->aliases.begin(), it_end = nc->aliases.end(); it != it_end; ++it)
- {
- NickAlias *na = *it;
- User *user = finduser(na->nick);
- if (user && user->IsIdentified())
- user->SendMessage(MemoServ, MEMO_NEW_MEMO_ARRIVED, source.c_str(), Config->UseStrictPrivMsgString.c_str(), Config->MemoServ.c_str(), mi->memos.size());
- }
- }
-
- /* let's get out the mail if set in the nickcore - certus */
- if (nc->HasFlag(NI_MEMO_MAIL))
- SendMemoMail(nc, mi, m);
- }
-
- return MEMO_SUCCESS;
- }
-
- void Check(User *u)
- {
- NickCore *nc = u->Account();
- if (!nc)
- return;
-
- unsigned i = 0, end = nc->memos.memos.size(), newcnt = 0;
- for (; i < end; ++i)
- {
- if (nc->memos.memos[i]->HasFlag(MF_UNREAD))
- ++newcnt;
- }
- if (newcnt > 0)
- u->SendMessage(MemoServ, newcnt == 1 ? _("You have 1 new memo.") : _("You have %d new memos."), newcnt);
- if (nc->memos.memomax > 0 && nc->memos.memos.size() >= nc->memos.memomax)
- {
- if (nc->memos.memos.size() > nc->memos.memomax)
- u->SendMessage(MemoServ, _("You are over your maximum number of memos (%d). You will be unable to receive any new memos until you delete some of your current ones."), nc->memos.memomax);
- else
- u->SendMessage(MemoServ, _("You have reached your maximum number of memos (%d). You will be unable to receive any new memos until you delete some of your current ones."), nc->memos.memomax);
- }
- }
-};
-
-class MemoServCore : public Module
-{
- MyMemoServService mymemoserv;
- public:
- MemoServCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- mymemoserv(this)
- {
- this->SetAuthor("Anope");
-
- MemoServ = findbot(Config->MemoServ);
- if (MemoServ == NULL)
- throw ModuleException("No bot named " + Config->MemoServ);
-
- Implementation i[] = { I_OnNickIdentify, I_OnJoinChannel, I_OnUserAway, I_OnNickUpdate, I_OnPreHelp, I_OnPostHelp };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
-
- ModuleManager::RegisterService(&this->mymemoserv);
- }
-
- void OnNickIdentify(User *u)
- {
- this->mymemoserv.Check(u);
- }
-
- void OnJoinChannel(User *u, Channel *c)
- {
- if (c->ci && c->ci->HasPriv(u, CA_MEMO) && c->ci->memos.memos.size() > 0)
- {
- if (c->ci->memos.memos.size() == 1)
- u->SendMessage(MemoServ, _("There is \002%d\002 memo on channel %s."), c->ci->memos.memos.size(), c->ci->name.c_str());
- else
- u->SendMessage(MemoServ, _("There are \002%d\002 memos on channel %s."), c->ci->memos.memos.size(), c->ci->name.c_str());
- }
- }
-
- void OnUserAway(User *u, const Anope::string &message)
- {
- if (message.empty())
- this->mymemoserv.Check(u);
- }
-
- void OnNickUpdate(User *u)
- {
- this->mymemoserv.Check(u);
- }
-
- void OnPreHelp(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!params.empty() || source.owner->nick != Config->MemoServ)
- return;
- source.Reply(_("\002%s\002 is a utility allowing IRC users to send short\n"
- "messages to other IRC users, whether they are online at\n"
- "the time or not, or to channels(*). Both the sender's\n"
- "nickname and the target nickname or channel must be\n"
- "registered in order to send a memo.\n"
- "%s's commands include:"), Config->MemoServ.c_str(), Config->MemoServ.c_str());
- }
-
- void OnPostHelp(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!params.empty() || source.owner->nick != Config->MemoServ)
- return;
- source.Reply(_(" \n"
- "Type \002%s%s HELP \037command\037\002 for help on any of the\n"
- "above commands.\n"
- "(*) By default, any user with at least level 10 access on a\n"
- " channel can read that channel's memos. This can be\n"
- " changed with the %s \002LEVELS\002 command."), Config->UseStrictPrivMsgString.c_str(), Config->MemoServ.c_str(), Config->ChanServ.c_str());
- }
-};
-
-MODULE_INIT(MemoServCore)
-
diff --git a/modules/core/ms_read.cpp b/modules/core/ms_read.cpp
deleted file mode 100644
index f275f8d7d..000000000
--- a/modules/core/ms_read.cpp
+++ /dev/null
@@ -1,195 +0,0 @@
-/* MemoServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-#include "memoserv.h"
-
-void rsend_notify(CommandSource &source, MemoInfo *mi, Memo *m, const Anope::string &targ)
-{
- /* Only send receipt if memos are allowed */
- if (memoserv && !readonly)
- {
- /* Get nick alias for sender */
- NickAlias *na = findnick(m->sender);
-
- if (!na)
- return;
-
- /* Get nick core for sender */
- NickCore *nc = na->nc;
-
- if (!nc)
- return;
-
- /* Text of the memo varies if the recepient was a
- nick or channel */
- Anope::string text = Anope::printf(translate(na->nc, _("\002[auto-memo]\002 The memo you sent to %s has been viewed.")), targ.c_str());
-
- /* Send notification */
- memoserv->Send(source.u->nick, m->sender, text, true);
-
- /* Notify recepient of the memo that a notification has
- been sent to the sender */
- source.Reply(_("A notification memo has been sent to %s informing him/her you have\n"
- "read his/her memo."), nc->display.c_str());
- }
-
- /* Remove receipt flag from the original memo */
- m->UnsetFlag(MF_RECEIPT);
-}
-
-class MemoListCallback : public NumberList
-{
- CommandSource &source;
- MemoInfo *mi;
- public:
- MemoListCallback(CommandSource &_source, MemoInfo *_mi, const Anope::string &numlist) : NumberList(numlist, false), source(_source), mi(_mi)
- {
- }
-
- void HandleNumber(unsigned Number)
- {
- if (!Number || Number > mi->memos.size())
- return;
-
- MemoListCallback::DoRead(source, mi, NULL, Number - 1);
- }
-
- static void DoRead(CommandSource &source, MemoInfo *mi, ChannelInfo *ci, unsigned index)
- {
- Memo *m = mi->memos[index];
- if (ci)
- source.Reply(_("Memo %d from %s (%s). To delete, type: \002%s%s DEL %s %d\002"), index + 1, m->sender.c_str(), do_strftime(m->time).c_str(), Config->UseStrictPrivMsgString.c_str(), Config->MemoServ.c_str(), ci->name.c_str(), index + 1);
- else
- source.Reply(_("Memo %d from %s (%s). To delete, type: \002%s%s DEL %d\002"), index + 1, m->sender.c_str(), do_strftime(m->time).c_str(), Config->UseStrictPrivMsgString.c_str(), Config->MemoServ.c_str(), index + 1);
- source.Reply("%s", m->text.c_str());
- m->UnsetFlag(MF_UNREAD);
-
- /* Check if a receipt notification was requested */
- if (m->HasFlag(MF_RECEIPT))
- rsend_notify(source, mi, m, ci ? ci->name : source.u->nick);
- }
-};
-
-class CommandMSRead : public Command
-{
- public:
- CommandMSRead(Module *creator) : Command(creator, "memoserv/read", 1, 2)
- {
- this->SetDesc(_("Read a memo or memos"));
- this->SetSyntax(_("[\037channel\037] {\037num\037 | \037list\037 | LAST | NEW}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- MemoInfo *mi;
- ChannelInfo *ci = NULL;
- Anope::string numstr = params[0], chan;
-
- if (!numstr.empty() && numstr[0] == '#')
- {
- chan = numstr;
- numstr = params.size() > 1 ? params[1] : "";
-
- if (!(ci = cs_findchan(chan)))
- {
- source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
- return;
- }
- else if (!ci->HasPriv(u, CA_MEMO))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
- mi = &ci->memos;
- }
- else
- mi = &u->Account()->memos;
-
- if (numstr.empty() || (!numstr.equals_ci("LAST") && !numstr.equals_ci("NEW") && !numstr.is_number_only()))
- this->OnSyntaxError(source, numstr);
- else if (mi->memos.empty())
- {
- if (!chan.empty())
- source.Reply(MEMO_X_HAS_NO_MEMOS, chan.c_str());
- else
- source.Reply(MEMO_HAVE_NO_MEMOS);
- }
- else
- {
- int i, end;
-
- if (numstr.equals_ci("NEW"))
- {
- int readcount = 0;
- for (i = 0, end = mi->memos.size(); i < end; ++i)
- if (mi->memos[i]->HasFlag(MF_UNREAD))
- {
- MemoListCallback::DoRead(source, mi, ci, i);
- ++readcount;
- }
- if (!readcount)
- {
- if (!chan.empty())
- source.Reply(MEMO_X_HAS_NO_NEW_MEMOS, chan.c_str());
- else
- 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(source, mi, ci, i);
- }
- else /* number[s] */
- {
- MemoListCallback list(source, mi, numstr);
- list.Process();
- }
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Sends you the text of the memos specified. If LAST is\n"
- "given, sends you the memo you most recently received. If\n"
- "NEW is given, sends you all of your new memos. Otherwise,\n"
- "sends you memo number \037num\037. You can also give a list of\n"
- "numbers, as in this example:\n"
- " \n"
- " \002READ 2-5,7-9\002\n"
- " Displays memos numbered 2 through 5 and 7 through 9."));
- return true;
- }
-};
-
-class MSRead : public Module
-{
- CommandMSRead commandmsread;
-
- public:
- MSRead(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandmsread(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandmsread);
- }
-};
-
-MODULE_INIT(MSRead)
diff --git a/modules/core/ms_rsend.cpp b/modules/core/ms_rsend.cpp
deleted file mode 100644
index 37c633e02..000000000
--- a/modules/core/ms_rsend.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-/* MemoServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-#include "memoserv.h"
-
-class CommandMSRSend : public Command
-{
- public:
- CommandMSRSend(Module *creator) : Command(creator, "memoserv/rsend", 2, 2)
- {
- this->SetDesc(_("Sends a memo and requests a read receipt"));
- this->SetSyntax(_("{\037nick\037 | \037channel\037} \037memo-text\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- 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())
- {
- source.Reply(_("You can not request a receipt when sending a memo to yourself."));
- return;
- }
-
- if (Config->MSMemoReceipt == 1 && !u->IsServicesOper())
- source.Reply(ACCESS_DENIED);
- else if (Config->MSMemoReceipt > 2 || Config->MSMemoReceipt == 0)
- {
- Log() << "MSMemoReceipt is set misconfigured to " << Config->MSMemoReceipt;
- source.Reply(_("Sorry, RSEND has been disabled on this network."));
- }
- else
- {
- MemoServService::MemoResult result = memoserv->Send(u->nick, nick, text);
- if (result == MemoServService::MEMO_INVALID_TARGET)
- source.Reply(_("\002%s\002 is not a registered unforbidden nick or channel."), nick.c_str());
- else if (result == MemoServService::MEMO_TOO_FAST)
- source.Reply(_("Please wait %d seconds before using the SEND command again."), Config->MSSendDelay);
- else if (result == MemoServService::MEMO_TARGET_FULL)
- source.Reply(_("%s currently has too many memos and cannot receive more."), nick.c_str());
- else
- {
- source.Reply(_("Memo sent to \002%s\002."), name.c_str());
-
- bool ischan;
- MemoInfo *mi = memoserv->GetMemoInfo(nick, ischan);
- if (mi == NULL)
- throw CoreException("NULL mi in ms_rsend");
- Memo *m = (mi->memos.size() ? mi->memos[mi->memos.size() - 1] : NULL);
- if (m != NULL)
- m->SetFlag(MF_RECEIPT);
- }
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Sends the named \037nick\037 or \037channel\037 a memo containing\n"
- "\037memo-text\037. When sending to a nickname, the recipient will\n"
- "receive a notice that he/she has a new memo. The target\n"
- "nickname/channel must be registered.\n"
- "Once the memo is read by its recipient, an automatic notification\n"
- "memo will be sent to the sender informing him/her that the memo\n"
- "has been read."));
- return true;
- }
-};
-
-class MSRSend : public Module
-{
- CommandMSRSend commandmsrsend;
-
- public:
- MSRSend(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandmsrsend(this)
- {
- this->SetAuthor("Anope");
-
- if (!Config->MSMemoReceipt)
- throw ModuleException("Invalid value for memoreceipt");
-
- ModuleManager::RegisterService(&commandmsrsend);
- }
-};
-
-MODULE_INIT(MSRSend)
diff --git a/modules/core/ms_send.cpp b/modules/core/ms_send.cpp
deleted file mode 100644
index 9397e7ad7..000000000
--- a/modules/core/ms_send.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/* MemoServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-#include "memoserv.h"
-
-class CommandMSSend : public Command
-{
- public:
- CommandMSSend(Module *creator) : Command(creator, "memoserv/send", 2, 2)
- {
- this->SetDesc(_("Send a memo to a nick or channel"));
- this->SetSyntax(_("{\037nick\037 | \037channel\037} \037memo-text\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &nick = params[0];
- const Anope::string &text = params[1];
-
- MemoServService::MemoResult result = memoserv->Send(source.u->nick, nick, text);
- if (result == MemoServService::MEMO_SUCCESS)
- source.Reply(_("Memo sent to \002%s\002."), nick.c_str());
- else if (result == MemoServService::MEMO_INVALID_TARGET)
- source.Reply(_("\002%s\002 is not a registered unforbidden nick or channel."), nick.c_str());
- else if (result == MemoServService::MEMO_TOO_FAST)
- source.Reply(_("Please wait %d seconds before using the SEND command again."), Config->MSSendDelay);
- else if (result == MemoServService::MEMO_TARGET_FULL)
- source.Reply(_("%s currently has too many memos and cannot receive more."), nick.c_str());
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Sends the named \037nick\037 or \037channel\037 a memo containing\n"
- "\037memo-text\037. When sending to a nickname, the recipient will\n"
- "receive a notice that he/she has a new memo. The target\n"
- "nickname/channel must be registered."));
- return true;
- }
-};
-
-class MSSend : public Module
-{
- CommandMSSend commandmssend;
-
- public:
- MSSend(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandmssend(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandmssend);
- }
-};
-
-MODULE_INIT(MSSend)
diff --git a/modules/core/ms_sendall.cpp b/modules/core/ms_sendall.cpp
deleted file mode 100644
index 7af5ac7af..000000000
--- a/modules/core/ms_sendall.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/* MemoServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-#include "memoserv.h"
-
-class CommandMSSendAll : public Command
-{
- public:
- CommandMSSendAll(Module *creator) : Command(creator, "memoserv/sendall", 1, 1)
- {
- this->SetDesc(_("Send a memo to all registered users"));
- this->SetSyntax(_("\037memo-text\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &text = params[0];
-
- if (readonly)
- {
- source.Reply(MEMO_SEND_DISABLED);
- return;
- }
-
- NickAlias *na = findnick(u->nick);
-
- for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it)
- {
- NickCore *nc = it->second;
-
- if ((na && na->nc == nc) || !nc->display.equals_ci(u->nick))
- memoserv->Send(u->nick, nc->display, text);
- }
-
- source.Reply(_("A massmemo has been sent to all registered users."));
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Sends all registered users a memo containing \037memo-text\037."));
- return true;
- }
-};
-
-class MSSendAll : public Module
-{
- CommandMSSendAll commandmssendall;
-
- public:
- MSSendAll(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandmssendall(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandmssendall);
- }
-};
-
-MODULE_INIT(MSSendAll)
diff --git a/modules/core/ms_set.cpp b/modules/core/ms_set.cpp
deleted file mode 100644
index 1aa3f469d..000000000
--- a/modules/core/ms_set.cpp
+++ /dev/null
@@ -1,313 +0,0 @@
-/* MemoServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandMSSet : public Command
-{
- private:
- void DoNotify(CommandSource &source, const std::vector<Anope::string> &params, MemoInfo *mi)
- {
- User *u = source.u;
- const Anope::string &param = params[1];
-
- if (param.equals_ci("ON"))
- {
- u->Account()->SetFlag(NI_MEMO_SIGNON);
- u->Account()->SetFlag(NI_MEMO_RECEIVE);
- source.Reply(_("%s will now notify you of memos when you log on and when they are sent to you."), Config->MemoServ.c_str());
- }
- else if (param.equals_ci("LOGON"))
- {
- u->Account()->SetFlag(NI_MEMO_SIGNON);
- u->Account()->UnsetFlag(NI_MEMO_RECEIVE);
- source.Reply(_("%s will now notify you of memos when you log on or unset /AWAY."), Config->MemoServ.c_str());
- }
- else if (param.equals_ci("NEW"))
- {
- u->Account()->UnsetFlag(NI_MEMO_SIGNON);
- u->Account()->SetFlag(NI_MEMO_RECEIVE);
- source.Reply(_("%s will now notify you of memos when they are sent to you."), Config->MemoServ.c_str());
- }
- else if (param.equals_ci("MAIL"))
- {
- if (!u->Account()->email.empty())
- {
- u->Account()->SetFlag(NI_MEMO_MAIL);
- source.Reply(_("You will now be informed about new memos via email."));
- }
- else
- source.Reply(_("There's no email address set for your nick."));
- }
- else if (param.equals_ci("NOMAIL"))
- {
- u->Account()->UnsetFlag(NI_MEMO_MAIL);
- source.Reply(_("You will no longer be informed via email."));
- }
- else if (param.equals_ci("OFF"))
- {
- u->Account()->UnsetFlag(NI_MEMO_SIGNON);
- u->Account()->UnsetFlag(NI_MEMO_RECEIVE);
- u->Account()->UnsetFlag(NI_MEMO_MAIL);
- source.Reply(_("%s will not send you any notification of memos."), Config->MemoServ.c_str());
- }
- else
- this->OnSyntaxError(source, param);
-
- return;
- }
-
- void DoLimit(CommandSource &source, const std::vector<Anope::string> &params, MemoInfo *mi)
- {
- User *u = source.u;
-
- Anope::string p1 = params[1];
- Anope::string p2 = params.size() > 2 ? params[2] : "";
- Anope::string p3 = params.size() > 3 ? params[3] : "";
- Anope::string user, chan;
- int16 limit;
- NickCore *nc = u->Account();
- ChannelInfo *ci = NULL;
- bool is_servadmin = u->HasPriv("memoserv/set-limit");
-
- if (p1[0] == '#')
- {
- chan = p1;
- p1 = p2;
- p2 = p3;
- p3 = params.size() > 4 ? params[4] : "";
- if (!(ci = cs_findchan(chan)))
- {
- source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
- return;
- }
- else if (!is_servadmin && !ci->HasPriv(u, CA_MEMO))
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
- mi = &ci->memos;
- }
- if (is_servadmin)
- {
- if (!p2.empty() && !p2.equals_ci("HARD") && chan.empty())
- {
- NickAlias *na;
- if (!(na = findnick(p1)))
- {
- source.Reply(NICK_X_NOT_REGISTERED, p1.c_str());
- return;
- }
- user = p1;
- mi = &na->nc->memos;
- nc = na->nc;
- p1 = p2;
- p2 = p3;
- }
- else if (p1.empty() || (!p1.is_pos_number_only() && !p1.equals_ci("NONE")) || (!p2.empty() && !p2.equals_ci("HARD")))
- {
- this->OnSyntaxError(source, "");
- return;
- }
- if (!chan.empty())
- {
- if (!p2.empty())
- ci->SetFlag(CI_MEMO_HARDMAX);
- else
- ci->UnsetFlag(CI_MEMO_HARDMAX);
- }
- else
- {
- if (!p2.empty())
- nc->SetFlag(NI_MEMO_HARDMAX);
- else
- nc->UnsetFlag(NI_MEMO_HARDMAX);
- }
- limit = -1;
- try
- {
- limit = convertTo<int16>(p1);
- }
- catch (const ConvertException &) { }
- }
- else
- {
- if (p1.empty() || !p2.empty() || !isdigit(p1[0]))
- {
- this->OnSyntaxError(source, "");
- return;
- }
- if (!chan.empty() && ci->HasFlag(CI_MEMO_HARDMAX))
- {
- source.Reply(_("The memo limit for %s may not be changed."), chan.c_str());
- return;
- }
- else if (chan.empty() && nc->HasFlag(NI_MEMO_HARDMAX))
- {
- source.Reply(_("You are not permitted to change your memo limit."));
- return;
- }
- limit = -1;
- try
- {
- limit = convertTo<int16>(p1);
- }
- catch (const ConvertException &) { }
- /* The first character is a digit, but we could still go negative
- * from overflow... watch out! */
- if (limit < 0 || (Config->MSMaxMemos > 0 && static_cast<unsigned>(limit) > Config->MSMaxMemos))
- {
- if (!chan.empty())
- source.Reply(_("You cannot set the memo limit for %s higher than %d."), chan.c_str(), Config->MSMaxMemos);
- else
- source.Reply(_("You cannot set your memo limit higher than %d."), Config->MSMaxMemos);
- return;
- }
- }
- mi->memomax = limit;
- if (limit > 0)
- {
- if (chan.empty() && nc == u->Account())
- source.Reply(_("Your memo limit has been set to \002%d\002."), limit);
- else
- source.Reply(_("Memo limit for %s set to \002%d\002."), !chan.empty() ? chan.c_str() : user.c_str(), limit);
- }
- else if (!limit)
- {
- if (chan.empty() && nc == u->Account())
- source.Reply(_("You will no longer be able to receive memos."));
- else
- source.Reply(_("Memo limit for %s set to \0020\002."), !chan.empty() ? chan.c_str() : user.c_str());
- }
- else
- {
- if (chan.empty() && nc == u->Account())
- source.Reply(_("Your memo limit has been disabled."));
- else
- source.Reply(_("Memo limit \002disabled\002 for %s."), !chan.empty() ? chan.c_str() : user.c_str());
- }
- return;
- }
- public:
- CommandMSSet(Module *creator) : Command(creator, "memoserv/set", 2, 5)
- {
- this->SetDesc(_("Set options related to memos"));
- this->SetSyntax(_("\037option\037 \037parameters\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &cmd = params[0];
- MemoInfo *mi = &u->Account()->memos;
-
- if (readonly)
- source.Reply(_("Sorry, memo option setting is temporarily disabled."));
- else if (cmd.equals_ci("NOTIFY"))
- return this->DoNotify(source, params, mi);
- else if (cmd.equals_ci("LIMIT"))
- return this->DoLimit(source, params, mi);
- else
- {
- source.Reply(NICK_SET_UNKNOWN_OPTION, Config->UseStrictPrivMsgString.c_str(), cmd.c_str());
- source.Reply(MORE_INFO, Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str(), "SET");
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- if (subcommand.empty())
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Sets various memo options. \037option\037 can be one of:\n"
- " \n"
- " NOTIFY Changes when you will be notified about\n"
- " new memos (only for nicknames)\n"
- " LIMIT Sets the maximum number of memos you can\n"
- " receive\n"
- " \n"
- "Type \002%s%s HELP %s \037option\037\002 for more information\n"
- "on a specific option."), Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str(), source.command.c_str());
- }
- else if (subcommand.equals_ci("NOTIFY"))
- source.Reply(_("Syntax: \002NOTIFY {ON | LOGON | NEW | MAIL | NOMAIL | OFF}\002\n"
- "Changes when you will be notified about new memos:\n"
- " \n"
- " ON You will be notified of memos when you log on,\n"
- " when you unset /AWAY, and when they are sent\n"
- " to you.\n"
- " LOGON You will only be notified of memos when you log\n"
- " on or when you unset /AWAY.\n"
- " NEW You will only be notified of memos when they\n"
- " are sent to you.\n"
- " MAIL You will be notified of memos by email aswell as\n"
- " any other settings you have.\n"
- " NOMAIL You will not be notified of memos by email.\n"
- " OFF You will not receive any notification of memos.\n"
- " \n"
- "\002ON\002 is essentially \002LOGON\002 and \002NEW\002 combined."));
- else if (subcommand.equals_ci("LIMIT"))
- {
- User *u = source.u;
- if (u->IsServicesOper())
- source.Reply(_("Syntax: \002LIMIT [\037user\037 | \037channel\037] {\037limit\037 | NONE} [HARD]\002\n"
- " \n"
- "Sets the maximum number of memos a user or channel is\n"
- "allowed to have. Setting the limit to 0 prevents the user\n"
- "from receiving any memos; setting it to \002NONE\002 allows the\n"
- "user to receive and keep as many memos as they want. If\n"
- "you do not give a nickname or channel, your own limit is\n"
- "set.\n"
- " \n"
- "Adding \002HARD\002 prevents the user from changing the limit. Not\n"
- "adding \002HARD\002 has the opposite effect, allowing the user to\n"
- "change the limit (even if a previous limit was set with\n"
- "\002HARD\002).\n"
- "This use of the \002SET LIMIT\002 command is limited to \002Services\002\n"
- "\002admins\002. Other users may only enter a limit for themselves\n"
- "or a channel on which they have such privileges, may not\n"
- "remove their limit, may not set a limit above %d, and may\n"
- "not set a hard limit."), Config->MSMaxMemos);
- else
- source.Reply(_("Syntax: \002LIMIT [\037channel\037] \037limit\037\002\n"
- " \n"
- "Sets the maximum number of memos you (or the given channel)\n"
- "are allowed to have. If you set this to 0, no one will be\n"
- "able to send any memos to you. However, you cannot set\n"
- "this any higher than %d."), Config->MSMaxMemos);
- }
- else
- return false;
-
- return true;
- }
-};
-
-class MSSet : public Module
-{
- CommandMSSet commandmsset;
-
- public:
- MSSet(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandmsset(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandmsset);
- }
-};
-
-MODULE_INIT(MSSet)
diff --git a/modules/core/ms_staff.cpp b/modules/core/ms_staff.cpp
deleted file mode 100644
index 6264dbea4..000000000
--- a/modules/core/ms_staff.cpp
+++ /dev/null
@@ -1,71 +0,0 @@
-/* MemoServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-#include "memoserv.h"
-
-class CommandMSStaff : public Command
-{
- public:
- CommandMSStaff(Module *creator) : Command(creator, "memoserv/staff", 1, 1)
- {
- this->SetDesc(_("Send a memo to all opers/admins"));
- this->SetSyntax(_("\037memo-text\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &text = params[0];
-
- if (readonly)
- {
- source.Reply(MEMO_SEND_DISABLED);
- return;
- }
-
- for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it)
- {
- NickCore *nc = it->second;
-
- if (nc->IsServicesOper())
- memoserv->Send(source.u->nick, nc->display, text, true);
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Sends all services staff a memo containing \037memo-text\037."));
-
- return true;
- }
-};
-
-class MSStaff : public Module
-{
- CommandMSStaff commandmsstaff;
-
- public:
- MSStaff(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandmsstaff(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandmsstaff);
- }
-};
-
-MODULE_INIT(MSStaff)
diff --git a/modules/core/nickserv.h b/modules/core/nickserv.h
deleted file mode 100644
index b58dbd65f..000000000
--- a/modules/core/nickserv.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef NICKSERV_H
-#define NICKSERV_H
-
-class NickServService : public Service
-{
- public:
- NickServService(Module *m) : Service(m, "NickServ") { }
-
- virtual void Validate(User *u) = 0;
-};
-
-static service_reference<NickServService> nickserv("NickServ");
-
-#endif // NICKSERV_H
-
diff --git a/modules/core/ns_access.cpp b/modules/core/ns_access.cpp
deleted file mode 100644
index df9ae6eed..000000000
--- a/modules/core/ns_access.cpp
+++ /dev/null
@@ -1,195 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSAccess : public Command
-{
- private:
- void DoServAdminList(CommandSource &source, const std::vector<Anope::string> &params, NickCore *nc)
- {
- Anope::string mask = params.size() > 2 ? params[2] : "";
- unsigned i, end;
-
- if (nc->access.empty())
- {
- source.Reply(_("Access list for \002%s\002 is empty."), nc->display.c_str());
- return;
- }
-
- if (nc->HasFlag(NI_SUSPENDED))
- {
- source.Reply(NICK_X_SUSPENDED, nc->display.c_str());
- return;
- }
-
- source.Reply(_("Access list for \002%s\002:"), 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;
- source.Reply(" %s", access.c_str());
- }
-
- return;
- }
-
- void DoAdd(CommandSource &source, NickCore *nc, const Anope::string &mask)
- {
-
- if (mask.empty())
- {
- this->OnSyntaxError(source, "ADD");
- return;
- }
-
- if (nc->access.size() >= Config->NSAccessMax)
- {
- source.Reply(_("Sorry, you can only have %d access entries for a nickname."), Config->NSAccessMax);
- return;
- }
-
- if (nc->FindAccess(mask))
- {
- source.Reply(_("Mask \002%s\002 already present on your access list."), mask.c_str());
- return;
- }
-
- nc->AddAccess(mask);
- source.Reply(_("\002%s\002 added to your access list."), mask.c_str());
-
- return;
- }
-
- void DoDel(CommandSource &source, NickCore *nc, const Anope::string &mask)
- {
- if (mask.empty())
- {
- this->OnSyntaxError(source, "DEL");
- return;
- }
-
- if (!nc->FindAccess(mask))
- {
- source.Reply(_("\002%s\002 not found on your access list."), mask.c_str());
- return;
- }
-
- source.Reply(_("\002%s\002 deleted from your access list."), mask.c_str());
- nc->EraseAccess(mask);
-
- return;
- }
-
- void DoList(CommandSource &source, NickCore *nc, const Anope::string &mask)
- {
- User *u = source.u;
- unsigned i, end;
-
- if (nc->access.empty())
- {
- source.Reply(_("Your access list is empty."), u->nick.c_str());
- return;
- }
-
- source.Reply(_("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;
- source.Reply(" %s", access.c_str());
- }
-
- return;
- }
- public:
- CommandNSAccess(Module *creator) : Command(creator, "nickserv/access", 1, 3)
- {
- this->SetDesc(_("Modify the list of authorized addresses"));
- this->SetSyntax(_("ADD \037mask\037"));
- this->SetSyntax(_("DEL \037mask\037"));
- this->SetSyntax(_("LIST"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- 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->IsServicesOper() && !mask.empty() && (na = findnick(params[1])))
- return this->DoServAdminList(source, params, na->nc);
-
- if (!mask.empty() && mask.find('@') == Anope::string::npos)
- {
- source.Reply(BAD_USERHOST_MASK);
- source.Reply(MORE_INFO, Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str(), this->name.c_str());
- }
- else if (u->Account()->HasFlag(NI_SUSPENDED))
- source.Reply(NICK_X_SUSPENDED, u->Account()->display.c_str());
- else if (cmd.equals_ci("ADD"))
- return this->DoAdd(source, u->Account(), mask);
- else if (cmd.equals_ci("DEL"))
- return this->DoDel(source, u->Account(), mask);
- else if (cmd.equals_ci("LIST"))
- return this->DoList(source, u->Account(), mask);
- else
- this->OnSyntaxError(source, "");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Modifies or displays the access list for your nick. This\n"
- "is the list of addresses which will be automatically\n"
- "recognized by %s as allowed to use the nick. If\n"
- "you want to use the nick from a different address, you\n"
- "need to send an \002IDENTIFY\002 command to make %s\n"
- "recognize you.\n"
- " \n"
- "Examples:\n"
- " \n"
- " \002ACCESS ADD anyone@*.bepeg.com\002\n"
- " Allows access to user \002anyone\002 from any machine in\n"
- " the \002bepeg.com\002 domain.\n"
- " \n"
- " \002ACCESS DEL anyone@*.bepeg.com\002\n"
- " Reverses the previous command.\n"
- " \n"
- " \002ACCESS LIST\002\n"
- " Displays the current access list."), Config->NickServ.c_str(), Config->NickServ.c_str());
- return true;
- }
-};
-
-class NSAccess : public Module
-{
- CommandNSAccess commandnsaccess;
-
- public:
- NSAccess(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnsaccess(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnsaccess);
- }
-};
-
-MODULE_INIT(NSAccess)
diff --git a/modules/core/ns_ajoin.cpp b/modules/core/ns_ajoin.cpp
deleted file mode 100644
index 4f35f28b8..000000000
--- a/modules/core/ns_ajoin.cpp
+++ /dev/null
@@ -1,239 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSAJoin : public Command
-{
- void DoList(CommandSource &source, const std::vector<Anope::string> &params)
- {
- std::vector<std::pair<Anope::string, Anope::string> > channels;
- source.u->Account()->GetExtRegular("ns_ajoin_channels", channels);
-
- if (channels.empty())
- source.Reply(_("Your auto join list is empty."));
- else
- {
- source.Reply(_("Your auto join list:\n"
- " Num Channel Key"));
- for (unsigned i = 0; i < channels.size(); ++i)
- source.Reply(" %3d %-12s %s", i + 1, channels[i].first.c_str(), channels[i].second.c_str());
- }
- }
-
- void DoAdd(CommandSource &source, const std::vector<Anope::string> &params)
- {
- std::vector<std::pair<Anope::string, Anope::string> > channels;
- source.u->Account()->GetExtRegular("ns_ajoin_channels", channels);
-
- if (channels.size() >= Config->AJoinMax)
- source.Reply(_("Your auto join list is full."));
- else if (ircdproto->IsChannelValid(params[1]) == false)
- source.Reply(CHAN_X_INVALID, params[1].c_str());
- else
- {
- channels.push_back(std::make_pair(params[1], params.size() > 2 ? params[2] : ""));
- source.Reply(_("Added %s to your auto join list."), params[1].c_str());
- source.u->Account()->Extend("ns_ajoin_channels", new ExtensibleItemRegular<std::vector<
- std::pair<Anope::string, Anope::string> > >(channels));
- }
- }
-
- void DoDel(CommandSource &source, const std::vector<Anope::string> &params)
- {
- std::vector<std::pair<Anope::string, Anope::string> > channels;
- source.u->Account()->GetExtRegular("ns_ajoin_channels", channels);
-
- unsigned i;
- for (i = 0; i < channels.size(); ++i)
- if (channels[i].first.equals_ci(params[1]))
- break;
-
- if (i == channels.size())
- source.Reply(_("%s was not found on your auto join list."), params[1].c_str());
- else
- {
- channels.erase(channels.begin() + i);
- source.u->Account()->Extend("ns_ajoin_channels", new ExtensibleItemRegular<std::vector<
- std::pair<Anope::string, Anope::string> > >(channels));
- source.Reply(_("%s was removed from your auto join list."), params[1].c_str());
- }
- }
-
- public:
- CommandNSAJoin(Module *creator) : Command(creator, "nickserv/ajoin", 1, 3)
- {
- this->SetDesc(_("Manage your auto join list"));
- this->SetSyntax(_("{ADD | DEL | LIST} [\037channel\037] [\037key\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (params[0].equals_ci("LIST"))
- this->DoList(source, params);
- else if (params.size() < 2)
- this->OnSyntaxError(source, "");
- else if (params[0].equals_ci("ADD"))
- this->DoAdd(source, params);
- else if (params[0].equals_ci("DEL"))
- this->DoDel(source, params);
- else
- this->OnSyntaxError(source, "");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("This command manages your auto join list. When you identify\n"
- "you will automatically join the channels on your auto join list"));
- return true;
- }
-};
-
-class NSAJoin : public Module
-{
- CommandNSAJoin commandnsajoin;
-
- public:
- NSAJoin(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnsajoin(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnsajoin);
-
- Implementation i[] = { I_OnNickIdentify, I_OnDatabaseWriteMetadata, I_OnDatabaseReadMetadata };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
- }
-
- void OnNickIdentify(User *u)
- {
- std::vector<std::pair<Anope::string, Anope::string> > channels;
- u->Account()->GetExtRegular("ns_ajoin_channels", channels);
-
- for (unsigned i = 0; i < channels.size(); ++i)
- {
- Channel *c = findchan(channels[i].first);
- ChannelInfo *ci = c != NULL ? c->ci : cs_findchan(channels[i].first);
- if (c == NULL && ci != NULL)
- c = ci->c;
-
- bool need_invite = false;
- Anope::string key = channels[i].second;
-
- if (ci != NULL)
- {
- if (ci->HasFlag(CI_SUSPENDED))
- continue;
- }
- if (c != NULL)
- {
- if (c->FindUser(u) != NULL)
- continue;
- else if (c->HasMode(CMODE_OPERONLY) && !u->HasMode(UMODE_OPER))
- continue;
- else if (c->HasMode(CMODE_ADMINONLY) && !u->HasMode(UMODE_ADMIN))
- continue;
- else if (c->HasMode(CMODE_SSL) && !u->HasMode(UMODE_SSL))
- continue;
- else if (matches_list(c, u, CMODE_BAN) == true && matches_list(c, u, CMODE_EXCEPT) == false)
- need_invite = true;
- else if (c->HasMode(CMODE_INVITE) && matches_list(c, u, CMODE_INVITEOVERRIDE) == false)
- need_invite = true;
-
- if (c->HasMode(CMODE_KEY))
- {
- Anope::string k;
- if (c->GetParam(CMODE_KEY, k))
- {
- if (ci->HasPriv(u, CA_GETKEY))
- key = k;
- else if (key != k)
- need_invite = true;
- }
- }
- if (c->HasMode(CMODE_LIMIT))
- {
- Anope::string l;
- if (c->GetParam(CMODE_LIMIT, l))
- {
- try
- {
- unsigned limit = convertTo<unsigned>(l);
- if (c->users.size() >= limit)
- need_invite = true;
- }
- catch (const ConvertException &) { }
- }
- }
- }
-
- if (need_invite)
- {
- BotInfo *bi = findbot(Config->NickServ);
- if (!bi || !ci->HasPriv(u, CA_INVITE))
- continue;
- ircdproto->SendInvite(bi, channels[i].first, u->nick);
- }
-
- ircdproto->SendSVSJoin(Config->NickServ, u->nick, channels[i].first, key);
- }
- }
-
- void OnDatabaseWriteMetadata(void (*WriteMetadata)(const Anope::string &, const Anope::string &), NickCore *nc)
- {
- std::vector<std::pair<Anope::string, Anope::string> > channels;
- nc->GetExtRegular("ns_ajoin_channels", channels);
-
- Anope::string chans;
- for (unsigned i = 0; i < channels.size(); ++i)
- chans += " " + channels[i].first + "," + channels[i].second;
-
- if (!chans.empty())
- {
- chans.erase(chans.begin());
- WriteMetadata("NS_AJOIN", chans);
- }
- }
-
- EventReturn OnDatabaseReadMetadata(NickCore *nc, const Anope::string &key, const std::vector<Anope::string> &params)
- {
- if (key == "NS_AJOIN")
- {
- std::vector<std::pair<Anope::string, Anope::string> > channels;
- nc->GetExtRegular("ns_ajoin_channels", channels);
-
- for (unsigned i = 0; i < params.size(); ++i)
- {
- Anope::string chan, chankey;
- commasepstream sep(params[i]);
- sep.GetToken(chan);
- sep.GetToken(chankey);
-
- channels.push_back(std::make_pair(chan, chankey));
- }
-
- nc->Extend("ns_ajoin_channels", new ExtensibleItemRegular<std::vector<
- std::pair<Anope::string, Anope::string> > >(channels));
-
- return EVENT_STOP;
- }
-
- return EVENT_CONTINUE;
- }
-};
-
-MODULE_INIT(NSAJoin)
diff --git a/modules/core/ns_alist.cpp b/modules/core/ns_alist.cpp
deleted file mode 100644
index f502b4344..000000000
--- a/modules/core/ns_alist.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSAList : public Command
-{
- public:
- CommandNSAList(Module *creator) : Command(creator, "nickserv/alist", 0, 2)
- {
- this->SetDesc(_("List channels you have access on"));
- this->SetSyntax(_("[\037nickname\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- Anope::string nick = u->Account()->display;
-
- if (params.size() && u->IsServicesOper())
- nick = params[0];
-
- NickAlias *na = findnick(nick);
-
- if (!na)
- source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
- else
- {
- int chan_count = 0;
-
- source.Reply(_("Channels that \002%s\002 has access on:\n"
- " Num Channel Level"), na->nick.c_str());
-
- for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it)
- {
- ChannelInfo *ci = it->second;
-
- AccessGroup access = ci->AccessFor(na->nc);
- if (access.empty())
- continue;
-
- ++chan_count;
-
- if (access.size() > 1)
- {
- source.Reply(_(" %3d You match %d access entries on %c%s, they are"), chan_count, access.size(), ci->HasFlag(CI_NO_EXPIRE) ? '!' : ' ', ci->name.c_str());
- for (unsigned i = 0; i < access.size(); ++i)
- source.Reply(_(" %3d %-8s"), i + 1, access[i]->Serialize().c_str());
- }
- else
- source.Reply(_(" %3d %c%-20s %-8s"), chan_count, ci->HasFlag(CI_NO_EXPIRE) ? '!' : ' ', ci->name.c_str(), access[0]->Serialize().c_str());
- }
-
- source.Reply(_("End of list - %d channels shown."), chan_count);
- }
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Lists all channels you have access on.\n"
- " \n"
- "Channels that have the \037NOEXPIRE\037 option set will be\n"
- "prefixed by an exclamation mark. The nickname parameter is\n"
- "limited to Services Operators"));
-
- return true;
- }
-};
-
-class NSAList : public Module
-{
- CommandNSAList commandnsalist;
-
- public:
- NSAList(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnsalist(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnsalist);
- }
-};
-
-MODULE_INIT(NSAList)
diff --git a/modules/core/ns_cert.cpp b/modules/core/ns_cert.cpp
deleted file mode 100644
index fbd75d597..000000000
--- a/modules/core/ns_cert.cpp
+++ /dev/null
@@ -1,231 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSCert : public Command
-{
- private:
- void DoServAdminList(CommandSource &source, NickCore *nc)
- {
- if (nc->cert.empty())
- {
- source.Reply(_("Certificate list for \002%s\002 is empty."), nc->display.c_str());
- return;
- }
-
- if (nc->HasFlag(NI_SUSPENDED))
- {
- source.Reply(NICK_X_SUSPENDED, nc->display.c_str());
- return;
- }
-
- source.Reply(_("Certificate list for \002%s\002:"), nc->display.c_str());
- for (unsigned i = 0, end = nc->cert.size(); i < end; ++i)
- {
- Anope::string fingerprint = nc->GetCert(i);
- source.Reply(" %s", fingerprint.c_str());
- }
-
- return;
- }
-
- void DoAdd(CommandSource &source, NickCore *nc, const Anope::string &mask)
- {
-
- if (nc->cert.size() >= Config->NSAccessMax)
- {
- source.Reply(_("Sorry, you can only have %d certificate entries for a nickname."), Config->NSAccessMax);
- return;
- }
-
- if (!source.u->fingerprint.empty() && !nc->FindCert(source.u->fingerprint))
- {
- nc->AddCert(source.u->fingerprint);
- source.Reply(_("\002%s\002 added to your certificate list."), source.u->fingerprint.c_str());
- return;
- }
-
- if (mask.empty())
- {
- this->OnSyntaxError(source, "ADD");
- return;
- }
-
- if (nc->FindCert(mask))
- {
- source.Reply(_("Fingerprint \002%s\002 already present on your certificate list."), mask.c_str());
- return;
- }
-
- nc->AddCert(mask);
- source.Reply(_("\002%s\002 added to your certificate list."), mask.c_str());
- return;
- }
-
- void DoDel(CommandSource &source, NickCore *nc, const Anope::string &mask)
- {
-
- if (!source.u->fingerprint.empty() && nc->FindCert(source.u->fingerprint))
- {
- nc->EraseCert(source.u->fingerprint);
- source.Reply(_("\002%s\002 deleted from your certificate list."), source.u->fingerprint.c_str());
- return;
- }
-
- if (mask.empty())
- {
- this->OnSyntaxError(source, "DEL");
- return;
- }
-
- if (!nc->FindCert(mask))
- {
- source.Reply(_("\002%s\002 not found on your certificate list."), mask.c_str());
- return;
- }
-
- source.Reply(_("\002%s\002 deleted from your certificate list."), mask.c_str());
- nc->EraseCert(mask);
-
- return;
- }
-
- void DoList(CommandSource &source, NickCore *nc)
- {
- User *u = source.u;
-
- if (nc->cert.empty())
- {
- source.Reply(_("Your certificate list is empty."), u->nick.c_str());
- return;
- }
-
- source.Reply(_("Cert list:"));
- for (unsigned i = 0, end = nc->cert.size(); i < end; ++i)
- {
- Anope::string fingerprint = nc->GetCert(i);
- source.Reply(" %s", fingerprint.c_str());
- }
-
- return;
- }
-
- public:
- CommandNSCert(Module *creator) : Command(creator, "nickserv/cert", 1, 2)
- {
- this->SetDesc("Modify the nickname client certificate list");
- this->SetSyntax("ADD \037fingerprint\037");
- this->SetSyntax("DEL \037fingerprint\037");
- this->SetSyntax("LIST");
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- 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->IsServicesOper() && !mask.empty() && (na = findnick(mask)))
- return this->DoServAdminList(source, na->nc);
-
- if (u->Account()->HasFlag(NI_SUSPENDED))
- source.Reply(NICK_X_SUSPENDED, u->Account()->display.c_str());
- else if (cmd.equals_ci("ADD"))
- return this->DoAdd(source, u->Account(), mask);
- else if (cmd.equals_ci("DEL"))
- return this->DoDel(source, u->Account(), mask);
- else if (cmd.equals_ci("LIST"))
- return this->DoList(source, u->Account());
- else
- this->OnSyntaxError(source, cmd);
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Modifies or displays the certificate list for your nick.\n"
- "If you connect to IRC and provide a client certificate with a\n"
- "matching fingerprint in the cert list, your nick will be\n"
- "automatically identified to %s.\n"
- " \n"), Config->NickServ.c_str(), Config->NickServ.c_str());
- source.Reply(_("Examples:\n"
- " \n"
- " \002CERT ADD <fingerprint>\002\n"
- " Adds this fingerprint to the certificate list and\n"
- " automatically identifies you when you connect to IRC\n"
- " using this certificate.\n"
- " \n"
- " \002CERT DEL <fingerprint>\002\n"
- " Reverses the previous command.\n"
- " \n"
- " \002CERT LIST\002\n"
- " Displays the current certificate list."), Config->NickServ.c_str());
- return true;
- }
-};
-
-class NSCert : public Module
-{
- CommandNSCert commandnscert;
-
- void DoAutoIdentify(User *u)
- {
- BotInfo *bi = findbot(Config->NickServ);
- NickAlias *na = findnick(u->nick);
- if (!bi || !na)
- return;
- if (u->IsIdentified() && u->Account() == na->nc)
- return;
- if (na->nc->HasFlag(NI_SUSPENDED))
- return;
- if (!na->nc->FindCert(u->fingerprint))
- return;
-
- u->Identify(na);
- u->SendMessage(bi, _("SSL Fingerprint accepted. You are now identified."));
- return;
- }
-
- public:
- NSCert(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnscert(this)
- {
- this->SetAuthor("Anope");
-
- if (!ircd || !ircd->certfp)
- throw ModuleException("Your IRCd does not support ssl client certificates");
-
- Implementation i[] = { I_OnUserNickChange, I_OnFingerprint };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
-
- ModuleManager::RegisterService(&commandnscert);
- }
-
- void OnFingerprint(User *u)
- {
- DoAutoIdentify(u);
- }
-
- void OnUserNickChange(User *u, const Anope::string &oldnick)
- {
- if (!u->fingerprint.empty())
- DoAutoIdentify(u);
- }
-};
-
-MODULE_INIT(NSCert)
diff --git a/modules/core/ns_drop.cpp b/modules/core/ns_drop.cpp
deleted file mode 100644
index 7960652ff..000000000
--- a/modules/core/ns_drop.cpp
+++ /dev/null
@@ -1,130 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSDrop : public Command
-{
- public:
- CommandNSDrop(Module *creator) : Command(creator, "nickserv/drop", 0, 1)
- {
- this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
- this->SetDesc(_("Cancel the registration of a nickname"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- Anope::string nick = !params.empty() ? params[0] : "";
-
- if (readonly)
- {
- source.Reply(_("Sorry, nickname de-registration is temporarily disabled."));
- return;
- }
-
- NickAlias *na = findnick((u->Account() && !nick.empty() ? nick : u->nick));
- if (!na)
- {
- source.Reply(NICK_NOT_REGISTERED);
- return;
- }
-
- if (!u->Account())
- {
- source.Reply(NICK_IDENTIFY_REQUIRED, Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str());
- return;
- }
-
- bool is_mine = u->Account() == na->nc;
- Anope::string my_nick;
- if (is_mine && nick.empty())
- my_nick = na->nick;
-
- if (!is_mine && !u->HasPriv("nickserv/drop"))
- source.Reply(ACCESS_DENIED);
- else if (Config->NSSecureAdmins && !is_mine && na->nc->IsServicesOper())
- source.Reply(ACCESS_DENIED);
- else
- {
- if (readonly)
- source.Reply(READ_ONLY_MODE);
-
- FOREACH_MOD(I_OnNickDrop, OnNickDrop(u, na));
-
- Log(!is_mine ? LOG_OVERRIDE : LOG_COMMAND, u, this) << "to drop nickname " << na->nick << " (group: " << na->nc->display << ") (email: " << (!na->nc->email.empty() ? na->nc->email : "none") << ")";
- delete na;
-
- if (!is_mine)
- {
- source.Reply(_("Nickname \002%s\002 has been dropped."), nick.c_str());
- }
- else
- {
- if (!nick.empty())
- source.Reply(_("Nickname \002%s\002 has been dropped."), nick.c_str());
- else
- source.Reply(_("Your nickname has been dropped."));
- }
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- User *u = source.u;
- if (u->Account() && u->HasPriv("nickserv/drop"))
- source.Reply(_("Syntax: \002%s [\037nickname\037]\002\n"
- " \n"
- "Without a parameter, deletes your nickname.\n"
- " \n"
- "With a parameter, drops the named nick from the database.\n"
- "You may drop any nick within your group without any \n"
- "special privileges. Dropping any nick is limited to \n"
- "\002Services Operators\002."), source.command.c_str());
- else
- source.Reply(_("Syntax: \002%s [\037nickname\037 | \037password\037]\002\n"
- " \n"
- "Deltes your nickname. A nick\n"
- "that has been dropped is free for anyone to re-register.\n"
- " \n"
- "You may drop a nick within your group by passing it\n"
- "as the \002nick\002 parameter.\n"
- " \n"
- "If you have a nickname registration pending but can not confirm\n"
- "it for any reason, you can cancel your registration by passing\n"
- "your password as the \002password\002 parameter.\n"
- " \n"
- "In order to use this command, you must first identify\n"
- "with your password."), source.command.c_str());
-
- return true;
- }
-};
-
-class NSDrop : public Module
-{
- CommandNSDrop commandnsdrop;
-
- public:
- NSDrop(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnsdrop(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnsdrop);
- }
-};
-
-MODULE_INIT(NSDrop)
diff --git a/modules/core/ns_getemail.cpp b/modules/core/ns_getemail.cpp
deleted file mode 100644
index fa27e5174..000000000
--- a/modules/core/ns_getemail.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- *
- * A simple call to check for all emails that a user may have registered
- * with. It returns the nicks that match the email you provide. Wild
- * Cards are not excepted. Must use user@email-host.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSGetEMail : public Command
-{
- public:
- CommandNSGetEMail(Module *creator) : Command(creator, "nickserv/getemail", 1, 1)
- {
- this->SetDesc(_("Matches and returns all users that registered using given email"));
- this->SetSyntax(_("\037user@email-host\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &email = params[0];
- int j = 0;
-
- Log(LOG_ADMIN, u, this) << "on " << email;
-
- for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it)
- {
- NickCore *nc = it->second;
-
- if (!nc->email.empty() && nc->email.equals_ci(email))
- {
- ++j;
- source.Reply(_("Emails Match \002%s\002 to \002%s\002."), nc->display.c_str(), email.c_str());
- }
- }
-
- if (j <= 0)
- {
- source.Reply(_("No Emails listed for \002%s\002."), email.c_str());
- return;
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Returns the matching nicks that used given email. \002Note\002 that\n"
- "you can not use wildcards for either user or emailhost. Whenever\n"
- "this command is used, a message including the person who issued\n"
- "the command and the email it was used on will be logged."));
- return true;
- }
-};
-
-class NSGetEMail : public Module
-{
- CommandNSGetEMail commandnsgetemail;
- public:
- NSGetEMail(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnsgetemail(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnsgetemail);
- }
-};
-
-MODULE_INIT(NSGetEMail)
diff --git a/modules/core/ns_getpass.cpp b/modules/core/ns_getpass.cpp
deleted file mode 100644
index 9ebea5263..000000000
--- a/modules/core/ns_getpass.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSGetPass : public Command
-{
- public:
- CommandNSGetPass(Module *creator) : Command(creator, "nickserv/getpass", 1, 1)
- {
- this->SetDesc(_("Retrieve the password for a nickname"));
- this->SetSyntax(_("\037nickname\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &nick = params[0];
- Anope::string tmp_pass;
- NickAlias *na;
-
- if (!(na = findnick(nick)))
- source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
- else if (Config->NSSecureAdmins && na->nc->IsServicesOper())
- source.Reply(ACCESS_DENIED);
- else
- {
- if (enc_decrypt(na->nc->pass, tmp_pass) == 1)
- {
- Log(LOG_ADMIN, u, this) << "for " << nick;
- source.Reply(_("Password for %s is \002%s\002."), nick.c_str(), tmp_pass.c_str());
- }
- else
- source.Reply(_("GETPASS command unavailable because encryption is in use."));
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Returns the password for the given nickname. \002Note\002 that\n"
- "whenever this command is used, a message including the\n"
- "person who issued the command and the nickname it was used\n"
- "on will be logged and sent out as a WALLOPS/GLOBOPS."));
- return true;
- }
-};
-
-class NSGetPass : public Module
-{
- CommandNSGetPass commandnsgetpass;
-
- public:
- NSGetPass(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnsgetpass(this)
- {
- this->SetAuthor("Anope");
-
- Anope::string tmp_pass = "plain:tmp";
- if (enc_decrypt(tmp_pass, tmp_pass) == -1)
- throw ModuleException("Incompatible with the encryption module being used");
-
- ModuleManager::RegisterService(&commandnsgetpass);
- }
-};
-
-MODULE_INIT(NSGetPass)
diff --git a/modules/core/ns_ghost.cpp b/modules/core/ns_ghost.cpp
deleted file mode 100644
index 37dcef9c7..000000000
--- a/modules/core/ns_ghost.cpp
+++ /dev/null
@@ -1,122 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSGhost : public Command
-{
- public:
- CommandNSGhost(Module *creator) : Command(creator, "nickserv/ghost", 1, 2)
- {
- this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
- this->SetDesc(_("Disconnects a \"ghost\" IRC session using your nick"));
- this->SetSyntax("\037nickname\037 [\037password\037]");
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &nick = params[0];
- const Anope::string &pass = params.size() > 1 ? params[1] : "";
-
- User *u = source.u;
- User *user = finduser(nick);
- NickAlias *na = findnick(nick);
-
- if (!user)
- source.Reply(NICK_X_NOT_IN_USE, nick.c_str());
- else if (!na)
- source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
- else if (na->nc->HasFlag(NI_SUSPENDED))
- source.Reply(NICK_X_SUSPENDED, na->nick.c_str());
- else if (nick.equals_ci(u->nick))
- source.Reply(_("You can't ghost yourself!"));
- else
- {
- bool ok = false;
- if (u->Account() == na->nc)
- ok = true;
- else if (!na->nc->HasFlag(NI_SECURE) && is_on_access(u, na->nc))
- ok = true;
- else if (!u->fingerprint.empty() && na->nc->FindCert(u->fingerprint))
- ok = true;
- else if (!pass.empty())
- {
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnCheckAuthentication, OnCheckAuthentication(this, &source, params, na->nc->display, pass));
- if (MOD_RESULT == EVENT_STOP)
- return;
- else if (MOD_RESULT == EVENT_ALLOW)
- ok = true;
- }
-
- if (ok)
- {
- if (!user->IsIdentified())
- source.Reply(_("You may not ghost an unidentified user, use RECOVER instead."));
- else
- {
- Log(LOG_COMMAND, u, this) << "for " << nick;
- Anope::string buf = "GHOST command used by " + u->nick;
- user->Kill(Config->NickServ, buf);
- source.Reply(_("Ghost with your nick has been killed."), nick.c_str());
- }
- }
- else
- {
- source.Reply(ACCESS_DENIED);
- if (!pass.empty())
- {
- Log(LOG_COMMAND, u, this) << "with an invalid password for " << nick;
- bad_password(u);
- }
- }
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("itermminates a \"ghost\" IRC session using your nick. A\n"
- "ghost\" session is one which is not actually connected,\n"
- "but which the IRC server believes is still online for one\n"
- "reason or another. Typically, this happens if your\n"
- "computer crashes or your Internet or modem connection\n"
- "goes down while you're on IRC.\n"
- " \n"
- "In order to use the \002GHOST\002 command for a nick, your\n"
- "current address as shown in /WHOIS must be on that nick's\n"
- "access list, you must be identified and in the group of\n"
- "that nick, or you must supply the correct password for\n"
- "the nickname."));
- return true;
- }
-};
-
-class NSGhost : public Module
-{
- CommandNSGhost commandnsghost;
-
- public:
- NSGhost(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnsghost(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnsghost);
- }
-};
-
-MODULE_INIT(NSGhost)
diff --git a/modules/core/ns_group.cpp b/modules/core/ns_group.cpp
deleted file mode 100644
index 2e23e1f51..000000000
--- a/modules/core/ns_group.cpp
+++ /dev/null
@@ -1,305 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSGroup : public Command
-{
- public:
- CommandNSGroup(Module *creator) : Command(creator, "nickserv/group", 1, 2)
- {
- this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
- this->SetDesc(_("Join a group"));
- this->SetSyntax(_("\037target\037 \037password\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- const Anope::string &nick = params[0];
- const Anope::string &pass = params.size() > 1 ? params[1] : "";
-
- if (readonly)
- {
- source.Reply(_("Sorry, nickname grouping is temporarily disabled."));
- return;
- }
-
- if (Config->RestrictOperNicks)
- for (unsigned i = 0; i < Config->Opers.size(); ++i)
- {
- Oper *o = Config->Opers[i];
-
- if (!u->HasMode(UMODE_OPER) && u->nick.find_ci(o->name) != Anope::string::npos)
- {
- source.Reply(NICK_CANNOT_BE_REGISTERED, u->nick.c_str());
- return;
- }
- }
-
- NickAlias *target, *na = findnick(u->nick);
- if (!(target = findnick(nick)))
- source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
- else if (Anope::CurTime < u->lastnickreg + Config->NSRegDelay)
- source.Reply(_("Please wait %d seconds before using the GROUP command again."), (Config->NSRegDelay + u->lastnickreg) - Anope::CurTime);
- else if (target && target->nc->HasFlag(NI_SUSPENDED))
- {
- Log(LOG_COMMAND, u, this) << "tried to use GROUP for SUSPENDED nick " << target->nick;
- source.Reply(NICK_X_SUSPENDED, target->nick.c_str());
- }
- else if (na && target->nc == na->nc)
- source.Reply(_("You are already a member of the group of \002%s\002."), target->nick.c_str());
- else if (na && na->nc != u->Account())
- source.Reply(NICK_IDENTIFY_REQUIRED, Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str());
- else if (na && Config->NSNoGroupChange)
- source.Reply(_("Your nick is already registered."));
- else if (Config->NSMaxAliases && (target->nc->aliases.size() >= Config->NSMaxAliases) && !target->nc->IsServicesOper())
- source.Reply(_("There are too many nicks in %s's group."));
- else
- {
- bool ok = false;
- if (!na && u->Account())
- ok = true;
- else if (!u->fingerprint.empty() && target->nc->FindCert(u->fingerprint))
- ok = true;
- else if (!pass.empty())
- {
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnCheckAuthentication, OnCheckAuthentication(this, &source, params, target->nc->display, pass));
- if (MOD_RESULT == EVENT_STOP)
- return;
- else if (MOD_RESULT == EVENT_ALLOW)
- ok = true;
- }
- if (ok)
- {
- /* If the nick is already registered, drop it.
- * If not, check that it is valid.
- */
- if (na)
- delete na;
- else
- {
- size_t prefixlen = Config->NSGuestNickPrefix.length();
- size_t nicklen = u->nick.length();
-
- if (nicklen <= prefixlen + 7 && nicklen >= prefixlen + 1 && !u->nick.find_ci(Config->NSGuestNickPrefix) && !u->nick.substr(prefixlen).find_first_not_of("1234567890"))
- {
- source.Reply(NICK_CANNOT_BE_REGISTERED, u->nick.c_str());
- return;
- }
- }
-
- na = new NickAlias(u->nick, target->nc);
-
- Anope::string last_usermask = u->GetIdent() + "@" + u->GetDisplayedHost();
- na->last_usermask = last_usermask;
- na->last_realname = u->realname;
- na->time_registered = na->last_seen = Anope::CurTime;
-
- u->Login(na->nc);
- FOREACH_MOD(I_OnNickGroup, OnNickGroup(u, target));
- if (target->nc->HasFlag(NI_UNCONFIRMED) == false)
- ircdproto->SendAccountLogin(u, u->Account());
- ircdproto->SetAutoIdentificationToken(u);
-
- 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") << ")";
- source.Reply(_("You are now in the group of \002%s\002."), target->nick.c_str());
-
- u->lastnickreg = Anope::CurTime;
- }
- else
- {
- Log(LOG_COMMAND, u, this) << "failed group for " << target->nick;
- source.Reply(PASSWORD_INCORRECT);
- bad_password(u);
- }
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("This command makes your nickname join the \037target\037 nickname's \n"
- "group. \037password\037 is the password of the target nickname.\n"
- " \n"
- "Joining a group will allow you to share your configuration,\n"
- "memos, and channel privileges with all the nicknames in the\n"
- "group, and much more!\n"
- " \n"
- "A group exists as long as it is useful. This means that even\n"
- "if a nick of the group is dropped, you won't lose the\n"
- "shared things described above, as long as there is at\n"
- "least one nick remaining in the group.\n"
- " \n"
- "You may be able to use this command even if you have not registered\n"
- "your nick yet. If your nick is already registered, you'll\n"
- "need to identify yourself before using this command.\n"
- " \n"
- "It is recommended to use this command with a non-registered\n"
- "nick because it will be registered automatically when \n"
- "using this command. You may use it with a registered nick (to \n"
- "change your group) only if your network administrators allowed \n"
- "it.\n"
- " \n"
- "You can only be in one group at a time. Group merging is\n"
- "not possible.\n"
- " \n"
- "\037Note\037: all the nicknames of a group have the same password."));
- return true;
- }
-};
-
-class CommandNSUngroup : public Command
-{
- public:
- CommandNSUngroup(Module *creator) : Command(creator, "nickserv/ungroup", 0, 1)
- {
- this->SetDesc(_("Remove a nick from a group"));
- this->SetSyntax(_("[\037nick\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- Anope::string nick = !params.empty() ? params[0] : "";
- NickAlias *na = findnick(!nick.empty() ? nick : u->nick);
-
- if (u->Account()->aliases.size() == 1)
- source.Reply(_("Your nick is not grouped to anything, you can't ungroup it."));
- else if (!na)
- source.Reply(NICK_X_NOT_REGISTERED, !nick.empty() ? nick.c_str() : u->nick.c_str());
- else if (na->nc != u->Account())
- source.Reply(_("The nick %s is not in your group."), na->nick.c_str());
- else
- {
- NickCore *oldcore = na->nc;
-
- std::list<NickAlias *>::iterator it = std::find(oldcore->aliases.begin(), oldcore->aliases.end(), na);
- if (it != oldcore->aliases.end())
- oldcore->aliases.erase(it);
-
- if (na->nick.equals_ci(oldcore->display))
- change_core_display(oldcore);
-
- na->nc = new NickCore(na->nick);
- na->nc->aliases.push_back(na);
-
- na->nc->pass = oldcore->pass;
- if (!oldcore->email.empty())
- na->nc->email = oldcore->email;
- if (!oldcore->greet.empty())
- na->nc->greet = oldcore->greet;
- na->nc->language = oldcore->language;
-
- source.Reply(_("Nick %s has been ungrouped from %s."), na->nick.c_str(), oldcore->display.c_str());
-
- User *user = finduser(na->nick);
- if (user)
- /* The user on the nick who was ungrouped may be identified to the old group, set -r */
- user->RemoveMode(findbot(Config->NickServ), UMODE_REGISTERED);
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("This command ungroups your nick, or if given, the specificed nick,\n"
- "from the group it is in. The ungrouped nick keeps its registration\n"
- "time, password, email, greet, language, url, and icq. Everything\n"
- "else is reset. You may not ungroup yourself if there is only one\n"
- "nick in your group."));
- return true;
- }
-};
-
-class CommandNSGList : public Command
-{
- public:
- CommandNSGList(Module *creator) : Command(creator, "nickserv/glist", 0, 1)
- {
- this->SetDesc(_("Lists all nicknames in your group"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- Anope::string nick = !params.empty() ? params[0] : "";
-
- const NickCore *nc = u->Account();
-
- if (!nick.empty() && (!nick.equals_ci(u->nick) && !u->IsServicesOper()))
- source.Reply(ACCESS_DENIED, Config->NickServ.c_str());
- else if (!nick.empty() && (!findnick(nick) || !(nc = findnick(nick)->nc)))
- source.Reply(nick.empty() ? NICK_NOT_REGISTERED : _(NICK_X_NOT_REGISTERED), nick.c_str());
- else
- {
- source.Reply(!nick.empty() ? _("List of nicknames in the group of \002%s\002:") : _("List of nicknames in your group:"), 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;
-
- source.Reply(na2->HasFlag(NS_NO_EXPIRE) || !Config->NSExpire ? _(" %s (does not expire)") : _(" %s (expires in %s)"), na2->nick.c_str(), do_strftime(na2->last_seen + Config->NSExpire).c_str());
- }
- source.Reply(_("%d nicknames in the group."), nc->aliases.size());
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- User *u = source.u;
- if (u->IsServicesOper())
- source.Reply(_("Syntax: \002%s [\037nickname\037]\002\n"
- " \n"
- "Without a parameter, lists all nicknames that are in\n"
- "your group.\n"
- " \n"
- "With a parameter, lists all nicknames that are in the\n"
- "group of the given nick.\n"
- "This use limited to \002Services Operators\002."),
- source.command.c_str());
- else
- source.Reply(_("Syntax: \002%s\002\n"
- " \n"
- "Lists all nicks in your group."), source.command.c_str());
-
- return true;
- }
-};
-
-class NSGroup : public Module
-{
- CommandNSGroup commandnsgroup;
- CommandNSUngroup commandnsungroup;
- CommandNSGList commandnsglist;
-
- public:
- NSGroup(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnsgroup(this), commandnsungroup(this), commandnsglist(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnsgroup);
- ModuleManager::RegisterService(&commandnsungroup);
- ModuleManager::RegisterService(&commandnsglist);
- }
-};
-
-MODULE_INIT(NSGroup)
diff --git a/modules/core/ns_identify.cpp b/modules/core/ns_identify.cpp
deleted file mode 100644
index b0a375cd2..000000000
--- a/modules/core/ns_identify.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSIdentify : public Command
-{
- public:
- CommandNSIdentify(Module *creator) : Command(creator, "nickserv/identify", 1, 2)
- {
- this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
- this->SetDesc(_("Identify yourself with your password"));
- this->SetSyntax(_("[\037account\037] \037password\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- 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);
- if (na && na->nc->HasFlag(NI_SUSPENDED))
- source.Reply(NICK_X_SUSPENDED, na->nick.c_str());
- else if (u->Account() && na && u->Account() == na->nc)
- source.Reply(_("You are already identified."));
- else
- {
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnCheckAuthentication, OnCheckAuthentication(this, &source, params, na ? na->nc->display : nick, pass));
- if (MOD_RESULT == EVENT_STOP)
- return;
-
- if (!na)
- source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
- else if (MOD_RESULT != EVENT_ALLOW)
- {
- Log(LOG_COMMAND, u, this) << "and failed to identify";
- source.Reply(PASSWORD_INCORRECT);
- bad_password(u);
- }
- else
- {
- if (u->IsIdentified())
- Log(LOG_COMMAND, u, this) << "to log out of account " << u->Account()->display;
-
- Log(LOG_COMMAND, u, this) << "and identified for account " << na->nc->display;
- source.Reply(_("Password accepted - you are now recognized."));
- u->Identify(na);
- }
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Tells %s that you are really the owner of this\n"
- "nick. Many commands require you to authenticate yourself\n"
- "with this command before you use them. The password\n"
- "should be the same one you sent with the \002REGISTER\002\n"
- "command."), source.owner->nick.c_str());
- return true;
- }
-};
-
-class NSIdentify : public Module
-{
- CommandNSIdentify commandnsidentify;
-
- public:
- NSIdentify(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnsidentify(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnsidentify);
- }
-};
-
-MODULE_INIT(NSIdentify)
diff --git a/modules/core/ns_info.cpp b/modules/core/ns_info.cpp
deleted file mode 100644
index 5a6d9dc0c..000000000
--- a/modules/core/ns_info.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSInfo : public Command
-{
- private:
- // cannot be const, as it is modified
- void CheckOptStr(Anope::string &buf, NickCoreFlag opt, const Anope::string &str, NickCore *nc, bool reverse_logic = false)
- {
- if (reverse_logic ? !nc->HasFlag(opt) : nc->HasFlag(opt))
- {
- if (!buf.empty())
- buf += ", ";
-
- buf += str;
- }
- }
- public:
- CommandNSInfo(Module *creator) : Command(creator, "nickserv/info", 0, 2)
- {
- this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
- this->SetDesc(_("Displays information about a given nickname"));
- this->SetSyntax(_("[\037nickname\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- const Anope::string &nick = params.size() ? params[0] : (u->Account() ? u->Account()->display : u->nick);
- NickAlias *na = findnick(nick);
- bool has_auspex = u->IsIdentified() && u->HasPriv("nickserv/auspex");
-
- if (!na)
- {
- if (nickIsServices(nick, true))
- source.Reply(_("Nick \002%s\002 is part of this Network's Services."), nick.c_str());
- else
- source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
- }
- else
- {
- bool nick_online = false, show_hidden = false;
-
- /* Is the real owner of the nick we're looking up online? -TheShadow */
- User *u2 = finduser(na->nick);
- if (u2 && u2->Account() == na->nc)
- nick_online = true;
-
- if (has_auspex || (u->Account() && na->nc == u->Account()))
- show_hidden = true;
-
- source.Reply(_("%s is %s"), na->nick.c_str(), na->last_realname.c_str());
-
- if (na->nc->IsServicesOper() && (show_hidden || !na->nc->HasFlag(NI_HIDE_STATUS)))
- source.Reply(_("%s is a services operator of type %s."), na->nick.c_str(), na->nc->o->ot->GetName().c_str());
-
- if (nick_online)
- {
- if (show_hidden || !na->nc->HasFlag(NI_HIDE_MASK))
- source.Reply(_(" Is online from: %s"), na->last_usermask.c_str());
- else
- source.Reply(_("%s is currently online."), na->nick.c_str());
- }
- else
- {
- if (show_hidden || !na->nc->HasFlag(NI_HIDE_MASK))
- source.Reply(_("Last seen address: %s"), na->last_usermask.c_str());
- }
-
- source.Reply(_(" Time registered: %s"), do_strftime(na->time_registered).c_str());
-
- if (!nick_online)
- {
- source.Reply(_(" Last seen time: %s"), do_strftime(na->last_seen).c_str());
- }
-
- if (!na->last_quit.empty() && (show_hidden || !na->nc->HasFlag(NI_HIDE_QUIT)))
- source.Reply(_("Last quit message: %s"), na->last_quit.c_str());
-
- if (!na->nc->email.empty() && (show_hidden || !na->nc->HasFlag(NI_HIDE_EMAIL)))
- source.Reply(_(" E-mail address: %s"), na->nc->email.c_str());
-
- if (show_hidden)
- {
- if (na->hostinfo.HasVhost())
- {
- if (ircd->vident && !na->hostinfo.GetIdent().empty())
- source.Reply(_(" vhost: %s@%s"), na->hostinfo.GetIdent().c_str(), na->hostinfo.GetHost().c_str());
- else
- source.Reply(_(" vhost: %s"), na->hostinfo.GetHost().c_str());
- }
- if (!na->nc->greet.empty())
- source.Reply(_(" Greet message: %s"), na->nc->greet.c_str());
-
- Anope::string optbuf;
-
- CheckOptStr(optbuf, NI_KILLPROTECT, _("Protection"), na->nc);
- CheckOptStr(optbuf, NI_SECURE, _("Security"), na->nc);
- CheckOptStr(optbuf, NI_PRIVATE, _("Private"), na->nc);
- CheckOptStr(optbuf, NI_MSG, _("Message mode"), na->nc);
- CheckOptStr(optbuf, NI_AUTOOP, _("Auto-op"), na->nc);
-
- source.Reply(NICK_INFO_OPTIONS, optbuf.empty() ? _("None") : optbuf.c_str());
-
- if (na->nc->HasFlag(NI_SUSPENDED))
- {
- if (!na->last_quit.empty())
- source.Reply(_("This nickname is currently suspended, reason: %s"), na->last_quit.c_str());
- else
- source.Reply(_("This nickname is currently suspended"));
- }
-
- if (na->nc->HasFlag(NI_UNCONFIRMED) == false)
- {
- if (na->HasFlag(NS_NO_EXPIRE) || !Config->NSExpire)
- source.Reply(_("This nickname will not expire."));
- else
- source.Reply(_("Expires on: %s"), do_strftime(na->last_seen + Config->NSExpire).c_str());
- }
- else
- source.Reply(_("Expires on: %s"), do_strftime(na->time_registered + Config->NSUnconfirmedExpire).c_str());
- }
-
- FOREACH_MOD(I_OnNickInfo, OnNickInfo(source, na, show_hidden));
-
- if (na->nc->HasFlag(NI_UNCONFIRMED))
- source.Reply(_("This nickname is unconfirmed."));
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Displays information about the given nickname, such as\n"
- "the nick's owner, last seen address and time, and nick\n"
- "options. If no nick is given, and you are identified,\n"
- "your account name is used, else your current nickname is\n"
- "used."));
-
- return true;
- }
-};
-
-class NSInfo : public Module
-{
- CommandNSInfo commandnsinfo;
-
- public:
- NSInfo(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnsinfo(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnsinfo);
- }
-};
-
-MODULE_INIT(NSInfo)
diff --git a/modules/core/ns_list.cpp b/modules/core/ns_list.cpp
deleted file mode 100644
index 96049ba02..000000000
--- a/modules/core/ns_list.cpp
+++ /dev/null
@@ -1,169 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSList : public Command
-{
- public:
- CommandNSList(Module *creator) : Command(creator, "nickserv/list", 1, 2)
- {
- this->SetDesc(_("List all registered nicknames that match a given pattern"));
- this->SetSyntax(_("\037pattern\037 [SUSPENDED] [NOEXPIRE] [UNCONFIRMED]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- Anope::string pattern = params[0];
- const NickCore *mync;
- unsigned nnicks;
- bool is_servadmin = u->IsServicesOper();
- char noexpire_char = ' ';
- int count = 0, from = 0, to = 0;
- bool suspended, nsnoexpire, unconfirmed;
-
- suspended = nsnoexpire = unconfirmed = false;
-
- if (pattern[0] == '#')
- {
- Anope::string n1 = myStrGetToken(pattern.substr(1), '-', 0), /* Read FROM out */
- n2 = myStrGetToken(pattern, '-', 1);
-
- try
- {
- from = convertTo<int>(n1);
- to = convertTo<int>(n2);
- }
- catch (const ConvertException &)
- {
- source.Reply(LIST_INCORRECT_RANGE);
- return;
- }
-
- pattern = "*";
- }
-
- nnicks = 0;
-
- if (is_servadmin && params.size() > 1)
- {
- Anope::string keyword;
- spacesepstream keywords(params[1]);
- while (keywords.GetToken(keyword))
- {
- if (keyword.equals_ci("NOEXPIRE"))
- nsnoexpire = true;
- if (keyword.equals_ci("SUSPENDED"))
- suspended = true;
- if (keyword.equals_ci("UNCONFIRMED"))
- unconfirmed = true;
- }
- }
-
- mync = u->Account();
-
- source.Reply(LIST_HEADER, pattern.c_str());
- for (nickalias_map::const_iterator it = NickAliasList.begin(), it_end = NickAliasList.end(); it != it_end; ++it)
- {
- NickAlias *na = it->second;
-
- /* Don't show private nicks to non-services admins. */
- if (na->nc->HasFlag(NI_PRIVATE) && !is_servadmin && na->nc != mync)
- continue;
- else if (nsnoexpire && !na->HasFlag(NS_NO_EXPIRE))
- continue;
- else if (suspended && !na->nc->HasFlag(NI_SUSPENDED))
- continue;
- else if (unconfirmed && !na->nc->HasFlag(NI_UNCONFIRMED))
- continue;
-
- /* We no longer compare the pattern against the output buffer.
- * Instead we build a nice nick!user@host buffer to compare.
- * The output is then generated separately. -TheShadow */
- Anope::string buf = Anope::printf("%s!%s", na->nick.c_str(), !na->last_usermask.empty() ? na->last_usermask.c_str() : "*@*");
- if (na->nick.equals_ci(pattern) || Anope::Match(buf, pattern))
- {
- if (((count + 1 >= from && count + 1 <= to) || (!from && !to)) && ++nnicks <= Config->NSListMax)
- {
- if (is_servadmin && na->HasFlag(NS_NO_EXPIRE))
- noexpire_char = '!';
- else
- noexpire_char = ' ';
- if (na->nc->HasFlag(NI_HIDE_MASK) && !is_servadmin && na->nc != mync)
- buf = Anope::printf("%-20s [Hostname Hidden]", na->nick.c_str());
- else if (na->nc->HasFlag(NI_SUSPENDED))
- buf = Anope::printf("%-20s [Suspended]", na->nick.c_str());
- else if (na->nc->HasFlag(NI_UNCONFIRMED))
- buf = Anope::printf("%-20s [Unconfirmed]", na->nick.c_str());
- else
- buf = Anope::printf("%-20s %s", na->nick.c_str(), na->last_usermask.c_str());
- source.Reply(" %c%s", noexpire_char, buf.c_str());
- }
- ++count;
- }
- }
-
-
- source.Reply(_("End of list - %d/%d matches shown."), nnicks > Config->NSListMax ? Config->NSListMax : nnicks, nnicks);
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Lists all registered nicknames which match the given\n"
- "pattern, in \037nick!user@host\037 format. Nicks with the \002PRIVATE\002\n"
- "option set will only be displayed to Services Operators. Nicks\n"
- "with the \002NOEXPIRE\002 option set will have a \002!\002 appended to\n"
- "the nickname for Services Operators.\n"
- " \n"
- "If the SUSPENDED, NOEXPIRE or UNCONFIRMED options are given, only\n"
- "nicks which, respectively, are SUSPENDED, UNCONFIRMED or have the\n"
- "NOEXPIRE flag set will be displayed. If multiple options are\n"
- "given, all nicks matching at least one option will be displayed.\n"
- "These options are limited to \037Services Operators\037. \n"
- "\n"
- "Examples:\n"
- " \n"
- " \002LIST *!joeuser@foo.com\002\n"
- " Lists all registered nicks owned by joeuser@foo.com.\n"
- " \n"
- " \002LIST *Bot*!*@*\002\n"
- " Lists all registered nicks with \002Bot\002 in their\n"
- " names (case insensitive).\n"
- " \n"
- " \002LIST * NOEXPIRE\002\n"
- " Lists all registered nicks which have been set to not expire.\n"));
-
- return true;
- }
-};
-
-class NSList : public Module
-{
- CommandNSList commandnslist;
-
- public:
- NSList(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnslist(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnslist);
- }
-};
-
-MODULE_INIT(NSList)
diff --git a/modules/core/ns_logout.cpp b/modules/core/ns_logout.cpp
deleted file mode 100644
index 476330a11..000000000
--- a/modules/core/ns_logout.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-#include "nickserv.h"
-
-class CommandNSLogout : public Command
-{
- public:
- CommandNSLogout(Module *creator) : Command(creator, "nickserv/logout", 0, 2)
- {
- this->SetDesc(_("Reverses the effect of the IDENTIFY command"));
- this->SetSyntax(_("[\037nickname\037 [REVALIDATE]]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- const Anope::string &nick = !params.empty() ? params[0] : "";
- const Anope::string &param = params.size() > 1 ? params[1] : "";
-
- User *u2;
- if (!u->IsServicesOper() && !nick.empty())
- this->OnSyntaxError(source, "");
- else if (!(u2 = (!nick.empty() ? finduser(nick) : u)))
- source.Reply(NICK_X_NOT_IN_USE, nick.c_str());
- else if (!nick.empty() && !u2->IsServicesOper())
- source.Reply(_("You can't logout %s because they are a Services Operator."), nick.c_str());
- else
- {
- if (!nick.empty() && !param.empty() && param.equals_ci("REVALIDATE") && nickserv)
- nickserv->Validate(u2);
-
- u2->isSuperAdmin = 0; /* Dont let people logout and remain a SuperAdmin */
- Log(LOG_COMMAND, u, this) << "to logout " << u2->nick;
-
- /* Remove founder status from this user in all channels */
- if (!nick.empty())
- source.Reply(_("Nick %s has been logged out."), nick.c_str());
- else
- source.Reply(_("Your nick has been logged out."));
-
- ircdproto->SendAccountLogout(u2, u2->Account());
- u2->RemoveMode(source.owner, UMODE_REGISTERED);
- ircdproto->SendUnregisteredNick(u2);
-
- u2->Logout();
-
- /* Send out an event */
- FOREACH_MOD(I_OnNickLogout, OnNickLogout(u2));
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Without a parameter, reverses the effect of the \002IDENTIFY\002 \n"
- "command, i.e. make you not recognized as the real owner of the nick\n"
- "anymore. Note, however, that you won't be asked to reidentify\n"
- "yourself.\n"
- " \n"
- "With a parameter, does the same for the given nick. If you \n"
- "specify REVALIDATE as well, Services will ask the given nick\n"
- "to re-identify. This use limited to \002Services Operators\002."));
-
- return true;
- }
-};
-
-class NSLogout : public Module
-{
- CommandNSLogout commandnslogout;
-
- public:
- NSLogout(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnslogout(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnslogout);
- }
-};
-
-MODULE_INIT(NSLogout)
diff --git a/modules/core/ns_main.cpp b/modules/core/ns_main.cpp
deleted file mode 100644
index 57323d0a5..000000000
--- a/modules/core/ns_main.cpp
+++ /dev/null
@@ -1,307 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-#include "nickserv.h"
-
-static BotInfo *NickServ;
-
-class MyNickServService : public NickServService
-{
- public:
- MyNickServService(Module *m) : NickServService(m) { }
-
- void Validate(User *u)
- {
- NickAlias *na = findnick(u->nick);
- if (!na)
- return;
-
- if (na->nc->HasFlag(NI_SUSPENDED))
- {
- u->SendMessage(NickServ, NICK_X_SUSPENDED, u->nick.c_str());
- u->Collide(na);
- return;
- }
-
- if (!u->IsIdentified() && !u->fingerprint.empty() && na->nc->FindCert(u->fingerprint))
- {
- u->SendMessage(NickServ, _("SSL Fingerprint accepted, you are now identified."));
- u->Identify(na);
- return;
- }
-
- if (!na->nc->HasFlag(NI_SECURE) && u->IsRecognized())
- {
- na->last_seen = Anope::CurTime;
- Anope::string last_usermask = u->GetIdent() + "@" + u->GetDisplayedHost();
- na->last_usermask = last_usermask;
- na->last_realname = u->realname;
- return;
- }
-
- if (u->IsRecognized() || !na->nc->HasFlag(NI_KILL_IMMED))
- {
- if (na->nc->HasFlag(NI_SECURE))
- u->SendMessage(NickServ, NICK_IS_SECURE, Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str());
- else
- u->SendMessage(NickServ, NICK_IS_REGISTERED, Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str());
- }
-
- if (na->nc->HasFlag(NI_KILLPROTECT) && !u->IsRecognized())
- {
- if (na->nc->HasFlag(NI_KILL_IMMED))
- {
- u->SendMessage(NickServ, FORCENICKCHANGE_NOW);
- u->Collide(na);
- }
- else if (na->nc->HasFlag(NI_KILL_QUICK))
- {
- u->SendMessage(NickServ, _("If you do not change within 20 seconds, I will change your nick."));
- new NickServCollide(u, 20);
- }
- else
- {
- u->SendMessage(NickServ, _("If you do not change within one minute, I will change your nick."));
- new NickServCollide(u, 60);
- }
- }
-
- }
-};
-
-class ExpireCallback : public CallBack
-{
- public:
- ExpireCallback(Module *owner) : CallBack(owner, Config->ExpireTimeout, Anope::CurTime, true) { }
-
- void Tick(time_t)
- {
- if (noexpire || readonly)
- return;
-
- for (nickalias_map::const_iterator it = NickAliasList.begin(), it_end = NickAliasList.end(); it != it_end; )
- {
- NickAlias *na = it->second;
- ++it;
-
- User *u = finduser(na->nick);
- if (u && (na->nc->HasFlag(NI_SECURE) ? u->IsIdentified(true) : u->IsRecognized(true)))
- na->last_seen = Anope::CurTime;
-
- bool expire = false;
-
- if (na->nc->HasFlag(NI_UNCONFIRMED))
- if (Config->NSUnconfirmedExpire && Anope::CurTime - na->time_registered >= Config->NSUnconfirmedExpire)
- expire = true;
- if (na->nc->HasFlag(NI_SUSPENDED))
- {
- if (Config->NSSuspendExpire && Anope::CurTime - na->last_seen >= Config->NSSuspendExpire)
- expire = true;
- }
- else if (Config->NSExpire && Anope::CurTime - na->last_seen >= Config->NSExpire)
- expire = true;
- if (na->HasFlag(NS_NO_EXPIRE))
- expire = false;
-
- if (expire)
- {
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnPreNickExpire, OnPreNickExpire(na));
- if (MOD_RESULT == EVENT_STOP)
- continue;
- Anope::string extra;
- if (na->nc->HasFlag(NI_SUSPENDED))
- extra = "suspended ";
- Log(LOG_NORMAL, "expire") << "Expiring " << extra << "nickname " << na->nick << " (group: " << na->nc->display << ") (e-mail: " << (na->nc->email.empty() ? "none" : na->nc->email) << ")";
- FOREACH_MOD(I_OnNickExpire, OnNickExpire(na));
- delete na;
- }
- }
- }
-};
-
-class NickServCore : public Module
-{
- MyNickServService mynickserv;
- ExpireCallback expires;
-
- public:
- NickServCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE), mynickserv(this), expires(this)
- {
- this->SetAuthor("Anope");
-
- NickServ = findbot(Config->NickServ);
- if (NickServ == NULL)
- throw ModuleException("No bot named " + Config->NickServ);
-
- Implementation i[] = { I_OnDelNick, I_OnDelCore, I_OnChangeCoreDisplay, I_OnNickIdentify, I_OnNickGroup,
- I_OnNickUpdate, I_OnUserNickChange, I_OnPreHelp, I_OnPostHelp };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
-
- ModuleManager::RegisterService(&this->mynickserv);
- }
-
- void OnDelNick(NickAlias *na)
- {
- User *u = finduser(na->nick);
- if (u && u->Account() == na->nc)
- {
- u->RemoveMode(NickServ, UMODE_REGISTERED);
- ircdproto->SendAccountLogout(u, u->Account());
- ircdproto->SendUnregisteredNick(u);
- u->Logout();
- }
- }
-
- void OnDelCore(NickCore *nc)
- {
- Log(NickServ, "nick") << "deleting nickname group " << nc->display;
-
- /* Clean up this nick core from any users online using it
- * (ones that /nick but remain unidentified)
- */
- for (std::list<User *>::iterator it = nc->Users.begin(); it != nc->Users.end();)
- {
- User *user = *it++;
- ircdproto->SendAccountLogout(user, user->Account());
- user->RemoveMode(NickServ, UMODE_REGISTERED);
- ircdproto->SendUnregisteredNick(user);
- user->Logout();
- FOREACH_MOD(I_OnNickLogout, OnNickLogout(user));
- }
- nc->Users.clear();
- }
-
- void OnChangeCoreDisplay(NickCore *nc, const Anope::string &newdisplay)
- {
- Log(LOG_NORMAL, "nick", NickServ) << "Changing " << nc->display << " nickname group display to " << newdisplay;
- }
-
- void OnNickIdentify(User *u)
- {
- NickAlias *this_na = findnick(u->nick);
- if (this_na && this_na->nc == u->Account() && u->Account()->HasFlag(NI_UNCONFIRMED) == false)
- u->SetMode(NickServ, UMODE_REGISTERED);
-
- if (Config->NSModeOnID)
- for (UChannelList::iterator it = u->chans.begin(), it_end = u->chans.end(); it != it_end; ++it)
- {
- ChannelContainer *cc = *it;
- Channel *c = cc->chan;
- if (c)
- chan_set_correct_modes(u, c, 1);
- }
-
- if (Config->NSForceEmail && u->Account()->email.empty())
- {
- u->SendMessage(NickServ, _("You must now supply an e-mail for your nick.\n"
- "This e-mail will allow you to retrieve your password in\n"
- "case you forget it."));
- u->SendMessage(NickServ, _("Type \002%s%s SET EMAIL \037e-mail\037\002 in order to set your e-mail.\n"
- "Your privacy is respected; this e-mail won't be given to\n"
- "any third-party person."), Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str());
- }
-
- if (u->Account()->HasFlag(NI_UNCONFIRMED))
- {
- u->SendMessage(NickServ, _("Your email address is not confirmed. To confirm it, follow the instructions that were emailed to you when you registered."));
- this_na = findnick(u->Account()->display);
- time_t time_registered = Anope::CurTime - this_na->time_registered;
- if (Config->NSUnconfirmedExpire > time_registered)
- u->SendMessage(NickServ, _("Your account will expire, if not confirmed, in %s"), duration(Config->NSUnconfirmedExpire - time_registered).c_str());
- }
- }
-
- void OnNickGroup(User *u, NickAlias *target)
- {
- if (target->nc->HasFlag(NI_UNCONFIRMED) == false)
- u->SetMode(NickServ, UMODE_REGISTERED);
- }
-
- void OnNickUpdate(User *u)
- {
- for (UChannelList::iterator it = u->chans.begin(), it_end = u->chans.end(); it != it_end; ++it)
- {
- ChannelContainer *cc = *it;
- Channel *c = cc->chan;
- if (c)
- chan_set_correct_modes(u, c, 1);
- }
- }
-
- void OnUserNickChange(User *u, const Anope::string &oldnick)
- {
- NickAlias *na = findnick(u->nick);
- /* If the new nick isnt registerd or its registerd and not yours */
- if (!na || na->nc != u->Account())
- {
- u->RemoveMode(NickServ, UMODE_REGISTERED);
- ircdproto->SendUnregisteredNick(u);
-
- this->mynickserv.Validate(u);
- }
- else
- {
- if (na->nc->HasFlag(NI_UNCONFIRMED) == false)
- {
- u->SetMode(NickServ, UMODE_REGISTERED);
- ircdproto->SetAutoIdentificationToken(u);
- }
- Log(NickServ) << u->GetMask() << " automatically identified for group " << u->Account()->display;
- }
- }
-
- void OnUserModeSet(User *u, UserModeName Name)
- {
- if (Name == UMODE_REGISTERED && !u->IsIdentified())
- u->RemoveMode(NickServ, Name);
- }
-
- void OnPreHelp(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!params.empty() || source.owner->nick != Config->NickServ)
- return;
- source.Reply(_("\002%s\002 allows you to \"register\" a nickname and\n"
- "prevent others from using it. The following\n"
- "commands allow for registration and maintenance of\n"
- "nicknames; to use them, type \002%s%s \037command\037\002.\n"
- "For more information on a specific command, type\n"
- "\002%s%s %s \037command\037\002.\n "), Config->NickServ.c_str(), Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str(), Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str(), source.command.c_str());
- }
-
- void OnPostHelp(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!params.empty() || source.owner->nick != Config->NickServ)
- return;
- if (source.u->IsServicesOper())
- source.Reply(_(" \n"
- "Services Operators can also drop any nickname without needing\n"
- "to identify for the nick, and may view the access list for\n"
- "any nickname."));
- if (Config->NSExpire >= 86400)
- source.Reply(_("Nicknames that are not used anymore are subject to \n"
- "the automatic expiration, i.e. they will be deleted\n"
- "after %d days if not used."), Config->NSExpire / 86400);
- source.Reply(_(" \n"
- "\002NOTICE:\002 This service is intended to provide a way for\n"
- "IRC users to ensure their identity is not compromised.\n"
- "It is \002NOT\002 intended to facilitate \"stealing\" of\n"
- "nicknames or other malicious actions. Abuse of %s\n"
- "will result in, at minimum, loss of the abused\n"
- "nickname(s)."), Config->NickServ.c_str());
- }
-};
-
-MODULE_INIT(NickServCore)
-
diff --git a/modules/core/ns_recover.cpp b/modules/core/ns_recover.cpp
deleted file mode 100644
index 5e45aab9a..000000000
--- a/modules/core/ns_recover.cpp
+++ /dev/null
@@ -1,132 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSRecover : public Command
-{
- public:
- CommandNSRecover(Module *creator) : Command(creator, "nickserv/recover", 1, 2)
- {
- this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
- this->SetDesc(_("Kill another user who has taken your nick"));
- this->SetSyntax(_("\037nickname\037 [\037password\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- const Anope::string &nick = params[0];
- const Anope::string &pass = params.size() > 1 ? params[1] : "";
-
- NickAlias *na;
- User *u2;
- if (!(u2 = finduser(nick)))
- source.Reply(NICK_X_NOT_IN_USE, nick.c_str());
- else if (!(na = findnick(u2->nick)))
- source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
- else if (na->nc->HasFlag(NI_SUSPENDED))
- source.Reply(NICK_X_SUSPENDED, na->nick.c_str());
- else if (nick.equals_ci(u->nick))
- source.Reply(_("You can't recover yourself!"));
- else if (!pass.empty())
- {
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnCheckAuthentication, OnCheckAuthentication(this, &source, params, na->nc->display, pass));
- if (MOD_RESULT == EVENT_STOP)
- return;
-
- if (MOD_RESULT == EVENT_ALLOW)
- {
- u2->SendMessage(source.owner, FORCENICKCHANGE_NOW);
- u2->Collide(na);
-
- /* Convert Config->NSReleaseTimeout seconds to string format */
- Anope::string relstr = duration(Config->NSReleaseTimeout);
-
- source.Reply(NICK_RECOVERED, Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str(), nick.c_str(), relstr.c_str());
- }
- else
- {
- source.Reply(ACCESS_DENIED);
- Log(LOG_COMMAND, u, this) << "with invalid password for " << nick;
- bad_password(u);
- }
- }
- else
- {
- if (u->Account() == na->nc || (!na->nc->HasFlag(NI_SECURE) && is_on_access(u, na->nc)) ||
- (!u->fingerprint.empty() && na->nc->FindCert(u->fingerprint)))
- {
- u2->SendMessage(source.owner, FORCENICKCHANGE_NOW);
- u2->Collide(na);
-
- /* Convert Config->NSReleaseTimeout seconds to string format */
- Anope::string relstr = duration(Config->NSReleaseTimeout);
-
- source.Reply(NICK_RECOVERED, Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str(), nick.c_str(), relstr.c_str());
- }
- else
- source.Reply(ACCESS_DENIED);
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- /* Convert Config->NSReleaseTimeout seconds to string format */
- Anope::string relstr = duration(Config->NSReleaseTimeout);
-
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows you to recover your nickname if someone else has\n"
- "taken it; this does the same thing that %s does\n"
- "automatically if someone tries to use a kill-protected\n"
- "nick.\n"
- " \n"
- "When you give this command, %s will bring a fake\n"
- "user online with the same nickname as the user you're\n"
- "trying to recover your nick from. This causes the IRC\n"
- "servers to disconnect the other user. This fake user will\n"
- "remain online for %s to ensure that the other\n"
- "user does not immediately reconnect; after that time, you\n"
- "can reclaim your nick. Alternatively, use the \002RELEASE\002\n"
- "command (\002%s%s HELP RELEASE\002) to get the nick\n"
- "back sooner.\n"
- " \n"
- "In order to use the \002RECOVER\002 command for a nick, your\n"
- "current address as shown in /WHOIS must be on that nick's\n"
- "access list, you must be identified and in the group of\n"
- "that nick, or you must supply the correct password for\n"
- "the nickname."), Config->NickServ.c_str(), Config->NickServ.c_str(), relstr.c_str(), Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str());
-
- return true;
- }
-};
-
-class NSRecover : public Module
-{
- CommandNSRecover commandnsrecover;
-
- public:
- NSRecover(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnsrecover(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnsrecover);
- }
-};
-
-MODULE_INIT(NSRecover)
diff --git a/modules/core/ns_register.cpp b/modules/core/ns_register.cpp
deleted file mode 100644
index 552551994..000000000
--- a/modules/core/ns_register.cpp
+++ /dev/null
@@ -1,355 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-static bool SendRegmail(User *u, NickAlias *na, BotInfo *bi);
-
-class CommandNSConfirm : public Command
-{
- public:
- CommandNSConfirm(Module *creator) : Command(creator, "nickserv/confirm", 1, 2)
- {
- this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
- this->SetDesc(_("Confirm an auth code"));
- this->SetSyntax(_("\037passcode\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &passcode = params[0];
-
- if (u->Account() && u->HasPriv("nickserv/confirm"))
- {
- NickAlias *na = findnick(passcode);
- if (na == NULL)
- source.Reply(NICK_X_NOT_REGISTERED, passcode.c_str());
- else if (na->nc->HasFlag(NI_UNCONFIRMED) == false)
- source.Reply(_("Nick \002%s\002 is already confirmed."), na->nick.c_str());
- else
- {
- na->nc->UnsetFlag(NI_UNCONFIRMED);
- Log(LOG_ADMIN, u, this) << "to confirm nick " << na->nick << " (" << na->nc->display << ")";
- source.Reply(_("Nick \002%s\002 has been confirmed."), na->nick.c_str());
- }
- }
- else if (u->Account())
- {
- Anope::string code;
- if (u->Account()->GetExtRegular<Anope::string>("ns_register_passcode", code) && code == passcode)
- {
- u->Account()->Shrink("ns_register_passcode");
- Log(LOG_COMMAND, u, this) << "to confirm their email";
- source.Reply(_("Your email address of \002%s\002 has been confirmed."), u->Account()->email.c_str());
- u->Account()->UnsetFlag(NI_UNCONFIRMED);
- ircdproto->SendAccountLogin(u, u->Account());
- NickAlias *na = findnick(u->nick);
- if (na && na->nc == u->Account())
- u->SetMode(findbot(Config->NickServ), UMODE_REGISTERED);
- }
- else
- source.Reply(_("Invalid passcode."));
- }
- else
- source.Reply(_("Invalid passcode."));
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- User *u = source.u;
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("This command is used by several commands as a way to confirm\n"
- "changes made to your account.\n"
- " \n"
- "This is most commonly used to confirm your email address once\n"
- "you register or change it.\n"
- " \n"
- "This is also used after the RESETPASS command has been used to\n"
- "force identify you to your nick so you may change your password."));
- if (u->Account() && u->HasPriv("nickserv/confirm"))
- source.Reply(_("Additionally, Services Operators with the \037nickserv/confirm\037 permission can\n"
- "replace \037passcode\037 with a users nick to force validate them."));
- return true;
- }
-
- void OnSyntaxError(CommandSource &source, const Anope::string &subcommand)
- {
- source.Reply(NICK_CONFIRM_INVALID);
- }
-};
-
-class CommandNSRegister : public Command
-{
- public:
- CommandNSRegister(Module *creator) : Command(creator, "nickserv/register", 1, 2)
- {
- this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
- this->SetDesc(_("Register a nickname"));
- if (Config->NSForceEmail)
- this->SetSyntax(_("\037password\037 \037email\037"));
- else
- this->SetSyntax(_("\037password\037 \037[email]\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- NickAlias *na;
- size_t prefixlen = Config->NSGuestNickPrefix.length();
- size_t nicklen = u->nick.length();
- Anope::string pass = params[0];
- Anope::string email = params.size() > 1 ? params[1] : "";
-
- if (readonly)
- {
- source.Reply(_("Sorry, nickname registration is temporarily disabled."));
- return;
- }
-
- if (!u->HasMode(UMODE_OPER) && Config->NickRegDelay && Anope::CurTime - u->my_signon < Config->NickRegDelay)
- {
- source.Reply(_("You must have been using this nick for at least %d seconds to register."), Config->NickRegDelay);
- return;
- }
-
- /* Prevent "Guest" nicks from being registered. -TheShadow */
-
- /* Guest nick can now have a series of between 1 and 7 digits.
- * --lara
- */
- if (nicklen <= prefixlen + 7 && nicklen >= prefixlen + 1 && !u->nick.find_ci(Config->NSGuestNickPrefix) && u->nick.substr(prefixlen).find_first_not_of("1234567890") == Anope::string::npos)
- {
- source.Reply(NICK_CANNOT_BE_REGISTERED, u->nick.c_str());
- return;
- }
-
- if (Config->RestrictOperNicks)
- for (unsigned i = 0; i < Config->Opers.size(); ++i)
- {
- Oper *o = Config->Opers[i];
-
- if (!u->HasMode(UMODE_OPER) && u->nick.find_ci(o->name) != Anope::string::npos)
- {
- source.Reply(NICK_CANNOT_BE_REGISTERED, u->nick.c_str());
- return;
- }
- }
-
- if (Config->NSForceEmail && email.empty())
- this->OnSyntaxError(source, "");
- else if (Anope::CurTime < u->lastnickreg + Config->NSRegDelay)
- source.Reply(_("Please wait %d seconds before using the REGISTER command again."), (u->lastnickreg + Config->NSRegDelay) - Anope::CurTime);
- else if ((na = findnick(u->nick)))
- source.Reply(NICK_ALREADY_REGISTERED, u->nick.c_str());
- else if (pass.equals_ci(u->nick) || (Config->StrictPasswords && pass.length() < 5))
- source.Reply(MORE_OBSCURE_PASSWORD);
- else if (pass.length() > Config->PassLen)
- source.Reply(PASSWORD_TOO_LONG);
- else if (!email.empty() && !MailValidate(email))
- source.Reply(MAIL_X_INVALID, email.c_str());
- else
- {
- na = new NickAlias(u->nick, new NickCore(u->nick));
- enc_encrypt(pass, na->nc->pass);
- if (!email.empty())
- na->nc->email = email;
-
- Anope::string last_usermask = u->GetIdent() + "@" + u->GetDisplayedHost();
- na->last_usermask = last_usermask;
- na->last_realname = u->realname;
- if (Config->NSAddAccessOnReg)
- na->nc->AddAccess(create_mask(u));
-
- u->Login(na->nc);
-
- Log(LOG_COMMAND, u, this) << "to register " << na->nick << " (email: " << (!na->nc->email.empty() ? na->nc->email : "none") << ")";
-
- FOREACH_MOD(I_OnNickRegister, OnNickRegister(na));
-
- if (Config->NSAddAccessOnReg)
- source.Reply(_("Nickname \002%s\002 registered under your account: %s"), u->nick.c_str(), na->nc->GetAccess(0).c_str());
- else
- source.Reply(_("Nickname \002%s\002 registered."), u->nick.c_str());
-
- Anope::string tmp_pass;
- if (enc_decrypt(na->nc->pass, tmp_pass) == 1)
- source.Reply(_("Your password is \002%s\002 - remember this for later use."), tmp_pass.c_str());
-
- if (Config->NSEmailReg)
- {
- na->nc->SetFlag(NI_UNCONFIRMED);
- if (SendRegmail(u, na, source.owner))
- {
- source.Reply(_("A passcode has been sent to %s, please type %s%s confirm <passcode> to confirm your email address."), email.c_str(), Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str());
- source.Reply(_("If you do not confirm your email address within %s your account will expire."), duration(Config->NSUnconfirmedExpire).c_str());
- }
- }
- else
- ircdproto->SendAccountLogin(u, u->Account());
- ircdproto->SetAutoIdentificationToken(u);
-
- u->lastnickreg = Anope::CurTime;
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply("\n");
- source.Reply(_("Registers your nickname in the %s database. Once\n"
- "your nick is registered, you can use the \002SET\002 and \002ACCESS\002\n"
- "commands to configure your nick's settings as you like\n"
- "them. Make sure you remember the password you use when\n"
- "registering - you'll need it to make changes to your nick\n"
- "later. (Note that \002case matters!\002 \037ANOPE\037, \037Anope\037, and \n"
- "\037anope\037 are all different passwords!)\n"
- " \n"
- "Guidelines on choosing passwords:\n"
- " \n"
- "Passwords should not be easily guessable. For example,\n"
- "using your real name as a password is a bad idea. Using\n"
- "your nickname as a password is a much worse idea ;) and,\n"
- "in fact, %s will not allow it. Also, short\n"
- "passwords are vulnerable to trial-and-error searches, so\n"
- "you should choose a password at least 5 characters long.\n"
- "Finally, the space character cannot be used in passwords.\n"),
- Config->NickServ.c_str(), Config->NickServ.c_str());
-
- if (!Config->NSForceEmail)
- source.Reply(_(" \n"
- "The parameter \037email\037 is optional and will set the email\n"
- "for your nick immediately.\n"
- "Your privacy is respected; this e-mail won't be given to\n"
- "any third-party person.\n"
- " \n"));
-
- source.Reply(_("This command also creates a new group for your nickname,\n"
- "that will allow you to register other nicks later sharing\n"
- "the same configuration, the same set of memos and the\n"
- "same channel privileges."));
- return true;
- }
-};
-
-class CommandNSResend : public Command
-{
- public:
- CommandNSResend(Module *creator) : Command(creator, "nickserv/resend", 0, 0)
- {
- this->SetSyntax("");
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!Config->NSEmailReg)
- return;
-
- User *u = source.u;
- NickAlias *na = findnick(u->nick);
-
- if (na == NULL)
- source.Reply(NICK_NOT_REGISTERED);
- else if (na->nc != u->Account() || u->Account()->HasFlag(NI_UNCONFIRMED) == false)
- source.Reply(_("Your account is already confirmed."));
- else
- {
- if (Anope::CurTime < u->Account()->lastmail + Config->NSResendDelay)
- source.Reply(_("Cannot send mail now; please retry a little later."));
- else if (!SendRegmail(u, na, source.owner))
- {
- na->nc->lastmail = Anope::CurTime;
- source.Reply(_("Your passcode has been re-sent to %s."), na->nc->email.c_str());
- Log(LOG_COMMAND, u, this) << "to resend registration verification code";
- }
- else
- Log() << "Unable to resend registration verification code for " << u->nick;
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- if (!Config->NSEmailReg)
- return false;
-
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("This command will re-send the auth code (also called passcode)\n"
- "to the e-mail address of the user whom is performing it."));
- return true;
- }
-
- void OnServHelp(CommandSource &source)
- {
- if (Config->NSEmailReg)
- source.Reply(" %-14s %s", this->name.c_str(),_("Resend the registration passcode"));
- }
-};
-
-class NSRegister : public Module
-{
- CommandNSRegister commandnsregister;
- CommandNSConfirm commandnsconfirm;
- CommandNSResend commandnsrsend;
-
- public:
- NSRegister(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnsregister(this), commandnsconfirm(this), commandnsrsend(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnsregister);
- ModuleManager::RegisterService(&commandnsconfirm);
- ModuleManager::RegisterService(&commandnsrsend);
- }
-};
-
-static bool SendRegmail(User *u, NickAlias *na, BotInfo *bi)
-{
- Anope::string code;
- if (na->nc->GetExtRegular<Anope::string>("ns_register_passcode", code) == false)
- {
- int chars[] = {
- ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
- 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
- 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
- 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
- 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
- };
- int idx, min = 1, max = 62;
- for (idx = 0; idx < 9; ++idx)
- code += chars[1 + static_cast<int>((static_cast<float>(max - min)) * getrandom16() / 65536.0) + min];
- na->nc->Extend("ns_register_passcode", new ExtensibleItemRegular<Anope::string>(code));
- }
-
- Anope::string subject = Anope::printf(_("Nickname Registration (%s)"), na->nick.c_str());
- Anope::string message = Anope::printf(_("Hi,\n"
- " \n"
- "You have requested to register the nickname %s on %s.\n"
- "Please type \" %s%s confirm %s \" to complete registration.\n"
- " \n"
- "If you don't know why this mail was sent to you, please ignore it silently.\n"
- " \n"
- "%s administrators."), na->nick.c_str(), Config->NetworkName.c_str(), Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str(), code.c_str(), Config->NetworkName.c_str());
-
- return Mail(u, na->nc, bi, subject, message);
-}
-
-MODULE_INIT(NSRegister)
diff --git a/modules/core/ns_release.cpp b/modules/core/ns_release.cpp
deleted file mode 100644
index 20a3e295c..000000000
--- a/modules/core/ns_release.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSRelease : public Command
-{
- public:
- CommandNSRelease(Module *creator) : Command(creator, "nickserv/release", 1, 2)
- {
- this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
- this->SetDesc(_("Regain custody of your nick after RECOVER"));
- this->SetSyntax(_("\037nickname\037 [\037password\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &nick = params[0];
- Anope::string pass = params.size() > 1 ? params[1] : "";
- NickAlias *na;
-
- if (!(na = findnick(nick)))
- source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
- else if (na->nc->HasFlag(NI_SUSPENDED))
- source.Reply(NICK_X_SUSPENDED, na->nick.c_str());
- else if (!na->HasFlag(NS_HELD))
- source.Reply(_("Nick \002%s\002 isn't being held."), nick.c_str());
- else if (!pass.empty())
- {
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnCheckAuthentication, OnCheckAuthentication(this, &source, params, na->nc->display, pass));
- if (MOD_RESULT == EVENT_STOP)
- return;
-
- if (MOD_RESULT == EVENT_ALLOW)
- {
- Log(LOG_COMMAND, u, this) << "released " << na->nick;
- na->Release();
- source.Reply(_("Services' hold on your nick has been released."));
- }
- else
- {
- source.Reply(ACCESS_DENIED);
- Log(LOG_COMMAND, u, this) << "invalid password for " << nick;
- bad_password(u);
- }
- }
- else
- {
- if (u->Account() == na->nc || (!na->nc->HasFlag(NI_SECURE) && is_on_access(u, na->nc)) ||
- (!u->fingerprint.empty() && na->nc->FindCert(u->fingerprint)))
- {
- na->Release();
- source.Reply(_("Services' hold on your nick has been released."));
- }
- else
- source.Reply(ACCESS_DENIED);
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- /* Convert Config->NSReleaseTimeout seconds to string format */
- Anope::string relstr = duration(Config->NSReleaseTimeout);
-
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Instructs %s to remove any hold on your nickname\n"
- "caused by automatic kill protection or use of the \002RECOVER\002\n"
- "command. This holds lasts for %s;\n"
- "This command gets rid of them sooner.\n"
- " \n"
- "In order to use the \002RELEASE\002 command for a nick, your\n"
- "current address as shown in /WHOIS must be on that nick's\n"
- "access list, you must be identified and in the group of\n"
- "that nick, or you must supply the correct password for\n"
- "the nickname."), Config->NickServ.c_str(), relstr.c_str());
-
-
- return true;
- }
-};
-
-class NSRelease : public Module
-{
- CommandNSRelease commandnsrelease;
-
- public:
- NSRelease(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnsrelease(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnsrelease);
- }
-};
-
-MODULE_INIT(NSRelease)
diff --git a/modules/core/ns_resetpass.cpp b/modules/core/ns_resetpass.cpp
deleted file mode 100644
index b0d40226f..000000000
--- a/modules/core/ns_resetpass.cpp
+++ /dev/null
@@ -1,152 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-static bool SendResetEmail(User *u, NickAlias *na, BotInfo *bi);
-
-class CommandNSResetPass : public Command
-{
- public:
- CommandNSResetPass(Module *creator) : Command(creator, "nickserv/resetpass", 1, 1)
- {
- this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
- this->SetDesc(_("Helps you reset lost passwords"));
- this->SetSyntax(_("\037nickname\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- NickAlias *na;
-
- if (Config->RestrictMail && (!u->Account() || !u->HasCommand("nickserv/nickserv/resetpass")))
- source.Reply(ACCESS_DENIED);
- else if (!(na = findnick(params[0])))
- source.Reply(NICK_X_NOT_REGISTERED, params[0].c_str());
- else
- {
- if (SendResetEmail(u, na, source.owner))
- {
- Log(LOG_COMMAND, u, this) << "for " << na->nick << " (group: " << na->nc->display << ")";
- source.Reply(_("Password reset email for \002%s\002 has been sent."), na->nick.c_str());
- }
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Sends a code key to the nickname with instructions on how to\n"
- "reset their password."));
- return true;
- }
-};
-
-class NSResetPass : public Module
-{
- CommandNSResetPass commandnsresetpass;
-
- public:
- NSResetPass(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnsresetpass(this)
- {
- this->SetAuthor("Anope");
-
- if (!Config->UseMail)
- throw ModuleException("Not using mail.");
-
- ModuleManager::RegisterService(&commandnsresetpass);
-
- ModuleManager::Attach(I_OnPreCommand, this);
- }
-
- EventReturn OnPreCommand(CommandSource &source, Command *command, std::vector<Anope::string> &params)
- {
- if (command->name == "nickserv/confirm" && params.size() > 1)
- {
- User *u = source.u;
- NickAlias *na = findnick(params[0]);
-
- time_t t;
- Anope::string c;
- if (na && na->nc->GetExtRegular("ns_resetpass_code", c) && na->nc->GetExtRegular("ns_resetpass_time", t))
- {
- const Anope::string &passcode = params[1];
- if (t < Anope::CurTime - 3600)
- {
- na->nc->Shrink("ns_resetpass_code");
- na->nc->Shrink("ns_resetpass_time");
- source.Reply(_("Your password reset request has expired."));
- }
- else if (passcode.equals_cs(c))
- {
- na->nc->Shrink("ns_resetpass_code");
- na->nc->Shrink("ns_resetpass_time");
-
- Log(LOG_COMMAND, u, &commandnsresetpass) << "confirmed RESETPASS to forcefully identify to " << na->nick;
-
- na->nc->UnsetFlag(NI_UNCONFIRMED);
- u->Identify(na);
-
- source.Reply(_("You are now identified for your nick. Change your passwor now."));
-
- }
- else
- return EVENT_CONTINUE;
-
- return EVENT_STOP;
- }
- }
-
- return EVENT_CONTINUE;
- }
-};
-
-static bool SendResetEmail(User *u, NickAlias *na, BotInfo *bi)
-{
- int min = 1, max = 62;
- int chars[] = {
- ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
- 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
- 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
- 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
- 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
- };
-
- Anope::string passcode;
- int idx;
- for (idx = 0; idx < 20; ++idx)
- passcode += chars[1 + static_cast<int>((static_cast<float>(max - min)) * getrandom16() / 65536.0) + min];
-
- Anope::string subject = Anope::printf(translate(na->nc, _("Reset password request for %s")), na->nick.c_str());
- Anope::string message = Anope::printf(translate(na->nc, _(
- "Hi,\n"
- " \n"
- "You have requested to have the password for %s reset.\n"
- "To reset your password, type %s%s CONFIRM %s %s\n"
- " \n"
- "If you don't know why this mail was sent to you, please ignore it silently.\n"
- " \n"
- "%s administrators.")), na->nick.c_str(), Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str(), na->nick.c_str(), passcode.c_str(), Config->NetworkName.c_str());
-
- na->nc->Extend("ns_resetpass_code", new ExtensibleItemRegular<Anope::string>(passcode));
- na->nc->Extend("ns_resetpass_time", new ExtensibleItemRegular<time_t>(Anope::CurTime));
-
- return Mail(u, na->nc, bi, subject, message);
-}
-
-MODULE_INIT(NSResetPass)
diff --git a/modules/core/ns_saset.cpp b/modules/core/ns_saset.cpp
deleted file mode 100644
index a4aa2f422..000000000
--- a/modules/core/ns_saset.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSSASet : public Command
-{
- public:
- CommandNSSASet(Module *creator) : Command(creator, "nickserv/saset", 2, 4)
- {
- this->SetDesc(_("Set SET-options on another nickname"));
- this->SetSyntax(_("\037option\037 \037nickname\037 \037parameters\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->OnSyntaxError(source, "");
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(_("Sets various nickname options. \037option\037 can be one of:"));
- Anope::string this_name = source.command;
- for (BotInfo::command_map::iterator it = source.owner->commands.begin(), it_end = source.owner->commands.end(); it != it_end; ++it)
- {
- const Anope::string &c_name = it->first;
- CommandInfo &info = it->second;
-
- if (c_name.find_ci(this_name + " ") == 0)
- {
- service_reference<Command> command(info.name);
- if (command)
- {
- source.command = c_name;
- command->OnServHelp(source);
- }
- }
- }
- source.Reply(_("Type \002%s%s HELP SASET \037option\037\002 for more information\n"
- "on a specific option. The options will be set on the given\n"
- "\037nickname\037."), Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str());
- return true;
- }
-};
-
-class CommandNSSASetDisplay : public Command
-{
- public:
- CommandNSSASetDisplay(Module *creator) : Command(creator, "nickserv/saset/display", 2, 2)
- {
- this->SetDesc(_("Set the display of the group in Services"));
- this->SetSyntax(_("\037nickname\037 \037new-display\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- NickAlias *setter_na = findnick(params[0]);
- if (setter_na == NULL)
- {
- source.Reply(NICK_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
- NickCore *nc = setter_na->nc;
-
- NickAlias *na = findnick(params[1]);
- if (!na || na->nc != nc)
- {
- source.Reply(_("The new display for \002%s\002 MUST be a nickname of the nickname group!"), nc->display.c_str());
- return;
- }
-
- change_core_display(nc, params[1]);
- source.Reply(NICK_SET_DISPLAY_CHANGED, nc->display.c_str());
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(_("Changes the display used to refer to the nickname group in \n"
- "Services. The new display MUST be a nick of the group."));
- return true;
- }
-};
-
-class CommandNSSASetPassword : public Command
-{
- public:
- CommandNSSASetPassword(Module *creator) : Command(creator, "nickserv/saset/password", 2, 2)
- {
- this->SetDesc(_("Set the nickname password"));
- this->SetSyntax(_("\037nickname\037 \037new-password\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- NickAlias *setter_na = findnick(params[0]);
- if (setter_na == NULL)
- {
- source.Reply(NICK_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
- NickCore *nc = setter_na->nc;
-
- size_t len = params[1].length();
-
- if (Config->NSSecureAdmins && u->Account() != nc && nc->IsServicesOper())
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
- else if (nc->display.equals_ci(params[1]) || (Config->StrictPasswords && len < 5))
- {
- source.Reply(MORE_OBSCURE_PASSWORD);
- return;
- }
- else if (len > Config->PassLen)
- {
- source.Reply(PASSWORD_TOO_LONG);
- return;
- }
-
- enc_encrypt(params[1], nc->pass);
- Anope::string tmp_pass;
- if (enc_decrypt(nc->pass, tmp_pass) == 1)
- source.Reply(_("Password for \002%s\002 changed to \002%s\002."), nc->display.c_str(), tmp_pass.c_str());
- else
- source.Reply(_("Password for \002%s\002 changed."), nc->display.c_str());
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Changes the password used to identify as the nick's owner."));
- return true;
- }
-};
-
-class NSSASet : public Module
-{
- CommandNSSASet commandnssaset;
- CommandNSSASetDisplay commandnssasetdisplay;
- CommandNSSASetPassword commandnssasetpassword;
-
- public:
- NSSASet(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnssaset(this), commandnssasetdisplay(this), commandnssasetpassword(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnssaset);
- ModuleManager::RegisterService(&commandnssasetdisplay);
- ModuleManager::RegisterService(&commandnssasetpassword);
- }
-};
-
-MODULE_INIT(NSSASet)
diff --git a/modules/core/ns_saset_noexpire.cpp b/modules/core/ns_saset_noexpire.cpp
deleted file mode 100644
index 1bff9b461..000000000
--- a/modules/core/ns_saset_noexpire.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSSASetNoexpire : public Command
-{
- public:
- CommandNSSASetNoexpire(Module *creator) : Command(creator, "nickserv/saset/noexpire", 1, 2)
- {
- this->SetDesc(_("Prevent the nickname from expiring"));
- this->SetSyntax(_("\037nickname\037 {ON | OFF}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- NickAlias *na = findnick(params[0]);
- if (na == NULL)
- {
- source.Reply(NICK_X_NOT_REGISTERED, params[0].c_str());
- return;
- }
-
- Anope::string param = params.size() > 1 ? params[1] : "";
-
- if (param.equals_ci("ON"))
- {
- na->SetFlag(NS_NO_EXPIRE);
- source.Reply(_("Nick %s \002will not\002 expire."), na->nick.c_str());
- }
- else if (param.equals_ci("OFF"))
- {
- na->UnsetFlag(NS_NO_EXPIRE);
- source.Reply(_("Nick %s \002will\002 expire."), na->nick.c_str());
- }
- else
- this->OnSyntaxError(source, "NOEXPIRE");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Sets whether the given nickname will expire. Setting this\n"
- "to \002ON\002 prevents the nickname from expiring."));
- return true;
- }
-};
-
-class NSSASetNoexpire : public Module
-{
- CommandNSSASetNoexpire commandnssasetnoexpire;
-
- public:
- NSSASetNoexpire(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnssasetnoexpire(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnssasetnoexpire);
- }
-};
-
-MODULE_INIT(NSSASetNoexpire)
diff --git a/modules/core/ns_sendpass.cpp b/modules/core/ns_sendpass.cpp
deleted file mode 100644
index ca185c68b..000000000
--- a/modules/core/ns_sendpass.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-static bool SendPassMail(User *u, NickAlias *na, BotInfo *bi, const Anope::string &pass);
-
-class CommandNSSendPass : public Command
-{
- public:
- CommandNSSendPass(Module *creator) : Command(creator, "nickserv/sendpass", 1, 1)
- {
- this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
- this->SetDesc(_("Forgot your password? Try this"));
- this->SetSyntax(_("\037nickname\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &nick = params[0];
- NickAlias *na;
-
- if (Config->RestrictMail && (!u->Account() || !u->HasCommand("nickserv/sendpass")))
- source.Reply(ACCESS_DENIED);
- else if (!(na = findnick(nick)))
- source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
- else
- {
- Anope::string tmp_pass;
- if (enc_decrypt(na->nc->pass, tmp_pass) == 1)
- {
- if (SendPassMail(u, na, source.owner, tmp_pass))
- {
- Log(Config->RestrictMail ? LOG_ADMIN : LOG_COMMAND, u, this) << "for " << na->nick;
- source.Reply(_("Password of \002%s\002 has been sent."), nick.c_str());
- }
- }
- else
- source.Reply(_("SENDPASS command unavailable because encryption is in use."));
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Send the password of the given nickname to the e-mail address\n"
- "set in the nickname record. This command is really useful\n"
- "to deal with lost passwords.\n"
- " \n"
- "May be limited to \002IRC operators\002 on certain networks."));
- return true;
- }
-};
-
-class NSSendPass : public Module
-{
- CommandNSSendPass commandnssendpass;
-
- public:
- NSSendPass(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnssendpass(this)
- {
- this->SetAuthor("Anope");
-
- if (!Config->UseMail)
- throw ModuleException("Not using mail.");
-
- Anope::string tmp_pass = "plain:tmp";
- if (enc_decrypt(tmp_pass, tmp_pass) == -1)
- throw ModuleException("Incompatible with the encryption module being used");
-
- ModuleManager::RegisterService(&commandnssendpass);
- }
-};
-
-static bool SendPassMail(User *u, NickAlias *na, BotInfo *bi, const Anope::string &pass)
-{
- char subject[BUFSIZE], message[BUFSIZE];
-
- snprintf(subject, sizeof(subject), translate(na->nc, _("Nickname password (%s)")), na->nick.c_str());
- snprintf(message, sizeof(message), translate(na->nc, _(
- "Hi,\n"
- " \n"
- "You have requested to receive the password of nickname %s by e-mail.\n"
- "The password is %s. For security purposes, you should change it as soon as you receive this mail.\n"
- " \n"
- "If you don't know why this mail was sent to you, please ignore it silently.\n"
- " \n"
- "%s administrators.")), na->nick.c_str(), pass.c_str(), Config->NetworkName.c_str());
-
- return Mail(u, na->nc, bi, subject, message);
-}
-
-MODULE_INIT(NSSendPass)
diff --git a/modules/core/ns_set.cpp b/modules/core/ns_set.cpp
deleted file mode 100644
index ad7acb5a4..000000000
--- a/modules/core/ns_set.cpp
+++ /dev/null
@@ -1,158 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSSet : public Command
-{
- public:
- CommandNSSet(Module *creator) : Command(creator, "nickserv/set", 1, 3)
- {
- this->SetDesc(_("Set options, including kill protection"));
- this->SetSyntax(_("\037option\037 \037parameters\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->OnSyntaxError(source, "");
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Sets various nickname options. \037option\037 can be one of:"));
- Anope::string this_name = source.command;
- for (BotInfo::command_map::iterator it = source.owner->commands.begin(), it_end = source.owner->commands.end(); it != it_end; ++it)
- {
- const Anope::string &c_name = it->first;
- CommandInfo &info = it->second;
-
- if (c_name.find_ci(this_name + " ") == 0)
- {
- service_reference<Command> command(info.name);
- if (command)
- {
- source.command = c_name;
- command->OnServHelp(source);
- }
- }
- }
- source.Reply(_("Type \002%s%s HELP %s \037option\037\002 for more information\n"
- "on a specific option."), Config->UseStrictPrivMsgString.c_str(), source.owner->nick.c_str(), source.command.c_str());
- return true;
- }
-};
-
-class CommandNSSetDisplay : public Command
-{
- public:
- CommandNSSetDisplay(Module *creator) : Command(creator, "nickserv/set/display", 1)
- {
- this->SetDesc(_("Set the display of your group in Services"));
- this->SetSyntax(_("\037new-display\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- NickAlias *na = findnick(params[1]);
-
- if (!na || na->nc != u->Account())
- {
- source.Reply(_("The new display MUST be a nickname of your nickname group!"));
- return;
- }
-
- change_core_display(u->Account(), params[1]);
- source.Reply(NICK_SET_DISPLAY_CHANGED, u->Account()->display.c_str());
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Changes the display used to refer to your nickname group in \n"
- "Services. The new display MUST be a nick of your group."));
- return true;
- }
-};
-
-class CommandNSSetPassword : public Command
-{
- public:
- CommandNSSetPassword(Module *creator) : Command(creator, "nickserv/set/password", 1)
- {
- this->SetDesc(_("Set your nickname password"));
- this->SetSyntax(_("\037new-password\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- const Anope::string &param = params[1];
- unsigned len = param.length();
-
- if (u->Account()->display.equals_ci(param) || (Config->StrictPasswords && len < 5))
- {
- source.Reply(MORE_OBSCURE_PASSWORD);
- return;
- }
- else if (len > Config->PassLen)
- {
- source.Reply(PASSWORD_TOO_LONG);
- return;
- }
-
- enc_encrypt(param, u->Account()->pass);
- Anope::string tmp_pass;
- if (enc_decrypt(u->Account()->pass, tmp_pass) == 1)
- source.Reply(_("Password for \002%s\002 changed to \002%s\002."), u->Account()->display.c_str(), tmp_pass.c_str());
- else
- source.Reply(_("Password for \002%s\002 changed."), u->Account()->display.c_str());
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Changes the password used to identify you as the nick's\n"
- "owner."));
- return true;
- }
-};
-
-class NSSet : public Module
-{
- CommandNSSet commandnsset;
- CommandNSSetDisplay commandnssetdisplay;
- CommandNSSetPassword commandnssetpassword;
-
- public:
- NSSet(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnsset(this), commandnssetdisplay(this), commandnssetpassword(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnsset);
- ModuleManager::RegisterService(&commandnssetdisplay);
- ModuleManager::RegisterService(&commandnssetpassword);
- }
-};
-
-MODULE_INIT(NSSet)
diff --git a/modules/core/ns_set_autoop.cpp b/modules/core/ns_set_autoop.cpp
deleted file mode 100644
index ff178141f..000000000
--- a/modules/core/ns_set_autoop.cpp
+++ /dev/null
@@ -1,107 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSSetAutoOp : public Command
-{
- public:
- CommandNSSetAutoOp(Module *creator, const Anope::string &sname = "nickserv/set/autoop", size_t min = 1) : Command(creator, sname, min, min + 1)
- {
- this->SetDesc(_("Should services op you automatically."));
- this->SetSyntax(_("{ON | OFF}"));
- }
-
- void Run(CommandSource &source, const Anope::string &user, const Anope::string &param)
- {
- NickAlias *na = findnick(user);
- if (na == NULL)
- {
- source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
- return;
- }
- NickCore *nc = na->nc;
-
- if (param.equals_ci("ON"))
- {
- nc->SetFlag(NI_AUTOOP);
- source.Reply(_("Services will now autoop %s in channels."), nc->display.c_str());
- }
- else if (param.equals_ci("OFF"))
- {
- nc->UnsetFlag(NI_AUTOOP);
- source.Reply(_("Services will no longer autoop %s in channels."), nc->display.c_str());
- }
- else
- this->OnSyntaxError(source, "AUTOOP");
-
- return;
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->Run(source, source.u->Account()->display, params[0]);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Sets whether you will be opped automatically. Set to ON to \n"
- "allow ChanServ to op you automatically when entering channels."));
- return true;
- }
-};
-
-class CommandNSSASetAutoOp : public CommandNSSetAutoOp
-{
- public:
- CommandNSSASetAutoOp(Module *creator) : CommandNSSetAutoOp(creator, "nickserv/saset/autoop", 2)
- {
- this->ClearSyntax();
- this->SetSyntax(_("\037nickname\037 {ON | OFF}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->Run(source, params[0], params[1]);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Sets whether the given nickname will be opped automatically.\n"
- "Set to \002ON\002 to allow ChanServ to op the given nickname \n"
- "omatically when joining channels."));
- return true;
- }
-};
-
-class NSSetAutoOp : public Module
-{
- CommandNSSetAutoOp commandnssetautoop;
- CommandNSSASetAutoOp commandnssasetautoop;
-
- public:
- NSSetAutoOp(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnssetautoop(this), commandnssasetautoop(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnssetautoop);
- ModuleManager::RegisterService(&commandnssasetautoop);
- }
-};
-
-MODULE_INIT(NSSetAutoOp)
diff --git a/modules/core/ns_set_email.cpp b/modules/core/ns_set_email.cpp
deleted file mode 100644
index f0914eb51..000000000
--- a/modules/core/ns_set_email.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-static bool SendConfirmMail(User *u, BotInfo *bi)
-{
- int chars[] = {
- ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
- 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
- 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
- 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
- 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
- };
- int idx, min = 1, max = 62;
- Anope::string code;
- for (idx = 0; idx < 9; ++idx)
- code += chars[1 + static_cast<int>((static_cast<float>(max - min)) * getrandom16() / 65536.0) + min];
- u->Account()->Extend("ns_set_email_passcode", new ExtensibleItemRegular<Anope::string>(code));
-
- Anope::string subject = _("Email confirmation");
- Anope::string message = Anope::printf(_("Hi,\n"
- " \n"
- "You have requested to change your email address to %s.\n"
- "Please type \" %s%s confirm %s \" to confirm this change.\n"
- " \n"
- "If you don't know why this mail was sent to you, please ignore it silently.\n"
- " \n"
- "%s administrators."), u->Account()->email.c_str(), Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str(), code.c_str(), Config->NetworkName.c_str());
-
- return Mail(u, u->Account(), bi, subject, message);
-}
-
-class CommandNSSetEmail : public Command
-{
- public:
- CommandNSSetEmail(Module *creator, const Anope::string &cname = "nickserv/set/email", size_t min = 0) : Command(creator, cname, min, min + 1)
- {
- this->SetDesc(_("Associate an E-mail address with your nickname"));
- this->SetSyntax(_("\037address\037"));
- }
-
- void Run(CommandSource &source, const Anope::string &user, const Anope::string &param)
- {
- User *u = source.u;
- NickAlias *na = findnick(user);
- if (!na)
- {
- source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
- return;
- }
- NickCore *nc = na->nc;
-
- if (param.empty() && Config->NSForceEmail)
- {
- source.Reply(_("You cannot unset the e-mail on this network."));
- return;
- }
- else if (Config->NSSecureAdmins && u->Account() != nc && nc->IsServicesOper())
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
- else if (!param.empty() && !MailValidate(param))
- {
- source.Reply(MAIL_X_INVALID, param.c_str());
- return;
- }
-
- if (!param.empty() && Config->NSConfirmEmailChanges && !u->IsServicesOper())
- {
- u->Account()->Extend("ns_set_email", new ExtensibleItemRegular<Anope::string>(param));
- Anope::string old = u->Account()->email;
- u->Account()->email = param;
- if (SendConfirmMail(u, source.owner))
- source.Reply(_("A confirmation email has been sent to \002%s\002. Follow the instructions in it to change your email address."), param.c_str());
- u->Account()->email = old;
- }
- else
- {
- if (!param.empty())
- {
- nc->email = param;
- source.Reply(_("E-mail address for \002%s\002 changed to \002%s\002."), nc->display.c_str(), param.c_str());
- }
- else
- {
- nc->email.clear();
- source.Reply(_("E-mail address for \002%s\002 unset."), nc->display.c_str());
- }
- }
-
- return;
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->Run(source, source.u->Account()->display, params.size() ? params[0] : "");
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Associates the given E-mail address with your nickname.\n"
- "This address will be displayed whenever someone requests\n"
- "information on the nickname with the \002INFO\002 command."));
- return true;
- }
-};
-
-class CommandNSSASetEmail : public CommandNSSetEmail
-{
- public:
- CommandNSSASetEmail(Module *creator) : CommandNSSetEmail(creator, "nickserv/saset/email", 2)
- {
- this->ClearSyntax();
- this->SetSyntax(_("\037nickname\037 \037address\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->Run(source, params[0], params.size() > 1 ? params[1] : "");
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Associates the given E-mail address with the nickname."));
- return true;
- }
-};
-
-class NSSetEmail : public Module
-{
- CommandNSSetEmail commandnssetemail;
- CommandNSSASetEmail commandnssasetemail;
-
- public:
- NSSetEmail(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnssetemail(this), commandnssasetemail(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::Attach(I_OnPreCommand, this);
-
- ModuleManager::RegisterService(&commandnssetemail);
- ModuleManager::RegisterService(&commandnssasetemail);
- }
-
- EventReturn OnPreCommand(CommandSource &source, Command *command, std::vector<Anope::string> &params)
- {
- User *u = source.u;
- if (command->name == "nickserv/confirm" && !params.empty() && u->IsIdentified())
- {
- Anope::string new_email, passcode;
- if (u->Account()->GetExtRegular("ns_set_email", new_email) && u->Account()->GetExtRegular("ns_set_email_passcode", passcode))
- {
- if (params[0] == passcode)
- {
- u->Account()->email = new_email;
- Log(LOG_COMMAND, u, command) << "to confirm their email address change to " << u->Account()->email;
- source.Reply(_("Your email address has been changed to \002%s\002."), u->Account()->email.c_str());
- u->Account()->Shrink("ns_set_email");
- u->Account()->Shrink("ns_set_email_passcode");
- return EVENT_STOP;
- }
- }
- }
-
- return EVENT_CONTINUE;
- }
-};
-
-MODULE_INIT(NSSetEmail)
diff --git a/modules/core/ns_set_greet.cpp b/modules/core/ns_set_greet.cpp
deleted file mode 100644
index 03bcd3834..000000000
--- a/modules/core/ns_set_greet.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSSetGreet : public Command
-{
- public:
- CommandNSSetGreet(Module *creator, const Anope::string &sname = "nickserv/set/greet", size_t min = 0) : Command(creator, sname, min, min + 1)
- {
- this->SetDesc(_("Associate a greet message with your nickname"));
- this->SetSyntax(_("\037message\037"));
- }
-
- void Run(CommandSource &source, const Anope::string &user, const Anope::string &param)
- {
- NickAlias *na = findnick(user);
- if (!na)
- {
- source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
- return;
- }
- NickCore *nc = na->nc;
-
- if (!param.empty())
- {
- nc->greet = param;
- source.Reply(_("Greet message for \002%s\002 changed to \002%s\002."), nc->display.c_str(), nc->greet.c_str());
- }
- else
- {
- nc->greet.clear();
- source.Reply(_("Greet message for \002%s\002 unset."), nc->display.c_str());
- }
-
- return;
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->Run(source, source.u->Account()->display, params.size() > 0 ? params[0] : "");
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Makes the given message the greet of your nickname, that\n"
- "will be displayed when joining a channel that has GREET\n"
- "option enabled, provided that you have the necessary \n"
- "access on it."));
- return true;
- }
-};
-
-class CommandNSSASetGreet : public CommandNSSetGreet
-{
- public:
- CommandNSSASetGreet(Module *creator) : CommandNSSetGreet(creator, "nickserv/saset/greet", 1)
- {
- this->ClearSyntax();
- this->SetSyntax(_("\037nickname\037 \037message\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->Run(source, params[0], params.size() > 1 ? params[1] : "");
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Makes the given message the greet of the nickname, that\n"
- "will be displayed when joining a channel that has GREET\n"
- "option enabled, provided that the user has the necessary \n"
- "access on it."));
- return true;
- }
-};
-
-class NSSetGreet : public Module
-{
- CommandNSSetGreet commandnssetgreet;
- CommandNSSASetGreet commandnssasetgreet;
-
- public:
- NSSetGreet(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnssetgreet(this), commandnssasetgreet(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnssetgreet);
- ModuleManager::RegisterService(&commandnssasetgreet);
- }
-};
-
-MODULE_INIT(NSSetGreet)
diff --git a/modules/core/ns_set_hide.cpp b/modules/core/ns_set_hide.cpp
deleted file mode 100644
index e0fb0e85e..000000000
--- a/modules/core/ns_set_hide.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSSetHide : public Command
-{
- public:
- CommandNSSetHide(Module *creator, const Anope::string &sname = "nickserv/set/hide", size_t min = 2) : Command(creator, sname, min, min + 1)
- {
- this->SetDesc(_("Hide certain pieces of nickname information"));
- this->SetSyntax(_("{EMAIL | STATUS | USERMASK | QUIT} {ON | OFF}"));
- }
-
- void Run(CommandSource &source, const Anope::string &user, const Anope::string &param, const Anope::string &arg)
- {
- NickAlias *na = findnick(user);
- if (!na)
- {
- source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
- return;
- }
- NickCore *nc = na->nc;
-
- Anope::string onmsg, offmsg;
- NickCoreFlag flag;
-
- if (param.equals_ci("EMAIL"))
- {
- flag = NI_HIDE_EMAIL;
- onmsg = _("The E-mail address of \002%s\002 will now be hidden from %s INFO displays.");
- offmsg = _("The E-mail address of \002%s\002 will now be shown in %s INFO displays.");
- }
- else if (param.equals_ci("USERMASK"))
- {
- flag = NI_HIDE_MASK;
- onmsg = _("The last seen user@host mask of \002%s\002 will now be hidden from %s INFO displays.");
- offmsg = _("The last seen user@host mask of \002%s\002 will now be shown in %s INFO displays.");
- }
- else if (param.equals_ci("STATUS"))
- {
- flag = NI_HIDE_STATUS;
- onmsg = _("The services access status of \002%s\002 will now be hidden from %s INFO displays.");
- offmsg = _("The services access status of \002%s\002 will now be shown in %s INFO displays.");
- }
- else if (param.equals_ci("QUIT"))
- {
- flag = NI_HIDE_QUIT;
- onmsg = _("The last quit message of \002%s\002 will now be hidden from %s INFO displays.");
- offmsg = _("The last quit message of \002%s\002 will now be shown in %s INFO displays.");
- }
- else
- {
- this->OnSyntaxError(source, "HIDE");
- return;
- }
-
- if (arg.equals_ci("ON"))
- {
- nc->SetFlag(flag);
- source.Reply(onmsg.c_str(), nc->display.c_str(), Config->NickServ.c_str());
- }
- else if (arg.equals_ci("OFF"))
- {
- nc->UnsetFlag(flag);
- source.Reply(offmsg.c_str(), nc->display.c_str(), Config->NickServ.c_str());
- }
- else
- this->OnSyntaxError(source, "HIDE");
-
- return;
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->Run(source, source.u->Account()->display, params[0], params[1]);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows you to prevent certain pieces of information from\n"
- "being displayed when someone does a %s \002INFO\002 on your\n"
- "nick. You can hide your E-mail address (\002EMAIL\002), last seen\n"
- "user@host mask (\002USERMASK\002), your services access status\n"
- "(\002STATUS\002) and last quit message (\002QUIT\002).\n"
- "The second parameter specifies whether the information should\n"
- "be displayed (\002OFF\002) or hidden (\002ON\002)."), Config->NickServ.c_str());
- return true;
- }
-};
-
-class CommandNSSASetHide : public CommandNSSetHide
-{
- public:
- CommandNSSASetHide(Module *creator) : CommandNSSetHide(creator, "nickserv/saset/hide", 3)
- {
- this->SetSyntax("\037nickname\037 {EMAIL | STATUS | USERMASK | QUIT} {ON | OFF}");
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->ClearSyntax();
- this->Run(source, params[0], params[1], params[2]);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows you to prevent certain pieces of information from\n"
- "being displayed when someone does a %s \002INFO\002 on the\n"
- "nick. You can hide the E-mail address (\002EMAIL\002), last seen\n"
- "user@host mask (\002USERMASK\002), the services access status\n"
- "(\002STATUS\002) and last quit message (\002QUIT\002).\n"
- "The second parameter specifies whether the information should\n"
- "be displayed (\002OFF\002) or hidden (\002ON\002)."), Config->NickServ.c_str());
- return true;
- }
-};
-
-class NSSetHide : public Module
-{
- CommandNSSetHide commandnssethide;
- CommandNSSASetHide commandnssasethide;
-
- public:
- NSSetHide(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnssethide(this), commandnssasethide(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnssethide);
- ModuleManager::RegisterService(&commandnssasethide);
- }
-};
-
-MODULE_INIT(NSSetHide)
diff --git a/modules/core/ns_set_kill.cpp b/modules/core/ns_set_kill.cpp
deleted file mode 100644
index f57a93893..000000000
--- a/modules/core/ns_set_kill.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSSetKill : public Command
-{
- public:
- CommandNSSetKill(Module *creator, const Anope::string &sname = "nickserv/set/kill", size_t min = 1) : Command(creator, sname, min, min + 1)
- {
- this->SetDesc(_("Turn protection on or off"));
- this->SetSyntax(_("{ON | QUICK | IMMED | OFF}"));
- }
-
- void Run(CommandSource &source, const Anope::string &user, const Anope::string &param)
- {
- NickAlias *na = findnick(user);
- if (!na)
- {
- source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
- return;
- }
- NickCore *nc = na->nc;
-
- if (param.equals_ci("ON"))
- {
- nc->SetFlag(NI_KILLPROTECT);
- nc->UnsetFlag(NI_KILL_QUICK);
- nc->UnsetFlag(NI_KILL_IMMED);
- source.Reply(_("Protection is now \002on\002 for \002%s\002."), nc->display.c_str());
- }
- else if (param.equals_ci("QUICK"))
- {
- nc->SetFlag(NI_KILLPROTECT);
- nc->SetFlag(NI_KILL_QUICK);
- nc->UnsetFlag(NI_KILL_IMMED);
- source.Reply(_("Protection is now \002on\002 for \002%s\002, with a reduced delay."), nc->display.c_str());
- }
- else if (param.equals_ci("IMMED"))
- {
- if (Config->NSAllowKillImmed)
- {
- nc->SetFlag(NI_KILLPROTECT);
- nc->SetFlag(NI_KILL_IMMED);
- nc->UnsetFlag(NI_KILL_QUICK);
- source.Reply(_("Protection is now \002on\002 for \002%s\002, with no delay."), nc->display.c_str());
- }
- else
- source.Reply(_("The \002IMMED\002 option is not available on this network."));
- }
- else if (param.equals_ci("OFF"))
- {
- nc->UnsetFlag(NI_KILLPROTECT);
- nc->UnsetFlag(NI_KILL_QUICK);
- nc->UnsetFlag(NI_KILL_IMMED);
- source.Reply(_("Protection is now \002off\002 for \002%s\002."), nc->display.c_str());
- }
- else
- this->OnSyntaxError(source, "KILL");
-
- return;
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->Run(source, source.u->Account()->display, params[0]);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Turns the automatic protection option for your nick\n"
- "on or off. With protection on, if another user\n"
- "tries to take your nick, they will be given one minute to\n"
- "change to another nick, after which %s will forcibly change\n"
- "their nick.\n"
- " \n"
- "If you select \002QUICK\002, the user will be given only 20 seconds\n"
- "to change nicks instead of the usual 60. If you select\n"
- "\002IMMED\002, user's nick will be changed immediately \037without\037 being\n"
- "warned first or given a chance to change their nick; please\n"
- "do not use this option unless necessary. Also, your\n"
- "network's administrators may have disabled this option."), Config->NickServ.c_str());
- return true;
- }
-};
-
-class CommandNSSASetKill : public CommandNSSetKill
-{
- public:
- CommandNSSASetKill(Module *creator) : CommandNSSetKill(creator, "nickserv/saset/kill", 2)
- {
- this->SetSyntax(_("\037nickname\037 {ON | QUICK | IMMED | OFF}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->ClearSyntax();
- this->Run(source, params[0], params[1]);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Turns the automatic protection option for the nick\n"
- "on or off. With protection on, if another user\n"
- "tries to take the nick, they will be given one minute to\n"
- "change to another nick, after which %s will forcibly change\n"
- "their nick.\n"
- " \n"
- "If you select \002QUICK\002, the user will be given only 20 seconds\n"
- "to change nicks instead of the usual 60. If you select\n"
- "\002IMMED\002, the user's nick will be changed immediately \037without\037 being\n"
- "warned first or given a chance to change their nick; please\n"
- "do not use this option unless necessary. Also, your\n"
- "network's administrators may have disabled this option."), Config->NickServ.c_str());
- return true;
- }
-};
-
-class NSSetKill : public Module
-{
- CommandNSSetKill commandnssetkill;
- CommandNSSASetKill commandnssasetkill;
-
- public:
- NSSetKill(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnssetkill(this), commandnssasetkill(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnssetkill);
- ModuleManager::RegisterService(&commandnssasetkill);
- }
-};
-
-MODULE_INIT(NSSetKill)
diff --git a/modules/core/ns_set_language.cpp b/modules/core/ns_set_language.cpp
deleted file mode 100644
index 3429ad688..000000000
--- a/modules/core/ns_set_language.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSSetLanguage : public Command
-{
- public:
- CommandNSSetLanguage(Module *creator, const Anope::string &sname = "nickserv/set/language", size_t min = 1) : Command(creator, sname, min, min + 1)
- {
- this->SetDesc(_("Set the language Services will use when messaging you"));
- this->SetSyntax(_("\037language\037"));
- }
-
- void Run(CommandSource &source, const Anope::string &user, const Anope::string &param)
- {
- NickAlias *na = findnick(user);
- if (!na)
- {
- source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
- return;
- }
- NickCore *nc = na->nc;
-
- for (unsigned j = 0; j < languages.size(); ++j)
- {
- if (param == "en" || languages[j] == param)
- break;
- else if (j + 1 == languages.size())
- {
- this->OnSyntaxError(source, "");
- return;
- }
- }
-
- nc->language = param != "en" ? param : "";
- source.Reply(_("Language changed to \002English\002."));
-
- return;
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &param)
- {
- this->Run(source, source.u->Account()->display, param[0]);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Changes the language Services uses when sending messages to\n"
- "you (for example, when responding to a command you send).\n"
- "\037language\037 should be chosen from the following list of\n"
- "supported languages:"));
-
- source.Reply(" en (English)");
- for (unsigned j = 0; j < languages.size(); ++j)
- {
- const Anope::string &langname = anope_gettext(languages[j].c_str(), _("English"));
- if (langname == "English")
- continue;
- source.Reply(" %s (%s)", languages[j].c_str(), langname.c_str());
- }
-
- return true;
- }
-};
-
-class CommandNSSASetLanguage : public CommandNSSetLanguage
-{
- public:
- CommandNSSASetLanguage(Module *creator) : CommandNSSetLanguage(creator, "nickserv/saset/language", 2)
- {
- this->ClearSyntax();
- this->SetSyntax(_("\037nickname\037 \037language\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->Run(source, params[0], params[1]);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Changes the language Services uses when sending messages to\n"
- "you (for example, when responding to a command you send).\n"
- "\037language\037 should be chosen from the following list of\n"
- "supported languages:"));
- return true;
- }
-};
-
-class NSSetLanguage : public Module
-{
- CommandNSSetLanguage commandnssetlanguage;
- CommandNSSASetLanguage commandnssasetlanguage;
-
- public:
- NSSetLanguage(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnssetlanguage(this), commandnssasetlanguage(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnssetlanguage);
- ModuleManager::RegisterService(&commandnssasetlanguage);
- }
-};
-
-MODULE_INIT(NSSetLanguage)
diff --git a/modules/core/ns_set_message.cpp b/modules/core/ns_set_message.cpp
deleted file mode 100644
index 677002c78..000000000
--- a/modules/core/ns_set_message.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSSetMessage : public Command
-{
- public:
- CommandNSSetMessage(Module *creator, const Anope::string &sname = "nickserv/set/message", size_t min = 1) : Command(creator, sname, min, min + 1)
- {
- this->SetDesc(_("Change the communication method of Services"));
- this->SetSyntax(_("{ON | OFF}"));
- }
-
- void Run(CommandSource &source, const Anope::string &user, const Anope::string &param)
- {
- NickAlias *na = findnick(user);
- if (!na)
- {
- source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
- return;
- }
- NickCore *nc = na->nc;
-
- if (!Config->UsePrivmsg)
- {
- source.Reply(_("Option \002%s\02 cannot be set on this network."), "MSG");
- return;
- }
-
- if (param.equals_ci("ON"))
- {
- nc->SetFlag(NI_MSG);
- source.Reply(_("Services will now reply to \002%s\002 with \002messages\002."), nc->display.c_str());
- }
- else if (param.equals_ci("OFF"))
- {
- nc->UnsetFlag(NI_MSG);
- source.Reply(_("Services will now reply to \002%s\002 with \002notices\002."), nc->display.c_str());
- }
- else
- this->OnSyntaxError(source, "MSG");
-
- return;
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->Run(source, source.u->Account()->display, params[0]);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows you to choose the way Services are communicating with \n"
- "you. With \002MSG\002 set, Services will use messages, else they'll \n"
- "use notices."));
- return true;
- }
-};
-
-class CommandNSSASetMessage : public CommandNSSetMessage
-{
- public:
- CommandNSSASetMessage(Module *creator) : CommandNSSetMessage(creator, "nickserv/saset/message", 2)
- {
- this->ClearSyntax();
- this->SetSyntax(_("\037nickname\037 {ON | OFF}"));
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows you to choose the way Services are communicating with \n"
- "the given user. With \002MSG\002 set, Services will use messages,\n"
- "else they'll use notices."));
- return true;
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->Run(source, params[0], params[1]);
- }
-};
-
-class NSSetMessage : public Module
-{
- CommandNSSetMessage commandnssetmessage;
- CommandNSSASetMessage commandnssasetmessage;
-
- public:
- NSSetMessage(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnssetmessage(this), commandnssasetmessage(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnssetmessage);
- ModuleManager::RegisterService(&commandnssasetmessage);
- }
-};
-
-MODULE_INIT(NSSetMessage)
diff --git a/modules/core/ns_set_private.cpp b/modules/core/ns_set_private.cpp
deleted file mode 100644
index 63fec57d6..000000000
--- a/modules/core/ns_set_private.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSSetPrivate : public Command
-{
- public:
- CommandNSSetPrivate(Module *creator, const Anope::string &sname = "nickserv/set/private", size_t min = 1) : Command(creator, sname, min, min + 1)
- {
- this->SetDesc(Anope::printf(_("Prevent the nickname from appearing in a \002%s%s LIST\002"), Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str()));
- this->SetSyntax(_("{ON | OFF}"));
- }
-
- void Run(CommandSource &source, const Anope::string &user, const Anope::string &param)
- {
- NickAlias *na = findnick(user);
- if (!na)
- {
- source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
- return;
- }
- NickCore *nc = na->nc;
-
- if (param.equals_ci("ON"))
- {
- nc->SetFlag(NI_PRIVATE);
- source.Reply(_("Private option is now \002on\002 for \002%s\002."), nc->display.c_str());
- }
- else if (param.equals_ci("OFF"))
- {
- nc->UnsetFlag(NI_PRIVATE);
- source.Reply(_("Private option is now \002off\002 for \002%s\002."), nc->display.c_str());
- }
- else
- this->OnSyntaxError(source, "PRIVATE");
-
- return;
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->Run(source, source.u->Account()->display, params[0]);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Turns %s's privacy option on or off for your nick.\n"
- "With \002PRIVATE\002 set, your nickname will not appear in\n"
- "nickname lists generated with %s's \002LIST\002 command.\n"
- "(However, anyone who knows your nickname can still get\n"
- "information on it using the \002INFO\002 command.)"),
- Config->NickServ.c_str(), Config->NickServ.c_str());
- return true;
- }
-};
-
-class CommandNSSASetPrivate : public CommandNSSetPrivate
-{
- public:
- CommandNSSASetPrivate(Module *creator) : CommandNSSetPrivate(creator, "nickserv/saset/private", 2)
- {
- this->ClearSyntax();
- this->SetSyntax(_("\037nickname\037 {ON | OFF}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->Run(source, params[0], params[1]);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Turns %s's privacy option on or off for the nick.\n"
- "With \002PRIVATE\002 set, the nickname will not appear in\n"
- "nickname lists generated with %s's \002LIST\002 command.\n"
- "(However, anyone who knows the nickname can still get\n"
- "information on it using the \002INFO\002 command.)"),
- Config->NickServ.c_str(), Config->NickServ.c_str());
- return true;
- }
-};
-
-class NSSetPrivate : public Module
-{
- CommandNSSetPrivate commandnssetprivate;
- CommandNSSASetPrivate commandnssasetprivate;
-
- public:
- NSSetPrivate(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnssetprivate(this), commandnssasetprivate(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnssetprivate);
- ModuleManager::RegisterService(&commandnssasetprivate);
- }
-};
-
-MODULE_INIT(NSSetPrivate)
diff --git a/modules/core/ns_set_secure.cpp b/modules/core/ns_set_secure.cpp
deleted file mode 100644
index 31314a5a5..000000000
--- a/modules/core/ns_set_secure.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSSetSecure : public Command
-{
- public:
- CommandNSSetSecure(Module *creator, const Anope::string &sname = "nickserv/set/secure", size_t min = 1) : Command(creator, sname, min, min + 1)
- {
- this->SetDesc(_("Turn nickname security on or off"));
- this->SetSyntax(_("{ON | OFF}"));
- }
-
- void Run(CommandSource &source, const Anope::string &user, const Anope::string &param)
- {
- NickAlias *na = findnick(user);
- if (!na)
- {
- source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
- return;
- }
- NickCore *nc = na->nc;
-
- if (param.equals_ci("ON"))
- {
- nc->SetFlag(NI_SECURE);
- source.Reply(_("Secure option is now \002on\002 for \002%s\002."), nc->display.c_str());
- }
- else if (param.equals_ci("OFF"))
- {
- nc->UnsetFlag(NI_SECURE);
- source.Reply(_("Secure option is now \002off\002 for \002%s\002."), nc->display.c_str());
- }
- else
- this->OnSyntaxError(source, "SECURE");
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->Run(source, source.u->Account()->display, params[0]);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Turns %s's security features on or off for your\n"
- "nick. With \002SECURE\002 set, you must enter your password\n"
- "before you will be recognized as the owner of the nick,\n"
- "regardless of whether your address is on the access\n"
- "list. However, if you are on the access list, %s\n"
- "will not auto-kill you regardless of the setting of the\n"
- "\002KILL\002 option."), Config->NickServ.c_str(), Config->NickServ.c_str());
- return true;
- }
-};
-
-class CommandNSSASetSecure : public CommandNSSetSecure
-{
- public:
- CommandNSSASetSecure(Module *creator) : CommandNSSetSecure(creator, "nickserv/saset/secure", 2)
- {
- this->ClearSyntax();
- this->SetSyntax(_("\037nickname\037 {ON | OFF}"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- this->Run(source, params[0], params[1]);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Turns %s's security features on or off for your\n"
- "nick. With \002SECURE\002 set, you must enter your password\n"
- "before you will be recognized as the owner of the nick,\n"
- "regardless of whether your address is on the access\n"
- "list. However, if you are on the access list, %s\n"
- "will not auto-kill you regardless of the setting of the\n"
- "\002KILL\002 option."), Config->NickServ.c_str(), Config->NickServ.c_str());
- return true;
- }
-};
-
-class NSSetSecure : public Module
-{
- CommandNSSetSecure commandnssetsecure;
- CommandNSSASetSecure commandnssasetsecure;
-
- public:
- NSSetSecure(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnssetsecure(this), commandnssasetsecure(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnssetsecure);
- ModuleManager::RegisterService(&commandnssasetsecure);
- }
-};
-
-MODULE_INIT(NSSetSecure)
diff --git a/modules/core/ns_status.cpp b/modules/core/ns_status.cpp
deleted file mode 100644
index 9d8b58fcb..000000000
--- a/modules/core/ns_status.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSStatus : public Command
-{
- public:
- CommandNSStatus(Module *creator) : Command(creator, "nickserv/status", 0, 16)
- {
- this->SetFlag(CFLAG_ALLOW_UNREGISTERED);
- this->SetDesc(_("Returns the owner status of the given nickname"));
- this->SetSyntax(_("\037nickname\037..."));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &nick = !params.empty() ? params[0] : u->nick;
- NickAlias *na = findnick(nick);
- spacesepstream sep(nick);
- Anope::string nickbuf;
-
- while (sep.GetToken(nickbuf))
- {
- User *u2 = finduser(nickbuf);
- if (!u2) /* Nick is not online */
- source.Reply(_("STATUS %s %d %s"), nickbuf.c_str(), 0, "");
- else if (u2->IsIdentified() && na && na->nc == u2->Account()) /* Nick is identified */
- source.Reply(_("STATUS %s %d %s"), nickbuf.c_str(), 3, u2->Account()->display.c_str());
- else if (u2->IsRecognized()) /* Nick is recognised, but NOT identified */
- source.Reply(_("STATUS %s %d %s"), nickbuf.c_str(), 2, u2->Account() ? u2->Account()->display.c_str() : "");
- else if (!na) /* Nick is online, but NOT a registered */
- source.Reply(_("STATUS %s %d %s"), nickbuf.c_str(), 0, "");
- else
- /* Nick is not identified for the nick, but they could be logged into an account,
- * so we tell the user about it
- */
- source.Reply(_("STATUS %s %d %s"), nickbuf.c_str(), 1, u2->Account() ? u2->Account()->display.c_str() : "");
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Returns whether the user using the given nickname is\n"
- "recognized as the owner of the nickname. The response has\n"
- "this format:\n"
- " \n"
- " \037nickname\037 \037status-code\037 \037account\037\n"
- " \n"
- "where \037nickname\037 is the nickname sent with the command,\n"
- "\037status-code\037 is one of the following, and \037account\037\n"
- "is the account they are logged in as.\n"
- " \n"
- " 0 - no such user online \002or\002 nickname not registered\n"
- " 1 - user not recognized as nickname's owner\n"
- " 2 - user recognized as owner via access list only\n"
- " 3 - user recognized as owner via password identification\n"
- " \n"
- "Up to sixteen nicknames may be sent with each command; the\n"
- "rest will be ignored. If no nickname is given, your status\n"
- "will be returned."));
- return true;
- }
-};
-
-class NSStatus : public Module
-{
- CommandNSStatus commandnsstatus;
-
- public:
- NSStatus(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnsstatus(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnsstatus);
- }
-};
-
-MODULE_INIT(NSStatus)
diff --git a/modules/core/ns_suspend.cpp b/modules/core/ns_suspend.cpp
deleted file mode 100644
index 50cf039ce..000000000
--- a/modules/core/ns_suspend.cpp
+++ /dev/null
@@ -1,160 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSSuspend : public Command
-{
- public:
- CommandNSSuspend(Module *creator) : Command(creator, "nickserv/suspend", 2, 2)
- {
- this->SetDesc(_("Suspend a given nick"));
- this->SetSyntax(_("\037nickname\037 \037reason\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- const Anope::string &nick = params[0];
- const Anope::string &reason = params[1];
-
- if (readonly)
- {
- source.Reply(READ_ONLY_MODE);
- return;
- }
-
- NickAlias *na = findnick(nick);
- if (!na)
- {
- source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
- return;
- }
-
- if (Config->NSSecureAdmins && na->nc->IsServicesOper())
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- na->nc->SetFlag(NI_SUSPENDED);
- na->nc->SetFlag(NI_SECURE);
- na->nc->UnsetFlag(NI_KILLPROTECT);
- na->nc->UnsetFlag(NI_KILL_QUICK);
- na->nc->UnsetFlag(NI_KILL_IMMED);
-
- for (std::list<NickAlias *>::iterator it = na->nc->aliases.begin(), it_end = na->nc->aliases.end(); it != it_end; ++it)
- {
- NickAlias *na2 = *it;
-
- if (na2->nc == na->nc)
- {
- na2->last_quit = reason;
-
- User *u2 = finduser(na2->nick);
- if (u2)
- {
- u2->Logout();
- u2->Collide(na2);
- }
- }
- }
-
- Log(LOG_ADMIN, u, this) << "for " << nick << " (" << (!reason.empty() ? reason : "No reason") << ")";
- source.Reply(_("Nick %s is now suspended."), nick.c_str());
-
- FOREACH_MOD(I_OnNickSuspended, OnNickSuspend(na));
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Suspends a registered nickname, which prevents from being used\n"
- "while keeping all the data for that nick."));
- return true;
- }
-};
-
-class CommandNSUnSuspend : public Command
-{
- public:
- CommandNSUnSuspend(Module *creator) : Command(creator, "nickserv/unsuspend", 1, 1)
- {
- this->SetDesc(_("Unsuspend a given nick"));
- this->SetSyntax(_("\037nickname\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &nick = params[0];
-
- if (readonly)
- {
- source.Reply(READ_ONLY_MODE);
- return;
- }
-
- NickAlias *na = findnick(nick);
- if (!na)
- {
- source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
- return;
- }
-
- if (Config->NSSecureAdmins && na->nc->IsServicesOper())
- {
- source.Reply(ACCESS_DENIED);
- return;
- }
-
- na->nc->UnsetFlag(NI_SUSPENDED);
-
- Log(LOG_ADMIN, u, this) << "for " << na->nick;
- source.Reply(_("Nick %s is now released."), nick.c_str());
-
- FOREACH_MOD(I_OnNickUnsuspended, OnNickUnsuspended(na));
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Unsuspends a nickname which allows it to be used again."));
- return true;
- }
-};
-
-class NSSuspend : public Module
-{
- CommandNSSuspend commandnssuspend;
- CommandNSUnSuspend commandnsunsuspend;
-
- public:
- NSSuspend(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnssuspend(this), commandnsunsuspend(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnssuspend);
- ModuleManager::RegisterService(&commandnsunsuspend);
- }
-};
-
-MODULE_INIT(NSSuspend)
diff --git a/modules/core/ns_update.cpp b/modules/core/ns_update.cpp
deleted file mode 100644
index d870e3532..000000000
--- a/modules/core/ns_update.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/* NickServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandNSUpdate : public Command
-{
- public:
- CommandNSUpdate(Module *creator) : Command(creator, "nickserv/update", 0, 0)
- {
- this->SetDesc(_("Updates your current status, i.e. it checks for new memos"));
- this->SetSyntax("");
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- NickAlias *na = findnick(u->nick);
-
- if (!na)
- {
- source.Reply(NICK_NOT_REGISTERED);
- return;
- }
-
- na->last_realname = u->realname;
- na->last_seen = Anope::CurTime;
-
- FOREACH_MOD(I_OnNickUpdate, OnNickUpdate(u));
-
- source.Reply(_("Status updated (memos, vhost, chmodes, flags)."), Config->NickServ.c_str());
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Updates your current status, i.e. it checks for new memos,\n"
- "sets needed channel modes and updates your vhost and\n"
- "your userflags (lastseentime, etc)."));
- return true;
- }
-};
-
-class NSUpdate : public Module
-{
- CommandNSUpdate commandnsupdate;
-
- public:
- NSUpdate(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandnsupdate(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandnsupdate);
- }
-};
-
-MODULE_INIT(NSUpdate)
diff --git a/modules/core/os_akill.cpp b/modules/core/os_akill.cpp
deleted file mode 100644
index 05602a746..000000000
--- a/modules/core/os_akill.cpp
+++ /dev/null
@@ -1,464 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-static service_reference<XLineManager> akills("xlinemanager/sgline");
-
-class AkillDelCallback : public NumberList
-{
- CommandSource &source;
- unsigned Deleted;
- public:
- AkillDelCallback(CommandSource &_source, const Anope::string &numlist) : NumberList(numlist, true), source(_source), Deleted(0)
- {
- }
-
- ~AkillDelCallback()
- {
- if (!Deleted)
- source.Reply(_("No matching entries on the AKILL list."));
- else if (Deleted == 1)
- source.Reply(_("Deleted 1 entry from the AKILL list."));
- else
- source.Reply(_("Deleted %d entries from the AKILL list."), Deleted);
- }
-
- void HandleNumber(unsigned Number)
- {
- if (!Number)
- return;
-
- XLine *x = akills->GetEntry(Number - 1);
-
- if (!x)
- return;
-
- ++Deleted;
- DoDel(source, x);
- }
-
- static void DoDel(CommandSource &source, XLine *x)
- {
- akills->DelXLine(x);
- }
-};
-
-class AkillListCallback : public NumberList
-{
- protected:
- CommandSource &source;
- bool SentHeader;
- public:
- AkillListCallback(CommandSource &_source, const Anope::string &numlist) : NumberList(numlist, false), source(_source), SentHeader(false)
- {
- }
-
- ~AkillListCallback()
- {
- if (!SentHeader)
- source.Reply(_("No matching entries on the AKILL list."));
- else
- source.Reply(END_OF_ANY_LIST, "Akill");
- }
-
- void HandleNumber(unsigned Number)
- {
- if (!Number)
- return;
-
- XLine *x = akills->GetEntry(Number - 1);
-
- if (!x)
- return;
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Current AKILL list:\n"
- " Num Mask Reason"));
- }
-
- DoList(source, x, Number);
- }
-
- static void DoList(CommandSource &source, XLine *x, unsigned Number)
- {
- source.Reply(OPER_LIST_FORMAT, Number + 1, x->Mask.c_str(), x->Reason.c_str());
- }
-};
-
-class AkillViewCallback : public AkillListCallback
-{
- public:
- AkillViewCallback(CommandSource &_source, const Anope::string &numlist) : AkillListCallback(_source, numlist)
- {
- }
-
- void HandleNumber(unsigned Number)
- {
- if (!Number)
- return;
-
- XLine *x = akills->GetEntry(Number - 1);
-
- if (!x)
- return;
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Current AKILL list:"));
- }
-
- DoList(source, x, Number);
- }
-
- static void DoList(CommandSource &source, XLine *x, unsigned Number)
- {
- source.Reply(OPER_VIEW_FORMAT, Number + 1, x->Mask.c_str(), x->By.c_str(), do_strftime(x->Created).c_str(), expire_left(source.u->Account(), x->Expires).c_str(), x->Reason.c_str());
- }
-};
-
-class CommandOSAKill : public Command
-{
- private:
- void DoAdd(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- unsigned last_param = 2;
- Anope::string expiry, mask;
- time_t expires;
-
- mask = params.size() > 1 ? params[1] : "";
- if (!mask.empty() && mask[0] == '+')
- {
- expiry = mask;
- mask = params.size() > 2 ? params[2] : "";
- last_param = 3;
- }
-
- expires = !expiry.empty() ? dotime(expiry) : Config->AutokillExpiry;
- /* If the expiry given does not contain a final letter, it's in days,
- * said the doc. Ah well.
- */
- if (!expiry.empty() && isdigit(expiry[expiry.length() - 1]))
- expires *= 86400;
- /* Do not allow less than a minute expiry time */
- if (expires && expires < 60)
- {
- source.Reply(BAD_EXPIRY_TIME);
- return;
- }
- else if (expires > 0)
- expires += Anope::CurTime;
-
- if (params.size() <= last_param)
- {
- this->OnSyntaxError(source, "ADD");
- return;
- }
-
- Anope::string reason = params[last_param];
- if (last_param == 2 && params.size() > 3)
- reason += " " + params[3];
- if (!mask.empty() && !reason.empty())
- {
- std::pair<int, XLine *> canAdd = akills->CanAdd(mask, expires);
- if (mask.find('!') != Anope::string::npos)
- source.Reply(_("\002Reminder\002: AKILL masks cannot contain nicknames; make sure you have \002not\002 included a nick portion in your mask."));
- else if (mask.find('@') == Anope::string::npos)
- source.Reply(BAD_USERHOST_MASK);
- else if (mask.find_first_not_of("~@.*?") == Anope::string::npos)
- source.Reply(USERHOST_MASK_TOO_WIDE, mask.c_str());
- else if (canAdd.first == 1)
- source.Reply(_("\002%s\002 already exists on the AKILL list."), canAdd.second->Mask.c_str());
- else if (canAdd.first == 2)
- source.Reply(_("Expiry time of \002%s\002 changed."), canAdd.second->Mask.c_str());
- else if (canAdd.first == 3)
- source.Reply(_("\002%s\002 is already covered by %s."), mask.c_str(), canAdd.second->Mask.c_str());
- else
- {
- User *user = finduser(mask);
- if (user)
- mask = "*@" + user->host;
- unsigned int affected = 0;
- for (Anope::insensitive_map<User *>::iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it)
- if (Anope::Match(it->second->GetIdent() + "@" + it->second->host, mask))
- ++affected;
- float percent = static_cast<float>(affected) / static_cast<float>(UserListByNick.size()) * 100.0;
-
- if (percent > 95)
- {
- source.Reply(USERHOST_MASK_TOO_WIDE, mask.c_str());
- Log(LOG_ADMIN, u, this) << "tried to akill " << percent << "% of the network (" << affected << " users)";
- return;
- }
-
- XLine *x = akills->Add(mask, u->nick, expires, reason);
-
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnAddXLine, OnAddXLine(u, x, akills));
- if (MOD_RESULT == EVENT_STOP)
- {
- delete x;
- return;
- }
-
- source.Reply(_("\002%s\002 added to the AKILL list."), mask.c_str());
-
- Log(LOG_ADMIN, u, this) << "on " << mask << " (" << reason << ") expires in " << (expires ? duration(expires - Anope::CurTime) : "never") << " [affects " << affected << " user(s) (" << percent << "%)]";
-
- if (readonly)
- source.Reply(READ_ONLY_MODE);
- }
- }
- else
- this->OnSyntaxError(source, "ADD");
-
- return;
- }
-
- void DoDel(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &mask = params.size() > 1 ? params[1] : "";
-
- if (mask.empty())
- {
- this->OnSyntaxError(source, "DEL");
- return;
- }
-
- if (akills->GetList().empty())
- {
- source.Reply(_("AKILL list is empty."));
- return;
- }
-
- if (isdigit(mask[0]) && mask.find_first_not_of("1234567890,-") == Anope::string::npos)
- {
- AkillDelCallback list(source, mask);
- list.Process();
- }
- else
- {
- XLine *x = akills->HasEntry(mask);
-
- if (!x)
- {
- source.Reply(_("\002%s\002 not found on the AKILL list."), mask.c_str());
- return;
- }
-
- FOREACH_MOD(I_OnDelXLine, OnDelXLine(u, x, akills));
-
- AkillDelCallback::DoDel(source, x);
- source.Reply(_("\002%s\002 deleted from the AKILL list."), mask.c_str());
- }
-
- if (readonly)
- source.Reply(READ_ONLY_MODE);
-
- return;
- }
-
- void DoList(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (akills->GetList().empty())
- {
- source.Reply(_("AKILL list is empty."));
- return;
- }
-
- const Anope::string &mask = params.size() > 1 ? params[1] : "";
-
- if (!mask.empty() && isdigit(mask[0]) && mask.find_first_not_of("1234567890,-") == Anope::string::npos)
- {
- AkillListCallback list(source, mask);
- list.Process();
- }
- else
- {
- bool SentHeader = false;
-
- for (unsigned i = 0, end = akills->GetCount(); i < end; ++i)
- {
- XLine *x = akills->GetEntry(i);
-
- if (mask.empty() || mask.equals_ci(x->Mask) || Anope::Match(x->Mask, mask))
- {
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Current AKILL list:\n"
- " Num Mask Reason"));
- }
-
- AkillListCallback::DoList(source, x, i);
- }
- }
-
- if (!SentHeader)
- source.Reply(_("No matching entries on the AKILL list."));
- else
- source.Reply(END_OF_ANY_LIST, "Akill");
- }
-
- return;
- }
-
- void DoView(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (akills->GetList().empty())
- {
- source.Reply(_("AKILL list is empty."));
- return;
- }
-
- const Anope::string &mask = params.size() > 1 ? params[1] : "";
-
- if (!mask.empty() && isdigit(mask[0]) && mask.find_first_not_of("1234567890,-") == Anope::string::npos)
- {
- AkillViewCallback list(source, mask);
- list.Process();
- }
- else
- {
- bool SentHeader = false;
-
- for (unsigned i = 0, end = akills->GetCount(); i < end; ++i)
- {
- XLine *x = akills->GetEntry(i);
-
- if (mask.empty() || mask.equals_ci(x->Mask) || Anope::Match(x->Mask, mask))
- {
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Current AKILL list:"));
- }
-
- AkillViewCallback::DoList(source, x, i);
- }
- }
-
- if (!SentHeader)
- source.Reply(_("No matching entries on the AKILL list."));
- }
-
- return;
- }
-
- void DoClear(CommandSource &source)
- {
- User *u = source.u;
- FOREACH_MOD(I_OnDelXLine, OnDelXLine(u, NULL, akills));
- akills->Clear();
- source.Reply(_("The AKILL list has been cleared."));
-
- return;
- }
- public:
- CommandOSAKill(Module *creator) : Command(creator, "operserv/akill", 1, 4)
- {
- this->SetDesc(_("Manipulate the AKILL list"));
- this->SetSyntax(_("ADD [+\037expiry\037] \037mask\037 \037reason\037"));
- this->SetSyntax(_("DEL {\037mask\037 | \037entry-num\037 | \037list\037}"));
- this->SetSyntax(_("LIST [\037mask\037 | \037list\037]"));
- this->SetSyntax(_("VIEW [\037mask\037 | \037list\037]"));
- this->SetSyntax(_("CLEAR"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &cmd = params[0];
-
- if (!akills)
- return;
-
- if (cmd.equals_ci("ADD"))
- return this->DoAdd(source, params);
- else if (cmd.equals_ci("DEL"))
- return this->DoDel(source, params);
- else if (cmd.equals_ci("LIST"))
- return this->DoList(source, params);
- else if (cmd.equals_ci("VIEW"))
- return this->DoView(source, params);
- else if (cmd.equals_ci("CLEAR"))
- return this->DoClear(source);
- else
- this->OnSyntaxError(source, "");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows Services operators to manipulate the AKILL list. If\n"
- "a user matching an AKILL mask attempts to connect, Services\n"
- "will issue a KILL for that user and, on supported server\n"
- "types, will instruct all servers to add a ban (K-line) for\n"
- "the mask which the user matched.\n"
- " \n"
- "\002AKILL ADD\002 adds the given nick or user@host/ip mask to the AKILL\n"
- "list for the given reason (which \002must\002 be given).\n"
- "\037expiry\037 is specified as an integer followed by one of \037d\037 \n"
- "(days), \037h\037 (hours), or \037m\037 (minutes). Combinations (such as \n"
- "\0371h30m\037) are not permitted. If a unit specifier is not \n"
- "included, the default is days (so \037+30\037 by itself means 30 \n"
- "days). To add an AKILL which does not expire, use \037+0\037. If the\n"
- "usermask to be added starts with a \037+\037, an expiry time must\n"
- "be given, even if it is the same as the default. The\n"
- "current AKILL default expiry time can be found with the\n"
- "\002STATS AKILL\002 command.\n"
- " \n"
- "The \002AKILL DEL\002 command removes the given mask from the\n"
- "AKILL list if it is present. If a list of entry numbers is \n"
- "given, those entries are deleted. (See the example for LIST \n"
- "below.)\n"
- " \n"
- "The \002AKILL LIST\002 command displays the AKILL list. \n"
- "If a wildcard mask is given, only those entries matching the\n"
- "mask are displayed. If a list of entry numbers is given,\n"
- "only those entries are shown; for example:\n"
- " \002AKILL LIST 2-5,7-9\002\n"
- " Lists AKILL entries numbered 2 through 5 and 7 \n"
- " through 9.\n"
- " \n"
- "\002AKILL VIEW\002 is a more verbose version of \002AKILL LIST\002, and \n"
- "will show who added an AKILL, the date it was added, and when \n"
- "it expires, as well as the user@host/ip mask and reason.\n"
- " \n"
- "\002AKILL CLEAR\002 clears all entries of the AKILL list."));
- return true;
- }
-};
-
-class OSAKill : public Module
-{
- CommandOSAKill commandosakill;
-
- public:
- OSAKill(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandosakill(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandosakill);
- }
-};
-
-MODULE_INIT(OSAKill)
diff --git a/modules/core/os_chankill.cpp b/modules/core/os_chankill.cpp
deleted file mode 100644
index 9ce895c59..000000000
--- a/modules/core/os_chankill.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-static service_reference<XLineManager> akills("xlinemanager/sgline");
-
-class CommandOSChanKill : public Command
-{
- public:
- CommandOSChanKill(Module *creator) : Command(creator, "operserv/chankill", 2, 3)
- {
- this->SetDesc(_("AKILL all users on a specific channel"));
- this->SetSyntax(_("[+\037expiry\037] \037channel\037 \037reason\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!akills)
- return;
-
- User *u = source.u;
- Anope::string expiry, channel;
- time_t expires;
- unsigned last_param = 1;
- Channel *c;
-
- channel = params[0];
- if (!channel.empty() && channel[0] == '+')
- {
- expiry = channel;
- channel = params[1];
- last_param = 2;
- }
-
- expires = !expiry.empty() ? dotime(expiry) : Config->ChankillExpiry;
- if (!expiry.empty() && isdigit(expiry[expiry.length() - 1]))
- expires *= 86400;
- if (expires && expires < 60)
- {
- source.Reply(BAD_EXPIRY_TIME);
- return;
- }
- else if (expires > 0)
- expires += Anope::CurTime;
-
- if (params.size() <= last_param)
- {
- this->OnSyntaxError(source, "");
- return;
- }
-
- Anope::string reason = params[last_param];
- if (params.size() > last_param + 1)
- reason += params[last_param + 1];
- if (!reason.empty())
- {
- Anope::string realreason;
- if (Config->AddAkiller)
- realreason = "[" + u->nick + "] " + reason;
- else
- realreason = reason;
-
- if ((c = findchan(channel)))
- {
- for (CUserList::iterator it = c->users.begin(), it_end = c->users.end(); it != it_end; )
- {
- UserContainer *uc = *it++;
-
- if (uc->user->HasMode(UMODE_OPER))
- continue;
-
- akills->Add("*@" + uc->user->host, u->nick, expires, realreason);
- akills->Check(uc->user);
- }
-
- Log(LOG_ADMIN, u, this) << "(" << realreason << ")";
- }
- else
- source.Reply(CHAN_X_NOT_IN_USE, channel.c_str());
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Puts an AKILL for every nick on the specified channel. It\n"
- "uses the entire and complete real ident@host for every nick,\n"
- "then enforces the AKILL."));
- return true;
- }
-};
-
-class OSChanKill : public Module
-{
- CommandOSChanKill commandoschankill;
-
- public:
- OSChanKill(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandoschankill(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandoschankill);
- }
-};
-
-MODULE_INIT(OSChanKill)
diff --git a/modules/core/os_config.cpp b/modules/core/os_config.cpp
deleted file mode 100644
index 1d1fead33..000000000
--- a/modules/core/os_config.cpp
+++ /dev/null
@@ -1,217 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandOSConfig : public Command
-{
- void ChangeHash(ConfigDataHash &hash, const Anope::string &block, const Anope::string &iname, const Anope::string &value)
- {
- ConfigDataHash::iterator it = hash.find(block);
-
- KeyValList &list = it->second;
- for (unsigned i = 0; i < list.size(); ++i)
- {
- const Anope::string &item = list[i].first;
- if (item == iname)
- {
- list[i] = std::make_pair(item, value);
- break;
- }
- }
- }
-
- public:
- CommandOSConfig(Module *creator) : Command(creator, "operserv/config", 1, 4)
- {
- this->SetDesc(_("View and change configuration file settings"));
- this->SetSyntax(_("{\037MODIFY\037|\037VIEW\037} [\037block name\037 \037item name\037 \037item value\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &what = params[0];
-
- if (what.equals_ci("MODIFY") && params.size() > 3)
- {
- ConfigItems configitems(Config);
-
- for (unsigned i = 0; !configitems.Values[i].tag.empty(); ++i)
- {
- ConfigItems::Item *v = &configitems.Values[i];
- if (v->tag.equals_cs(params[1]) && v->value.equals_cs(params[2]))
- {
- try
- {
- ValueItem vi(params[3]);
- if (!v->validation_function(Config, v->tag, v->value, vi))
- throw ConfigException("Parameter failed to validate.");
-
- int dt = v->datatype;
-
- if (dt & DT_NORELOAD)
- throw ConfigException("This item can not be changed while Anope is running.");
- bool allow_wild = dt & DT_ALLOW_WILD;
- dt &= ~(DT_ALLOW_NEWLINE | DT_ALLOW_WILD);
-
- /* Yay for *massive* copypaste from config.cpp */
- switch (dt)
- {
- case DT_NOSPACES:
- {
- ValueContainerString *vcs = debug_cast<ValueContainerString *>(v->val);
- Config->ValidateNoSpaces(vi.GetValue(), v->tag, v->value);
- vcs->Set(vi.GetValue());
- break;
- }
- case DT_HOSTNAME:
- {
- ValueContainerString *vcs = debug_cast<ValueContainerString *>(v->val);
- Config->ValidateHostname(vi.GetValue(), v->tag, v->value);
- vcs->Set(vi.GetValue());
- break;
- }
- case DT_IPADDRESS:
- {
- ValueContainerString *vcs = debug_cast<ValueContainerString *>(v->val);
- Config->ValidateIP(vi.GetValue(), v->tag, v->value, allow_wild);
- vcs->Set(vi.GetValue());
- break;
- }
- case DT_STRING:
- {
- ValueContainerString *vcs = debug_cast<ValueContainerString *>(v->val);
- vcs->Set(vi.GetValue());
- break;
- }
- case DT_INTEGER:
- {
- int val = vi.GetInteger();
- ValueContainerInt *vci = debug_cast<ValueContainerInt *>(v->val);
- vci->Set(&val, sizeof(int));
- break;
- }
- case DT_UINTEGER:
- {
- unsigned val = vi.GetInteger();
- ValueContainerUInt *vci = debug_cast<ValueContainerUInt *>(v->val);
- vci->Set(&val, sizeof(unsigned));
- break;
- }
- case DT_LUINTEGER:
- {
- unsigned long val = vi.GetInteger();
- ValueContainerLUInt *vci = debug_cast<ValueContainerLUInt *>(v->val);
- vci->Set(&val, sizeof(unsigned long));
- break;
- }
- case DT_TIME:
- {
- time_t time = dotime(vi.GetValue());
- ValueContainerTime *vci = debug_cast<ValueContainerTime *>(v->val);
- vci->Set(&time, sizeof(time_t));
- break;
- }
- case DT_BOOLEAN:
- {
- bool val = vi.GetBool();
- ValueContainerBool *vcb = debug_cast<ValueContainerBool *>(v->val);
- vcb->Set(&val, sizeof(bool));
- break;
- }
- default:
- break;
- }
- }
- catch (const ConfigException &ex)
- {
- source.Reply(_("Error changing configuration value: ") + ex.GetReason());
- return;
- }
-
- ChangeHash(Config->config_data, params[1], params[2], params[3]);
-
- Log(LOG_ADMIN, source.u, this) << "to change the configuration value of " << params[1] << ":" << params[2] << " to " << params[3];
- source.Reply(_("Value of %s:%s changed to %s"), params[1].c_str(), params[2].c_str(), params[3].c_str());
- return;
- }
- }
-
- source.Reply("There is no configuration value named %s:%s", params[1].c_str(), params[2].c_str());
- }
- else if (what.equals_ci("VIEW"))
- {
- /* Blocks we should show */
- const Anope::string show_blocks[] = { "botserv", "chanserv", "defcon", "global", "memoserv", "nickserv", "networkinfo", "operserv", "options", "" };
-
- Log(LOG_ADMIN, source.u, this) << "VIEW";
-
- for (ConfigDataHash::const_iterator it = Config->config_data.begin(), it_end = Config->config_data.end(); it != it_end; ++it)
- {
- const Anope::string &bname = it->first;
- const KeyValList &list = it->second;
-
- bool ok = false;
- for (unsigned i = 0; !show_blocks[i].empty(); ++i)
- if (bname == show_blocks[i])
- ok = true;
- if (ok == false)
- continue;
-
- source.Reply(_("%s settings:"), bname.c_str());
- for (unsigned i = 0; i < list.size(); ++i)
- {
- const Anope::string &first = list[i].first, second = list[i].second;
-
- source.Reply(_(" Name: %-15s Value: %s"), first.c_str(), second.c_str());
- }
- }
-
- source.Reply(_("End of configuration."));
- }
- else
- this->OnSyntaxError(source, what);
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows you to change and view configuration settings.\n"
- "Settings changed by this command are temporary and will not be reflected\n"
- "back into the configuration file, and will be lost if Anope is shut down,\n"
- "restarted, or the RELOAD command is used.\n"
- " \n"
- "Example:\n"
- " \002MODIFY nickserv forcemail no\002"));
- return true;
- }
-};
-
-class OSConfig : public Module
-{
- CommandOSConfig commandosconfig;
-
- public:
- OSConfig(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandosconfig(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandosconfig);
- }
-};
-
-MODULE_INIT(OSConfig)
diff --git a/modules/core/os_forbid.cpp b/modules/core/os_forbid.cpp
deleted file mode 100644
index d4b4c2b41..000000000
--- a/modules/core/os_forbid.cpp
+++ /dev/null
@@ -1,342 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-#include "os_forbid.h"
-
-class MyForbidService : public ForbidService
-{
- std::vector<ForbidData *> forbidData;
-
- public:
- MyForbidService(Module *m) : ForbidService(m) { }
-
- void AddForbid(ForbidData *d)
- {
- this->forbidData.push_back(d);
- }
-
- void RemoveForbid(ForbidData *d)
- {
- std::vector<ForbidData *>::iterator it = std::find(this->forbidData.begin(), this->forbidData.end(), d);
- if (it != this->forbidData.end())
- this->forbidData.erase(it);
- delete d;
- }
-
- ForbidData *FindForbid(const Anope::string &mask, ForbidType type)
- {
- const std::vector<ForbidData *> &forbids = this->GetForbids();
- for (unsigned i = forbids.size(); i > 0; --i)
- {
- ForbidData *d = this->forbidData[i - 1];
-
- if ((type == FT_NONE || type == d->type) && Anope::Match(mask, d->mask))
- return d;
- }
- return NULL;
- }
-
- const std::vector<ForbidData *> &GetForbids()
- {
- for (unsigned i = this->forbidData.size(); i > 0; --i)
- {
- ForbidData *d = this->forbidData[i - 1];
-
- if (d->expires && Anope::CurTime >= d->expires)
- {
- Anope::string type = "none";
- if (d->type == FT_NICK)
- type = "nick";
- else if (d->type == FT_CHAN)
- type = "chan";
- else if (d->type == FT_EMAIL)
- type = "email";
-
- Log(LOG_NORMAL, Config->OperServ + "/forbid") << "Expiring forbid for " << d->mask << " type " << type;
- this->forbidData.erase(this->forbidData.begin() + i - 1);
- delete d;
- }
- }
-
- return this->forbidData;
- }
-};
-
-class CommandOSForbid : public Command
-{
- service_reference<ForbidService> fs;
- public:
- CommandOSForbid(Module *creator) : Command(creator, "operserv/forbid", 1, 5), fs("forbid")
- {
- this->SetDesc(_("Forbid usage of nicknames, channels, and emails"));
- this->SetSyntax(_("ADD {NICK|CHAN|EMAIL} [+\037expiry\037] \037entry\037\002 [\037reason\037]"));
- this->SetSyntax(_("DEL {NICK|CHAN|EMAIL} \037entry\037"));
- this->SetSyntax(_("LIST (NICK|CHAN|EMAIL)"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!this->fs)
- return;
-
- const Anope::string &command = params[0];
- const Anope::string &subcommand = params.size() > 1 ? params[1] : "";
-
- ForbidType type = FT_NONE;
- if (subcommand.equals_ci("NICK"))
- type = FT_NICK;
- else if (subcommand.equals_ci("CHAN"))
- type = FT_CHAN;
- else if (subcommand.equals_ci("EMAIL"))
- type = FT_EMAIL;
-
- if (command.equals_ci("ADD") && params.size() > 2 && type != FT_NONE)
- {
- const Anope::string &expiry = params[2][0] == '+' ? params[2] : "";
- const Anope::string &entry = params.size() > 3 && !expiry.empty() ? params[3] : params[2];
- Anope::string reason = !expiry.empty() && params.size() > 4 ? params[4] : (params.size() > 3 ? params[3] : "");
-
- time_t expiryt = 0;
- if (!expiry.empty())
- {
- expiryt = dotime(expiry);
- if (expiryt)
- expiryt += Anope::CurTime;
- }
-
- ForbidData *d = this->fs->FindForbid(entry, type);
- bool created = false;
- if (d == NULL)
- {
- d = new ForbidData();
- created = true;
- }
-
- d->mask = entry;
- d->creator = source.u->nick;
- d->reason = reason;
- d->created = Anope::CurTime;
- d->expires = expiryt;
- d->type = type;
- if (created)
- this->fs->AddForbid(d);
-
- Log(LOG_ADMIN, source.u, this) << "to add a forbid on " << entry << " of type " << subcommand;
- source.Reply(_("Added a%s forbid on %s to expire on %s"), type == FT_CHAN ? "n" : "", entry.c_str(), d->expires ? do_strftime(d->expires).c_str() : "never");
- }
- else if (command.equals_ci("DEL") && params.size() > 2 && type != FT_NONE)
- {
- const Anope::string &entry = params[2];
-
- ForbidData *d = this->fs->FindForbid(entry, type);
- if (d != NULL)
- {
- Log(LOG_ADMIN, source.u, this) << "to remove forbid " << d->mask << " of type " << subcommand;
- source.Reply(_("%s deleted from the %s forbid list."), d->mask.c_str(), subcommand.c_str());
- }
- else
- source.Reply(_("Forbid on %s was not found."), entry.c_str());
- }
- else if (command.equals_ci("LIST"))
- {
- const std::vector<ForbidData *> &forbids = this->fs->GetForbids();
- if (forbids.empty())
- source.Reply(_("Forbid list is empty."));
- else
- {
- source.Reply(_("Forbid list:"));
- source.Reply(_("Mask Type Reason"));
-
- for (unsigned i = 0; i < forbids.size(); ++i)
- {
- ForbidData *d = forbids[i];
-
- Anope::string ftype;
- if (d->type == FT_NICK)
- ftype = "NICK";
- else if (d->type == FT_CHAN)
- ftype = "CHAN";
- else if (d->type == FT_EMAIL)
- ftype = "EMAIL";
- else
- continue;
-
- source.Reply("%-10s %-5s %s", d->mask.c_str(), ftype.c_str(), d->reason.c_str());
- source.Reply(_("By %s, expires on %s"), d->creator.c_str(), d->expires ? do_strftime(d->expires).c_str() : "never");
- }
-
- source.Reply(_("End of forbid list."));
- }
- }
- else
- this->OnSyntaxError(source, command);
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Forbid allows you to forbid usage of certain nicknames, channels,\n"
- "and email addresses. Wildcards are accepted for all entries."));
- return true;
- }
-};
-
-class OSForbid : public Module
-{
- MyForbidService forbidService;
- CommandOSForbid commandosforbid;
-
- public:
- OSForbid(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- forbidService(this), commandosforbid(this)
- {
- this->SetAuthor("Anope");
-
- Implementation i[] = { I_OnUserConnect, I_OnUserNickChange, I_OnJoinChannel, I_OnPreCommand, I_OnDatabaseWrite, I_OnDatabaseRead };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
-
- ModuleManager::RegisterService(&this->forbidService);
-
- ModuleManager::RegisterService(&commandosforbid);
- }
-
- void OnUserConnect(dynamic_reference<User> &u, bool &exempt)
- {
- if (!u || exempt)
- return;
-
- this->OnUserNickChange(u, "");
- }
-
- void OnUserNickChange(User *u, const Anope::string &)
- {
- if (u->HasMode(UMODE_OPER))
- return;
-
- ForbidData *d = this->forbidService.FindForbid(u->nick, FT_NICK);
- if (d != NULL)
- {
- BotInfo *bi = findbot(Config->OperServ);
- if (bi)
- {
- if (d->reason.empty())
- u->SendMessage(bi, _("This nickname has been forbidden."));
- else
- u->SendMessage(bi, _("This nickname has been forbidden: %s"), d->reason.c_str());
- }
- u->Collide(NULL);
- }
- }
-
- void OnJoinChannel(User *u, Channel *c)
- {
- if (u->HasMode(UMODE_OPER))
- return;
-
- BotInfo *bi = findbot(Config->OperServ);
- ForbidData *d = this->forbidService.FindForbid(c->name, FT_CHAN);
- if (bi != NULL && d != NULL)
- {
- if (!c->HasFlag(CH_INHABIT))
- {
- /* Join ChanServ and set a timer for this channel to part ChanServ later */
- new ChanServTimer(c);
-
- /* Set +si to prevent rejoin */
- c->SetMode(NULL, CMODE_NOEXTERNAL);
- c->SetMode(NULL, CMODE_TOPIC);
- c->SetMode(NULL, CMODE_SECRET);
- c->SetMode(NULL, CMODE_INVITE);
- }
-
- if (d->reason.empty())
- c->Kick(bi, u, _("This channel has been forbidden."));
- else
- c->Kick(bi, u, _("This channel has been forbidden: %s"), d->reason.c_str());
- }
- }
-
- EventReturn OnPreCommand(CommandSource &source, Command *command, std::vector<Anope::string> &params)
- {
- if (source.u->HasMode(UMODE_OPER))
- return EVENT_CONTINUE;
- else if (command->name == "nickserv/register" && params.size() > 1)
- {
- ForbidData *d = this->forbidService.FindForbid(params[1], FT_EMAIL);
- if (d != NULL)
- {
- source.Reply("Your email address is not allowed, choose a different one.");
- return EVENT_STOP;
- }
- }
- else if (command->name == "nickserv/set/email" && params.size() > 0)
- {
- ForbidData *d = this->forbidService.FindForbid(params[0], FT_EMAIL);
- if (d != NULL)
- {
- source.Reply("Your email address is not allowed, choose a different one.");
- return EVENT_STOP;
- }
- }
-
- return EVENT_CONTINUE;
- }
-
- void OnDatabaseWrite(void (*Write)(const Anope::string &))
- {
- std::vector<ForbidData *> forbids = this->forbidService.GetForbids();
- for (unsigned i = 0; i < forbids.size(); ++i)
- {
- ForbidData *f = forbids[i];
- Anope::string ftype;
- if (f->type == FT_NICK)
- ftype = "NICK";
- else if (f->type == FT_CHAN)
- ftype = "CHAN";
- else if (f->type == FT_EMAIL)
- ftype = "EMAIL";
- Write("FORBID " + f->mask + " " + f->creator + " " + stringify(f->created) + " " + stringify(f->expires) + " " + ftype + " " + f->reason);
- }
- }
-
- EventReturn OnDatabaseRead(const std::vector<Anope::string> &params)
- {
- if (params.size() > 5 && params[0] == "FORBID")
- {
- ForbidData *f = new ForbidData();
- f->mask = params[1];
- f->creator = params[2];
- f->created = convertTo<time_t>(params[3]);
- f->expires = convertTo<time_t>(params[4]);
- if (params[5] == "NICK")
- f->type = FT_NICK;
- else if (params[5] == "CHAN")
- f->type = FT_CHAN;
- else if (params[5] == "EMAIL")
- f->type = FT_EMAIL;
- else
- f->type = FT_NONE;
- f->reason = params.size() > 6 ? params[6] : "";
-
- this->forbidService.AddForbid(f);
- }
-
- return EVENT_CONTINUE;
- }
-};
-
-MODULE_INIT(OSForbid)
diff --git a/modules/core/os_forbid.h b/modules/core/os_forbid.h
deleted file mode 100644
index b91aa3be8..000000000
--- a/modules/core/os_forbid.h
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef OS_FORBID_H
-#define OS_FORBID_H
-
-enum ForbidType
-{
- FT_NONE,
- FT_NICK,
- FT_CHAN,
- FT_EMAIL
-};
-
-struct ForbidData
-{
- Anope::string mask;
- Anope::string creator;
- Anope::string reason;
- time_t created;
- time_t expires;
- ForbidType type;
-};
-
-class ForbidService : public Service
-{
- public:
- ForbidService(Module *m) : Service(m, "forbid") { }
-
- virtual void AddForbid(ForbidData *d) = 0;
-
- virtual void RemoveForbid(ForbidData *d) = 0;
-
- virtual ForbidData *FindForbid(const Anope::string &mask, ForbidType type) = 0;
-
- virtual const std::vector<ForbidData *> &GetForbids() = 0;
-};
-
-#endif
-
diff --git a/modules/core/os_ignore.cpp b/modules/core/os_ignore.cpp
deleted file mode 100644
index 9f50ec967..000000000
--- a/modules/core/os_ignore.cpp
+++ /dev/null
@@ -1,350 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-#include "os_ignore.h"
-
-class OSIgnoreService : public IgnoreService
-{
- public:
- OSIgnoreService(Module *o, const Anope::string &n) : IgnoreService(o, n) { }
-
- void AddIgnore(const Anope::string &mask, const Anope::string &creator, const Anope::string &reason, time_t delta = Anope::CurTime)
- {
- /* If it s an existing user, we ignore the hostmask. */
- Anope::string realmask = mask;
- size_t user, host;
-
- User *u = finduser(mask);
- if (u)
- realmask = "*!*@" + u->host;
- /* Determine whether we get a nick or a mask. */
- else if ((host = mask.find('@')) != Anope::string::npos)
- {
- /* Check whether we have a nick too.. */
- if ((user = mask.find('!')) != Anope::string::npos)
- {
- /* this should never happen */
- if (user > host)
- return;
- }
- else
- /* We have user@host. Add nick wildcard. */
- realmask = "*!" + mask;
- }
- /* We only got a nick.. */
- else
- realmask = mask + "!*@*";
-
- /* Check if we already got an identical entry. */
- IgnoreData *ign = this->Find(realmask);
- if (ign != NULL)
- {
- if (!delta)
- ign->time = 0;
- else
- ign->time = Anope::CurTime + delta;
- }
- /* Create new entry.. */
- else
- {
- IgnoreData newign;
- newign.mask = realmask;
- newign.creator = creator;
- newign.reason = reason;
- newign.time = delta ? Anope::CurTime + delta : 0;
- this->ignores.push_back(newign);
- }
- }
-
- bool DelIgnore(const Anope::string &mask)
- {
- for (std::list<IgnoreData>::iterator it = this->ignores.begin(), it_end = this->ignores.end(); it != it_end; ++it)
- {
- IgnoreData &idn = *it;
- if (idn.mask.equals_ci(mask))
- {
- this->ignores.erase(it);
- return true;
- }
- }
-
- return false;
- }
-
- IgnoreData *Find(const Anope::string &mask)
- {
- User *u = finduser(mask);
- std::list<IgnoreData>::iterator ign = this->ignores.begin(), ign_end = this->ignores.end();
-
- if (u)
- {
- for (; ign != ign_end; ++ign)
- {
- Entry ignore_mask(CMODE_BEGIN, ign->mask);
- if (ignore_mask.Matches(u))
- break;
- }
- }
- else
- {
- size_t user, host;
- Anope::string tmp;
- /* We didn't get a user.. generate a valid mask. */
- if ((host = mask.find('@')) != Anope::string::npos)
- {
- if ((user = mask.find('!')) != Anope::string::npos)
- {
- /* this should never happen */
- if (user > host)
- return NULL;
- tmp = mask;
- }
- else
- /* We have user@host. Add nick wildcard. */
- tmp = "*!" + mask;
- }
- /* We only got a nick.. */
- else
- tmp = mask + "!*@*";
-
- for (; ign != ign_end; ++ign)
- if (Anope::Match(tmp, ign->mask))
- break;
- }
-
- /* Check whether the entry has timed out */
- if (ign != ign_end)// && (*ign)->time && (*ign)->time <= Anope::CurTime)
- {
- IgnoreData &id = *ign;
-
- if (id.time && id.time <= Anope::CurTime)
- {
- Log(LOG_DEBUG) << "Expiring ignore entry " << id.mask;
- this->ignores.erase(ign);
- }
- else
- return &id;
- }
-
- return NULL;
- }
-};
-
-class CommandOSIgnore : public Command
-{
- private:
- void DoAdd(CommandSource &source, const std::vector<Anope::string> &params)
- {
- service_reference<IgnoreService> ignore_service("ignore");
- if (!ignore_service)
- return;
-
- const Anope::string &time = params.size() > 1 ? params[1] : "";
- const Anope::string &nick = params.size() > 2 ? params[2] : "";
- const Anope::string &reason = params.size() > 3 ? params[3] : "";
-
- if (time.empty() || nick.empty())
- {
- this->OnSyntaxError(source, "ADD");
- return;
- }
- else
- {
- time_t t = dotime(time);
-
- if (t <= -1)
- {
- source.Reply(_("You have to enter a valid number as time."));
- return;
- }
-
- ignore_service->AddIgnore(nick, source.u->nick, reason, t);
- if (!t)
- source.Reply(_("\002%s\002 will now permanently be ignored."), nick.c_str());
- else
- source.Reply(_("\002%s\002 will now be ignored for \002%s\002."), nick.c_str(), time.c_str());
- }
-
- return;
- }
-
- void DoList(CommandSource &source)
- {
- service_reference<IgnoreService> ignore_service("ignore");
- if (!ignore_service)
- return;
-
- const std::list<IgnoreData> &ignores = ignore_service->GetIgnores();
- if (ignores.empty())
- source.Reply(_("Ignore list is empty."));
- else
- {
- source.Reply(_("Services ignore list:\n"
- " Mask Creator Reason Expires"));
- for (std::list<IgnoreData>::const_iterator ign = ignores.begin(), ign_end = ignores.end(); ign != ign_end; ++ign)
- {
- const IgnoreData &ignore = *ign;
-
- source.Reply(" %-11s %-11s %-11s %s", ignore.mask.c_str(), ignore.creator.c_str(), ignore.reason.c_str(), do_strftime(ignore.time).c_str());
- }
- }
-
- return;
- }
-
- void DoDel(CommandSource &source, const std::vector<Anope::string> &params)
- {
- service_reference<IgnoreService> ignore_service("ignore");
- if (!ignore_service)
- return;
-
- const Anope::string nick = params.size() > 1 ? params[1] : "";
- if (nick.empty())
- this->OnSyntaxError(source, "DEL");
- else if (ignore_service->DelIgnore(nick))
- source.Reply(_("\002%s\002 will no longer be ignored."), nick.c_str());
- else
- source.Reply(_("Nick \002%s\002 not found on ignore list."), nick.c_str());
-
- return;
- }
-
- void DoClear(CommandSource &source)
- {
- service_reference<IgnoreService> ignore_service("ignore");
- if (!ignore_service)
- return;
-
- ignore_service->ClearIgnores();
- source.Reply(_("Ignore list has been cleared."));
-
- return;
- }
-
- public:
- CommandOSIgnore(Module *creator) : Command(creator, "operserv/ignore", 1, 4)
- {
- this->SetDesc(_("Modify the Services ignore list"));
- this->SetSyntax(_("ADD \037time\037 \037nick\037 \037reason\037"));
- this->SetSyntax(_("DEL \037nick\037"));
- this->SetSyntax(_("LIST"));
- this->SetSyntax(_("CLEAR"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &cmd = params[0];
-
- if (cmd.equals_ci("ADD"))
- return this->DoAdd(source, params);
- else if (cmd.equals_ci("LIST"))
- return this->DoList(source);
- else if (cmd.equals_ci("DEL"))
- return this->DoDel(source, params);
- else if (cmd.equals_ci("CLEAR"))
- return this->DoClear(source);
- else
- this->OnSyntaxError(source, "");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows Services Operators to make Services ignore a nick or mask\n"
- "for a certain time or until the next restart. The default\n"
- "time format is seconds. You can specify it by using units.\n"
- "Valid units are: \037s\037 for seconds, \037m\037 for minutes, \n"
- "\037h\037 for hours and \037d\037 for days. \n"
- "Combinations of these units are not permitted.\n"
- "To make Services permanently ignore the user, type 0 as time.\n"
- "When adding a \037mask\037, it should be in the format user@host\n"
- "or nick!user@host, everything else will be considered a nick.\n"
- "Wildcards are permitted.\n"
- " \n"
- "Ignores will not be enforced on IRC Operators."));
- return true;
- }
-};
-
-class OSIgnore : public Module
-{
- OSIgnoreService osignoreservice;
- CommandOSIgnore commandosignore;
-
- public:
- OSIgnore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- osignoreservice(this, "ignore"), commandosignore(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandosignore);
-
- Implementation i[] = { I_OnDatabaseRead, I_OnDatabaseWrite, I_OnBotPrivmsg };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
-
- ModuleManager::RegisterService(&this->osignoreservice);
- }
-
- EventReturn OnDatabaseRead(const std::vector<Anope::string> &params)
- {
- if (params.size() >= 4 && params[0].equals_ci("OS") && params[1].equals_ci("IGNORE"))
- {
- service_reference<IgnoreService> ignore_service("ignore");
- if (ignore_service)
- {
- const Anope::string &mask = params[2];
- time_t time = params[3].is_pos_number_only() ? convertTo<time_t>(params[3]) : 0;
- const Anope::string &creator = params.size() > 4 ? params[4] : "";
- const Anope::string &reason = params.size() > 5 ? params[5] : "";
- ignore_service->AddIgnore(mask, creator, reason, time - Anope::CurTime);
-
- return EVENT_STOP;
- }
- }
-
- return EVENT_CONTINUE;
- }
-
- void OnDatabaseWrite(void (*Write)(const Anope::string &))
- {
- for (std::list<IgnoreData>::iterator ign = this->osignoreservice.GetIgnores().begin(), ign_end = this->osignoreservice.GetIgnores().end(); ign != ign_end; )
- {
- if (ign->time && ign->time <= Anope::CurTime)
- {
- Log(LOG_DEBUG) << "[os_ignore] Expiring ignore entry " << ign->mask;
- ign = this->osignoreservice.GetIgnores().erase(ign);
- }
- else
- {
- std::stringstream buf;
- buf << "OS IGNORE " << ign->mask << " " << ign->time << " " << ign->creator << " :" << ign->reason;
- Write(buf.str());
- ++ign;
- }
- }
- }
-
- EventReturn OnBotPrivmsg(User *u, BotInfo *bi, Anope::string &message)
- {
- if (this->osignoreservice.Find(u->nick))
- return EVENT_STOP;
-
- return EVENT_CONTINUE;
- }
-};
-
-MODULE_INIT(OSIgnore)
diff --git a/modules/core/os_ignore.h b/modules/core/os_ignore.h
deleted file mode 100644
index 056161a79..000000000
--- a/modules/core/os_ignore.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* OperServ ignore interface
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-
-struct IgnoreData
-{
- Anope::string mask;
- Anope::string creator;
- Anope::string reason;
- time_t time; /* When do we stop ignoring them? */
-};
-
-class IgnoreService : public Service
-{
- protected:
- std::list<IgnoreData> ignores;
-
- IgnoreService(Module *c, const Anope::string &n) : Service(c, n) { }
-
- public:
- virtual void AddIgnore(const Anope::string &mask, const Anope::string &creator, const Anope::string &reason, time_t delta = Anope::CurTime) = 0;
-
- virtual bool DelIgnore(const Anope::string &mask) = 0;
-
- inline void ClearIgnores() { this->ignores.clear(); }
-
- virtual IgnoreData *Find(const Anope::string &mask) = 0;
-
- inline std::list<IgnoreData> &GetIgnores() { return this->ignores; }
-};
-
diff --git a/modules/core/os_jupe.cpp b/modules/core/os_jupe.cpp
deleted file mode 100644
index a689b33e2..000000000
--- a/modules/core/os_jupe.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandOSJupe : public Command
-{
- public:
- CommandOSJupe(Module *creator) : Command(creator, "operserv/jupe", 1, 2)
- {
- this->SetDesc(_("\"Jupiter\" a server"));
- this->SetSyntax(_("\037server\037 [\037reason\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &jserver = params[0];
- const Anope::string &reason = params.size() > 1 ? params[1] : "";
- Server *server = Server::Find(jserver);
-
- if (!isValidHost(jserver, 3))
- source.Reply(_("Please use a valid server name when juping"));
- else if (server && (server == Me || server == Me->GetLinks().front()))
- source.Reply(_("You can not jupe your services server or your uplink server."));
- else
- {
- Anope::string rbuf = "Juped by " + u->nick + (!reason.empty() ? ": " + reason : "");
- if (server)
- ircdproto->SendSquit(jserver, rbuf);
- Server *juped_server = new Server(Me, jserver, 1, rbuf, ircd->ts6 ? ts6_sid_retrieve() : "", SERVER_JUPED);
- ircdproto->SendServer(juped_server);
-
- Log(LOG_ADMIN, u, this) << "on " << jserver << " (" << rbuf << ")";
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Tells Services to jupiter a server -- that is, to create\n"
- "a fake \"server\" connected to Services which prevents\n"
- "the real server of that name from connecting. The jupe\n"
- "may be removed using a standard \002SQUIT\002. If a reason is\n"
- "given, it is placed in the server information field;\n"
- "otherwise, the server information field will contain the\n"
- "text \"Juped by <nick>\", showing the nickname of the\n"
- "person who jupitered the server."));
- return true;
- }
-};
-
-class OSJupe : public Module
-{
- CommandOSJupe commandosjupe;
-
- public:
- OSJupe(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandosjupe(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandosjupe);
- }
-};
-
-MODULE_INIT(OSJupe)
diff --git a/modules/core/os_kick.cpp b/modules/core/os_kick.cpp
deleted file mode 100644
index 341ea1ee6..000000000
--- a/modules/core/os_kick.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandOSKick : public Command
-{
- public:
- CommandOSKick(Module *creator) : Command(creator, "operserv/kick", 3, 3)
- {
- this->SetDesc(_("Kick a user from a channel"));
- this->SetSyntax(_("\037channel\037 \037user\037 \037reason\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &chan = params[0];
- const Anope::string &nick = params[1];
- const Anope::string &s = params[2];
- Channel *c;
- User *u2;
-
- if (!(c = findchan(chan)))
- {
- source.Reply(CHAN_X_NOT_IN_USE, chan.c_str());
- return;
- }
- else if (c->bouncy_modes)
- {
- source.Reply(_("Services is unable to change modes. Are your servers' U:lines configured correctly?"));
- return;
- }
- else if (!(u2 = finduser(nick)))
- {
- source.Reply(NICK_X_NOT_IN_USE, nick.c_str());
- return;
- }
-
- c->Kick(source.owner, u2, "%s (%s)", u->nick.c_str(), s.c_str());
- Log(LOG_ADMIN, u, this) << "on " << u2->nick << " in " << c->name;
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows staff to kick a user from any channel.\n"
- "Parameters are the same as for the standard /KICK\n"
- "command. The kick message will have the nickname of the\n"
- "IRCop sending the KICK command prepended; for example:\n"
- " \n"
- "*** SpamMan has been kicked off channel #my_channel by %s (Alcan (Flood))"), source.owner->nick.c_str());
- return true;
- }
-};
-
-class OSKick : public Module
-{
- CommandOSKick commandoskick;
-
- public:
- OSKick(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandoskick(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandoskick);
- }
-};
-
-MODULE_INIT(OSKick)
diff --git a/modules/core/os_kill.cpp b/modules/core/os_kill.cpp
deleted file mode 100644
index 11a0636ef..000000000
--- a/modules/core/os_kill.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandOSKill : public Command
-{
- public:
- CommandOSKill(Module *creator) : Command(creator, "operserv/kill", 1, 2)
- {
- this->SetDesc(_("Kill a user"));
- this->SetSyntax(_("\037user\037 [\037reason\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &nick = params[0];
- Anope::string reason = params.size() > 1 ? params[1] : "";
-
- User *u2 = finduser(nick);
- if (u2 == NULL)
- source.Reply(NICK_X_NOT_IN_USE, nick.c_str());
- else if (u2->IsProtected() || u2->server == Me)
- source.Reply(ACCESS_DENIED);
- else
- {
- if (reason.empty())
- reason = "No reason specified";
- if (Config->AddAkiller)
- reason = "(" + u->nick + ") " + reason;
- Log(LOG_ADMIN, u, this) << "on " << u2->nick << " for " << reason;
- u2->Kill(Config->OperServ, reason);
- }
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows you to kill a user from the network.\n"
- "Parameters are the same as for the standard /KILL\n"
- "command."));
- return true;
- }
-};
-
-class OSKill : public Module
-{
- CommandOSKill commandoskill;
-
- public:
- OSKill(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandoskill(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandoskill);
- }
-};
-
-MODULE_INIT(OSKill)
diff --git a/modules/core/os_list.cpp b/modules/core/os_list.cpp
deleted file mode 100644
index 9a582f97b..000000000
--- a/modules/core/os_list.cpp
+++ /dev/null
@@ -1,187 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandOSChanList : public Command
-{
- public:
- CommandOSChanList(Module *creator) : Command(creator, "operserv/chanlist", 0, 2)
- {
- this->SetDesc(_("Lists all channel records"));
- this->SetSyntax(_("[{\037pattern\037 | \037nick\037} [\037SECRET\037]]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &pattern = !params.empty() ? params[0] : "";
- const Anope::string &opt = params.size() > 1 ? params[1] : "";
- std::list<ChannelModeName> Modes;
- User *u2;
-
- if (!opt.empty() && opt.equals_ci("SECRET"))
- {
- Modes.push_back(CMODE_SECRET);
- Modes.push_back(CMODE_PRIVATE);
- }
-
- if (!pattern.empty() && (u2 = finduser(pattern)))
- {
- source.Reply(_("\002%s\002 channel list:\n"
- "Name Users Modes Topic"), u2->nick.c_str());
-
- for (UChannelList::iterator uit = u2->chans.begin(), uit_end = u2->chans.end(); uit != uit_end; ++uit)
- {
- ChannelContainer *cc = *uit;
-
- if (!Modes.empty())
- for (std::list<ChannelModeName>::iterator it = Modes.begin(), it_end = Modes.end(); it != it_end; ++it)
- if (!cc->chan->HasMode(*it))
- continue;
-
- source.Reply(_("%-20s %4d +%-6s %s"), cc->chan->name.c_str(), cc->chan->users.size(), cc->chan->GetModes(true, true).c_str(), !cc->chan->topic.empty() ? cc->chan->topic.c_str() : "");
- }
- }
- else
- {
- source.Reply(_("Channel list:\n"
- "Name Users Modes Topic"));
-
- for (channel_map::const_iterator cit = ChannelList.begin(), cit_end = ChannelList.end(); cit != cit_end; ++cit)
- {
- Channel *c = cit->second;
-
- if (!pattern.empty() && !Anope::Match(c->name, pattern))
- continue;
- if (!Modes.empty())
- for (std::list<ChannelModeName>::iterator it = Modes.begin(), it_end = Modes.end(); it != it_end; ++it)
- if (!c->HasMode(*it))
- continue;
-
- source.Reply(_("%-20s %4d +%-6s %s"), c->name.c_str(), c->users.size(), c->GetModes(true, true).c_str(), !c->topic.empty() ? c->topic.c_str() : "");
- }
- }
-
- source.Reply(_("End of channel list."));
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Lists all channels currently in use on the IRC network, whether they\n"
- "are registered or not.\n"
- "If \002pattern\002 is given, lists only channels that match it. If a nickname\n"
- "is given, lists only the channels the user using it is on. If SECRET is\n"
- "specified, lists only channels matching \002pattern\002 that have the +s or\n"
- "+p mode."));
- return true;
- }
-};
-
-class CommandOSUserList : public Command
-{
- public:
- CommandOSUserList(Module *creator) : Command(creator, "operserv/userlist", 0, 2)
- {
- this->SetDesc(_("Lists all user records"));
- this->SetSyntax(_("[{\037pattern\037 | \037channel\037} [\037INVISIBLE\037]]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &pattern = !params.empty() ? params[0] : "";
- const Anope::string &opt = params.size() > 1 ? params[1] : "";
- Channel *c;
- std::list<UserModeName> Modes;
-
- if (!opt.empty() && opt.equals_ci("INVISIBLE"))
- Modes.push_back(UMODE_INVIS);
-
- if (!pattern.empty() && (c = findchan(pattern)))
- {
- source.Reply(_("\002%s\002 users list:\n"
- "Nick Mask"), pattern.c_str());
-
- for (CUserList::iterator cuit = c->users.begin(), cuit_end = c->users.end(); cuit != cuit_end; ++cuit)
- {
- UserContainer *uc = *cuit;
-
- if (!Modes.empty())
- for (std::list<UserModeName>::iterator it = Modes.begin(), it_end = Modes.end(); it != it_end; ++it)
- if (!uc->user->HasMode(*it))
- continue;
-
- source.Reply(_("%-20s %s@%s"), uc->user->nick.c_str(), uc->user->GetIdent().c_str(), uc->user->GetDisplayedHost().c_str());
- }
- }
- else
- {
- source.Reply(_("Users list:\n"
- "Nick Mask"));
-
- for (Anope::insensitive_map<User *>::iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it)
- {
- User *u2 = it->second;
-
- if (!pattern.empty())
- {
- Anope::string mask = u2->nick + "!" + u2->GetIdent() + "@" + u2->GetDisplayedHost();
- if (!Anope::Match(mask, pattern))
- continue;
- if (!Modes.empty())
- for (std::list<UserModeName>::iterator mit = Modes.begin(), mit_end = Modes.end(); mit != mit_end; ++mit)
- if (!u2->HasMode(*mit))
- continue;
- }
- source.Reply(_("%-20s %s@%s"), u2->nick.c_str(), u2->GetIdent().c_str(), u2->GetDisplayedHost().c_str());
- }
- }
-
- source.Reply(_("End of users list."));
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Lists all users currently online on the IRC network, whether their\n"
- "nick is registered or not.\n"
- " \n"
- "If \002pattern\002 is given, lists only users that match it (it must be in\n"
- "the format nick!user@host). If \002channel\002 is given, lists only users\n"
- "that are on the given channel. If INVISIBLE is specified, only users\n"
- "with the +i flag will be listed."));
- return true;
- }
-};
-
-class OSList : public Module
-{
- CommandOSChanList commandoschanlist;
- CommandOSUserList commandosuserlist;
-
- public:
- OSList(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandoschanlist(this), commandosuserlist(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandoschanlist);
- ModuleManager::RegisterService(&commandosuserlist);
- }
-};
-
-MODULE_INIT(OSList)
diff --git a/modules/core/os_login.cpp b/modules/core/os_login.cpp
deleted file mode 100644
index 94a82e334..000000000
--- a/modules/core/os_login.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- *
- *
- */
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandOSLogin : public Command
-{
- public:
- CommandOSLogin(Module *creator) : Command(creator, "operserv/login", 1, 1)
- {
- this->SetDesc(Anope::printf(_("Login to %s"), Config->OperServ.c_str()));
- this->SetSyntax(_("\037password\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &password = params[0];
-
- Oper *o = source.u->Account()->o;
- if (o == NULL)
- source.Reply(_("No oper block for your nick."));
- else if (o->password.empty())
- source.Reply(_("Your oper block doesn't require logging in."));
- else if (source.u->GetExt("os_login_password_correct"))
- source.Reply(_("You are already identified."));
- else if (o->password != password)
- {
- source.Reply(PASSWORD_INCORRECT);
- bad_password(source.u);
- }
- else
- {
- Log(LOG_ADMIN, source.u, this) << "and successfully identified to " << source.owner->nick;
- source.u->Extend("os_login_password_correct");
- source.Reply(_("Password accepted."));
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Logs you in to %s so you gain Services Operator privileges.\n"
- "This command may be unnecessary if your oper block is\n"
- "configured without a password."), source.owner->nick.c_str());
- return true;
- }
-};
-
-class OSLogin : public Module
-{
- CommandOSLogin commandoslogin;
-
- public:
- OSLogin(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandoslogin(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandoslogin);
-
- ModuleManager::Attach(I_IsServicesOper, this);
- }
-
- ~OSLogin()
- {
- for (Anope::insensitive_map<User *>::const_iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it)
- it->second->Shrink("os_login_password_correct");
- }
-
- EventReturn IsServicesOper(User *u)
- {
- if (!u->Account()->o->password.empty())
- {
- if (u->GetExt("os_login_password_correct"))
- return EVENT_ALLOW;
- return EVENT_STOP;
- }
-
- return EVENT_CONTINUE;
- }
-};
-
-MODULE_INIT(OSLogin)
diff --git a/modules/core/os_main.cpp b/modules/core/os_main.cpp
deleted file mode 100644
index b555b9ede..000000000
--- a/modules/core/os_main.cpp
+++ /dev/null
@@ -1,371 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-static BotInfo *OperServ;
-
-class SGLineManager : public XLineManager
-{
- public:
- SGLineManager(Module *creator) : XLineManager(creator, "xlinemanager/sgline", 'G') { }
-
- XLine *Add(const Anope::string &mask, const Anope::string &creator, time_t expires, const Anope::string &reason)
- {
- Anope::string realreason = reason;
- if (!creator.empty() && Config->AddAkiller)
- realreason = "[" + creator + "] " + reason;
-
- XLine *x = new XLine(mask, creator, expires, realreason);
-
- this->AddXLine(x);
-
- if (UplinkSock && Config->AkillOnAdd)
- this->Send(NULL, x);
-
- return x;
- }
-
- void Del(XLine *x)
- {
- ircdproto->SendAkillDel(x);
- }
-
- void OnMatch(User *u, XLine *x)
- {
- if (u)
- u->Kill(Config->OperServ, x->Reason);
- ircdproto->SendAkill(u, x);
- }
-
- void OnExpire(XLine *x)
- {
- if (Config->WallAkillExpire)
- ircdproto->SendGlobops(OperServ, "AKILL on %s has expired", x->Mask.c_str());
- }
-
- void Send(User *u, XLine *x)
- {
- ircdproto->SendAkill(u, x);
- }
-};
-
-class SZLineManager : public XLineManager
-{
- public:
- SZLineManager(Module *creator) : XLineManager(creator, "xlinemanager/szline", 'Z') { }
-
- XLine *Add(const Anope::string &mask, const Anope::string &creator, time_t expires, const Anope::string &reason)
- {
- XLine *x = new XLine(mask, creator, expires, reason);
-
- this->AddXLine(x);
-
- if (UplinkSock)
- this->Send(NULL, x);
-
- return x;
- }
-
- void Del(XLine *x)
- {
- ircdproto->SendSZLineDel(x);
- }
-
- void OnMatch(User *u, XLine *x)
- {
- if (u)
- {
- Anope::string reason = "Z-Lined: " + x->Reason;
- u->Kill(Config->OperServ, reason);
- }
-
- ircdproto->SendSZLine(u, x);
- }
-
- void OnExpire(XLine *x)
- {
- if (Config->WallSZLineExpire)
- ircdproto->SendGlobops(OperServ, "SZLINE on \2%s\2 has expired", x->Mask.c_str());
- }
-
- void Send(User *u, XLine *x)
- {
- ircdproto->SendSZLine(u, x);
- }
-};
-
-class SQLineManager : public XLineManager
-{
- public:
- SQLineManager(Module *creator) : XLineManager(creator, "xlinemanager/sqline", 'Q') { }
-
- XLine *Add(const Anope::string &mask, const Anope::string &creator, time_t expires, const Anope::string &reason)
- {
- XLine *x = new XLine(mask, creator, expires, reason);
-
- this->AddXLine(x);
-
- if (Config->KillonSQline)
- {
- Anope::string rreason = "Q-Lined: " + reason;
-
- if (mask[0] == '#')
- {
- for (channel_map::const_iterator cit = ChannelList.begin(), cit_end = ChannelList.end(); cit != cit_end; ++cit)
- {
- Channel *c = cit->second;
-
- if (!Anope::Match(c->name, mask))
- continue;
- for (CUserList::iterator it = c->users.begin(), it_end = c->users.end(); it != it_end; )
- {
- UserContainer *uc = *it;
- ++it;
-
- if (uc->user->HasMode(UMODE_OPER) || uc->user->server == Me)
- continue;
- c->Kick(NULL, uc->user, "%s", reason.c_str());
- }
- }
- }
- else
- {
- for (Anope::insensitive_map<User *>::const_iterator it = UserListByNick.begin(); it != UserListByNick.end();)
- {
- User *user = it->second;
- ++it;
-
- if (!user->HasMode(UMODE_OPER) && user->server != Me && Anope::Match(user->nick, x->Mask))
- user->Kill(Config->ServerName, rreason);
- }
- }
- }
-
- if (UplinkSock)
- this->Send(NULL, x);
-
- return x;
- }
-
- void Del(XLine *x)
- {
- ircdproto->SendSQLineDel(x);
- }
-
- void OnMatch(User *u, XLine *x)
- {
- if (u)
- {
- Anope::string reason = "Q-Lined: " + x->Reason;
- u->Kill(Config->OperServ, reason);
- }
-
- this->Send(u, x);
- }
-
- void OnExpire(XLine *x)
- {
- if (Config->WallSQLineExpire)
- ircdproto->SendGlobops(OperServ, "SQLINE on \2%s\2 has expired", x->Mask.c_str());
- }
-
- void Send(User *u, XLine *x)
- {
- ircdproto->SendSQLine(u, x);
- }
-
- bool CheckChannel(Channel *c)
- {
- if (ircd->chansqline)
- for (std::vector<XLine *>::const_iterator it = this->GetList().begin(), it_end = this->GetList().end(); it != it_end; ++it)
- if (Anope::Match(c->name, (*it)->Mask))
- return true;
- return false;
- }
-};
-
-class SNLineManager : public XLineManager
-{
- public:
- SNLineManager(Module *creator) : XLineManager(creator, "xlinemanager/snline", 'N') { }
-
- XLine *Add(const Anope::string &mask, const Anope::string &creator, time_t expires, const Anope::string &reason)
- {
- XLine *x = new XLine(mask, creator, expires, reason);
-
- this->AddXLine(x);
-
- if (Config->KillonSNline && !ircd->sglineenforce)
- {
- Anope::string rreason = "G-Lined: " + reason;
-
- for (Anope::insensitive_map<User *>::const_iterator it = UserListByNick.begin(); it != UserListByNick.end();)
- {
- User *user = it->second;
- ++it;
-
- if (!user->HasMode(UMODE_OPER) && user->server != Me && Anope::Match(user->realname, x->Mask))
- user->Kill(Config->ServerName, rreason);
- }
- }
-
- return x;
- }
-
- void Del(XLine *x)
- {
- ircdproto->SendSGLineDel(x);
- }
-
- void OnMatch(User *u, XLine *x)
- {
- if (u)
- {
- Anope::string reason = "G-Lined: " + x->Reason;
- u->Kill(Config->OperServ, reason);
- }
- this->Send(u, x);
- }
-
- void OnExpire(XLine *x)
- {
- if (Config->WallSNLineExpire)
- ircdproto->SendGlobops(OperServ, "SNLINE on \2%s\2 has expired", x->Mask.c_str());
- }
-
- void Send(User *u, XLine *x)
- {
- ircdproto->SendSGLine(u, x);
- }
-
- XLine *Check(User *u)
- {
- for (unsigned i = this->XLines.size(); i > 0; --i)
- {
- XLine *x = this->XLines[i - 1];
-
- if (x->Expires && x->Expires < Anope::CurTime)
- {
- this->OnExpire(x);
- this->Del(x);
- delete x;
- this->XLines.erase(XLines.begin() + i - 1);
- continue;
- }
-
- if (Anope::Match(u->realname, x->Mask))
- {
- this->OnMatch(u, x);
- return x;
- }
- }
-
- return NULL;
- }
-};
-
-class OperServCore : public Module
-{
- SGLineManager sglines;
- SZLineManager szlines;
- SQLineManager sqlines;
- SNLineManager snlines;
-
- public:
- OperServCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- sglines(this), szlines(this), sqlines(this), snlines(this)
- {
- this->SetAuthor("Anope");
-
- OperServ = findbot(Config->OperServ);
- if (OperServ == NULL)
- throw ModuleException("No bot named " + Config->OperServ);
-
- Implementation i[] = { I_OnBotPrivmsg, I_OnServerQuit, I_OnUserModeSet, I_OnUserModeUnset, I_OnUserConnect, I_OnUserNickChange, I_OnPreHelp };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
-
- ModuleManager::RegisterService(&sglines);
- ModuleManager::RegisterService(&szlines);
- ModuleManager::RegisterService(&sqlines);
- ModuleManager::RegisterService(&snlines);
-
- /* Yes, these are in this order for a reason. Most violent->least violent. */
- XLineManager::RegisterXLineManager(&sglines);
- XLineManager::RegisterXLineManager(&szlines);
- XLineManager::RegisterXLineManager(&sqlines);
- XLineManager::RegisterXLineManager(&snlines);
- }
-
- EventReturn OnBotPrivmsg(User *u, BotInfo *bi, Anope::string &message)
- {
- if (Config->OSOpersOnly && !u->HasMode(UMODE_OPER) && bi->nick == Config->OperServ)
- {
- u->SendMessage(bi, ACCESS_DENIED);
- return EVENT_STOP;
- }
-
- return EVENT_CONTINUE;
- }
-
- void OnServerQuit(Server *server)
- {
- if (server->HasFlag(SERVER_JUPED))
- ircdproto->SendGlobops(OperServ, "Received SQUIT for juped server %s", server->GetName().c_str());
- }
-
- void OnUserModeSet(User *u, UserModeName Name)
- {
- if (Name == UMODE_OPER)
- {
- if (Config->WallOper)
- ircdproto->SendGlobops(OperServ, "\2%s\2 is now an IRC operator.", u->nick.c_str());
- Log(OperServ) << u->nick << " is now an IRC operator";
- }
- }
-
- void OnUserModeUnset(User *u, UserModeName Name)
- {
- if (Name == UMODE_OPER)
- Log(OperServ) << u->nick << " is no longer an IRC operator";
- }
-
- void OnUserConnect(dynamic_reference<User> &u, bool &exempt)
- {
- if (u && !exempt)
- XLineManager::CheckAll(u);
- }
-
- void OnUserNickChange(User *u, const Anope::string &oldnick)
- {
- if (ircd->sqline && !u->HasMode(UMODE_OPER))
- this->sqlines.Check(u);
- }
-
- EventReturn OnCheckKick(User *u, ChannelInfo *ci, bool &kick)
- {
- if (this->sqlines.CheckChannel(ci->c))
- kick = true;
- return EVENT_CONTINUE;
- }
-
- void OnPreHelp(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!params.empty() || source.owner->nick != Config->OperServ)
- return;
- source.Reply(_("%s commands:"), Config->OperServ.c_str());
- }
-};
-
-MODULE_INIT(OperServCore)
-
diff --git a/modules/core/os_mode.cpp b/modules/core/os_mode.cpp
deleted file mode 100644
index b3e62ca25..000000000
--- a/modules/core/os_mode.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandOSMode : public Command
-{
- public:
- CommandOSMode(Module *creator) : Command(creator, "operserv/mode", 2, 2)
- {
- this->SetDesc(_("Change channel modes"));
- this->SetSyntax(_("\037channel\037 \037modes\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &target = params[0];
- const Anope::string &modes = params[1];
-
- Channel *c = findchan(target);
- if (!c)
- source.Reply(CHAN_X_NOT_IN_USE, target.c_str());
- else if (c->bouncy_modes)
- source.Reply(_("Services is unable to change modes. Are your servers' U:lines configured correctly?"));
- else
- {
- c->SetModes(source.owner, false, modes.c_str());
-
- Log(LOG_ADMIN, u, this) << modes << " on " << target;
- }
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows Services operators to change modes for any channel.\n"
- "Parameters are the same as for the standard /MODE command."));
- return true;
- }
-};
-
-class CommandOSUMode : public Command
-{
- public:
- CommandOSUMode(Module *creator) : Command(creator, "operserv/umode", 2, 2)
- {
- this->SetDesc(_("Change channel or user modes"));
- this->SetSyntax(_("\037user\037 \037modes\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &target = params[0];
- const Anope::string &modes = params[1];
-
- User *u2 = finduser(target);
- if (!u2)
- source.Reply(NICK_X_NOT_IN_USE, target.c_str());
- else
- {
- u2->SetModes(source.owner, "%s", modes.c_str());
- source.Reply(_("Changed usermodes of \002%s\002 to %s."), u2->nick.c_str(), modes.c_str());
-
- u2->SendMessage(source.owner, _("\002%s\002 changed your usermodes to %s."), u->nick.c_str(), modes.c_str());
-
- Log(LOG_ADMIN, u, this) << modes << " on " << target;
- }
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows Services operators to change modes for any user.\n"
- "Parameters are the same as for the standard /MODE command."));
- return true;
- }
-};
-
-class OSMode : public Module
-{
- CommandOSMode commandosmode;
- CommandOSUMode commandosumode;
-
- public:
- OSMode(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandosmode(this), commandosumode(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandosmode);
- ModuleManager::RegisterService(&commandosumode);
- }
-};
-
-MODULE_INIT(OSMode)
diff --git a/modules/core/os_modinfo.cpp b/modules/core/os_modinfo.cpp
deleted file mode 100644
index 38d9cf905..000000000
--- a/modules/core/os_modinfo.cpp
+++ /dev/null
@@ -1,245 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandOSModInfo : public Command
-{
- public:
- CommandOSModInfo(Module *creator) : Command(creator, "operserv/modinfo", 1, 1)
- {
- this->SetDesc(_("Info about a loaded module"));
- this->SetSyntax(_("\037modname\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &file = params[0];
-
- Module *m = ModuleManager::FindModule(file);
- if (m)
- {
- source.Reply(_("Module: \002%s\002 Version: \002%s\002 Author: \002%s\002 loaded: \002%s\002"), m->name.c_str(), !m->version.empty() ? m->version.c_str() : "?", !m->author.empty() ? m->author.c_str() : "?", do_strftime(m->created).c_str());
-
- std::vector<Anope::string> services = ModuleManager::GetServiceKeys();
- for (unsigned i = 0; i < services.size(); ++i)
- {
- Service *s = ModuleManager::GetService(services[i]);
- if (!s || s->owner != m)
- continue;
- source.Reply(_(" Providing service: \002%s\002"), s->name.c_str());
-
- for (botinfo_map::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it)
- {
- BotInfo *bi = it->second;
-
- for (BotInfo::command_map::const_iterator cit = bi->commands.begin(), cit_end = bi->commands.end(); cit != cit_end; ++cit)
- {
- const Anope::string &c_name = cit->first;
- const CommandInfo &info = cit->second;
- if (info.name != s->name)
- continue;
- source.Reply(_(" Command \002%s\002 on \002%s\002 is linked to \002%s\002"), c_name.c_str(), bi->nick.c_str(), s->name.c_str());
- }
- }
- }
- }
- else
- source.Reply(_("No information about module \002%s\002 is available"), file.c_str());
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("This command lists information about the specified loaded module"));
- return true;
- }
-};
-
-class CommandOSModList : public Command
-{
- public:
- CommandOSModList(Module *creator) : Command(creator, "operserv/modlist", 0, 1)
- {
- this->SetDesc(_("List loaded modules"));
- this->SetSyntax(_("[Core|3rd|protocol|encryption|supported]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &param = !params.empty() ? params[0] : "";
-
- int count = 0;
- int showCore = 0;
- int showThird = 1;
- int showProto = 1;
- int showEnc = 1;
- int showSupported = 1;
- int showDB = 1;
-
- char core[] = "Core";
- char third[] = "3rd";
- char proto[] = "Protocol";
- char enc[] = "Encryption";
- char supported[] = "Supported";
- char db[] = "Database";
-
- if (!param.empty())
- {
- if (param.equals_ci(core))
- {
- showCore = 1;
- showThird = 0;
- showProto = 0;
- showEnc = 0;
- showSupported = 0;
- showDB = 0;
- }
- else if (param.equals_ci(third))
- {
- showCore = 0;
- showThird = 1;
- showSupported = 0;
- showProto = 0;
- showEnc = 0;
- showDB = 0;
- }
- else if (param.equals_ci(proto))
- {
- showCore = 0;
- showThird = 0;
- showProto = 1;
- showEnc = 0;
- showSupported = 0;
- showDB = 0;
- }
- else if (param.equals_ci(supported))
- {
- showCore = 0;
- showThird = 0;
- showProto = 0;
- showSupported = 1;
- showEnc = 0;
- showDB = 0;
- }
- else if (param.equals_ci(enc))
- {
- showCore = 0;
- showThird = 0;
- showProto = 0;
- showSupported = 0;
- showEnc = 1;
- showDB = 0;
- }
- else if (param.equals_ci(db))
- {
- showCore = 0;
- showThird = 0;
- showProto = 0;
- showSupported = 0;
- showEnc = 0;
- showDB = 1;
- }
- }
-
- source.Reply(_("Current Module list:"));
-
- for (std::list<Module *>::iterator it = Modules.begin(), it_end = Modules.end(); it != it_end; ++it)
- {
- Module *m = *it;
-
- switch (m->type)
- {
- case CORE:
- if (showCore)
- {
- source.Reply(_("Module: \002%s\002 [%s] [%s]"), m->name.c_str(), m->version.c_str(), core);
- ++count;
- }
- break;
- case THIRD:
- if (showThird)
- {
- source.Reply(_("Module: \002%s\002 [%s] [%s]"), m->name.c_str(), m->version.c_str(), third);
- ++count;
- }
- break;
- case PROTOCOL:
- if (showProto)
- {
- source.Reply(_("Module: \002%s\002 [%s] [%s]"), m->name.c_str(), m->version.c_str(), proto);
- ++count;
- }
- break;
- case SUPPORTED:
- if (showSupported)
- {
- source.Reply(_("Module: \002%s\002 [%s] [%s]"), m->name.c_str(), m->version.c_str(), supported);
- ++count;
- }
- break;
- case ENCRYPTION:
- if (showEnc)
- {
- source.Reply(_("Module: \002%s\002 [%s] [%s]"), m->name.c_str(), m->version.c_str(), enc);
- ++count;
- }
- break;
- case DATABASE:
- if (showDB)
- {
- source.Reply(_("Module: \002%s\002 [%s] [%s]"), m->name.c_str(), m->version.c_str(), db);
- ++count;
- }
- break;
- default:
- break;
- }
- }
- if (!count)
- source.Reply(_("No modules currently loaded"));
- else
- source.Reply(_("%d Modules loaded."), count);
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Lists all currently loaded modules."));
- return true;
- }
-};
-
-class OSModInfo : public Module
-{
- CommandOSModInfo commandosmodinfo;
- CommandOSModList commandosmodlist;
-
- public:
- OSModInfo(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandosmodinfo(this), commandosmodlist(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandosmodinfo);
- ModuleManager::RegisterService(&commandosmodlist);
- }
-};
-
-MODULE_INIT(OSModInfo)
diff --git a/modules/core/os_module.cpp b/modules/core/os_module.cpp
deleted file mode 100644
index 562e130aa..000000000
--- a/modules/core/os_module.cpp
+++ /dev/null
@@ -1,202 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandOSModLoad : public Command
-{
- public:
- CommandOSModLoad(Module *creator) : Command(creator, "operserv/modload", 1, 1)
- {
- this->SetDesc(_("Load a module"));
- this->SetSyntax(_("\037modname\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &mname = params[0];
-
- ModuleReturn status = ModuleManager::LoadModule(mname, u);
- if (status == MOD_ERR_OK)
- {
- ircdproto->SendGlobops(source.owner, "%s loaded module %s", u->nick.c_str(), mname.c_str());
- source.Reply(_("Module \002%s\002 loaded"), mname.c_str());
-
- /* If a user is loading this module, then the core databases have already been loaded
- * so trigger the event manually
- */
- Module *m = ModuleManager::FindModule(mname);
- if (m)
- m->OnPostLoadDatabases();
- }
- else if (status == MOD_ERR_EXISTS)
- source.Reply(_("Module \002%s\002 is already loaded."), mname.c_str());
- else
- source.Reply(_("Unable to load module \002%s\002"), mname.c_str());
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("This command loads the module named FileName from the modules\n"
- "directory."));
- return true;
- }
-};
-
-class CommandOSModReLoad : public Command
-{
- public:
- CommandOSModReLoad(Module *creator) : Command(creator, "operserv/modreload", 1, 1)
- {
- this->SetDesc(_("Reload a module"));
- this->SetSyntax(_("\037modname\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &mname = params[0];
-
- Module *m = ModuleManager::FindModule(mname);
- if (!m)
- {
- source.Reply(_("Module \002%s\002 isn't loaded."), mname.c_str());
- return;
- }
-
- if (!m->handle || m->GetPermanent())
- {
- source.Reply(_("Unable to remove module \002%s\002"), m->name.c_str());
- return;
- }
-
- /* Unrecoverable */
- bool fatal = m->type == PROTOCOL;
- ModuleReturn status = ModuleManager::UnloadModule(m, u);
-
- if (status != MOD_ERR_OK)
- {
- source.Reply(_("Unable to remove module \002%s\002"), mname.c_str());
- return;
- }
-
- status = ModuleManager::LoadModule(mname, u);
- if (status == MOD_ERR_OK)
- {
- ircdproto->SendGlobops(source.owner, "%s reloaded module %s", u->nick.c_str(), mname.c_str());
- source.Reply(_("Module \002%s\002 reloaded"), mname.c_str());
-
- /* If a user is loading this module, then the core databases have already been loaded
- * so trigger the event manually
- */
- m = ModuleManager::FindModule(mname);
- if (m)
- m->OnPostLoadDatabases();
- }
- else
- {
- if (fatal)
- throw FatalException("Unable to reload module " + mname);
- else
- source.Reply(_("Unable to load module \002%s\002"), mname.c_str());
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("This command reloads the module named FileName."));
- return true;
- }
-};
-
-class CommandOSModUnLoad : public Command
-{
- public:
- CommandOSModUnLoad(Module *creator) : Command(creator, "operserv/modunload", 1, 1)
- {
- this->SetDesc(_("Un-Load a module"));
- this->SetSyntax(_("\037modname\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &mname = params[0];
-
- Module *m = ModuleManager::FindModule(mname);
- if (!m)
- {
- source.Reply(_("Module \002%s\002 isn't loaded."), mname.c_str());
- return;
- }
-
- if (!m->handle || m->GetPermanent() || m->type == PROTOCOL)
- {
- source.Reply(_("Unable to remove module \002%s\002"), m->name.c_str());
- return;
- }
-
- Log() << "Trying to unload module [" << mname << "]";
-
- ModuleReturn status = ModuleManager::UnloadModule(m, u);
-
- if (status == MOD_ERR_OK)
- {
- source.Reply(_("Module \002%s\002 unloaded"), mname.c_str());
- ircdproto->SendGlobops(source.owner, "%s unloaded module %s", u->nick.c_str(), mname.c_str());
- }
- else
- source.Reply(_("Unable to remove module \002%s\002"), mname.c_str());
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("This command unloads the module named FileName from the modules\n"
- "directory."));
- return true;
- }
-};
-
-class OSModule : public Module
-{
- CommandOSModLoad commandosmodload;
- CommandOSModReLoad commandosmodreload;
- CommandOSModUnLoad commandosmodunload;
-
- public:
- OSModule(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandosmodload(this), commandosmodreload(this), commandosmodunload(this)
- {
- this->SetAuthor("Anope");
- this->SetPermanent(true);
-
- ModuleManager::RegisterService(&commandosmodload);
- ModuleManager::RegisterService(&commandosmodreload);
- ModuleManager::RegisterService(&commandosmodunload);
- }
-};
-
-MODULE_INIT(OSModule)
diff --git a/modules/core/os_news.cpp b/modules/core/os_news.cpp
deleted file mode 100644
index 9c9aae0a4..000000000
--- a/modules/core/os_news.cpp
+++ /dev/null
@@ -1,450 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at info@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-#include "global.h"
-#include "os_news.h"
-
-/* List of messages for each news type. This simplifies message sending. */
-
-enum
-{
- MSG_SYNTAX,
- MSG_LIST_HEADER,
- MSG_LIST_NONE,
- MSG_ADDED,
- MSG_DEL_NOT_FOUND,
- MSG_DELETED,
- MSG_DEL_NONE,
- MSG_DELETED_ALL
-};
-
-struct NewsMessages msgarray[] = {
- {NEWS_LOGON, "LOGON",
- {_("LOGONNEWS {ADD|DEL|LIST} [\037text\037|\037num\037]\002"),
- _("Logon news items:"),
- _("There is no logon news."),
- _("Added new logon news item."),
- _("Logon news item #%s not found!"),
- _("Logon news item #%d deleted."),
- _("No logon news items to delete!"),
- _("All logon news items deleted.")}
- },
- {NEWS_OPER, "OPER",
- {_("OPERNEWS {ADD|DEL|LIST} [\037text\037|\037num\037]\002"),
- _("Oper news items:"),
- _("There is no oper news."),
- _("Added new oper news item."),
- _("Oper news item #%s not found!"),
- _("Oper news item #%d deleted."),
- _("No oper news items to delete!"),
- _("All oper news items deleted.")}
- },
- {NEWS_RANDOM, "RANDOM",
- {_("RANDOMNEWS {ADD|DEL|LIST} [\037text\037|\037num\037]\002"),
- _("Random news items:"),
- _("There is no random news."),
- _("Added new random news item."),
- _("Random news item #%s not found!"),
- _("Random news item #%d deleted."),
- _("No random news items to delete!"),
- _("All random news items deleted.")}
- }
-};
-
-class MyNewsService : public NewsService
-{
- std::vector<NewsItem *> newsItems[3];
- public:
- MyNewsService(Module *m) : NewsService(m) { }
-
- ~MyNewsService()
- {
- for (unsigned i = 0; i < 3; ++i)
- for (unsigned j = 0; j < newsItems[i].size(); ++j)
- delete newsItems[i][j];
- }
-
- void AddNewsItem(NewsItem *n)
- {
- this->newsItems[n->type].push_back(n);
- }
-
- void DelNewsItem(NewsItem *n)
- {
- std::vector<NewsItem *> &list = this->GetNewsList(n->type);
- std::vector<NewsItem *>::iterator it = std::find(list.begin(), list.end(), n);
- if (it != list.end())
- list.erase(it);
- delete n;
- }
-
- std::vector<NewsItem *> &GetNewsList(NewsType t)
- {
- return this->newsItems[t];
- }
-};
-
-#define lenof(a) (sizeof(a) / sizeof(*(a)))
-static const char **findmsgs(NewsType type)
-{
- for (unsigned i = 0; i < lenof(msgarray); ++i)
- if (msgarray[i].type == type)
- return msgarray[i].msgs;
- return NULL;
-}
-
-class NewsBase : public Command
-{
- service_reference<NewsService> ns;
-
- protected:
- void DoList(CommandSource &source, NewsType type, const char **msgs)
- {
- std::vector<NewsItem *> &list = this->ns->GetNewsList(type);
- if (list.empty())
- source.Reply(msgs[MSG_LIST_NONE]);
- else
- {
- source.Reply(msgs[MSG_LIST_HEADER]);
- for (unsigned i = 0, end = list.size(); i < end; ++i)
- source.Reply(_("%5d (%s by %s)\n"" %s"), i + 1, do_strftime(list[i]->time).c_str(), !list[i]->who.empty() ? list[i]->who.c_str() : "<unknown>", list[i]->text.c_str());
- source.Reply(END_OF_ANY_LIST, "News");
- }
-
- return;
- }
-
- void DoAdd(CommandSource &source, const std::vector<Anope::string> &params, NewsType type, const char **msgs)
- {
- const Anope::string text = params.size() > 1 ? params[1] : "";
-
- if (text.empty())
- this->OnSyntaxError(source, "ADD");
- else
- {
- if (readonly)
- source.Reply(READ_ONLY_MODE);
-
- NewsItem *news = new NewsItem();
- news->type = type;
- news->text = text;
- news->time = Anope::CurTime;
- news->who = source.u->nick;
-
- this->ns->AddNewsItem(news);
-
- source.Reply(msgs[MSG_ADDED]);
- }
-
- return;
- }
-
- void DoDel(CommandSource &source, const std::vector<Anope::string> &params, NewsType type, const char **msgs)
- {
- const Anope::string &text = params.size() > 1 ? params[1] : "";
-
- if (text.empty())
- this->OnSyntaxError(source, "DEL");
- else
- {
- std::vector<NewsItem *> &list = this->ns->GetNewsList(type);
- if (list.empty())
- source.Reply(msgs[MSG_LIST_NONE]);
- else
- {
- if (readonly)
- source.Reply(READ_ONLY_MODE);
- if (!text.equals_ci("ALL"))
- {
- try
- {
- unsigned num = convertTo<unsigned>(text);
- if (num > 0 && num <= list.size())
- {
- this->ns->DelNewsItem(list[num - 1]);
- source.Reply(msgs[MSG_DELETED], num);
- return;
- }
- }
- catch (const ConvertException &) { }
-
- source.Reply(msgs[MSG_DEL_NOT_FOUND], text.c_str());
- }
- else
- {
- for (unsigned i = list.size(); i > 0; --i)
- this->ns->DelNewsItem(list[i - 1]);
- source.Reply(msgs[MSG_DELETED_ALL]);
- }
- }
- }
-
- return;
- }
-
- void DoNews(CommandSource &source, const std::vector<Anope::string> &params, NewsType type)
- {
- if (!this->ns)
- return;
-
- const Anope::string &cmd = params[0];
-
- const char **msgs = findmsgs(type);
- if (!msgs)
- throw CoreException("news: Invalid type to do_news()");
-
- if (cmd.equals_ci("LIST"))
- return this->DoList(source, type, msgs);
- else if (cmd.equals_ci("ADD"))
- return this->DoAdd(source, params, type, msgs);
- else if (cmd.equals_ci("DEL"))
- return this->DoDel(source, params, type, msgs);
- else
- this->OnSyntaxError(source, "");
-
- return;
- }
- public:
- NewsBase(Module *creator, const Anope::string &newstype) : Command(creator, newstype, 1, 2), ns("news")
- {
- this->SetSyntax(_("ADD \037text\037"));
- this->SetSyntax(_("DEL {\037num\037 | ALL}"));
- this->SetSyntax(_("LIST"));
- }
-
- virtual ~NewsBase()
- {
- }
-
- virtual void Execute(CommandSource &source, const std::vector<Anope::string> &params) = 0;
-
- virtual bool OnHelp(CommandSource &source, const Anope::string &subcommand) = 0;
-};
-
-class CommandOSLogonNews : public NewsBase
-{
- public:
- CommandOSLogonNews(Module *creator) : NewsBase(creator, "operserv/logonnews")
- {
- this->SetDesc(_("Define messages to be shown to users at logon"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- return this->DoNews(source, params, NEWS_LOGON);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Edits or displays the list of logon news messages. When a\n"
- "user connects to the network, these messages will be sent\n"
- "to them. (However, no more than \002%d\002 messages will be\n"
- "sent in order to avoid flooding the user. If there are\n"
- "more news messages, only the most recent will be sent.)\n"
- "NewsCount can be configured in services.conf.\n"
- " \n"
- "LOGONNEWS may only be used by Services Operators."), Config->NewsCount);
- return true;
- }
-};
-
-class CommandOSOperNews : public NewsBase
-{
- public:
- CommandOSOperNews(Module *creator) : NewsBase(creator, "operserv/opernews")
- {
- this->SetDesc(_("Define messages to be shown to users who oper"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- return this->DoNews(source, params, NEWS_OPER);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Edits or displays the list of oper news messages. When a\n"
- "user opers up (with the /OPER command), these messages will\n"
- "be sent to them. (However, no more than \002%d\002 messages will\n"
- "be sent in order to avoid flooding the user. If there are\n"
- "more news messages, only the most recent will be sent.)\n"
- "NewsCount can be configured in services.conf.\n"
- " \n"
- "OPERNEWS may only be used by Services Operators."), Config->NewsCount);
- return true;
- }
-};
-
-class CommandOSRandomNews : public NewsBase
-{
- public:
- CommandOSRandomNews(Module *creator) : NewsBase(creator, "operserv/randomnews")
- {
- this->SetDesc(_("Define messages to be randomly shown to users at logon"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- return this->DoNews(source, params, NEWS_RANDOM);
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Edits or displays the list of random news messages. When a\n"
- "user connects to the network, one (and only one) of the\n"
- "random news will be randomly chosen and sent to them.\n"
- " \n"
- "RANDOMNEWS may only be used by Services Operators."));
- return true;
- }
-};
-
-class OSNews : public Module
-{
- MyNewsService newsservice;
-
- CommandOSLogonNews commandoslogonnews;
- CommandOSOperNews commandosopernews;
- CommandOSRandomNews commandosrandomnews;
-
- void DisplayNews(User *u, NewsType Type)
- {
- std::vector<NewsItem *> &newsList = this->newsservice.GetNewsList(Type);
- if (newsList.empty())
- return;
-
- Anope::string msg;
- if (Type == NEWS_LOGON)
- msg = _("[\002Logon News\002 - %s] %s");
- else if (Type == NEWS_OPER)
- msg = _("[\002Oper News\002 - %s] %s");
- else if (Type == NEWS_RANDOM)
- msg = _("[\002Random News\002 - %s] %s");
-
- static unsigned cur_rand_news = 0;
- unsigned displayed = 0;
- for (unsigned i = 0, end = newsList.size(); i < end; ++i)
- {
- if (Type == NEWS_RANDOM && i != cur_rand_news)
- continue;
-
- BotInfo *gl = findbot(Config->Global);
- if (!gl && !BotListByNick.empty())
- gl = BotListByNick.begin()->second;
- BotInfo *os = findbot(Config->OperServ);
- if (!os)
- os = gl;
- if (gl)
- u->SendMessage(Type != NEWS_OPER ? gl : os, msg.c_str(), do_strftime(newsList[i]->time).c_str(), newsList[i]->text.c_str());
-
- ++displayed;
-
- if (Type == NEWS_RANDOM)
- {
- ++cur_rand_news;
- break;
- }
- else if (displayed >= Config->NewsCount)
- break;
- }
-
- /* Reset to head of list to get first random news value */
- if (Type == NEWS_RANDOM && cur_rand_news >= newsList.size())
- cur_rand_news = 0;
- }
-
- public:
- OSNews(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- newsservice(this), commandoslogonnews(this), commandosopernews(this), commandosrandomnews(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandoslogonnews);
- ModuleManager::RegisterService(&commandosopernews);
- ModuleManager::RegisterService(&commandosrandomnews);
-
- Implementation i[] = { I_OnUserModeSet, I_OnUserConnect, I_OnDatabaseRead, I_OnDatabaseWrite };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
-
- ModuleManager::RegisterService(&this->newsservice);
- }
-
- void OnUserModeSet(User *u, UserModeName Name)
- {
- if (Name == UMODE_OPER)
- DisplayNews(u, NEWS_OPER);
- }
-
- void OnUserConnect(dynamic_reference<User> &user, bool &)
- {
- if (!user || !user->server->IsSynced())
- return;
-
- DisplayNews(user, NEWS_LOGON);
- DisplayNews(user, NEWS_RANDOM);
- }
-
- EventReturn OnDatabaseRead(const std::vector<Anope::string> &params)
- {
- if (params[0].equals_ci("OS") && params.size() >= 7 && params[1].equals_ci("NEWS"))
- {
- NewsItem *n = new NewsItem();
- // params[2] was news number
- n->time = params[3].is_number_only() ? convertTo<time_t>(params[3]) : 0;
- n->who = params[4];
- if (params[5].equals_ci("LOGON"))
- n->type = NEWS_LOGON;
- else if (params[5].equals_ci("RANDOM"))
- n->type = NEWS_RANDOM;
- else if (params[5].equals_ci("OPER"))
- n->type = NEWS_OPER;
- n->text = params[6];
-
- this->newsservice.AddNewsItem(n);
-
- return EVENT_STOP;
- }
-
- return EVENT_CONTINUE;
- }
-
- void OnDatabaseWrite(void (*Write)(const Anope::string &))
- {
- for (unsigned i = 0; i < 3; ++i)
- {
- std::vector<NewsItem *> &list = this->newsservice.GetNewsList(static_cast<NewsType>(i));
- for (std::vector<NewsItem *>::iterator it = list.begin(); it != list.end(); ++it)
- {
- NewsItem *n = *it;
- Anope::string ntype;
- if (n->type == NEWS_LOGON)
- ntype = "LOGON";
- else if (n->type == NEWS_RANDOM)
- ntype = "RANDOM";
- else if (n->type == NEWS_OPER)
- ntype = "OPER";
- Anope::string buf = "OS NEWS 0 " + stringify(n->time) + " " + n->who + " " + ntype + " :" + n->text;
- Write(buf);
- }
- }
- }
-};
-
-MODULE_INIT(OSNews)
diff --git a/modules/core/os_news.h b/modules/core/os_news.h
deleted file mode 100644
index c55f56d42..000000000
--- a/modules/core/os_news.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef OS_NEWS
-#define OS_NEWS
-
-enum NewsType
-{
- NEWS_LOGON,
- NEWS_RANDOM,
- NEWS_OPER
-};
-
-struct NewsMessages
-{
- NewsType type;
- Anope::string name;
- const char *msgs[10];
-};
-
-struct NewsItem
-{
- NewsType type;
- Anope::string text;
- Anope::string who;
- time_t time;
-};
-
-class NewsService : public Service
-{
- public:
- NewsService(Module *m) : Service(m, "news") { }
-
- virtual void AddNewsItem(NewsItem *n) = 0;
-
- virtual void DelNewsItem(NewsItem *n) = 0;
-
- virtual std::vector<NewsItem *> &GetNewsList(NewsType t) = 0;
-};
-
-#endif // OS_NEWS
-
diff --git a/modules/core/os_noop.cpp b/modules/core/os_noop.cpp
deleted file mode 100644
index 2eec522a3..000000000
--- a/modules/core/os_noop.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandOSNOOP : public Command
-{
- public:
- CommandOSNOOP(Module *creator) : Command(creator, "operserv/noop", 2, 2)
- {
- this->SetDesc(_("Temporarily remove all O:lines of a server remotely"));
- this->SetSyntax(_("SET \037server\037"));
- this->SetSyntax(_("REVOKE \037server\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &cmd = params[0];
- const Anope::string &server = params[1];
-
- Server *s = Server::Find(server);
- if (s == NULL)
- source.Reply(_("Server %s does not exist."), server.c_str());
- else if (cmd.equals_ci("SET"))
- {
- /* Remove the O:lines */
- ircdproto->SendSVSNOOP(s, true);
-
- Log(LOG_ADMIN, u, this) << "SET on " << s->GetName();
- source.Reply(_("All O:lines of \002%s\002 have been removed."), s->GetName().c_str());
-
- Anope::string reason = "NOOP command used by " + u->nick;
- /* Kill all the IRCops of the server */
- for (Anope::insensitive_map<User *>::iterator it = UserListByNick.begin(); it != UserListByNick.end();)
- {
- User *u2 = it->second;
- ++it;
-
- if (u2 && u2->HasMode(UMODE_OPER) && u2->server == s)
- u2->Kill(Config->OperServ, reason);
- }
- }
- else if (cmd.equals_ci("REVOKE"))
- {
- Log(LOG_ADMIN, u, this) << "REVOKE on " << s->GetName();
- ircdproto->SendSVSNOOP(s, false);
- source.Reply(_("All O:lines of \002%s\002 have been reset."), s->GetName().c_str());
- }
- else
- this->OnSyntaxError(source, "");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("\002NOOP SET\002 remove all O:lines of the given\n"
- "\002server\002 and kill all IRCops currently on it to\n"
- "prevent them from rehashing the server (because this\n"
- "would just cancel the effect).\n"
- "\002NOOP REVOKE\002 makes all removed O:lines available again\n"
- "on the given \002server\002.\n"));
- return true;
- }
-};
-
-class OSNOOP : public Module
-{
- CommandOSNOOP commandosnoop;
-
- public:
- OSNOOP(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandosnoop(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandosnoop);
- }
-};
-
-MODULE_INIT(OSNOOP)
diff --git a/modules/core/os_oline.cpp b/modules/core/os_oline.cpp
deleted file mode 100644
index adebc52a1..000000000
--- a/modules/core/os_oline.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandOSOLine : public Command
-{
- public:
- CommandOSOLine(Module *creator) : Command(creator, "operserv/oline", 2, 2)
- {
- this->SetDesc(_("Give Operflags to a certain user"));
- this->SetSyntax(_("\037nick\037 \037flags\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &nick = params[0];
- const Anope::string &flag = params[1];
- User *u2 = NULL;
-
- /* let's check whether the user is online */
- if (!(u2 = finduser(nick)))
- source.Reply(NICK_X_NOT_IN_USE, nick.c_str());
- else if (u2 && flag[0] == '+')
- {
- ircdproto->SendSVSO(Config->OperServ, nick, flag);
- u2->SetMode(source.owner, UMODE_OPER);
- u2->SendMessage(source.owner, _("You are now an IRC Operator."));
- source.Reply(_("Operflags \002%s\002 have been added for \002%s\002."), flag.c_str(), nick.c_str());
- ircdproto->SendGlobops(source.owner, "\2%s\2 used OLINE for %s", u->nick.c_str(), nick.c_str());
- }
- else if (u2 && flag[0] == '-')
- {
- ircdproto->SendSVSO(Config->OperServ, nick, flag);
- source.Reply(_("Operflags \002%s\002 have been added for \002%s\002."), flag.c_str(), nick.c_str());
- ircdproto->SendGlobops(source.owner, "\2%s\2 used OLINE for %s", u->nick.c_str(), nick.c_str());
- }
- else
- this->OnSyntaxError(source, "");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows Services Opers to give Operflags to any user.\n"
- "Flags have to be prefixed with a \"+\" or a \"-\". To\n"
- "remove all flags simply type a \"-\" instead of any flags."));
- return true;
- }
-};
-
-class OSOLine : public Module
-{
- CommandOSOLine commandosoline;
-
- public:
- OSOLine(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandosoline(this)
- {
- this->SetAuthor("Anope");
-
- if (!ircd || !ircd->omode)
- throw ModuleException("Your IRCd does not support OMODE.");
-
- ModuleManager::RegisterService(&commandosoline);
- }
-};
-
-MODULE_INIT(OSOLine)
diff --git a/modules/core/os_oper.cpp b/modules/core/os_oper.cpp
deleted file mode 100644
index 237c0b5bc..000000000
--- a/modules/core/os_oper.cpp
+++ /dev/null
@@ -1,219 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandOSOper : public Command
-{
- public:
- CommandOSOper(Module *creator) : Command(creator, "operserv/oper", 1, 3)
- {
- this->SetDesc(_("View and change services operators"));
- this->SetSyntax(_("ADD \037oper\037 \037type\037"));
- this->SetSyntax(_("DEL [\037oper\037]"));
- this->SetSyntax(_("INFO [\037type\037]"));
- this->SetSyntax(_("LIST"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &subcommand = params[0];
-
- if (subcommand.equals_ci("ADD") && params.size() > 2)
- {
- const Anope::string &oper = params[1];
- const Anope::string &type = params[2];
-
- NickAlias *na = findnick(oper);
- if (na == NULL)
- source.Reply(NICK_X_NOT_REGISTERED, oper.c_str());
- else
- {
- OperType *ot = OperType::Find(type);
- if (ot == NULL)
- source.Reply(_("Oper type \2%s\2 has not been configured."), type.c_str());
- else
- {
- if (na->nc->o)
- delete na->nc->o;
- na->nc->o = new Oper(na->nc->display, "", "", ot);
-
- Log(LOG_ADMIN, source.u, this) << "ADD " << na->nick << " as type " << ot->GetName();
- source.Reply("%s (%s) added to the \2%s\2 list.", na->nick.c_str(), na->nc->display.c_str(), ot->GetName().c_str());
- }
- }
- }
- else if (subcommand.equals_ci("DEL") && params.size() > 1)
- {
- const Anope::string &oper = params[1];
-
- NickAlias *na = findnick(oper);
- if (na == NULL)
- source.Reply(NICK_X_NOT_REGISTERED, oper.c_str());
- else if (!na->nc || !na->nc->o)
- source.Reply(_("Nick \2%s\2 is not a services operator."), oper.c_str());
- else
- {
- delete na->nc->o;
- na->nc->o = NULL;
-
- Log(LOG_ADMIN, source.u, this) << "DEL " << na->nick;
- source.Reply(_("Oper privileges removed from %s (%s)."), na->nick.c_str(), na->nc->display.c_str());
- }
- }
- else if (subcommand.equals_ci("LIST"))
- {
- source.Reply(_("Name Type"));
- for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it)
- {
- NickCore *nc = it->second;
-
- if (!nc->o)
- continue;
-
- source.Reply(_("%-8s %s"), nc->o->name.c_str(), nc->o->ot->GetName().c_str());
- for (std::list<NickAlias *>::const_iterator it2 = nc->aliases.begin(), it2_end = nc->aliases.end(); it2 != it2_end; ++it2)
- if (Oper::Find((*it2)->nick) != NULL)
- source.Reply(_(" This oper is configured in the configuration file as %s"), (*it2)->nick.c_str());
- for (std::list<User *>::iterator uit = nc->Users.begin(); uit != nc->Users.end(); ++uit)
- {
- User *u = *uit;
- source.Reply(_(" %s is online using this oper block."), u->nick.c_str());
- }
- }
- }
- else if (subcommand.equals_ci("INFO") && params.size() > 1)
- {
- Anope::string fulltype = params[1];
- if (params.size() > 2)
- fulltype += " " + params[2];
- OperType *ot = OperType::Find(fulltype);
- if (ot == NULL)
- source.Reply(_("Oper type \2%s\2 has not been configured."), fulltype.c_str());
- else
- {
- if (ot->GetCommands().empty())
- source.Reply(_("Opertype \2%s\2 has no allowed commands."), ot->GetName().c_str());
- else
- {
- source.Reply(_("Available commands for \2%s\2:"), ot->GetName().c_str());
- Anope::string buf;
- for (std::list<Anope::string>::const_iterator it = ot->GetCommands().begin(), it_end = ot->GetCommands().end(); it != it_end; ++it)
- {
- buf += *it + " ";
- if (buf.length() > 400)
- {
- source.Reply("%s", buf.c_str());
- buf.clear();
- }
- }
- if (!buf.empty())
- {
- source.Reply("%s", buf.c_str());
- buf.clear();
- }
- }
- if (ot->GetPrivs().empty())
- source.Reply(_("Opertype \2%s\2 has no allowed privileges."), ot->GetName().c_str());
- else
- {
- source.Reply(_("Available privileges for \2%s\2:"), ot->GetName().c_str());
- Anope::string buf;
- for (std::list<Anope::string>::const_iterator it = ot->GetPrivs().begin(), it_end = ot->GetPrivs().end(); it != it_end; ++it)
- {
- buf += *it + " ";
- if (buf.length() > 400)
- {
- source.Reply("%s", buf.c_str());
- buf.clear();
- }
- }
- if (!buf.empty())
- {
- source.Reply("%s", buf.c_str());
- buf.clear();
- }
- }
- if (!ot->modes.empty())
- source.Reply(_("Opertype \2%s\2 receives modes \2%s\2 once identifying."), ot->GetName().c_str(), ot->modes.c_str());
- }
- }
- else
- this->OnSyntaxError(source, subcommand);
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows you to change and view services operators.\n"
- "Note that operators removed by this command but are still set in\n"
- "the configuration file are not permanently affected by this."));
- return true;
- }
-};
-
-class OSOper : public Module
-{
- CommandOSOper commandosoper;
-
- public:
- OSOper(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandosoper(this)
- {
- this->SetAuthor("Anope");
-
- Implementation i[] = { I_OnDatabaseWrite, I_OnDatabaseRead };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
-
- ModuleManager::RegisterService(&commandosoper);
- }
-
- void OnDatabaseWrite(void (*Write)(const Anope::string &))
- {
- for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it)
- {
- NickCore *nc = it->second;
- if (!nc->o)
- continue;
- bool found = false;
- for (std::list<NickAlias *>::const_iterator it2 = nc->aliases.begin(), it2_end = nc->aliases.end(); it2 != it2_end; ++it2)
- if (Oper::Find((*it2)->nick) != NULL)
- found = true;
- if (found == false)
- {
- Write("OPER " + nc->display + " :" + nc->o->ot->GetName());
- }
- }
- }
-
- EventReturn OnDatabaseRead(const std::vector<Anope::string> &params)
- {
- if (params[0] == "OPER" && params.size() > 2)
- {
- NickCore *nc = findcore(params[1]);
- if (!nc || nc->o)
- return EVENT_CONTINUE;
- OperType *ot = OperType::Find(params[2]);
- if (ot == NULL)
- return EVENT_CONTINUE;
- nc->o = new Oper(nc->display, "", "", ot);
- Log(LOG_NORMAL, "operserv/oper") << "Tied oper " << nc->display << " to type " << ot->GetName();
- }
- return EVENT_CONTINUE;
- }
-};
-
-MODULE_INIT(OSOper)
diff --git a/modules/core/os_reload.cpp b/modules/core/os_reload.cpp
deleted file mode 100644
index d4d8eac7c..000000000
--- a/modules/core/os_reload.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandOSReload : public Command
-{
- public:
- CommandOSReload(Module *creator) : Command(creator, "operserv/reload", 0, 0)
- {
- this->SetDesc(_("Reload services' configuration file"));
- this->SetSyntax("");
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- ServerConfig *old_config = Config;
-
- try
- {
- Config = new ServerConfig();
- FOREACH_MOD(I_OnReload, OnReload());
- delete old_config;
- source.Reply(_("Services' configuration file has been reloaded."));
- }
- catch (const ConfigException &ex)
- {
- Config = old_config;
- Log() << "Error reloading configuration file: " << ex.GetReason();
- source.Reply(_("Error reloading confguration file: ") + ex.GetReason());
- }
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Causes Services to reload the configuration file. Note that\n"
- "some directives still need the restart of the Services to\n"
- "take effect (such as Services' nicknames, activation of the \n"
- "session limitation, etc.)"));
- return true;
- }
-};
-
-class OSReload : public Module
-{
- CommandOSReload commandosreload;
-
- public:
- OSReload(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandosreload(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandosreload);
- }
-};
-
-MODULE_INIT(OSReload)
diff --git a/modules/core/os_session.cpp b/modules/core/os_session.cpp
deleted file mode 100644
index 990cd1b4b..000000000
--- a/modules/core/os_session.cpp
+++ /dev/null
@@ -1,749 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-#include "os_session.h"
-
-static service_reference<SessionService> sessionservice("session");
-
-class MySessionService : public SessionService
-{
- SessionMap Sessions;
- ExceptionVector Exceptions;
- public:
- MySessionService(Module *m) : SessionService(m) { }
-
- void AddException(Exception *e)
- {
- this->Exceptions.push_back(e);
- }
-
- void DelException(Exception *e)
- {
- ExceptionVector::iterator it = std::find(this->Exceptions.begin(), this->Exceptions.end(), e);
- if (it != this->Exceptions.end())
- this->Exceptions.erase(it);
- }
-
- Exception *FindException(User *u)
- {
- for (std::vector<Exception *>::const_iterator it = this->Exceptions.begin(), it_end = this->Exceptions.end(); it != it_end; ++it)
- {
- Exception *e = *it;
- if (Anope::Match(u->host, e->mask) || (u->ip() && Anope::Match(u->ip.addr(), e->mask)))
- return e;
- }
- return NULL;
- }
-
- Exception *FindException(const Anope::string &host)
- {
- for (std::vector<Exception *>::const_iterator it = this->Exceptions.begin(), it_end = this->Exceptions.end(); it != it_end; ++it)
- {
- Exception *e = *it;
- if (Anope::Match(host, e->mask))
- return e;
- }
-
- return NULL;
- }
-
- ExceptionVector &GetExceptions()
- {
- return this->Exceptions;
- }
-
- void AddSession(Session *s)
- {
- this->Sessions[s->host] = s;
- }
-
- void DelSession(Session *s)
- {
- this->Sessions.erase(s->host);
- }
-
- Session *FindSession(const Anope::string &mask)
- {
- SessionMap::iterator it = this->Sessions.find(mask);
- if (it != this->Sessions.end())
- return it->second;
- return NULL;
- }
-
- SessionMap &GetSessions()
- {
- return this->Sessions;
- }
-};
-
-class ExpireTimer : public Timer
-{
- public:
- ExpireTimer() : Timer(Config->ExpireTimeout, Anope::CurTime, true) { }
-
- void Tick(time_t)
- {
- if (!sessionservice)
- return;
- for (unsigned i = sessionservice->GetExceptions().size(); i > 0; --i)
- {
- Exception *e = sessionservice->GetExceptions()[i - 1];
-
- if (!e->expires || e->expires > Anope::CurTime)
- continue;
- BotInfo *bi = findbot(Config->OperServ);
- if (Config->WallExceptionExpire && bi)
- ircdproto->SendGlobops(bi, "Session exception for %s has expired.", e->mask.c_str());
- sessionservice->DelException(e);
- delete e;
- }
- }
-};
-
-class ExceptionDelCallback : public NumberList
-{
- protected:
- CommandSource &source;
- unsigned Deleted;
- public:
- ExceptionDelCallback(CommandSource &_source, const Anope::string &numlist) : NumberList(numlist, true), source(_source), Deleted(0)
- {
- }
-
- ~ExceptionDelCallback()
- {
- if (!Deleted)
- source.Reply(_("No matching entries on session-limit exception list."));
- else if (Deleted == 1)
- source.Reply(_("Deleted 1 entry from session-limit exception list."));
- else
- source.Reply(_("Deleted %d entries from session-limit exception list."), Deleted);
- }
-
- virtual void HandleNumber(unsigned Number)
- {
- if (!Number || Number > sessionservice->GetExceptions().size())
- return;
-
- ++Deleted;
-
- DoDel(source, Number - 1);
- }
-
- static void DoDel(CommandSource &source, unsigned index)
- {
- Exception *e = sessionservice->GetExceptions()[index];
- FOREACH_MOD(I_OnExceptionDel, OnExceptionDel(source.u, e));
-
- sessionservice->DelException(e);
- delete e;
- }
-};
-
-class ExceptionListCallback : public NumberList
-{
- protected:
- CommandSource &source;
- bool SentHeader;
- public:
- ExceptionListCallback(CommandSource &_source, const Anope::string &numlist) : NumberList(numlist, false), source(_source), SentHeader(false)
- {
- }
-
- virtual void HandleNumber(unsigned Number)
- {
- if (!Number || Number > sessionservice->GetExceptions().size())
- return;
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Current Session Limit Exception list:"));
- source.Reply(_("Num Limit Host"));
- }
-
- DoList(source, Number - 1);
- }
-
- static void DoList(CommandSource &source, unsigned index)
- {
- if (index >= sessionservice->GetExceptions().size())
- return;
-
- source.Reply(_("%3d %4d %s"), index + 1, sessionservice->GetExceptions()[index]->limit, sessionservice->GetExceptions()[index]->mask.c_str());
- }
-};
-
-class ExceptionViewCallback : public ExceptionListCallback
-{
- public:
- ExceptionViewCallback(CommandSource &_source, const Anope::string &numlist) : ExceptionListCallback(_source, numlist)
- {
- }
-
- void HandleNumber(unsigned Number)
- {
- if (!Number || Number > sessionservice->GetExceptions().size())
- return;
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Current Session Limit Exception list:"));
- }
-
- DoList(source, Number - 1);
- }
-
- static void DoList(CommandSource &source, unsigned index)
- {
- if (index >= sessionservice->GetExceptions().size())
- return;
-
- Anope::string expirebuf = expire_left(source.u->Account(), sessionservice->GetExceptions()[index]->expires);
-
- source.Reply(_("%3d. %s (by %s on %s; %s)\n " " Limit: %-4d - %s"), index + 1, sessionservice->GetExceptions()[index]->mask.c_str(), !sessionservice->GetExceptions()[index]->who.empty() ? sessionservice->GetExceptions()[index]->who.c_str() : "<unknown>", do_strftime((sessionservice->GetExceptions()[index]->time ? sessionservice->GetExceptions()[index]->time : Anope::CurTime)).c_str(), expirebuf.c_str(), sessionservice->GetExceptions()[index]->limit, sessionservice->GetExceptions()[index]->reason.c_str());
- }
-};
-
-class CommandOSSession : public Command
-{
- private:
- void DoList(CommandSource &source, const std::vector<Anope::string> &params)
- {
- Anope::string param = params[1];
-
- unsigned mincount = 0;
- try
- {
- mincount = convertTo<unsigned>(param);
- }
- catch (const ConvertException &) { }
-
- if (mincount <= 1)
- source.Reply(_("Invalid threshold value. It must be a valid integer greater than 1."));
- else
- {
- source.Reply(_("Hosts with at least \002%d\002 sessions:"), mincount);
- source.Reply(_("Sessions Host"));
-
- for (SessionService::SessionMap::iterator it = sessionservice->GetSessions().begin(), it_end = sessionservice->GetSessions().end(); it != it_end; ++it)
- {
- Session *session = it->second;
-
- if (session->count >= mincount)
- source.Reply(_("%6d %s"), session->count, session->host.c_str());
- }
- }
-
- return;
- }
-
- void DoView(CommandSource &source, const std::vector<Anope::string> &params)
- {
- Anope::string param = params[1];
- Session *session = sessionservice->FindSession(param);
-
- if (!session)
- source.Reply(_("\002%s\002 not found on session list."), param.c_str());
- else
- {
- Exception *exception = sessionservice->FindException(param);
- source.Reply(_("The host \002%s\002 currently has \002%d\002 sessions with a limit of \002%d\002."), param.c_str(), session->count, exception ? exception-> limit : Config->DefSessionLimit);
- }
-
- return;
- }
- public:
- CommandOSSession(Module *creator) : Command(creator, "operserv/session", 2, 2)
- {
- this->SetDesc(_("View the list of host sessions"));
- this->SetSyntax(_("LIST \037threshold\037"));
- this->SetSyntax(_("VIEW \037host\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &cmd = params[0];
-
- if (!Config->LimitSessions)
- {
- source.Reply(_("Session limiting is disabled."));
- return;
- }
-
- if (cmd.equals_ci("LIST"))
- return this->DoList(source, params);
- else if (cmd.equals_ci("VIEW"))
- return this->DoView(source, params);
- else
- this->OnSyntaxError(source, "");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows Services Operators to view the session list.\n"
- "\002SESSION LIST\002 lists hosts with at least \037threshold\037 sessions.\n"
- "The threshold must be a number greater than 1. This is to \n"
- "prevent accidental listing of the large number of single \n"
- "session hosts.\n"
- "\002SESSION VIEW\002 displays detailed information about a specific\n"
- "host - including the current session count and session limit.\n"
- "The \037host\037 value may not include wildcards.\n"
- "See the \002EXCEPTION\002 help for more information about session\n"
- "limiting and how to set session limits specific to certain\n"
- "hosts and groups thereof."));
- return true;
- }
-};
-
-class CommandOSException : public Command
-{
- private:
- void DoAdd(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- Anope::string mask, expiry, limitstr;
- unsigned last_param = 3;
-
- mask = params.size() > 1 ? params[1] : "";
- if (!mask.empty() && mask[0] == '+')
- {
- expiry = mask;
- mask = params.size() > 2 ? params[2] : "";
- last_param = 4;
- }
-
- limitstr = params.size() > last_param - 1 ? params[last_param - 1] : "";
-
- if (params.size() <= last_param)
- {
- this->OnSyntaxError(source, "ADD");
- return;
- }
-
- Anope::string reason = params[last_param];
- if (last_param == 3 && params.size() > 4)
- reason += " " + params[4];
- if (reason.empty())
- {
- this->OnSyntaxError(source, "ADD");
- return;
- }
-
- time_t expires = !expiry.empty() ? dotime(expiry) : Config->ExceptionExpiry;
- if (expires < 0)
- {
- source.Reply(BAD_EXPIRY_TIME);
- return;
- }
- else if (expires > 0)
- expires += Anope::CurTime;
-
- int limit = -1;
- try
- {
- limit = convertTo<int>(limitstr);
- }
- catch (const ConvertException &) { }
-
- if (limit < 0 || limit > static_cast<int>(Config->MaxSessionLimit))
- {
- source.Reply(_("Invalid session limit. It must be a valid integer greater than or equal to zero and less than \002%d\002."), Config->MaxSessionLimit);
- return;
- }
- else
- {
- if (mask.find('!') != Anope::string::npos || mask.find('@') != Anope::string::npos)
- {
- source.Reply(_("Invalid hostmask. Only real hostmasks are valid as sessionservice->GetExceptions() are not matched against nicks or usernames."));
- return;
- }
-
- for (std::vector<Exception *>::iterator it = sessionservice->GetExceptions().begin(), it_end = sessionservice->GetExceptions().end(); it != it_end; ++it)
- {
- Exception *e = *it;
- if (e->mask.equals_ci(mask))
- {
- if (e->limit != limit)
- {
- e->limit = limit;
- source.Reply(_("Exception for \002%s\002 has been updated to %d."), mask.c_str(), e->limit);
- }
- else
- source.Reply(_("\002%s\002 already exists on the EXCEPTION list."), mask.c_str());
- }
- }
-
- Exception *exception = new Exception();
- exception->mask = mask;
- exception->limit = limit;
- exception->reason = reason;
- exception->time = Anope::CurTime;
- exception->who = u->nick;
- exception->expires = expires;
-
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnExceptionAdd, OnExceptionAdd(exception));
- if (MOD_RESULT == EVENT_STOP)
- delete exception;
- else
- {
- sessionservice->AddException(exception);
- source.Reply(_("Session limit for \002%s\002 set to \002%d\002."), mask.c_str(), limit);
- if (readonly)
- source.Reply(READ_ONLY_MODE);
- }
- }
-
- return;
- }
-
- void DoDel(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &mask = params.size() > 1 ? params[1] : "";
-
- if (mask.empty())
- {
- this->OnSyntaxError(source, "DEL");
- return;
- }
-
- if (isdigit(mask[0]) && mask.find_first_not_of("1234567890,-") == Anope::string::npos)
- {
- ExceptionDelCallback list(source, mask);
- list.Process();
- }
- else
- {
- unsigned i = 0, end = sessionservice->GetExceptions().size();
- for (; i < end; ++i)
- if (mask.equals_ci(sessionservice->GetExceptions()[i]->mask))
- {
- ExceptionDelCallback::DoDel(source, i);
- source.Reply(_("\002%s\002 deleted from session-limit exception list."), mask.c_str());
- break;
- }
- if (i == end)
- source.Reply(_("\002%s\002 not found on session-limit exception list."), mask.c_str());
- }
-
- if (readonly)
- source.Reply(READ_ONLY_MODE);
-
- return;
- }
-
- void DoMove(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &n1str = params.size() > 1 ? params[1] : ""; /* From position */
- const Anope::string &n2str = params.size() > 2 ? params[2] : ""; /* To position */
- int n1, n2;
-
- if (n2str.empty())
- {
- this->OnSyntaxError(source, "MOVE");
- return;
- }
-
- n1 = n2 = -1;
- try
- {
- n1 = convertTo<int>(n1str);
- n2 = convertTo<int>(n2str);
- }
- catch (const ConvertException &) { }
-
- if (n1 >= 0 && n1 < sessionservice->GetExceptions().size() && n2 >= 0 && n2 < sessionservice->GetExceptions().size() && n1 != n2)
- {
- Exception *temp = sessionservice->GetExceptions()[n1];
- sessionservice->GetExceptions()[n1] = sessionservice->GetExceptions()[n2];
- sessionservice->GetExceptions()[n2] = temp;
-
- source.Reply(_("Exception for \002%s\002 (#%d) moved to position \002%d\002."), sessionservice->GetExceptions()[n1]->mask.c_str(), n1 + 1, n2 + 1);
-
- if (readonly)
- source.Reply(READ_ONLY_MODE);
- }
- else
- this->OnSyntaxError(source, "MOVE");
-
- return;
- }
-
- void DoList(CommandSource &source, const std::vector<Anope::string> &params)
- {
- Anope::string mask = params.size() > 1 ? params[1] : "";
-
- if (!mask.empty() && mask.find_first_not_of("1234567890,-") == Anope::string::npos)
- {
- ExceptionListCallback list(source, mask);
- list.Process();
- }
- else
- {
- bool SentHeader = false;
-
- for (unsigned i = 0, end = sessionservice->GetExceptions().size(); i < end; ++i)
- if (mask.empty() || Anope::Match(sessionservice->GetExceptions()[i]->mask, mask))
- {
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Current Session Limit Exception list:"));
- source.Reply(_("Num Limit Host"));
- }
-
- ExceptionListCallback::DoList(source, i);
- }
-
- if (!SentHeader)
- source.Reply(_("No matching entries on session-limit exception list."));
- }
-
- return;
- }
-
- void DoView(CommandSource &source, const std::vector<Anope::string> &params)
- {
- Anope::string mask = params.size() > 1 ? params[1] : "";
-
- if (!mask.empty() && mask.find_first_not_of("1234567890,-") == Anope::string::npos)
- {
- ExceptionViewCallback list(source, mask);
- list.Process();
- }
- else
- {
- bool SentHeader = false;
-
- for (unsigned i = 0, end = sessionservice->GetExceptions().size(); i < end; ++i)
- if (mask.empty() || Anope::Match(sessionservice->GetExceptions()[i]->mask, mask))
- {
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Current Session Limit Exception list:"));
- }
-
- ExceptionViewCallback::DoList(source, i);
- }
-
- if (!SentHeader)
- source.Reply(_("No matching entries on session-limit exception list."));
- }
-
- return;
- }
-
- public:
- CommandOSException(Module *creator) : Command(creator, "operserv/exception", 1, 5)
- {
- this->SetDesc(_("Modify the session-limit exception list"));
- this->SetSyntax(_("ADD [\037+expiry\037] \037mask\037 \037limit\037 \037reason\037"));
- this->SetSyntax(_("DEL {\037mask\037 | \037list\037}"));
- this->SetSyntax(_("MOVE \037num\037 \037position\037"));
- this->SetSyntax(_("LIST [\037mask\037 | \037list\037]"));
- this->SetSyntax(_("VIEW [\037mask\037 | \037list\037]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &cmd = params[0];
-
- if (!Config->LimitSessions)
- {
- source.Reply(_("Session limiting is disabled."));
- return;
- }
-
- if (cmd.equals_ci("ADD"))
- return this->DoAdd(source, params);
- else if (cmd.equals_ci("DEL"))
- return this->DoDel(source, params);
- else if (cmd.equals_ci("MOVE"))
- return this->DoMove(source, params);
- else if (cmd.equals_ci("LIST"))
- return this->DoList(source, params);
- else if (cmd.equals_ci("VIEW"))
- return this->DoView(source, params);
- else
- this->OnSyntaxError(source, "");
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows Services Operators to manipulate the list of hosts that\n"
- "have specific session limits - allowing certain machines, \n"
- "such as shell servers, to carry more than the default number\n"
- "of clients at a time. Once a host reaches its session limit,\n"
- "all clients attempting to connect from that host will be\n"
- "killed. Before the user is killed, they are notified, via a\n"
- "/NOTICE from %s, of a source of help regarding session\n"
- "limiting. The content of this notice is a config setting.\n"),
- Config->OperServ.c_str());
- source.Reply(" ");
- source.Reply(_("\002EXCEPTION ADD\002 adds the given host mask to the exception list.\n"
- "Note that \002nick!user@host\002 and \002user@host\002 masks are invalid!\n"
- "Only real host masks, such as \002box.host.dom\002 and \002*.host.dom\002,\n"
- "are allowed because sessions limiting does not take nick or\n"
- "user names into account. \037limit\037 must be a number greater than\n"
- "or equal to zero. This determines how many sessions this host\n"
- "may carry at a time. A value of zero means the host has an\n"
- "unlimited session limit. See the \002AKILL\002 help for details about\n"
- "the format of the optional \037expiry\037 parameter.\n"
- "\002EXCEPTION DEL\002 removes the given mask from the exception list.\n"
- "\002EXCEPTION MOVE\002 moves exception \037num\037 to \037position\037. The\n"
- "sessionservice->GetExceptions() inbetween will be shifted up or down to fill the gap.\n"
- "\002EXCEPTION LIST\002 and \002EXCEPTION VIEW\002 show all current\n"
- "sessionservice->GetExceptions(); if the optional mask is given, the list is limited\n"
- "to those sessionservice->GetExceptions() matching the mask. The difference is that\n"
- "\002EXCEPTION VIEW\002 is more verbose, displaying the name of the\n"
- "person who added the exception, its session limit, reason, \n"
- "host mask and the expiry date and time.\n"
- " \n"
- "Note that a connecting client will \"use\" the first exception\n"
- "their host matches."));
- return true;
- }
-};
-
-class OSSession : public Module
-{
- MySessionService ss;
- ExpireTimer expiretimer;
- CommandOSSession commandossession;
- CommandOSException commandosexception;
- service_reference<XLineManager> akills;
-
- void AddSession(User *u, bool exempt)
- {
- Session *session = this->ss.FindSession(u->host);
-
- if (session)
- {
- bool kill = false;
- if (Config->DefSessionLimit && session->count >= Config->DefSessionLimit)
- {
- kill = true;
- Exception *exception = this->ss.FindException(u);
- if (exception)
- {
- kill = false;
- if (exception->limit && session->count >= exception->limit)
- kill = true;
- }
- }
-
- /* Previously on IRCds that send a QUIT (InspIRCD) when a user is killed, the session for a host was
- * decremented in do_quit, which caused problems and fixed here
- *
- * Now, we create the user struture before calling this to fix some user tracking issues,
- * so we must increment this here no matter what because it will either be
- * decremented in do_kill or in do_quit - Adam
- */
- ++session->count;
-
- if (kill && !exempt)
- {
- BotInfo *bi = findbot(Config->OperServ);
- if (bi)
- {
- if (!Config->SessionLimitExceeded.empty())
- u->SendMessage(bi, Config->SessionLimitExceeded.c_str(), u->host.c_str());
- if (!Config->SessionLimitDetailsLoc.empty())
- u->SendMessage(bi, "%s", Config->SessionLimitDetailsLoc.c_str());
- }
-
- u->Kill(Config->OperServ, "Session limit exceeded");
-
- ++session->hits;
- if (Config->MaxSessionKill && session->hits >= Config->MaxSessionKill && akills)
- {
- const Anope::string &akillmask = "*@" + u->host;
- const Anope::string &akillreason = "Session limit exceeded for " + u->host;
- akills->Add(akillmask, Config->OperServ, Anope::CurTime + Config->SessionAutoKillExpiry, akillreason);
- if (bi)
- ircdproto->SendGlobops(bi, "Added a temporary AKILL for \2%s\2 due to excessive connections", akillmask.c_str());
- }
- }
- }
- else
- {
- session = new Session();
- session->host = u->host;
- session->count = 1;
- session->hits = 0;
-
- this->ss.AddSession(session);
- }
- }
-
- void DelSession(User *u)
- {
- Session *session = this->ss.FindSession(u->host);
- if (!session)
- {
- if (debug)
- Log() << "session: Tried to delete non-existant session: " << u->host;
- return;
- }
-
- if (session->count > 1)
- {
- --session->count;
- return;
- }
-
- this->ss.DelSession(session);
- delete session;
- }
-
- public:
- OSSession(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- ss(this), commandossession(this), commandosexception(this), akills("xlinemanager/sgline")
- {
- this->SetAuthor("Anope");
-
- Implementation i[] = { I_OnUserConnect, I_OnUserLogoff };
- ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
-
- ModuleManager::RegisterService(&commandossession);
- ModuleManager::RegisterService(&commandosexception);
-
- ModuleManager::RegisterService(&this->ss);
- }
-
- void OnUserConnect(dynamic_reference<User> &user, bool &exempt)
- {
- if (user && Config->LimitSessions)
- this->AddSession(user, exempt);
- }
-
- void OnUserLogoff(User *u)
- {
- if (Config->LimitSessions && (!u->server || !u->server->IsULined()))
- this->DelSession(u);
- }
-};
-
-MODULE_INIT(OSSession)
diff --git a/modules/core/os_session.h b/modules/core/os_session.h
deleted file mode 100644
index faab37934..000000000
--- a/modules/core/os_session.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef OS_SESSION_H
-#define OS_SESSION_H
-
-class SessionService : public Service
-{
- public:
- typedef Anope::map<Session *> SessionMap;
- typedef std::vector<Exception *> ExceptionVector;
-
- SessionService(Module *m) : Service(m, "session") { }
-
- virtual void AddException(Exception *e) = 0;
-
- virtual void DelException(Exception *e) = 0;
-
- virtual Exception *FindException(User *u) = 0;
-
- virtual Exception *FindException(const Anope::string &host) = 0;
-
- virtual ExceptionVector &GetExceptions() = 0;
-
- virtual void AddSession(Session *s) = 0;
-
- virtual void DelSession(Session *s) = 0;
-
- virtual Session *FindSession(const Anope::string &mask) = 0;
-
- virtual SessionMap &GetSessions() = 0;
-};
-
-#endif
-
diff --git a/modules/core/os_set.cpp b/modules/core/os_set.cpp
deleted file mode 100644
index 2a50f851c..000000000
--- a/modules/core/os_set.cpp
+++ /dev/null
@@ -1,261 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandOSSet : public Command
-{
- private:
- void DoList(CommandSource &source)
- {
- Log(LOG_ADMIN, source.u, this);
-
- Anope::string index;
-
- index = readonly ? _("%s is enabled") : _("%s is disabled");
- source.Reply(index.c_str(), "READONLY");
- index = debug ? _("%s is enabled") : _("%s is disabled");
- source.Reply(index.c_str(), "DEBUG");
- index = noexpire ? _("%s is enabled") : _("%s is disabled");
- source.Reply(index.c_str(), "NOEXPIRE");
-
- return;
- }
-
- void DoSetReadOnly(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &setting = params.size() > 1 ? params[1] : "";
-
- if (setting.empty())
- {
- this->OnSyntaxError(source, "READONLY");
- return;
- }
-
- if (setting.equals_ci("ON"))
- {
- readonly = true;
- Log(LOG_ADMIN, u, this) << "READONLY ON";
- source.Reply(_("Services are now in \002read-only\002 mode."));
- }
- else if (setting.equals_ci("OFF"))
- {
- readonly = false;
- Log(LOG_ADMIN, u, this) << "READONLY OFF";
- source.Reply(_("Services are now in \002read-write\002 mode."));
- }
- else
- source.Reply(_("Setting for READONLY must be \002on\002 or \002off\002."));
-
- return;
- }
-
- void DoSetSuperAdmin(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &setting = params.size() > 1 ? params[1] : "";
-
- if (setting.empty())
- {
- this->OnSyntaxError(source, "SUPERADMIN");
- return;
- }
-
- /**
- * Allow the user to turn super admin on/off
- *
- * Rob
- **/
- if (!Config->SuperAdmin)
- source.Reply(_("SuperAdmin setting not enabled in services.conf"));
- else if (setting.equals_ci("ON"))
- {
- u->isSuperAdmin = 1;
- source.Reply(_("You are now a SuperAdmin"));
- Log(LOG_ADMIN, u, this) << "SUPERADMIN ON";
- ircdproto->SendGlobops(source.owner, _("%s is now a Super-Admin"), u->nick.c_str());
- }
- else if (setting.equals_ci("OFF"))
- {
- u->isSuperAdmin = 0;
- source.Reply(_("You are no longer a SuperAdmin"));
- Log(LOG_ADMIN, u, this) << "SUPERADMIN OFF";
- ircdproto->SendGlobops(source.owner, _("%s is no longer a Super-Admin"), u->nick.c_str());
- }
- else
- source.Reply(_("Setting for SuperAdmin must be \002on\002 or \002off\002 (must be enabled in services.conf)"));
-
- return;
- }
-
- void DoSetDebug(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &setting = params.size() > 1 ? params[1] : "";
-
- if (setting.empty())
- {
- this->OnSyntaxError(source, "DEBUG");
- return;
- }
-
- if (setting.equals_ci("ON"))
- {
- debug = 1;
- Log(LOG_ADMIN, u, this) << "DEBUG ON";
- source.Reply(_("Services are now in debug mode."));
- }
- else if (setting.equals_ci("OFF") || (setting[0] == '0' && setting.is_number_only() && !convertTo<int>(setting)))
- {
- Log(LOG_ADMIN, u, this) << "DEBUG OFF";
- debug = 0;
- source.Reply(_("Services are now in non-debug mode."));
- }
- else
- {
- try
- {
- debug = convertTo<int>(setting);
- Log(LOG_ADMIN, u, this) << "DEBUG " << debug;
- source.Reply(_("Services are now in debug mode (level %d)."), debug);
- return;
- }
- catch (const ConvertException &) { }
-
- source.Reply(_("Setting for DEBUG must be \002ON\002, \002OFF\002, or a positive number."));
- }
-
- return;
- }
-
- void DoSetNoExpire(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &setting = params.size() > 1 ? params[1] : "";
-
- if (setting.empty())
- {
- this->OnSyntaxError(source, "NOEXPIRE");
- return;
- }
-
- if (setting.equals_ci("ON"))
- {
- noexpire = true;
- Log(LOG_ADMIN, u, this) << "NOEXPIRE ON";
- source.Reply(_("Services are now in \002no expire\002 mode."));
- }
- else if (setting.equals_ci("OFF"))
- {
- noexpire = false;
- Log(LOG_ADMIN, u, this) << "NOEXPIRE OFF";
- source.Reply(_("Services are now in \002expire\002 mode."));
- }
- else
- source.Reply(_("Setting for NOEXPIRE must be \002on\002 or \002off\002."));
-
- return;
- }
- public:
- CommandOSSet(Module *creator) : Command(creator, "operserv/set", 1, 2)
- {
- this->SetDesc(_("Set various global Services options"));
- this->SetSyntax(_("\037option\037 \037setting\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &option = params[0];
-
- if (option.equals_ci("LIST"))
- return this->DoList(source);
- else if (option.equals_ci("READONLY"))
- return this->DoSetReadOnly(source, params);
- else if (option.equals_ci("SUPERADMIN"))
- return this->DoSetSuperAdmin(source, params);
- else if (option.equals_ci("DEBUG"))
- return this->DoSetDebug(source, params);
- else if (option.equals_ci("NOEXPIRE"))
- return this->DoSetNoExpire(source, params);
- else
- source.Reply(_("Unknown option \002%s\002."), option.c_str());
-
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- if (subcommand.empty())
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Sets various global Services options. Option names\n"
- "currently defined are:\n"
- " READONLY Set read-only or read-write mode\n"
- " DEBUG Activate or deactivate debug mode\n"
- " NOEXPIRE Activate or deactivate no expire mode\n"
- " SUPERADMIN Activate or deactivate super-admin mode\n"
- " LIST List the options"));
- }
- else if (subcommand.equals_ci("LIST"))
- source.Reply(_("Syntax: \002LIST\n"
- "Display the various %s settings"), Config->OperServ.c_str());
- else if (subcommand.equals_ci("READONLY"))
- source.Reply(_("Syntax: \002READONLY {ON | OFF}\002\n"
- " \n"
- "Sets read-only mode on or off. In read-only mode, normal\n"
- "users will not be allowed to modify any Services data,\n"
- "including channel and nickname access lists, etc. IRCops\n"
- "with sufficient Services privileges will be able to modify\n"
- "Services' AKILL list and drop or forbid nicknames and\n"
- "channels, but any such changes will not be saved unless\n"
- "read-only mode is deactivated before Services is terminated\n"
- "or restarted.\n"
- " \n"
- "This option is equivalent to the command-line option\n"
- "\002-readonly\002."));
- else if (subcommand.equals_ci("NOEXPIRE"))
- source.Reply(_("Syntax: \002NOEXPIRE {ON | OFF}\002\n"
- "Sets no expire mode on or off. In no expire mode, nicks,\n"
- "channels, akills and exceptions won't expire until the\n"
- "option is unset.\n"
- "This option is equivalent to the command-line option\n"
- "\002-noexpire\002."));
- else if (subcommand.equals_ci("SUPERADMIN"))
- source.Reply(_("Syntax: \002SUPERADMIN {ON | OFF}\002\n"
- "Setting this will grant you extra privileges such as the\n"
- "ability to be \"founder\" on all channel's etc...\n"
- "This option is \002not\002 persistent, and should only be used when\n"
- "needed, and set back to OFF when no longer needed."));
- else
- return false;
- return true;
- }
-};
-
-class OSSet : public Module
-{
- CommandOSSet commandosset;
-
- public:
- OSSet(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandosset(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandosset);
- }
-};
-
-MODULE_INIT(OSSet)
diff --git a/modules/core/os_shutdown.cpp b/modules/core/os_shutdown.cpp
deleted file mode 100644
index bc3a19353..000000000
--- a/modules/core/os_shutdown.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandOSQuit : public Command
-{
- public:
- CommandOSQuit(Module *creator) : Command(creator, "operserv/quit", 0, 0)
- {
- this->SetDesc(_("Terminate Services WITHOUT saving"));
- this->SetSyntax("");
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- quitmsg = "QUIT command received from " + u->nick;
- quitting = true;
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Causes Services to do an immediate shutdown; databases are\n"
- "\002not\002 saved. This command should not be used unless\n"
- "damage to the in-memory copies of the databases is feared\n"
- "and they should not be saved."));
- return true;
- }
-};
-
-class CommandOSRestart : public Command
-{
- public:
- CommandOSRestart(Module *creator) : Command(creator, "operserv/restart", 0, 0)
- {
- this->SetDesc(_("Save databases and restart Services"));
- this->SetSyntax("");
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- quitmsg = "RESTART command received from " + u->nick;
- save_databases();
- quitting = restarting = true;
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(_("Causes Services to save all databases and then restart\n"
- "(i.e. exit and immediately re-run the executable)."));
- return true;
- }
-};
-
-class CommandOSShutdown : public Command
-{
- public:
- CommandOSShutdown(Module *creator) : Command(creator, "operserv/shutdown", 0, 0)
- {
- this->SetDesc(_("Terminate services with save"));
- this->SetSyntax("");
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- quitmsg = source.command + " command received from " + u->nick;
- save_databases();
- quitting = true;
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Causes Services to save all databases and then shut down."));
- return true;
- }
-};
-
-class OSShutdown : public Module
-{
- CommandOSQuit commandosquit;
- CommandOSRestart commandosrestart;
- CommandOSShutdown commandosshutdown;
-
- public:
- OSShutdown(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandosquit(this), commandosrestart(this), commandosshutdown(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandosquit);
- ModuleManager::RegisterService(&commandosrestart);
- ModuleManager::RegisterService(&commandosshutdown);
- }
-};
-
-MODULE_INIT(OSShutdown)
diff --git a/modules/core/os_stats.cpp b/modules/core/os_stats.cpp
deleted file mode 100644
index 2c20395d0..000000000
--- a/modules/core/os_stats.cpp
+++ /dev/null
@@ -1,224 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-/**
- * Count servers connected to server s
- * @param s The server to start counting from
- * @return Amount of servers connected to server s
- **/
-static int stats_count_servers(Server *s)
-{
- if (!s)
- return 0;
-
- int count = 1;
-
- if (!s->GetLinks().empty())
- for (unsigned i = 0, j = s->GetLinks().size(); i < j; ++i)
- count += stats_count_servers(s->GetLinks()[i]);
-
- return count;
-}
-
-class CommandOSStats : public Command
-{
- service_reference<XLineManager> akills, snlines, sqlines, szlines;
- private:
- void DoStatsAkill(CommandSource &source)
- {
- int timeout;
- if (akills)
- {
- /* AKILLs */
- source.Reply(_("Current number of AKILLs: \002%d\002"), akills->GetCount());
- timeout = Config->AutokillExpiry + 59;
- if (timeout >= 172800)
- source.Reply(_("Default AKILL expiry time: \002%d days\002"), timeout / 86400);
- else if (timeout >= 86400)
- source.Reply(_("Default AKILL expiry time: \0021 day\002"));
- else if (timeout >= 7200)
- source.Reply(_("Default AKILL expiry time: \002%d hours\002"), timeout / 3600);
- else if (timeout >= 3600)
- source.Reply(_("Default AKILL expiry time: \0021 hour\002"));
- else if (timeout >= 120)
- source.Reply(_("Default AKILL expiry time: \002%d minutes\002"), timeout / 60);
- else if (timeout >= 60)
- source.Reply(_("Default AKILL expiry time: \0021 minute\002"));
- else
- source.Reply(_("Default AKILL expiry time: \002No expiration\002"));
- }
- if (ircd->snline && snlines)
- {
- /* SNLINEs */
- source.Reply(_("Current number of SNLINEs: \002%d\002"), snlines->GetCount());
- timeout = Config->SNLineExpiry + 59;
- if (timeout >= 172800)
- source.Reply(_("Default SNLINE expiry time: \002%d days\002"), timeout / 86400);
- else if (timeout >= 86400)
- source.Reply(_("Default SNLINE expiry time: \0021 day\002"));
- else if (timeout >= 7200)
- source.Reply(_("Default SNLINE expiry time: \002%d hours\002"), timeout / 3600);
- else if (timeout >= 3600)
- source.Reply(_("Default SNLINE expiry time: \0021 hour\002"));
- else if (timeout >= 120)
- source.Reply(_("Default SNLINE expiry time: \002%d minutes\002"), timeout / 60);
- else if (timeout >= 60)
- source.Reply(_("Default SNLINE expiry time: \0021 minute\002"));
- else
- source.Reply(_("Default SNLINE expiry time: \002No expiration\002"));
- }
- if (ircd->sqline && sqlines)
- {
- /* SQLINEs */
- source.Reply(_("Current number of SQLINEs: \002%d\002"), sqlines->GetCount());
- timeout = Config->SQLineExpiry + 59;
- if (timeout >= 172800)
- source.Reply(_("Default SQLINE expiry time: \002%d days\002"), timeout / 86400);
- else if (timeout >= 86400)
- source.Reply(_("Default SQLINE expiry time: \0021 day\002"));
- else if (timeout >= 7200)
- source.Reply(_("Default SQLINE expiry time: \002%d hours\002"), timeout / 3600);
- else if (timeout >= 3600)
- source.Reply(_("Default SQLINE expiry time: \0021 hour\002"));
- else if (timeout >= 120)
- source.Reply(_("Default SQLINE expiry time: \002%d minutes\002"), timeout / 60);
- else if (timeout >= 60)
- source.Reply(_("Default SQLINE expiry time: \0021 minute\002"));
- else
- source.Reply(_("Default SQLINE expiry time: \002No expiration\002"));
- }
- if (ircd->szline && szlines)
- {
- /* SZLINEs */
- source.Reply(_("Current number of SZLINEs: \002%d\002"), szlines->GetCount());
- timeout = Config->SZLineExpiry + 59;
- if (timeout >= 172800)
- source.Reply(_("Default SZLINE expiry time: \002%d days\002"), timeout / 86400);
- else if (timeout >= 86400)
- source.Reply(_("Default SZLINE expiry time: \0021 day\002"));
- else if (timeout >= 7200)
- source.Reply(_("Default SZLINE expiry time: \002%d hours\002"), timeout / 3600);
- else if (timeout >= 3600)
- source.Reply(_("Default SZLINE expiry time: \0021 hour\002"));
- else if (timeout >= 120)
- source.Reply(_("Default SZLINE expiry time: \002%d minutes\002"), timeout / 60);
- else if (timeout >= 60)
- source.Reply(_("Default SZLINE expiry time: \0021 minute\002"));
- else
- source.Reply(_("Default SZLINE expiry time: \002No expiration\002"));
- }
- return;
- }
-
- void DoStatsReset(CommandSource &source)
- {
- maxusercnt = usercnt;
- source.Reply(_("Statistics reset."));
- return;
- }
-
- void DoStatsUptime(CommandSource &source)
- {
- time_t uptime = Anope::CurTime - start_time;
- source.Reply(_("Current users: \002%d\002 (\002%d\002 ops)"), usercnt, opcnt);
- source.Reply(_("Maximum users: \002%d\002 (%s)"), maxusercnt, do_strftime(maxusertime).c_str());
- source.Reply(_("Services up %s"), duration(uptime).c_str());
-
- return;
- }
-
- void DoStatsUplink(CommandSource &source)
- {
- Anope::string buf;
-
- for (unsigned j = 0; !Capab_Info[j].Token.empty(); ++j)
- if (Capab.HasFlag(Capab_Info[j].Flag))
- buf += " " + Capab_Info[j].Token;
-
- if (!buf.empty())
- buf.erase(buf.begin());
-
- source.Reply(_("Uplink server: %s"), Me->GetLinks().front()->GetName().c_str());
- source.Reply(_("Uplink capab: %s"), buf.c_str());
- source.Reply(_("Servers found: %d"), stats_count_servers(Me->GetLinks().front()));
- return;
- }
-
- public:
- CommandOSStats(Module *creator) : Command(creator, "operserv/stats", 0, 1),
- akills("xlinemanager/sgline"), snlines("xlinemanager/snline"), sqlines("xlinemanager/sqline"), szlines("xlinemanager/szline")
- {
- this->SetDesc(_("Show status of Services and network"));
- this->SetSyntax(_("[AKILL | ALL | RESET | UPLINK]"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- Anope::string extra = !params.empty() ? params[0] : "";
-
- if (extra.equals_ci("RESET"))
- return this->DoStatsReset(source);
-
- if (extra.equals_ci("ALL") || extra.equals_ci("AKILL"))
- this->DoStatsAkill(source);
-
- if (extra.empty() || extra.equals_ci("ALL") || extra.equals_ci("UPTIME"))
- this->DoStatsUptime(source);
-
- if (extra.equals_ci("ALL") || extra.equals_ci("UPLINK"))
- this->DoStatsUplink(source);
-
- if (!extra.empty() && !extra.equals_ci("ALL") && !extra.equals_ci("AKILL") && !extra.equals_ci("UPLINK"))
- source.Reply(_("Unknown STATS option \002%s\002."), extra.c_str());
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Without any option, shows the current number of users online,\n"
- "and the highest number of users online since Services was\n"
- "started, and the length of time Services has been running.\n"
- " \n"
- "With the \002AKILL\002 option, displays the current size of the\n"
- "AKILL list and the current default expiry time.\n"
- " \n"
- "The \002RESET\002 option currently resets the maximum user count\n"
- "to the number of users currently present on the network.\n"
- " \n"
- "The \002UPLINK\002 option displays information about the current\n"
- "server Anope uses as an uplink to the network.\n"
- " \n"
- "The \002ALL\002 displays the user and uptime statistics, and\n"
- "everything you'd see with the \002UPLINK\002 option."));
- return true;
- }
-};
-
-class OSStats : public Module
-{
- CommandOSStats commandosstats;
-
- public:
- OSStats(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandosstats(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandosstats);
- }
-};
-
-MODULE_INIT(OSStats)
diff --git a/modules/core/os_svsnick.cpp b/modules/core/os_svsnick.cpp
deleted file mode 100644
index dc7c77a6c..000000000
--- a/modules/core/os_svsnick.cpp
+++ /dev/null
@@ -1,92 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandOSSVSNick : public Command
-{
- public:
- CommandOSSVSNick(Module *creator) : Command(creator, "operserv/svsnick", 2, 2)
- {
- this->SetDesc(_("Forcefully change a user's nickname"));
- this->SetSyntax(_("\037nick\037 \037newnick\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
- const Anope::string &nick = params[0];
- Anope::string newnick = params[1];
- User *u2;
-
- /* Truncate long nicknames to Config->NickLen characters */
- if (newnick.length() > Config->NickLen)
- {
- source.Reply(_("Nick \002%s\002 was truncated to %d characters."), newnick.c_str(), Config->NickLen, newnick.c_str());
- newnick = params[1].substr(0, Config->NickLen);
- }
-
- /* Check for valid characters */
- if (newnick[0] == '-' || isdigit(newnick[0]))
- {
- source.Reply(_("Nick \002%s\002 is an illegal nickname and cannot be used."), newnick.c_str());
- return;
- }
- for (unsigned i = 0, end = newnick.length(); i < end; ++i)
- if (!isvalidnick(newnick[i]))
- {
- source.Reply(_("Nick \002%s\002 is an illegal nickname and cannot be used."), newnick.c_str());
- return;
- }
-
- /* Check for a nick in use or a forbidden/suspended nick */
- if (!(u2 = finduser(nick)))
- source.Reply(NICK_X_NOT_IN_USE, nick.c_str());
- else if (finduser(newnick))
- source.Reply(_("Nick \002%s\002 is currently in use."), newnick.c_str());
- else
- {
- source.Reply(_("The nick \002%s\002 is now being changed to \002%s\002."), nick.c_str(), newnick.c_str());
- ircdproto->SendGlobops(source.owner, "%s used SVSNICK to change %s to %s", u->nick.c_str(), nick.c_str(), newnick.c_str());
- ircdproto->SendForceNickChange(u2, newnick, Anope::CurTime);
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Forcefully changes a user's nickname from nick to newnick."));
- return true;
- }
-};
-
-class OSSVSNick : public Module
-{
- CommandOSSVSNick commandossvsnick;
-
- public:
- OSSVSNick(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandossvsnick(this)
- {
- this->SetAuthor("Anope");
-
- if (!ircd || !ircd->svsnick)
- throw ModuleException("Your IRCd does not support SVSNICK");
-
- ModuleManager::RegisterService(&commandossvsnick);
- }
-};
-
-MODULE_INIT(OSSVSNick)
diff --git a/modules/core/os_sxline.cpp b/modules/core/os_sxline.cpp
deleted file mode 100644
index f949cb7d2..000000000
--- a/modules/core/os_sxline.cpp
+++ /dev/null
@@ -1,807 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class SXLineDelCallback : public NumberList
-{
- XLineManager *xlm;
- Command *command;
- CommandSource &source;
- unsigned Deleted;
- public:
- SXLineDelCallback(XLineManager *x, Command *c, CommandSource &_source, const Anope::string &numlist) : NumberList(numlist, true), xlm(x), command(c), source(_source), Deleted(0)
- {
- }
-
- ~SXLineDelCallback()
- {
- if (!Deleted)
- source.Reply(_("No matching entries on the %s list."), this->command->name.c_str());
- else if (Deleted == 1)
- source.Reply(_("Deleted 1 entry from the %s list."), this->command->name.c_str());
- else
- source.Reply(_("Deleted %d entries from the %s list."), Deleted, this->command->name.c_str());
- }
-
- void HandleNumber(unsigned Number)
- {
- if (!Number)
- return;
-
- XLine *x = this->xlm->GetEntry(Number - 1);
-
- if (!x)
- return;
-
- ++Deleted;
- DoDel(this->xlm, source, x);
- }
-
- static void DoDel(XLineManager *xlm, CommandSource &source, XLine *x)
- {
- xlm->DelXLine(x);
- }
-};
-
-class SXLineListCallback : public NumberList
-{
- protected:
- XLineManager *xlm;
- Command *command;
- CommandSource &source;
- bool SentHeader;
- public:
- SXLineListCallback(XLineManager *x, Command *c, CommandSource &_source, const Anope::string &numlist) : NumberList(numlist, false), xlm(x), command(c), source(_source), SentHeader(false)
- {
- }
-
- ~SXLineListCallback()
- {
- if (!SentHeader)
- source.Reply(_("No matching entries on the %s list."), this->command->name.c_str());
- }
-
- virtual void HandleNumber(unsigned Number)
- {
- if (!Number)
- return;
-
- XLine *x = this->xlm->GetEntry(Number - 1);
-
- if (!x)
- return;
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Current %s list:\n Num Mask Reason"), this->command->name.c_str());
- }
-
- DoList(source, x, Number - 1);
- }
-
- static void DoList(CommandSource &source, XLine *x, unsigned Number)
- {
- source.Reply(OPER_LIST_FORMAT, Number + 1, x->Mask.c_str(), x->Reason.c_str());
- }
-};
-
-class SXLineViewCallback : public SXLineListCallback
-{
- public:
- SXLineViewCallback(XLineManager *x, Command *c, CommandSource &_source, const Anope::string &numlist) : SXLineListCallback(x, c, _source, numlist)
- {
- }
-
- void HandleNumber(unsigned Number)
- {
- if (!Number)
- return;
-
- XLine *x = this->xlm->GetEntry(Number - 1);
-
- if (!x)
- return;
-
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Current %s list:"), this->command->name.c_str());
- }
-
- DoList(source, x, Number - 1);
- }
-
- static void DoList(CommandSource &source, XLine *x, unsigned Number)
- {
- Anope::string expirebuf = expire_left(source.u->Account(), x->Expires);
- source.Reply(OPER_VIEW_FORMAT, Number + 1, x->Mask.c_str(), x->By.c_str(), do_strftime(x->Created).c_str(), expirebuf.c_str(), x->Reason.c_str());
- }
-};
-
-class CommandOSSXLineBase : public Command
-{
- private:
- virtual XLineManager* xlm() = 0;
-
- virtual void OnAdd(CommandSource &source, const std::vector<Anope::string> &params) = 0;
-
- void OnDel(CommandSource &source, const std::vector<Anope::string> &params)
- {
- User *u = source.u;
-
- if (!this->xlm() || this->xlm()->GetList().empty())
- {
- source.Reply(_("%s list is empty."), this->name.c_str());
- return;
- }
-
- const Anope::string &mask = params.size() > 1 ? params[1] : "";
-
- if (mask.empty())
- {
- this->OnSyntaxError(source, "DEL");
- return;
- }
-
- if (isdigit(mask[0]) && mask.find_first_not_of("1234567890,-") == Anope::string::npos)
- {
- SXLineDelCallback list(this->xlm(), this, source, mask);
- list.Process();
- }
- else
- {
- XLine *x = this->xlm()->HasEntry(mask);
-
- if (!x)
- {
- source.Reply(_("\002%s\002 not found on the %s list."), mask.c_str(), this->name.c_str());
- return;
- }
-
- FOREACH_MOD(I_OnDelXLine, OnDelXLine(u, x, this->xlm()));
-
- SXLineDelCallback::DoDel(this->xlm(), source, x);
- source.Reply(_("\002%s\002 deleted from the %s list."), mask.c_str(), this->name.c_str());
- }
-
- if (readonly)
- source.Reply(READ_ONLY_MODE);
-
- return;
- }
-
- void OnList(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!this->xlm() || this->xlm()->GetList().empty())
- {
- source.Reply(_("%s list is empty."), this->name.c_str());
- return;
- }
-
- const Anope::string &mask = params.size() > 1 ? params[1] : "";
-
- if (!mask.empty() && isdigit(mask[0]) && mask.find_first_not_of("1234567890,-") == Anope::string::npos)
- {
- SXLineListCallback list(this->xlm(), this, source, mask);
- list.Process();
- }
- else
- {
- bool SentHeader = false;
-
- for (unsigned i = 0, end = this->xlm()->GetCount(); i < end; ++i)
- {
- XLine *x = this->xlm()->GetEntry(i);
-
- if (mask.empty() || mask.equals_ci(x->Mask) || Anope::Match(x->Mask, mask))
- {
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Current %s list:\n Num Mask Reason"), this->name.c_str());
- }
-
- SXLineListCallback::DoList(source, x, i);
- }
- }
-
- if (!SentHeader)
- source.Reply(_("No matching entries on the %s list."), this->name.c_str());
- else
- source.Reply(END_OF_ANY_LIST, this->name.c_str());
- }
-
- return;
- }
-
- void OnView(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!this->xlm () || this->xlm()->GetList().empty())
- {
- source.Reply(_("%s list is empty."), this->name.c_str());
- return;
- }
-
- const Anope::string &mask = params.size() > 1 ? params[1] : "";
-
- if (!mask.empty() && isdigit(mask[0]) && mask.find_first_not_of("1234567890,-") == Anope::string::npos)
- {
- SXLineViewCallback list(this->xlm(), this, source, mask);
- list.Process();
- }
- else
- {
- bool SentHeader = false;
-
- for (unsigned i = 0, end = this->xlm()->GetCount(); i < end; ++i)
- {
- XLine *x = this->xlm()->GetEntry(i);
-
- if (mask.empty() || mask.equals_ci(x->Mask) || Anope::Match(x->Mask, mask))
- {
- if (!SentHeader)
- {
- SentHeader = true;
- source.Reply(_("Current %s list:"), this->name.c_str());
- }
-
- SXLineViewCallback::DoList(source, x, i);
- }
- }
-
- if (!SentHeader)
- source.Reply(_("No matching entries on the %s list."), this->name.c_str());
- }
-
- return;
- }
-
- void OnClear(CommandSource &source)
- {
- User *u = source.u;
- FOREACH_MOD(I_OnDelXLine, OnDelXLine(u, NULL, this->xlm()));
- this->xlm()->Clear();
- source.Reply(_("The %s list has been cleared."), this->name.c_str());
-
- return;
- }
- public:
- CommandOSSXLineBase(Module *creator, const Anope::string &cmd) : Command(creator, cmd, 1, 3)
- {
- this->SetDesc(Anope::printf(_("Manipulate the %s list"), cmd.c_str()));
- this->SetSyntax(_("ADD [+\037expiry\037] \037mask\037:\037reason\037"));
- this->SetSyntax(_("DEL {\037mask\037 | \037entry-num\037 | \037list\037}"));
- this->SetSyntax(_("LIST [\037mask\037 | \037list\037]"));
- this->SetSyntax(_("VIEW [\037mask\037 | \037list\037]"));
- this->SetSyntax(_("CLEAR"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- const Anope::string &cmd = params[0];
-
- if (cmd.equals_ci("ADD"))
- return this->OnAdd(source, params);
- else if (cmd.equals_ci("DEL"))
- return this->OnDel(source, params);
- else if (cmd.equals_ci("LIST"))
- return this->OnList(source, params);
- else if (cmd.equals_ci("VIEW"))
- return this->OnView(source, params);
- else if (cmd.equals_ci("CLEAR"))
- return this->OnClear(source);
- else
- this->OnSyntaxError(source, "");
-
- return;
- }
-
- virtual bool OnHelp(CommandSource &source, const Anope::string &subcommand) = 0;
-};
-
-class CommandOSSNLine : public CommandOSSXLineBase
-{
- XLineManager *xlm()
- {
- return this->snlines;
- }
-
- void OnAdd(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!this->xlm())
- return;
-
- User *u = source.u;
- unsigned last_param = 2;
- Anope::string param, expiry;
- time_t expires;
-
- param = params.size() > 1 ? params[1] : "";
- if (!param.empty() && param[0] == '+')
- {
- expiry = param;
- param = params.size() > 2 ? params[2] : "";
- last_param = 3;
- }
-
- expires = !expiry.empty() ? dotime(expiry) : Config->SNLineExpiry;
- /* If the expiry given does not contain a final letter, it's in days,
- * said the doc. Ah well.
- */
- if (!expiry.empty() && isdigit(expiry[expiry.length() - 1]))
- expires *= 86400;
- /* Do not allow less than a minute expiry time */
- if (expires && expires < 60)
- {
- source.Reply(BAD_EXPIRY_TIME);
- return;
- }
- else if (expires > 0)
- expires += Anope::CurTime;
-
- if (param.empty())
- {
- this->OnSyntaxError(source, "ADD");
- return;
- }
-
- Anope::string rest = param;
- if (params.size() > last_param)
- rest += " " + params[last_param];
-
- if (rest.find(':') == Anope::string::npos)
- {
- this->OnSyntaxError(source, "ADD");
- return;
- }
-
- sepstream sep(rest, ':');
- Anope::string mask;
- sep.GetToken(mask);
- Anope::string reason = sep.GetRemaining();
-
- if (!mask.empty() && !reason.empty())
- {
- std::pair<int, XLine *> canAdd = this->xlm()->CanAdd(mask, expires);
- if (mask.find_first_not_of("*?") == Anope::string::npos)
- source.Reply(USERHOST_MASK_TOO_WIDE, mask.c_str());
- else if (canAdd.first == 1)
- source.Reply(_("\002%s\002 already exists on the %s list."), canAdd.second->Mask.c_str(), this->name.c_str());
- else if (canAdd.first == 2)
- source.Reply(_("Expiry time of \002%s\002 changed."), canAdd.second->Mask.c_str());
- else if (canAdd.first == 3)
- source.Reply(_("\002%s\002 is already covered by %s."), mask.c_str(), canAdd.second->Mask.c_str());
- else
- {
- /* Clean up the last character of the mask if it is a space
- * See bug #761
- */
- unsigned masklen = mask.length();
- if (mask[masklen - 1] == ' ')
- mask.erase(masklen - 1);
- unsigned int affected = 0;
- for (Anope::insensitive_map<User *>::iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it)
- if (Anope::Match(it->second->realname, mask))
- ++affected;
- float percent = static_cast<float>(affected) / static_cast<float>(UserListByNick.size()) * 100.0;
-
- if (percent > 95)
- {
- source.Reply(USERHOST_MASK_TOO_WIDE, mask.c_str());
- Log(LOG_ADMIN, u, this) << "tried to " << this->name << " " << percent << "% of the network (" << affected << " users)";
- return;
- }
-
- XLine *x = this->xlm()->Add(mask, u->nick, expires, reason);
-
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnAddXLine, OnAddXLine(u, x, this->xlm()));
- if (MOD_RESULT == EVENT_STOP)
- {
- delete x;
- return;
- }
-
- source.Reply(_("\002%s\002 added to the %s list."), mask.c_str(), this->name.c_str());
- Log(LOG_ADMIN, u, this) << "on " << mask << " (" << reason << ") expires in " << (expires ? duration(expires - Anope::CurTime) : "never") << " [affects " << affected << " user(s) (" << percent << "%)]";
-
- if (readonly)
- source.Reply(READ_ONLY_MODE);
- }
-
- }
- else
- this->OnSyntaxError(source, "ADD");
-
- return;
- }
-
- service_reference<XLineManager> snlines;
- public:
- CommandOSSNLine(Module *creator) : CommandOSSXLineBase(creator, "operserv/snline"), snlines("xlinemanager/snline")
- {
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows Services operators to manipulate the SNLINE list. If\n"
- "a user with a realname matching an SNLINE mask attempts to \n"
- "connect, Services will not allow it to pursue his IRC\n"
- "session.\n"));
- source.Reply(_(" \n"
- "\002SNLINE ADD\002 adds the given realname mask to the SNLINE\n"
- "list for the given reason (which \002must\002 be given).\n"
- "\037expiry\037 is specified as an integer followed by one of \037d\037 \n"
- "(days), \037h\037 (hours), or \037m\037 (minutes). Combinations (such as \n"
- "\0371h30m\037) are not permitted. If a unit specifier is not \n"
- "included, the default is days (so \037+30\037 by itself means 30 \n"
- "days). To add an SNLINE which does not expire, use \037+0\037. If the\n"
- "realname mask to be added starts with a \037+\037, an expiry time must\n"
- "be given, even if it is the same as the default. The\n"
- "current SNLINE default expiry time can be found with the\n"
- "\002STATS AKILL\002 command.\n"
- "Note: because the realname mask may contain spaces, the\n"
- "separator between it and the reason is a colon.\n"));
- source.Reply(_(" \n"
- "The \002SNLINE DEL\002 command removes the given mask from the\n"
- "SNLINE list if it is present. If a list of entry numbers is \n"
- "given, those entries are deleted. (See the example for LIST \n"
- "below.)\n"
- " \n"
- "The \002SNLINE LIST\002 command displays the SNLINE list. \n"
- "If a wildcard mask is given, only those entries matching the\n"
- "mask are displayed. If a list of entry numbers is given,\n"
- "only those entries are shown; for example:\n"
- " \002SNLINE LIST 2-5,7-9\002\n"
- " Lists SNLINE entries numbered 2 through 5 and 7 \n"
- " through 9.\n"
- " \n"
- "\002SNLINE VIEW\002 is a more verbose version of \002SNLINE LIST\002, and \n"
- "will show who added an SNLINE, the date it was added, and when \n"
- "it expires, as well as the realname mask and reason.\n"
- " \n"
- "\002SNLINE CLEAR\002 clears all entries of the SNLINE list."));
- return true;
- }
-};
-
-class CommandOSSQLine : public CommandOSSXLineBase
-{
- XLineManager *xlm()
- {
- return this->sqlines;
- }
-
- void OnAdd(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!this->xlm())
- return;
-
- User *u = source.u;
- unsigned last_param = 2;
- Anope::string expiry, mask;
- time_t expires;
-
- mask = params.size() > 1 ? params[1] : "";
- if (!mask.empty() && mask[0] == '+')
- {
- expiry = mask;
- mask = params.size() > 2 ? params[2] : "";
- last_param = 3;
- }
-
- expires = !expiry.empty() ? dotime(expiry) : Config->SQLineExpiry;
- /* If the expiry given does not contain a final letter, it's in days,
- * said the doc. Ah well.
- */
- if (!expiry.empty() && isdigit(expiry[expiry.length() - 1]))
- expires *= 86400;
- /* Do not allow less than a minute expiry time */
- if (expires && expires < 60)
- {
- source.Reply(BAD_EXPIRY_TIME);
- return;
- }
- else if (expires > 0)
- expires += Anope::CurTime;
-
- if (params.size() <= last_param)
- {
- this->OnSyntaxError(source, "ADD");
- return;
- }
-
- Anope::string reason = params[last_param];
- if (last_param == 2 && params.size() > 3)
- reason += " " + params[3];
- if (!mask.empty() && !reason.empty())
- {
- std::pair<int, XLine *> canAdd = this->sqlines->CanAdd(mask, expires);
- if (mask.find_first_not_of("*") == Anope::string::npos)
- source.Reply(USERHOST_MASK_TOO_WIDE, mask.c_str());
- else if (canAdd.first == 1)
- source.Reply(_("\002%s\002 already exists on the SQLINE list."), canAdd.second->Mask.c_str());
- else if (canAdd.first == 2)
- source.Reply(_("Expiry time of \002%s\002 changed."), canAdd.second->Mask.c_str());
- else if (canAdd.first == 3)
- source.Reply(_("\002%s\002 is already covered by %s."), mask.c_str(), canAdd.second->Mask.c_str());
- else
- {
- unsigned int affected = 0;
- for (Anope::insensitive_map<User *>::iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it)
- if (Anope::Match(it->second->nick, mask))
- ++affected;
- float percent = static_cast<float>(affected) / static_cast<float>(UserListByNick.size()) * 100.0;
-
- if (percent > 95)
- {
- source.Reply(USERHOST_MASK_TOO_WIDE, mask.c_str());
- Log(LOG_ADMIN, u, this) << "tried to SQLine " << percent << "% of the network (" << affected << " users)";
- return;
- }
-
- XLine *x = this->sqlines->Add(mask, u->nick, expires, reason);
-
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnAddXLine, OnAddXLine(u, x, this->xlm()));
- if (MOD_RESULT == EVENT_STOP)
- {
- delete x;
- return;
- }
-
- source.Reply(_("\002%s\002 added to the SQLINE list."), mask.c_str());
- Log(LOG_ADMIN, u, this) << "on " << mask << " (" << reason << ") expires in " << (expires ? duration(expires - Anope::CurTime) : "never") << " [affects " << affected << " user(s) (" << percent << "%)]";
-
- if (readonly)
- source.Reply(READ_ONLY_MODE);
- }
-
- }
- else
- this->OnSyntaxError(source, "ADD");
-
- return;
- }
-
- service_reference<XLineManager> sqlines;
- public:
- CommandOSSQLine(Module *creator) : CommandOSSXLineBase(creator, "operserv/sqline"), sqlines("xlinemanager/sqline")
- {
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows Services operators to manipulate the SQLINE list. If\n"
- "a user with a nick matching an SQLINE mask attempts to \n"
- "connect, Services will not allow it to pursue his IRC\n"
- "session.\n"
- "If the first character of the mask is #, services will \n"
- "prevent the use of matching channels (on IRCds that \n"
- "support it).\n"));
- source.Reply(_(" \n"
- "\002SQLINE ADD\002 adds the given (nick's) mask to the SQLINE\n"
- "list for the given reason (which \002must\002 be given).\n"
- "\037expiry\037 is specified as an integer followed by one of \037d\037 \n"
- "(days), \037h\037 (hours), or \037m\037 (minutes). Combinations (such as \n"
- "\0371h30m\037) are not permitted. If a unit specifier is not \n"
- "included, the default is days (so \037+30\037 by itself means 30 \n"
- "days). To add an SQLINE which does not expire, use \037+0\037. \n"
- "If the mask to be added starts with a \037+\037, an expiry time \n"
- "must be given, even if it is the same as the default. The\n"
- "current SQLINE default expiry time can be found with the\n"
- "\002STATS AKILL\002 command.\n"));
- source.Reply(_(" \n"
- "The \002SQLINE DEL\002 command removes the given mask from the\n"
- "SQLINE list if it is present. If a list of entry numbers is \n"
- "given, those entries are deleted. (See the example for LIST \n"
- "below.)\n"
- " \n"
- "The \002SQLINE LIST\002 command displays the SQLINE list. \n"
- "If a wildcard mask is given, only those entries matching the\n"
- "mask are displayed. If a list of entry numbers is given,\n"
- "only those entries are shown; for example:\n"
- " \002SQLINE LIST 2-5,7-9\002\n"
- " Lists SQLINE entries numbered 2 through 5 and 7 \n"
- " through 9.\n"
- " \n"
- "\002SQLINE VIEW\002 is a more verbose version of \002SQLINE LIST\002, and \n"
- "will show who added an SQLINE, the date it was added, and when \n"
- "it expires, as well as the mask and reason.\n"
- " \n"
- "\002SQLINE CLEAR\002 clears all entries of the SQLINE list."));
- return true;
- }
-};
-
-class CommandOSSZLine : public CommandOSSXLineBase
-{
- XLineManager *xlm()
- {
- return this->szlines;
- }
-
- void OnAdd(CommandSource &source, const std::vector<Anope::string> &params)
- {
- if (!this->xlm())
- return;
-
- User *u = source.u;
- unsigned last_param = 2;
- Anope::string expiry, mask;
- time_t expires;
-
- mask = params.size() > 1 ? params[1] : "";
- if (!mask.empty() && mask[0] == '+')
- {
- expiry = mask;
- mask = params.size() > 2 ? params[2] : "";
- last_param = 3;
- }
-
- expires = !expiry.empty() ? dotime(expiry) : Config->SZLineExpiry;
- /* If the expiry given does not contain a final letter, it's in days,
- * said the doc. Ah well.
- */
- if (!expiry.empty() && isdigit(expiry[expiry.length() - 1]))
- expires *= 86400;
- /* Do not allow less than a minute expiry time */
- if (expires && expires < 60)
- {
- source.Reply(BAD_EXPIRY_TIME);
- return;
- }
- else if (expires > 0)
- expires += Anope::CurTime;
-
- if (params.size() <= last_param)
- {
- this->OnSyntaxError(source, "ADD");
- return;
- }
-
- Anope::string reason = params[last_param];
- if (last_param == 2 && params.size() > 3)
- reason += " " + params[3];
- if (!mask.empty() && !reason.empty())
- {
- std::pair<int, XLine *> canAdd = this->szlines->CanAdd(mask, expires);
- if (mask.find('!') != Anope::string::npos || mask.find('@') != Anope::string::npos)
- source.Reply(_("You can only add IP masks to the SZLINE list."));
- else if (mask.find_first_not_of("*?") == Anope::string::npos)
- source.Reply(USERHOST_MASK_TOO_WIDE, mask.c_str());
- else if (canAdd.first == 1)
- source.Reply(_("\002%s\002 already exists on the SZLINE list."), canAdd.second->Mask.c_str());
- else if (canAdd.first == 2)
- source.Reply(_("Expiry time of \002%s\002 changed."), canAdd.second->Mask.c_str());
- else if (canAdd.first == 3)
- source.Reply(_("\002%s\002 is already covered by %s."), mask.c_str(), canAdd.second->Mask.c_str());
- else
- {
- User *user = finduser(mask);
- if (user && user->ip())
- mask = user->ip.addr();
- unsigned int affected = 0;
- for (Anope::insensitive_map<User *>::iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it)
- if (it->second->ip() && Anope::Match(it->second->ip.addr(), mask))
- ++affected;
- float percent = static_cast<float>(affected) / static_cast<float>(UserListByNick.size()) * 100.0;
-
- if (percent > 95)
- {
- source.Reply(USERHOST_MASK_TOO_WIDE, mask.c_str());
- Log(LOG_ADMIN, u, this) << "tried to SZLine " << percent << "% of the network (" << affected << " users)";
- return;
- }
-
- XLine *x = this->szlines->Add(mask, u->nick, expires, reason);
-
- EventReturn MOD_RESULT;
- FOREACH_RESULT(I_OnAddXLine, OnAddXLine(u, x, this->xlm()));
- if (MOD_RESULT == EVENT_STOP)
- {
- delete x;
- return;
- }
-
- source.Reply(_("\002%s\002 added to the SZLINE list."), mask.c_str());
- Log(LOG_ADMIN, u, this) << "on " << mask << " (" << reason << ") expires in " << (expires ? duration(expires - Anope::CurTime) : "never") << " [affects " << affected << " user(s) (" << percent << "%)]";
-
- if (readonly)
- source.Reply(READ_ONLY_MODE);
- }
-
- }
- else
- this->OnSyntaxError(source, "ADD");
-
- return;
- }
-
- service_reference<XLineManager> szlines;
- public:
- CommandOSSZLine(Module *creator) : CommandOSSXLineBase(creator, "operserv/szline"), szlines("xlinemanager/szline")
- {
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Allows Services operators to manipulate the SZLINE list. If\n"
- "a user with an IP matching an SZLINE mask attempts to \n"
- "connect, Services will not allow it to pursue his IRC\n"
- "session (and this, whether the IP has a PTR RR or not).\n"
- " \n"));
- source.Reply(_("\002SZLINE ADD\002 adds the given (nick's) IP mask to the SZLINE\n"
- "list for the given reason (which \002must\002 be given).\n"
- "\037expiry\037 is specified as an integer followed by one of \037d\037 \n"
- "(days), \037h\037 (hours), or \037m\037 (minutes). Combinations (such as \n"
- "\0371h30m\037) are not permitted. If a unit specifier is not \n"
- "included, the default is days (so \037+30\037 by itself means 30 \n"
- "days). To add an SZLINE which does not expire, use \037+0\037. If the\n"
- "realname mask to be added starts with a \037+\037, an expiry time must\n"
- "be given, even if it is the same as the default. The\n"
- "current SZLINE default expiry time can be found with the\n"
- "\002STATS AKILL\002 command.\n"));
- source.Reply(_(" \n"
- "The \002SZLINE DEL\002 command removes the given mask from the\n"
- "SZLINE list if it is present. If a list of entry numbers is \n"
- "given, those entries are deleted. (See the example for LIST \n"
- "below.)\n"
- " \n"
- "The \002SZLINE LIST\002 command displays the SZLINE list.\n"
- "If a wildcard mask is given, only those entries matching the\n"
- "mask are displayed. If a list of entry numbers is given,\n"
- "only those entries are shown; for example:\n"
- " \002SZLINE LIST 2-5,7-9\002\n"
- " Lists SZLINE entries numbered 2 through 5 and 7 \n"
- " through 9.\n"
- " \n"
- "\002SZLINE VIEW\002 is a more verbose version of \002SZLINE LIST\002, and \n"
- "will show who added an SZLINE, the date it was added, and when\n"
- "it expires, as well as the IP mask and reason.\n"
- " \n"
- "\002SZLINE CLEAR\002 clears all entries of the SZLINE list."));
- return true;
- }
-};
-
-class OSSXLine : public Module
-{
- CommandOSSNLine commandossnline;
- CommandOSSQLine commandossqline;
- CommandOSSZLine commandosszline;
-
- public:
- OSSXLine(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandossnline(this), commandossqline(this), commandosszline(this)
- {
- this->SetAuthor("Anope");
-
- if (ircd && ircd->snline)
- ModuleManager::RegisterService(&commandossnline);
- if (ircd && ircd->sqline)
- ModuleManager::RegisterService(&commandossqline);
- if (ircd && ircd->szline)
- ModuleManager::RegisterService(&commandosszline);
- }
-};
-
-MODULE_INIT(OSSXLine)
diff --git a/modules/core/os_update.cpp b/modules/core/os_update.cpp
deleted file mode 100644
index 776835cf7..000000000
--- a/modules/core/os_update.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2011 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandOSUpdate : public Command
-{
- public:
- CommandOSUpdate(Module *creator) : Command(creator, "operserv/update", 0, 0)
- {
- this->SetDesc(_("Force the Services databases to be updated immediately"));
- this->SetSyntax("");
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params)
- {
- source.Reply(_("Updating databases."));
- save_databases();
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand)
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Causes Services to update all database files as soon as you\n"
- "send the command."));
- return true;
- }
-};
-
-class OSUpdate : public Module
-{
- CommandOSUpdate commandosupdate;
-
- public:
- OSUpdate(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandosupdate(this)
- {
- this->SetAuthor("Anope");
-
- ModuleManager::RegisterService(&commandosupdate);
- }
-};
-
-MODULE_INIT(OSUpdate)