3 Copyright (C) 2010-11 celeron55, Perttu Ahola <celeron55@gmail.com>
4 Copyright (C) 2011 Ciaran Gultnieks <ciaran@ciarang.com>
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.
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.
19 #include "servercommand.h"
22 void cmd_status(std::wostringstream &os,
23 ServerCommandContext *ctx)
25 os<<ctx->server->getStatusString();
28 void cmd_privs(std::wostringstream &os,
29 ServerCommandContext *ctx)
31 if(ctx->parms.size() == 1)
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())));
40 if((ctx->privs & PRIV_PRIVS) == 0)
42 os<<L"-!- You don't have permission to do that";
46 Player *tp = ctx->env->getPlayer(wide_to_narrow(ctx->parms[1]).c_str());
49 os<<L"-!- No such player";
53 os<<L"-!- " + narrow_to_wide(privsToString(ctx->server->getPlayerAuthPrivs(tp->getName())));
56 void cmd_grantrevoke(std::wostringstream &os,
57 ServerCommandContext *ctx)
59 if(ctx->parms.size() != 3)
61 os<<L"-!- Missing parameter";
65 if((ctx->privs & PRIV_PRIVS) == 0)
67 os<<L"-!- You don't have permission to do that";
71 u64 newprivs = stringToPrivs(wide_to_narrow(ctx->parms[2]));
72 if(newprivs == PRIV_INVALID)
74 os<<L"-!- Invalid privileges specified";
78 Player *tp = ctx->env->getPlayer(wide_to_narrow(ctx->parms[1]).c_str());
81 os<<L"-!- No such player";
85 std::string playername = wide_to_narrow(ctx->parms[1]);
86 u64 privs = ctx->server->getPlayerAuthPrivs(playername);
88 if(ctx->parms[0] == L"grant")
93 ctx->server->setPlayerAuthPrivs(playername, privs);
95 os<<L"-!- Privileges change to ";
96 os<<narrow_to_wide(privsToString(privs));
99 void cmd_time(std::wostringstream &os,
100 ServerCommandContext *ctx)
102 if(ctx->parms.size() != 2)
104 os<<L"-!- Missing parameter";
108 if((ctx->privs & PRIV_SETTIME) ==0)
110 os<<L"-!- You don't have permission to do that";
114 u32 time = stoi(wide_to_narrow(ctx->parms[1]));
115 ctx->server->setTimeOfDay(time);
116 os<<L"-!- time_of_day changed.";
119 void cmd_shutdown(std::wostringstream &os,
120 ServerCommandContext *ctx)
122 if((ctx->privs & PRIV_SERVER) ==0)
124 os<<L"-!- You don't have permission to do that";
128 dstream<<DTIME<<" Server: Operator requested shutdown."
130 ctx->server->requestShutdown();
132 os<<L"*** Server shutting down (operator request)";
136 void cmd_setting(std::wostringstream &os,
137 ServerCommandContext *ctx)
139 if((ctx->privs & PRIV_SERVER) ==0)
141 os<<L"-!- You don't have permission to do that";
145 std::string confline = wide_to_narrow(ctx->parms[1] + L" = " + ctx->parms[2]);
146 g_settings.parseConfigLine(confline);
147 os<< L"-!- Setting changed.";
150 void cmd_teleport(std::wostringstream &os,
151 ServerCommandContext *ctx)
153 if((ctx->privs & PRIV_TELEPORT) ==0)
155 os<<L"-!- You don't have permission to do that";
159 if(ctx->parms.size() != 2)
161 os<<L"-!- Missing parameter";
165 std::vector<std::wstring> coords = str_split(ctx->parms[1], L',');
166 if(coords.size() != 3)
168 os<<L"-!- You can only specify coordinates currently";
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);
176 os<< L"-!- Teleported.";
180 std::wstring processServerCommand(ServerCommandContext *ctx)
183 std::wostringstream os(std::ios_base::binary);
184 ctx->flags = 1; // Default, unless we change it.
186 u64 privs = ctx->privs;
188 if(ctx->parms.size() == 0 || ctx->parms[0] == L"help")
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)
196 if(privs & PRIV_TELEPORT)
198 if(privs & PRIV_PRIVS)
199 os<<L" grant revoke";
201 else if(ctx->parms[0] == L"status")
205 else if(ctx->parms[0] == L"privs")
209 else if(ctx->parms[0] == L"grant" || ctx->parms[0] == L"revoke")
211 cmd_grantrevoke(os, ctx);
213 else if(ctx->parms[0] == L"time")
217 else if(ctx->parms[0] == L"shutdown")
219 cmd_shutdown(os, ctx);
221 else if(ctx->parms[0] == L"setting")
223 cmd_setting(os, ctx);
225 else if(ctx->parms[0] == L"teleport")
227 cmd_teleport(os, ctx);
231 os<<L"-!- Invalid command: " + ctx->parms[0];