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;
}
}
}