package me.fromagate.commanddelayer;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.plugin.java.JavaPlugin;
public class CommandDelayer extends JavaPlugin implements Listener{
String warningMessage = "&6Your command will be executed after &e%time%";
Map<String,String> commands = new HashMap<String,String>();
@Override
public void onEnable(){
loadCfg();
saveCfg();
getServer().getPluginManager().registerEvents(this, this);
}
public void loadCfg(){
this.warningMessage = getConfig().getString("warning-message",warningMessage);
for (String key : getConfig().getKeys(true)){
if (key.startsWith("commands.")){
commands.put(key.replaceFirst("commands.", ""), getConfig().getString(key, "0"));
}
}
if (commands.isEmpty()) commands.put("help", "10s");
}
public void saveCfg(){
getConfig().set("warning-message",warningMessage);
for (String command : commands.keySet()){
getConfig().set("commands."+command, commands.get(command));
}
this.saveConfig();
}
public String getCommandFromLine (String commandLine){
if (commandLine.isEmpty()) return "";
String [] ln = commandLine.split(" ");
if (ln.length==0) return "";
return (ln[0].substring(1));
}
public String getPlayerCommand(String message){
if (message.isEmpty()) return "";
String messageCommand = getRegisteredCommand(getCommandFromLine(message));
for (String command : commands.keySet()){
String listedCommand = getRegisteredCommand(command);
if (messageCommand.equalsIgnoreCase(listedCommand)) return command;
}
return "";
}
public String getRegisteredCommand (String cmd){
if (cmd.isEmpty()) return "";
Command cmm = Bukkit.getServer().getPluginCommand(cmd);
if (cmm == null) return "";
return cmm.getLabel();
}
@EventHandler(priority=EventPriority.LOWEST, ignoreCancelled = true)
public void onCommand (PlayerCommandPreprocessEvent event){
String command = getPlayerCommand(event.getMessage());
if (command.isEmpty()) return;
if (event.getPlayer().hasPermission("commanddelayer.ignore."+command)||
event.getPlayer().hasPermission("commanddelayer.ignore")) return;
String timeStr = commands.get(command);
if (timeStr.isEmpty()) return;
Long time = parseTime(timeStr);
if (time<=0) return;
event.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', warningMessage.replace("%time%", timeStr)));
final Player player = event.getPlayer();
final String newCommandMessage = event.getMessage();
event.setCancelled(true);
Bukkit.getScheduler().runTaskLater(this, new Runnable(){
@Override
public void run() {
if (!player.isOnline()) return;
Bukkit.dispatchCommand(player, newCommandMessage.substring(1));
}
}, timeToTicks(time));
}
public Long parseTime(String time){
int hh = 0; // часы
int mm = 0; // минуты
int ss = 0; // секунды
int tt = 0; // тики
int ms = 0; // миллисекунды
if (isInteger(time)){
ss = Integer.parseInt(time);
} else if (time.matches("^[0-5][0-9]:[0-5][0-9]$")){
String [] ln = time.split(":");
if (isInteger(ln[0])) mm = Integer.parseInt(ln[0]);
if (isInteger(ln[1])) ss = Integer.parseInt(ln[1]);
} else if (time.matches("^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$")){
String [] ln = time.split(":");
if (isInteger(ln[0])) hh = Integer.parseInt(ln[0]);
if (isInteger(ln[1])) mm = Integer.parseInt(ln[1]);
if (isInteger(ln[2])) ss = Integer.parseInt(ln[2]);
} else if (time.endsWith("ms")) {
String s = time.replace("ms", "");
if (isInteger(s)) ms = Integer.parseInt(s);
} else if (time.endsWith("h")) {
String s = time.replace("h", "");
if (isInteger(s)) hh = Integer.parseInt(s);
} else if (time.endsWith("m")) {
String s = time.replace("m", "");
if (isInteger(s)) mm = Integer.parseInt(s);
} else if (time.endsWith("s")) {
String s = time.replace("s", "");
if (isInteger(s)) ss = Integer.parseInt(s);
} else if (time.endsWith("t")) {
String s = time.replace("t", "");
if (isInteger(s)) tt = Integer.parseInt(s);
}
return (long) ((hh*3600000)+(mm*60000)+(ss*1000)+(tt*50)+ms);
}
public boolean isInteger (String str){
return (str.matches("[0-9]+[0-9]*"));
}
public Long timeToTicks(Long time){
return Math.max(1, (time/50));
}
}