]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_jumpserver.cpp
28bbd056ec8846f77ef8542ebab12dade995afcd
[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.clear();
38                 reason.clear();
39                 port = 0;
40                 redirect_all_immediately = redirect_new_users = false;
41         }
42
43         CmdResult Handle (const char** parameters, int pcnt, userrec *user)
44         {
45                 int n_done = 0;
46                 reason = (pcnt < 4) ? "Please use this server/port instead" : parameters[3];
47                 redirect_all_immediately = false;
48                 redirect_new_users = true;
49                 direction = true;
50                 std::string n_done_s;
51
52                 /* No parameters: jumpserver disabled */
53                 if (!pcnt)
54                 {
55                         if (port)
56                                 user->WriteServ("NOTICE %s :*** Disabled jumpserver (previously set to '%s:%d')", user->nick, redirect_to.c_str(), port);
57                         else
58                                 user->WriteServ("NOTICE %s :*** jumpserver was not enabled.", user->nick);
59
60                         port = 0;
61                         redirect_to.clear();
62                         return CMD_LOCALONLY;
63                 }
64
65                 port = 0;
66                 redirect_to.clear();
67
68                 for (const char* n = parameters[2]; *n; n++)
69                 {
70                         switch (*n)
71                         {
72                                 case '+':
73                                         direction = true;
74                                 break;
75                                 case '-':
76                                         direction = false;
77                                 break;
78                                 case 'a':
79                                         redirect_all_immediately = direction;
80                                 break;
81                                 case 'n':
82                                         redirect_new_users = direction;
83                                 break;
84                         }
85                 }
86
87                 if (redirect_all_immediately)
88                 {
89                         /* Redirect everyone but the oper sending the command */
90                         for (std::vector<userrec*>::const_iterator i = ServerInstance->local_users.begin(); i != ServerInstance->local_users.end(); i++)
91                         {
92                                 userrec* t = *i;
93                                 if (!IS_OPER(t))
94                                 {
95                                         t->WriteServ("010 %s %s %s :Please use this Server/Port instead", user->nick, parameters[0], parameters[1]);
96                                         userrec::QuitUser(ServerInstance, t, reason);
97                                         n_done++;
98                                 }
99                         }
100                         if (n_done)
101                         {
102                                 n_done_s = ConvToStr(n_done);
103                         }
104                 }
105
106                 if (redirect_new_users)
107                 {
108                         redirect_to = parameters[0];
109                         port = atoi(parameters[1]);
110                 }
111
112                 user->WriteServ("NOTICE %s :*** Set jumpserver to server '%s' port '%s', flags '+%s%s'%s%s%s: %s", user->nick, parameters[0], parameters[1],
113                                 redirect_all_immediately ? "a" : "",
114                                 redirect_new_users ? "n" : "",
115                                 n_done ? " (" : "",
116                                 n_done ? n_done_s.c_str() : "",
117                                 n_done ? " user(s) redirected)" : "",
118                                 reason.c_str());
119
120                 return CMD_LOCALONLY;
121         }
122 };
123
124
125 class ModuleJumpServer : public Module
126 {
127         cmd_jumpserver* js;
128  public:
129         ModuleJumpServer(InspIRCd* Me)
130                 : Module(Me)
131         {
132                 
133                 js = new cmd_jumpserver(ServerInstance);
134                 ServerInstance->AddCommand(js);
135         }
136         
137         virtual ~ModuleJumpServer()
138         {
139         }
140
141         virtual int OnUserRegister(userrec* user)
142         {
143                 if (js->port && js->redirect_new_users)
144                 {
145                         user->WriteServ("010 %s %s %d :Please use this Server/Port instead", user->nick, js->redirect_to.c_str(), js->port);
146                         userrec::QuitUser(ServerInstance, user, js->reason);
147                         return 0;
148                 }
149                 return 0;
150         }
151
152         virtual void Implements(char* List)
153         {
154                 List[I_OnUserRegister] = 1;
155         }
156
157         virtual Version GetVersion()
158         {
159                 return Version(1,1,0,1,VF_VENDOR,API_VERSION);
160         }
161         
162 };
163
164 MODULE_INIT(ModuleJumpServer)