diff options
author | Adam <Adam@anope.org> | 2012-04-23 05:08:26 -0400 |
---|---|---|
committer | Adam <Adam@anope.org> | 2012-04-23 05:08:26 -0400 |
commit | 573e49a7ead331219eb6f0d3ca9cf83e793a5c9c (patch) | |
tree | e145e04fa3d041cf92ce46da4ac790b63231059c /modules/commands | |
parent | 63c639e108a00d7dbb0d7ac9891684fc83a3b207 (diff) |
Reworked live SQL support yet again
Diffstat (limited to 'modules/commands')
88 files changed, 709 insertions, 520 deletions
diff --git a/modules/commands/bs_badwords.cpp b/modules/commands/bs_badwords.cpp index bb7a073f1..eaf00d347 100644 --- a/modules/commands/bs_badwords.cpp +++ b/modules/commands/bs_badwords.cpp @@ -81,7 +81,7 @@ class CommandBSBadwords : public Command if (!Number || Number > ci->GetBadWordCount()) return; - BadWord *bw = ci->GetBadWord(Number - 1); + const BadWord *bw = ci->GetBadWord(Number - 1); ListFormatter::ListEntry entry; entry["Number"] = stringify(Number); entry["Word"] = bw->word; @@ -96,7 +96,7 @@ class CommandBSBadwords : public Command { for (unsigned i = 0, end = ci->GetBadWordCount(); i < end; ++i) { - BadWord *bw = ci->GetBadWord(i); + const BadWord *bw = ci->GetBadWord(i); if (!word.empty() && !Anope::Match(bw->word, word)) continue; @@ -154,7 +154,7 @@ class CommandBSBadwords : public Command for (unsigned i = 0, end = ci->GetBadWordCount(); i < end; ++i) { - BadWord *bw = ci->GetBadWord(i); + const BadWord *bw = ci->GetBadWord(i); if (!bw->word.empty() && ((Config->BSCaseSensitive && realword.equals_cs(bw->word)) || (!Config->BSCaseSensitive && realword.equals_ci(bw->word)))) { @@ -183,7 +183,7 @@ class CommandBSBadwords : public Command else { unsigned i, end; - BadWord *badword; + const BadWord *badword; for (i = 0, end = ci->GetBadWordCount(); i < end; ++i) { diff --git a/modules/commands/bs_bot.cpp b/modules/commands/bs_bot.cpp index 526cd922c..b1f22909f 100644 --- a/modules/commands/bs_bot.cpp +++ b/modules/commands/bs_bot.cpp @@ -22,7 +22,6 @@ class CommandBSBot : public Command const Anope::string &user = params[2]; const Anope::string &host = params[3]; const Anope::string &real = params[4]; - BotInfo *bi; if (findbot(nick)) { @@ -93,7 +92,7 @@ class CommandBSBot : public Command return; } - bi = new BotInfo(nick, user, host, real); + BotInfo *bi = new BotInfo(nick, user, host, real); Log(LOG_ADMIN, source.u, this) << "ADD " << bi->GetMask() << " " << bi->realname; @@ -110,7 +109,6 @@ class CommandBSBot : public Command 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()) { @@ -118,7 +116,8 @@ class CommandBSBot : public Command return; } - if (!(bi = findbot(oldnick))) + BotInfo *bi = findbot(oldnick); + if (!bi) { source.Reply(BOT_DOES_NOT_EXIST, oldnick.c_str()); return; @@ -263,7 +262,6 @@ class CommandBSBot : public Command void DoDel(CommandSource &source, const std::vector<Anope::string> ¶ms) { const Anope::string &nick = params[1]; - BotInfo *bi; if (nick.empty()) { @@ -271,7 +269,8 @@ class CommandBSBot : public Command return; } - if (!(bi = findbot(nick))) + BotInfo *bi = findbot(nick); + if (!bi) { source.Reply(BOT_DOES_NOT_EXIST, nick.c_str()); return; @@ -288,7 +287,7 @@ class CommandBSBot : public Command Log(LOG_ADMIN, source.u, this) << "DEL " << bi->nick; source.Reply(_("Bot \002%s\002 has been deleted."), nick.c_str()); - delete bi; + bi->destroy(); return; } public: diff --git a/modules/commands/bs_botlist.cpp b/modules/commands/bs_botlist.cpp index ed50371fc..68fb7bdfa 100644 --- a/modules/commands/bs_botlist.cpp +++ b/modules/commands/bs_botlist.cpp @@ -30,7 +30,7 @@ class CommandBSBotList : public Command list.addColumn("Nick").addColumn("Mask"); - for (Anope::insensitive_map<BotInfo *>::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it) + for (Anope::insensitive_map<BotInfo *>::const_iterator it = BotListByNick->begin(), it_end = BotListByNick->end(); it != it_end; ++it) { BotInfo *bi = it->second; diff --git a/modules/commands/bs_info.cpp b/modules/commands/bs_info.cpp index ed36818b3..251bd84df 100644 --- a/modules/commands/bs_info.cpp +++ b/modules/commands/bs_info.cpp @@ -17,12 +17,12 @@ class CommandBSInfo : public Command { private: - void send_bot_channels(std::vector<Anope::string> &buffers, BotInfo *bi) + void send_bot_channels(std::vector<Anope::string> &buffers, const BotInfo *bi) { Anope::string buf; - for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it) + for (registered_channel_map::const_iterator it = RegisteredChannelList->begin(), it_end = RegisteredChannelList->end(); it != it_end; ++it) { - ChannelInfo *ci = it->second; + const ChannelInfo *ci = it->second; if (ci->bi == bi) { @@ -38,7 +38,7 @@ class CommandBSInfo : public Command buffers.push_back(buf); } - void CheckOptStr(Anope::string &buf, BotServFlag flag, const char *option, Flags<BotServFlag> &flags, NickCore *nc) + void CheckOptStr(Anope::string &buf, BotServFlag flag, const char *option, Flags<BotServFlag> &flags, const NickCore *nc) { if (flags.HasFlag(flag)) { @@ -60,7 +60,7 @@ class CommandBSInfo : public Command const Anope::string &query = params[0]; User *u = source.u; - BotInfo *bi = findbot(query); + const BotInfo *bi = findbot(query); ChannelInfo *ci; InfoFormatter info(u); diff --git a/modules/commands/bs_kick.cpp b/modules/commands/bs_kick.cpp index 42b43e7a1..819c5af74 100644 --- a/modules/commands/bs_kick.cpp +++ b/modules/commands/bs_kick.cpp @@ -900,7 +900,7 @@ class BSKick : public Module for (unsigned i = 0, end = ci->GetBadWordCount(); i < end; ++i) { - BadWord *bw = ci->GetBadWord(i); + const 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; @@ -1012,7 +1012,7 @@ class BSKick : public Module Channel *chan = (*it)->chan; ++it; - if (chan->ci != NULL && chan->ci->botflags.HasFlag(BS_KICK_AMSGS) && !chan->ci->AccessFor(u).HasPriv("NOKICK")) + if (chan->ci && chan->ci->botflags.HasFlag(BS_KICK_AMSGS) && !chan->ci->AccessFor(u).HasPriv("NOKICK")) { check_ban(chan->ci, u, TTB_AMSGS); bot_kick(chan->ci, u, _("Don't use AMSGs!")); diff --git a/modules/commands/cs_access.cpp b/modules/commands/cs_access.cpp index aa32d29ef..a37446df2 100644 --- a/modules/commands/cs_access.cpp +++ b/modules/commands/cs_access.cpp @@ -15,7 +15,7 @@ static std::map<Anope::string, int16_t, ci::less> defaultLevels; -static void reset_levels(ChannelInfo *ci) +static inline void reset_levels(ChannelInfo *ci) { ci->ClearLevels(); for (std::map<Anope::string, int16_t, ci::less>::iterator it = defaultLevels.begin(), it_end = defaultLevels.end(); it != it_end; ++it) @@ -36,7 +36,7 @@ class AccessChanAccess : public ChanAccess return this->ci->GetLevel(name) != ACCESS_INVALID && this->level >= this->ci->GetLevel(name); } - Anope::string Serialize() + Anope::string Serialize() const { return stringify(this->level); } @@ -46,11 +46,11 @@ class AccessChanAccess : public ChanAccess this->level = convertTo<int>(data); } - static int DetermineLevel(ChanAccess *access) + static int DetermineLevel(const ChanAccess *access) { if (access->provider->name == "access/access") { - AccessChanAccess *aaccess = debug_cast<AccessChanAccess *>(access); + const AccessChanAccess *aaccess = debug_cast<const AccessChanAccess *>(access); return aaccess->level; } else @@ -108,7 +108,7 @@ class CommandCSAccess : public Command } AccessGroup u_access = ci->AccessFor(u); - ChanAccess *highest = u_access.Highest(); + const ChanAccess *highest = u_access.Highest(); int u_level = (highest ? AccessChanAccess::DetermineLevel(highest) : 0); if (level >= u_level && !u_access.Founder && !u->HasPriv("chanserv/access/modify")) { @@ -123,7 +123,7 @@ class CommandCSAccess : public Command bool override = !ci->AccessFor(u).HasPriv("ACCESS_CHANGE") || (level >= u_level && !u_access.Founder); - if (mask.find_first_of("!*@") == Anope::string::npos && findnick(mask) == NULL) + if (mask.find_first_of("!*@") == Anope::string::npos && !findnick(mask)) { User *targ = finduser(mask); if (targ != NULL) @@ -137,7 +137,7 @@ class CommandCSAccess : public Command for (unsigned i = ci->GetAccessCount(); i > 0; --i) { - ChanAccess *access = ci->GetAccess(i - 1); + const ChanAccess *access = ci->GetAccess(i - 1); if (mask.equals_ci(access->mask)) { /* Don't allow lowering from a level >= u_level */ @@ -230,7 +230,7 @@ class CommandCSAccess : public Command ChanAccess *access = ci->GetAccess(Number - 1); AccessGroup u_access = ci->AccessFor(user); - ChanAccess *u_highest = u_access.Highest(); + const ChanAccess *u_highest = u_access.Highest(); if ((u_highest ? AccessChanAccess::DetermineLevel(u_highest) : 0) <= AccessChanAccess::DetermineLevel(access) && !u_access.Founder && !this->override && !access->mask.equals_ci(user->Account()->display)) { @@ -255,7 +255,7 @@ class CommandCSAccess : public Command else { AccessGroup u_access = ci->AccessFor(u); - ChanAccess *highest = u_access.Highest(); + const ChanAccess *highest = u_access.Highest(); int u_level = (highest ? AccessChanAccess::DetermineLevel(highest) : 0); for (unsigned i = ci->GetAccessCount(); i > 0; --i) @@ -308,7 +308,7 @@ class CommandCSAccess : public Command if (!number || number > ci->GetAccessCount()) return; - ChanAccess *access = ci->GetAccess(number - 1); + const ChanAccess *access = ci->GetAccess(number - 1); Anope::string timebuf; if (ci->c) @@ -339,7 +339,7 @@ class CommandCSAccess : public Command { for (unsigned i = 0, end = ci->GetAccessCount(); i < end; ++i) { - ChanAccess *access = ci->GetAccess(i); + const ChanAccess *access = ci->GetAccess(i); if (!nick.empty() && !Anope::Match(access->mask, nick)) continue; @@ -470,7 +470,7 @@ class CommandCSAccess : public Command has_access = true; else if (is_del) { - NickAlias *na = findnick(nick); + const NickAlias *na = findnick(nick); if (na && na->nc == u->Account()) has_access = true; } diff --git a/modules/commands/cs_akick.cpp b/modules/commands/cs_akick.cpp index beaa8ffd3..107f97584 100644 --- a/modules/commands/cs_akick.cpp +++ b/modules/commands/cs_akick.cpp @@ -54,9 +54,9 @@ class CommandCSAKick : public Command Anope::string mask = params[2]; Anope::string reason = params.size() > 3 ? params[3] : ""; - NickAlias *na = findnick(mask); + const NickAlias *na = findnick(mask); NickCore *nc = NULL; - AutoKick *akick; + const AutoKick *akick; if (!na) { @@ -113,7 +113,7 @@ class CommandCSAKick : public Command /* 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) + for (nickalias_map::const_iterator it = NickAliasList->begin(), it_end = NickAliasList->end(); it != it_end; ++it) { na = it->second; @@ -166,7 +166,6 @@ class CommandCSAKick : public Command User *u = source.u; const Anope::string &mask = params[2]; - AutoKick *akick; unsigned i, end; if (!ci->GetAkickCount()) @@ -218,12 +217,12 @@ class CommandCSAKick : public Command } else { - NickAlias *na = findnick(mask); - NickCore *nc = na ? na->nc : NULL; + const NickAlias *na = findnick(mask); + const NickCore *nc = na ? *na->nc : NULL; for (i = 0, end = ci->GetAkickCount(); i < end; ++i) { - akick = ci->GetAkick(i); + const AutoKick *akick = ci->GetAkick(i); if ((akick->HasFlag(AK_ISNICK) && akick->nc == nc) || (!akick->HasFlag(AK_ISNICK) && mask.equals_ci(akick->mask))) break; @@ -267,7 +266,7 @@ class CommandCSAKick : public Command if (!number || number > ci->GetAkickCount()) return; - AutoKick *akick = ci->GetAkick(number - 1); + const AutoKick *akick = ci->GetAkick(number - 1); Anope::string timebuf, lastused; if (akick->addtime) @@ -296,7 +295,7 @@ class CommandCSAKick : public Command { for (unsigned i = 0, end = ci->GetAkickCount(); i < end; ++i) { - AutoKick *akick = ci->GetAkick(i); + const AutoKick *akick = ci->GetAkick(i); if (!mask.empty()) { diff --git a/modules/commands/cs_clone.cpp b/modules/commands/cs_clone.cpp index 1676c70f6..be6907b81 100644 --- a/modules/commands/cs_clone.cpp +++ b/modules/commands/cs_clone.cpp @@ -41,6 +41,7 @@ public: source.Reply(ACCESS_DENIED); return; } + ChannelInfo *target_ci = cs_findchan(target); if (!target_ci) { @@ -58,10 +59,10 @@ public: if (what.empty()) { - delete target_ci; + target_ci->destroy(); target_ci = new ChannelInfo(*ci); target_ci->name = target; - RegisteredChannelList[target_ci->name] = target_ci; + (*RegisteredChannelList)[target_ci->name] = target_ci; target_ci->c = findchan(target_ci->name); if (target_ci->c) { @@ -107,7 +108,7 @@ public: { for (unsigned i = 0; i < ci->GetAccessCount(); ++i) { - ChanAccess *taccess = ci->GetAccess(i); + const ChanAccess *taccess = ci->GetAccess(i); AccessProvider *provider = taccess->provider; ChanAccess *newaccess = provider->Create(); @@ -128,7 +129,7 @@ public: target_ci->ClearAkick(); for (unsigned i = 0; i < ci->GetAkickCount(); ++i) { - AutoKick *akick = ci->GetAkick(i); + const 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 @@ -142,7 +143,7 @@ public: target_ci->ClearBadWords(); for (unsigned i = 0; i < ci->GetBadWordCount(); ++i) { - BadWord *bw = ci->GetBadWord(i); + const BadWord *bw = ci->GetBadWord(i); target_ci->AddBadWord(bw->word, bw->type); } diff --git a/modules/commands/cs_drop.cpp b/modules/commands/cs_drop.cpp index d2d05c457..fb9da23b8 100644 --- a/modules/commands/cs_drop.cpp +++ b/modules/commands/cs_drop.cpp @@ -59,7 +59,7 @@ class CommandCSDrop : public Command FOREACH_MOD(I_OnChanDrop, OnChanDrop(ci)); Channel *c = ci->c; - delete ci; + ci->destroy(); source.Reply(_("Channel \002%s\002 has been dropped."), chan.c_str()); diff --git a/modules/commands/cs_enforce.cpp b/modules/commands/cs_enforce.cpp index 1c5cabddd..62c8e0c6d 100644 --- a/modules/commands/cs_enforce.cpp +++ b/modules/commands/cs_enforce.cpp @@ -20,9 +20,9 @@ class CommandCSEnforce : public Command private: void DoSet(Channel *c) { - ChannelInfo *ci; + const ChannelInfo *ci = c->ci; - if (!(ci = c->ci)) + if (!ci) return; if (ci->HasFlag(CI_SECUREOPS)) @@ -39,10 +39,9 @@ class CommandCSEnforce : public Command void DoSecureOps(Channel *c) { - ChannelInfo *ci; - bool hadsecureops = false; + ChannelInfo *ci = c->ci; - if (!(ci = c->ci)) + if (!ci) return; /* Dirty hack to allow chan_set_correct_modes to work ok. @@ -50,6 +49,7 @@ class CommandCSEnforce : public Command * part of the code. This way we can enforce SECUREOPS even * if it's off. */ + bool hadsecureops = false; if (!ci->HasFlag(CI_SECUREOPS)) { ci->SetFlag(CI_SECUREOPS); @@ -91,10 +91,10 @@ class CommandCSEnforce : public Command void DoCModeR(Channel *c) { - ChannelInfo *ci; + ChannelInfo *ci = c->ci; Anope::string mask; - if (!(ci = c->ci)) + if (!ci) return; for (CUserList::iterator it = c->users.begin(), it_end = c->users.end(); it != it_end; ) diff --git a/modules/commands/cs_entrymsg.cpp b/modules/commands/cs_entrymsg.cpp index 477f68cb2..9b5a6753c 100644 --- a/modules/commands/cs_entrymsg.cpp +++ b/modules/commands/cs_entrymsg.cpp @@ -15,7 +15,7 @@ struct EntryMsg : Serializable { - ChannelInfo *ci; + serialize_obj<ChannelInfo> ci; Anope::string creator; Anope::string message; time_t when; @@ -29,14 +29,14 @@ struct EntryMsg : Serializable this->when = ct; } - Anope::string serialize_name() const anope_override + const Anope::string serialize_name() const anope_override { return "EntryMsg"; } - serialized_data serialize() anope_override + Serialize::Data serialize() const anope_override { - serialized_data data; + Serialize::Data data; data["ci"] << this->ci->name; data["creator"] << this->creator; @@ -46,7 +46,7 @@ struct EntryMsg : Serializable return data; } - static void unserialize(serialized_data &data); + static Serializable* unserialize(Serializable *obj, Serialize::Data &data); }; static unsigned MaxEntries = 0; @@ -55,11 +55,21 @@ struct EntryMessageList : std::vector<EntryMsg>, ExtensibleItem { }; -void EntryMsg::unserialize(serialized_data &data) +Serializable* EntryMsg::unserialize(Serializable *obj, Serialize::Data &data) { ChannelInfo *ci = cs_findchan(data["ci"].astr()); if (!ci) - return; + return NULL; + + if (obj) + { + EntryMsg *msg = debug_cast<EntryMsg *>(obj); + msg->ci = ci; + data["creator"] >> msg->creator; + data["message"] >> msg->message; + data["when"] >> msg->when; + return msg; + } EntryMessageList *messages = ci->GetExt<EntryMessageList *>("cs_entrymsg"); if (messages == NULL) @@ -69,6 +79,7 @@ void EntryMsg::unserialize(serialized_data &data) } messages->push_back(EntryMsg(ci, data["creator"].astr(), data["message"].astr())); + return &messages->back(); } class CommandEntryMessage : public Command diff --git a/modules/commands/cs_fantasy_stats.cpp b/modules/commands/cs_fantasy_stats.cpp index 7a4419e30..3e9d482b8 100644 --- a/modules/commands/cs_fantasy_stats.cpp +++ b/modules/commands/cs_fantasy_stats.cpp @@ -106,7 +106,7 @@ class CSStats : public Module Anope::string display; if (params.empty()) display = source.u->Account()->display; - else if (NickAlias *na = findnick(params[0])) + else if (const NickAlias *na = findnick(params[0])) display = na->nc->display; else { @@ -165,4 +165,5 @@ void CommandCSGStats::Execute(CommandSource &source, const std::vector<Anope::st me->DoStats(source, true, params); } -MODULE_INIT(CSStats)
\ No newline at end of file +MODULE_INIT(CSStats) + diff --git a/modules/commands/cs_flags.cpp b/modules/commands/cs_flags.cpp index aceb28192..222409eca 100644 --- a/modules/commands/cs_flags.cpp +++ b/modules/commands/cs_flags.cpp @@ -32,7 +32,7 @@ class FlagsChanAccess : public ChanAccess return false; } - Anope::string Serialize() + Anope::string Serialize() const { return Anope::string(this->flags.begin(), this->flags.end()); } @@ -43,7 +43,7 @@ class FlagsChanAccess : public ChanAccess this->flags.insert(data[i - 1]); } - static Anope::string DetermineFlags(ChanAccess *access) + static Anope::string DetermineFlags(const ChanAccess *access) { if (access->provider->name == "access/flags") return access->Serialize(); @@ -88,7 +88,7 @@ class CommandCSFlags : public Command AccessGroup u_access = ci->AccessFor(u); - if (mask.find_first_of("!*@") == Anope::string::npos && findnick(mask) == NULL) + if (mask.find_first_of("!*@") == Anope::string::npos && !findnick(mask)) { User *targ = finduser(mask); if (targ != NULL) @@ -234,7 +234,7 @@ class CommandCSFlags : public Command unsigned count = 0; for (unsigned i = 0, end = ci->GetAccessCount(); i < end; ++i) { - ChanAccess *access = ci->GetAccess(i); + const ChanAccess *access = ci->GetAccess(i); const Anope::string &flags = FlagsChanAccess::DetermineFlags(access); if (!arg.empty()) diff --git a/modules/commands/cs_info.cpp b/modules/commands/cs_info.cpp index 290ead3ba..47ba4d3b0 100644 --- a/modules/commands/cs_info.cpp +++ b/modules/commands/cs_info.cpp @@ -13,9 +13,11 @@ #include "module.h" +struct ExtensibleString : Anope::string, ExtensibleItem { }; + class CommandCSInfo : public Command { - void CheckOptStr(Anope::string &buf, ChannelInfoFlag opt, const char *str, ChannelInfo *ci, NickCore *nc) + void CheckOptStr(Anope::string &buf, ChannelInfoFlag opt, const char *str, const ChannelInfo *ci, const NickCore *nc) { if (ci->HasFlag(opt)) { @@ -68,7 +70,7 @@ class CommandCSInfo : public Command info["Registered"] = do_strftime(ci->time_registered); info["Last used"] = do_strftime(ci->last_used); - ModeLock *secret = ci->GetMLock(CMODE_SECRET); + const ModeLock *secret = ci->GetMLock(CMODE_SECRET); if (!ci->last_topic.empty() && (show_all || ((!secret || secret->set == false) && (!ci->c || !ci->c->HasMode(CMODE_SECRET))))) { info["Last topic"] = ci->last_topic; diff --git a/modules/commands/cs_list.cpp b/modules/commands/cs_list.cpp index 77d7613fe..8385fc38b 100644 --- a/modules/commands/cs_list.cpp +++ b/modules/commands/cs_list.cpp @@ -76,9 +76,9 @@ class CommandCSList : public Command ListFormatter list; list.addColumn("Name").addColumn("Description"); - for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it) + for (registered_channel_map::const_iterator it = RegisteredChannelList->begin(), it_end = RegisteredChannelList->end(); it != it_end; ++it) { - ChannelInfo *ci = it->second; + const ChannelInfo *ci = it->second; if (!is_servadmin && (ci->HasFlag(CI_PRIVATE) || ci->HasFlag(CI_SUSPENDED))) continue; diff --git a/modules/commands/cs_log.cpp b/modules/commands/cs_log.cpp index 28c7e6f91..163789b53 100644 --- a/modules/commands/cs_log.cpp +++ b/modules/commands/cs_log.cpp @@ -36,23 +36,23 @@ public: source.Reply(ACCESS_DENIED); else if (params.size() == 1) { - if (ci->log_settings.empty()) + if (ci->log_settings->empty()) source.Reply(_("There currently are no logging configurations for %s."), ci->name.c_str()); else { ListFormatter list; list.addColumn("Number").addColumn("Service").addColumn("Command").addColumn("Method").addColumn(""); - for (unsigned i = 0; i < ci->log_settings.size(); ++i) + for (unsigned i = 0; i < ci->log_settings->size(); ++i) { - LogSetting &log = ci->log_settings[i]; + const LogSetting *log = ci->log_settings->at(i); ListFormatter::ListEntry entry; entry["Number"] = stringify(i + 1); - entry["Service"] = log.command_service; - entry["Command"] = log.command_name; - entry["Method"] = log.method; - entry[""] = log.extra; + entry["Service"] = log->command_service; + entry["Command"] = log->command_name; + entry["Method"] = log->method; + entry[""] = log->extra; list.addEntry(entry); } @@ -110,21 +110,22 @@ public: bool override = !ci->AccessFor(u).HasPriv("SET"); - for (unsigned i = ci->log_settings.size(); i > 0; --i) + for (unsigned i = ci->log_settings->size(); i > 0; --i) { - LogSetting &log = ci->log_settings[i - 1]; + LogSetting *log = ci->log_settings->at(i - 1); - if (log.service_name == bi->commands[command_name].name && log.method.equals_ci(method)) + if (log->service_name == bi->commands[command_name].name && log->method.equals_ci(method)) { - if (log.extra == extra) + if (log->extra == extra) { - ci->log_settings.erase(ci->log_settings.begin() + i - 1); + log->destroy(); + ci->log_settings->erase(ci->log_settings->begin() + i - 1); Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "to remove logging for " << command << " with method " << method << (extra == "" ? "" : " ") << extra; source.Reply(_("Logging for command %s on %s with log method %s%s%s has been removed."), command_name.c_str(), bi->nick.c_str(), method.c_str(), extra.empty() ? "" : " ", extra.empty() ? "" : extra.c_str()); } else { - log.extra = extra; + log->extra = extra; Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "to change logging for " << command << " to method " << method << (extra == "" ? "" : " ") << extra; source.Reply(_("Logging changed for command %s on %s, now using log method %s%s%s."), command_name.c_str(), bi->nick.c_str(), method.c_str(), extra.empty() ? "" : " ", extra.empty() ? "" : extra.c_str()); } @@ -132,17 +133,17 @@ public: } } - LogSetting log; - log.ci = ci; - log.service_name = bi->commands[command_name].name; - log.command_service = bi->nick; - log.command_name = command_name; - log.method = method; - log.extra = extra; - log.created = Anope::CurTime; - log.creator = u->nick; - - ci->log_settings.push_back(log); + LogSetting *log = new LogSetting(); + log->ci = ci; + log->service_name = bi->commands[command_name].name; + log->command_service = bi->nick; + log->command_name = command_name; + log->method = method; + log->extra = extra; + log->created = Anope::CurTime; + log->creator = u->nick; + + ci->log_settings->push_back(log); Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "to log " << command << " with method " << method << (extra == "" ? "" : " ") << extra; source.Reply(_("Logging is now active for command %s on %s, using log method %s%s%s."), command_name.c_str(), bi->nick.c_str(), method.c_str(), extra.empty() ? "" : " ", extra.empty() ? "" : extra.c_str()); @@ -197,19 +198,19 @@ class CSLog : public Module if (l->Type != LOG_COMMAND || l->u == NULL || l->c == NULL || l->ci == NULL || !Me || !Me->IsSynced()) return; - for (unsigned i = l->ci->log_settings.size(); i > 0; --i) + for (unsigned i = l->ci->log_settings->size(); i > 0; --i) { - LogSetting &log = l->ci->log_settings[i - 1]; + const LogSetting *log = l->ci->log_settings->at(i - 1); - if (log.service_name == l->c->name) + if (log->service_name == l->c->name) { - Anope::string buffer = l->u->nick + " used " + log.command_name + " " + l->buf.str(); + Anope::string buffer = l->u->nick + " used " + log->command_name + " " + l->buf.str(); - if (log.method.equals_ci("MESSAGE") && l->ci->c && l->ci->bi && l->ci->c->FindUser(l->ci->bi) != NULL) - ircdproto->SendPrivmsg(l->ci->bi, log.extra + l->ci->c->name, "%s", buffer.c_str()); - else if (log.method.equals_ci("NOTICE") && l->ci->c && l->ci->bi && l->ci->c->FindUser(l->ci->bi) != NULL) - ircdproto->SendNotice(l->ci->bi, log.extra + l->ci->c->name, "%s", buffer.c_str()); - else if (log.method.equals_ci("MEMO") && memoserv && l->ci->WhoSends() != NULL) + if (log->method.equals_ci("MESSAGE") && l->ci->c && l->ci->bi && l->ci->c->FindUser(l->ci->bi) != NULL) + ircdproto->SendPrivmsg(l->ci->bi, log->extra + l->ci->c->name, "%s", buffer.c_str()); + else if (log->method.equals_ci("NOTICE") && l->ci->c && l->ci->bi && l->ci->c->FindUser(l->ci->bi) != NULL) + ircdproto->SendNotice(l->ci->bi, log->extra + l->ci->c->name, "%s", buffer.c_str()); + else if (log->method.equals_ci("MEMO") && memoserv && l->ci->WhoSends() != NULL) memoserv->Send(l->ci->WhoSends()->nick, l->ci->name, buffer, true); } } diff --git a/modules/commands/cs_mode.cpp b/modules/commands/cs_mode.cpp index c9d7c112a..425a54a01 100644 --- a/modules/commands/cs_mode.cpp +++ b/modules/commands/cs_mode.cpp @@ -151,7 +151,7 @@ class CommandCSMode : public Command } else if (subcommand.equals_ci("LIST")) { - const std::multimap<ChannelModeName, ModeLock> &mlocks = ci->GetMLock(); + const ChannelInfo::ModeList &mlocks = ci->GetMLock(); if (mlocks.empty()) { source.Reply(_("Channel %s has no mode locks."), ci->name.c_str()); @@ -161,18 +161,18 @@ class CommandCSMode : public Command ListFormatter list; list.addColumn("Mode").addColumn("Param").addColumn("Creator").addColumn("Created"); - for (std::multimap<ChannelModeName, ModeLock>::const_iterator it = mlocks.begin(), it_end = mlocks.end(); it != it_end; ++it) + for (ChannelInfo::ModeList::const_iterator it = mlocks.begin(), it_end = mlocks.end(); it != it_end; ++it) { - const ModeLock &ml = it->second; - ChannelMode *cm = ModeManager::FindChannelModeByName(ml.name); + const ModeLock *ml = it->second; + ChannelMode *cm = ModeManager::FindChannelModeByName(ml->name); if (!cm) continue; ListFormatter::ListEntry entry; - entry["Mode"] = Anope::printf("%c%c", ml.set ? '+' : '-', cm->ModeChar); - entry["Param"] = ml.param; - entry["Creator"] = ml.setter; - entry["Created"] = do_strftime(ml.created, source.u->Account(), false); + entry["Mode"] = Anope::printf("%c%c", ml->set ? '+' : '-', cm->ModeChar); + entry["Param"] = ml->param; + entry["Creator"] = ml->setter; + entry["Created"] = do_strftime(ml->created, source.u->Account(), false); list.addEntry(entry); } diff --git a/modules/commands/cs_modes.cpp b/modules/commands/cs_modes.cpp index a460c6c87..37d710505 100644 --- a/modules/commands/cs_modes.cpp +++ b/modules/commands/cs_modes.cpp @@ -20,19 +20,31 @@ class CommandModeBase : public Command 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) + return; + + } + + if (!u2) + { source.Reply(NICK_X_NOT_IN_USE, nick.c_str()); - else if (is_same ? !ci->AccessFor(u).HasPriv(levelself) : !ci->AccessFor(u).HasPriv(level)) + return; + } + + ChannelInfo *ci = c->ci; + if (!ci) + { + source.Reply(CHAN_X_NOT_REGISTERED, c->name.c_str()); + return; + } + + bool is_same = u == u2; + AccessGroup u_access = ci->AccessFor(u), u2_access = ci->AccessFor(u2); + + if (is_same ? !ci->AccessFor(u).HasPriv(levelself) : !ci->AccessFor(u).HasPriv(level)) source.Reply(ACCESS_DENIED); else if (!set && !is_same && ci->HasFlag(CI_PEACE) && u2_access >= u_access) source.Reply(ACCESS_DENIED); diff --git a/modules/commands/cs_register.cpp b/modules/commands/cs_register.cpp index 570fd8125..fd62ff754 100644 --- a/modules/commands/cs_register.cpp +++ b/modules/commands/cs_register.cpp @@ -46,7 +46,7 @@ class CommandCSRegister : public Command 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); + source.Reply(u->Account()->channelcount > Config->CSMaxReg ? CHAN_EXCEEDED_CHANNEL_LIMIT : CHAN_REACHED_CHANNEL_LIMIT, Config->CSMaxReg); else { ci = new ChannelInfo(chan); @@ -54,11 +54,12 @@ class CommandCSRegister : public Command if (!chdesc.empty()) ci->desc = chdesc; - ci->mode_locks = def_mode_locks; - for (ChannelInfo::ModeList::iterator it = ci->mode_locks.begin(), it_end = ci->mode_locks.end(); it != it_end; ++it) + for (ChannelInfo::ModeList::iterator it = def_mode_locks.begin(), it_end = def_mode_locks.end(); it != it_end; ++it) { - it->second.setter = u->nick; - it->second.ci = ci; + ModeLock *ml = new ModeLock(*it->second); + ml->setter = u->nick; + ml->ci = ci; + ci->mode_locks->insert(std::make_pair(it->first, ml)); } if (c && !c->topic.empty()) diff --git a/modules/commands/cs_saset.cpp b/modules/commands/cs_saset.cpp index c564a9c90..c2e7b13d5 100644 --- a/modules/commands/cs_saset.cpp +++ b/modules/commands/cs_saset.cpp @@ -37,10 +37,10 @@ class CommandCSSASet : public Command " \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) + for (BotInfo::command_map::const_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; + const CommandInfo &info = it->second; if (c_name.find_ci(this_name + " ") == 0) { service_reference<Command> command("Command", info.name); diff --git a/modules/commands/cs_seen.cpp b/modules/commands/cs_seen.cpp index 0143f50d6..3f7b276f7 100644 --- a/modules/commands/cs_seen.cpp +++ b/modules/commands/cs_seen.cpp @@ -37,14 +37,14 @@ struct SeenInfo : Serializable { } - Anope::string serialize_name() const anope_override + const Anope::string serialize_name() const anope_override { return "SeenInfo"; } - serialized_data serialize() anope_override + Serialize::Data serialize() const anope_override { - serialized_data data; + Serialize::Data data; data["nick"] << nick; data["vhost"] << vhost; @@ -57,9 +57,13 @@ struct SeenInfo : Serializable return data; } - static void unserialize(serialized_data &data) + static Serializable* unserialize(Serializable *obj, Serialize::Data &data) { - SeenInfo *s = new SeenInfo(); + SeenInfo *s; + if (obj) + s = debug_cast<SeenInfo *>(obj); + else + s = new SeenInfo(); data["nick"] >> s->nick; data["vhost"] >> s->vhost; @@ -71,7 +75,9 @@ struct SeenInfo : Serializable data["message"] >> s->message; data["last"] >> s->last; - database[s->nick] = s; + if (!s) + database[s->nick] = s; + return s; } }; @@ -89,7 +95,7 @@ static SeenInfo *FindInfo(const Anope::string &nick) static bool ShouldHide(const Anope::string &channel, User *u) { Channel *targetchan = findchan(channel); - ChannelInfo *targetchan_ci = targetchan ? targetchan->ci : cs_findchan(channel); + const ChannelInfo *targetchan_ci = targetchan ? *targetchan->ci : cs_findchan(channel); if (targetchan && targetchan->HasMode(CMODE_SECRET)) return true; @@ -303,7 +309,7 @@ class DataBasePurger : public CallBack if ((Anope::CurTime - cur->second->last) > purgetime) { Log(LOG_DEBUG) << cur->first << " was last seen " << do_strftime(cur->second->last) << ", purging entry"; - delete cur->second; + cur->second->destroy(); database.erase(cur); } } diff --git a/modules/commands/cs_set.cpp b/modules/commands/cs_set.cpp index ac91d213f..0d23b5550 100644 --- a/modules/commands/cs_set.cpp +++ b/modules/commands/cs_set.cpp @@ -37,10 +37,10 @@ class CommandCSSet : public Command " \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) + for (BotInfo::command_map::const_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; + const CommandInfo &info = it->second; if (c_name.find_ci(this_name + " ") == 0) { service_reference<Command> command("Command", info.name); diff --git a/modules/commands/cs_set_founder.cpp b/modules/commands/cs_set_founder.cpp index 0d375f760..5f2990196 100644 --- a/modules/commands/cs_set_founder.cpp +++ b/modules/commands/cs_set_founder.cpp @@ -22,7 +22,7 @@ class CommandCSSetFounder : public Command this->SetSyntax(_("\037channel\037 \037nick\037")); } - void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)anope_override + void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { User *u = source.u; ChannelInfo *ci = cs_findchan(params[0]); @@ -44,8 +44,7 @@ class CommandCSSetFounder : public Command return; } - NickAlias *na = findnick(params[1]); - + const NickAlias *na = findnick(params[1]); if (!na) { source.Reply(NICK_X_NOT_REGISTERED, params[1].c_str()); diff --git a/modules/commands/cs_set_misc.cpp b/modules/commands/cs_set_misc.cpp index 75794697d..ab40f9fdc 100644 --- a/modules/commands/cs_set_misc.cpp +++ b/modules/commands/cs_set_misc.cpp @@ -12,9 +12,9 @@ #include "module.h" -struct CSMiscData : Anope::string, ExtensibleItem, Serializable +struct CSMiscData : ExtensibleItem, Serializable { - ChannelInfo *ci; + serialize_obj<ChannelInfo> ci; Anope::string name; Anope::string data; @@ -22,14 +22,14 @@ struct CSMiscData : Anope::string, ExtensibleItem, Serializable { } - Anope::string serialize_name() const anope_override + const Anope::string serialize_name() const anope_override { return "CSMiscData"; } - serialized_data serialize() anope_override + Serialize::Data serialize() const anope_override { - serialized_data sdata; + Serialize::Data sdata; sdata["ci"] << this->ci->name; sdata["name"] << this->name; @@ -38,13 +38,27 @@ struct CSMiscData : Anope::string, ExtensibleItem, Serializable return sdata; } - static void unserialize(serialized_data &data) + static Serializable* unserialize(Serializable *obj, Serialize::Data &data) { ChannelInfo *ci = cs_findchan(data["ci"].astr()); if (ci == NULL) - return; + return NULL; + + CSMiscData *d; + if (obj) + { + d = debug_cast<CSMiscData *>(obj); + d->ci = ci; + data["name"] >> d->name; + data["data"] >> d->data; + } + else + { + d = new CSMiscData(ci, data["name"].astr(), data["data"].astr()); + ci->Extend(data["name"].astr(), d); + } - ci->Extend(data["name"].astr(), new CSMiscData(ci, data["name"].astr(), data["data"].astr())); + return d; } }; diff --git a/modules/commands/cs_set_successor.cpp b/modules/commands/cs_set_successor.cpp index fe2860920..e0f05e67b 100644 --- a/modules/commands/cs_set_successor.cpp +++ b/modules/commands/cs_set_successor.cpp @@ -48,7 +48,7 @@ class CommandCSSetSuccessor : public Command if (params.size() > 1) { - NickAlias *na = findnick(params[1]); + const NickAlias *na = findnick(params[1]); if (!na) { diff --git a/modules/commands/cs_suspend.cpp b/modules/commands/cs_suspend.cpp index 676ffebfa..d5898083e 100644 --- a/modules/commands/cs_suspend.cpp +++ b/modules/commands/cs_suspend.cpp @@ -13,6 +13,11 @@ #include "module.h" +struct ExtensibleString : Anope::string, ExtensibleItem +{ + ExtensibleString(const Anope::string &s) : Anope::string(s) { } +}; + struct ChanSuspend : ExtensibleItem, Serializable { Anope::string chan; @@ -22,14 +27,14 @@ struct ChanSuspend : ExtensibleItem, Serializable { } - Anope::string serialize_name() const + const Anope::string serialize_name() const { return "ChanSuspend"; } - serialized_data serialize() anope_override + Serialize::Data serialize() const anope_override { - serialized_data sd; + Serialize::Data sd; sd["chan"] << this->chan; sd["when"] << this->when; @@ -37,18 +42,24 @@ struct ChanSuspend : ExtensibleItem, Serializable return sd; } - static void unserialize(serialized_data &sd) + static Serializable* unserialize(Serializable *obj, Serialize::Data &sd) { ChannelInfo *ci = cs_findchan(sd["chan"].astr()); if (ci == NULL) - return; + return NULL; - ChanSuspend *cs = new ChanSuspend(); + ChanSuspend *cs; + if (obj) + cs = debug_cast<ChanSuspend *>(obj); + else + cs = new ChanSuspend(); sd["chan"] >> cs->chan; sd["when"] >> cs->when; - ci->Extend("ci_suspend_expire", cs); + if (!obj) + ci->Extend("ci_suspend_expire", cs); + return cs; } }; @@ -220,11 +231,12 @@ class CSSuspend : public Module ~CSSuspend() { - for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it) + for (registered_channel_map::const_iterator it = RegisteredChannelList->begin(), it_end = RegisteredChannelList->end(); it != it_end; ++it) { - it->second->Shrink("cs_suspend_expire"); - it->second->Shrink("suspend_by"); - it->second->Shrink("suspend_reason"); + ChannelInfo *ci = it->second; + ci->Shrink("cs_suspend_expire"); + ci->Shrink("suspend_by"); + ci->Shrink("suspend_reason"); } } diff --git a/modules/commands/cs_updown.cpp b/modules/commands/cs_updown.cpp index da272835f..11b2f4749 100644 --- a/modules/commands/cs_updown.cpp +++ b/modules/commands/cs_updown.cpp @@ -39,7 +39,7 @@ class CommandCSUp : public Command if (c == NULL) source.Reply(CHAN_X_NOT_IN_USE, channel.c_str()); - else if (c->ci == NULL) + else if (!c->ci) source.Reply(CHAN_X_NOT_REGISTERED, channel.c_str()); else chan_set_correct_modes(u, c, 1); @@ -94,7 +94,7 @@ class CommandCSDown : public Command if (c == NULL) source.Reply(CHAN_X_NOT_IN_USE, channel.c_str()); - else if (c->ci == NULL) + else if (!c->ci) source.Reply(CHAN_X_NOT_REGISTERED, channel.c_str()); else RemoveAll(u, c); diff --git a/modules/commands/cs_xop.cpp b/modules/commands/cs_xop.cpp index 7935467c2..807cbe1f6 100644 --- a/modules/commands/cs_xop.cpp +++ b/modules/commands/cs_xop.cpp @@ -116,7 +116,7 @@ class XOPChanAccess : public ChanAccess return false; } - Anope::string Serialize() + Anope::string Serialize() const { for (int i = 0; xopAccess[i].type != XOP_UNKNOWN; ++i) { @@ -145,11 +145,11 @@ class XOPChanAccess : public ChanAccess this->type = XOP_UNKNOWN; } - static XOPType DetermineLevel(ChanAccess *access) + static XOPType DetermineLevel(const ChanAccess *access) { if (access->provider->name == "access/xop") { - XOPChanAccess *xaccess = debug_cast<XOPChanAccess *>(access); + const XOPChanAccess *xaccess = debug_cast<const XOPChanAccess *>(access); return xaccess->type; } else @@ -216,7 +216,7 @@ class XOPBase : public Command } AccessGroup access = ci->AccessFor(u); - ChanAccess *highest = access.Highest(); + const ChanAccess *highest = access.Highest(); int u_level = (highest ? XOPChanAccess::DetermineLevel(highest) : 0); if ((!access.Founder && !access.HasPriv("ACCESS_CHANGE") && !u->HasPriv("chanserv/access/modify")) || (level <= u_level && !access.Founder)) @@ -225,7 +225,7 @@ class XOPBase : public Command return; } - if (mask.find_first_of("!*@") == Anope::string::npos && findnick(mask) == NULL) + if (mask.find_first_of("!*@") == Anope::string::npos && !findnick(mask)) { User *targ = finduser(mask); if (targ != NULL) @@ -239,7 +239,7 @@ class XOPBase : public Command for (unsigned i = 0; i < ci->GetAccessCount(); ++i) { - ChanAccess *a = ci->GetAccess(i); + const ChanAccess *a = ci->GetAccess(i); if (a->mask.equals_ci(mask)) { @@ -304,7 +304,7 @@ class XOPBase : public Command } AccessGroup access = ci->AccessFor(u); - ChanAccess *highest = access.Highest(); + const ChanAccess *highest = access.Highest(); bool override = false; if ((!mask.equals_ci(u->Account()->display) && !access.HasPriv("ACCESS_CHANGE") && !access.Founder) || ((!highest || level <= XOPChanAccess::DetermineLevel(highest)) && !access.Founder)) { @@ -436,7 +436,7 @@ class XOPBase : public Command if (!Number || Number > ci->GetAccessCount()) return; - ChanAccess *a = ci->GetAccess(Number - 1); + const ChanAccess *a = ci->GetAccess(Number - 1); if (this->type != XOPChanAccess::DetermineLevel(a)) return; @@ -453,7 +453,7 @@ class XOPBase : public Command { for (unsigned i = 0, end = ci->GetAccessCount(); i < end; ++i) { - ChanAccess *a = ci->GetAccess(i); + const ChanAccess *a = ci->GetAccess(i); if (XOPChanAccess::DetermineLevel(a) != level) continue; @@ -507,7 +507,7 @@ class XOPBase : public Command for (unsigned i = ci->GetAccessCount(); i > 0; --i) { - ChanAccess *access = ci->GetAccess(i - 1); + const ChanAccess *access = ci->GetAccess(i - 1); if (XOPChanAccess::DetermineLevel(access) == level) ci->EraseAccess(i - 1); } diff --git a/modules/commands/help.cpp b/modules/commands/help.cpp index a329eb63c..7b7c52110 100644 --- a/modules/commands/help.cpp +++ b/modules/commands/help.cpp @@ -31,14 +31,14 @@ class CommandHelp : public Command return; User *u = source.u; - BotInfo *bi = source.owner; + const 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) + for (BotInfo::command_map::const_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; + const CommandInfo &info = it->second; // Smaller command exists Anope::string cmd = myStrGetToken(c_name, ' ', 0); @@ -65,11 +65,11 @@ class CommandHelp : public Command full_command += " " + params[i]; full_command.erase(full_command.begin()); - BotInfo::command_map::iterator it = bi->commands.find(full_command); + BotInfo::command_map::const_iterator it = bi->commands.find(full_command); if (it == bi->commands.end()) continue; - CommandInfo &info = it->second; + const CommandInfo &info = it->second; service_reference<Command> c("Command", info.name); if (!c) diff --git a/modules/commands/hs_del.cpp b/modules/commands/hs_del.cpp index 80b8333d9..48e11c08c 100644 --- a/modules/commands/hs_del.cpp +++ b/modules/commands/hs_del.cpp @@ -65,8 +65,8 @@ class CommandHSDelAll : public Command 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) + const NickCore *nc = na->nc; + for (std::list<serialize_obj<NickAlias> >::const_iterator it = nc->aliases.begin(), it_end = nc->aliases.end(); it != it_end; ++it) { na = *it; na->RemoveVhost(); diff --git a/modules/commands/hs_group.cpp b/modules/commands/hs_group.cpp index 79db12536..a9c3dc232 100644 --- a/modules/commands/hs_group.cpp +++ b/modules/commands/hs_group.cpp @@ -15,15 +15,16 @@ class CommandHSGroup : public Command { - void Sync(NickAlias *na) + void Sync(const NickAlias *na) { if (!na || !na->HasVhost()) return; - for (std::list<NickAlias *>::iterator it = na->nc->aliases.begin(), it_end = na->nc->aliases.end(); it != it_end; ++it) + for (std::list<serialize_obj<NickAlias> >::const_iterator it = na->nc->aliases.begin(), it_end = na->nc->aliases.end(); it != it_end;) { - NickAlias *nick = *it; - nick->SetVhost(na->GetVhostIdent(), na->GetVhostHost(), na->GetVhostCreator()); + NickAlias *nick = *it++; + if (nick) + nick->SetVhost(na->GetVhostIdent(), na->GetVhostHost(), na->GetVhostCreator()); } } diff --git a/modules/commands/hs_list.cpp b/modules/commands/hs_list.cpp index 3bc8be862..9e708f0b4 100644 --- a/modules/commands/hs_list.cpp +++ b/modules/commands/hs_list.cpp @@ -59,9 +59,9 @@ class CommandHSList : public Command ListFormatter list; list.addColumn("Number").addColumn("Nick").addColumn("Vhost").addColumn("Creator").addColumn("Created"); - for (nickalias_map::const_iterator it = NickAliasList.begin(), it_end = NickAliasList.end(); it != it_end; ++it) + for (nickalias_map::const_iterator it = NickAliasList->begin(), it_end = NickAliasList->end(); it != it_end; ++it) { - NickAlias *na = it->second; + const NickAlias *na = it->second; if (!na->HasVhost()) continue; diff --git a/modules/commands/hs_off.cpp b/modules/commands/hs_off.cpp index c9c2fecd1..bf7d92dba 100644 --- a/modules/commands/hs_off.cpp +++ b/modules/commands/hs_off.cpp @@ -25,7 +25,7 @@ class CommandHSOff : public Command void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { User *u = source.u; - NickAlias *na = findnick(u->nick); + const NickAlias *na = findnick(u->nick); if (!na || !na->HasVhost()) source.Reply(HOST_NOT_ASSIGNED); diff --git a/modules/commands/hs_on.cpp b/modules/commands/hs_on.cpp index 2dfa18c12..223f169fc 100644 --- a/modules/commands/hs_on.cpp +++ b/modules/commands/hs_on.cpp @@ -25,7 +25,7 @@ class CommandHSOn : public Command void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { User *u = source.u; - NickAlias *na = findnick(u->nick); + const NickAlias *na = findnick(u->nick); if (na && u->Account() == na->nc && na->HasVhost()) { if (!na->GetVhostIdent().empty()) diff --git a/modules/commands/hs_request.cpp b/modules/commands/hs_request.cpp index 06308c8cb..e44fa06e2 100644 --- a/modules/commands/hs_request.cpp +++ b/modules/commands/hs_request.cpp @@ -30,14 +30,14 @@ struct HostRequest : ExtensibleItem, Serializable Anope::string host; time_t time; - Anope::string serialize_name() const anope_override + const Anope::string serialize_name() const anope_override { return "HostRequest"; } - serialized_data serialize() anope_override + Serialize::Data serialize() const anope_override { - serialized_data data; + Serialize::Data data; data["nick"] << this->nick; data["ident"] << this->ident; @@ -47,19 +47,25 @@ struct HostRequest : ExtensibleItem, Serializable return data; } - static void unserialize(serialized_data &data) + static Serializable* unserialize(Serializable *obj, Serialize::Data &data) { NickAlias *na = findnick(data["nick"].astr()); if (na == NULL) - return; + return NULL; - HostRequest *req = new HostRequest; + HostRequest *req; + if (obj) + req = debug_cast<HostRequest *>(obj); + else + req = new HostRequest; req->nick = na->nick; data["ident"] >> req->ident; data["host"] >> req->host; data["time"] >> req->time; - na->Extend("hs_request", req); + if (!obj) + na->Extend("hs_request", req); + return req; } }; @@ -282,9 +288,9 @@ class CommandHSWaiting : public Command list.addColumn("Number").addColumn("Nick").addColumn("Vhost").addColumn("Created"); - for (nickalias_map::const_iterator it = NickAliasList.begin(), it_end = NickAliasList.end(); it != it_end; ++it) + for (nickalias_map::const_iterator it = NickAliasList->begin(), it_end = NickAliasList->end(); it != it_end; ++it) { - NickAlias *na = it->second; + const NickAlias *na = it->second; HostRequest *hr = na->GetExt<HostRequest *>("hs_request"); if (!hr) continue; @@ -358,8 +364,11 @@ class HSRequest : public Module ~HSRequest() { - for (nickalias_map::const_iterator it = NickAliasList.begin(), it_end = NickAliasList.end(); it != it_end; ++it) - it->second->Shrink("hs_request"); + for (nickalias_map::const_iterator it = NickAliasList->begin(), it_end = NickAliasList->end(); it != it_end; ++it) + { + NickAlias *na = it->second; + na->Shrink("hs_request"); + } } void OnReload() anope_override @@ -387,7 +396,7 @@ void req_send_memos(CommandSource &source, const Anope::string &vIdent, const An { Oper *o = Config->Opers[i]; - NickAlias *na = findnick(o->name); + const NickAlias *na = findnick(o->name); if (!na) continue; diff --git a/modules/commands/hs_set.cpp b/modules/commands/hs_set.cpp index 5e73fd800..d4fbe9d5c 100644 --- a/modules/commands/hs_set.cpp +++ b/modules/commands/hs_set.cpp @@ -104,15 +104,16 @@ class CommandHSSet : public Command class CommandHSSetAll : public Command { - void Sync(NickAlias *na) + void Sync(const NickAlias *na) { if (!na || !na->HasVhost()) return; - for (std::list<NickAlias *>::iterator it = na->nc->aliases.begin(), it_end = na->nc->aliases.end(); it != it_end; ++it) + for (std::list<serialize_obj<NickAlias> >::const_iterator it = na->nc->aliases.begin(), it_end = na->nc->aliases.end(); it != it_end;) { - NickAlias *nick = *it; - nick->SetVhost(na->GetVhostIdent(), na->GetVhostHost(), na->GetVhostCreator()); + NickAlias *nick = *it++; + if (nick) + nick->SetVhost(na->GetVhostIdent(), na->GetVhostHost(), na->GetVhostCreator()); } } diff --git a/modules/commands/ms_cancel.cpp b/modules/commands/ms_cancel.cpp index 46f410aec..059ca2f06 100644 --- a/modules/commands/ms_cancel.cpp +++ b/modules/commands/ms_cancel.cpp @@ -39,11 +39,20 @@ class CommandMSCancel : public Command 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)) + ChannelInfo *ci; + NickAlias *na; + if (ischan) + ci = cs_findchan(nname); + else + na = findnick(nname); + for (int i = mi->memos->size() - 1; i >= 0; --i) + if (mi->GetMemo(i)->HasFlag(MF_UNREAD) && u->Account()->display.equals_ci(mi->GetMemo(i)->sender)) { - FOREACH_MOD(I_OnMemoDel, OnMemoDel(findnick(nname)->nc, mi, mi->memos[i])); - mi->Del(mi->memos[i]); + if (ischan) + FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->GetMemo(i))); + else + FOREACH_MOD(I_OnMemoDel, OnMemoDel(na->nc, mi, mi->GetMemo(i))); + mi->Del(i); source.Reply(_("Last memo to \002%s\002 has been cancelled."), nname.c_str()); return; } diff --git a/modules/commands/ms_check.cpp b/modules/commands/ms_check.cpp index a77b7192f..5b031e8ec 100644 --- a/modules/commands/ms_check.cpp +++ b/modules/commands/ms_check.cpp @@ -30,28 +30,28 @@ class CommandMSCheck : public Command bool found = false; - NickAlias *na = findnick(recipient); + const NickAlias *na = findnick(recipient); if (!na) { source.Reply(NICK_X_NOT_REGISTERED, recipient.c_str()); return; } - MemoInfo *mi = &na->nc->memos; + MemoInfo *mi = const_cast<MemoInfo *>(&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) + for (int i = mi->memos->size() - 1; i >= 0; --i) { - if (u->Account()->display.equals_ci(mi->memos[i]->sender)) + if (u->Account()->display.equals_ci(mi->GetMemo(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()); + if (mi->GetMemo(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->GetMemo(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()); + source.Reply(_("The last memo you sent to %s (sent on %s) has been read."), na->nick.c_str(), do_strftime(mi->GetMemo(i)->time).c_str()); break; } } diff --git a/modules/commands/ms_del.cpp b/modules/commands/ms_del.cpp index 65969b025..0ad906c49 100644 --- a/modules/commands/ms_del.cpp +++ b/modules/commands/ms_del.cpp @@ -25,13 +25,13 @@ class MemoDelCallback : public NumberList void HandleNumber(unsigned Number) anope_override { - if (!Number || Number > mi->memos.size()) + if (!Number || Number > mi->memos->size()) return; if (ci) - FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->memos[Number - 1])); + FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->GetMemo(Number - 1))); else - FOREACH_MOD(I_OnMemoDel, OnMemoDel(source.u->Account(), mi, mi->memos[Number - 1])); + FOREACH_MOD(I_OnMemoDel, OnMemoDel(source.u->Account(), mi, mi->GetMemo(Number - 1))); mi->Del(Number - 1); source.Reply(_("Memo %d has been deleted."), Number); @@ -52,7 +52,7 @@ class CommandMSDel : public Command User *u = source.u; MemoInfo *mi; - ChannelInfo *ci = NULL; + ChannelInfo *ci; Anope::string numstr = !params.empty() ? params[0] : "", chan; if (!numstr.empty() && numstr[0] == '#') @@ -60,7 +60,8 @@ class CommandMSDel : public Command chan = numstr; numstr = params.size() > 1 ? params[1] : ""; - if (!(ci = cs_findchan(chan))) + ci = cs_findchan(chan); + if (!ci) { source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str()); return; @@ -78,10 +79,10 @@ class CommandMSDel : public Command mi = &ci->memos; } else - mi = &u->Account()->memos; + mi = const_cast<MemoInfo *>(&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()) + else if (mi->memos->empty()) { if (!chan.empty()) source.Reply(MEMO_X_HAS_NO_MEMOS, chan.c_str()); @@ -99,24 +100,24 @@ class CommandMSDel : public Command { /* Delete last memo. */ if (ci) - FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->memos[mi->memos.size() - 1])); + FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->GetMemo(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); + FOREACH_MOD(I_OnMemoDel, OnMemoDel(u->Account(), mi, mi->GetMemo(mi->memos->size() - 1))); + mi->Del(mi->memos->size() - 1); + source.Reply(_("Memo %d has been deleted."), mi->memos->size() + 1); } else { /* Delete all memos. */ - for (unsigned i = 0, end = mi->memos.size(); i < end; ++i) + for (unsigned i = 0, end = mi->memos->size(); i < end; ++i) { if (ci) - FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->memos[i])); + FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->GetMemo(i))); else - FOREACH_MOD(I_OnMemoDel, OnMemoDel(u->Account(), mi, mi->memos[i])); - delete mi->memos[i]; + FOREACH_MOD(I_OnMemoDel, OnMemoDel(u->Account(), mi, mi->GetMemo(i))); + mi->GetMemo(i)->destroy(); } - mi->memos.clear(); + mi->memos->clear(); if (!chan.empty()) source.Reply(_("All memos for channel %s have been deleted."), chan.c_str()); else diff --git a/modules/commands/ms_info.cpp b/modules/commands/ms_info.cpp index 1cb6199a8..3f132f1d2 100644 --- a/modules/commands/ms_info.cpp +++ b/modules/commands/ms_info.cpp @@ -27,8 +27,8 @@ class CommandMSInfo : public Command User *u = source.u; const MemoInfo *mi; - NickAlias *na = NULL; - ChannelInfo *ci = NULL; + const NickAlias *na = NULL; + ChannelInfo *ci; const Anope::string &nname = !params.empty() ? params[0] : ""; int hardmax = 0; @@ -45,7 +45,8 @@ class CommandMSInfo : public Command } else if (!nname.empty() && nname[0] == '#') { - if (!(ci = cs_findchan(nname))) + ci = cs_findchan(nname); + if (!ci) { source.Reply(CHAN_X_NOT_REGISTERED, nname.c_str()); return; @@ -71,11 +72,11 @@ class CommandMSInfo : public Command if (!nname.empty() && (ci || na->nc != u->Account())) { - if (mi->memos.empty()) + if (mi->memos->empty()) source.Reply(_("%s currently has no memos."), nname.c_str()); - else if (mi->memos.size() == 1) + else if (mi->memos->size() == 1) { - if (mi->memos[0]->HasFlag(MF_UNREAD)) + if (mi->GetMemo(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()); @@ -83,17 +84,17 @@ class CommandMSInfo : public Command else { unsigned count = 0, i, end; - for (i = 0, end = mi->memos.size(); i < end; ++i) - if (mi->memos[i]->HasFlag(MF_UNREAD)) + for (i = 0, end = mi->memos->size(); i < end; ++i) + if (mi->GetMemo(i)->HasFlag(MF_UNREAD)) ++count; - if (count == mi->memos.size()) + 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()); + 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()); + 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); + 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) { @@ -128,11 +129,11 @@ class CommandMSInfo : public Command } else /* !nname || (!ci || na->nc == u->Account()) */ { - if (mi->memos.empty()) + if (mi->memos->empty()) source.Reply(_("You currently have no memos.")); - else if (mi->memos.size() == 1) + else if (mi->memos->size() == 1) { - if (mi->memos[0]->HasFlag(MF_UNREAD)) + if (mi->GetMemo(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.")); @@ -140,17 +141,17 @@ class CommandMSInfo : public Command else { unsigned count = 0, i, end; - for (i = 0, end = mi->memos.size(); i < end; ++i) - if (mi->memos[i]->HasFlag(MF_UNREAD)) + for (i = 0, end = mi->memos->size(); i < end; ++i) + if (mi->GetMemo(i)->HasFlag(MF_UNREAD)) ++count; - if (count == mi->memos.size()) + 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()); + 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()); + 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); + source.Reply(_("You currently have \002%d\002 memos, of which \002%d\002 are unread."), mi->memos->size(), count); } if (!mi->memomax) diff --git a/modules/commands/ms_list.cpp b/modules/commands/ms_list.cpp index 41b0d05a7..bbf245b46 100644 --- a/modules/commands/ms_list.cpp +++ b/modules/commands/ms_list.cpp @@ -27,7 +27,7 @@ class CommandMSList : public Command User *u = source.u; Anope::string param = !params.empty() ? params[0] : "", chan; - ChannelInfo *ci = NULL; + ChannelInfo *ci; const MemoInfo *mi; if (!param.empty() && param[0] == '#') @@ -35,7 +35,8 @@ class CommandMSList : public Command chan = param; param = params.size() > 1 ? params[1] : ""; - if (!(ci = cs_findchan(chan))) + ci = cs_findchan(chan); + if (!ci) { source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str()); return; @@ -52,7 +53,7 @@ class CommandMSList : public Command if (!param.empty() && !isdigit(param[0]) && !param.equals_ci("NEW")) this->OnSyntaxError(source, param); - else if (!mi->memos.size()) + else if (!mi->memos->size()) { if (!chan.empty()) source.Reply(MEMO_X_HAS_NO_MEMOS, chan.c_str()); @@ -79,10 +80,10 @@ class CommandMSList : public Command void HandleNumber(unsigned Number) anope_override { - if (!Number || Number > mi->memos.size()) + if (!Number || Number > mi->memos->size()) return; - Memo *m = mi->memos[Number]; + const Memo *m = mi->GetMemo(Number); ListFormatter::ListEntry entry; entry["Number"] = (m->HasFlag(MF_UNREAD) ? "* " : " ") + stringify(Number + 1); @@ -99,8 +100,8 @@ class CommandMSList : public Command if (!param.empty()) { unsigned i, end; - for (i = 0, end = mi->memos.size(); i < end; ++i) - if (mi->memos[i]->HasFlag(MF_UNREAD)) + for (i = 0, end = mi->memos->size(); i < end; ++i) + if (mi->GetMemo(i)->HasFlag(MF_UNREAD)) break; if (i == end) { @@ -112,12 +113,12 @@ class CommandMSList : public Command } } - for (unsigned i = 0, end = mi->memos.size(); i < end; ++i) + for (unsigned i = 0, end = mi->memos->size(); i < end; ++i) { - if (!param.empty() && !mi->memos[i]->HasFlag(MF_UNREAD)) + if (!param.empty() && !mi->GetMemo(i)->HasFlag(MF_UNREAD)) continue; - Memo *m = mi->memos[i]; + const Memo *m = mi->GetMemo(i); ListFormatter::ListEntry entry; entry["Number"] = (m->HasFlag(MF_UNREAD) ? "* " : " ") + stringify(i + 1); diff --git a/modules/commands/ms_read.cpp b/modules/commands/ms_read.cpp index 01dba1592..c9d0c4345 100644 --- a/modules/commands/ms_read.cpp +++ b/modules/commands/ms_read.cpp @@ -14,19 +14,19 @@ #include "module.h" #include "memoserv.h" -void rsend_notify(CommandSource &source, MemoInfo *mi, Memo *m, const Anope::string &targ) +static 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); + const NickAlias *na = findnick(m->sender); if (!na) return; /* Get nick core for sender */ - NickCore *nc = na->nc; + const NickCore *nc = na->nc; if (!nc) return; @@ -52,23 +52,23 @@ class MemoListCallback : public NumberList { CommandSource &source; MemoInfo *mi; - ChannelInfo *ci; + const ChannelInfo *ci; public: - MemoListCallback(CommandSource &_source, MemoInfo *_mi, ChannelInfo *_ci, const Anope::string &numlist) : NumberList(numlist, false), source(_source), mi(_mi), ci(_ci) + MemoListCallback(CommandSource &_source, MemoInfo *_mi, const ChannelInfo *_ci, const Anope::string &numlist) : NumberList(numlist, false), source(_source), mi(_mi), ci(_ci) { } void HandleNumber(unsigned Number) anope_override { - if (!Number || Number > mi->memos.size()) + if (!Number || Number > mi->memos->size()) return; MemoListCallback::DoRead(source, mi, ci, Number - 1); } - static void DoRead(CommandSource &source, MemoInfo *mi, ChannelInfo *ci, unsigned index) + static void DoRead(CommandSource &source, MemoInfo *mi, const ChannelInfo *ci, unsigned index) { - Memo *m = mi->memos[index]; + Memo *m = mi->GetMemo(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 @@ -96,7 +96,7 @@ class CommandMSRead : public Command User *u = source.u; MemoInfo *mi; - ChannelInfo *ci = NULL; + ChannelInfo *ci; Anope::string numstr = params[0], chan; if (!numstr.empty() && numstr[0] == '#') @@ -104,7 +104,8 @@ class CommandMSRead : public Command chan = numstr; numstr = params.size() > 1 ? params[1] : ""; - if (!(ci = cs_findchan(chan))) + ci = cs_findchan(chan); + if (!ci) { source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str()); return; @@ -117,11 +118,11 @@ class CommandMSRead : public Command mi = &ci->memos; } else - mi = &u->Account()->memos; + mi = const_cast<MemoInfo *>(&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()) + else if (mi->memos->empty()) { if (!chan.empty()) source.Reply(MEMO_X_HAS_NO_MEMOS, chan.c_str()); @@ -135,8 +136,8 @@ class CommandMSRead : public Command 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)) + for (i = 0, end = mi->memos->size(); i < end; ++i) + if (mi->GetMemo(i)->HasFlag(MF_UNREAD)) { MemoListCallback::DoRead(source, mi, ci, i); ++readcount; @@ -151,7 +152,7 @@ class CommandMSRead : public Command } else if (numstr.equals_ci("LAST")) { - for (i = 0, end = mi->memos.size() - 1; i < end; ++i); + for (i = 0, end = mi->memos->size() - 1; i < end; ++i); MemoListCallback::DoRead(source, mi, ci, i); } else /* number[s] */ diff --git a/modules/commands/ms_rsend.cpp b/modules/commands/ms_rsend.cpp index aca957b05..bf5292dbc 100644 --- a/modules/commands/ms_rsend.cpp +++ b/modules/commands/ms_rsend.cpp @@ -32,7 +32,7 @@ class CommandMSRSend : public Command const Anope::string &nick = params[0]; const Anope::string &text = params[1]; - NickAlias *na = NULL; + const NickAlias *na = NULL; /* prevent user from rsend to themselves */ if ((na = findnick(nick)) && na->nc == u->Account()) @@ -65,7 +65,7 @@ class CommandMSRSend : public Command 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); + Memo *m = (mi->memos->size() ? mi->GetMemo(mi->memos->size() - 1) : NULL); if (m != NULL) m->SetFlag(MF_RECEIPT); } diff --git a/modules/commands/ms_sendall.cpp b/modules/commands/ms_sendall.cpp index db72a4905..5a7abdd70 100644 --- a/modules/commands/ms_sendall.cpp +++ b/modules/commands/ms_sendall.cpp @@ -37,11 +37,11 @@ class CommandMSSendAll : public Command return; } - NickAlias *na = findnick(u->nick); + const NickAlias *na = findnick(u->nick); - for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it) + for (nickcore_map::const_iterator it = NickCoreList->begin(), it_end = NickCoreList->end(); it != it_end; ++it) { - NickCore *nc = it->second; + const NickCore *nc = it->second; if ((na && na->nc == nc) || !nc->display.equals_ci(u->nick)) memoserv->Send(u->nick, nc->display, text); diff --git a/modules/commands/ms_set.cpp b/modules/commands/ms_set.cpp index b4ffa95c1..ee159c466 100644 --- a/modules/commands/ms_set.cpp +++ b/modules/commands/ms_set.cpp @@ -20,30 +20,31 @@ class CommandMSSet : public Command { User *u = source.u; const Anope::string ¶m = params[1]; + NickCore *nc = u->Account(); if (param.equals_ci("ON")) { - u->Account()->SetFlag(NI_MEMO_SIGNON); - u->Account()->SetFlag(NI_MEMO_RECEIVE); + nc->SetFlag(NI_MEMO_SIGNON); + nc->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); + nc->SetFlag(NI_MEMO_SIGNON); + nc->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); + nc->UnsetFlag(NI_MEMO_SIGNON); + nc->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()) + if (!nc->email.empty()) { - u->Account()->SetFlag(NI_MEMO_MAIL); + nc->SetFlag(NI_MEMO_MAIL); source.Reply(_("You will now be informed about new memos via email.")); } else @@ -51,14 +52,14 @@ class CommandMSSet : public Command } else if (param.equals_ci("NOMAIL")) { - u->Account()->UnsetFlag(NI_MEMO_MAIL); + nc->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); + nc->UnsetFlag(NI_MEMO_SIGNON); + nc->UnsetFlag(NI_MEMO_RECEIVE); + nc->UnsetFlag(NI_MEMO_MAIL); source.Reply(_("%s will not send you any notification of memos."), Config->MemoServ.c_str()); } else @@ -86,7 +87,9 @@ class CommandMSSet : public Command p1 = p2; p2 = p3; p3 = params.size() > 4 ? params[4] : ""; - if (!(ci = cs_findchan(chan))) + + ci = cs_findchan(chan); + if (!ci) { source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str()); return; @@ -102,14 +105,14 @@ class CommandMSSet : public Command { if (!p2.empty() && !p2.equals_ci("HARD") && chan.empty()) { - NickAlias *na; + const NickAlias *na; if (!(na = findnick(p1))) { source.Reply(NICK_X_NOT_REGISTERED, p1.c_str()); return; } user = p1; - mi = &na->nc->memos; + mi = const_cast<MemoInfo *>(&na->nc->memos); nc = na->nc; p1 = p2; p2 = p3; @@ -209,7 +212,7 @@ class CommandMSSet : public Command { User *u = source.u; const Anope::string &cmd = params[0]; - MemoInfo *mi = &u->Account()->memos; + MemoInfo *mi = const_cast<MemoInfo *>(&u->Account()->memos); if (readonly) source.Reply(_("Sorry, memo option setting is temporarily disabled.")); diff --git a/modules/commands/ms_staff.cpp b/modules/commands/ms_staff.cpp index 254a12b7b..adfe51d68 100644 --- a/modules/commands/ms_staff.cpp +++ b/modules/commands/ms_staff.cpp @@ -36,9 +36,9 @@ class CommandMSStaff : public Command return; } - for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it) + for (nickcore_map::const_iterator it = NickCoreList->begin(), it_end = NickCoreList->end(); it != it_end; ++it) { - NickCore *nc = it->second; + const NickCore *nc = it->second; if (nc->IsServicesOper()) memoserv->Send(source.u->nick, nc->display, text, true); diff --git a/modules/commands/ns_access.cpp b/modules/commands/ns_access.cpp index 2d63c472e..48a06d088 100644 --- a/modules/commands/ns_access.cpp +++ b/modules/commands/ns_access.cpp @@ -18,7 +18,6 @@ class CommandNSAccess : public Command private: void DoAdd(CommandSource &source, NickCore *nc, const Anope::string &mask) { - if (mask.empty()) { this->OnSyntaxError(source, "ADD"); @@ -110,7 +109,7 @@ class CommandNSAccess : public Command NickCore *nc; if (!nick.empty()) { - NickAlias *na = findnick(nick); + const NickAlias *na = findnick(nick); if (na == NULL) { source.Reply(NICK_X_NOT_REGISTERED, nick.c_str()); diff --git a/modules/commands/ns_ajoin.cpp b/modules/commands/ns_ajoin.cpp index 2e64ebfe0..50bce89e3 100644 --- a/modules/commands/ns_ajoin.cpp +++ b/modules/commands/ns_ajoin.cpp @@ -15,18 +15,18 @@ struct AJoinList : std::vector<std::pair<Anope::string, Anope::string> >, ExtensibleItem, Serializable { - NickCore *nc; + serialize_obj<NickCore> nc; AJoinList(NickCore *n) : nc(n) { } - Anope::string serialize_name() const anope_override + const Anope::string serialize_name() const anope_override { return "AJoinList"; } - serialized_data serialize() anope_override + Serialize::Data serialize() const anope_override { - serialized_data sd; + Serialize::Data sd; sd["nc"] << this->nc->display; Anope::string channels; @@ -43,14 +43,20 @@ struct AJoinList : std::vector<std::pair<Anope::string, Anope::string> >, Extens return sd; } - static void unserialize(serialized_data &sd) + static Serializable* unserialize(Serializable *obj, Serialize::Data &sd) { NickCore *nc = findcore(sd["nc"].astr()); if (nc == NULL) - return; + return NULL; - AJoinList *aj = new AJoinList(nc); - nc->Extend("ns_ajoin_channels", aj); + AJoinList *aj; + if (obj) + aj = debug_cast<AJoinList *>(obj); + else + { + aj = new AJoinList(nc); + nc->Extend("ns_ajoin_channels", aj); + } Anope::string token; spacesepstream ssep(sd["channels"].astr()); @@ -68,6 +74,8 @@ struct AJoinList : std::vector<std::pair<Anope::string, Anope::string> >, Extens aj->push_back(std::make_pair(chan, key)); } + + return aj; } }; @@ -200,7 +208,7 @@ class NSAJoin : public Module void OnNickIdentify(User *u) anope_override { AJoinList *channels = u->Account()->GetExt<AJoinList *>("ns_ajoin_channels"); - BotInfo *bi = findbot(Config->NickServ); + const BotInfo *bi = findbot(Config->NickServ); if (channels == NULL || bi == NULL) return; @@ -208,9 +216,12 @@ class NSAJoin : public Module for (unsigned i = 0; i < channels->size(); ++i) { Channel *c = findchan(channels->at(i).first); - ChannelInfo *ci = c != NULL ? c->ci : cs_findchan(channels->at(i).first); - if (c == NULL && ci != NULL) - c = ci->c; + ChannelInfo *ci; + + if (c) + ci = c->ci; + else + ci = cs_findchan(channels->at(i).first); bool need_invite = false; Anope::string key = channels->at(i).second; diff --git a/modules/commands/ns_alist.cpp b/modules/commands/ns_alist.cpp index abb8c722c..3ce429e7d 100644 --- a/modules/commands/ns_alist.cpp +++ b/modules/commands/ns_alist.cpp @@ -30,7 +30,7 @@ class CommandNSAList : public Command if (params.size() && u->IsServicesOper()) nick = params[0]; - NickAlias *na = findnick(nick); + const NickAlias *na = findnick(nick); if (!na) { @@ -45,7 +45,7 @@ class CommandNSAList : public Command source.Reply(_("Channels that \002%s\002 has access on:"), na->nick.c_str()); - for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it) + for (registered_channel_map::const_iterator it = RegisteredChannelList->begin(), it_end = RegisteredChannelList->end(); it != it_end; ++it) { ChannelInfo *ci = it->second; ListFormatter::ListEntry entry; diff --git a/modules/commands/ns_cert.cpp b/modules/commands/ns_cert.cpp index 6ad106161..2117ed994 100644 --- a/modules/commands/ns_cert.cpp +++ b/modules/commands/ns_cert.cpp @@ -16,7 +16,7 @@ class CommandNSCert : public Command { private: - void DoServAdminList(CommandSource &source, NickCore *nc) + void DoServAdminList(CommandSource &source, const NickCore *nc) { if (nc->cert.empty()) { @@ -112,7 +112,7 @@ class CommandNSCert : public Command return; } - void DoList(CommandSource &source, NickCore *nc) + void DoList(CommandSource &source, const NickCore *nc) { User *u = source.u; @@ -154,18 +154,20 @@ class CommandNSCert : public Command const Anope::string &cmd = params[0]; const Anope::string &mask = params.size() > 1 ? params[1] : ""; - NickAlias *na; + const NickAlias *na; if (cmd.equals_ci("LIST") && u->IsServicesOper() && !mask.empty() && (na = findnick(mask))) return this->DoServAdminList(source, na->nc); + NickCore *nc = u->Account(); + 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); + return this->DoAdd(source, nc, mask); else if (cmd.equals_ci("DEL")) - return this->DoDel(source, u->Account(), mask); + return this->DoDel(source, nc, mask); else if (cmd.equals_ci("LIST")) - return this->DoList(source, u->Account()); + return this->DoList(source, nc); else this->OnSyntaxError(source, cmd); @@ -203,7 +205,7 @@ class NSCert : public Module void DoAutoIdentify(User *u) { - BotInfo *bi = findbot(Config->NickServ); + const BotInfo *bi = findbot(Config->NickServ); NickAlias *na = findnick(u->nick); if (!bi || !na) return; diff --git a/modules/commands/ns_drop.cpp b/modules/commands/ns_drop.cpp index 0bb6eecc2..3f3a5dd46 100644 --- a/modules/commands/ns_drop.cpp +++ b/modules/commands/ns_drop.cpp @@ -63,7 +63,7 @@ class CommandNSDrop : public Command 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; + na->destroy(); if (!is_mine) { diff --git a/modules/commands/ns_getemail.cpp b/modules/commands/ns_getemail.cpp index f8ace530d..6301ddd4e 100644 --- a/modules/commands/ns_getemail.cpp +++ b/modules/commands/ns_getemail.cpp @@ -34,9 +34,9 @@ class CommandNSGetEMail : public Command Log(LOG_ADMIN, u, this) << "on " << email; - for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it) + for (nickcore_map::const_iterator it = NickCoreList->begin(), it_end = NickCoreList->end(); it != it_end; ++it) { - NickCore *nc = it->second; + const NickCore *nc = it->second; if (!nc->email.empty() && nc->email.equals_ci(email)) { diff --git a/modules/commands/ns_getpass.cpp b/modules/commands/ns_getpass.cpp index 8ffc85520..f8c044119 100644 --- a/modules/commands/ns_getpass.cpp +++ b/modules/commands/ns_getpass.cpp @@ -27,7 +27,7 @@ class CommandNSGetPass : public Command User *u = source.u; const Anope::string &nick = params[0]; Anope::string tmp_pass; - NickAlias *na; + const NickAlias *na; if (!(na = findnick(nick))) source.Reply(NICK_X_NOT_REGISTERED, nick.c_str()); diff --git a/modules/commands/ns_ghost.cpp b/modules/commands/ns_ghost.cpp index 8b861e889..f68ddb83e 100644 --- a/modules/commands/ns_ghost.cpp +++ b/modules/commands/ns_ghost.cpp @@ -30,7 +30,7 @@ class CommandNSGhost : public Command User *u = source.u; User *user = finduser(nick); - NickAlias *na = findnick(nick); + const NickAlias *na = findnick(nick); if (!user) source.Reply(NICK_X_NOT_IN_USE, nick.c_str()); diff --git a/modules/commands/ns_group.cpp b/modules/commands/ns_group.cpp index 2f8617c11..dad004eee 100644 --- a/modules/commands/ns_group.cpp +++ b/modules/commands/ns_group.cpp @@ -58,7 +58,7 @@ class CommandNSGroup : public Command 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) + 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()); @@ -88,7 +88,7 @@ class CommandNSGroup : public Command * If not, check that it is valid. */ if (na) - delete na; + na->destroy(); else { size_t prefixlen = Config->NSGuestNickPrefix.length(); @@ -108,7 +108,7 @@ class CommandNSGroup : public Command na->last_realname = u->realname; na->time_registered = na->last_seen = Anope::CurTime; - u->Login(na->nc); + u->Login(target->nc); ircdproto->SendLogin(u); if (!Config->NoNicknameOwnership && na->nc == u->Account() && na->nc->HasFlag(NI_UNCONFIRMED) == false) u->SetMode(findbot(Config->NickServ), UMODE_REGISTERED); @@ -188,22 +188,23 @@ class CommandNSUngroup : public Command { NickCore *oldcore = na->nc; - std::list<NickAlias *>::iterator it = std::find(oldcore->aliases.begin(), oldcore->aliases.end(), na); + std::list<serialize_obj<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); + NickCore *nc = new NickCore(na->nick); + na->nc = nc; + nc->aliases.push_back(na); - na->nc->pass = oldcore->pass; + nc->pass = oldcore->pass; if (!oldcore->email.empty()) - na->nc->email = oldcore->email; + nc->email = oldcore->email; if (!oldcore->greet.empty()) - na->nc->greet = oldcore->greet; - na->nc->language = oldcore->language; + nc->greet = oldcore->greet; + nc->language = oldcore->language; source.Reply(_("Nick %s has been ungrouped from %s."), na->nick.c_str(), oldcore->display.c_str()); @@ -240,37 +241,50 @@ class CommandNSGList : public Command void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { User *u = source.u; - Anope::string nick = !params.empty() ? params[0] : ""; - - const NickCore *nc = u->Account(); + const Anope::string &nick = !params.empty() ? params[0] : ""; + const NickCore *nc; - 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 + if (!nick.empty()) { - ListFormatter list; - list.addColumn("Nick").addColumn("Expires"); - for (std::list<NickAlias *>::const_iterator it = nc->aliases.begin(), it_end = nc->aliases.end(); it != it_end; ++it) + const NickAlias *na = findnick(nick); + if (!na) { - NickAlias *na2 = *it; - - ListFormatter::ListEntry entry; - entry["Nick"] = na2->nick; - entry["Expires"] = (na2->HasFlag(NS_NO_EXPIRE) || !Config->NSExpire) ? "Does not expire" : ("expires in " + do_strftime(na2->last_seen + Config->NSExpire)); - list.addEntry(entry); + source.Reply(NICK_X_NOT_REGISTERED, nick.c_str()); + return; + } + else if (!u->IsServicesOper()) + { + source.Reply(ACCESS_DENIED, Config->NickServ.c_str()); + return; } - source.Reply(!nick.empty() ? _("List of nicknames in the group of \002%s\002:") : _("List of nicknames in your group:"), nc->display.c_str()); - std::vector<Anope::string> replies; - list.Process(replies); - - for (unsigned i = 0; i < replies.size(); ++i) - source.Reply(replies[i]); + nc = na->nc; + } + else + nc = u->Account(); - source.Reply(_("%d nicknames in the group."), nc->aliases.size()); + ListFormatter list; + list.addColumn("Nick").addColumn("Expires"); + for (std::list<serialize_obj<NickAlias> >::const_iterator it = nc->aliases.begin(), it_end = nc->aliases.end(); it != it_end;) + { + const NickAlias *na2 = *it++; + if (!na2) + continue; + + ListFormatter::ListEntry entry; + entry["Nick"] = na2->nick; + entry["Expires"] = (na2->HasFlag(NS_NO_EXPIRE) || !Config->NSExpire) ? "Does not expire" : ("expires in " + do_strftime(na2->last_seen + Config->NSExpire)); + list.addEntry(entry); } + + source.Reply(!nick.empty() ? _("List of nicknames in the group of \002%s\002:") : _("List of nicknames in your group:"), nc->display.c_str()); + std::vector<Anope::string> replies; + list.Process(replies); + + for (unsigned i = 0; i < replies.size(); ++i) + source.Reply(replies[i]); + + source.Reply(_("%d nicknames in the group."), nc->aliases.size()); } bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override diff --git a/modules/commands/ns_info.cpp b/modules/commands/ns_info.cpp index a30b5452b..20ed6ee42 100644 --- a/modules/commands/ns_info.cpp +++ b/modules/commands/ns_info.cpp @@ -16,7 +16,7 @@ class CommandNSInfo : public Command { private: - template<typename T, unsigned END> void CheckOptStr(User *u, Anope::string &buf, T opt, const char *str, Flags<T, END> *nc, bool reverse_logic = false) + template<typename T, unsigned END> void CheckOptStr(User *u, Anope::string &buf, T opt, const char *str, const Flags<T, END> *nc, bool reverse_logic = false) { if (reverse_logic ? !nc->HasFlag(opt) : nc->HasFlag(opt)) { diff --git a/modules/commands/ns_list.cpp b/modules/commands/ns_list.cpp index de2852302..2c27f4d47 100644 --- a/modules/commands/ns_list.cpp +++ b/modules/commands/ns_list.cpp @@ -75,9 +75,9 @@ class CommandNSList : public Command list.addColumn("Nick").addColumn("Last usermask"); - for (nickalias_map::const_iterator it = NickAliasList.begin(), it_end = NickAliasList.end(); it != it_end; ++it) + for (nickalias_map::const_iterator it = NickAliasList->begin(), it_end = NickAliasList->end(); it != it_end; ++it) { - NickAlias *na = it->second; + const NickAlias *na = it->second; /* Don't show private nicks to non-services admins. */ if (na->nc->HasFlag(NI_PRIVATE) && !is_servadmin && na->nc != mync) diff --git a/modules/commands/ns_register.cpp b/modules/commands/ns_register.cpp index 6050e88fb..bbac6d766 100644 --- a/modules/commands/ns_register.cpp +++ b/modules/commands/ns_register.cpp @@ -13,7 +13,12 @@ #include "module.h" -static bool SendRegmail(User *u, NickAlias *na, BotInfo *bi); +static bool SendRegmail(User *u, const NickAlias *na, const BotInfo *bi); + +struct ExtensibleString : Anope::string, ExtensibleItem +{ + ExtensibleString(const Anope::string &s) : Anope::string(s) { } +}; class CommandNSConfirm : public Command { @@ -49,13 +54,14 @@ class CommandNSConfirm : public Command Anope::string *code = u->Account()->GetExt<ExtensibleString *>("ns_register_passcode"); if (code != NULL && *code == passcode) { - u->Account()->Shrink("ns_register_passcode"); + NickCore *nc = u->Account(); + nc->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); + nc->UnsetFlag(NI_UNCONFIRMED); ircdproto->SendLogin(u); - NickAlias *na = findnick(u->nick); + const NickAlias *na = findnick(u->nick); if (!Config->NoNicknameOwnership && na != NULL && na->nc == u->Account() && na->nc->HasFlag(NI_UNCONFIRMED) == false) u->SetMode(findbot(Config->NickServ), UMODE_REGISTERED); } @@ -170,18 +176,19 @@ class CommandNSRegister : public Command source.Reply(MAIL_X_INVALID, email.c_str()); else { - na = new NickAlias(u->nick, new NickCore(u->nick)); - enc_encrypt(pass, na->nc->pass); + NickCore *nc = new NickCore(u->nick); + na = new NickAlias(u->nick, nc); + enc_encrypt(pass, nc->pass); if (!email.empty()) - na->nc->email = email; + 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)); + nc->AddAccess(create_mask(u)); - u->Login(na->nc); + u->Login(nc); Log(LOG_COMMAND, u, this) << "to register " << na->nick << " (email: " << (!na->nc->email.empty() ? na->nc->email : "none") << ")"; @@ -198,12 +205,12 @@ class CommandNSRegister : public Command if (Config->NSRegistration.equals_ci("admin")) { - na->nc->SetFlag(NI_UNCONFIRMED); + nc->SetFlag(NI_UNCONFIRMED); source.Reply(_("All new accounts must be validated by an administrator. Please wait for your registration to be confirmed.")); } else if (Config->NSRegistration.equals_ci("mail")) { - na->nc->SetFlag(NI_UNCONFIRMED); + 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()); @@ -276,7 +283,7 @@ class CommandNSResend : public Command return; User *u = source.u; - NickAlias *na = findnick(u->nick); + const NickAlias *na = findnick(u->nick); if (na == NULL) source.Reply(NICK_NOT_REGISTERED); @@ -335,8 +342,10 @@ class NSRegister : public Module } }; -static bool SendRegmail(User *u, NickAlias *na, BotInfo *bi) +static bool SendRegmail(User *u, const NickAlias *na, const BotInfo *bi) { + NickCore *nc = na->nc; + Anope::string *code = na->nc->GetExt<ExtensibleString *>("ns_register_passcode"); Anope::string codebuf; if (code == NULL) @@ -351,7 +360,7 @@ static bool SendRegmail(User *u, NickAlias *na, BotInfo *bi) int idx, min = 1, max = 62; for (idx = 0; idx < 9; ++idx) codebuf += chars[1 + static_cast<int>((static_cast<float>(max - min)) * static_cast<uint16_t>(rand()) / 65536.0) + min]; - na->nc->Extend("ns_register_passcode", new ExtensibleString(codebuf)); + nc->Extend("ns_register_passcode", new ExtensibleString(codebuf)); } else codebuf = *code; @@ -367,7 +376,7 @@ static bool SendRegmail(User *u, NickAlias *na, BotInfo *bi) message = message.replace_all_cs("%N", Config->NetworkName); message = message.replace_all_cs("%c", codebuf); - return Mail(u, na->nc, bi, subject, message); + return Mail(u, nc, bi, subject, message); } MODULE_INIT(NSRegister) diff --git a/modules/commands/ns_resetpass.cpp b/modules/commands/ns_resetpass.cpp index f0dfe1aad..21c5d7a4f 100644 --- a/modules/commands/ns_resetpass.cpp +++ b/modules/commands/ns_resetpass.cpp @@ -13,7 +13,7 @@ #include "module.h" -static bool SendResetEmail(User *u, NickAlias *na, BotInfo *bi); +static bool SendResetEmail(User *u, const NickAlias *na, const BotInfo *bi); class CommandNSResetPass : public Command { @@ -28,7 +28,7 @@ class CommandNSResetPass : public Command void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { User *u = source.u; - NickAlias *na; + const NickAlias *na; if (Config->RestrictMail && (!u->Account() || !u->HasCommand("nickserv/resetpass"))) source.Reply(ACCESS_DENIED); @@ -89,19 +89,20 @@ class NSResetPass : public Module ResetInfo *ri = na ? na->nc->GetExt<ResetInfo *>("ns_resetpass") : NULL; if (na && ri) { + NickCore *nc = na->nc; const Anope::string &passcode = params[1]; if (ri->time < Anope::CurTime - 3600) { - na->nc->Shrink("ns_resetpass"); + nc->Shrink("ns_resetpass"); source.Reply(_("Your password reset request has expired.")); } else if (passcode.equals_cs(ri->code)) { - na->nc->Shrink("ns_resetpass"); + nc->Shrink("ns_resetpass"); Log(LOG_COMMAND, u, &commandnsresetpass) << "confirmed RESETPASS to forcefully identify to " << na->nick; - na->nc->UnsetFlag(NI_UNCONFIRMED); + nc->UnsetFlag(NI_UNCONFIRMED); u->Identify(na); source.Reply(_("You are now identified for your nick. Change your password now.")); @@ -118,7 +119,7 @@ class NSResetPass : public Module } }; -static bool SendResetEmail(User *u, NickAlias *na, BotInfo *bi) +static bool SendResetEmail(User *u, const NickAlias *na, const BotInfo *bi) { int min = 1, max = 62; int chars[] = { @@ -148,9 +149,10 @@ static bool SendResetEmail(User *u, NickAlias *na, BotInfo *bi) ResetInfo *ri = new ResetInfo; ri->code = passcode; ri->time = Anope::CurTime; - na->nc->Extend("ns_resetpass", ri); + NickCore *nc = na->nc; + nc->Extend("ns_resetpass", ri); - return Mail(u, na->nc, bi, subject, message); + return Mail(u, nc, bi, subject, message); } MODULE_INIT(NSResetPass) diff --git a/modules/commands/ns_saset.cpp b/modules/commands/ns_saset.cpp index 1b77c2b57..3721dcda3 100644 --- a/modules/commands/ns_saset.cpp +++ b/modules/commands/ns_saset.cpp @@ -33,10 +33,10 @@ class CommandNSSASet : public Command 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) + for (BotInfo::command_map::const_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; + const CommandInfo &info = it->second; if (c_name.find_ci(this_name + " ") == 0) { @@ -67,7 +67,7 @@ class CommandNSSASetPassword : public Command void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override { User *u = source.u; - NickAlias *setter_na = findnick(params[0]); + const NickAlias *setter_na = findnick(params[0]); if (setter_na == NULL) { source.Reply(NICK_X_NOT_REGISTERED, params[0].c_str()); diff --git a/modules/commands/ns_sendpass.cpp b/modules/commands/ns_sendpass.cpp index 678518d5d..deff5419c 100644 --- a/modules/commands/ns_sendpass.cpp +++ b/modules/commands/ns_sendpass.cpp @@ -13,7 +13,7 @@ #include "module.h" -static bool SendPassMail(User *u, NickAlias *na, BotInfo *bi, const Anope::string &pass); +static bool SendPassMail(User *u, const NickAlias *na, const BotInfo *bi, const Anope::string &pass); class CommandNSSendPass : public Command { @@ -29,7 +29,7 @@ class CommandNSSendPass : public Command { User *u = source.u; const Anope::string &nick = params[0]; - NickAlias *na; + const NickAlias *na; if (Config->RestrictMail && (!u->Account() || !u->HasCommand("nickserv/sendpass"))) source.Reply(ACCESS_DENIED); @@ -86,7 +86,7 @@ class NSSendPass : public Module } }; -static bool SendPassMail(User *u, NickAlias *na, BotInfo *bi, const Anope::string &pass) +static bool SendPassMail(User *u, const NickAlias *na, const BotInfo *bi, const Anope::string &pass) { Anope::string subject = translate(na->nc, Config->MailSendpassSubject.c_str()); Anope::string message = translate(na->nc, Config->MailSendpassMessage.c_str()); diff --git a/modules/commands/ns_set.cpp b/modules/commands/ns_set.cpp index d81c4c3c8..110373853 100644 --- a/modules/commands/ns_set.cpp +++ b/modules/commands/ns_set.cpp @@ -34,10 +34,10 @@ class CommandNSSet : public Command 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) + for (BotInfo::command_map::const_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; + const CommandInfo &info = it->second; if (c_name.find_ci(this_name + " ") == 0) { diff --git a/modules/commands/ns_set_autoop.cpp b/modules/commands/ns_set_autoop.cpp index 452717c3d..0cf9c649a 100644 --- a/modules/commands/ns_set_autoop.cpp +++ b/modules/commands/ns_set_autoop.cpp @@ -24,7 +24,7 @@ class CommandNSSetAutoOp : public Command void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m) { - NickAlias *na = findnick(user); + const NickAlias *na = findnick(user); if (na == NULL) { source.Reply(NICK_X_NOT_REGISTERED, user.c_str()); diff --git a/modules/commands/ns_set_display.cpp b/modules/commands/ns_set_display.cpp index e89655f06..3a4973181 100644 --- a/modules/commands/ns_set_display.cpp +++ b/modules/commands/ns_set_display.cpp @@ -24,14 +24,14 @@ class CommandNSSetDisplay : public Command void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m) { - NickAlias *user_na = findnick(user), *na = findnick(param); + const NickAlias *user_na = findnick(user), *na = findnick(param); if (user_na == NULL) { source.Reply(NICK_X_NOT_REGISTERED, user.c_str()); return; } - else if (!na || na->nc != user_na->nc) + else if (!na || *na->nc != *user_na->nc) { source.Reply(_("The new display MUST be a nickname of the nickname group %s"), user_na->nc->display.c_str()); return; diff --git a/modules/commands/ns_set_email.cpp b/modules/commands/ns_set_email.cpp index 09ef8732c..e8b2778e5 100644 --- a/modules/commands/ns_set_email.cpp +++ b/modules/commands/ns_set_email.cpp @@ -13,7 +13,12 @@ #include "module.h" -static bool SendConfirmMail(User *u, BotInfo *bi) +struct ExtensibleString : Anope::string, ExtensibleItem +{ + ExtensibleString(const Anope::string &s) : Anope::string(s) { } +}; + +static bool SendConfirmMail(User *u, const BotInfo *bi) { int chars[] = { ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', @@ -26,6 +31,7 @@ static bool SendConfirmMail(User *u, BotInfo *bi) Anope::string code; for (idx = 0; idx < 9; ++idx) code += chars[1 + static_cast<int>((static_cast<float>(max - min)) * static_cast<uint16_t>(rand()) / 65536.0) + min]; + u->Account()->Extend("ns_set_email_passcode", new ExtensibleString(code)); Anope::string subject = Config->MailEmailchangeSubject; @@ -54,7 +60,7 @@ class CommandNSSetEmail : public Command void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m) { User *u = source.u; - NickAlias *na = findnick(user); + const NickAlias *na = findnick(user); if (!na) { source.Reply(NICK_X_NOT_REGISTERED, user.c_str()); @@ -168,11 +174,12 @@ class NSSetEmail : public Module { if (params[0] == *passcode) { - u->Account()->email = *new_email; + NickCore *uac = u->Account(); + uac->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"); + uac->Shrink("ns_set_email"); + uac->Shrink("ns_set_email_passcode"); return EVENT_STOP; } } diff --git a/modules/commands/ns_set_greet.cpp b/modules/commands/ns_set_greet.cpp index ed620dc05..0bdb1b371 100644 --- a/modules/commands/ns_set_greet.cpp +++ b/modules/commands/ns_set_greet.cpp @@ -24,7 +24,7 @@ class CommandNSSetGreet : public Command void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m) { - NickAlias *na = findnick(user); + const NickAlias *na = findnick(user); if (!na) { source.Reply(NICK_X_NOT_REGISTERED, user.c_str()); diff --git a/modules/commands/ns_set_hide.cpp b/modules/commands/ns_set_hide.cpp index 8d0ee7fb3..1bdecb181 100644 --- a/modules/commands/ns_set_hide.cpp +++ b/modules/commands/ns_set_hide.cpp @@ -24,7 +24,7 @@ class CommandNSSetHide : public Command void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m, const Anope::string &arg) { - NickAlias *na = findnick(user); + const NickAlias *na = findnick(user); if (!na) { source.Reply(NICK_X_NOT_REGISTERED, user.c_str()); diff --git a/modules/commands/ns_set_kill.cpp b/modules/commands/ns_set_kill.cpp index 0fc64196d..d2e40268e 100644 --- a/modules/commands/ns_set_kill.cpp +++ b/modules/commands/ns_set_kill.cpp @@ -24,7 +24,7 @@ class CommandNSSetKill : public Command void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m) { - NickAlias *na = findnick(user); + const NickAlias *na = findnick(user); if (!na) { source.Reply(NICK_X_NOT_REGISTERED, user.c_str()); diff --git a/modules/commands/ns_set_language.cpp b/modules/commands/ns_set_language.cpp index ecd8d9259..4d3ba2c0e 100644 --- a/modules/commands/ns_set_language.cpp +++ b/modules/commands/ns_set_language.cpp @@ -24,7 +24,7 @@ class CommandNSSetLanguage : public Command void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m) { - NickAlias *na = findnick(user); + const NickAlias *na = findnick(user); if (!na) { source.Reply(NICK_X_NOT_REGISTERED, user.c_str()); diff --git a/modules/commands/ns_set_message.cpp b/modules/commands/ns_set_message.cpp index cb0d5107a..06aae4748 100644 --- a/modules/commands/ns_set_message.cpp +++ b/modules/commands/ns_set_message.cpp @@ -24,7 +24,7 @@ class CommandNSSetMessage : public Command void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m) { - NickAlias *na = findnick(user); + const NickAlias *na = findnick(user); if (!na) { source.Reply(NICK_X_NOT_REGISTERED, user.c_str()); diff --git a/modules/commands/ns_set_misc.cpp b/modules/commands/ns_set_misc.cpp index 184eddf40..f09b4ddee 100644 --- a/modules/commands/ns_set_misc.cpp +++ b/modules/commands/ns_set_misc.cpp @@ -13,9 +13,9 @@ #include "module.h" -struct NSMiscData : Anope::string, ExtensibleItem, Serializable +struct NSMiscData : ExtensibleItem, Serializable { - NickCore *nc; + serialize_obj<NickCore> nc; Anope::string name; Anope::string data; @@ -23,14 +23,14 @@ struct NSMiscData : Anope::string, ExtensibleItem, Serializable { } - Anope::string serialize_name() const anope_override + const Anope::string serialize_name() const anope_override { return "NSMiscData"; } - serialized_data serialize() anope_override + Serialize::Data serialize() const anope_override { - serialized_data sdata; + Serialize::Data sdata; sdata["nc"] << this->nc->display; sdata["name"] << this->name; @@ -39,13 +39,27 @@ struct NSMiscData : Anope::string, ExtensibleItem, Serializable return sdata; } - static void unserialize(serialized_data &data) + static Serializable* unserialize(Serializable *obj, Serialize::Data &data) { NickCore *nc = findcore(data["nc"].astr()); if (nc == NULL) - return; + return NULL; + + NSMiscData *d; + if (obj) + { + d = debug_cast<NSMiscData *>(obj); + d->nc = nc; + data["name"] >> d->name; + data["data"] >> d->data; + } + else + { + d = new NSMiscData(nc, data["name"].astr(), data["data"].astr()); + nc->Extend(data["name"].astr(), d); + } - nc->Extend(data["name"].astr(), new NSMiscData(nc, data["name"].astr(), data["data"].astr())); + return d; } }; @@ -67,7 +81,7 @@ class CommandNSSetMisc : public Command void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m) { - NickAlias *na = findnick(user); + const NickAlias *na = findnick(user); if (!na) { source.Reply(NICK_X_NOT_REGISTERED, user.c_str()); diff --git a/modules/commands/ns_set_private.cpp b/modules/commands/ns_set_private.cpp index a7d29b39c..7b175942d 100644 --- a/modules/commands/ns_set_private.cpp +++ b/modules/commands/ns_set_private.cpp @@ -24,7 +24,7 @@ class CommandNSSetPrivate : public Command void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m) { - NickAlias *na = findnick(user); + const NickAlias *na = findnick(user); if (!na) { source.Reply(NICK_X_NOT_REGISTERED, user.c_str()); diff --git a/modules/commands/ns_set_secure.cpp b/modules/commands/ns_set_secure.cpp index 3827197ba..46be1a250 100644 --- a/modules/commands/ns_set_secure.cpp +++ b/modules/commands/ns_set_secure.cpp @@ -24,7 +24,7 @@ class CommandNSSetSecure : public Command void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m) { - NickAlias *na = findnick(user); + const NickAlias *na = findnick(user); if (!na) { source.Reply(NICK_X_NOT_REGISTERED, user.c_str()); diff --git a/modules/commands/ns_status.cpp b/modules/commands/ns_status.cpp index b0ce63797..b6a06b7a0 100644 --- a/modules/commands/ns_status.cpp +++ b/modules/commands/ns_status.cpp @@ -27,7 +27,7 @@ class CommandNSStatus : public Command { User *u = source.u; const Anope::string &nick = !params.empty() ? params[0] : u->nick; - NickAlias *na = findnick(nick); + const NickAlias *na = findnick(nick); spacesepstream sep(nick); Anope::string nickbuf; diff --git a/modules/commands/ns_suspend.cpp b/modules/commands/ns_suspend.cpp index 40989c84c..dd20e47b8 100644 --- a/modules/commands/ns_suspend.cpp +++ b/modules/commands/ns_suspend.cpp @@ -22,14 +22,14 @@ struct NickSuspend : ExtensibleItem, Serializable { } - Anope::string serialize_name() const + const Anope::string serialize_name() const { return "NickSuspend"; } - serialized_data serialize() anope_override + Serialize::Data serialize() const anope_override { - serialized_data sd; + Serialize::Data sd; sd["nick"] << this->nick; sd["when"] << this->when; @@ -37,18 +37,25 @@ struct NickSuspend : ExtensibleItem, Serializable return sd; } - static void unserialize(serialized_data &sd) + static Serializable* unserialize(Serializable *obj, Serialize::Data &sd) { - NickAlias *na = findnick(sd["nick"].astr()); + const NickAlias *na = findnick(sd["nick"].astr()); if (na == NULL) - return; + return NULL; - NickSuspend *ns = new NickSuspend(); + NickSuspend *ns; + if (obj) + ns = debug_cast<NickSuspend *>(obj); + else + ns = new NickSuspend(); sd["nick"] >> ns->nick; sd["when"] >> ns->when; - na->nc->Extend("ns_suspend_expire", ns); + if (!obj) + na->nc->Extend("ns_suspend_expire", ns); + + return ns; } }; @@ -98,17 +105,19 @@ class CommandNSSuspend : public Command 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); + NickCore *nc = na->nc; + + nc->SetFlag(NI_SUSPENDED); + nc->SetFlag(NI_SECURE); + nc->UnsetFlag(NI_KILLPROTECT); + nc->UnsetFlag(NI_KILL_QUICK); + 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) + for (std::list<serialize_obj<NickAlias> >::iterator it = nc->aliases.begin(), it_end = nc->aliases.end(); it != it_end;) { - NickAlias *na2 = *it; + NickAlias *na2 = *it++; - if (na2->nc == na->nc) + if (na2 && *na2->nc == *na->nc) { na2->last_quit = reason; @@ -127,7 +136,7 @@ class CommandNSSuspend : public Command ns->nick = na->nick; ns->when = Anope::CurTime + expiry_secs; - na->nc->Extend("ns_suspend_expire", ns); + nc->Extend("ns_suspend_expire", ns); } Log(LOG_ADMIN, u, this) << "for " << nick << " (" << (!reason.empty() ? reason : "No reason") << "), expires in " << (expiry_secs ? do_strftime(Anope::CurTime + expiry_secs) : "never"); @@ -221,7 +230,7 @@ class NSSuspend : public Module ~NSSuspend() { - for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it) + for (nickcore_map::const_iterator it = NickCoreList->begin(), it_end = NickCoreList->end(); it != it_end; ++it) it->second->Shrink("ns_suspend_expire"); } diff --git a/modules/commands/os_akill.cpp b/modules/commands/os_akill.cpp index f59c26e1f..dec9b9ae9 100644 --- a/modules/commands/os_akill.cpp +++ b/modules/commands/os_akill.cpp @@ -173,7 +173,7 @@ class CommandOSAKill : public Command { source.Reply(USERHOST_MASK_TOO_WIDE, mask.c_str()); Log(LOG_ADMIN, u, this) << "tried to akill " << percent << "% of the network (" << affected << " users)"; - delete x; + x->destroy(); return; } @@ -181,7 +181,7 @@ class CommandOSAKill : public Command FOREACH_RESULT(I_OnAddXLine, OnAddXLine(u, x, akills)); if (MOD_RESULT == EVENT_STOP) { - delete x; + x->destroy(); return; } @@ -264,7 +264,7 @@ class CommandOSAKill : public Command if (!number) return; - XLine *x = akills->GetEntry(number - 1); + const XLine *x = akills->GetEntry(number - 1); if (!x) return; @@ -286,7 +286,7 @@ class CommandOSAKill : public Command { for (unsigned i = 0, end = akills->GetCount(); i < end; ++i) { - XLine *x = akills->GetEntry(i); + const XLine *x = akills->GetEntry(i); if (mask.empty() || mask.equals_ci(x->Mask) || mask == x->UID || Anope::Match(x->Mask, mask, false, true)) { diff --git a/modules/commands/os_forbid.cpp b/modules/commands/os_forbid.cpp index d305de3c6..bd67d13da 100644 --- a/modules/commands/os_forbid.cpp +++ b/modules/commands/os_forbid.cpp @@ -31,7 +31,7 @@ class MyForbidService : public ForbidService 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; + d->destroy(); } ForbidData *FindForbid(const Anope::string &mask, ForbidType ftype) anope_override @@ -42,7 +42,7 @@ class MyForbidService : public ForbidService ForbidData *d = this->forbidData[i - 1]; if ((ftype == FT_NONE || ftype == d->type) && Anope::Match(mask, d->mask, false, true)) - return d; + d->destroy(); } return NULL; } @@ -65,7 +65,7 @@ class MyForbidService : public ForbidService Log(LOG_NORMAL, "expire/forbid") << "Expiring forbid for " << d->mask << " type " << ftype; this->forbidData.erase(this->forbidData.begin() + i - 1); - delete d; + d->destroy(); } } @@ -257,7 +257,7 @@ class OSForbid : public Module ForbidData *d = this->forbidService.FindForbid(u->nick, FT_NICK); if (d != NULL) { - BotInfo *bi = findbot(Config->OperServ); + const BotInfo *bi = findbot(Config->OperServ); if (bi) { if (d->reason.empty()) diff --git a/modules/commands/os_forbid.h b/modules/commands/os_forbid.h index fec721420..30fdb9611 100644 --- a/modules/commands/os_forbid.h +++ b/modules/commands/os_forbid.h @@ -18,9 +18,9 @@ struct ForbidData : Serializable time_t expires; ForbidType type; - Anope::string serialize_name() const anope_override { return "ForbidData"; } - serialized_data serialize() anope_override; - static void unserialize(serialized_data &data); + const Anope::string serialize_name() const anope_override { return "ForbidData"; } + Serialize::Data serialize() const anope_override; + static Serializable* unserialize(Serializable *obj, Serialize::Data &data); }; class ForbidService : public Service @@ -39,9 +39,9 @@ class ForbidService : public Service static service_reference<ForbidService> forbid_service("ForbidService", "forbid"); -Serializable::serialized_data ForbidData::serialize() +Serialize::Data ForbidData::serialize() const { - serialized_data data; + Serialize::Data data; data["mask"] << this->mask; data["creator"] << this->creator; @@ -53,12 +53,16 @@ Serializable::serialized_data ForbidData::serialize() return data; } -void ForbidData::unserialize(serialized_data &data) +Serializable* ForbidData::unserialize(Serializable *obj, Serialize::Data &data) { if (!forbid_service) - return; + return NULL; - ForbidData *fb = new ForbidData; + ForbidData *fb; + if (obj) + fb = debug_cast<ForbidData *>(obj); + else + fb = new ForbidData; data["mask"] >> fb->mask; data["creator"] >> fb->creator; @@ -69,7 +73,9 @@ void ForbidData::unserialize(serialized_data &data) data["type"] >> t; fb->type = static_cast<ForbidType>(t); - forbid_service->AddForbid(fb); + if (!obj) + forbid_service->AddForbid(fb); + return fb; } #endif diff --git a/modules/commands/os_ignore.cpp b/modules/commands/os_ignore.cpp index 3d84a4635..68f4c5517 100644 --- a/modules/commands/os_ignore.cpp +++ b/modules/commands/os_ignore.cpp @@ -19,7 +19,7 @@ class OSIgnoreService : public IgnoreService public: OSIgnoreService(Module *o) : IgnoreService(o) { } - void AddIgnore(const Anope::string &mask, const Anope::string &creator, const Anope::string &reason, time_t delta = Anope::CurTime) anope_override + IgnoreData* AddIgnore(const Anope::string &mask, const Anope::string &creator, const Anope::string &reason, time_t delta = Anope::CurTime) anope_override { /* If it s an existing user, we ignore the hostmask. */ Anope::string realmask = mask; @@ -36,7 +36,7 @@ class OSIgnoreService : public IgnoreService { /* this should never happen */ if (user > host) - return; + return NULL; } else /* We have user@host. Add nick wildcard. */ @@ -54,6 +54,7 @@ class OSIgnoreService : public IgnoreService ign->time = 0; else ign->time = Anope::CurTime + delta; + return ign; } /* Create new entry.. */ else @@ -64,6 +65,7 @@ class OSIgnoreService : public IgnoreService newign.reason = reason; newign.time = delta ? Anope::CurTime + delta : 0; this->ignores.push_back(newign); + return &this->ignores.back(); } } diff --git a/modules/commands/os_ignore.h b/modules/commands/os_ignore.h index 44235f7cc..1eb505398 100644 --- a/modules/commands/os_ignore.h +++ b/modules/commands/os_ignore.h @@ -17,9 +17,9 @@ struct IgnoreData : Serializable Anope::string reason; time_t time; /* When do we stop ignoring them? */ - Anope::string serialize_name() const anope_override { return "IgnoreData"; } - serialized_data serialize() anope_override; - static void unserialize(serialized_data &data); + const Anope::string serialize_name() const anope_override { return "IgnoreData"; } + Serialize::Data serialize() const anope_override; + static Serializable* unserialize(Serializable *obj, Serialize::Data &data); }; class IgnoreService : public Service @@ -30,7 +30,7 @@ class IgnoreService : public Service IgnoreService(Module *c) : Service(c, "IgnoreService", "ignore") { } public: - virtual void AddIgnore(const Anope::string &mask, const Anope::string &creator, const Anope::string &reason, time_t delta = Anope::CurTime) = 0; + virtual IgnoreData* 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; @@ -43,9 +43,9 @@ class IgnoreService : public Service static service_reference<IgnoreService> ignore_service("IgnoreService", "ignore"); -Serializable::serialized_data IgnoreData::serialize() +Serialize::Data IgnoreData::serialize() const { - serialized_data data; + Serialize::Data data; data["mask"] << this->mask; data["creator"] << this->creator; @@ -55,14 +55,24 @@ Serializable::serialized_data IgnoreData::serialize() return data; } -void IgnoreData::unserialize(serialized_data &data) +Serializable* IgnoreData::unserialize(Serializable *obj, Serialize::Data &data) { if (!ignore_service) - return; + return NULL; + + if (obj) + { + IgnoreData *ign = debug_cast<IgnoreData *>(obj); + data["mask"] >> ign->mask; + data["creator"] >> ign->creator; + data["reason"] >> ign->reason; + data["time"] >> ign->time; + return ign; + } time_t t; data["time"] >> t; - ignore_service->AddIgnore(data["mask"].astr(), data["creator"].astr(), data["reason"].astr(), t); + return ignore_service->AddIgnore(data["mask"].astr(), data["creator"].astr(), data["reason"].astr(), t); } diff --git a/modules/commands/os_modinfo.cpp b/modules/commands/os_modinfo.cpp index 032db21f9..60fe8293f 100644 --- a/modules/commands/os_modinfo.cpp +++ b/modules/commands/os_modinfo.cpp @@ -40,9 +40,9 @@ class CommandOSModInfo : public Command source.Reply(_(" Providing service: \002%s\002"), c->name.c_str()); - for (botinfo_map::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it) + for (botinfo_map::const_iterator it = BotListByNick->begin(), it_end = BotListByNick->end(); it != it_end; ++it) { - BotInfo *bi = it->second; + const BotInfo *bi = it->second; for (BotInfo::command_map::const_iterator cit = bi->commands.begin(), cit_end = bi->commands.end(); cit != cit_end; ++cit) { diff --git a/modules/commands/os_news.cpp b/modules/commands/os_news.cpp index 268f2ef0d..456661c46 100644 --- a/modules/commands/os_news.cpp +++ b/modules/commands/os_news.cpp @@ -72,7 +72,7 @@ class MyNewsService : public NewsService { for (unsigned i = 0; i < 3; ++i) for (unsigned j = 0; j < newsItems[i].size(); ++j) - delete newsItems[i][j]; + newsItems[i][j]->destroy(); } void AddNewsItem(NewsItem *n) @@ -86,7 +86,7 @@ class MyNewsService : public NewsService std::vector<NewsItem *>::iterator it = std::find(list.begin(), list.end(), n); if (it != list.end()) list.erase(it); - delete n; + n->destroy(); } std::vector<NewsItem *> &GetNewsList(NewsType t) @@ -364,10 +364,10 @@ class OSNews : public Module 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); + const BotInfo *gl = findbot(Config->Global); + if (!gl && !BotListByNick->empty()) + gl = BotListByNick->begin()->second; + const BotInfo *os = findbot(Config->OperServ); if (!os) os = gl; if (gl) diff --git a/modules/commands/os_news.h b/modules/commands/os_news.h index d848d73ad..f2507473a 100644 --- a/modules/commands/os_news.h +++ b/modules/commands/os_news.h @@ -22,9 +22,9 @@ struct NewsItem : Serializable Anope::string who; time_t time; - Anope::string serialize_name() const anope_override { return "NewsItem"; } - serialized_data serialize() anope_override; - static void unserialize(serialized_data &data); + const Anope::string serialize_name() const anope_override { return "NewsItem"; } + Serialize::Data serialize() const anope_override; + static Serializable* unserialize(Serializable *obj, Serialize::Data &data); }; class NewsService : public Service @@ -41,9 +41,9 @@ class NewsService : public Service static service_reference<NewsService> news_service("NewsService", "news"); -Serializable::serialized_data NewsItem::serialize() +Serialize::Data NewsItem::serialize() const { - serialized_data data; + Serialize::Data data; data["type"] << this->type; data["text"] << this->text; @@ -53,12 +53,16 @@ Serializable::serialized_data NewsItem::serialize() return data; } -void NewsItem::unserialize(serialized_data &data) +Serializable* NewsItem::unserialize(Serializable *obj, Serialize::Data &data) { if (!news_service) - return; + return NULL; - NewsItem *ni = new NewsItem(); + NewsItem *ni; + if (obj) + ni = debug_cast<NewsItem *>(obj); + else + ni = new NewsItem(); unsigned int t; data["type"] >> t; @@ -67,7 +71,9 @@ void NewsItem::unserialize(serialized_data &data) data["who"] >> ni->who; data["time"] >> ni->time; - news_service->AddNewsItem(ni); + if (!obj) + news_service->AddNewsItem(ni); + return ni; } #endif // OS_NEWS diff --git a/modules/commands/os_oper.cpp b/modules/commands/os_oper.cpp index 6e8800e74..22560dd18 100644 --- a/modules/commands/os_oper.cpp +++ b/modules/commands/os_oper.cpp @@ -17,14 +17,14 @@ struct MyOper : Oper, Serializable { MyOper(const Anope::string &n, OperType *o) : Oper(n, o) { } - Anope::string serialize_name() const anope_override + const Anope::string serialize_name() const anope_override { return "Oper"; } - serialized_data serialize() anope_override + Serialize::Data serialize() const anope_override { - serialized_data data; + Serialize::Data data; data["name"] << this->name; data["type"] << this->ot->GetName(); @@ -32,17 +32,23 @@ struct MyOper : Oper, Serializable return data; } - static void unserialize(serialized_data &data) + static Serializable* unserialize(Serializable *obj, Serialize::Data &data) { OperType *ot = OperType::Find(data["type"].astr()); if (ot == NULL) - return; + return NULL; NickCore *nc = findcore(data["name"].astr()); if (nc == NULL) - return; + return NULL; - nc->o = new MyOper(nc->display, ot); + MyOper *myo; + if (obj) + myo = debug_cast<MyOper *>(obj); + else + myo = new MyOper(nc->display, ot); + nc->o = myo; Log(LOG_NORMAL, "operserv/oper") << "Tied oper " << nc->display << " to type " << ot->GetName(); + return myo; } }; @@ -67,7 +73,7 @@ class CommandOSOper : public Command const Anope::string &oper = params[1]; const Anope::string &otype = params[2]; - NickAlias *na = findnick(oper); + const NickAlias *na = findnick(oper); if (na == NULL) source.Reply(NICK_X_NOT_REGISTERED, oper.c_str()); else if (na->nc->o) @@ -90,7 +96,7 @@ class CommandOSOper : public Command { const Anope::string &oper = params[1]; - NickAlias *na = findnick(oper); + const NickAlias *na = findnick(oper); if (na == NULL) source.Reply(NICK_X_NOT_REGISTERED, oper.c_str()); else if (!na->nc || !na->nc->o) @@ -107,9 +113,9 @@ class CommandOSOper : public Command 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) + for (nickcore_map::const_iterator it = NickCoreList->begin(), it_end = NickCoreList->end(); it != it_end; ++it) { - NickCore *nc = it->second; + const NickCore *nc = it->second; if (!nc->o) continue; @@ -117,7 +123,7 @@ class CommandOSOper : public Command source.Reply(_("%-8s %s"), nc->o->name.c_str(), nc->o->ot->GetName().c_str()); if (nc->o->config) source.Reply(_(" This oper is configured in the configuration file.")); - for (std::list<User *>::iterator uit = nc->Users.begin(); uit != nc->Users.end(); ++uit) + for (std::list<User *>::const_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()); @@ -213,9 +219,9 @@ class OSOper : public Module ~OSOper() { - for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it) + for (nickcore_map::const_iterator it = NickCoreList->begin(), it_end = NickCoreList->end(); it != it_end; ++it) { - NickCore *nc = it->second; + const NickCore *nc = it->second; if (nc->o && !nc->o->config) delete nc->o; diff --git a/modules/commands/os_session.cpp b/modules/commands/os_session.cpp index e9666c6d2..8383a88f8 100644 --- a/modules/commands/os_session.cpp +++ b/modules/commands/os_session.cpp @@ -102,7 +102,7 @@ class ExpireTimer : public Timer continue; Log(findbot(Config->OperServ), "expire/exception") << "Session exception for " << e->mask << "has expired."; session_service->DelException(e); - delete e; + e->destroy(); } } }; @@ -143,7 +143,7 @@ class ExceptionDelCallback : public NumberList FOREACH_MOD(I_OnExceptionDel, OnExceptionDel(source.u, e)); session_service->DelException(e); - delete e; + e->destroy(); } }; @@ -346,7 +346,7 @@ class CommandOSException : public Command EventReturn MOD_RESULT; FOREACH_RESULT(I_OnExceptionAdd, OnExceptionAdd(exception)); if (MOD_RESULT == EVENT_STOP) - delete exception; + exception->destroy(); else { session_service->AddException(exception); @@ -635,7 +635,7 @@ class OSSession : public Module if (kill && !exempt) { - BotInfo *bi = findbot(Config->OperServ); + const BotInfo *bi = findbot(Config->OperServ); if (bi) { if (!Config->SessionLimitExceeded.empty()) diff --git a/modules/commands/os_session.h b/modules/commands/os_session.h index 561280170..b40177a32 100644 --- a/modules/commands/os_session.h +++ b/modules/commands/os_session.h @@ -17,9 +17,9 @@ struct Exception : Serializable time_t time; /* When this exception was added */ time_t expires; /* Time when it expires. 0 == no expiry */ - Anope::string serialize_name() const anope_override { return "Exception"; } - serialized_data serialize() anope_override; - static void unserialize(serialized_data &data); + const Anope::string serialize_name() const anope_override { return "Exception"; } + Serialize::Data serialize() const anope_override; + static Serializable* unserialize(Serializable *obj, Serialize::Data &data); }; class SessionService : public Service @@ -51,9 +51,9 @@ class SessionService : public Service static service_reference<SessionService> session_service("SessionService", "session"); -Serializable::serialized_data Exception::serialize() +Serialize::Data Exception::serialize() const { - serialized_data data; + Serialize::Data data; data["mask"] << this->mask; data["limit"] << this->limit; @@ -65,12 +65,16 @@ Serializable::serialized_data Exception::serialize() return data; } -void Exception::unserialize(Serializable::serialized_data &data) +Serializable* Exception::unserialize(Serializable *obj, Serialize::Data &data) { if (!session_service) - return; + return NULL; - Exception *ex = new Exception; + Exception *ex; + if (obj) + ex = debug_cast<Exception *>(obj); + else + ex = new Exception; data["mask"] >> ex->mask; data["limit"] >> ex->limit; data["who"] >> ex->who; @@ -78,7 +82,9 @@ void Exception::unserialize(Serializable::serialized_data &data) data["time"] >> ex->time; data["expires"] >> ex->expires; - session_service->AddException(ex); + if (!obj) + session_service->AddException(ex); + return ex; } #endif diff --git a/modules/commands/os_stats.cpp b/modules/commands/os_stats.cpp index 19ac54a27..7b593e421 100644 --- a/modules/commands/os_stats.cpp +++ b/modules/commands/os_stats.cpp @@ -15,14 +15,14 @@ struct Stats : Serializable { - Anope::string serialize_name() const + const Anope::string serialize_name() const { return "Stats"; } - serialized_data serialize() anope_override + Serialize::Data serialize() const anope_override { - serialized_data data; + Serialize::Data data; data["maxusercnt"] << maxusercnt; data["maxusertime"] << maxusertime; @@ -30,10 +30,11 @@ struct Stats : Serializable return data; } - static void unserialize(serialized_data &data) + static Serializable* unserialize(Serializable *obj, Serialize::Data &data) { data["maxusercnt"] >> maxusercnt; data["maxusertime"] >> maxusertime; + return NULL; } }; diff --git a/modules/commands/os_sxline.cpp b/modules/commands/os_sxline.cpp index d6c2ba094..c828b8d52 100644 --- a/modules/commands/os_sxline.cpp +++ b/modules/commands/os_sxline.cpp @@ -132,7 +132,7 @@ class CommandOSSXLineBase : public Command if (!Number) return; - XLine *x = this->xlm->GetEntry(Number - 1); + const XLine *x = this->xlm->GetEntry(Number - 1); if (!x) return; @@ -154,7 +154,7 @@ class CommandOSSXLineBase : public Command { for (unsigned i = 0, end = this->xlm()->GetCount(); i < end; ++i) { - XLine *x = this->xlm()->GetEntry(i); + const XLine *x = this->xlm()->GetEntry(i); if (mask.empty() || mask.equals_ci(x->Mask) || mask == x->UID || Anope::Match(x->Mask, mask, false, true)) { @@ -369,7 +369,7 @@ class CommandOSSNLine : public CommandOSSXLineBase { source.Reply(USERHOST_MASK_TOO_WIDE, mask.c_str()); Log(LOG_ADMIN, u, this) << "tried to " << source.command << " " << percent << "% of the network (" << affected << " users)"; - delete x; + x->destroy(); return; } @@ -377,7 +377,7 @@ class CommandOSSNLine : public CommandOSSXLineBase FOREACH_RESULT(I_OnAddXLine, OnAddXLine(u, x, this->xlm())); if (MOD_RESULT == EVENT_STOP) { - delete x; + x->destroy(); return; } @@ -576,7 +576,7 @@ class CommandOSSQLine : public CommandOSSXLineBase { source.Reply(USERHOST_MASK_TOO_WIDE, mask.c_str()); Log(LOG_ADMIN, u, this) << "tried to SQLine " << percent << "% of the network (" << affected << " users)"; - delete x; + x->destroy(); return; } @@ -584,7 +584,7 @@ class CommandOSSQLine : public CommandOSSXLineBase FOREACH_RESULT(I_OnAddXLine, OnAddXLine(u, x, this->xlm())); if (MOD_RESULT == EVENT_STOP) { - delete x; + x->destroy(); return; } |