]> git.lizzy.rs Git - dragonfireclient.git/blob - src/servercommand.cpp
Merge branch 'master' of github.com:erlehmann/minetest-delta
[dragonfireclient.git] / src / servercommand.cpp
1 /*
2 Part of Minetest-c55
3 Copyright (C) 2010-11 celeron55, Perttu Ahola <celeron55@gmail.com>
4 Copyright (C) 2011 Ciaran Gultnieks <ciaran@ciarang.com>
5
6 Permission to use, copy, modify, and distribute this software for any
7 purpose with or without fee is hereby granted, provided that the above
8 copyright notice and this permission notice appear in all copies.
9
10 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #include "servercommand.h"
20 #include "utility.h"
21
22 void cmd_status(std::wostringstream &os,
23         ServerCommandContext *ctx)
24 {
25         os<<ctx->server->getStatusString();
26 }
27
28 void cmd_privs(std::wostringstream &os,
29         ServerCommandContext *ctx)
30 {
31         if(ctx->parms.size() == 1)
32         {
33                 // Show our own real privs, without any adjustments
34                 // made for admin status
35                 os<<L"-!- " + narrow_to_wide(privsToString(
36                                 ctx->server->getPlayerAuthPrivs(ctx->player->getName())));
37                 return;
38         }
39
40         if((ctx->privs & PRIV_PRIVS) == 0)
41         {
42                 os<<L"-!- You don't have permission to do that";
43                 return;
44         }
45                 
46         Player *tp = ctx->env->getPlayer(wide_to_narrow(ctx->parms[1]).c_str());
47         if(tp == NULL)
48         {
49                 os<<L"-!- No such player";
50                 return;
51         }
52         
53         os<<L"-!- " + narrow_to_wide(privsToString(ctx->server->getPlayerAuthPrivs(tp->getName())));
54 }
55
56 void cmd_grantrevoke(std::wostringstream &os,
57         ServerCommandContext *ctx)
58 {
59         if(ctx->parms.size() != 3)
60         {
61                 os<<L"-!- Missing parameter";
62                 return;
63         }
64
65         if((ctx->privs & PRIV_PRIVS) == 0)
66         {
67                 os<<L"-!- You don't have permission to do that";
68                 return;
69         }
70
71         u64 newprivs = stringToPrivs(wide_to_narrow(ctx->parms[2]));
72         if(newprivs == PRIV_INVALID)
73         {
74                 os<<L"-!- Invalid privileges specified";
75                 return;
76         }
77
78         Player *tp = ctx->env->getPlayer(wide_to_narrow(ctx->parms[1]).c_str());
79         if(tp == NULL)
80         {
81                 os<<L"-!- No such player";
82                 return;
83         }
84         
85         std::string playername = wide_to_narrow(ctx->parms[1]);
86         u64 privs = ctx->server->getPlayerAuthPrivs(playername);
87
88         if(ctx->parms[0] == L"grant")
89                 privs |= newprivs;
90         else
91                 privs &= ~newprivs;
92         
93         ctx->server->setPlayerAuthPrivs(playername, privs);
94         
95         os<<L"-!- Privileges change to ";
96         os<<narrow_to_wide(privsToString(privs));
97 }
98
99 void cmd_time(std::wostringstream &os,
100         ServerCommandContext *ctx)
101 {
102         if(ctx->parms.size() != 2)
103         {
104                 os<<L"-!- Missing parameter";
105                 return;
106         }
107
108         if((ctx->privs & PRIV_SETTIME) ==0)
109         {
110                 os<<L"-!- You don't have permission to do that";
111                 return;
112         }
113
114         u32 time = stoi(wide_to_narrow(ctx->parms[1]));
115         ctx->server->setTimeOfDay(time);
116         os<<L"-!- time_of_day changed.";
117 }
118
119 void cmd_shutdown(std::wostringstream &os,
120         ServerCommandContext *ctx)
121 {
122         if((ctx->privs & PRIV_SERVER) ==0)
123         {
124                 os<<L"-!- You don't have permission to do that";
125                 return;
126         }
127
128         dstream<<DTIME<<" Server: Operator requested shutdown."
129                 <<std::endl;
130         ctx->server->requestShutdown();
131                                         
132         os<<L"*** Server shutting down (operator request)";
133         ctx->flags |= 2;
134 }
135
136 void cmd_setting(std::wostringstream &os,
137         ServerCommandContext *ctx)
138 {
139         if((ctx->privs & PRIV_SERVER) ==0)
140         {
141                 os<<L"-!- You don't have permission to do that";
142                 return;
143         }
144
145         /*std::string confline = wide_to_narrow(
146                         ctx->parms[1] + L" = " + ctx->params[2]);*/
147
148         std::string confline = wide_to_narrow(ctx->paramstring);
149         
150         g_settings.parseConfigLine(confline);
151         
152         ctx->server->saveConfig();
153
154         os<< L"-!- Setting changed and configuration saved.";
155 }
156
157 void cmd_teleport(std::wostringstream &os,
158         ServerCommandContext *ctx)
159 {
160         if((ctx->privs & PRIV_TELEPORT) ==0)
161         {
162                 os<<L"-!- You don't have permission to do that";
163                 return;
164         }
165
166         if(ctx->parms.size() != 2)
167         {
168                 os<<L"-!- Missing parameter";
169                 return;
170         }
171
172         std::vector<std::wstring> coords = str_split(ctx->parms[1], L',');
173         if(coords.size() != 3)
174         {
175                 os<<L"-!- You can only specify coordinates currently";
176                 return;
177         }
178
179         v3f dest(stoi(coords[0])*10, stoi(coords[1])*10, stoi(coords[2])*10);
180         ctx->player->setPosition(dest);
181         ctx->server->SendMovePlayer(ctx->player);
182
183         os<< L"-!- Teleported.";
184 }
185
186
187 std::wstring processServerCommand(ServerCommandContext *ctx)
188 {
189
190         std::wostringstream os(std::ios_base::binary);
191         ctx->flags = 1; // Default, unless we change it.
192
193         u64 privs = ctx->privs;
194
195         if(ctx->parms.size() == 0 || ctx->parms[0] == L"help")
196         {
197                 os<<L"-!- Available commands: ";
198                 os<<L"status privs ";
199                 if(privs & PRIV_SERVER)
200                         os<<L"shutdown setting ";
201                 if(privs & PRIV_SETTIME)
202                         os<<L" time";
203                 if(privs & PRIV_TELEPORT)
204                         os<<L" teleport";
205                 if(privs & PRIV_PRIVS)
206                         os<<L" grant revoke";
207         }
208         else if(ctx->parms[0] == L"status")
209         {
210                 cmd_status(os, ctx);
211         }
212         else if(ctx->parms[0] == L"privs")
213         {
214                 cmd_privs(os, ctx);
215         }
216         else if(ctx->parms[0] == L"grant" || ctx->parms[0] == L"revoke")
217         {
218                 cmd_grantrevoke(os, ctx);
219         }
220         else if(ctx->parms[0] == L"time")
221         {
222                 cmd_time(os, ctx);
223         }
224         else if(ctx->parms[0] == L"shutdown")
225         {
226                 cmd_shutdown(os, ctx);
227         }
228         else if(ctx->parms[0] == L"setting")
229         {
230                 cmd_setting(os, ctx);
231         }
232         else if(ctx->parms[0] == L"teleport")
233         {
234                 cmd_teleport(os, ctx);
235         }
236         else
237         {
238                 os<<L"-!- Invalid command: " + ctx->parms[0];
239         }
240         return os.str();
241 }
242
243