package com.massivecraft.factions.cmd; import com.massivecraft.factions.*; import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.util.WarmUpUtil; import com.massivecraft.factions.zcore.util.TL; import mkremins.fanciful.FancyMessage; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; /* Object that contains information about a command being executed, args, player, faction */ public class CommandContext { public CommandSender sender; public Player player; public FPlayer fPlayer; public Faction faction; public List args; public String alias; public List commandChain = new ArrayList<>(); // The command chain used to execute this command public CommandContext(CommandSender sender, List args, String alias) { this.sender = sender; this.args = args; this.alias = alias; if (sender instanceof Player) { this.player = (Player) sender; this.fPlayer = FPlayers.getInstance().getByPlayer(player); this.faction = fPlayer.getFaction(); } } // -------------------------------------------- // // Message Sending Helpers // -------------------------------------------- // public void msg(String str, Object... args) { sender.sendMessage(FactionsPlugin.getInstance().txt.parse(str, args)); } public void msg(TL translation, Object... args) { sender.sendMessage(FactionsPlugin.getInstance().txt.parse(translation.toString(), args)); } public void sendMessage(String msg) { sender.sendMessage(msg); } public void sendMessage(List msgs) { for (String msg : msgs) { this.sendMessage(msg); } } public void sendFancyMessage(FancyMessage message) { message.send(sender); } public void sendFancyMessage(List messages) { for (FancyMessage m : messages) { sendFancyMessage(m); } } // TODO: Clean this UP // -------------------------------------------- // // Argument Readers // -------------------------------------------- // // Is set? ====================== public boolean argIsSet(int idx) { return args.size() >= idx + 1; } // STRING ====================== public String argAsString(int idx, String def) { if (args.size() < idx + 1) { return def; } return args.get(idx); } public String argAsString(int idx) { return argAsString(idx, null); } // INT ====================== public Integer strAsInt(String str, Integer def) { if (str == null) { return def; } try { return Integer.parseInt(str); } catch (Exception e) { return def; } } public Integer argAsInt(int idx, Integer def) { return strAsInt(argAsString(idx), def); } public Integer argAsInt(int idx) { return argAsInt(idx, null); } // Double ====================== public Double strAsDouble(String str, Double def) { if (str == null) { return def; } try { return Double.parseDouble(str); } catch (Exception e) { return def; } } public Double argAsDouble(int idx, Double def) { return strAsDouble(argAsString(idx), def); } public Double argAsDouble(int idx) { return argAsDouble(idx, null); } // TODO: Go through the str conversion for the other arg-readers as well. // Boolean ====================== public Boolean strAsBool(String str) { str = str.toLowerCase(); return str.startsWith("y") || str.startsWith("t") || str.startsWith("on") || str.startsWith("+") || str.startsWith("1"); } public Boolean argAsBool(int idx, boolean def) { String str = argAsString(idx); if (str == null) { return def; } return strAsBool(str); } public Boolean argAsBool(int idx) { return argAsBool(idx, false); } // PLAYER ====================== public Player strAsPlayer(String name, Player def, boolean msg) { Player ret = def; if (name != null) { Player player = Bukkit.getServer().getPlayer(name); if (player != null) { ret = player; } } if (msg && ret == null) { sender.sendMessage(TL.GENERIC_NOPLAYERFOUND.format(name)); } return ret; } public Player argAsPlayer(int idx, Player def, boolean msg) { return this.strAsPlayer(argAsString(idx), def, msg); } public Player argAsPlayer(int idx, Player def) { return argAsPlayer(idx, def, true); } public Player argAsPlayer(int idx) { return argAsPlayer(idx, null); } // BEST PLAYER MATCH ====================== public Player strAsBestPlayerMatch(String name, Player def, boolean msg) { Player ret = def; if (name != null) { List players = Bukkit.getServer().matchPlayer(name); if (players.size() > 0) { ret = players.get(0); } } if (msg && ret == null) { sender.sendMessage(TL.GENERIC_NOPLAYERMATCH.format(name)); } return ret; } public Player argAsBestPlayerMatch(int idx, Player def, boolean msg) { return this.strAsBestPlayerMatch(argAsString(idx), def, msg); } public Player argAsBestPlayerMatch(int idx, Player def) { return argAsBestPlayerMatch(idx, def, true); } public Player argAsBestPlayerMatch(int idx) { return argAsPlayer(idx, null); } // -------------------------------------------- // // Faction Argument Readers // -------------------------------------------- // // FPLAYER ====================== public FPlayer strAsFPlayer(String name, FPlayer def, boolean msg) { FPlayer ret = def; if (name != null) { for (FPlayer fplayer : FPlayers.getInstance().getAllFPlayers()) { if (fplayer.getName().equalsIgnoreCase(name)) { ret = fplayer; break; } } } if (msg && ret == null) { msg(TL.GENERIC_NOPLAYERFOUND, name); } return ret; } public FPlayer argAsFPlayer(int idx, FPlayer def, boolean msg) { return this.strAsFPlayer(argAsString(idx), def, msg); } public FPlayer argAsFPlayer(int idx, FPlayer def) { return argAsFPlayer(idx, def, true); } public FPlayer argAsFPlayer(int idx) { return argAsFPlayer(idx, null); } // BEST FPLAYER MATCH ====================== public FPlayer strAsBestFPlayerMatch(String name, FPlayer def, boolean msg) { return strAsFPlayer(name, def, msg); } public FPlayer argAsBestFPlayerMatch(int idx, FPlayer def, boolean msg) { return this.strAsBestFPlayerMatch(argAsString(idx), def, msg); } public FPlayer argAsBestFPlayerMatch(int idx, FPlayer def) { return argAsBestFPlayerMatch(idx, def, true); } public FPlayer argAsBestFPlayerMatch(int idx) { return argAsBestFPlayerMatch(idx, null); } // FACTION ====================== public Faction strAsFaction(String name, Faction def, boolean msg) { Faction ret = def; if (name != null) { // First we try an exact match Faction faction = Factions.getInstance().getByTag(name); // Checks for faction name match. // Now lets try for warzone / safezone. Helpful for custom warzone / safezone names. // Do this after we check for an exact match in case they rename the warzone / safezone // and a player created faction took one of the names. if (faction == null) { if (name.equalsIgnoreCase("warzone")) { faction = Factions.getInstance().getWarZone(); } else if (name.equalsIgnoreCase("safezone")) { faction = Factions.getInstance().getSafeZone(); } } // Next we match faction tags if (faction == null) { faction = Factions.getInstance().getBestTagMatch(name); } // Next we match player names if (faction == null) { FPlayer fplayer = strAsFPlayer(name, null, false); if (fplayer != null) { faction = fplayer.getFaction(); } } if (faction != null) { ret = faction; } } if (msg && ret == null) { sender.sendMessage(TL.GENERIC_NOFACTION_FOUND.format(name)); } return ret; } public Faction argAsFaction(int idx, Faction def, boolean msg) { return this.strAsFaction(argAsString(idx), def, msg); } public Faction argAsFaction(int idx, Faction def) { return argAsFaction(idx, def, true); } public Faction argAsFaction(int idx) { return argAsFaction(idx, null); } /* Assertions */ public boolean assertHasFaction() { if (player == null) { return true; } if (!fPlayer.hasFaction()) { sendMessage("You are not member of any faction."); return false; } return true; } public boolean assertMinRole(Role role) { if (player == null) { return true; } if (fPlayer.getRole().value < role.value) { msg("You must be " + role); return false; } return true; } /* Common Methods */ public boolean canIAdministerYou(FPlayer i, FPlayer you) { if (!i.getFaction().equals(you.getFaction())) { i.msg(TL.COMMAND_CONTEXT_ADMINISTER_DIF_FACTION, you.describeTo(i, true)); return false; } if (i.getRole().value > you.getRole().value || i.getRole().equals(Role.LEADER)) return true; if (you.getRole().equals(Role.LEADER)) i.msg(TL.COMMAND_CONTEXT_ADMINISTER_ADMIN_REQUIRED); else if (i.getRole().equals(Role.MODERATOR)) { if (i == you) return true; //Moderators can control themselves else i.msg(TL.COMMAND_CONTEXT_ADMINISTER_SAME_RANK_CONTROL); } else i.msg(TL.COMMAND_CONTEXT_ADMINISTER_MOD_REQUIRED); return false; } // if economy is enabled and they're not on the bypass list, make 'em pay; returns true unless person can't afford the cost public boolean payForCommand(double cost, String toDoThis, String forDoingThis) { if (!Econ.shouldBeUsed() || this.fPlayer == null || cost == 0.0 || fPlayer.isAdminBypassing()) { return true; } if (Conf.bankEnabled && Conf.bankFactionPaysCosts && fPlayer.hasFaction()) { return Econ.modifyMoney(faction, -cost, toDoThis, forDoingThis); } else { return Econ.modifyMoney(fPlayer, -cost, toDoThis, forDoingThis); } } public boolean payForCommand(double cost, TL toDoThis, TL forDoingThis) { return payForCommand(cost, toDoThis.toString(), forDoingThis.toString()); } // like above, but just make sure they can pay; returns true unless person can't afford the cost public boolean canAffordCommand(double cost, String toDoThis) { if (!Econ.shouldBeUsed() || fPlayer == null || cost == 0.0 || fPlayer.isAdminBypassing()) { return true; } if (Conf.bankEnabled && Conf.bankFactionPaysCosts && fPlayer.hasFaction()) { return Econ.hasAtLeast(faction, cost, toDoThis); } else { return Econ.hasAtLeast(fPlayer, cost, toDoThis); } } public void doWarmUp(WarmUpUtil.Warmup warmup, TL translationKey, String action, Runnable runnable, long delay) { this.doWarmUp(fPlayer, warmup, translationKey, action, runnable, delay); } public void doWarmUp(FPlayer player, WarmUpUtil.Warmup warmup, TL translationKey, String action, Runnable runnable, long delay) { WarmUpUtil.process(player, warmup, translationKey, action, runnable, delay); } }