X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_blockamsg.cpp;h=8e4b09304e0e92743ab2cfd90d4b69db9e3a1594;hb=80e81e3b81b779901fd9d67f8ae030ee30c0bcec;hp=e345286b22c7bf37bc9fbc9c2941f9f0b4a7c2d0;hpb=74f7c865f5fd0424c49bed5af0204f194effc37e;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_blockamsg.cpp b/src/modules/m_blockamsg.cpp index e345286b2..8e4b09304 100644 --- a/src/modules/m_blockamsg.cpp +++ b/src/modules/m_blockamsg.cpp @@ -1,11 +1,13 @@ /* * InspIRCd -- Internet Relay Chat Daemon * + * Copyright (C) 2013, 2018 Sadie Powell + * Copyright (C) 2012-2016 Attila Molnar + * Copyright (C) 2012, 2019 Robby * Copyright (C) 2009 Daniel De Graaf - * Copyright (C) 2008 Pippijn van Steenhoven - * Copyright (C) 2007 Dennis Friis - * Copyright (C) 2007 Robin Burchell - * Copyright (C) 2006-2007 Oliver Lupton + * Copyright (C) 2007-2008 Dennis Friis + * Copyright (C) 2006, 2010 Craig Edwards + * Copyright (C) 2006 Oliver Lupton * * This file is part of InspIRCd. InspIRCd is free software: you can * redistribute it and/or modify it under the terms of the GNU General Public @@ -37,50 +39,51 @@ class BlockedMessage { public: std::string message; - irc::string target; + std::string target; time_t sent; BlockedMessage(const std::string& msg, const std::string& tgt, time_t when) - : message(msg), target(tgt.c_str()), sent(when) + : message(msg), target(tgt), sent(when) { } }; class ModuleBlockAmsg : public Module { - int ForgetDelay; + unsigned int ForgetDelay; BlockAction action; SimpleExtItem blockamsg; public: - ModuleBlockAmsg() : blockamsg("blockamsg", this) + ModuleBlockAmsg() + : blockamsg("blockamsg", ExtensionItem::EXT_USER, this) { } Version GetVersion() CXX11_OVERRIDE { - return Version("Attempt to block /amsg, at least some of the irritating mIRC scripts.",VF_VENDOR); + return Version("Blocks mass messages sent using the /AME and /AMSG commands that exist in clients such as mIRC and HexChat.", VF_VENDOR); } void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE { ConfigTag* tag = ServerInstance->Config->ConfValue("blockamsg"); - ForgetDelay = tag->getInt("delay", -1); + ForgetDelay = tag->getDuration("delay", 3); std::string act = tag->getString("action"); - if(act == "notice") + if (stdalgo::string::equalsci(act, "notice")) action = IBLOCK_NOTICE; - else if(act == "noticeopers") + else if (stdalgo::string::equalsci(act, "noticeopers")) action = IBLOCK_NOTICEOPERS; - else if(act == "silent") + else if (stdalgo::string::equalsci(act, "silent")) action = IBLOCK_SILENT; - else if(act == "kill") + else if (stdalgo::string::equalsci(act, "kill")) action = IBLOCK_KILL; else action = IBLOCK_KILLOPERS; } - ModResult OnPreCommand(std::string &command, std::vector ¶meters, LocalUser *user, bool validated, const std::string &original_line) CXX11_OVERRIDE + ModResult OnPreCommand(std::string& command, CommandBase::Params& parameters, LocalUser* user, bool validated) CXX11_OVERRIDE { // Don't do anything with unregistered users if (user->registered != REG_ALL) @@ -94,18 +97,18 @@ class ModuleBlockAmsg : public Module if (*parameters[0].c_str() == '#') targets = 1; - for(const char* c = parameters[0].c_str(); *c; c++) + for (const char* c = parameters[0].c_str(); *c; c++) + { if ((*c == ',') && (*(c+1) == '#')) targets++; + } /* targets should now contain the number of channel targets the msg/notice was pointed at. * If the msg/notice was a PM there should be no channel targets and 'targets' should = 0. * We don't want to block PMs so... */ - if(targets == 0) - { + if (targets == 0) return MOD_RES_PASSTHRU; - } // Check that this message wasn't already sent within a few seconds. BlockedMessage* m = blockamsg.get(user); @@ -115,25 +118,25 @@ class ModuleBlockAmsg : public Module // OR // The number of target channels is equal to the number of channels the sender is on..a little suspicious. // Check it's more than 1 too, or else users on one channel would have fun. - if ((m && (m->message == parameters[1]) && (m->target != parameters[0]) && (ForgetDelay != -1) && (m->sent >= ServerInstance->Time()-ForgetDelay)) || ((targets > 1) && (targets == user->chans.size()))) + if ((m && (m->message == parameters[1]) && (!irc::equals(m->target, parameters[0])) && ForgetDelay && (m->sent >= ServerInstance->Time()-ForgetDelay)) || ((targets > 1) && (targets == user->chans.size()))) { // Block it... - if(action == IBLOCK_KILLOPERS || action == IBLOCK_NOTICEOPERS) - ServerInstance->SNO->WriteToSnoMask('a', "%s had an /amsg or /ame denied", user->nick.c_str()); + if (action == IBLOCK_KILLOPERS || action == IBLOCK_NOTICEOPERS) + ServerInstance->SNO->WriteToSnoMask('a', "%s had an /amsg or /ame blocked", user->nick.c_str()); - if(action == IBLOCK_KILL || action == IBLOCK_KILLOPERS) + if (action == IBLOCK_KILL || action == IBLOCK_KILLOPERS) ServerInstance->Users->QuitUser(user, "Attempted to global message (/amsg or /ame)"); - else if(action == IBLOCK_NOTICE || action == IBLOCK_NOTICEOPERS) - user->WriteServ( "NOTICE %s :Global message (/amsg or /ame) denied", user->nick.c_str()); + else if (action == IBLOCK_NOTICE || action == IBLOCK_NOTICEOPERS) + user->WriteNotice("Global message (/amsg or /ame) blocked"); return MOD_RES_DENY; } - if(m) + if (m) { // If there's already a BlockedMessage allocated, use it. m->message = parameters[1]; - m->target = parameters[0].c_str(); + m->target = parameters[0]; m->sent = ServerInstance->Time(); } else