Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
1package net.minecraft.server;
2
3import org.bukkit.craftbukkit.command.ServerCommandListener;
4import org.bukkit.craftbukkit.entity.CraftPlayer;
5
6import java.util.Iterator;
7import java.util.Set;
8import java.util.logging.Logger;
9
10// CraftBukkit start
11// CraftBukkit end
12
13public class ConsoleCommandHandler {
14
15 private static Logger a = Logger.getLogger("Minecraft");
16 private MinecraftServer server;
17 private ICommandListener listener; // CraftBukkit
18
19 public ConsoleCommandHandler(MinecraftServer minecraftserver) {
20 this.server = minecraftserver;
21 }
22
23 // Craftbukkit start
24 private boolean hasPermission(ICommandListener listener, String perm) {
25 if (listener instanceof ServerCommandListener) {
26 ServerCommandListener serv = (ServerCommandListener) listener;
27 return serv.getSender().hasPermission(perm);
28 } else if (listener instanceof NetServerHandler) {
29 NetServerHandler net = (NetServerHandler) listener;
30 return net.getPlayer().hasPermission(perm);
31 } else if ((listener instanceof ServerGUI) || (listener instanceof MinecraftServer)) {
32 return server.console.hasPermission(perm);
33 }
34
35 return false;
36 }
37
38 private boolean checkPermission(ICommandListener listener, String command) {
39 if (hasPermission(listener, "bukkit.command." + command)) {
40 return true;
41 } else {
42 listener.sendMessage("I'm sorry, Dave, but I cannot let you do that.");
43 return false;
44 }
45 }
46 // Craftbukkit end
47
48 public boolean handle(ServerCommand servercommand) { // CraftBukkit - returns boolean
49 String s = servercommand.command;
50 ICommandListener icommandlistener = servercommand.b;
51 String s1 = icommandlistener.getName();
52 this.listener = icommandlistener; // CraftBukkit
53 ServerConfigurationManager serverconfigurationmanager = this.server.serverConfigurationManager;
54
55 if (!s.toLowerCase().startsWith("help") && !s.toLowerCase().startsWith("?")) {
56 if (s.toLowerCase().startsWith("list")) {
57 if (!checkPermission(listener, "list")) return true; // Craftbukkit
58 icommandlistener.sendMessage("Connected players: " + serverconfigurationmanager.c());
59 } else if (s.toLowerCase().startsWith("stop")) {
60 if (!checkPermission(listener, "stop")) return true; // Craftbukkit
61 this.print(s1, "Stopping the server..");
62 this.server.a();
63 } else {
64 int i;
65 WorldServer worldserver;
66
67 if (s.toLowerCase().startsWith("save-all")) {
68 if (!checkPermission(listener, "save.perform")) return true; // Craftbukkit
69 this.print(s1, "Forcing save..");
70 if (serverconfigurationmanager != null) {
71 serverconfigurationmanager.savePlayers();
72 }
73
74 // CraftBukkit start
75 for (i = 0; i < this.server.worlds.size(); ++i) {
76 worldserver = this.server.worlds.get(i);
77 boolean save = worldserver.canSave;
78 worldserver.canSave = false;
79 worldserver.save(true, (IProgressUpdate) null);
80 worldserver.canSave = save;
81 }
82 // CraftBukkit end
83
84 this.print(s1, "Save complete.");
85 } else if (s.toLowerCase().startsWith("save-off")) {
86 if (!checkPermission(listener, "save.disable")) return true; // Craftbukkit
87 this.print(s1, "Disabling level saving..");
88
89 for (i = 0; i < this.server.worlds.size(); ++i) { // CraftBukkit
90 worldserver = this.server.worlds.get(i); // CraftBukkit
91 worldserver.canSave = true;
92 }
93 } else if (s.toLowerCase().startsWith("save-on")) {
94 if (!checkPermission(listener, "save.enable")) return true; // Craftbukkit
95 this.print(s1, "Enabling level saving..");
96
97 for (i = 0; i < this.server.worlds.size(); ++i) { // CraftBukkit
98 worldserver = this.server.worlds.get(i); // CraftBukkit
99 worldserver.canSave = false;
100 }
101 } else {
102 String s2;
103
104 if (s.toLowerCase().startsWith("op ")) {
105 if (!checkPermission(listener, "op.give")) return true; // Craftbukkit
106 s2 = s.substring(s.indexOf(" ")).trim();
107 serverconfigurationmanager.e(s2);
108 this.print(s1, "Opping " + s2);
109 serverconfigurationmanager.a(s2, "\u00A7eYou are now op!");
110 } else if (s.toLowerCase().startsWith("deop ")) {
111 if (!checkPermission(listener, "op.take")) return true; // Craftbukkit
112 s2 = s.substring(s.indexOf(" ")).trim();
113 serverconfigurationmanager.f(s2);
114 serverconfigurationmanager.a(s2, "\u00A7eYou are no longer op!");
115 this.print(s1, "De-opping " + s2);
116 } else if (s.toLowerCase().startsWith("ban-ip ")) {
117 if (!checkPermission(listener, "ban.ip")) return true; // Craftbukkit
118 s2 = s.substring(s.indexOf(" ")).trim();
119 serverconfigurationmanager.c(s2);
120 this.print(s1, "Banning ip " + s2);
121 } else if (s.toLowerCase().startsWith("pardon-ip ")) {
122 if (!checkPermission(listener, "unban.ip")) return true; // Craftbukkit
123 s2 = s.substring(s.indexOf(" ")).trim();
124 serverconfigurationmanager.d(s2);
125 this.print(s1, "Pardoning ip " + s2);
126 } else {
127 EntityPlayer entityplayer;
128
129 if (s.toLowerCase().startsWith("ban ")) {
130 if (!checkPermission(listener, "ban.player")) return true; // Craftbukkit
131 s2 = s.substring(s.indexOf(" ")).trim();
132 serverconfigurationmanager.a(s2);
133 this.print(s1, "Banning " + s2);
134 entityplayer = serverconfigurationmanager.i(s2);
135 if (entityplayer != null) {
136 entityplayer.netServerHandler.disconnect("Banned by admin");
137 }
138 } else if (s.toLowerCase().startsWith("pardon ")) {
139 if (!checkPermission(listener, "unban.player")) return true; // Craftbukkit
140 s2 = s.substring(s.indexOf(" ")).trim();
141 serverconfigurationmanager.b(s2);
142 this.print(s1, "Pardoning " + s2);
143 } else {
144 int j;
145
146 if (s.toLowerCase().startsWith("kick ")) {
147 if (!checkPermission(listener, "kick")) return true; // Craftbukkit
148 // CraftBukkit start - Add kick message compatibility
149 String[] parts = s.split(" ");
150 s2 = parts.length >= 2 ? parts[1] : "";
151 // CraftBukkit end
152 entityplayer = null;
153
154 for (j = 0; j < serverconfigurationmanager.players.size(); ++j) {
155 EntityPlayer entityplayer1 = (EntityPlayer) serverconfigurationmanager.players.get(j);
156
157 if (entityplayer1.name.equalsIgnoreCase(s2)) {
158 entityplayer = entityplayer1;
159 }
160 }
161
162 if (entityplayer != null) {
163 entityplayer.netServerHandler.disconnect("Kicked by admin");
164 this.print(s1, "Kicking " + entityplayer.name);
165 } else {
166 icommandlistener.sendMessage("Can\'t find user " + s2 + ". No kick.");
167 }
168 } else {
169 EntityPlayer entityplayer2;
170 String[] astring;
171
172 if (s.toLowerCase().startsWith("tp ")) {
173 if (!checkPermission(listener, "teleport")) return true; // Craftbukkit
174 astring = s.split(" ");
175 if (astring.length == 3) {
176 entityplayer = serverconfigurationmanager.i(astring[1]);
177 entityplayer2 = serverconfigurationmanager.i(astring[2]);
178 if (entityplayer == null) {
179 icommandlistener.sendMessage("Can\'t find user " + astring[1] + ". No tp.");
180 } else if (entityplayer2 == null) {
181 icommandlistener.sendMessage("Can\'t find user " + astring[2] + ". No tp.");
182 } else if (entityplayer.dimension != entityplayer2.dimension) {
183 icommandlistener.sendMessage("User " + astring[1] + " and " + astring[2] + " are in different dimensions. No tp.");
184 } else {
185 entityplayer.netServerHandler.a(entityplayer2.locX, entityplayer2.locY, entityplayer2.locZ, entityplayer2.yaw, entityplayer2.pitch);
186 this.print(s1, "Teleporting " + astring[1] + " to " + astring[2] + ".");
187 }
188 } else {
189 icommandlistener.sendMessage("Syntax error, please provice a source and a target.");
190 }
191 } else {
192 String s3;
193 int k;
194
195 if (s.toLowerCase().startsWith("give ")) {
196 if (!checkPermission(listener, "give")) return true; // Craftbukkit
197 astring = s.split(" ");
198 if (astring.length != 3 && astring.length != 4) {
199 return true; // CraftBukkit
200 }
201
202 s3 = astring[1];
203 entityplayer2 = serverconfigurationmanager.i(s3);
204 if (entityplayer2 != null) {
205 try {
206 k = Integer.parseInt(astring[2]);
207 if (Item.byId[k] != null) {
208 this.print(s1, "Giving " + entityplayer2.name + " some " + k);
209 int l = 1;
210
211 if (astring.length > 3) {
212 l = this.a(astring[3], 1);
213 }
214
215 if (l < 1) {
216 l = 1;
217 }
218
219 if (l > 64) {
220 l = 64;
221 }
222
223 entityplayer2.b(new ItemStack(k, l, 0));
224 } else {
225 icommandlistener.sendMessage("There\'s no item with id " + k);
226 }
227 } catch (NumberFormatException numberformatexception) {
228 icommandlistener.sendMessage("There\'s no item with id " + astring[2]);
229 }
230 } else {
231 icommandlistener.sendMessage("Can\'t find user " + s3);
232 }
233 } else if (s.toLowerCase().startsWith("time ")) {
234 astring = s.split(" ");
235 if (astring.length != 3) {
236 return true; // CraftBukkit
237 }
238
239 s3 = astring[1];
240
241 try {
242 j = Integer.parseInt(astring[2]);
243 WorldServer worldserver1;
244
245 if ("add".equalsIgnoreCase(s3)) {
246 if (!checkPermission(listener, "time.add")) return true; // Craftbukkit
247 for (k = 0; k < this.server.worlds.size(); ++k) { // CraftBukkit
248 worldserver1 = this.server.worlds.get(k); // CraftBukkit
249 worldserver1.setTimeAndFixTicklists(worldserver1.getTime() + (long) j);
250 }
251
252 this.print(s1, "Added " + j + " to time");
253 } else if ("set".equalsIgnoreCase(s3)) {
254 if (!checkPermission(listener, "time.set")) return true; // Craftbukkit
255 for (k = 0; k < this.server.worlds.size(); ++k) { // CraftBukkit
256 worldserver1 = this.server.worlds.get(k); // CraftBukkit
257 worldserver1.setTimeAndFixTicklists((long) j);
258 }
259
260 this.print(s1, "Set time to " + j);
261 } else {
262 icommandlistener.sendMessage("Unknown method, use either \"add\" or \"set\"");
263 }
264 } catch (NumberFormatException numberformatexception1) {
265 icommandlistener.sendMessage("Unable to convert time value, " + astring[2]);
266 }
267 } else if (s.toLowerCase().startsWith("say ")) {
268 if (!checkPermission(listener, "say")) return true; // Craftbukkit
269 s = s.substring(s.indexOf(" ")).trim();
270 a.info("[" + s1 + "] " + s);
271 serverconfigurationmanager.sendAll(new Packet3Chat("\u00A7d[Server] " + s));
272 } else if (s.toLowerCase().startsWith("tell ")) {
273 if (!checkPermission(listener, "tell")) return true; // Craftbukkit
274 astring = s.split(" ");
275 if (astring.length >= 3) {
276 s = s.substring(s.indexOf(" ")).trim();
277 s = s.substring(s.indexOf(" ")).trim();
278 a.info("[" + s1 + "->" + astring[1] + "] " + s);
279 s = "\u00A77" + s1 + " whispers " + s;
280 a.info(s);
281 if (!serverconfigurationmanager.a(astring[1], (Packet) (new Packet3Chat(s)))) {
282 icommandlistener.sendMessage("There\'s no player by that name online.");
283 }
284 }
285 } else if (s.toLowerCase().startsWith("whitelist ")) {
286 this.a(s1, s, icommandlistener);
287 } else {
288 icommandlistener.sendMessage("Unknown console command. Type \"help\" for help."); // CraftBukkit
289 return false; // CraftBukkit
290 }
291 }
292 }
293 }
294 }
295 }
296 }
297 } else {
298 if (!checkPermission(listener, "help")) return true; // Craftbukkit
299 this.a(icommandlistener);
300 }
301
302 return true; // CraftBukkit
303 }
304
305 private void a(String s, String s1, ICommandListener icommandlistener) {
306 String[] astring = s1.split(" ");
307 this.listener = icommandlistener; // CraftBukkit
308
309 if (astring.length >= 2) {
310 String s2 = astring[1].toLowerCase();
311
312 if ("on".equals(s2)) {
313 if (!checkPermission(listener, "whitelist.enable")) return; // Craftbukkit
314 this.print(s, "Turned on white-listing");
315 this.server.propertyManager.b("white-list", true);
316 } else if ("off".equals(s2)) {
317 if (!checkPermission(listener, "whitelist.disable")) return; // Craftbukkit
318 this.print(s, "Turned off white-listing");
319 this.server.propertyManager.b("white-list", false);
320 } else if ("list".equals(s2)) {
321 if (!checkPermission(listener, "whitelist.list")) return; // Craftbukkit
322 Set set = this.server.serverConfigurationManager.e();
323 String s3 = "";
324
325 String s4;
326
327 for (Iterator iterator = set.iterator(); iterator.hasNext(); s3 = s3 + s4 + " ") {
328 s4 = (String) iterator.next();
329 }
330
331 icommandlistener.sendMessage("White-listed players: " + s3);
332 } else {
333 String s5;
334
335 if ("add".equals(s2) && astring.length == 3) {
336 if (!checkPermission(listener, "whitelist.add")) return; // Craftbukkit
337 s5 = astring[2].toLowerCase();
338 this.server.serverConfigurationManager.k(s5);
339 this.print(s, "Added " + s5 + " to white-list");
340 } else if ("remove".equals(s2) && astring.length == 3) {
341 if (!checkPermission(listener, "whitelist.remove")) return; // Craftbukkit
342 s5 = astring[2].toLowerCase();
343 this.server.serverConfigurationManager.l(s5);
344 this.print(s, "Removed " + s5 + " from white-list");
345 } else if ("reload".equals(s2)) {
346 if (!checkPermission(listener, "whitelist.reload")) return; // Craftbukkit
347 this.server.serverConfigurationManager.f();
348 this.print(s, "Reloaded white-list from file");
349 }
350 }
351 }
352 }
353
354 private void a(ICommandListener icommandlistener) {
355 icommandlistener.sendMessage("To run the server without a gui, start it like this:");
356 icommandlistener.sendMessage(" java -Xmx1024M -Xms1024M -jar minecraft_server.jar nogui");
357 icommandlistener.sendMessage("Console commands:");
358 icommandlistener.sendMessage(" help or ? shows this message");
359 icommandlistener.sendMessage(" kick <player> removes a player from the server");
360 icommandlistener.sendMessage(" ban <player> bans a player from the server");
361 icommandlistener.sendMessage(" pardon <player> pardons a banned player so that they can connect again");
362 icommandlistener.sendMessage(" ban-ip <ip> bans an IP address from the server");
363 icommandlistener.sendMessage(" pardon-ip <ip> pardons a banned IP address so that they can connect again");
364 icommandlistener.sendMessage(" op <player> turns a player into an op");
365 icommandlistener.sendMessage(" deop <player> removes op status from a player");
366 icommandlistener.sendMessage(" tp <player1> <player2> moves one player to the same location as another player");
367 icommandlistener.sendMessage(" give <player> <id> [num] gives a player a resource");
368 icommandlistener.sendMessage(" tell <player> <message> sends a private message to a player");
369 icommandlistener.sendMessage(" stop gracefully stops the server");
370 icommandlistener.sendMessage(" save-all forces a server-wide level save");
371 icommandlistener.sendMessage(" save-off disables terrain saving (useful for backup scripts)");
372 icommandlistener.sendMessage(" save-on re-enables terrain saving");
373 icommandlistener.sendMessage(" list lists all currently connected players");
374 icommandlistener.sendMessage(" say <message> broadcasts a message to all players");
375 icommandlistener.sendMessage(" time <add|set> <amount> adds to or sets the world time (0-24000)");
376 }
377
378 private void print(String s, String s1) {
379 String s2 = s + ": " + s1;
380
381 // CraftBukkit start
382 this.listener.sendMessage(s1);
383 this.informOps("\u00A77(" + s2 + ")");
384 if (this.listener instanceof MinecraftServer) {
385 return; // Already logged so don't call a.info()
386 }
387 // CraftBukkit end
388 a.info(s2);
389 }
390
391 // CraftBukkit start
392 private void informOps(String msg) {
393 Packet3Chat packet3chat = new Packet3Chat(msg);
394 EntityPlayer sender = null;
395 if (this.listener instanceof ServerCommandListener) {
396 org.bukkit.command.CommandSender commandSender = ((ServerCommandListener) this.listener).getSender();
397 if (commandSender instanceof CraftPlayer) {
398 sender = ((CraftPlayer) commandSender).getHandle();
399 }
400 }
401 java.util.List<EntityPlayer> players = this.server.serverConfigurationManager.players;
402 for (int i = 0; i < players.size(); ++i) {
403 EntityPlayer entityPlayer = (EntityPlayer) players.get(i);
404 if (sender != entityPlayer && this.server.serverConfigurationManager.isOp(entityPlayer.name)) {
405 entityPlayer.netServerHandler.sendPacket(packet3chat);
406 }
407 }
408 }
409 // CraftBukkit end
410
411 private int a(String s, int i) {
412 try {
413 return Integer.parseInt(s);
414 } catch (NumberFormatException numberformatexception) {
415 return i;
416 }
417 }
418}