diff options
| author | 2010-02-24 10:11:34 -0600 | |
|---|---|---|
| committer | 2010-08-03 17:32:37 -0400 | |
| commit | fbe466d5d30cccfce3c0e3527adad42727f98589 (patch) | |
| tree | 81bb36471033676ab885a5d866f15894d5ad8854 /src/modules/m_opflags.cpp | |
| parent | Add m_opflags (diff) | |
Add OpFlagProvider and check flags used in +WX lists
Diffstat (limited to 'src/modules/m_opflags.cpp')
| -rw-r--r-- | src/modules/m_opflags.cpp | 58 |
1 files changed, 52 insertions, 6 deletions
diff --git a/src/modules/m_opflags.cpp b/src/modules/m_opflags.cpp index b04da33d9..8d01457b8 100644 --- a/src/modules/m_opflags.cpp +++ b/src/modules/m_opflags.cpp @@ -12,15 +12,59 @@ */ #include "inspircd.h" +#include "opflags.h" /* $ModDesc: Handles +x flag:nick channel mode */ -class FlagMode : public ModeHandler +class OpFlagProviderImpl : public OpFlagProvider { public: SimpleExtItem<std::vector<std::string> > ext; + OpFlagProviderImpl(Module* parent) : OpFlagProvider(parent, "opflags"), ext("flaglist", parent) + { + } + + const std::vector<std::string>* GetFlags(Membership* memb) + { + return ext.get(memb); + } + + bool PermissionCheck(Membership* memb, const std::string& needed) + { + if (!memb) + return false; + irc::commasepstream flags(needed); + std::string flag; + if (flags.GetToken(flag)) + { + ModeHandler* privmh = flag.length() == 1 ? + ServerInstance->Modes->FindMode(flag[0], MODETYPE_CHANNEL) : + ServerInstance->Modes->FindMode(flag); + unsigned int neededrank = privmh ? privmh->GetPrefixRank() : INT_MAX; + if (memb->getRank() >= neededrank) + return true; + } + std::vector<std::string>* mine = ext.get(memb); + if (!mine) + return false; + while (flags.GetToken(flag)) + { + for(std::vector<std::string>::iterator i = mine->begin(); i != mine->end(); i++) + { + if (flag == *i) + return true; + } + } + return false; + } +}; + +class FlagMode : public ModeHandler +{ + public: + OpFlagProviderImpl prov; FlagMode(Module* parent) : ModeHandler(parent, "opflags", 'x', PARAM_ALWAYS, MODETYPE_CHANNEL), - ext("flaglist", parent) + prov(parent) { fixed_letter = true; list = true; @@ -52,9 +96,9 @@ class FlagMode : public ModeHandler Membership* memb = channel->GetUser(dest); if (!memb) return MODEACTION_DENY; - std::vector<std::string>* ptr = ext.get(memb); + std::vector<std::string>* ptr = prov.ext.get(memb); if (adding && !ptr) - ext.set(memb, ptr = new std::vector<std::string>); + prov.ext.set(memb, ptr = new std::vector<std::string>); if (!ptr) return MODEACTION_ALLOW; for(std::vector<std::string>::iterator i = ptr->begin(); i != ptr->end(); i++) @@ -67,7 +111,7 @@ class FlagMode : public ModeHandler { ptr->erase(i); if (ptr->empty()) - ext.unset(memb); + prov.ext.unset(memb); return MODEACTION_ALLOW; } } @@ -82,7 +126,7 @@ class FlagMode : public ModeHandler const UserMembList* users = channel->GetUsers(); for(UserMembCIter u = users->begin(); u != users->end(); u++) { - std::vector<std::string>* ptr = ext.get(u->second); + std::vector<std::string>* ptr = prov.ext.get(u->second); if (ptr) { for(std::vector<std::string>::iterator i = ptr->begin(); i != ptr->end(); i++) @@ -119,6 +163,8 @@ class ModuleCustomPrefix : public Module void init() { ServerInstance->Modules->AddService(mode); + ServerInstance->Modules->AddService(mode.prov); + ServerInstance->Modules->AddService(mode.prov.ext); } Version GetVersion() |
