package client.messages.commands; import java.util.concurrent.ScheduledFuture; import client.inventory.Item; import client.inventory.MapleInventory; import client.inventory.MapleInventoryType; import clientside.MapleCharacter; import clientside.MapleClient; import constants.ServerConstants.PlayerGMRank; import handling.channel.ChannelServer; import handling.world.World; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; import server.MapleInventoryManipulator; import server.ShutdownServer; import server.Timer.EventTimer; import tools.CPUSampler; import tools.packet.CWvsContext; /** * * @author Emilyx3 */ public class AdminCommand { public static PlayerGMRank getPlayerLevelRequired() { return PlayerGMRank.ADMIN; } public static class StripEveryone extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { ChannelServer cs = c.getChannelServer(); for (MapleCharacter mchr : cs.getPlayerStorage().getAllCharacters()) { if (mchr.isGM()) { continue; } MapleInventory equipped = mchr.getInventory(MapleInventoryType.EQUIPPED); MapleInventory equip = mchr.getInventory(MapleInventoryType.EQUIP); List<Short> ids = new ArrayList<Short>(); for (Item item : equipped.newList()) { ids.add(item.getPosition()); } for (short id : ids) { MapleInventoryManipulator.unequip(mchr.getClient(), id, equip.getNextFreeSlot()); } } return 1; } } public static class MesoEveryone extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { for (ChannelServer cserv : ChannelServer.getAllInstances()) { for (MapleCharacter mch : cserv.getPlayerStorage().getAllCharacters()) { mch.gainMeso(Integer.parseInt(splitted[1]), true); } } return 1; } } public static class ExpRate extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length > 1) { final int rate = Integer.parseInt(splitted[1]); if (splitted.length > 2 && splitted[2].equalsIgnoreCase("all")) { for (ChannelServer cserv : ChannelServer.getAllInstances()) { cserv.setExpRate(rate); } } else { c.getChannelServer().setExpRate(rate); } c.getPlayer().dropMessage(6, "Exprate has been changed to " + rate + "x"); } else { c.getPlayer().dropMessage(6, "Syntax: !exprate <number> [all]"); } return 1; } } public static class MesoRate extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { if (splitted.length > 1) { final int rate = Integer.parseInt(splitted[1]); if (splitted.length > 2 && splitted[2].equalsIgnoreCase("all")) { for (ChannelServer cserv : ChannelServer.getAllInstances()) { cserv.setMesoRate(rate); } } else { c.getChannelServer().setMesoRate(rate); } c.getPlayer().dropMessage(6, "Meso Rate has been changed to " + rate + "x"); } else { c.getPlayer().dropMessage(6, "Syntax: !mesorate <number> [all]"); } return 1; } } public static class DCAll extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { int range = -1; if (splitted[1].equals("m")) { range = 0; } else if (splitted[1].equals("c")) { range = 1; } else if (splitted[1].equals("w")) { range = 2; } if (range == -1) { range = 1; } if (range == 0) { c.getPlayer().getMap().disconnectAll(); } else if (range == 1) { c.getChannelServer().getPlayerStorage().disconnectAll(true); } else if (range == 2) { for (ChannelServer cserv : ChannelServer.getAllInstances()) { cserv.getPlayerStorage().disconnectAll(true); } } return 1; } } public static class Shutdown extends CommandExecute { protected static Thread t = null; @Override public int execute(MapleClient c, String[] splitted) { c.getPlayer().dropMessage(6, "Shutting down..."); if (t == null || !t.isAlive()) { t = new Thread(ShutdownServer.getInstance()); ShutdownServer.getInstance().shutdown(); t.start(); } else { c.getPlayer().dropMessage(6, "A shutdown thread is already in progress or shutdown has not been done. Please wait."); } return 1; } } public static class ShutdownTime extends Shutdown { private static ScheduledFuture<?> ts = null; private int minutesLeft = 0; @Override public int execute(MapleClient c, String[] splitted) { minutesLeft = Integer.parseInt(splitted[1]); c.getPlayer().dropMessage(6, "Shutting down... in " + minutesLeft + " minutes"); if (ts == null && (t == null || !t.isAlive())) { t = new Thread(ShutdownServer.getInstance()); ts = EventTimer.getInstance().register(new Runnable() { public void run() { if (minutesLeft == 0) { ShutdownServer.getInstance().shutdown(); t.start(); ts.cancel(false); return; } World.Broadcast.broadcastMessage(CWvsContext.serverNotice(0, "The server will shutdown in " + minutesLeft + " minutes. Please log off safely.")); minutesLeft--; } }, 60000); } else { c.getPlayer().dropMessage(6, "A shutdown thread is already in progress or shutdown has not been done. Please wait."); } return 1; } } public static class StartProfiling extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { CPUSampler sampler = CPUSampler.getInstance(); sampler.addIncluded("client"); sampler.addIncluded("constants"); //or should we do Packages.constants etc.? sampler.addIncluded("database"); sampler.addIncluded("handling"); sampler.addIncluded("provider"); sampler.addIncluded("scripting"); sampler.addIncluded("server"); sampler.addIncluded("tools"); sampler.start(); return 1; } } public static class StopProfiling extends CommandExecute { @Override public int execute(MapleClient c, String[] splitted) { CPUSampler sampler = CPUSampler.getInstance(); try { String filename = "odinprofile.txt"; if (splitted.length > 1) { filename = splitted[1]; } File file = new File(filename); if (file.exists()) { c.getPlayer().dropMessage(6, "The entered filename already exists, choose a different one"); return 0; } sampler.stop(); FileWriter fw = new FileWriter(file); sampler.save(fw, 1, 10); fw.close(); } catch (IOException e) { System.err.println("Error saving profile" + e); } sampler.reset(); return 1; } } }