diff --git a/include/extensible.h b/include/extensible.h index 7e271900d..e2299d3ce 100644 --- a/include/extensible.h +++ b/include/extensible.h @@ -135,6 +135,9 @@ public: /** Allows extensions to access the extension store. */ friend class ExtensionItem; + /** The type of extensible that this is. */ + const ExtensionType extype:2; + ~Extensible() override; /** @copydoc Cullable::Cull */ @@ -158,7 +161,7 @@ public: void UnhookExtensions(const std::vector& items); protected: - Extensible(); + Extensible(ExtensionType exttype); private: /** The values for extensions which are set on this extensible. */ diff --git a/include/membership.h b/include/membership.h index 92114b133..4a2ddd936 100644 --- a/include/membership.h +++ b/include/membership.h @@ -73,7 +73,12 @@ public: * Call Channel::JoinUser() or ForceJoin() to make a user join a channel instead of constructing * Membership objects directly. */ - Membership(User* u, Channel* c) : user(u), chan(c) {} + Membership(User* u, Channel* c) + : Extensible(ExtensionType::MEMBERSHIP) + , user(u) + , chan(c) + { + } /** Check if this member has a given prefix mode set * @param pm Prefix mode to check diff --git a/src/channels.cpp b/src/channels.cpp index b1d2e9822..983b89177 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -34,7 +34,8 @@ namespace } Channel::Channel(const std::string &cname, time_t ts) - : name(cname) + : Extensible(ExtensionType::CHANNEL) + , name(cname) , age(ts) { if (!ServerInstance->Channels.GetChans().emplace(cname, this).second) diff --git a/src/extensible.cpp b/src/extensible.cpp index 63bcec3d9..32106e030 100644 --- a/src/extensible.cpp +++ b/src/extensible.cpp @@ -47,8 +47,9 @@ ExtensionItem* ExtensionManager::GetItem(const std::string& name) return iter->second; } -Extensible::Extensible() - : culled(false) +Extensible::Extensible(ExtensionType exttype) + : extype(exttype) + , culled(false) { } diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp index 70005841f..98dda1800 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -851,9 +851,8 @@ void ModuleSpanningTree::OnShutdown(const std::string& reason) void ModuleSpanningTree::OnDecodeMetaData(Extensible* target, const std::string& extname, const std::string& extdata) { // HACK: this should use automatically synced user metadata in v4. - User* dest = static_cast(target); - if (dest && (extname == "uniqueusername")) - dest->uniqueusername = (extdata != "0"); + if (target->extype == ExtensionType::USER && irc::equals(extname, "uniqueusername")) + static_cast(target)->uniqueusername = (extdata != "0"); } Cullable::Result ModuleSpanningTree::Cull() diff --git a/src/modules/m_swhois.cpp b/src/modules/m_swhois.cpp index f6d65cf87..9623c8fb1 100644 --- a/src/modules/m_swhois.cpp +++ b/src/modules/m_swhois.cpp @@ -143,9 +143,8 @@ public: void OnDecodeMetaData(Extensible* target, const std::string& extname, const std::string&) override { - User* dest = static_cast(target); - if (dest && (extname == "swhois")) - cmd.operblock.Unset(dest); + if (target->extype == ExtensionType::USER && irc::equals(extname, "swhois")) + cmd.operblock.Unset(static_cast(target)); } }; diff --git a/src/users.cpp b/src/users.cpp index a02c3570f..0e47ff694 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -77,7 +77,8 @@ std::string User::GetModeLetters(bool includeparams) const } User::User(const std::string& uid, Server* srv, Type type) - : age(ServerInstance->Time()) + : Extensible(ExtensionType::USER) + , age(ServerInstance->Time()) , uuid(uid) , server(srv) , registered(REG_NONE)