1 /* +------------------------------------+
\r * | Inspire Internet Relay Chat Daemon |
\r * +------------------------------------+
\r *
\r * InspIRCd: (C) 2002-2007 InspIRCd Development Team
\r * See: http://www.inspircd.org/wiki/index.php/Credits
\r *
\r * This program is free but copyrighted software; see
\r * the file COPYING for details.
\r *
\r * ---------------------------------------------------
\r */
\r\r#include "inspircd.h"
\r#include "users.h"
\r#include "channels.h"
\r#include "modules.h"
\r\r/* $ModDesc: Provides channel +S mode (strip ansi colour) */
\r\r/** Handles channel mode +S
\r */
\rclass ChannelStripColor : public ModeHandler
\r{
\r public:
\r ChannelStripColor(InspIRCd* Instance) : ModeHandler(Instance, 'S', 0, 0, false, MODETYPE_CHANNEL, false) { }
\r\r ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
\r {
\r if (adding)
\r {
\r if (!channel->IsModeSet('S'))
\r {
\r channel->SetMode('S',true);
\r return MODEACTION_ALLOW;
\r }
\r }
\r else
\r {
\r if (channel->IsModeSet('S'))
\r {
\r channel->SetMode('S',false);
\r return MODEACTION_ALLOW;
\r }
\r }
\r\r return MODEACTION_DENY;
\r }
\r};
\r\r/** Handles user mode +S
\r */
\rclass UserStripColor : public ModeHandler
\r{
\r public:
\r UserStripColor(InspIRCd* Instance) : ModeHandler(Instance, 'S', 0, 0, false, MODETYPE_USER, false) { }
\r\r ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
\r {
\r /* Only opers can change other users modes */
\r if (source != dest)
\r return MODEACTION_DENY;
\r\r if (adding)
\r {
\r if (!dest->IsModeSet('S'))
\r {
\r dest->SetMode('S',true);
\r return MODEACTION_ALLOW;
\r }
\r }
\r else
\r {
\r if (dest->IsModeSet('S'))
\r {
\r dest->SetMode('S',false);
\r return MODEACTION_ALLOW;
\r }
\r }
\r\r return MODEACTION_DENY;
\r }
\r};
\r\r\rclass ModuleStripColor : public Module
\r{
\r bool AllowChanOps;
\r ChannelStripColor *csc;
\r UserStripColor *usc;
\r \r public:
\r ModuleStripColor(InspIRCd* Me) : Module(Me)
\r {
\r usc = new UserStripColor(ServerInstance);
\r csc = new ChannelStripColor(ServerInstance);
\r\r if (!ServerInstance->AddMode(usc, 'S') || !ServerInstance->AddMode(csc, 'S'))
\r throw ModuleException("Could not add new modes!");
\r }
\r\r void Implements(char* List)
\r {
\r List[I_OnUserPreMessage] = List[I_OnUserPreNotice] = 1;
\r }
\r\r virtual ~ModuleStripColor()
\r {
\r ServerInstance->Modes->DelMode(usc);
\r ServerInstance->Modes->DelMode(csc);
\r DELETE(usc);
\r DELETE(csc);
\r }
\r \r virtual void ReplaceLine(std::string &sentence)
\r {
\r /* refactor this completely due to SQUIT bug since the old code would strip last char and replace with \0 --peavey */
\r int seq = 0;
\r std::string::iterator i,safei;
\r for (i = sentence.begin(); i != sentence.end(); ++i)
\r {
\r if ((*i == 3))
\r seq = 1;
\r else if (seq && ( (*i >= '0') && (*i <= '9') || (*i == ',') ) )
\r {
\r seq++;
\r if ( (seq <= 4) && (*i == ',') )
\r seq = 1;
\r else if (seq > 3)
\r seq = 0;
\r }
\r else
\r seq = 0;
\r \r if (seq || ((*i == 2) || (*i == 15) || (*i == 22) || (*i == 21) || (*i == 31)))
\r {
\r safei = i;
\r --i;
\r sentence.erase(safei);
\r }
\r }
\r }
\r\r virtual int OnUserPreMessage(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list)
\r {
\r if (!IS_LOCAL(user))
\r return 0;
\r\r bool active = false;
\r if (target_type == TYPE_USER)
\r {
\r userrec* t = (userrec*)dest;
\r active = t->IsModeSet('S');
\r }
\r else if (target_type == TYPE_CHANNEL)
\r {
\r chanrec* t = (chanrec*)dest;
\r\r // check if we allow ops to bypass filtering, if we do, check if they're opped accordingly.
\r // note: short circut logic here, don't wreck it. -- w00t
\r if (!CHANOPS_EXEMPT(ServerInstance, 'S') || CHANOPS_EXEMPT(ServerInstance, 'S') && t->GetStatus(user) != STATUS_OP)
\r active = t->IsModeSet('S');
\r }
\r\r if (active)
\r {
\r this->ReplaceLine(text);
\r }
\r\r return 0;
\r }
\r \r virtual int OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list)
\r {
\r return OnUserPreMessage(user,dest,target_type,text,status,exempt_list);
\r }
\r \r virtual Version GetVersion()
\r {
\r return Version(1, 1, 0, 0, VF_COMMON | VF_VENDOR, API_VERSION);
\r }
\r \r};
\r\rMODULE_INIT(ModuleStripColor)
\r