summaryrefslogtreecommitdiff
path: root/modules/commands/ns_set_misc.cpp
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2013-07-01 22:17:52 -0400
committerAdam <Adam@anope.org>2013-07-01 22:17:52 -0400
commit1a3d9a016d3adc49788bbff73aac9b3b5ea85b17 (patch)
treec0ecf92ed768473bc82ff64a7fce827245f37ba9 /modules/commands/ns_set_misc.cpp
parent518182ac9204f815258b0de91b3f884d8efa1502 (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.cpp57
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> &params) 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;
}
}
};