From 0e758a2ac23dc4a001e8e126cec14588da9a9769 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 28 Jul 2016 21:29:35 -0400 Subject: Allow serializable fields to use storage in the respective objects. Split service management code nito a proper servicemanager. Make service references managed instead of lazy lookup. Also made events and serializable use service manager instead of their respective systems for management --- modules/chanserv/main/chanserv.cpp | 70 ++++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 29 deletions(-) (limited to 'modules/chanserv/main/chanserv.cpp') diff --git a/modules/chanserv/main/chanserv.cpp b/modules/chanserv/main/chanserv.cpp index 9336b7c53..f579ec0ae 100644 --- a/modules/chanserv/main/chanserv.cpp +++ b/modules/chanserv/main/chanserv.cpp @@ -20,7 +20,7 @@ #include "leveltype.h" #include "modetype.h" #include "chanaccesstype.h" -#include "chanaccess.h" +#include "modules/chanserv/main/chanaccess.h" class ChanServCore : public Module , public ChanServ::ChanServService @@ -31,7 +31,6 @@ class ChanServCore : public Module , public EventHook , public EventHook , public EventHook - , public EventHook , public EventHook , public EventHook , public EventHook @@ -47,30 +46,48 @@ class ChanServCore : public Module Reference ChanServ; std::vector defaults; ExtensibleItem inhabit; - ExtensibleRef persist;//XXX? bool always_lower; - EventHandlers OnPreChanExpire; - EventHandlers OnChanExpire; std::vector Privileges; ChanServ::registered_channel_map registered_channels; ChannelType channel_type; - ChanAccessType chanaccess_type; +// ChanAccessType chanaccess_type; LevelType level_type; CSModeType mode_type; public: ChanServCore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PSEUDOCLIENT | VENDOR) , ChanServService(this) + , EventHook(this) + , EventHook(this) + , EventHook(this) + , EventHook(this) + , EventHook(this) + , EventHook(this) + , EventHook(this) + , EventHook(this) + , EventHook(this) + , EventHook(this) + , EventHook(this) + , EventHook(this) + , EventHook(this) + , EventHook(this) + , EventHook(this) + , EventHook(this) + , EventHook(this) + , EventHook(this) , inhabit(this, "inhabit") - , persist("PERSIST") , always_lower(false) - , OnPreChanExpire(this) - , OnChanExpire(this) , channel_type(this) - , chanaccess_type(this, "ChanAccess") +// , chanaccess_type(this) , level_type(this) , mode_type(this) { + ChanServ::service = this; + } + + ~ChanServCore() + { + ChanServ::service = nullptr; } ChanServ::Channel *Find(const Anope::string &name) override @@ -143,7 +160,7 @@ class ChanServCore : public Module if (inhabit.HasExt(c)) return; - new ChanServTimer(ChanServ, inhabit, this->owner, c); + new ChanServTimer(ChanServ, inhabit, this, c); } void AddPrivilege(ChanServ::Privilege p) override @@ -265,7 +282,7 @@ class ChanServCore : public Module void OnDelCore(NickServ::Account *nc) override { unsigned int max_reg = Config->GetModule(this)->Get("maxregistered"); - for (ChanServ::Channel *ci : nc->GetRefs(ChanServ::channel)) + for (ChanServ::Channel *ci : nc->GetRefs()) { if (ci->GetFounder() == nc) { @@ -336,7 +353,7 @@ class ChanServCore : public Module { /* remove access entries that are this channel */ - for (ChanServ::Channel *c : ci->GetRefs(ChanServ::channel)) + for (ChanServ::Channel *c : ci->GetRefs()) { for (unsigned j = 0; j < c->GetAccessCount(); ++j) { @@ -412,13 +429,6 @@ class ChanServCore : public Module } } - void OnCreateChan(ChanServ::Channel *ci) override - { - /* Set default chan flags */ - for (unsigned i = 0; i < defaults.size(); ++i) - ci->SetS(defaults[i].upper(), true); - } - EventReturn OnCanSet(User *u, const ChannelMode *cm) override { if (Config->GetModule(this)->Get("nomlock").find(cm->mchar) != Anope::string::npos @@ -429,7 +439,7 @@ class ChanServCore : public Module void OnChannelSync(Channel *c) override { - bool perm = c->HasMode("PERM") || (c->ci && persist && persist->HasExt(c->ci)); + bool perm = c->HasMode("PERM") || (c->ci && c->ci->HasFieldS("PERSIST")); if (!perm && !c->botchannel && (c->users.empty() || (c->users.size() == 1 && c->users.begin()->second->user->server == Me))) { this->Hold(c); @@ -466,12 +476,12 @@ class ChanServCore : public Module expire = true; } - this->OnPreChanExpire(&ChanServ::Event::PreChanExpire::OnPreChanExpire, ci, expire); + EventManager::Get()->Dispatch(&ChanServ::Event::PreChanExpire::OnPreChanExpire, ci, expire); if (expire) { ::Log(LOG_NORMAL, "chanserv/expire", ChanServ) << "Expiring channel " << ci->GetName() << " (founder: " << (ci->GetFounder() ? ci->GetFounder()->GetDisplay() : "(none)") << ")"; - this->OnChanExpire(&ChanServ::Event::ChanExpire::OnChanExpire, ci); + EventManager::Get()->Dispatch(&ChanServ::Event::ChanExpire::OnChanExpire, ci); delete ci; } } @@ -488,12 +498,10 @@ class ChanServCore : public Module void OnPreUplinkSync(Server *serv) override { - if (!persist) - return; /* Find all persistent channels and create them, as we are about to finish burst to our uplink */ for (ChanServ::Channel *ci : channel_type.List()) { - if (persist->HasExt(ci)) + if (ci->HasFieldS("PERSIST")) { bool c; ci->c = Channel::FindOrCreate(ci->GetName(), c, ci->GetTimeRegistered()); @@ -521,13 +529,17 @@ class ChanServCore : public Module void OnChanRegistered(ChanServ::Channel *ci) override { - if (!persist || !ci->c) + /* Set default chan flags */ + for (unsigned i = 0; i < defaults.size(); ++i) + ci->SetS(defaults[i].upper(), true); + + if (!ci->c) return; /* Mark the channel as persistent */ if (ci->c->HasMode("PERM")) - persist->Set(ci, true); + ci->SetS("PERSIST", true); /* Persist may be in def cflags, set it here */ - else if (persist->HasExt(ci)) + else if (ci->HasFieldS("PERSIST")) ci->c->SetMode(NULL, "PERM"); } -- cgit