From 4b179481c3216f4d7dff6d615f45927cc641d94b Mon Sep 17 00:00:00 2001 From: peavey Date: Tue, 26 Dec 2006 11:44:32 +0000 Subject: [PATCH] Add support for config option for percent and minimum string length +P will trigger on. git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@6121 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/modules/m_blockcaps.cpp | 47 +++++++++++++++++++++++++++++-------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/src/modules/m_blockcaps.cpp b/src/modules/m_blockcaps.cpp index 509352741..ecccf3534 100644 --- a/src/modules/m_blockcaps.cpp +++ b/src/modules/m_blockcaps.cpp @@ -52,41 +52,51 @@ class BlockCaps : public ModeHandler class ModuleBlockCAPS : public Module { - BlockCaps* bc; + unsigned int percent; + unsigned int minlen; public: ModuleBlockCAPS(InspIRCd* Me) : Module::Module(Me) { - + OnRehash(""); bc = new BlockCaps(ServerInstance); ServerInstance->AddMode(bc, 'P'); } void Implements(char* List) { - List[I_OnUserPreMessage] = List[I_OnUserPreNotice] = 1; + List[I_OnUserPreMessage] = List[I_OnUserPreNotice] = List[I_OnRehash] = 1; + } + + virtual void OnRehash(const std::string ¶m) + { + ReadConf(); } virtual int OnUserPreMessage(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list) { + if (text.size() < minlen) + return 0; + if (target_type == TYPE_CHANNEL) { chanrec* c = (chanrec*)dest; if (c->IsModeSet('P')) { + int caps = 0; const char* i = text.c_str(); for (; *i; i++) { - if (((*i != ' ') && (*i != '\t')) && ((*i < 'A') || (*i > 'Z'))) - { - return 0; - } + if ( (*i >= 'A') && (*i <= 'Z')) + caps++; + } + if ( (caps * 100 / text.size()) > percent ) + { + user->WriteServ( "404 %s %s :Can't send all-CAPS to channel (+P set)", user->nick, c->name); + return 1; } - - user->WriteServ( "404 %s %s :Can't send all-CAPS to channel (+P set)", user->nick, c->name); - return 1; } } return 0; @@ -97,6 +107,23 @@ public: return OnUserPreMessage(user,dest,target_type,text,status,exempt_list); } + void ReadConf() + { + ConfigReader Conf(ServerInstance); + percent = Conf.ReadInteger("blockcaps", "percent", "100", 0, true); + minlen = Conf.ReadInteger("blockcaps", "minlen", "0", 0, true); + if (percent < 0 || percent > 100) + { + ServerInstance->Log(DEFAULT, " out of range, setting to default of 100."); + percent = 100; + } + if (minlen < 0 || minlen > MAXBUF-1) + { + ServerInstance->Log(DEFAULT, " out of range, setting to default of 0."); + minlen = 0; + } + } + virtual ~ModuleBlockCAPS() { ServerInstance->Modes->DelMode(bc); -- 2.39.5