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"
21 #include "main.h" // For g_settings
22 #include "content_sao.h"
24 #define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")"
26 void cmd_status(std::wostringstream &os,
27 ServerCommandContext *ctx)
29 os<<ctx->server->getStatusString();
32 void cmd_me(std::wostringstream &os,
33 ServerCommandContext *ctx)
35 if(!ctx->server->checkPriv(ctx->player->getName(), "shout"))
37 os<<L"-!- You don't have permission to shout.";
41 std::wstring name = narrow_to_wide(ctx->player->getName());
42 os << L"* " << name << L" " << ctx->paramstring;
43 ctx->flags |= SEND_TO_OTHERS | SEND_NO_PREFIX;
46 void cmd_time(std::wostringstream &os,
47 ServerCommandContext *ctx)
49 if(ctx->parms.size() != 2)
51 os<<L"-!- Missing parameter";
55 if(!ctx->server->checkPriv(ctx->player->getName(), "settime"))
57 os<<L"-!- You don't have permission to do this.";
61 u32 time = stoi(wide_to_narrow(ctx->parms[1]));
62 ctx->server->setTimeOfDay(time);
63 os<<L"-!- Time of day changed.";
65 actionstream<<ctx->player->getName()<<" sets time "
69 void cmd_shutdown(std::wostringstream &os,
70 ServerCommandContext *ctx)
72 if(!ctx->server->checkPriv(ctx->player->getName(), "server"))
74 os<<L"-!- You don't have permission to do this.";
78 actionstream<<ctx->player->getName()
79 <<" shuts down server"<<std::endl;
81 ctx->server->requestShutdown();
83 os<<L"*** Server shutting down (operator request).";
84 ctx->flags |= SEND_TO_OTHERS;
87 void cmd_banunban(std::wostringstream &os, ServerCommandContext *ctx)
89 if(!ctx->server->checkPriv(ctx->player->getName(), "ban"))
91 os<<L"-!- You don't have permission to do this.";
95 if(ctx->parms.size() < 2)
97 std::string desc = ctx->server->getBanDescription("");
98 os<<L"-!- Ban list: "<<narrow_to_wide(desc);
101 if(ctx->parms[0] == L"ban")
103 Player *player = ctx->env->getPlayer(wide_to_narrow(ctx->parms[1]).c_str());
107 os<<L"-!- No such player";
112 Address address = ctx->server->getPeerAddress(player->peer_id);
113 std::string ip_string = address.serializeString();
114 ctx->server->setIpBanned(ip_string, player->getName());
115 os<<L"-!- Banned "<<narrow_to_wide(ip_string)<<L"|"
116 <<narrow_to_wide(player->getName());
118 actionstream<<ctx->player->getName()<<" bans "
119 <<player->getName()<<" / "<<ip_string<<std::endl;
120 } catch(con::PeerNotFoundException){
121 dstream<<__FUNCTION_NAME<<": peer was not found"<<std::endl;
126 std::string ip_or_name = wide_to_narrow(ctx->parms[1]);
127 std::string desc = ctx->server->getBanDescription(ip_or_name);
128 ctx->server->unsetIpBanned(ip_or_name);
129 os<<L"-!- Unbanned "<<narrow_to_wide(desc);
131 actionstream<<ctx->player->getName()<<" unbans "
132 <<ip_or_name<<std::endl;
136 void cmd_clearobjects(std::wostringstream &os,
137 ServerCommandContext *ctx)
139 if(!ctx->server->checkPriv(ctx->player->getName(), "server"))
141 os<<L"-!- You don't have permission to do this.";
145 actionstream<<ctx->player->getName()
146 <<" clears all objects"<<std::endl;
150 msg += L"Clearing all objects. This may take long.";
151 msg += L" You may experience a timeout. (by ";
152 msg += narrow_to_wide(ctx->player->getName());
154 ctx->server->notifyPlayers(msg);
157 ctx->env->clearAllObjects();
159 actionstream<<"object clearing done"<<std::endl;
161 os<<L"*** Cleared all objects.";
162 ctx->flags |= SEND_TO_OTHERS;
166 std::wstring processServerCommand(ServerCommandContext *ctx)
168 std::wostringstream os(std::ios_base::binary);
169 ctx->flags = SEND_TO_SENDER; // Default, unless we change it.
171 if(ctx->parms.size() == 0)
172 os<<L"-!- Empty command";
173 else if(ctx->parms[0] == L"status")
175 else if(ctx->parms[0] == L"time")
177 else if(ctx->parms[0] == L"shutdown")
178 cmd_shutdown(os, ctx);
179 else if(ctx->parms[0] == L"ban" || ctx->parms[0] == L"unban")
180 cmd_banunban(os, ctx);
181 else if(ctx->parms[0] == L"me")
183 else if(ctx->parms[0] == L"clearobjects")
184 cmd_clearobjects(os, ctx);
186 os<<L"-!- Invalid command: " + ctx->parms[0];