From 72bb1b14d372fa6065af77e8b98e8aab5295fe23 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 6 Apr 2017 12:22:52 -0400 Subject: Fix access comparison operators --- modules/chanserv/access.cpp | 22 +++++++++++----------- modules/chanserv/main/chanaccess.cpp | 20 ++++++++++++++++++++ 2 files changed, 31 insertions(+), 11 deletions(-) (limited to 'modules') diff --git a/modules/chanserv/access.cpp b/modules/chanserv/access.cpp index a29524a73..8342e5973 100644 --- a/modules/chanserv/access.cpp +++ b/modules/chanserv/access.cpp @@ -60,20 +60,20 @@ class AccessChanAccessImpl : public AccessChanAccess } } - bool operator>(ChanServ::ChanAccess &other) override + int Compare(ChanAccess *other) override { - if (this->GetSerializableType() != other.GetSerializableType()) - return ChanServ::ChanAccess::operator>(other); - else - return this->GetLevel() > anope_dynamic_static_cast(&other)->GetLevel(); - } + if (this->GetSerializableType() != other->GetSerializableType()) + return ChanAccess::Compare(other); - bool operator<(ChanServ::ChanAccess &other) override - { - if (this->GetSerializableType() != other.GetSerializableType()) - return ChanAccess::operator<(other); + int lev = this->GetLevel(); + int theirlev = anope_dynamic_static_cast(other)->GetLevel(); + + if (lev > theirlev) + return 1; + else if (lev < theirlev) + return -1; else - return this->GetLevel() < anope_dynamic_static_cast(&other)->GetLevel(); + return 0; } }; diff --git a/modules/chanserv/main/chanaccess.cpp b/modules/chanserv/main/chanaccess.cpp index f2b170989..bc2778bc3 100644 --- a/modules/chanserv/main/chanaccess.cpp +++ b/modules/chanserv/main/chanaccess.cpp @@ -110,3 +110,23 @@ bool ChanAccessImpl::Matches(const User *u, NickServ::Account *acc) return false; } + +int ChanAccessImpl::Compare(ChanAccess *other) +{ + const std::vector &privs = ChanServ::service->GetPrivileges(); + for (unsigned int i = privs.size(); i > 0; --i) + { + bool this_p = this->HasPriv(privs[i - 1].name), + other_p = other->HasPriv(privs[i - 1].name); + + if (!this_p && !other_p) + continue; + + if (this_p && !other_p) + return 1; + else if (!this_p && other_p) + return -1; + } + + return 0; +} -- cgit