]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_chghost.cpp
Someone is getting slapped for this; the new hidesplits/hidebans behavior doesn't...
[user/henk/code/inspircd.git] / src / modules / m_chghost.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd: (C) 2002-2007 InspIRCd Development Team
6  * See: http://www.inspircd.org/wiki/index.php/Credits
7  *
8  * This program is free but copyrighted software; see
9  *            the file COPYING for details.
10  *
11  * ---------------------------------------------------
12  */
13
14 #include <stdio.h>
15 #include <string>
16 #include "users.h"
17 #include "channels.h"
18 #include "modules.h"
19
20 #include "inspircd.h"
21
22 /* $ModDesc: Provides support for the CHGHOST command */
23
24 /** Handle /CHGHOST
25  */
26 class cmd_chghost : public command_t
27 {
28  private:
29         char* hostmap;
30  public:
31         cmd_chghost (InspIRCd* Instance, char* hmap) : command_t(Instance,"CHGHOST",'o',2), hostmap(hmap)
32         {
33                 this->source = "m_chghost.so";
34                 syntax = "<nick> <newhost>";
35         }
36  
37         CmdResult Handle(const char** parameters, int pcnt, userrec *user)
38         {
39                 const char * x = parameters[1];
40
41                 for (; *x; x++)
42                 {
43                         if (!hostmap[(unsigned char)*x])
44                         {
45                                 user->WriteServ("NOTICE "+std::string(user->nick)+" :*** Invalid characters in hostname");
46                                 return CMD_FAILURE;
47                         }
48                 }
49                 if ((parameters[1] - x) > 63)
50                 {
51                         user->WriteServ("NOTICE %s :*** CHGHOST: Host too long",user->nick);
52                         return CMD_FAILURE;
53                 }
54                 userrec* dest = ServerInstance->FindNick(parameters[0]);
55                 if (dest)
56                 {
57                         if ((dest->ChangeDisplayedHost(parameters[1])) && (!ServerInstance->ULine(user->server)))
58                         {
59                                 // fix by brain - ulines set hosts silently
60                                 ServerInstance->WriteOpers(std::string(user->nick)+" used CHGHOST to make the displayed host of "+dest->nick+" become "+dest->dhost);
61                         }
62                         return CMD_SUCCESS;
63                 }
64
65                 return CMD_FAILURE;
66         }
67 };
68
69
70 class ModuleChgHost : public Module
71 {
72         cmd_chghost* mycommand;
73         char hostmap[256];
74  public:
75         ModuleChgHost(InspIRCd* Me)
76                 : Module::Module(Me)
77         {
78                 OnRehash(NULL,"");
79                 mycommand = new cmd_chghost(ServerInstance, hostmap);
80                 ServerInstance->AddCommand(mycommand);
81         }
82
83         void Implements(char* List)
84         {
85                 List[I_OnRehash] = 1;
86         }
87         
88         void OnRehash(userrec* user, const std::string &parameter)
89         {
90                 ConfigReader Conf(ServerInstance);
91                 std::string hmap = Conf.ReadValue("hostname", "charmap", 0);
92
93                 if (hmap.empty())
94                         hmap = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.-_/0123456789";
95
96                 memset(&hostmap, 0, 255);
97                 for (std::string::iterator n = hmap.begin(); n != hmap.end(); n++)
98                         hostmap[(unsigned char)*n] = 1;
99         }
100
101         ~ModuleChgHost()
102         {
103         }
104         
105         Version GetVersion()
106         {
107                 return Version(1, 1, 0, 0, VF_VENDOR, API_VERSION);
108         }
109         
110 };
111
112
113 class ModuleChgHostFactory : public ModuleFactory
114 {
115  public:
116         ModuleChgHostFactory()
117         {
118         }
119         
120         ~ModuleChgHostFactory()
121         {
122         }
123         
124         virtual Module * CreateModule(InspIRCd* Me)
125         {
126                 return new ModuleChgHost(Me);
127         }
128         
129 };
130
131
132 extern "C" void * init_module( void )
133 {
134         return new ModuleChgHostFactory;
135 }
136