]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_showwhois.cpp
Fix WHOISNOTICE parameters being sent backwards
[user/henk/code/inspircd.git] / src / modules / m_showwhois.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd: (C) 2002-2010 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 #include "inspircd.h"
15
16 /* $ModDesc: Allows opers to set +W to see when a user uses WHOIS on them */
17
18 /** Handle user mode +W
19  */
20 class SeeWhois : public ModeHandler
21 {
22  public:
23         SeeWhois(Module* Creator, bool IsOpersOnly) : ModeHandler(Creator, "showwhois", 'W', PARAM_NONE, MODETYPE_USER)
24         {
25                 oper = IsOpersOnly;
26         }
27
28         ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string &parameter, bool adding)
29         {
30                 if (adding)
31                 {
32                         if (!dest->IsModeSet('W'))
33                         {
34                                 dest->SetMode('W',true);
35                                 return MODEACTION_ALLOW;
36                         }
37                 }
38                 else
39                 {
40                         if (dest->IsModeSet('W'))
41                         {
42                                 dest->SetMode('W',false);
43                                 return MODEACTION_ALLOW;
44                         }
45                 }
46
47                 return MODEACTION_DENY;
48         }
49 };
50
51 class WhoisNoticeCmd : public Command
52 {
53  public:
54         WhoisNoticeCmd(Module* Creator) : Command(Creator,"WHOISNOTICE", 1)
55         {
56                 flags_needed = FLAG_SERVERONLY;
57         }
58
59         void HandleFast(User* dest, User* src)
60         {
61                 dest->WriteServ("NOTICE %s :*** %s (%s@%s) did a /whois on you",
62                         dest->nick.c_str(), src->nick.c_str(), src->ident.c_str(),
63                         dest->HasPrivPermission("users/auspex") ? src->host.c_str() : src->dhost.c_str());
64         }
65
66         CmdResult Handle(const std::vector<std::string> &parameters, User *user)
67         {
68                 User* dest = ServerInstance->FindNick(parameters[0]);
69                 User* source = ServerInstance->FindNick(parameters[1]);
70
71                 if (IS_LOCAL(dest) && source)
72                         HandleFast(dest, source);
73
74                 return CMD_SUCCESS;
75         }
76 };
77
78 class ModuleShowwhois : public Module
79 {
80         bool ShowWhoisFromOpers;
81         SeeWhois* sw;
82         WhoisNoticeCmd cmd;
83
84  public:
85
86         ModuleShowwhois() : cmd(this)
87         {
88                 ConfigReader conf;
89                 bool OpersOnly = conf.ReadFlag("showwhois", "opersonly", "yes", 0);
90                 ShowWhoisFromOpers = conf.ReadFlag("showwhois", "showfromopers", "yes", 0);
91
92                 sw = new SeeWhois(this, OpersOnly);
93                 if (!ServerInstance->Modes->AddMode(sw))
94                         throw ModuleException("Could not add new modes!");
95                 ServerInstance->AddCommand(&cmd);
96                 Implementation eventlist[] = { I_OnWhois };
97                 ServerInstance->Modules->Attach(eventlist, this, 1);
98         }
99
100         ~ModuleShowwhois()
101         {
102                 delete sw;
103         }
104
105         Version GetVersion()
106         {
107                 return Version("Allows opers to set +W to see when a user uses WHOIS on them",VF_OPTCOMMON|VF_VENDOR);
108         }
109
110         void OnWhois(User* source, User* dest)
111         {
112                 if (!dest->IsModeSet('W') || source == dest)
113                         return;
114
115                 if (!ShowWhoisFromOpers && (!IS_OPER(source) != !IS_OPER(dest)))
116                         return;
117
118                 if (IS_LOCAL(dest))
119                 {
120                         cmd.HandleFast(dest, source);
121                 }
122                 else
123                 {
124                         std::vector<std::string> params;
125                         params.push_back(dest->server);
126                         params.push_back("WHOISNOTICE");
127                         params.push_back(dest->uuid);
128                         params.push_back(source->uuid);
129                         ServerInstance->PI->SendEncapsulatedData(params);
130                 }
131         }
132
133 };
134
135 MODULE_INIT(ModuleShowwhois)