]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_jumpserver.cpp
And remove soem debug
[user/henk/code/inspircd.git] / src / modules / m_jumpserver.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 "inspircd.h"
15 #include "users.h"
16 #include "channels.h"
17 #include "modules.h"
18
19 /* $ModDesc: Provides support for unreal-style SAPART command */
20
21 /** Handle /SAPART
22  */
23 class cmd_jumpserver : public command_t
24 {
25  public:
26         bool redirect_all_immediately;
27         bool redirect_new_users;
28         bool direction;
29         std::string redirect_to;
30         std::string reason;
31         int port;
32
33         cmd_jumpserver (InspIRCd* Instance) : command_t(Instance, "JUMPSERVER", 'o', 0)
34         {
35                 this->source = "m_jumpserver.so";
36                 syntax = "[<server> <port> <+/-a> :<reason>]";
37                 redirect_to = reason = "";
38                 port = 0;
39                 redirect_all_immediately = redirect_new_users = false;
40         }
41
42         CmdResult Handle (const char** parameters, int pcnt, userrec *user)
43         {
44                 int n_done = 0;
45                 reason = (pcnt < 4) ? "Please use this server/port instead" : parameters[3];
46                 redirect_all_immediately = false;
47                 redirect_new_users = true;
48                 direction = true;
49                 std::string n_done_s;
50
51                 /* No parameters: jumpserver disabled */
52                 if (!pcnt)
53                 {
54                         if (port)
55                                 user->WriteServ("NOTICE %s :*** Disabled jumpserver (previously set to '%s:%d')", user->nick, redirect_to.c_str(), port);
56                         else
57                                 user->WriteServ("NOTICE %s :*** jumpserver was not enabled.", user->nick);
58
59                         port = 0;
60                         redirect_to = "";
61                         return CMD_LOCALONLY;
62                 }
63
64                 port = 0;
65                 redirect_to = "";
66
67                 for (const char* n = parameters[2]; *n; n++)
68                 {
69                         switch (*n)
70                         {
71                                 case '+':
72                                         direction = true;
73                                 break;
74                                 case '-':
75                                         direction = false;
76                                 break;
77                                 case 'a':
78                                         redirect_all_immediately = direction;
79                                 break;
80                                 case 'n':
81                                         redirect_new_users = direction;
82                                 break;
83                         }
84                 }
85
86                 if (redirect_all_immediately)
87                 {
88                         /* Redirect everyone but the oper sending the command */
89                         for (std::vector<userrec*>::const_iterator i = ServerInstance->local_users.begin(); i != ServerInstance->local_users.end(); i++)
90                         {
91                                 userrec* t = *i;
92                                 if (!IS_OPER(t))
93                                 {
94                                         t->WriteServ("010 %s %s %s :Please use this Server/Port instead", user->nick, parameters[0], parameters[1]);
95                                         userrec::QuitUser(ServerInstance, t, reason);
96                                         n_done++;
97                                 }
98                         }
99                         if (n_done)
100                         {
101                                 n_done_s = ConvToStr(n_done);
102                         }
103                 }
104
105                 if (redirect_new_users)
106                 {
107                         redirect_to = parameters[0];
108                         port = atoi(parameters[1]);
109                 }
110
111                 user->WriteServ("NOTICE %s :*** Set jumpserver to server '%s' port '%s', flags '+%s%s'%s%s%s: %s", user->nick, parameters[0], parameters[1],
112                                 redirect_all_immediately ? "a" : "",
113                                 redirect_new_users ? "n" : "",
114                                 n_done ? " (" : "",
115                                 n_done ? n_done_s.c_str() : "",
116                                 n_done ? " user(s) redirected)" : "",
117                                 reason.c_str());
118
119                 return CMD_LOCALONLY;
120         }
121 };
122
123
124 class ModuleJumpServer : public Module
125 {
126         cmd_jumpserver* js;
127  public:
128         ModuleJumpServer(InspIRCd* Me)
129                 : Module(Me)
130         {
131                 
132                 js = new cmd_jumpserver(ServerInstance);
133                 ServerInstance->AddCommand(js);
134         }
135         
136         virtual ~ModuleJumpServer()
137         {
138         }
139
140         virtual int OnUserRegister(userrec* user)
141         {
142                 if (js->port && js->redirect_new_users)
143                 {
144                         user->WriteServ("010 %s %s %d :Please use this Server/Port instead", user->nick, js->redirect_to.c_str(), js->port);
145                         userrec::QuitUser(ServerInstance, user, js->reason);
146                         return 0;
147                 }
148                 return 0;
149         }
150
151         virtual void Implements(char* List)
152         {
153                 List[I_OnUserRegister] = 1;
154         }
155
156         virtual Version GetVersion()
157         {
158                 return Version(1,1,0,1,VF_VENDOR,API_VERSION);
159         }
160         
161 };
162
163 class ModuleJumpServerFactory : public ModuleFactory
164 {
165  public:
166         ModuleJumpServerFactory()
167         {
168         }
169         
170         ~ModuleJumpServerFactory()
171         {
172         }
173         
174         virtual Module * CreateModule(InspIRCd* Me)
175         {
176                 return new ModuleJumpServer(Me);
177         }
178         
179 };
180
181
182 extern "C" DllExport void * init_module( void )
183 {
184         return new ModuleJumpServerFactory;
185 }
186