X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_blockcaps.cpp;h=8b0c73ce3707f243524d9d45ba25da2969ab746e;hb=f25c4b7a2263f5f3ce9bb41ba56b43c0d3a6d124;hp=bcbc82cac5a814f74306d86fe52bcd5a62e59177;hpb=da074814501f23680b579feb1ad649c86e8a1348;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_blockcaps.cpp b/src/modules/m_blockcaps.cpp index bcbc82cac..8b0c73ce3 100644 --- a/src/modules/m_blockcaps.cpp +++ b/src/modules/m_blockcaps.cpp @@ -2,8 +2,8 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2008 InspIRCd Development Team - * See: http://www.inspircd.org/wiki/index.php/Credits + * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see * the file COPYING for details. @@ -18,57 +18,35 @@ /** Handles the +P channel mode */ -class BlockCaps : public ModeHandler +class BlockCaps : public SimpleChannelModeHandler { public: - BlockCaps(InspIRCd* Instance) : ModeHandler(Instance, 'B', 0, 0, false, MODETYPE_CHANNEL, false) { } - - ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding, bool) - { - if (adding) - { - if (!channel->IsModeSet('B')) - { - channel->SetMode('B',true); - return MODEACTION_ALLOW; - } - } - else - { - if (channel->IsModeSet('B')) - { - channel->SetMode('B',false); - return MODEACTION_ALLOW; - } - } - - return MODEACTION_DENY; - } + BlockCaps(InspIRCd* Instance) : SimpleChannelModeHandler(Instance, 'B') { } }; class ModuleBlockCAPS : public Module { - BlockCaps* bc; + BlockCaps bc; int percent; unsigned int minlen; char capsmap[256]; public: - - ModuleBlockCAPS(InspIRCd* Me) : Module(Me) + + ModuleBlockCAPS(InspIRCd* Me) : Module(Me), bc(Me) { - OnRehash(NULL,""); - bc = new BlockCaps(ServerInstance); - if (!ServerInstance->Modes->AddMode(bc)) - { - delete bc; + OnRehash(NULL); + if (!ServerInstance->Modes->AddMode(&bc)) throw ModuleException("Could not add new modes!"); - } - Implementation eventlist[] = { I_OnUserPreMessage, I_OnUserPreNotice, I_OnRehash }; - ServerInstance->Modules->Attach(eventlist, this, 3); + Implementation eventlist[] = { I_OnUserPreMessage, I_OnUserPreNotice, I_OnRehash, I_On005Numeric }; + ServerInstance->Modules->Attach(eventlist, this, 4); } + virtual void On005Numeric(std::string &output) + { + ServerInstance->AddExtBanChar('B'); + } - virtual void OnRehash(User* user, const std::string ¶m) + virtual void OnRehash(User* user) { ReadConf(); } @@ -82,14 +60,33 @@ public: Channel* c = (Channel*)dest; - if (c->IsModeSet('B')) + if (CHANOPS_EXEMPT(ServerInstance, 'B') && c->GetStatus(user) == STATUS_OP) + { + return 0; + } + + if (c->IsModeSet('B') || c->GetExtBanStatus(user, 'B') < 0) { int caps = 0; + const char* actstr = "\1ACTION "; + int act = 0; + for (std::string::iterator i = text.begin(); i != text.end(); i++) + { + /* Smart fix for suggestion from Jobe, ignore CTCP ACTION (part of /ME) */ + if (*actstr && *i == *actstr++ && act != -1) + { + act++; + continue; + } + else + act = -1; + caps += capsmap[(unsigned char)*i]; + } if ( ((caps*100)/(int)text.length()) >= percent ) { - user->WriteServ( "404 %s %s :Your line cannot be more than %d%% capital letters if it is %d or more letters long", user->nick, c->name, percent, minlen); + user->WriteNumeric(ERR_CANNOTSENDTOCHAN, "%s %s :Your message cannot contain more than %d%% capital letters if it's longer than %d characters", user->nick.c_str(), c->name.c_str(), percent, minlen); return 1; } } @@ -110,7 +107,7 @@ public: std::string hmap = Conf.ReadValue("blockcaps", "capsmap", 0); if (hmap.empty()) hmap = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - memset(&capsmap, 0, 255); + memset(capsmap, 0, sizeof(capsmap)); for (std::string::iterator n = hmap.begin(); n != hmap.end(); n++) capsmap[(unsigned char)*n] = 1; if (percent < 1 || percent > 100) @@ -127,13 +124,12 @@ public: virtual ~ModuleBlockCAPS() { - ServerInstance->Modes->DelMode(bc); - delete bc; + ServerInstance->Modes->DelMode(&bc); } virtual Version GetVersion() { - return Version(1,1,0,0,VF_COMMON|VF_VENDOR,API_VERSION); + return Version("$Id$", VF_COMMON|VF_VENDOR,API_VERSION); } };