]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_customtitle.cpp
Merge tag 'v2.0.27' into master.
[user/henk/code/inspircd.git] / src / modules / m_customtitle.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 Dennis Friis <peavey@inspircd.org>
7  *
8  * This file is part of InspIRCd.  InspIRCd is free software: you can
9  * redistribute it and/or modify it under the terms of the GNU General Public
10  * License as published by the Free Software Foundation, version 2.
11  *
12  * This program is distributed in the hope that it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
15  * details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21
22 #include "inspircd.h"
23 #include "modules/whois.h"
24
25 enum
26 {
27         // From UnrealIRCd.
28         RPL_WHOISSPECIAL = 320
29 };
30
31 /** Handle /TITLE
32  */
33 class CommandTitle : public Command
34 {
35  public:
36         StringExtItem ctitle;
37         CommandTitle(Module* Creator) : Command(Creator,"TITLE", 2),
38                 ctitle("ctitle", ExtensionItem::EXT_USER, Creator)
39         {
40                 syntax = "<user> <password>";
41         }
42
43         CmdResult Handle(User* user, const Params& parameters) CXX11_OVERRIDE
44         {
45                 const std::string userHost = user->ident + "@" + user->GetRealHost();
46                 const std::string userIP = user->ident + "@" + user->GetIPString();
47
48                 ConfigTagList tags = ServerInstance->Config->ConfTags("title");
49                 for (ConfigIter i = tags.first; i != tags.second; ++i)
50                 {
51                         std::string Name = i->second->getString("name");
52                         std::string pass = i->second->getString("password");
53                         std::string hash = i->second->getString("hash");
54                         std::string host = i->second->getString("host", "*@*");
55                         std::string title = i->second->getString("title");
56                         std::string vhost = i->second->getString("vhost");
57
58                         if (Name == parameters[0] && ServerInstance->PassCompare(user, pass, parameters[1], hash) &&
59                                 InspIRCd::MatchMask(host, userHost, userIP) && !title.empty())
60                         {
61                                 ctitle.set(user, title);
62
63                                 ServerInstance->PI->SendMetaData(user, "ctitle", title);
64
65                                 if (!vhost.empty())
66                                         user->ChangeDisplayedHost(vhost);
67
68                                 user->WriteNotice("Custom title set to '" + title + "'");
69
70                                 return CMD_SUCCESS;
71                         }
72                 }
73
74                 user->WriteNotice("Invalid title credentials");
75                 return CMD_SUCCESS;
76         }
77
78 };
79
80 class ModuleCustomTitle : public Module, public Whois::LineEventListener
81 {
82         CommandTitle cmd;
83
84  public:
85         ModuleCustomTitle()
86                 : Whois::LineEventListener(this)
87                 , cmd(this)
88         {
89         }
90
91         // :kenny.chatspike.net 320 Brain Azhrarn :is getting paid to play games.
92         ModResult OnWhoisLine(Whois::Context& whois, Numeric::Numeric& numeric) CXX11_OVERRIDE
93         {
94                 /* We use this and not OnWhois because this triggers for remote, too */
95                 if (numeric.GetNumeric() == 312)
96                 {
97                         /* Insert our numeric before 312 */
98                         const std::string* ctitle = cmd.ctitle.get(whois.GetTarget());
99                         if (ctitle)
100                         {
101                                 whois.SendLine(RPL_WHOISSPECIAL, ctitle);
102                         }
103                 }
104                 /* Don't block anything */
105                 return MOD_RES_PASSTHRU;
106         }
107
108         Version GetVersion() CXX11_OVERRIDE
109         {
110                 return Version("Custom Title for users", VF_OPTCOMMON | VF_VENDOR);
111         }
112 };
113
114 MODULE_INIT(ModuleCustomTitle)