From 36458ccc7224de4de4c6740c021e1d38b401ee14 Mon Sep 17 00:00:00 2001 From: peavey Date: Sun, 26 Nov 2006 23:22:55 +0000 Subject: Provides support for ircu style usermode +d (deaf to channel messages and channel notices) git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@5814 e03df62e-2008-0410-955e-edbf42e46eb7 --- src/modules/m_deaf.cpp | 158 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 src/modules/m_deaf.cpp (limited to 'src/modules') diff --git a/src/modules/m_deaf.cpp b/src/modules/m_deaf.cpp new file mode 100644 index 000000000..19fb0bd65 --- /dev/null +++ b/src/modules/m_deaf.cpp @@ -0,0 +1,158 @@ +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev. + * E-mail: + * + * + * + * Written by Craig Edwards, Craig McLure, and others. + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +using namespace std; + +#include "users.h" +#include "channels.h" +#include "modules.h" +#include "inspircd.h" + +/* $ModDesc: Provides support for ircu style usermode +d (deaf to channel messages and channel notices) */ + +/** User mode +d - filter out channel messages and channel notices + */ +class User_d : public ModeHandler +{ + public: + User_d(InspIRCd* Instance) : ModeHandler(Instance, 'd', 0, 0, false, MODETYPE_USER, false) { } + + ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding) + { + if (adding) + { + if (!dest->IsModeSet('d')) + { + dest->SetMode('d',true); + return MODEACTION_ALLOW; + } + } + else + { + if (dest->IsModeSet('d')) + { + dest->SetMode('d',false); + return MODEACTION_ALLOW; + } + } + return MODEACTION_DENY; + } +}; + +class ModuleDeaf : public Module +{ + User_d* m1; + public: + ModuleDeaf(InspIRCd* Me) + : Module::Module(Me) + { + m1 = new User_d(ServerInstance); + ServerInstance->AddMode(m1, 'd'); + } + + void Implements(char* List) + { + List[I_OnUserPreMessage] = List[I_OnUserPreNotice] = 1; + } + + virtual int OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list) + { + return PreText(user, dest, target_type, text, status, exempt_list); + } + + virtual int OnUserPreMessage(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list) + { + return PreText(user, dest, target_type, text, status, exempt_list); + } + + virtual int PreText(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list) + { + if (target_type == TYPE_CHANNEL) + { + chanrec* chan = (chanrec*)dest; + if (chan) + { + CUList *ulist; + switch (status) + { + case '@': + ulist = chan->GetOppedUsers(); + break; + case '%': + ulist = chan->GetHalfoppedUsers(); + break; + case '+': + ulist = chan->GetVoicedUsers(); + break; + default: + ulist = chan->GetUsers(); + break; + } + + for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++) + { + if ((IS_LOCAL(i->second)) && (user != i->second)) + { + if (i->second->IsModeSet('d')) + { + exempt_list[i->second] = i->second; + } + } + } + } + } + return 0; + } + + + virtual ~ModuleDeaf() + { + ServerInstance->Modes->DelMode(m1); + DELETE(m1); + } + + virtual Version GetVersion() + { + return Version(1,1,0,0,VF_COMMON|VF_VENDOR,API_VERSION); + } + +}; + + +class ModuleDeafFactory : public ModuleFactory +{ + public: + ModuleDeafFactory() + { + } + + ~ModuleDeafFactory() + { + } + + virtual Module * CreateModule(InspIRCd* Me) + { + return new ModuleDeaf(Me); + } + +}; + + +extern "C" void * init_module( void ) +{ + return new ModuleDeafFactory; +} + -- cgit v1.2.3