From f29e1cf383529a1a29f02b0669d973f5ee0b7a66 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 28 May 2014 12:07:29 -0400 Subject: Move most of the core pseudoclient logic to modules --- modules/commands/cs_access.cpp | 155 +++++++++++++++++++++-------------------- 1 file changed, 81 insertions(+), 74 deletions(-) (limited to 'modules/commands/cs_access.cpp') diff --git a/modules/commands/cs_access.cpp b/modules/commands/cs_access.cpp index 3bfbde97d..83d00f6ae 100644 --- a/modules/commands/cs_access.cpp +++ b/modules/commands/cs_access.cpp @@ -10,29 +10,30 @@ */ #include "module.h" +#include "modules/chanserv.h" #include "modules/cs_access.h" static std::map defaultLevels; -static inline void reset_levels(ChannelInfo *ci) +static inline void reset_levels(ChanServ::Channel *ci) { ci->ClearLevels(); for (std::map::iterator it = defaultLevels.begin(), it_end = defaultLevels.end(); it != it_end; ++it) ci->SetLevel(it->first, it->second); } -class AccessChanAccess : public ChanAccess +class AccessChanAccess : public ChanServ::ChanAccess { public: int level; - AccessChanAccess(AccessProvider *p) : ChanAccess(p), level(0) + AccessChanAccess(ChanServ::AccessProvider *p) : ChanAccess(p), level(0) { } bool HasPriv(const Anope::string &name) const override { - return this->ci->GetLevel(name) != ACCESS_INVALID && this->level >= this->ci->GetLevel(name); + return this->ci->GetLevel(name) != ChanServ::ACCESS_INVALID && this->level >= this->ci->GetLevel(name); } Anope::string AccessSerialize() const @@ -51,15 +52,15 @@ class AccessChanAccess : public ChanAccess } } - bool operator>(const ChanAccess &other) const override + bool operator>(const ChanServ::ChanAccess &other) const override { if (this->provider != other.provider) - return ChanAccess::operator>(other); + return ChanServ::ChanAccess::operator>(other); else return this->level > anope_dynamic_static_cast(&other)->level; } - bool operator<(const ChanAccess &other) const override + bool operator<(const ChanServ::ChanAccess &other) const override { if (this->provider != other.provider) return ChanAccess::operator<(other); @@ -68,17 +69,17 @@ class AccessChanAccess : public ChanAccess } }; -class AccessAccessProvider : public AccessProvider +class AccessAccessProvider : public ChanServ::AccessProvider { public: static AccessAccessProvider *me; - AccessAccessProvider(Module *o) : AccessProvider(o, "access/access") + AccessAccessProvider(Module *o) : ChanServ::AccessProvider(o, "access/access") { me = this; } - ChanAccess *Create() override + ChanServ::ChanAccess *Create() override { return new AccessChanAccess(this); } @@ -87,11 +88,11 @@ AccessAccessProvider* AccessAccessProvider::me; class CommandCSAccess : public Command { - void DoAdd(CommandSource &source, ChannelInfo *ci, const std::vector ¶ms) + void DoAdd(CommandSource &source, ChanServ::Channel *ci, const std::vector ¶ms) { Anope::string mask = params[2]; - Privilege *p = NULL; - int level = ACCESS_INVALID; + ChanServ::Privilege *p = NULL; + int level = ChanServ::ACCESS_INVALID; try { @@ -99,7 +100,7 @@ class CommandCSAccess : public Command } catch (const ConvertException &) { - p = PrivilegeManager::FindPrivilege(params[3]); + p = ChanServ::service ? ChanServ::service->FindPrivilege(params[3]) : nullptr; if (p != NULL && defaultLevels[p->name]) level = defaultLevels[p->name]; } @@ -109,14 +110,14 @@ class CommandCSAccess : public Command source.Reply(_("Access level must be non-zero.")); return; } - else if (level <= ACCESS_INVALID || level >= ACCESS_FOUNDER) + else if (level <= ChanServ::ACCESS_INVALID || level >= ChanServ::ACCESS_FOUNDER) { - source.Reply(CHAN_ACCESS_LEVEL_RANGE, ACCESS_INVALID + 1, ACCESS_FOUNDER - 1); + source.Reply(CHAN_ACCESS_LEVEL_RANGE, ChanServ::ACCESS_INVALID + 1, ChanServ::ACCESS_FOUNDER - 1); return; } - AccessGroup u_access = source.AccessFor(ci); - const ChanAccess *highest = u_access.Highest(); + ChanServ::AccessGroup u_access = source.AccessFor(ci); + const ChanServ::ChanAccess *highest = u_access.Highest(); AccessChanAccess tmp_access(AccessAccessProvider::me); tmp_access.ci = ci; @@ -143,7 +144,7 @@ class CommandCSAccess : public Command return; } - ChannelInfo *targ_ci = ChannelInfo::Find(mask); + ChanServ::Channel *targ_ci = ChanServ::Find(mask); if (targ_ci == NULL) { source.Reply(CHAN_X_NOT_REGISTERED, mask.c_str()); @@ -159,7 +160,7 @@ class CommandCSAccess : public Command } else { - const NickAlias *na = NickAlias::Find(mask); + const NickServ::Nick *na = NickServ::FindNick(mask); if (!na && Config->GetModule("chanserv")->Get("disallow_hostmask_access")) { source.Reply(_("Masks and unregistered users may not be on access lists.")); @@ -180,7 +181,7 @@ class CommandCSAccess : public Command for (unsigned i = ci->GetAccessCount(); i > 0; --i) { - const ChanAccess *access = ci->GetAccess(i - 1); + const ChanServ::ChanAccess *access = ci->GetAccess(i - 1); if (mask.equals_ci(access->mask)) { /* Don't allow lowering from a level >= u_level */ @@ -201,7 +202,7 @@ class CommandCSAccess : public Command return; } - ServiceReference provider("AccessProvider", "access/access"); + ServiceReference provider("AccessProvider", "access/access"); if (!provider) return; AccessChanAccess *access = anope_dynamic_static_cast(provider->Create()); @@ -222,11 +223,11 @@ class CommandCSAccess : public Command source.Reply(_("\002%s\002 added to %s access list at level \002%d\002."), access->mask.c_str(), ci->name.c_str(), level); } - void DoDel(CommandSource &source, ChannelInfo *ci, const std::vector ¶ms) + void DoDel(CommandSource &source, ChanServ::Channel *ci, const std::vector ¶ms) { Anope::string mask = params[2]; - if (!isdigit(mask[0]) && mask.find_first_of("#!*@") == Anope::string::npos && !NickAlias::Find(mask)) + if (!isdigit(mask[0]) && mask.find_first_of("#!*@") == Anope::string::npos && !NickServ::FindNick(mask)) { User *targ = User::Find(mask, true); if (targ != NULL) @@ -245,14 +246,14 @@ class CommandCSAccess : public Command class AccessDelCallback : public NumberList { CommandSource &source; - ChannelInfo *ci; + ChanServ::Channel *ci; Command *c; unsigned deleted; Anope::string Nicks; bool denied; bool override; public: - AccessDelCallback(CommandSource &_source, ChannelInfo *_ci, Command *_c, const Anope::string &numlist) : NumberList(numlist, true), source(_source), ci(_ci), c(_c), deleted(0), denied(false), override(false) + AccessDelCallback(CommandSource &_source, ChanServ::Channel *_ci, Command *_c, const Anope::string &numlist) : NumberList(numlist, true), source(_source), ci(_ci), c(_c), deleted(0), denied(false), override(false) { if (!source.AccessFor(ci).HasPriv("ACCESS_CHANGE") && source.HasPriv("chanserv/access/modify")) this->override = true; @@ -280,10 +281,10 @@ class CommandCSAccess : public Command if (!Number || Number > ci->GetAccessCount()) return; - ChanAccess *access = ci->GetAccess(Number - 1); + ChanServ::ChanAccess *access = ci->GetAccess(Number - 1); - AccessGroup ag = source.AccessFor(ci); - const ChanAccess *u_highest = ag.Highest(); + ChanServ::AccessGroup ag = source.AccessFor(ci); + const ChanServ::ChanAccess *u_highest = ag.Highest(); if ((!u_highest || *u_highest <= *access) && !ag.founder && !this->override && !access->mask.equals_ci(source.nc->display)) { @@ -308,12 +309,12 @@ class CommandCSAccess : public Command } else { - AccessGroup u_access = source.AccessFor(ci); - const ChanAccess *highest = u_access.Highest(); + ChanServ::AccessGroup u_access = source.AccessFor(ci); + const ChanServ::ChanAccess *highest = u_access.Highest(); for (unsigned i = ci->GetAccessCount(); i > 0; --i) { - ChanAccess *access = ci->GetAccess(i - 1); + ChanServ::ChanAccess *access = ci->GetAccess(i - 1); if (mask.equals_ci(access->mask)) { if (!access->mask.equals_ci(source.nc->display) && !u_access.founder && (!highest || *highest <= *access) && !source.HasPriv("chanserv/access/modify")) @@ -338,7 +339,7 @@ class CommandCSAccess : public Command return; } - void ProcessList(CommandSource &source, ChannelInfo *ci, const std::vector ¶ms, ListFormatter &list) + void ProcessList(CommandSource &source, ChanServ::Channel *ci, const std::vector ¶ms, ListFormatter &list) { const Anope::string &nick = params.size() > 2 ? params[2] : ""; @@ -349,10 +350,10 @@ class CommandCSAccess : public Command class AccessListCallback : public NumberList { ListFormatter &list; - ChannelInfo *ci; + ChanServ::Channel *ci; public: - AccessListCallback(ListFormatter &_list, ChannelInfo *_ci, const Anope::string &numlist) : NumberList(numlist, false), list(_list), ci(_ci) + AccessListCallback(ListFormatter &_list, ChanServ::Channel *_ci, const Anope::string &numlist) : NumberList(numlist, false), list(_list), ci(_ci) { } @@ -361,13 +362,13 @@ class CommandCSAccess : public Command if (!number || number > ci->GetAccessCount()) return; - const ChanAccess *access = ci->GetAccess(number - 1); + const ChanServ::ChanAccess *access = ci->GetAccess(number - 1); Anope::string timebuf; if (ci->c) for (Channel::ChanUserList::const_iterator cit = ci->c->users.begin(), cit_end = ci->c->users.end(); cit != cit_end; ++cit) { - ChanAccess::Path p; + ChanServ::ChanAccess::Path p; if (access->Matches(cit->second->user, cit->second->user->Account(), p)) timebuf = "Now"; } @@ -395,7 +396,7 @@ class CommandCSAccess : public Command { for (unsigned i = 0, end = ci->GetAccessCount(); i < end; ++i) { - const ChanAccess *access = ci->GetAccess(i); + const ChanServ::ChanAccess *access = ci->GetAccess(i); if (!nick.empty() && !Anope::Match(access->mask, nick)) continue; @@ -404,7 +405,7 @@ class CommandCSAccess : public Command if (ci->c) for (Channel::ChanUserList::const_iterator cit = ci->c->users.begin(), cit_end = ci->c->users.end(); cit != cit_end; ++cit) { - ChanAccess::Path p; + ChanServ::ChanAccess::Path p; if (access->Matches(cit->second->user, cit->second->user->Account(), p)) timebuf = "Now"; } @@ -434,7 +435,7 @@ class CommandCSAccess : public Command list.Process(replies); source.Reply(_("Access list for %s:"), ci->name.c_str()); - + for (unsigned i = 0; i < replies.size(); ++i) source.Reply(replies[i]); @@ -444,7 +445,7 @@ class CommandCSAccess : public Command return; } - void DoList(CommandSource &source, ChannelInfo *ci, const std::vector ¶ms) + void DoList(CommandSource &source, ChanServ::Channel *ci, const std::vector ¶ms) { if (!ci->GetAccessCount()) { @@ -457,7 +458,7 @@ class CommandCSAccess : public Command this->ProcessList(source, ci, params, list); } - void DoView(CommandSource &source, ChannelInfo *ci, const std::vector ¶ms) + void DoView(CommandSource &source, ChanServ::Channel *ci, const std::vector ¶ms) { if (!ci->GetAccessCount()) { @@ -470,7 +471,7 @@ class CommandCSAccess : public Command this->ProcessList(source, ci, params, list); } - void DoClear(CommandSource &source, ChannelInfo *ci) + void DoClear(CommandSource &source, ChanServ::Channel *ci) { if (!source.IsFounder(ci) && !source.HasPriv("chanserv/access/modify")) source.Reply(ACCESS_DENIED); @@ -506,7 +507,7 @@ class CommandCSAccess : public Command const Anope::string &nick = params.size() > 2 ? params[2] : ""; const Anope::string &s = params.size() > 3 ? params[3] : ""; - ChannelInfo *ci = ChannelInfo::Find(params[0]); + ChanServ::Channel *ci = ChanServ::Find(params[0]); if (ci == NULL) { source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str()); @@ -526,7 +527,7 @@ class CommandCSAccess : public Command has_access = true; else if (is_del) { - const NickAlias *na = NickAlias::Find(nick); + const NickServ::Nick *na = NickServ::FindNick(nick); if (na && na->nc == source.GetAccount()) has_access = true; } @@ -612,7 +613,7 @@ class CommandCSAccess : public Command class CommandCSLevels : public Command { - void DoSet(CommandSource &source, ChannelInfo *ci, const std::vector ¶ms) + void DoSet(CommandSource &source, ChanServ::Channel *ci, const std::vector ¶ms) { const Anope::string &what = params[2]; const Anope::string &lev = params[3]; @@ -620,7 +621,7 @@ class CommandCSLevels : public Command int level; if (lev.equals_ci("FOUNDER")) - level = ACCESS_FOUNDER; + level = ChanServ::ACCESS_FOUNDER; else { try @@ -634,11 +635,11 @@ class CommandCSLevels : public Command } } - if (level <= ACCESS_INVALID || level > ACCESS_FOUNDER) - source.Reply(_("Level must be between %d and %d inclusive."), ACCESS_INVALID + 1, ACCESS_FOUNDER - 1); + if (level <= ChanServ::ACCESS_INVALID || level > ChanServ::ACCESS_FOUNDER) + source.Reply(_("Level must be between %d and %d inclusive."), ChanServ::ACCESS_INVALID + 1, ChanServ::ACCESS_FOUNDER - 1); else { - Privilege *p = PrivilegeManager::FindPrivilege(what); + ChanServ::Privilege *p = ChanServ::service ? ChanServ::service->FindPrivilege(what) : nullptr; if (p == NULL) source.Reply(_("Setting \002%s\002 not known. Type \002%s%s HELP LEVELS\002 for a list of valid settings."), what.c_str(), Config->StrictPrivmsg.c_str(), source.service->nick.c_str()); else @@ -649,7 +650,7 @@ class CommandCSLevels : public Command ci->SetLevel(p->name, level); this->onlevelchange(&Event::LevelChange::OnLevelChange, source, ci, p->name, level); - if (level == ACCESS_FOUNDER) + if (level == ChanServ::ACCESS_FOUNDER) source.Reply(_("Level for %s on channel %s changed to founder only."), p->name.c_str(), ci->name.c_str()); else source.Reply(_("Level for \002%s\002 on channel %s changed to \002%d\002."), p->name.c_str(), ci->name.c_str(), level); @@ -657,7 +658,7 @@ class CommandCSLevels : public Command } } - void DoDisable(CommandSource &source, ChannelInfo *ci, const std::vector ¶ms) + void DoDisable(CommandSource &source, ChanServ::Channel *ci, const std::vector ¶ms) { const Anope::string &what = params[2]; @@ -668,14 +669,14 @@ class CommandCSLevels : public Command return; } - Privilege *p = PrivilegeManager::FindPrivilege(what); + ChanServ::Privilege *p = ChanServ::service ? ChanServ::service->FindPrivilege(what) : nullptr; if (p != NULL) { bool override = !source.AccessFor(ci).HasPriv("FOUNDER"); Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "to disable " << p->name; - ci->SetLevel(p->name, ACCESS_INVALID); - this->onlevelchange(&Event::LevelChange::OnLevelChange, source, ci, p->name, ACCESS_INVALID); + ci->SetLevel(p->name, ChanServ::ACCESS_INVALID); + this->onlevelchange(&Event::LevelChange::OnLevelChange, source, ci, p->name, ChanServ::ACCESS_INVALID); source.Reply(_("\002%s\002 disabled on channel %s."), p->name.c_str(), ci->name.c_str()); return; @@ -684,26 +685,29 @@ class CommandCSLevels : public Command source.Reply(_("Setting \002%s\002 not known. Type \002%s%s HELP LEVELS\002 for a list of valid settings."), what.c_str(), Config->StrictPrivmsg.c_str(), source.service->nick.c_str()); } - void DoList(CommandSource &source, ChannelInfo *ci) + void DoList(CommandSource &source, ChanServ::Channel *ci) { + if (!ChanServ::service) + return; + source.Reply(_("Access level settings for channel %s:"), ci->name.c_str()); ListFormatter list(source.GetAccount()); list.AddColumn(_("Name")).AddColumn(_("Level")); - const std::vector &privs = PrivilegeManager::GetPrivileges(); + const std::vector &privs = ChanServ::service->GetPrivileges(); for (unsigned i = 0; i < privs.size(); ++i) { - const Privilege &p = privs[i]; + const ChanServ::Privilege &p = privs[i]; int16_t j = ci->GetLevel(p.name); ListFormatter::ListEntry entry; entry["Name"] = p.name; - if (j == ACCESS_INVALID) + if (j == ChanServ::ACCESS_INVALID) entry["Level"] = Language::Translate(source.GetAccount(), _("(disabled)")); - else if (j == ACCESS_FOUNDER) + else if (j == ChanServ::ACCESS_FOUNDER) entry["Level"] = Language::Translate(source.GetAccount(), _("(founder only)")); else entry["Level"] = stringify(j); @@ -718,7 +722,7 @@ class CommandCSLevels : public Command source.Reply(replies[i]); } - void DoReset(CommandSource &source, ChannelInfo *ci) + void DoReset(CommandSource &source, ChanServ::Channel *ci) { bool override = !source.AccessFor(ci).HasPriv("FOUNDER"); Log(override ? LOG_OVERRIDE : LOG_COMMAND, source, this, ci) << "to reset all levels"; @@ -747,7 +751,7 @@ class CommandCSLevels : public Command const Anope::string &what = params.size() > 2 ? params[2] : ""; const Anope::string &s = params.size() > 3 ? params[3] : ""; - ChannelInfo *ci = ChannelInfo::Find(params[0]); + ChanServ::Channel *ci = ChanServ::Find(params[0]); if (ci == NULL) { source.Reply(CHAN_X_NOT_REGISTERED, params[0].c_str()); @@ -786,14 +790,17 @@ class CommandCSLevels : public Command ListFormatter list(source.GetAccount()); list.AddColumn(_("Name")).AddColumn(_("Description")); - const std::vector &privs = PrivilegeManager::GetPrivileges(); - for (unsigned i = 0; i < privs.size(); ++i) + if (ChanServ::service) { - const Privilege &p = privs[i]; - ListFormatter::ListEntry entry; - entry["Name"] = p.name; - entry["Description"] = Language::Translate(source.nc, p.desc.c_str()); - list.AddEntry(entry); + const std::vector &privs = ChanServ::service->GetPrivileges(); + for (unsigned i = 0; i < privs.size(); ++i) + { + const ChanServ::Privilege &p = privs[i]; + ListFormatter::ListEntry entry; + entry["Name"] = p.name; + entry["Description"] = Language::Translate(source.nc, p.desc.c_str()); + list.AddEntry(entry); + } } std::vector replies; @@ -862,7 +869,7 @@ class CSAccess : public Module const Anope::string &pname = priv->Get("name"); - Privilege *p = PrivilegeManager::FindPrivilege(pname); + ChanServ::Privilege *p = ChanServ::service ? ChanServ::service->FindPrivilege(pname) : nullptr; if (p == NULL) continue; @@ -870,20 +877,20 @@ class CSAccess : public Module if (value.empty()) continue; else if (value.equals_ci("founder")) - defaultLevels[p->name] = ACCESS_FOUNDER; + defaultLevels[p->name] = ChanServ::ACCESS_FOUNDER; else if (value.equals_ci("disabled")) - defaultLevels[p->name] = ACCESS_INVALID; + defaultLevels[p->name] = ChanServ::ACCESS_INVALID; else defaultLevels[p->name] = priv->Get("level"); } } - void OnCreateChan(ChannelInfo *ci) override + void OnCreateChan(ChanServ::Channel *ci) override { reset_levels(ci); } - EventReturn OnGroupCheckPriv(const AccessGroup *group, const Anope::string &priv) override + EventReturn OnGroupCheckPriv(const ChanServ::AccessGroup *group, const Anope::string &priv) override { if (group->ci == NULL) return EVENT_CONTINUE; -- cgit