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