]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_swhois.cpp
Introduce Server class
[user/henk/code/inspircd.git] / src / modules / m_swhois.cpp
1 /*
2  * InspIRCd -- Internet Relay Chat Daemon
3  *
4  *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
5  *   Copyright (C) 2008 Pippijn van Steenhoven <pip88nl@gmail.com>
6  *   Copyright (C) 2007 Robin Burchell <robin+git@viroteck.net>
7  *   Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
8  *   Copyright (C) 2006-2007 John Brooks <john.brooks@dereferenced.net>
9  *   Copyright (C) 2005-2006 Craig Edwards <craigedwards@brainbox.cc>
10  *   Copyright (C) 2006 Oliver Lupton <oliverlupton@gmail.com>
11  *
12  * This file is part of InspIRCd.  InspIRCd is free software: you can
13  * redistribute it and/or modify it under the terms of the GNU General Public
14  * License as published by the Free Software Foundation, version 2.
15  *
16  * This program is distributed in the hope that it will be useful, but WITHOUT
17  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
19  * details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23  */
24
25
26 #include "inspircd.h"
27
28 /** Handle /SWHOIS
29  */
30 class CommandSwhois : public Command
31 {
32  public:
33         StringExtItem swhois;
34         CommandSwhois(Module* Creator) : Command(Creator,"SWHOIS", 2,2), swhois("swhois", Creator)
35         {
36                 flags_needed = 'o'; syntax = "<nick> :<swhois>";
37                 TRANSLATE2(TR_NICK, TR_TEXT);
38         }
39
40         CmdResult Handle(const std::vector<std::string> &parameters, User* user)
41         {
42                 User* dest = ServerInstance->FindNick(parameters[0]);
43
44                 if ((!dest) || (IS_SERVER(dest))) // allow setting swhois using SWHOIS before reg
45                 {
46                         user->WriteNumeric(ERR_NOSUCHNICK, "%s :No such nick/channel", parameters[0].c_str());
47                         return CMD_FAILURE;
48                 }
49
50                 std::string* text = swhois.get(dest);
51                 if (text)
52                 {
53                         // We already had it set...
54                         if (!user->server->IsULine())
55                                 // Ulines set SWHOISes silently
56                                 ServerInstance->SNO->WriteGlobalSno('a', "%s used SWHOIS to set %s's extra whois from '%s' to '%s'", user->nick.c_str(), dest->nick.c_str(), text->c_str(), parameters[1].c_str());
57                 }
58                 else if (!user->server->IsULine())
59                 {
60                         // Ulines set SWHOISes silently
61                         ServerInstance->SNO->WriteGlobalSno('a', "%s used SWHOIS to set %s's extra whois to '%s'", user->nick.c_str(), dest->nick.c_str(), parameters[1].c_str());
62                 }
63
64                 if (parameters[1].empty())
65                         swhois.unset(dest);
66                 else
67                         swhois.set(dest, parameters[1]);
68
69                 /* Bug #376 - feature request -
70                  * To cut down on the amount of commands services etc have to recognise, this only sends METADATA across the network now
71                  * not an actual SWHOIS command. Any SWHOIS command sent from services will be automatically translated to METADATA by this.
72                  * Sorry w00t i know this was your fix, but i got bored and wanted to clear down the tracker :)
73                  * -- Brain
74                  */
75                 ServerInstance->PI->SendMetaData(dest, "swhois", parameters[1]);
76
77                 return CMD_SUCCESS;
78         }
79
80 };
81
82 class ModuleSWhois : public Module
83 {
84         CommandSwhois cmd;
85
86  public:
87         ModuleSWhois() : cmd(this)
88         {
89         }
90
91         // :kenny.chatspike.net 320 Brain Azhrarn :is getting paid to play games.
92         ModResult OnWhoisLine(User* user, User* dest, int &numeric, std::string &text) CXX11_OVERRIDE
93         {
94                 /* We use this and not OnWhois because this triggers for remote, too */
95                 if (numeric == 312)
96                 {
97                         /* Insert our numeric before 312 */
98                         std::string* swhois = cmd.swhois.get(dest);
99                         if (swhois)
100                         {
101                                 ServerInstance->SendWhoisLine(user, dest, 320, "%s :%s", dest->nick.c_str(), swhois->c_str());
102                         }
103                 }
104
105                 /* Dont block anything */
106                 return MOD_RES_PASSTHRU;
107         }
108
109         void OnPostOper(User* user, const std::string &opertype, const std::string &opername) CXX11_OVERRIDE
110         {
111                 if (!IS_LOCAL(user))
112                         return;
113
114                 std::string swhois = user->oper->getConfig("swhois");
115
116                 if (!swhois.length())
117                         return;
118
119                 cmd.swhois.set(user, swhois);
120                 ServerInstance->PI->SendMetaData(user, "swhois", swhois);
121         }
122
123         Version GetVersion() CXX11_OVERRIDE
124         {
125                 return Version("Provides the SWHOIS command which allows setting of arbitrary WHOIS lines", VF_OPTCOMMON | VF_VENDOR);
126         }
127 };
128
129 MODULE_INIT(ModuleSWhois)