package server.command;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import server.PersistenceManager;
import server.Player;
import server.SyntaxException;
public class BackupCommand extends Command {
private static final int ONE_HOUR = 1000 * 60 * 60;
private static long lastBackup = 0;
private static String lastBackupUsername;
public BackupCommand() {
super(CommandCategory.ADMIN,
"Performs a complete backup of the games's state. " +
"This should not be confused with the @10FSAVE@ZZZ " +
"command, which saves the game's state.",
"",
"This command can only be performed once per hour.");
}
@Override
public void run(Player player) throws SyntaxException {
String token = CommandProcessor.nextToken();
if (CommandProcessor.nextToken() != null || token == null || !token.equalsIgnoreCase("now")) {
throw new SyntaxException();
}
long now = System.currentTimeMillis();
long diff = now - lastBackup;
if (diff < ONE_HOUR) {
player.sendText(true, "Last backup was performed @30F" + (diff / 60000) + " minutes@ZZZ ago by @10F" + lastBackupUsername + "@ZZZ.");
player.sendText(true, "Please wait @30F60 minutes@ZZZ between backups.");
return;
}
DateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS");
lastBackup = now;
lastBackupUsername = player.getUsername();
String filename = "aelfengard.backup-" + format.format(new Date()) + "-" + player.getUsername();
PersistenceManager.doBackup(player, filename);
}
@Override
public String[] getSyntax(Player player) {
return new String[] { "NOW" };
}
public static void doSave(ObjectOutputStream oos) throws IOException {
oos.writeInt(1); oos.writeLong(lastBackup);
oos.writeObject(lastBackupUsername);
}
public static void doLoad(ObjectInputStream ois) throws IOException, ClassNotFoundException {
ois.readInt(); lastBackup = ois.readLong();
lastBackupUsername = (String) ois.readObject();
}
}