]> git.lizzy.rs Git - dragonfireclient.git/blob - src/servercommand.cpp
Merge branch 'upstream/master'
[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(ctx->parms[1] + L" = " + ctx->parms[2]);
146         g_settings.parseConfigLine(confline);
147         os<< L"-!- Setting changed.";
148 }
149
150 void cmd_teleport(std::wostringstream &os,
151         ServerCommandContext *ctx)
152 {
153         if((ctx->privs & PRIV_TELEPORT) ==0)
154         {
155                 os<<L"-!- You don't have permission to do that";
156                 return;
157         }
158
159         if(ctx->parms.size() != 2)
160         {
161                 os<<L"-!- Missing parameter";
162                 return;
163         }
164
165         std::vector<std::wstring> coords = str_split(ctx->parms[1], L',');
166         if(coords.size() != 3)
167         {
168                 os<<L"-!- You can only specify coordinates currently";
169                 return;
170         }
171
172         v3f dest(stoi(coords[0])*10, stoi(coords[1])*10, stoi(coords[2])*10);
173         ctx->player->setPosition(dest);
174         ctx->server->SendMovePlayer(ctx->player);
175
176         os<< L"-!- Teleported.";
177 }
178
179
180 std::wstring processServerCommand(ServerCommandContext *ctx)
181 {
182
183         std::wostringstream os(std::ios_base::binary);
184         ctx->flags = 1; // Default, unless we change it.
185
186         u64 privs = ctx->privs;
187
188         if(ctx->parms.size() == 0 || ctx->parms[0] == L"help")
189         {
190                 os<<L"-!- Available commands: ";
191                 os<<L"status privs ";
192                 if(privs & PRIV_SERVER)
193                         os<<L"shutdown setting ";
194                 if(privs & PRIV_SETTIME)
195                         os<<L" time";
196                 if(privs & PRIV_TELEPORT)
197                         os<<L" teleport";
198                 if(privs & PRIV_PRIVS)
199                         os<<L" grant revoke";
200         }
201         else if(ctx->parms[0] == L"status")
202         {
203                 cmd_status(os, ctx);
204         }
205         else if(ctx->parms[0] == L"privs")
206         {
207                 cmd_privs(os, ctx);
208         }
209         else if(ctx->parms[0] == L"grant" || ctx->parms[0] == L"revoke")
210         {
211                 cmd_grantrevoke(os, ctx);
212         }
213         else if(ctx->parms[0] == L"time")
214         {
215                 cmd_time(os, ctx);
216         }
217         else if(ctx->parms[0] == L"shutdown")
218         {
219                 cmd_shutdown(os, ctx);
220         }
221         else if(ctx->parms[0] == L"setting")
222         {
223                 cmd_setting(os, ctx);
224         }
225         else if(ctx->parms[0] == L"teleport")
226         {
227                 cmd_teleport(os, ctx);
228         }
229         else
230         {
231                 os<<L"-!- Invalid command: " + ctx->parms[0];
232         }
233         return os.str();
234 }
235
236