]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_deaf.cpp
19fb0bd65bd15760cf9ec5d00d821b2a5ef0ccca
[user/henk/code/inspircd.git] / src / modules / m_deaf.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
6  *                       E-mail:
7  *                <brain@chatspike.net>
8  *                <Craig@chatspike.net>
9  *     
10  * Written by Craig Edwards, Craig McLure, and others.
11  * This program is free but copyrighted software; see
12  *            the file COPYING for details.
13  *
14  * ---------------------------------------------------
15  */
16
17 using namespace std;
18 \r
19 #include "users.h"
20 #include "channels.h"
21 #include "modules.h"
22 #include "inspircd.h"
23 \r
24 /* $ModDesc: Provides support for ircu style usermode +d (deaf to channel messages and channel notices) */
25 \r
26 /** User mode +d - filter out channel messages and channel notices
27  */
28 class User_d : public ModeHandler
29 {
30  public:
31         User_d(InspIRCd* Instance) : ModeHandler(Instance, 'd', 0, 0, false, MODETYPE_USER, false) { }
32
33         ModeAction OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string &parameter, bool adding)
34         {
35                 if (adding)
36                 {
37                         if (!dest->IsModeSet('d'))
38                         {
39                                 dest->SetMode('d',true);
40                                 return MODEACTION_ALLOW;
41                         }
42                 }
43                 else
44                 {
45                         if (dest->IsModeSet('d'))
46                         {
47                                 dest->SetMode('d',false);
48                                 return MODEACTION_ALLOW;
49                         }
50                 }
51                 return MODEACTION_DENY;
52         }
53 };
54 \r
55 class ModuleDeaf : public Module
56 {\r
57         User_d* m1;\r
58  public:
59         ModuleDeaf(InspIRCd* Me)
60                 : Module::Module(Me)
61         {\r
62                 m1 = new User_d(ServerInstance);\r
63                 ServerInstance->AddMode(m1, 'd');
64         }
65 \r
66         void Implements(char* List)
67         {
68                 List[I_OnUserPreMessage] = List[I_OnUserPreNotice] = 1;
69         }
70 \r
71         virtual int OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list)
72         {
73                 return PreText(user, dest, target_type, text, status, exempt_list);
74         }
75 \r
76         virtual int OnUserPreMessage(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list)
77         {\r
78                 return PreText(user, dest, target_type, text, status, exempt_list);
79         }\r
80 \r
81         virtual int PreText(userrec* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list)
82         {\r
83                 if (target_type == TYPE_CHANNEL)\r
84                 {
85                         chanrec* chan = (chanrec*)dest;\r
86                         if (chan)
87                         {
88                                 CUList *ulist;
89                                 switch (status)
90                                 {
91                                         case '@':
92                                                 ulist = chan->GetOppedUsers();
93                                                 break;
94                                         case '%':
95                                                 ulist = chan->GetHalfoppedUsers();
96                                                 break;
97                                         case '+':
98                                                 ulist = chan->GetVoicedUsers();
99                                                 break;
100                                         default:
101                                                 ulist = chan->GetUsers();
102                                                 break;
103                                 }
104
105                                 for (CUList::iterator i = ulist->begin(); i != ulist->end(); i++)
106                                 {
107                                         if ((IS_LOCAL(i->second)) && (user != i->second))
108                                         {
109                                                 if (i->second->IsModeSet('d'))
110                                                 {
111                                                         exempt_list[i->second] = i->second;
112                                                 }
113                                         }
114                                 }\r
115                         }\r
116                 }\r
117                 return 0;
118         }
119 \r
120 \r
121         virtual ~ModuleDeaf()
122         {\r
123                 ServerInstance->Modes->DelMode(m1);
124                 DELETE(m1);
125         }
126 \r
127         virtual Version GetVersion()
128         {
129                 return Version(1,1,0,0,VF_COMMON|VF_VENDOR,API_VERSION);
130         }
131 \r
132 };
133 \r
134 \r
135 class ModuleDeafFactory : public ModuleFactory
136 {
137  public:
138         ModuleDeafFactory()
139         {
140         }
141         
142         ~ModuleDeafFactory()
143         {
144         }
145         
146         virtual Module * CreateModule(InspIRCd* Me)
147         {
148                 return new ModuleDeaf(Me);
149         }
150         
151 };
152
153
154 extern "C" void * init_module( void )
155 {
156         return new ModuleDeafFactory;
157 }
158