diff options
author | Adam <Adam@anope.org> | 2013-07-01 22:17:52 -0400 |
---|---|---|
committer | Adam <Adam@anope.org> | 2013-07-01 22:17:52 -0400 |
commit | 1a3d9a016d3adc49788bbff73aac9b3b5ea85b17 (patch) | |
tree | c0ecf92ed768473bc82ff64a7fce827245f37ba9 /modules/commands/ns_set_misc.cpp | |
parent | 518182ac9204f815258b0de91b3f884d8efa1502 (diff) |
Change extensible keys to require explicitly having a type defined for it. Completely modularize more features like bs_kick, entrymsg, log, mode, etc. Move fantasy to its own module. Move greet to its own module.
Diffstat (limited to 'modules/commands/ns_set_misc.cpp')
-rw-r--r-- | modules/commands/ns_set_misc.cpp | 57 |
1 files changed, 41 insertions, 16 deletions
diff --git a/modules/commands/ns_set_misc.cpp b/modules/commands/ns_set_misc.cpp index 15fb0ed33..5dfba99cb 100644 --- a/modules/commands/ns_set_misc.cpp +++ b/modules/commands/ns_set_misc.cpp @@ -11,14 +11,24 @@ #include "module.h" +static Module *me; + static std::map<Anope::string, Anope::string> descriptions; -struct NSMiscData : ExtensibleItem, Serializable +struct NSMiscData; +static Anope::map<ExtensibleItem<NSMiscData> *> items; +static ExtensibleItem<NSMiscData> *GetItem(const Anope::string &name); + +struct NSMiscData : Serializable { Serialize::Reference<NickCore> nc; Anope::string name; Anope::string data; + NSMiscData(Extensible *obj) : Serializable("NSMiscData"), nc(anope_dynamic_static_cast<NickCore *>(obj)) + { + } + NSMiscData(NickCore *ncore, const Anope::string &n, const Anope::string &d) : Serializable("NSMiscData"), nc(ncore), name(n), data(d) { } @@ -52,14 +62,27 @@ struct NSMiscData : ExtensibleItem, Serializable } else { - d = new NSMiscData(nc, sname, sdata); - nc->Extend(sname, d); + ExtensibleItem<NSMiscData> *item = GetItem(sname); + if (item) + d = item->Set(nc, NSMiscData(nc, sname, sdata)); } return d; } }; +static ExtensibleItem<NSMiscData> *GetItem(const Anope::string &name) +{ + ExtensibleItem<NSMiscData>* &it = items[name]; + if (!it) + try + { + it = new ExtensibleItem<NSMiscData>(me, name); + } + catch (const ModuleException &) { } + return it; +} + static Anope::string GetAttribute(const Anope::string &command) { size_t sp = command.rfind(' '); @@ -93,16 +116,20 @@ class CommandNSSetMisc : public Command Anope::string scommand = GetAttribute(source.command); Anope::string key = "ns_set_misc:" + scommand; - nc->Shrink(key); + ExtensibleItem<NSMiscData> *item = GetItem(key); + if (item == NULL) + return; + if (!param.empty()) { - nc->Extend(key, new NSMiscData(nc, key, param)); + item->Set(nc, NSMiscData(nc, key, param)); source.Reply(CHAN_SETTING_CHANGED, scommand.c_str(), nc->display.c_str(), param.c_str()); } else + { + item->Unset(nc); source.Reply(CHAN_SETTING_UNSET, scommand.c_str(), nc->display.c_str()); - - return; + } } void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override @@ -155,6 +182,7 @@ class NSSetMisc : public Module NSSetMisc(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, VENDOR), nsmiscdata_type("NSMiscData", NSMiscData::Unserialize), commandnssetmisc(this), commandnssasetmisc(this) { + me = this; } void OnReload(Configuration::Conf *conf) anope_override @@ -182,17 +210,14 @@ class NSSetMisc : public Module void OnNickInfo(CommandSource &source, NickAlias *na, InfoFormatter &info, bool ShowHidden) anope_override { - std::deque<Anope::string> list; - na->nc->GetExtList(list); - - for (unsigned i = 0; i < list.size(); ++i) + Anope::map<ExtensibleItem<NSMiscData> *> items; + for (Anope::map<ExtensibleItem<NSMiscData> *>::iterator it = items.begin(); it != items.end(); ++it) { - if (list[i].find("ns_set_misc:") != 0) - continue; + ExtensibleItem<NSMiscData> *e = it->second; + NSMiscData *data = e->Get(na->nc); - NSMiscData *data = na->nc->GetExt<NSMiscData *>(list[i]); - if (data) - info[list[i].substr(12).replace_all_cs("_", " ")] = data->data; + if (data != NULL) + info[e->name.substr(12).replace_all_cs("_", " ")] = data->data; } } }; |