]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_operprefix.cpp
Remove InspIRCd* parameters and fields
[user/henk/code/inspircd.git] / src / modules / m_operprefix.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
6  * See: http://wiki.inspircd.org/Credits
7  *
8  * This program is free but copyrighted software; see
9  *            the file COPYING for details.
10  *
11  * ---------------------------------------------------
12  */
13
14 /*
15  * Originally by Chernov-Phoenix Alexey (Phoenix@RusNet) mailto:phoenix /email address separator/ pravmail.ru
16  */
17
18 /* $ModDesc: Gives opers cmode +y which provides a staff prefix. */
19
20 #include "inspircd.h"
21
22 #define OPERPREFIX_VALUE 1000000
23
24 class OperPrefixMode : public ModeHandler
25 {
26         public:
27                 OperPrefixMode(Module* Creator, char pfx) : ModeHandler(Creator, 'y', PARAM_ALWAYS, MODETYPE_CHANNEL)
28                 {
29                         list = true;
30                         prefix = pfx;
31                         levelrequired = OPERPREFIX_VALUE;
32                         m_paramtype = TR_NICK;
33                 }
34
35                 unsigned int GetPrefixRank()
36                 {
37                         return OPERPREFIX_VALUE;
38                 }
39
40                 ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding)
41                 {
42                         if (IS_FAKE(source) || (source && ServerInstance->ULine(source->server)))
43                                 return MODEACTION_ALLOW;
44                         else
45                         {
46                                 if (source && channel)
47                                         source->WriteNumeric(ERR_CHANOPRIVSNEEDED, "%s %s :Only servers are permitted to change channel mode '%c'", source->nick.c_str(), channel->name.c_str(), 'y');
48                                 return MODEACTION_DENY;
49                         }
50                 }
51
52                 ModePair ModeSet(User* source, User* dest, Channel* channel, const std::string &parameter)
53                 {
54                         User* x = ServerInstance->FindNick(parameter);
55                         Membership* m = channel->GetUser(x);
56                         if (x)
57                         {
58                                 if (!m)
59                                 {
60                                         return std::make_pair(false, parameter);
61                                 }
62                                 else
63                                 {
64                                         if (m->hasMode('y'))
65                                                 return std::make_pair(true, x->nick);
66                                         else
67                                                         return std::make_pair(false, parameter);
68                                 }
69                         }
70                         return std::make_pair(false, parameter);
71                 }
72
73                 bool NeedsOper() { return true; }
74 };
75
76 class ModuleOperPrefixMode : public Module
77 {
78  private:
79         OperPrefixMode* opm;
80  public:
81         ModuleOperPrefixMode()  {
82                 ConfigReader Conf;
83                 std::string pfx = Conf.ReadValue("operprefix", "prefix", "!", 0, false);
84
85                 opm = new OperPrefixMode(this, pfx[0]);
86                 if ((!ServerInstance->Modes->AddMode(opm)))
87                         throw ModuleException("Could not add a new mode!");
88
89                 Implementation eventlist[] = { I_OnPostJoin, I_OnUserQuit, I_OnUserKick, I_OnUserPart, I_OnOper };
90                 ServerInstance->Modules->Attach(eventlist, this, 5);
91         }
92
93         void PushChanMode(Channel* channel, User* user)
94         {
95                 char modeline[] = "+y";
96                 std::vector<std::string> modechange;
97                 modechange.push_back(channel->name);
98                 modechange.push_back(modeline);
99                 modechange.push_back(user->nick);
100                 ServerInstance->SendMode(modechange,ServerInstance->FakeClient);
101         }
102
103         void OnPostJoin(Membership* memb)
104         {
105                 if (IS_OPER(memb->user) && !memb->user->IsModeSet('H'))
106                         PushChanMode(memb->chan, memb->user);
107         }
108
109         // XXX: is there a better way to do this?
110         ModResult OnRawMode(User* user, Channel* chan, const char mode, const std::string &param, bool adding, int pcnt)
111         {
112                 /* force event propagation to its ModeHandler */
113                 if (!IS_FAKE(user) && chan && (mode == 'y'))
114                         return MOD_RES_ALLOW;
115                 return MOD_RES_PASSTHRU;
116         }
117
118         void OnOper(User *user, const std::string&)
119         {
120                 if (user && !user->IsModeSet('H'))
121                 {
122                         for (UCListIter v = user->chans.begin(); v != user->chans.end(); v++)
123                         {
124                                 PushChanMode(*v, user);
125                         }
126                 }
127         }
128
129         ~ModuleOperPrefixMode()
130         {
131                 ServerInstance->Modes->DelMode(opm);
132                 delete opm;
133         }
134
135         Version GetVersion()
136         {
137                 return Version("Gives opers cmode +y which provides a staff prefix.", VF_COMMON | VF_VENDOR, API_VERSION);
138         }
139 };
140
141 MODULE_INIT(ModuleOperPrefixMode)