/*
* InspIRCd -- Internet Relay Chat Daemon
*
- * Copyright (C) 2004, 2008 Craig Edwards <craigedwards@brainbox.cc>
+ * Copyright (C) 2019 linuxdaemon <linuxdaemon.irc@gmail.com>
+ * Copyright (C) 2016 0x277F <0x277F@gmail.com>
+ * Copyright (C) 2013, 2017 Sadie Powell <sadie@witchery.services>
+ * Copyright (C) 2013 Attila Molnar <attilamolnar@hush.com>
+ * Copyright (C) 2012, 2019 Robby <robby@chatbelgie.be>
+ * Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
+ * Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
+ * Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
* Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
- * Copyright (C) 2007 Robin Burchell <robin+git@viroteck.net>
+ * Copyright (C) 2006, 2010 Craig Edwards <brain@inspircd.org>
*
* 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
#include "inspircd.h"
-
-/* $ModDesc: Provides channel +S mode (strip ansi color) */
-
-/** Handles channel mode +S
- */
-class ChannelStripColor : public SimpleChannelModeHandler
-{
- public:
- ChannelStripColor(Module* Creator) : SimpleChannelModeHandler(Creator, "stripcolor", 'S') { }
-};
-
-/** Handles user mode +S
- */
-class UserStripColor : public SimpleUserModeHandler
-{
- public:
- UserStripColor(Module* Creator) : SimpleUserModeHandler(Creator, "u_stripcolor", 'S') { }
-};
-
+#include "modules/exemption.h"
class ModuleStripColor : public Module
{
- bool AllowChanOps;
- ChannelStripColor csc;
- UserStripColor usc;
+ CheckExemption::EventProvider exemptionprov;
+ SimpleChannelModeHandler csc;
+ SimpleUserModeHandler usc;
public:
- ModuleStripColor() : csc(this), usc(this)
- {
- }
-
- void init()
- {
- ServerInstance->Modules->AddService(usc);
- ServerInstance->Modules->AddService(csc);
- Implementation eventlist[] = { I_OnUserPreMessage, I_OnUserPreNotice, I_On005Numeric };
- ServerInstance->Modules->Attach(eventlist, this, 3);
- }
-
- virtual ~ModuleStripColor()
+ ModuleStripColor()
+ : exemptionprov(this)
+ , csc(this, "stripcolor", 'S')
+ , usc(this, "u_stripcolor", 'S')
{
}
- virtual void On005Numeric(std::string &output)
+ void On005Numeric(std::map<std::string, std::string>& tokens) CXX11_OVERRIDE
{
- ServerInstance->AddExtBanChar('S');
+ tokens["EXTBAN"].push_back('S');
}
- virtual ModResult OnUserPreMessage(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list)
+ ModResult OnUserPreMessage(User* user, const MessageTarget& target, MessageDetails& details) CXX11_OVERRIDE
{
if (!IS_LOCAL(user))
return MOD_RES_PASSTHRU;
bool active = false;
- if (target_type == TYPE_USER)
+ switch (target.type)
{
- User* t = (User*)dest;
- active = t->IsModeSet('S');
- }
- else if (target_type == TYPE_CHANNEL)
- {
- Channel* t = (Channel*)dest;
- ModResult res = ServerInstance->OnCheckExemption(user,t,"stripcolor");
-
- if (res == MOD_RES_ALLOW)
- return MOD_RES_PASSTHRU;
-
- active = !t->GetExtBanStatus(user, 'S').check(!t->IsModeSet('S'));
+ case MessageTarget::TYPE_USER:
+ {
+ User* t = target.Get<User>();
+ active = t->IsModeSet(usc);
+ break;
+ }
+ case MessageTarget::TYPE_CHANNEL:
+ {
+ Channel* t = target.Get<Channel>();
+ ModResult res = CheckExemption::Call(exemptionprov, user, t, "stripcolor");
+
+ if (res == MOD_RES_ALLOW)
+ return MOD_RES_PASSTHRU;
+
+ active = !t->GetExtBanStatus(user, 'S').check(!t->IsModeSet(csc));
+ break;
+ }
+ case MessageTarget::TYPE_SERVER:
+ break;
}
if (active)
{
- InspIRCd::StripColor(text);
+ InspIRCd::StripColor(details.text);
}
return MOD_RES_PASSTHRU;
}
- virtual ModResult OnUserPreNotice(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list)
+ void OnUserPart(Membership* memb, std::string& partmessage, CUList& except_list) CXX11_OVERRIDE
{
- return OnUserPreMessage(user,dest,target_type,text,status,exempt_list);
+ User* user = memb->user;
+ Channel* channel = memb->chan;
+
+ if (!IS_LOCAL(user))
+ return;
+
+ if (channel->GetExtBanStatus(user, 'S').check(!user->IsModeSet(csc)))
+ {
+ ModResult res = CheckExemption::Call(exemptionprov, user, channel, "stripcolor");
+
+ if (res != MOD_RES_ALLOW)
+ InspIRCd::StripColor(partmessage);
+ }
}
- virtual Version GetVersion()
+ Version GetVersion() CXX11_OVERRIDE
{
- return Version("Provides channel +S mode (strip ansi color)", VF_VENDOR);
+ return Version("Adds channel mode S (stripcolor) which allows channels to strip IRC formatting codes from messages.", VF_VENDOR);
}
};