diff options
Diffstat (limited to 'src/modules/m_geoban.cpp')
| -rw-r--r-- | src/modules/m_geoban.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/modules/m_geoban.cpp b/src/modules/m_geoban.cpp index ab3194cf2..47a2524c6 100644 --- a/src/modules/m_geoban.cpp +++ b/src/modules/m_geoban.cpp @@ -21,6 +21,7 @@ #include "inspircd.h" #include "modules/extban.h" #include "modules/geolocation.h" +#include "modules/who.h" #include "modules/whois.h" class CountryExtBan final @@ -48,6 +49,7 @@ public: class ModuleGeoBan final : public Module + , public Who::MatchEventListener , public Whois::EventListener { private: @@ -57,12 +59,23 @@ private: public: ModuleGeoBan() : Module(VF_VENDOR | VF_OPTCOMMON, "Adds extended ban G: (country) which matches against two letter country codes.") + , Who::MatchEventListener(this) , Whois::EventListener(this) , geoapi(this) , extban(this, geoapi) { } + ModResult OnWhoMatch(const Who::Request& request, LocalUser* source, User* user) override + { + if (!request.flags['G']) + return MOD_RES_PASSTHRU; + + Geolocation::Location* location = geoapi ? geoapi->GetLocation(user) : NULL; + const std::string code = location ? location->GetCode() : "XX"; + return InspIRCd::Match(code, request.matchtext, ascii_case_insensitive_map) ? MOD_RES_ALLOW : MOD_RES_DENY; + } + void OnWhois(Whois::Context& whois) override { if (whois.GetTarget()->server->IsService()) |
