]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_operprefix.cpp
e40f6b0506f35832d82a792ae92d3b37beb1a4f2
[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, "operprefix", '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_SERVER(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                 bool NeedsOper() { return true; }
53 };
54
55 class ModuleOperPrefixMode : public Module
56 {
57  private:
58         OperPrefixMode* opm;
59  public:
60         ModuleOperPrefixMode()  {
61                 ConfigReader Conf;
62                 std::string pfx = Conf.ReadValue("operprefix", "prefix", "!", 0, false);
63
64                 opm = new OperPrefixMode(this, pfx[0]);
65                 if ((!ServerInstance->Modes->AddMode(opm)))
66                         throw ModuleException("Could not add a new mode!");
67
68                 Implementation eventlist[] = { I_OnPostJoin, I_OnUserQuit, I_OnUserKick, I_OnUserPart, I_OnOper };
69                 ServerInstance->Modules->Attach(eventlist, this, 5);
70         }
71
72         void PushChanMode(Channel* channel, User* user)
73         {
74                 char modeline[] = "+y";
75                 std::vector<std::string> modechange;
76                 modechange.push_back(channel->name);
77                 modechange.push_back(modeline);
78                 modechange.push_back(user->nick);
79                 ServerInstance->SendMode(modechange,ServerInstance->FakeClient);
80         }
81
82         void OnPostJoin(Membership* memb)
83         {
84                 if (IS_OPER(memb->user) && !memb->user->IsModeSet('H'))
85                         PushChanMode(memb->chan, memb->user);
86         }
87
88         // XXX: is there a better way to do this?
89         ModResult OnRawMode(User* user, Channel* chan, const char mode, const std::string &param, bool adding, int pcnt)
90         {
91                 /* force event propagation to its ModeHandler */
92                 if (!IS_SERVER(user) && chan && (mode == 'y'))
93                         return MOD_RES_ALLOW;
94                 return MOD_RES_PASSTHRU;
95         }
96
97         void OnOper(User *user, const std::string&)
98         {
99                 if (user && !user->IsModeSet('H'))
100                 {
101                         for (UCListIter v = user->chans.begin(); v != user->chans.end(); v++)
102                         {
103                                 PushChanMode(*v, user);
104                         }
105                 }
106         }
107
108         ~ModuleOperPrefixMode()
109         {
110                 delete opm;
111         }
112
113         Version GetVersion()
114         {
115                 return Version("Gives opers cmode +y which provides a staff prefix.", VF_COMMON | VF_VENDOR);
116         }
117 };
118
119 MODULE_INIT(ModuleOperPrefixMode)