diff options
author | Minenash <minenash@protonmail.com> | 2019-01-04 07:10:57 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-04 07:10:57 -0500 |
commit | 973e873716e58e8af80d7ea0ecd86df09f113912 (patch) | |
tree | 8e643cf15f4d5cd1cf98211e2f3f5a45790c1efd | |
parent | 5c272da0039a2abe039a01b93ec803514f90eca9 (diff) | |
parent | 68769254df8cdd12607942ce7a95e22f00c7ffed (diff) |
Merge pull request #35 from RedstonerServer/gradle
Updated to 1.13 and a whole lot more
171 files changed, 5207 insertions, 4261 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c9c42ba --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +/.gradle/ +/build/ +/bin/ + +/.settings/ +/.idea/ + +.classpath +.project + +/.idea/ +/.vscode/
\ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..7d53907 --- /dev/null +++ b/build.gradle @@ -0,0 +1,27 @@ +apply plugin: "java" + +repositories { + jcenter() + maven { url "https://jitpack.io" } + + maven { url "https://hub.spigotmc.org/nexus/content/repositories/snapshots/" } + maven { url "https://oss.sonatype.org/content/repositories/snapshots" } +} + +dependencies { + implementation "com.github.RedstonerServer:ModuleLoader:gradle-SNAPSHOT" + implementation "com.github.RedstonerServer:CommandManager:master-SNAPSHOT" + implementation "com.github.RedstonerServer:ChatAPI:master-SNAPSHOT" + implementation "com.github.RedstonerServer:ChestAPI:master-SNAPSHOT" + + compileOnly 'org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT' +} + +sourceSets { + main { + resources { + srcDir 'src/main/java' + include '**/*.cmd' + } + } +}
\ No newline at end of file diff --git a/src/com/redstoner/modules/afk/AFK.java b/src/com/redstoner/modules/afk/AFK.java deleted file mode 100644 index 66cd506..0000000 --- a/src/com/redstoner/modules/afk/AFK.java +++ /dev/null @@ -1,225 +0,0 @@ -package com.redstoner.modules.afk; - -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.Event; -import org.bukkit.event.EventException; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.plugin.EventExecutor; - -import com.nemez.cmdmgr.Command; -import com.redstoner.annotations.AutoRegisterListener; -import com.redstoner.annotations.Commands; -import com.redstoner.annotations.Version; -import com.redstoner.misc.BroadcastFilter; -import com.redstoner.misc.CommandHolderType; -import com.redstoner.misc.Main; -import com.redstoner.misc.Utils; -import com.redstoner.modules.Module; -import com.redstoner.modules.datamanager.DataManager; - -@Commands(CommandHolderType.File) -@AutoRegisterListener -@Version(major = 4, minor = 0, revision = 5, compatible = 5) -public class AFK implements Module, Listener -{ - private CustomListener listener; - boolean move = true, look = false; - - @Override - public void firstLoad() - { - Module.super.firstLoad(); - DataManager.setConfig("indicator", "&7[AFK]"); - String[] choices = new String[] {"listen", "ignore"}; - DataManager.setConfig("move", "listen", choices); - DataManager.setConfig("look", "ignore", choices); - DataManager.setConfig("chat", "listen", choices); - DataManager.setConfig("interact", "listen", choices); - DataManager.setConfig("command", "ignore", choices); - } - - @Override - public void migrate(Version old) - { - Module.super.migrate(old); - if ((old.major() == 4) && (old.minor() == 0) && (old.revision() == 3)) - { - String[] choices = new String[] {"listen", "ignore"}; - DataManager.setConfig("look", "ignore", choices); - } - } - - @Override - public void postEnable() - { - Module.super.postEnable(); - listener = new CustomListener(); - update_afk_listeners(Bukkit.getConsoleSender()); - } - - @Override - public void onDisable() - { - Module.super.onDisable(); - HandlerList.unregisterAll(listener); - } - - @Command(hook = "afk") - public boolean afk(CommandSender sender) - { - return afk(sender, ""); - } - - @Command(hook = "afk2") - public boolean afk(CommandSender sender, String reason) - { - return afk(sender, reason, false); - } - - public boolean afk(CommandSender sender, String reason, boolean silent) - { - if (isafk(sender)) - { - unafk(sender); - } - else - { - DataManager.setData(sender, "afk_reason", reason); - DataManager.setState(sender, "afk", true); - if (!silent) - Utils.broadcast("ยง7 * ", Utils.getName(sender) + "ยง7 is now AFK", null); - } - return true; - } - - public void unafk(CommandSender sender) - { - DataManager.setState(sender, "afk", false); - Utils.broadcast("ยง7 * ", Utils.getName(sender) + "ยง7 is no longer AFK", null); - } - - public boolean isafk(CommandSender sender) - { - return DataManager.getState(sender, "afk"); - } - - public boolean isVanished(Player player) - { - return DataManager.getState(player, "vanished"); - } - - @Command(hook = "update_afk_listeners") - public boolean update_afk_listeners(CommandSender sender) - { - Utils.broadcast(null, "Updating afk listeners...", new BroadcastFilter() - { - @Override - public boolean sendTo(CommandSender recipient) - { - return recipient.hasPermission("utils.afk.admin"); - } - }); - move = DataManager.getConfigOrDefault("move", "listen").equals("listen"); - look = DataManager.getConfigOrDefault("look", "ignore").equals("listen"); - if (move || look) - Bukkit.getPluginManager().registerEvent(PlayerMoveEvent.class, listener, EventPriority.MONITOR, listener, - Main.plugin); - else - PlayerMoveEvent.getHandlerList().unregister(listener); - if (DataManager.getConfigOrDefault("chat", "listen").equals("listen")) - Bukkit.getPluginManager().registerEvent(PlayerInteractEvent.class, listener, EventPriority.MONITOR, - listener, Main.plugin); - else - PlayerInteractEvent.getHandlerList().unregister(listener); - if (DataManager.getConfigOrDefault("interact", "listen").equals("listen")) - Bukkit.getPluginManager().registerEvent(AsyncPlayerChatEvent.class, listener, EventPriority.MONITOR, - listener, Main.plugin); - else - AsyncPlayerChatEvent.getHandlerList().unregister(listener); - if (DataManager.getConfigOrDefault("command", "ignore").equals("listen")) - Bukkit.getPluginManager().registerEvent(PlayerCommandPreprocessEvent.class, listener, EventPriority.MONITOR, - listener, Main.plugin); - else - PlayerCommandPreprocessEvent.getHandlerList().unregister(listener); - return true; - } - - @EventHandler - public void onLeave(PlayerQuitEvent event) - { - DataManager.setState(event.getPlayer(), "afk", false); - } -} - -class CustomListener implements Listener, EventExecutor -{ - private boolean move = true, look = false; - - @Override - public void execute(Listener listener, Event event) throws EventException - { - if (event instanceof PlayerEvent) - { - if (event instanceof PlayerMoveEvent) - { - PlayerMoveEvent pevent = (PlayerMoveEvent) event; - double distance = pevent.getFrom().distance(pevent.getTo()); - boolean moved = distance > 0; - boolean looked = (pevent.getFrom().getPitch() != pevent.getTo().getPitch()) - || (pevent.getFrom().getYaw() != pevent.getTo().getYaw()); - if ((move && moved) || (look && looked)) - { - Player player = pevent.getPlayer(); - if (isafk(player)) - if (!isVanished(player)) - unafk(player); - } - } - else - { - PlayerEvent pevent = (PlayerEvent) event; - Player player = pevent.getPlayer(); - if (isafk(player)) - if (!isVanished(player)) - unafk(player); - } - } - } - - public void unafk(CommandSender sender) - { - DataManager.setState(sender, "afk", false); - Utils.broadcast("ยง7 * ", Utils.getName(sender) + "ยง7 is no longer AFK", null); - } - - public boolean isafk(CommandSender sender) - { - return DataManager.getState(sender, "afk"); - } - - public boolean isVanished(Player player) - { - return DataManager.getState(player, "vanished"); - } - - public void listenMove(boolean move) - { - this.move = move; - } - - public void listenLook(boolean look) - { - this.look = look; - } -} diff --git a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java deleted file mode 100644 index 6befbae..0000000 --- a/src/com/redstoner/modules/blockplacemods/BlockPlaceMods.java +++ /dev/null @@ -1,206 +0,0 @@ -package com.redstoner.modules.blockplacemods; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashSet; -import java.util.List; -import java.util.Map; - -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.Listener; - -import com.nemez.cmdmgr.Command; -import com.redstoner.annotations.AutoRegisterListener; -import com.redstoner.annotations.Commands; -import com.redstoner.annotations.Version; -import com.redstoner.misc.CommandHolderType; -import com.redstoner.misc.Main; -import com.redstoner.modules.Module; -import com.redstoner.modules.blockplacemods.mods.Mod; -import com.redstoner.modules.blockplacemods.mods.ModAbstract; -import com.redstoner.modules.blockplacemods.mods.ModToggledAbstract; -import com.redstoner.utils.CommandException; -import com.redstoner.utils.CommandMap; - -@Commands(CommandHolderType.None) -@AutoRegisterListener -@Version(major = 4, minor = 1, revision = 1, compatible = 4) -public final class BlockPlaceMods implements Module, Listener -{ - @Override - public boolean onEnable() - { - ModAbstract.registerAll(getLogger()); - for (Mod mod : new ArrayList<>(ModAbstract.getMods().values())) - { - mod.registerListeners(); - } - try - { - Map<String, org.bukkit.command.Command> commandMap = CommandMap.getCommandMap(); - org.bukkit.command.Command command = new BlockPlaceModsCommand(); - for (String alias : getCommandAliases()) - { - commandMap.put(alias, command); - } - } - catch (ReflectiveOperationException ex) - { - ex.printStackTrace(); - return false; - } - return true; - } - - @Override - public void postEnable() - { - setPrefix("BPM"); - } - - @Override - public void onDisable() - { - for (Mod mod : ModAbstract.getMods().values()) - { - mod.unregisterListeners(); - } - try - { - Map<String, org.bukkit.command.Command> commandMap = CommandMap.getCommandMap(); - for (String alias : getCommandAliases()) - { - org.bukkit.command.Command command = commandMap.get(alias); - if (command != null && command.getClass() == BlockPlaceModsCommand.class) - { - commandMap.remove(alias); - } - } - } - catch (Exception ignored) - {} - } - - private static String[] getCommandAliases() - { - String pluginName = Main.plugin.getName().toLowerCase(); - // @noformat - return new String[]{"mod", pluginName + ":mod", - "set", pluginName + ":set", - "toggle", pluginName + ":toggle" - }; - // @format - } - - @Command(hook = "mod_empty") - public void onModEmptyCommand(CommandSender sender) - { - onModCommand(sender, ""); - } - - @Command(hook = "mod") - public void onModCommand(CommandSender sender, String input) - { - String[] args = new ArrayList<>(Arrays.asList(input.split(" "))).stream() - .filter(x -> x != null && !x.trim().isEmpty()).toArray(String[]::new); - String prefix = ""; - String message; - try - { - if (args.length > 0) - { - Mod target = ModAbstract.getMod(args[0].toLowerCase()); - if (target != null) - { - prefix += "&7[&2" + capitalize(target.getName()) + "&7]:&a "; - if (!(sender instanceof Player)) - { - message = "&cYou must be a player to use any block place mod"; - } - else - { - message = target.runCommand((Player) sender, Arrays.copyOfRange(args, 1, args.length)); - } - } - else if (args[0].equalsIgnoreCase("help")) - { - message = commandHelp(sender, args); - } - else - { - message = "&cThat argument could not be recognized"; - } - } - else - { - message = commandHelp(sender, args); - } - } - catch (CommandException ex) - { - message = " &c" + ex.getMessage(); - } - catch (Throwable t) - { - message = " &cAn unexpected error occurred while executing this command."; - t.printStackTrace(); - } - getLogger().message(sender, prefix + message); - } - - private String commandHelp(CommandSender sender, String[] args) - { - StringBuilder result = new StringBuilder("ยง7BlockPlaceMods adds some redstone-centric utilities"); - result.append("\n").append(ChatColor.GRAY.toString()).append("Available mods:"); - List<Mod> mods = new ArrayList<>(new HashSet<>(ModAbstract.getMods().values())); - mods.sort(Comparator.<Mod> comparingInt(m -> ModToggledAbstract.class.isInstance(m) ? 1 : -1) - .thenComparing(Mod::getName)); - for (Mod mod : mods) - { - result.append("\n").append(ChatColor.AQUA.toString()).append("/mod ").append(ChatColor.ITALIC.toString()) - .append(mod.getName()); - for (String alias : mod.getAliases()) - { - result.append('|').append(alias); - } - result.append(ChatColor.GRAY.toString()).append(" - ").append(mod.getDescription()); - } - return result.toString(); - } - - private static String capitalize(String modName) - { - if (modName.isEmpty()) - { - return modName; - } - char first = modName.charAt(0); - if (first != (first = Character.toUpperCase(first))) - { - char[] result = modName.toCharArray(); - result[0] = first; - return String.valueOf(result); - } - return modName; - } - - private class BlockPlaceModsCommand extends org.bukkit.command.Command - { - public BlockPlaceModsCommand() - { - super("mod"); - String[] aliases = getCommandAliases(); - setAliases(Arrays.asList(Arrays.copyOfRange(aliases, 1, aliases.length))); - } - - @Override - public boolean execute(CommandSender sender, String label, String[] args) - { - onModCommand(sender, String.join(" ", args)); - return true; - } - } -} diff --git a/src/com/redstoner/modules/blockplacemods/mods/Mod.java b/src/com/redstoner/modules/blockplacemods/mods/Mod.java deleted file mode 100644 index 9a2fcad..0000000 --- a/src/com/redstoner/modules/blockplacemods/mods/Mod.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.redstoner.modules.blockplacemods.mods; - -import org.bukkit.entity.Player; - -import com.redstoner.utils.CommandException; - -import java.util.Set; - -public interface Mod -{ - String getName(); - - String getDescription(); - - Set<String> getAliases(); - - Object getDefault(); - - String runCommand(Player sender, String[] args) throws CommandException; - - void registerListeners(); - - void unregisterListeners(); -} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java b/src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java deleted file mode 100644 index 5a383d8..0000000 --- a/src/com/redstoner/modules/blockplacemods/mods/ModAbstract.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.redstoner.modules.blockplacemods.mods; - -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Objects; -import java.util.Set; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryType; - -import com.redstoner.misc.Main; -import com.redstoner.modules.ModuleLogger; -import com.redstoner.modules.datamanager.DataManager; - -public abstract class ModAbstract implements Mod, Listener -{ - private static final Map<String, Mod> mods = new HashMap<>(); - private final String name; - private final Set<String> aliases; - private static ModuleLogger logger; - - public static Map<String, Mod> getMods() - { - return Collections.unmodifiableMap(mods); - } - - public static Mod getMod(String name) - { - return mods.get(name); - } - - public static void registerMod(Mod mod) - { - mods.put(mod.getName(), mod); - for (String alias : mod.getAliases()) - { - mods.putIfAbsent(alias, mod); - } - } - - public static void registerAll(final ModuleLogger logger) - { - ModAbstract.logger = logger; - registerMod(new ModToggledCauldron()); - registerMod(new ModToggledPiston()); - registerMod(new ModToggledObserver()); - registerMod(new ModToggledStep()); - registerMod(new ModToggledTorch()); - registerMod(new ModInventory("dropper", InventoryType.DROPPER)); - registerMod(new ModInventory("furnace", InventoryType.FURNACE)); - registerMod(new ModInventory("hopper", InventoryType.HOPPER)); - } - - public ModAbstract(String name) - { - this.name = Objects.requireNonNull(name); - this.aliases = new HashSet<>(2); - logger.info("Loaded mod " + name); - } - - @Override - public String getName() - { - return name; - } - - @Override - public Set<String> getAliases() - { - return aliases; - } - - @Override - public void registerListeners() - { - Bukkit.getPluginManager().registerEvents(this, Main.plugin); - } - - @Override - public void unregisterListeners() - { - HandlerList.unregisterAll(this); - } - - protected void reset(Player player) - { - DataManager.removeData(player.getUniqueId().toString(), "BlockPlaceMods", getName()); - } -} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java b/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java deleted file mode 100644 index c6e483e..0000000 --- a/src/com/redstoner/modules/blockplacemods/mods/ModInventory.java +++ /dev/null @@ -1,195 +0,0 @@ -package com.redstoner.modules.blockplacemods.mods; - -import com.redstoner.modules.datamanager.DataManager; -import com.redstoner.utils.CommandException; -import com.redstoner.utils.ItemProperties; -import org.bukkit.GameMode; -import org.bukkit.Material; -import org.bukkit.block.BlockState; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryHolder; -import org.bukkit.inventory.ItemStack; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; - -import java.util.Arrays; - -public class ModInventory extends ModAbstract -{ - protected InventoryType inventoryType; - - public ModInventory(String name, InventoryType inventoryType) - { - super(name); - this.inventoryType = inventoryType; - } - - private static int highestUsedIndex(ItemStack[] items) - { - for (int i = items.length - 1; i >= 0; i--) - { - if (items[i] != null) - { - return i; - } - } - return -1; - } - - @Override - public String getDescription() - { - return "Controls " + inventoryType.name().toLowerCase() + " placement content"; - } - - @Override - public String runCommand(Player sender, String[] args) throws CommandException - { - if (args.length > 0) - { - if (args[0].equalsIgnoreCase("clear")) - { - reset(sender); - return "Reset data successfully"; - } - try - { - int slot = Integer.parseInt(args[0]); - if (slot >= inventoryType.getDefaultSize()) - { - throw new CommandException( - "Slot number " + slot + " is too high for " + inventoryType.toString().toLowerCase() + "s"); - } - if (slot < 0) - { - throw new CommandException("Slot number " + slot + " is negative"); - } - // Set the stored item to the item in the sender's hand - ItemStack item = sender.getInventory().getItemInMainHand(); - if (item == null || item.getType() == Material.AIR || item.getAmount() == 0) - { - // Remove the item. - // Set item to null to ensure correct itemName below. - item = null; - if (present(sender)) - { - set(sender, slot, null); - } - } - else - { - set(sender, slot, item);// don't need to clone because the reference isn't kept - } - String itemName = item == null ? "nothing" - : item.getAmount() + " " + item.getType().toString().toLowerCase().replace("_", ""); - return "Set the item in slot " + slot + " to " + itemName; - } - catch (NumberFormatException ex) - { - if (!args[0].equalsIgnoreCase("help")) - { - throw new CommandException("Expected a number indicating the slot that you want to set"); - } - } - } - StringBuilder message = new StringBuilder(); - message.append(" &a### &3Container Mod&a Help ###\n"); - message.append("&7").append(getDescription()).append('\n'); - message.append("&6/mod ").append(getName().toLowerCase()) - .append("&o <slot> &bsets the item in slot to your hand\n"); - message.append("&6/mod ").append(getName().toLowerCase()).append("&o clear &bclears the data\n"); - message.append("&6/mod ").append(getName().toLowerCase()).append("&o help &bshows this help page\n"); - return message.toString(); - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockPlace(BlockPlaceEvent event) - { - if (present(event.getPlayer()) && event.getPlayer().getGameMode() == GameMode.CREATIVE) - { - BlockState state = event.getBlock().getState(); - if (state instanceof InventoryHolder) - { - Inventory inv = ((InventoryHolder) state).getInventory(); - if (inv.getType() == inventoryType) - { - ItemStack[] data = get(event.getPlayer()); - inv.setContents(data); - state.update(); - } - } - } - } - - protected ItemStack[] get(Player player) - { - Object obj = DataManager.getData(player.getUniqueId().toString(), "BlockPlaceMods", getName()); - if (obj == null) - return getDefault(); - JSONArray array = (JSONArray) obj; - ItemStack[] items = new ItemStack[Math.min(inventoryType.getDefaultSize(), array.size())]; - for (int i = 0, n = items.length; i < n; i++) - { - Object obj2 = array.get(i); - if (obj2 instanceof JSONObject) - { // if null, items[i] remains null - items[i] = new ItemProperties().loadFrom((JSONObject) obj2).toItemStack(); - } - } - return items; - } - - protected void set(Player player, int index, ItemStack item) - { - ItemStack[] data = get(player); - if (item == null) - { - if (index < data.length) - { - data[index] = null; - } - } - else - { - if (index >= data.length) - { - data = Arrays.copyOf(data, index + 1); - } - data[index] = item; - } - set(player, data); - } - - @SuppressWarnings("unchecked") - protected void set(Player player, ItemStack[] data) - { - if (highestUsedIndex(data) == -1) - reset(player); - else - { - JSONArray array = new JSONArray(); - for (int i = 0, n = highestUsedIndex(data); i < n; i++) - { - ItemStack item = data[i]; - array.add(item == null ? null : new ItemProperties(item).toJSONObject()); - } - DataManager.setData(player.getUniqueId().toString(), "BlockPlaceMods", getName(), array); - } - } - - protected boolean present(Player player) - { - return get(player) != null; - } - - @Override - public ItemStack[] getDefault() - { - return new ItemStack[0]; - } -} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledAbstract.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledAbstract.java deleted file mode 100644 index b9b2a7c..0000000 --- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledAbstract.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.redstoner.modules.blockplacemods.mods; - -import com.redstoner.modules.datamanager.DataManager; -import com.redstoner.utils.CommandException; -import org.bukkit.entity.Player; - -public abstract class ModToggledAbstract extends ModAbstract -{ - protected boolean enabledByDefault; - - public ModToggledAbstract(String name, boolean enabledByDefault) { - super(name); - this.enabledByDefault = enabledByDefault; - } - - @Override - public Boolean getDefault() { - return enabledByDefault; - } - - protected boolean hasEnabled(Player player) - { - return (boolean) DataManager.getOrDefault(player.getUniqueId().toString(), "BlockPlaceMods", getName(), - enabledByDefault); - } - - protected boolean setEnabled(Player sender, boolean enabled) - { - if (enabled == hasEnabled(sender)) - return false; - if (enabled == enabledByDefault) - reset(sender); - else - DataManager.setData(sender.getUniqueId().toString(), "BlockPlaceMods", getName(), enabled); - return true; - } - - @Override - public String runCommand(Player sender, String[] args) throws CommandException - { - if (args.length == 0 || args[0].equalsIgnoreCase("toggle")) - { - boolean enabled = hasEnabled(sender); - setEnabled(sender, !enabled); - return !enabled ? "Enabled" : "Disabled"; - } - if (args[0].equalsIgnoreCase("help")) - { - StringBuilder message = new StringBuilder(); - message.append(" &a### &3Toggled Mod&a Help ###"); - message.append("\n&7").append(getDescription()); - message.append("\n&6/mod ").append(getName()).append("&o (toggle) &btoggles state"); - message.append("\n&6/mod ").append(getName()).append("&o on/off &bsets state"); - message.append("\n&6/mod ").append(getName()).append("&o help &bshows this help page"); - return message.toString(); - } - final boolean enable; - switch (args[0].toLowerCase()) - { - case "on": - case "enable": - case "true": - enable = true; - break; - case "off": - case "disable": - case "false": - enable = false; - break; - default: - throw new CommandException("Input '" + args[0] + "' was not understood. " - + "Use one of: \non, enable, true, off, disable, false."); - } - if (!setEnabled(sender, enable)) - { - throw new CommandException("Was already " + (enable ? "enabled" : "disabled")); - } - return enable ? "Enabled" : "Disabled"; - } -} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java deleted file mode 100644 index 669f093..0000000 --- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledCauldron.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.redstoner.modules.blockplacemods.mods; - -import org.bukkit.GameMode; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.player.PlayerInteractEvent; - -public class ModToggledCauldron extends ModToggledAbstract -{ - public ModToggledCauldron() - { - super("cauldron", false); - } - - @Override - public String getDescription() - { - return "If active, placed cauldrons are filled, and they cycle on shiftless right click with redstone or fist"; - } - - @SuppressWarnings("deprecation") - @EventHandler - public void onPlayerInteract(PlayerInteractEvent event) - { - if (event.getAction() == Action.RIGHT_CLICK_BLOCK && !event.getPlayer().isSneaking() - && event.getClickedBlock().getType() == Material.CAULDRON && hasEnabled(event.getPlayer()) - && (event.getPlayer().getGameMode() == GameMode.CREATIVE) - && (event.getPlayer().getInventory().getItemInMainHand().getType() == Material.AIR)) - { - Block block = event.getClickedBlock(); - block.setData((byte) ((block.getData() - 1) & 0x3)); - } - } - - @SuppressWarnings("deprecation") - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockPlace(BlockPlaceEvent event) - { - if (event.getBlock().getType() == Material.CAULDRON && !event.getPlayer().isSneaking() - && hasEnabled(event.getPlayer()) && (event.getPlayer().getGameMode() == GameMode.CREATIVE)) - { - event.getBlock().setData((byte) 3); - } - } -} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledLogPlaceAbstract.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledLogPlaceAbstract.java deleted file mode 100644 index 17c414b..0000000 --- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledLogPlaceAbstract.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.redstoner.modules.blockplacemods.mods; - -import org.bukkit.GameMode; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.BlockPlaceEvent; - -/** - * A mod that makes placement of directional blocks act the way placement of logs does normally. - * Quartz pillar placement works like this too. - * - * Placed blocks face the block you clicked to place them. - */ -public abstract class ModToggledLogPlaceAbstract extends ModToggledAbstract { - - protected ModToggledLogPlaceAbstract(String name, boolean enabledByDefault) { - super(name, enabledByDefault); - } - - @SuppressWarnings("deprecation") - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockPlace(BlockPlaceEvent event) - { - Player player = event.getPlayer(); - Block block; - if (hasEnabled(player) && !player.isSneaking() && player.getGameMode() == GameMode.CREATIVE - && isApplicableToPlacedBlock(block = event.getBlock())) - { - block.setData((byte) getBlockDataForFacing(block.getFace(event.getBlockAgainst()))); - } - } - - protected abstract int getBlockDataForFacing(BlockFace direction); - - protected abstract boolean isApplicableToPlacedBlock(Block block); - -} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledObserver.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledObserver.java deleted file mode 100644 index 8084bf4..0000000 --- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledObserver.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.redstoner.modules.blockplacemods.mods; - -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; - -public class ModToggledObserver extends ModToggledLogPlaceAbstract { - - protected ModToggledObserver() { - super("observer", false); - } - - @Override - public String getDescription() { - return "If active, observers face the block you place them against"; - } - - @Override - protected boolean isApplicableToPlacedBlock(Block block) { - return block.getType() == Material.OBSERVER; - } - - @Override - protected int getBlockDataForFacing(BlockFace direction) { - switch (direction) { - case UP: - return 0; - default: - case DOWN: - return 1; - case SOUTH: - return 2; - case NORTH: - return 3; - case EAST: - return 4; - case WEST: - return 5; - } - } - - -} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java deleted file mode 100644 index 29e810c..0000000 --- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledPiston.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.redstoner.modules.blockplacemods.mods; - -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; - -public class ModToggledPiston extends ModToggledLogPlaceAbstract -{ - public ModToggledPiston() - { - super("piston", false); - } - - @Override - public String getDescription() - { - return "If active, pistons face the block you place them against"; - } - - @Override - protected boolean isApplicableToPlacedBlock(Block block) { - Material type = block.getType(); - return type == Material.PISTON_BASE || type == Material.PISTON_STICKY_BASE; - } - - @Override - protected int getBlockDataForFacing(BlockFace direction) { - switch (direction) - { - default: - case DOWN: - return 0; - case UP: - return 1; - case NORTH: - return 2; - case SOUTH: - return 3; - case WEST: - return 4; - case EAST: - return 5; - } - } - -} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java deleted file mode 100644 index fe42fa4..0000000 --- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledStep.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.redstoner.modules.blockplacemods.mods; - -import org.bukkit.Material; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.BlockPlaceEvent; - -public class ModToggledStep extends ModToggledAbstract -{ - public ModToggledStep() - { - super("step", true); - getAliases().add("slab"); - } - - @Override - public String getDescription() - { - return "If active, placed steps will always turn upside-down"; - } - - @SuppressWarnings("deprecation") - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockPlace(BlockPlaceEvent event) - { - if (isStep(event.getBlock().getType()) && !event.getPlayer().isSneaking() && hasEnabled(event.getPlayer())) - { - byte data = event.getBlock().getData(); - if (data != (data |= 0x8)) - { - event.getBlock().setData(data); - } - } - } - - private boolean isStep(Material block) - { - return block == Material.STEP || block == Material.STONE_SLAB2; - } -} diff --git a/src/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java b/src/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java deleted file mode 100644 index 188bce2..0000000 --- a/src/com/redstoner/modules/blockplacemods/mods/ModToggledTorch.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.redstoner.modules.blockplacemods.mods; - -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; - -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.block.BlockPlaceEvent; - -import com.redstoner.misc.Main; - -public class ModToggledTorch extends ModToggledAbstract -{ - private final Set<Block> torchesPlaced = new HashSet<>(); - - public ModToggledTorch() - { - super("torch", true); - Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.plugin, this::updateTorches, 2, 2); - } - - @Override - public String getDescription() - { - return "If active, redstone torches placed on a redstone block disappear quickly"; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockPlace(BlockPlaceEvent event) - { - final Player player = event.getPlayer(); - if (!player.isSneaking() && player.getGameMode() == GameMode.CREATIVE && hasEnabled(player) - && event.getBlock().getType() == Material.REDSTONE_TORCH_ON) - { - if (isAttachedToRedstoneBlock(event.getBlock())) - { - torchesPlaced.add(event.getBlock()); - } - } - } - - @SuppressWarnings("deprecation") - private boolean isAttachedToRedstoneBlock(Block block) - { - BlockFace towardsAgainst = getFaceTowardsBlockAgainst(block.getData()); - return towardsAgainst != null && block.getRelative(towardsAgainst).getType() == Material.REDSTONE_BLOCK; - } - - private BlockFace getFaceTowardsBlockAgainst(byte data) - { - switch (data) - { - case 1: - return BlockFace.WEST; - case 2: - return BlockFace.EAST; - case 3: - return BlockFace.NORTH; - case 4: - return BlockFace.SOUTH; - case 5: - return BlockFace.DOWN; - default: - return null; - } - } - - private void updateTorches() - { - for (Iterator<Block> it = torchesPlaced.iterator(); it.hasNext();) - { - Block block = it.next(); - if (block.getType() == Material.REDSTONE_TORCH_OFF) - { - block.setType(Material.AIR); - it.remove(); - } - else if (block.getType() != Material.REDSTONE_TORCH_ON || !isAttachedToRedstoneBlock(block)) - { - it.remove(); - } - } - } -} diff --git a/src/com/redstoner/modules/buildchat/BuildChat.cmd b/src/com/redstoner/modules/buildchat/BuildChat.cmd deleted file mode 100644 index ddd7d77..0000000 --- a/src/com/redstoner/modules/buildchat/BuildChat.cmd +++ /dev/null @@ -1,42 +0,0 @@ -command bc { - [string:message...] { - help Sends a message in BuildTeam Chat; - perm utils.bc; - run bc_msg message; - } -} -command bcn { - [string:name] [string:message...] { - help Sends a message in BuildTeam Chat; - perm utils.bc; - type console; - run bcn_msg name message; - } -} - -command bckey { - [string:key] { - help Sets your BuildTeam Chat key; - perm utils.bc; - type player; - run setbckey key; - } -} - -command bct { - on { - help Turns on bct; - perm utils.bc; - run bct_on; - } - off { - help Turns off bct; - perm utils.bc; - run bct_off; - } - [empty] { - help toggles BuildTeam Chat; - perm utils.bc; - run bct; - } -}
\ No newline at end of file diff --git a/src/com/redstoner/modules/buildchat/BuildChat.java b/src/com/redstoner/modules/buildchat/BuildChat.java deleted file mode 100644 index 4ea0779..0000000 --- a/src/com/redstoner/modules/buildchat/BuildChat.java +++ /dev/null @@ -1,207 +0,0 @@ -package com.redstoner.modules.buildchat; - -import java.io.File; -import java.util.ArrayList; -import java.util.UUID; -import java.util.regex.Pattern; - -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.json.simple.JSONObject; - -import com.nemez.cmdmgr.Command; -import com.redstoner.annotations.AutoRegisterListener; -import com.redstoner.annotations.Commands; -import com.redstoner.annotations.Version; -import com.redstoner.misc.BroadcastFilter; -import com.redstoner.misc.CommandHolderType; -import com.redstoner.misc.JsonManager; -import com.redstoner.misc.Main; -import com.redstoner.misc.Utils; -import com.redstoner.modules.Module; - -/** BuildTeamChat module. Allows the build team to chat privately using /bc \<message\> as well as a one char prefix or a toggle. - * - * @author Pepich */ -@Commands(CommandHolderType.File) -@AutoRegisterListener -@Version(major = 4, minor = 1, revision = 0, compatible = 4) -public class BuildChat implements Module, Listener -{ - private static final char defaultKey = ';'; - private static final File keysLocation = new File(Main.plugin.getDataFolder(), "buildchat_keys.json"); - private ArrayList<UUID> bctoggled; - private static JSONObject keys; - - @Override - public boolean onEnable() - { - keys = JsonManager.getObject(keysLocation); - if (keys == null) - { - keys = new JSONObject(); - saveKeys(); - } - bctoggled = new ArrayList<>(); - return true; - } - - @Command(hook = "bc_msg") - public boolean bcSay(CommandSender sender, String message) - { - String name; - if (sender instanceof Player) - name = ((Player) sender).getDisplayName(); - else - name = sender.getName(); - Utils.broadcast("ยง8[ยงcBCยง8] ยง9" + name + "ยง8: ยงb", message, new BroadcastFilter() - { - @Override - public boolean sendTo(CommandSender recipient) - { - return recipient.hasPermission("utils.bc"); - } - }); - return true; - } - - @Command(hook = "bcn_msg") - public boolean bcnSay(CommandSender sender, String name, String message) - { - Utils.broadcast("ยง8[ยงcBCยง8] ยง9" + name + "ยง8: ยงb", message, new BroadcastFilter() - { - @Override - public boolean sendTo(CommandSender recipient) - { - return recipient.hasPermission("utils.bc"); - } - }); - return true; - } - - /** Let's a Player toggle their auto-cg status to allow for automatically sending chat messages to their chatgroup. - * - * @param sender the issuer of the command. - * @param _void ignored. - * @return true. */ - @Command(hook = "bct") - public boolean bcToggleCommand(CommandSender sender) - { - if (bctoggled.contains(((Player) sender).getUniqueId())) - { - bctoggled.remove(((Player) sender).getUniqueId()); - getLogger().message(sender, "BCT now ยงcdisabled"); - } - else - { - bctoggled.add(((Player) sender).getUniqueId()); - getLogger().message(sender, "BCT now ยงaenabled"); - } - return true; - } - - /** Let's a Player toggle their auto-cg status to allow for automatically sending chat messages to their chatgroup. - * - * @param sender the issuer of the command. - * @return true. */ - @Command(hook = "bct_on") - public boolean bcToggleOnCommand(CommandSender sender) - { - if (!bctoggled.contains(((Player) sender).getUniqueId())) - { - bctoggled.add(((Player) sender).getUniqueId()); - getLogger().message(sender, "BCT now ยงaenabled"); - } - else - getLogger().message(sender, "BCT was already enabled"); - return true; - } - - /** Let's a Player toggle their auto-cg status to allow for automatically sending chat messages to their chatgroup. - * - * @param sender the issuer of the command. - * @return true. */ - @Command(hook = "bct_off") - public boolean bcToggleOffCommand(CommandSender sender) - { - if (bctoggled.remove(((Player) sender).getUniqueId())) - getLogger().message(sender, "BCT now ยงcdisabled"); - else - getLogger().message(sender, "BCT was already disabled"); - return true; - } - - /** Deals with chat events to allow for bckeys and bctoggle. - * - * @param event the chat event containing the player and the message. */ - @EventHandler - public void onPlayerChat(AsyncPlayerChatEvent event) - { - Player player = event.getPlayer(); - if (!player.hasPermission("utils.bc")) - return; - if (event.getMessage().startsWith(getKey(player))) - { - event.setCancelled(true); - bcSay(event.getPlayer(), event.getMessage().replaceFirst(Pattern.quote(getKey(player)), "")); - } - else if (bctoggled.contains(event.getPlayer().getUniqueId())) - { - event.setCancelled(true); - bcSay(event.getPlayer(), event.getMessage()); - } - } - - /** Sets the bckey of a Player. - * - * @param sender the issuer of the command. - * @param key the key to be set. Set to NULL or "" to get your current key. - * @return true. */ - @SuppressWarnings("unchecked") - @Command(hook = "setbckey") - public boolean setBcKey(CommandSender sender, String key) - { - if (key.length() > 1) - { - getLogger().message(sender, true, - "Could not set your key to ยง6" + key + " ยง7, it can be at most one char."); - return true; - } - if (key == null || key.length() == 0) - { - getBcKey(sender); - return true; - } - getLogger().message(sender, "Set your key to ยง6" + key); - keys.put(((Player) sender).getUniqueId().toString(), key + ""); - saveKeys(); - return true; - } - - /** This method will find the ChatgGroup key of any player. - * - * @param player the player to get the key from. - * @return the key. */ - public static String getKey(Player player) - { - String key = (String) keys.get(player.getUniqueId().toString()); - return (key == null ? "" + defaultKey : key); - } - - /** Prints a Players bckey to their chat. - * - * @param sender the issuer of the command. */ - public void getBcKey(CommandSender sender) - { - getLogger().message(sender, "Your current bckey is ยง6" + getKey((Player) sender)); - } - - /** Saves the keys. */ - private void saveKeys() - { - JsonManager.save(keys, keysLocation); - } -} diff --git a/src/com/redstoner/modules/buildteam/BuildTeam.cmd b/src/com/redstoner/modules/buildteam/BuildTeam.cmd deleted file mode 100644 index d4f3303..0000000 --- a/src/com/redstoner/modules/buildteam/BuildTeam.cmd +++ /dev/null @@ -1,22 +0,0 @@ -command teleport { - alias tp; - alias tele; - [string:player...] { - run teleport player; - } - type player; -} - -command team_add { - [string:player] { - run team_add player; - perm utils.buildteam.manage; - } -} - -command team_remove { - [string:player] { - run team_remove player; - perm utils.buildteam.manage; - } -} diff --git a/src/com/redstoner/modules/buildteam/BuildTeam.java b/src/com/redstoner/modules/buildteam/BuildTeam.java deleted file mode 100644 index 986b41c..0000000 --- a/src/com/redstoner/modules/buildteam/BuildTeam.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.redstoner.modules.buildteam; - -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.nemez.cmdmgr.Command; -import com.redstoner.annotations.Commands; -import com.redstoner.annotations.Version; -import com.redstoner.misc.CommandHolderType; -import com.redstoner.modules.Module; - -@Commands(CommandHolderType.File) -@Version(major = 4, minor = 0, revision = 0, compatible = 4) -public class BuildTeam implements Module -{ - @Command(hook = "teleport") - public boolean teleport(CommandSender sender, String target_name) - { - final Player player = (Player) sender; - final Player target = Bukkit.getPlayer(target_name); - if (target == null || !player.hasPermission("utils.buildteam.teleport") - || !target.getLocation().getWorld().getName().equals("BuildTeam")) - { - player.performCommand("essentials:tp " + target_name); - return true; - } - player.teleport(target); - getLogger().message(sender, "Teleported you to &e" + target.getDisplayName() + "&7!"); - return true; - } - - @Command(hook = "team_add") - public boolean add(CommandSender sender, String target_name) - { - if (!target_name.matches("^\\w{2,16}$")) - { - getLogger().message(sender, true, "This doesn't look like a valid playername!"); - return true; - } - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "pex user " + target_name + " group add +buildteam"); - return true; - } - - @Command(hook = "team_remove") - public boolean remove(CommandSender sender, String target_name) - { - if (!target_name.matches("^\\w{2,16}$")) - { - getLogger().message(sender, true, "This doesn't look like a valid playername!"); - return true; - } - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "pex user " + target_name + " group remove +buildteam"); - return true; - } -} diff --git a/src/com/redstoner/modules/chatalias/Chatalias.cmd b/src/com/redstoner/modules/chatalias/Chatalias.cmd deleted file mode 100644 index 8af4bb6..0000000 --- a/src/com/redstoner/modules/chatalias/Chatalias.cmd +++ /dev/null @@ -1,16 +0,0 @@ -command alias { - add [flag:-r] [string:keyword] [string:replacement...] { - help Adds a new alias. Set -r to make it a regex-alias.; - run addalias -r keyword replacement; - } - del [flag:-r] [string:keyword] { - help Deletes an alias. -r indicates if it was a regex-alias.; - run delalias -r keyword; - } - list { - help Lists your aliases.; - run listaliases; - } - perm utils.alias; - type player; -}
\ No newline at end of file diff --git a/src/com/redstoner/modules/chatgroups/Chatgroups.java b/src/com/redstoner/modules/chatgroups/Chatgroups.java deleted file mode 100644 index 457702c..0000000 --- a/src/com/redstoner/modules/chatgroups/Chatgroups.java +++ /dev/null @@ -1,400 +0,0 @@ -package com.redstoner.modules.chatgroups; - -import java.io.File; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.UUID; - -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.json.simple.JSONObject; - -import com.nemez.cmdmgr.Command; -import com.redstoner.annotations.AutoRegisterListener; -import com.redstoner.annotations.Commands; -import com.redstoner.annotations.Version; -import com.redstoner.coremods.moduleLoader.ModuleLoader; -import com.redstoner.misc.BroadcastFilter; -import com.redstoner.misc.CommandHolderType; -import com.redstoner.misc.JsonManager; -import com.redstoner.misc.Main; -import com.redstoner.misc.Utils; -import com.redstoner.modules.Module; -import com.redstoner.modules.ignore.Ignore; -import com.redstoner.modules.socialspy.Socialspy; - -import net.nemez.chatapi.ChatAPI; - -/** The ChatGroups module. Allows people to have private sub-chats that can be accessed via a single char prefix or a toggle. - * - * @author Pepich */ -@Commands(CommandHolderType.File) -@AutoRegisterListener -@Version(major = 4, minor = 1, revision = 0, compatible = 4) -public class Chatgroups implements Module, Listener -{ - private static final char defaultKey = ':'; - private static final File groupsLocation = new File(Main.plugin.getDataFolder(), "chatgroups.json"); - private static final File keysLocation = new File(Main.plugin.getDataFolder(), "chatgroup_keys.json"); - private ArrayList<UUID> cgtoggled; - private static JSONObject groups, keys; - - @Override - public boolean onEnable() - { - groups = JsonManager.getObject(groupsLocation); - if (groups == null) - { - groups = new JSONObject(); - saveGroups(); - } - keys = JsonManager.getObject(keysLocation); - if (keys == null) - { - keys = new JSONObject(); - saveKeys(); - } - cgtoggled = new ArrayList<>(); - return true; - } - - @Override - public void onDisable() - { - saveKeys(); - saveGroups(); - } - - /** Prints chatgroup info (like players in the group, groupname) to the sender. - * - * @param sender the issuer of the command. - * @return true. */ - @SuppressWarnings("unchecked") - @Command(hook = "cginfo") - public boolean cgInfo(CommandSender sender) - { - String group = getGroup(sender); - if (group == null) - getLogger().message(sender, true, "You are not in a chatgroup!"); - else - { - ArrayList<String> message = new ArrayList<>(); - message.add("ยง7Your current chatgroup is: ยง6" + group); - ArrayList<String> players = new ArrayList<>(); - Iterator<String> iter = groups.keySet().iterator(); - while (iter.hasNext()) - { - String id = iter.next(); - if (((String) groups.get(id)).equals(group)) - { - if (!id.equals("CONSOLE")) - { - UUID uuid = UUID.fromString(id); - Player p = Bukkit.getPlayer(uuid); - if (p != null) - players.add(p.getDisplayName()); - else - players.add(Bukkit.getOfflinePlayer(UUID.fromString(id)).getName()); - } - else - players.add(id); - } - } - StringBuilder sb = new StringBuilder("&6Other players in this group: &9"); - for (String player : players) - { - sb.append(player); - sb.append("&7, &9"); - } - sb.delete(sb.length() - 2, sb.length()); - message.add(sb.toString()); - getLogger().message(sender, message.toArray(new String[] {})); - } - return true; - } - - /** Prints a Players cgkey to their chat. - * - * @param sender the issuer of the command. */ - public void getCgKey(CommandSender sender) - { - getLogger().message(sender, "Your current cgkey is ยง6" + getKey((Player) sender)); - } - - /** Sets the cgkey of a Player. - * - * @param sender the issuer of the command. - * @param key the key to be set. Set to NULL or "" to get your current key. - * @return true. */ - @SuppressWarnings("unchecked") - @Command(hook = "setcgkey") - public boolean setCgKey(CommandSender sender, String key) - { - if (key.length() > 1) - { - getLogger().message(sender, true, - "Could not set your key to ยง6" + key + " ยง7, it can be at most one char."); - return true; - } - if (key == null || key.length() == 0) - { - getCgKey(sender); - return true; - } - getLogger().message(sender, "Set your key to ยง6" + key); - keys.put(((Player) sender).getUniqueId().toString(), key + ""); - saveKeys(); - return true; - } - - /** Let's a Player toggle their auto-cg status to allow for automatically sending chat messages to their chatgroup. - * - * @param sender the issuer of the command. - * @return true. */ - @Command(hook = "cgtoggle") - public boolean cgToggleCommand(CommandSender sender) - { - if (getGroup(sender) != null) - if (cgtoggled.contains(((Player) sender).getUniqueId())) - { - cgtoggled.remove(((Player) sender).getUniqueId()); - getLogger().message(sender, "CGT now ยงcdisabled"); - } - else - { - cgtoggled.add(((Player) sender).getUniqueId()); - getLogger().message(sender, "CGT now ยงaenabled"); - } - else - getLogger().message(sender, true, "You are not in a chatgroup!"); - return true; - } - - /** Lets a CommandSender leave their group. - * - * @param sender the command issuer. - * @return true. */ - @Command(hook = "cgleave") - public boolean cgLeave(CommandSender sender) - { - String group = removeGroup(sender); - if (group == null) - { - getLogger().message(sender, true, "You were not in a chatgroup!"); - return true; - } - String name = Utils.getName(sender); - sendToGroup(group, "&9" + name + " &7left the group!"); - getLogger().message(sender, "Successfully removed you from your group!"); - if (sender instanceof Player) - cgtoggled.remove(((Player) sender).getUniqueId()); - return true; - } - - /** Lets a CommandSender join a group. - * - * @param sender the command issuer. - * @param name the name of the group. - * @return true. */ - @Command(hook = "cgjoin") - public boolean cgJoin(CommandSender sender, String name) - { - String pname = Utils.getName(sender); - String group = getGroup(sender); - if (group != null && group.equals(name)) - getLogger().message(sender, true, "You were already in group ยง6" + name); - else - { - setGroup(sender, null); - if (group != null) - sendToGroup(group, "&9" + pname + " &7left the group!"); - sendToGroup(name, "&9" + pname + " &7joined the group!"); - setGroup(sender, name); - getLogger().message(sender, "Successfully joined group ยง6" + name); - } - return true; - } - - /** Sends a message to a group. - * - * @param sender the sender of the message - the message will be sent to the group of the sender. - * @param message the message to be sent. - * @return true. */ - @Command(hook = "cgsay") - public boolean cgSay(CommandSender sender, String message) - { - String group = getGroup(sender); - if (group != null) - sendToGroup(sender, message); - else - getLogger().message(sender, true, "You are not in a chatgroup right now!"); - return true; - } - - /** Deals with chat events to allow for cgkeys and cgtoggle. - * - * @param event the chat event containing the player and the message. */ - @EventHandler - public void onPlayerChat(AsyncPlayerChatEvent event) - { - String group = getGroup(event.getPlayer()); - Player player = event.getPlayer(); - if (group != null) - { - if (event.getMessage().startsWith(getKey(player))) - { - event.setCancelled(true); - sendToGroup(event.getPlayer(), event.getMessage().substring(1)); - } - else if (cgtoggled.contains(event.getPlayer().getUniqueId())) - { - event.setCancelled(true); - sendToGroup(event.getPlayer(), event.getMessage()); - } - } - } - - /** Finds the group of a CommandSender. - * - * @param target the CommandSender to get the group of. - * @return the group of the target or NULL if he doesn't have one. */ - public static String getGroup(CommandSender target) - { - if (target instanceof Player) - return (String) groups.get(((Player) target).getUniqueId().toString()); - else - return (String) groups.get("CONSOLE"); - } - - /** Sets the group of the CommandSender. - * - * @param target the CommandSender to set the group of. - * @param group the name of the group to join. */ - @SuppressWarnings("unchecked") - private void setGroup(CommandSender target, String group) - { - if (target instanceof Player) - groups.put(((Player) target).getUniqueId().toString(), group); - else - groups.put("CONSOLE", group); - saveGroups(); - } - - /** Removes a CommandSender from their chatgroup. Will also save the groups after finishing - * - * @param target the CommandSender to get their group removed. */ - private String removeGroup(CommandSender target) - { - String group; - if (target instanceof Player) - group = (String) groups.remove(((Player) target).getUniqueId().toString()); - else - group = (String) groups.remove("CONSOLE"); - saveGroups(); - return group; - } - - /** This method will find the ChatgGroup key of any player. - * - * @param player the player to get the key from. - * @return the key. */ - public static String getKey(Player player) - { - String key = (String) keys.get(player.getUniqueId().toString()); - return (key == null ? "" + defaultKey : key); - } - - /** This method sends a message to a chatgroup. - * - * @param sender the sender of the message. Also defines which group the message will be sent to. - * @param message the message to be sent. */ - private void sendToGroup(CommandSender sender, String message) - { - String name = Utils.getName(sender); - String group = getGroup(sender); - message = ChatAPI.colorify(null, message); - - BroadcastFilter ignore = ModuleLoader.exists("Ignore")? Ignore.getIgnoredBy(sender) : null; - Utils.broadcast("ยง8[ยงbCGยง8] ยง9", name + "ยง8: ยง6" + message, new BroadcastFilter() - { - @Override - public boolean sendTo(CommandSender recipient) - { - - String rgroup = getGroup(recipient); - if ( rgroup != null && (ignore == null? true : ignore.sendTo(recipient)) ) - return rgroup.equals(group); - else - return false; - } - }); - if (ModuleLoader.getModule("Socialspy") != null) - { - Socialspy.spyBroadcast(sender, "ยงe" + group + " ยงa(cg)", message, "/cg", new BroadcastFilter() - { - @Override - public boolean sendTo(CommandSender recipient) - { - return getGroup(recipient) == null || !getGroup(recipient).equals(group); - } - }); - } - if (getGroup(Bukkit.getConsoleSender()) == null || !getGroup(Bukkit.getConsoleSender()).equals(group)) - { - getLogger().info(name + " in " + group + ": " + message + " ยง8(hidden)"); - } - } - - /** This method sends a message to a chatgroup. - * - * @param sender the sender of the message. Also defines which group the message will be sent to. - * @param message the message to be sent. */ - private void sendToGroup(String group, String message) - { - message = ChatAPI.colorify(null, message); - Utils.broadcast(null, message, new BroadcastFilter() - { - @Override - public boolean sendTo(CommandSender recipient) - { - String rgroup = getGroup(recipient); - if (rgroup != null) - return rgroup.equals(group); - else - return false; - } - }); - if (ModuleLoader.getModule("Socialspy") != null) - { - Socialspy.spyBroadcast(Bukkit.getConsoleSender(), "ยงe" + group + " ยงa(cg)", message, "/cg", - new BroadcastFilter() - { - @Override - public boolean sendTo(CommandSender recipient) - { - return getGroup(recipient) == null || !getGroup(recipient).equals(group); - } - }); - } - if (getGroup(Bukkit.getConsoleSender()) == null || !getGroup(Bukkit.getConsoleSender()).equals(group)) - { - getLogger().info("In " + group + ": " + message + " ยง8(hidden)"); - } - } - - /** Saves the groups. */ - private void saveGroups() - { - JsonManager.save(groups, groupsLocation); - } - - /** Saves the keys. */ - private void saveKeys() - { - JsonManager.save(keys, keysLocation); - } -} diff --git a/src/com/redstoner/modules/check/Check.cmd b/src/com/redstoner/modules/check/Check.cmd deleted file mode 100644 index 87cadbd..0000000 --- a/src/com/redstoner/modules/check/Check.cmd +++ /dev/null @@ -1,8 +0,0 @@ -command check { - perm utils.check; - - [string:player] { - run checkCommand player; - help Get info on a player; - } -}
\ No newline at end of file diff --git a/src/com/redstoner/modules/check/Check.java b/src/com/redstoner/modules/check/Check.java deleted file mode 100644 index 48bf579..0000000 --- a/src/com/redstoner/modules/check/Check.java +++ /dev/null @@ -1,247 +0,0 @@ -package com.redstoner.modules.check; - -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Serializable; -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Scanner; - -import org.bukkit.Bukkit; -import org.bukkit.OfflinePlayer; -import org.bukkit.command.CommandSender; -import org.bukkit.event.Listener; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; - -import com.nemez.cmdmgr.Command; -import com.nemez.cmdmgr.Command.AsyncType; -import com.nemez.cmdmgr.CommandManager; -import com.redstoner.annotations.Commands; -import com.redstoner.annotations.Version; -import com.redstoner.coremods.moduleLoader.ModuleLoader; -import com.redstoner.misc.CommandHolderType; -import com.redstoner.misc.Main; -import com.redstoner.misc.mysql.JSONManager; -import com.redstoner.misc.mysql.MysqlHandler; -import com.redstoner.misc.mysql.elements.ConstraintOperator; -import com.redstoner.misc.mysql.elements.MysqlConstraint; -import com.redstoner.misc.mysql.elements.MysqlDatabase; -import com.redstoner.misc.mysql.elements.MysqlTable; -import com.redstoner.modules.Module; - -import net.nemez.chatapi.click.Message; - -@Commands(CommandHolderType.File) -@Version(major = 4, minor = 1, revision = 0, compatible = 4) -public class Check implements Module, Listener -{ - MysqlTable table; - - @Override - public boolean onEnable() - { - Map<Serializable, Serializable> config = JSONManager.getConfiguration("check.json"); - if (config == null || !config.containsKey("database") || !config.containsKey("table")) - { - getLogger().error("Could not load the Check config file, disabling!"); - return false; - } - try - { - MysqlDatabase database = MysqlHandler.INSTANCE - .getDatabase((String) config.get("database") + "?autoReconnect=true"); - table = database.getTable((String) config.get("table")); - } - catch (NullPointerException e) - { - getLogger().error("Could not use the Check config, disabling!"); - return false; - } - return true; - } - - @Override - public void postEnable() - { - CommandManager.registerCommand(getCommandString(), this, Main.plugin); - } - - @SuppressWarnings("deprecation") - @Command(hook = "checkCommand", async = AsyncType.ALWAYS) - public void checkCommand(final CommandSender sender, final String player) - { - getLogger().message(sender, "&7Please note that the data may not be fully accurate!"); - OfflinePlayer oPlayer; - oPlayer = Bukkit.getPlayer(player); - if (oPlayer == null) - oPlayer = Bukkit.getServer().getOfflinePlayer(player); - sendData(sender, oPlayer); - if (ModuleLoader.exists("Tag")) - Bukkit.dispatchCommand(sender, "tag check " + player); - } - - public String read(URL url) - { - String data = ""; - try - { - Scanner in = new Scanner(new InputStreamReader(url.openStream())); - while (in.hasNextLine()) - { - data += in.nextLine(); - } - in.close(); - return data; - } - catch (IOException e) - {} - return null; - } - - public JSONObject getIpInfo(OfflinePlayer player) - { - String ip = ""; - if (player.isOnline()) - { - ip = player.getPlayer().getAddress().getHostString(); - } - else - { - try - { - ip = (String) table.get("last_ip", new MysqlConstraint("uuid", ConstraintOperator.EQUAL, - player.getUniqueId().toString().replace("-", "")))[0]; - } - catch (Exception e) - { - return null; - } - } - try - { - URL ipinfo = new URL("https://ipinfo.io/" + ip + "/json"); - String rawJson = read(ipinfo); - return (JSONObject) new JSONParser().parse(rawJson); - } - catch (Exception e) - {} - return null; - } - - public String getFirstJoin(OfflinePlayer player) - { - Long firstJoin = player.getFirstPlayed(); - Date date = new Date(firstJoin); - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); - return format.format(date); - } - - public String getLastSeen(OfflinePlayer player) - { - Long lastSeen = player.getLastPlayed(); - Date date = new Date(lastSeen); - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); - return format.format(date); - } - - public Object[] getWebsiteData(OfflinePlayer player) - { - MysqlConstraint constraint = new MysqlConstraint("uuid", ConstraintOperator.EQUAL, - player.getUniqueId().toString().replace("-", "")); - try - { - int id = (int) table.get("id", constraint)[0]; - String email = (String) table.get("email", constraint)[0]; - boolean confirmed = (boolean) table.get("confirmed", constraint)[0]; - return new Object[] {"https://redstoner.com/users/" + id, email, confirmed}; - } - catch (Exception e) - { - try - { - int id = (int) table.get("id", constraint)[0]; - String email = (String) table.get("email", constraint)[0]; - boolean confirmed = (boolean) table.get("confirmed", constraint)[0]; - return new Object[] {"https://redstoner.com/users/" + id, email, confirmed}; - } - catch (Exception e2) - {} - return new Object[] {null}; - } - } - - public String getCountry(JSONObject data) - { - return (String) data.get("country"); - } - - public String getAllNames(OfflinePlayer player) - { - String uuid = player.getUniqueId().toString().replace("-", ""); - String nameString = ""; - try - { - String rawJson = read(new URL("https://api.mojang.com/user/profiles/" + uuid + "/names")); - JSONArray names = (JSONArray) new JSONParser().parse(rawJson); - for (Object obj : names) - { - nameString += "&e" + ((JSONObject) obj).get("name") + "&7, "; - } - nameString = nameString.substring(0, nameString.length() - 2); - return nameString; - } - catch (Exception e) - {} - return null; - } - - public void sendData(CommandSender sender, OfflinePlayer player) - { - try - { - JSONObject ipInfo = getIpInfo(player); - // data - String firstJoin = getFirstJoin(player); - String lastSeen = getLastSeen(player); - firstJoin = (firstJoin.equals("1970-01-01 01:00")) ? "&eNever" : "&7(yyyy-MM-dd hh:mm) &e" + firstJoin; - lastSeen = (lastSeen.equals("1970-1-1 01:00")) ? "&eNever" : "&7(yyyy-MM-dd hh:mm) &e" + lastSeen; - Object[] websiteData = getWebsiteData(player); - String websiteUrl = (websiteData[0] == null) ? "None" : (String) websiteData[0]; - String email = (websiteData[0] == null) ? "Unknown" : (String) websiteData[1]; - boolean emailNotConfirmed = (websiteData[0] == null) ? false : !((boolean) websiteData[2]); - String country = (ipInfo == null) ? "Unknown" : getCountry(ipInfo); - String namesUsed = getAllNames(player); - if (namesUsed == null) - namesUsed = "None"; - // messages - List<Message> messages = new ArrayList<>(); - messages.add(new Message(sender, null).appendText(getLogger().getHeader())); - messages.add(new Message(sender, null).appendText("&7Data provided by redstoner:")); - messages.add(new Message(sender, null).appendSuggestHover("&6> UUID: &e" + player.getUniqueId().toString(), - player.getUniqueId().toString(), "Click to copy into chatbox!")); - messages.add(new Message(sender, null).appendText("&6> First joined: &e" + firstJoin)); - messages.add(new Message(sender, null).appendText("&6> Last seen: &e" + lastSeen)); - messages.add( - new Message(sender, null).appendText("&6> Website account: &e").appendLink(websiteUrl, websiteUrl)); - messages.add(new Message(sender, null).appendText("&6> Email: &e") - .appendText((emailNotConfirmed ? "&6> &4Email NOT Confirmed!&e" : "&e") + email)); - messages.add(new Message(sender, null).appendText("&7Data provided by ipinfo:")); - messages.add(new Message(sender, null).appendText("&6> Country: &e" + country)); - messages.add(new Message(sender, null).appendText("&7Data provided by mojang:")); - messages.add(new Message(sender, null).appendText("&6> All ingame names used so far: &e" + namesUsed)); - for (Message m : messages) - m.send(); - } - catch (Exception e) - { - getLogger().message(sender, true, "Sorry, something went wrong while fetching data"); - e.printStackTrace(); - } - } -} diff --git a/src/com/redstoner/modules/misc/Misc.cmd b/src/com/redstoner/modules/misc/Misc.cmd deleted file mode 100644 index 2a41104..0000000 --- a/src/com/redstoner/modules/misc/Misc.cmd +++ /dev/null @@ -1,50 +0,0 @@ -command tempadd { - perm pex; - [string:user] [string:group] { - help Adds a user to a group for 1w.; - run tempadddef user group; - } - [string:user] [string:group] [string:duration] { - help Adds a user to a group for a specified duration.; - run tempadd user group duration; - } -} -command echo { - [string:text...] { - help Echoes back to you.; - run echo text; - } -} -command ping { - [empty] { - help Pongs :D; - run ping; - } - [string:password] { - help Pongs :D; - run ping2 password; - } -} -command sudo { - perm utils.sudo; - [string:name] [string:command...] { - help Sudo'es another user (or console); - run sudo name command; - } -} -command hasperm { - [flag:-f] [string:name] [string:node] { - perm utils.hasperm; - run hasperm -f name node; - help Checks if a player has a given permission node or not. Returns \"true/false\" in chat. When -f is set, it returns it unformatted.; - } -} -command nightvision { -alias nv; - [empty] { - run illuminate; - type player; - help Gives the player infinte night vision; - perm utils.illuminate; - } -}
\ No newline at end of file diff --git a/src/com/redstoner/modules/misc/Misc.java b/src/com/redstoner/modules/misc/Misc.java deleted file mode 100644 index 2a533ed..0000000 --- a/src/com/redstoner/modules/misc/Misc.java +++ /dev/null @@ -1,281 +0,0 @@ -package com.redstoner.modules.misc; - -import java.util.UUID; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockFromToEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; - -import com.nemez.cmdmgr.Command; -import com.redstoner.annotations.AutoRegisterListener; -import com.redstoner.annotations.Commands; -import com.redstoner.annotations.Version; -import com.redstoner.misc.CommandHolderType; -import com.redstoner.misc.Utils; -import com.redstoner.modules.Module; -import net.nemez.chatapi.ChatAPI; -import net.nemez.chatapi.click.Message; - -@Commands(CommandHolderType.File) -@AutoRegisterListener -@Version(major = 4, minor = 1, revision = 0, compatible = 4) -public class Misc implements Module, Listener -{ - private final String[] sudoBlacklist = new String[] {"(.*:)?e?sudo", "(.*:)?script.*", "(.*:)?stop", - "(.*:)?modules", "(.*:)?sayn", "(.*:)?pex", "(.*:)?console_.*", "(.*:)?op", "(.*:)?login", "(.*:)?register", - "(.*:)?.*pass"}; - JSONObject config; - JSONArray unprotectedRegions; - - @EventHandler - public void onFirstJoin(PlayerJoinEvent event) - { - Player player = event.getPlayer(); - if (!player.hasPlayedBefore()) - { - Utils.broadcast("", "\nยงaยงlPlease welcome ยงf" + player.getDisplayName() + " ยงaยงlto Redstoner!\n", null); - String[] message = new String[] {" \n \n \n \n \n \n \n \n \n \n \n \n ", - " &4Welcome to the Redstoner Server!", " &6Before you ask us things, take a quick", - " &6look at &a&nredstoner.com/info", " \n&6thank you and happy playing ;)", " \n \n"}; - getLogger().message(player, message); - } - Material spawnBlock = player.getLocation().getBlock().getType(); - if (spawnBlock == Material.PORTAL || spawnBlock == Material.ENDER_PORTAL) - { - getLogger().message(player, "&4Looks like you spawned in a portal... Let me help you out"); - getLogger().message(player, "&6You can use /back if you &nreally&6 want to go back"); - player.teleport(player.getWorld().getSpawnLocation()); - } - } - - // Disables spectator teleportation - @EventHandler(priority = EventPriority.LOWEST) - public void onTeleport(PlayerTeleportEvent event) - { - Player player = event.getPlayer(); - if (!event.isCancelled() && event.getCause() == TeleportCause.SPECTATE && !player.hasPermission("utils.tp")) - { - event.setCancelled(true); - getLogger().message(event.getPlayer(), true, "Spectator teleportation is disabled!"); - } - } - - // Disables water and lava breaking stuff - @EventHandler - public void onLiquidFlow(BlockFromToEvent event) - { - Material m = event.getToBlock().getType(); - switch (m) - { - case AIR: - case WATER: - case STATIONARY_WATER: - case LAVA: - case STATIONARY_LAVA: - return; - default: - { - event.setCancelled(true); - } - } - } - - @Command(hook = "tempadddef") - public boolean tempAddDef(CommandSender sender, String user, String group) - { - return tempAdd(sender, user, group, "604800"); - } - - @Command(hook = "tempadd") - public boolean tempAdd(CommandSender sender, String user, String group, String duration) - { - // Use it to make a proper duration output later. Too lazy rn. - @SuppressWarnings("unused") - int i = 0; - try - { - i = Integer.valueOf(duration); - } - catch (NumberFormatException e) - { - getLogger().message(sender, true, "That is not a valid number!"); - return true; - } - Bukkit.dispatchCommand(sender, "pex user " + user + " group add " + group + " * " + duration); - getLogger().message(sender, "Added to group " + group + "for " + duration + " seconds."); - return true; - } - - @Command(hook = "echo") - public boolean echo(CommandSender sender, String text) - { - sender.sendMessage(ChatAPI.colorify(null, text)); - return true; - } - - @Command(hook = "ping") - public boolean ping(CommandSender sender) - { - if (sender instanceof Player) - { - int ping = getPing((Player) sender); - getLogger().message(sender, "Your ping is " + ping + "ms."); - } - else - { - sender.sendMessage("Pong!"); - } - return true; - } - - @Command(hook = "ping2") - public boolean ping(CommandSender sender, String password) - { - if (password.equals("pong")) - if (sender instanceof Player) - { - int ping = getPing((Player) sender); - getLogger().message(sender, new String[] {"Your ping is " + ping + "ms.", ping < 20 - ? "&aThat's gr8 m8 r8 8/8" - : (ping < 50 ? "F&eair enough you cunt!" - : (ping < 100 ? "&eShite, but not shite enough." - : "&cLooks like the server is about two months ahead of you. GET A NEW FRIGGIN' ISP ALREADY"))}); - } - else - getLogger().message(sender, true, - "M8 you shitty cunt are not supposed to run this shit it's for players only!!!"); - else - getLogger().message(sender, true, "&4WRONG PASSWORD, 4/3 ATTEMPTS FAILED! BAN COMMENCING!"); - return true; - } - - public int getPing(Player player) - { - return ((CraftPlayer) player).getHandle().ping; - } - - @Command(hook = "sudo") - public boolean sudo(CommandSender sender, String name, String command) - { - CommandSender target; - if (name.equalsIgnoreCase("console")) - { - target = Bukkit.getConsoleSender(); - } - else - target = Bukkit.getPlayer(name); - if (target == null) - { - getLogger().message(sender, false, "That player couldn't be found!"); - return true; - } - if (command.startsWith("/") || target.equals(Bukkit.getConsoleSender())) - { - String[] args = command.split(" "); - for (String regex : sudoBlacklist) - { - if (args[0].matches((target.equals(Bukkit.getConsoleSender()) ? "" : "\\/") + regex)) - { - getLogger().message(sender, true, "You can't sudo anyone into using that command!"); - return true; - } - } - Bukkit.dispatchCommand(target, command.replaceFirst("/", "")); - getLogger().message(sender, "Sudoed " + Utils.getName(target) + "&7 into running " + command); - } - else - { - ((Player) target).chat(command); - getLogger().message(sender, "Sudoed " + Utils.getName(target) + "&7 into saying " + command); - } - return true; - } - - @Command(hook = "hasperm") - public boolean hasPerm(CommandSender sender, boolean noformat, String name, String node) - { - Player p; - if (name.contains("-")) - try - { - p = Bukkit.getPlayer(UUID.fromString(name)); - } - catch (Exception e) - { - if (noformat) - sender.sendMessage("ERR: Invalid UUID"); - else - getLogger().message(sender, "That UUID is not valid!"); - return true; - } - else - p = Bukkit.getPlayer(name); - if (p == null) - { - if (noformat) - { - Message m = new Message(sender, null); - m.appendText("ERR: Invalid player"); - m.send(); - } - else - { - getLogger().message(sender, "That player couldn't be found!"); - } - return true; - } - - if (noformat) - { - Message m = new Message(sender, null); - m.appendText("" + p.hasPermission(node)); - m.send(); - } - else - { - getLogger().message(sender, "" + p.hasPermission(node)); - } - - return true; - } - - public boolean canBuild(Player player, Location location) - { - BlockBreakEvent event = new BlockBreakEvent(location.getBlock(), player); - Bukkit.getPluginManager().callEvent(event); - return event.isCancelled(); - } - - PotionEffect nightvision = new PotionEffect(PotionEffectType.NIGHT_VISION, Integer.MAX_VALUE, 0, false, false); - - @Command(hook = "illuminate") - public void illuminate(CommandSender sender) - { - Player player = (Player) sender; - if (player.hasPotionEffect(PotionEffectType.NIGHT_VISION)) - { - player.removePotionEffect(PotionEffectType.NIGHT_VISION); - getLogger().message(sender, "Night Vision Disabled."); - } - else - { - player.addPotionEffect(nightvision, true); - getLogger().message(sender, "Night Vision Enabled."); - } - } -}
\ No newline at end of file diff --git a/src/com/redstoner/modules/motd/Motd.cmd b/src/com/redstoner/modules/motd/Motd.cmd deleted file mode 100644 index 987d1fe..0000000 --- a/src/com/redstoner/modules/motd/Motd.cmd +++ /dev/null @@ -1,14 +0,0 @@ -command setmotd { - [string:motd...] { - help Sets the motd. Use --reset to reset to default; - run setmotd motd; - perm utils.setmotd; - } -} -command getmotd { - [empty] { - help Returns the motd; - run getmotd; - perm utils.getmotd; - } -}
\ No newline at end of file diff --git a/src/com/earth2me/essentials/utils/DateUtil.java b/src/main/java/com/earth2me/essentials/utils/DateUtil.java index 80daa36..80daa36 100644 --- a/src/com/earth2me/essentials/utils/DateUtil.java +++ b/src/main/java/com/earth2me/essentials/utils/DateUtil.java diff --git a/src/com/redstoner/modules/abot/Abot.cmd b/src/main/java/com/redstoner/modules/abot/Abot.cmd index c8bb2d8..c8bb2d8 100644 --- a/src/com/redstoner/modules/abot/Abot.cmd +++ b/src/main/java/com/redstoner/modules/abot/Abot.cmd diff --git a/src/com/redstoner/modules/abot/Abot.java b/src/main/java/com/redstoner/modules/abot/Abot.java index 728d61c..3cff0c1 100644 --- a/src/com/redstoner/modules/abot/Abot.java +++ b/src/main/java/com/redstoner/modules/abot/Abot.java @@ -21,26 +21,22 @@ import com.redstoner.modules.Module; @Commands(CommandHolderType.File) @AutoRegisterListener -@Version(major = 4, minor = 1, revision = 0, compatible = 4) -public class Abot implements Module, Listener -{ +@Version(major = 5, minor = 0, revision = 0, compatible = 4) +public class Abot implements Module, Listener { private File answerFile = new File(Main.plugin.getDataFolder(), "abot.json"); JSONArray answers; - + @EventHandler - public void onPlayerChat(AsyncPlayerChatEvent event) - { - for (Object rawObject : answers) - { + public void onPlayerChat(AsyncPlayerChatEvent event) { + for (Object rawObject : answers) { JSONObject entry = (JSONObject) rawObject; JSONArray regexes = (JSONArray) entry.get("regex"); - for (Object regex : regexes) - { - if (event.getMessage().toLowerCase().matches((String) regex)) - { + + for (Object regex : regexes) { + if (event.getMessage().toLowerCase().matches((String) regex)) { Object hideperm = entry.get("hide-perm"); - if (hideperm == null || !event.getPlayer().hasPermission((String) hideperm)) - { + + if (hideperm == null || !event.getPlayer().hasPermission((String) hideperm)) { event.setCancelled(true); getLogger().message(event.getPlayer(), (String) entry.get("message")); return; @@ -49,19 +45,17 @@ public class Abot implements Module, Listener } } } - + @Command(hook = "abot_reload") - public void loadAnswers(CommandSender sender) - { + public void loadAnswers(CommandSender sender) { answers = JsonManager.getArray(answerFile); - if (answers == null) - answers = new JSONArray(); + if (answers == null) answers = new JSONArray(); + getLogger().message(sender, "Loaded the abot.json file!"); } - + @Override - public boolean onEnable() - { + public boolean onEnable() { loadAnswers(Bukkit.getConsoleSender()); return true; } diff --git a/src/main/java/com/redstoner/modules/abot/module.info b/src/main/java/com/redstoner/modules/abot/module.info new file mode 100644 index 0000000..3be9a79 --- /dev/null +++ b/src/main/java/com/redstoner/modules/abot/module.info @@ -0,0 +1,3 @@ +displayName: Abot +category: Other +description: An annoying little bot to automatically answer questions in chat
\ No newline at end of file diff --git a/src/com/redstoner/modules/adminchat/Adminchat.cmd b/src/main/java/com/redstoner/modules/adminchat/Adminchat.cmd index b083eb9..210a3e9 100644 --- a/src/com/redstoner/modules/adminchat/Adminchat.cmd +++ b/src/main/java/com/redstoner/modules/adminchat/Adminchat.cmd @@ -1,42 +1,40 @@ command ac { + perm utils.ac; [string:message...] { help Sends a message in Admin Chat; - perm utils.ac; run ac_msg message; } } command acn { + perm utils.ac; [string:name] [string:message...] { help Sends a message in Admin Chat; - perm utils.ac; type console; run acn_msg name message; } } command ackey { + perm utils.ac; [string:key] { help Sets your Admin Chat key; - perm utils.ac; type player; run setackey key; } } command act { + perm utils.ac; on { help Turns on act; - perm utils.ac; run act_on; } off { help Turns off act; - perm utils.ac; run act_off; } [empty] { help toggles Admin Chat; - perm utils.ac; run act; } }
\ No newline at end of file diff --git a/src/com/redstoner/modules/adminchat/Adminchat.java b/src/main/java/com/redstoner/modules/adminchat/Adminchat.java index d736f8f..3d5974d 100644 --- a/src/com/redstoner/modules/adminchat/Adminchat.java +++ b/src/main/java/com/redstoner/modules/adminchat/Adminchat.java @@ -25,190 +25,185 @@ import com.redstoner.modules.Module; import net.nemez.chatapi.ChatAPI; -/** AdminChat module. Allows staff to chat to other staff using /ac \<message\> as well as a one char prefix or a toggle. +/** + * AdminChat module. Allows staff to chat to other staff using /ac \<message\> + * as well as a one char prefix or a toggle. * - * @author Pepich */ + * @author Pepich + */ @Commands(CommandHolderType.File) @AutoRegisterListener -@Version(major = 4, minor = 1, revision = 0, compatible = 4) -public class Adminchat implements Module, Listener -{ +@Version(major = 5, minor = 0, revision = 0, compatible = 4) +public class Adminchat implements Module, Listener { private static final char defaultKey = ','; private static final File keysLocation = new File(Main.plugin.getDataFolder(), "adminchat_keys.json"); private ArrayList<UUID> actoggled; private static JSONObject keys; - + + private static final BroadcastFilter AC_PERM_BROADCAST_FILTER = new BroadcastFilter() { + @Override + public boolean sendTo(CommandSender recipient) { + return recipient.hasPermission("utils.ac"); + } + }; + @Override - public boolean onEnable() - { + public boolean onEnable() { keys = JsonManager.getObject(keysLocation); - if (keys == null) - { + + if (keys == null) { keys = new JSONObject(); saveKeys(); } + actoggled = new ArrayList<>(); return true; } - + @Command(hook = "ac_msg") - public boolean acSay(CommandSender sender, String message) - { + public boolean acSay(CommandSender sender, String message) { String name; - if (sender instanceof Player) - name = ((Player) sender).getDisplayName(); - else - name = sender.getName(); - Utils.broadcast("ยง8[ยงcACยง8] ยง9" + name + "ยง8: ยงb", ChatAPI.colorify(sender, message), new BroadcastFilter() - { - @Override - public boolean sendTo(CommandSender recipient) - { - return recipient.hasPermission("utils.ac"); - } - }); + + if (sender instanceof Player) name = ((Player) sender).getDisplayName(); + else name = sender.getName(); + + Utils.broadcast("ยง8[ยงcACยง8] ยง9" + name + "ยง8: ยงb", ChatAPI.colorify(sender, message), AC_PERM_BROADCAST_FILTER); return true; } - + @Command(hook = "acn_msg") - public boolean acnSay(CommandSender sender, String name, String message) - { - Utils.broadcast("ยง8[ยงcACยง8] ยง9" + name + "ยง8: ยงb", ChatAPI.colorify(sender, message), new BroadcastFilter() - { - @Override - public boolean sendTo(CommandSender recipient) - { - return recipient.hasPermission("utils.ac"); - } - }); + public boolean acnSay(CommandSender sender, String name, String message) { + Utils.broadcast("ยง8[ยงcACยง8] ยง9" + name + "ยง8: ยงb", ChatAPI.colorify(sender, message), AC_PERM_BROADCAST_FILTER); return true; } - - /** Let's a Player toggle their ac-toglge status to allow for automatically sending chat messages to adminchat. + + /** + * Lets a Player toggle their AC toggle status to allow automatically sending + * chat messages to admin chat. * * @param sender the issuer of the command. - * @param _void ignored. - * @return true. */ + * @param _void ignored. + * @return true. + */ @Command(hook = "act") - public boolean acToggleCommand(CommandSender sender) - { - if (actoggled.contains(((Player) sender).getUniqueId())) - { + public boolean acToggleCommand(CommandSender sender) { + if (actoggled.contains(((Player) sender).getUniqueId())) { actoggled.remove(((Player) sender).getUniqueId()); getLogger().message(sender, "ACT now ยงcdisabled"); - } - else - { + } else { actoggled.add(((Player) sender).getUniqueId()); getLogger().message(sender, "ACT now ยงaenabled"); } + return true; } - - /** Let's a Player toggle their ac-toglge status to allow for automatically sending chat messages to adminchat. + + /** + * Lets a Player toggle their AC toggle status to allow automatically sending + * chat messages to admin chat. * * @param sender the issuer of the command. - * @return true. */ + * @return true. + */ @Command(hook = "act_on") - public boolean acToggleOnCommand(CommandSender sender) - { - if (!actoggled.contains(((Player) sender).getUniqueId())) - { + public boolean acToggleOnCommand(CommandSender sender) { + if (!actoggled.contains(((Player) sender).getUniqueId())) { actoggled.add(((Player) sender).getUniqueId()); getLogger().message(sender, "ACT now ยงaenabled"); - } - else + } else { getLogger().message(sender, "ACT was already enabled"); + } + return true; } - - /** Let's a Player toggle their ac-toglge status to allow for automatically sending chat messages to adminchat. + + /** + * Lets a Player toggle their AC toggle status to allow automatically sending chat messages to admin chat. * * @param sender the issuer of the command. - * @return true. */ + * @return true. + */ @Command(hook = "act_off") - public boolean acToggleOffCommand(CommandSender sender) - { - if (actoggled.contains(((Player) sender).getUniqueId())) - { + public boolean acToggleOffCommand(CommandSender sender) { + if (actoggled.contains(((Player) sender).getUniqueId())) { actoggled.remove(((Player) sender).getUniqueId()); getLogger().message(sender, "ACT now ยงcdisabled"); - } - else - { + } else { getLogger().message(sender, "ACT was already disabled"); } + return true; } - - /** Deals with chat events to allow for ackeys and actoggle. + + /** + * Deals with chat events to allow for ackeys and actoggle. * - * @param event the chat event containing the player and the message. */ + * @param event the chat event containing the player and the message. + */ @EventHandler - public void onPlayerChat(AsyncPlayerChatEvent event) - { + public void onPlayerChat(AsyncPlayerChatEvent event) { Player player = event.getPlayer(); - if (!player.hasPermission("utils.ac")) - return; - if (event.getMessage().startsWith(getKey(player))) - { + + if (!player.hasPermission("utils.ac")) return; + + if (event.getMessage().startsWith(getKey(player))) { event.setCancelled(true); acSay(event.getPlayer(), event.getMessage().replaceFirst(Pattern.quote(getKey(player)), "")); - } - else if (actoggled.contains(event.getPlayer().getUniqueId())) - { + } else if (actoggled.contains(event.getPlayer().getUniqueId())) { event.setCancelled(true); acSay(event.getPlayer(), event.getMessage()); } } - - /** Sets the ackey of a Player. + + /** + * Sets the ackey of a Player. * * @param sender the issuer of the command. - * @param key the key to be set. Set to NULL or "" to get your current key. - * @return true. */ + * @param key the key to be set. Set to NULL or "" to get your current key. + * @return true. + */ @SuppressWarnings("unchecked") @Command(hook = "setackey") - public boolean setAcKey(CommandSender sender, String key) - { - if (key.length() > 1) - { - getLogger().message(sender, true, - "Could not set your key to ยง6" + key + " ยง7, it can be at most one char."); + public boolean setAcKey(CommandSender sender, String key) { + if (key.length() > 1) { + getLogger().message(sender, true, "Could not set your key to ยง6" + key + " ยง7, it can be at most one char."); return true; } - if (key == null || key.length() == 0) - { + + if (key == null || key.length() == 0) { getAcKey(sender); return true; } + getLogger().message(sender, "Set your key to ยง6" + key); keys.put(((Player) sender).getUniqueId().toString(), key + ""); + saveKeys(); return true; } - - /** This method will find the AdminChat key of any player. + + /** + * This method will find the AdminChat key of any player. * * @param player the player to get the key from. - * @return the key. */ - public static String getKey(Player player) - { + * @return the key. + */ + public static String getKey(Player player) { String key = (String) keys.get(player.getUniqueId().toString()); return (key == null ? "" + defaultKey : key); } - - /** Prints a Players ackey to their chat. + + /** + * Prints a Player's ackey to their chat. * - * @param sender the issuer of the command. */ - public void getAcKey(CommandSender sender) - { + * @param sender the issuer of the command. + */ + public void getAcKey(CommandSender sender) { getLogger().message(sender, "Your current ackey is ยง6" + getKey((Player) sender)); } - + /** Saves the keys. */ - private void saveKeys() - { + private void saveKeys() { JsonManager.save(keys, keysLocation); } } diff --git a/src/main/java/com/redstoner/modules/adminchat/module.info b/src/main/java/com/redstoner/modules/adminchat/module.info new file mode 100644 index 0000000..90f4391 --- /dev/null +++ b/src/main/java/com/redstoner/modules/adminchat/module.info @@ -0,0 +1,3 @@ +displayName: Adminchat +category: Staff +description: A secondary chat used for staff to communicate with each other
\ No newline at end of file diff --git a/src/com/redstoner/modules/afk/AFK.cmd b/src/main/java/com/redstoner/modules/afk/AFK.cmd index 45483da..6353e33 100644 --- a/src/com/redstoner/modules/afk/AFK.cmd +++ b/src/main/java/com/redstoner/modules/afk/AFK.cmd @@ -2,13 +2,19 @@ command afk { alias eafk; alias away; alias eaway; + + perm utils.afk; + [empty] { run afk; - perm utils.afk; } - [string:reason...] { - run afk2 reason; - perm utils.afk; + + [optional:-s] { + run afksilent -s; + } + + [optional:-s] [string:reason...] { + run afkreason -s reason; } } diff --git a/src/main/java/com/redstoner/modules/afk/AFK.java b/src/main/java/com/redstoner/modules/afk/AFK.java new file mode 100644 index 0000000..ee96137 --- /dev/null +++ b/src/main/java/com/redstoner/modules/afk/AFK.java @@ -0,0 +1,100 @@ +package com.redstoner.modules.afk; + +import com.nemez.cmdmgr.Command; +import com.redstoner.annotations.AutoRegisterListener; +import com.redstoner.annotations.Commands; +import com.redstoner.annotations.Version; +import com.redstoner.coremods.moduleLoader.ModuleLoader; +import com.redstoner.misc.CommandHolderType; +import com.redstoner.misc.Utils; +import com.redstoner.modules.Module; +import com.redstoner.modules.datamanager.DataManager; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.event.HandlerList; + +@Commands(CommandHolderType.File) +@AutoRegisterListener +@Version(major = 5, minor = 0, revision = 0, compatible = 4) +public class AFK implements Module { + private AFKListener listener; + + @Override + public void firstLoad() { + String[] choices = new String[] { "listen", "ignore" }; + + DataManager.setConfig("indicator", "&7[AFK]"); + + DataManager.setConfig("move", "listen", choices); + DataManager.setConfig("look", "ignore", choices); + DataManager.setConfig("chat", "listen", choices); + DataManager.setConfig("interact", "listen", choices); + DataManager.setConfig("command", "ignore", choices); + } + + @Override + public void migrate(Version old) { + if (old.major() == 4 && old.minor() == 0 && old.revision() == 3) { + String[] choices = new String[] { "listen", "ignore" }; + DataManager.setConfig("look", "ignore", choices); + } + } + + @Override + public void postEnable() { + listener = new AFKListener(); + + Bukkit.getServer().getPluginManager().registerEvents(listener, ModuleLoader.getPlugin()); + update_afk_listeners(Bukkit.getConsoleSender()); + } + + @Override + public void onDisable() { + HandlerList.unregisterAll(listener); + } + + @Command(hook = "afk") + public boolean afk(CommandSender sender) { + return afk(sender, false, ""); + } + + @Command(hook = "afksilent") + public boolean afk(CommandSender sender, boolean silent) { + return afk(sender, silent, ""); + } + + @Command(hook = "afkreason") + public boolean afk(CommandSender sender, boolean silent, String reason) { + if (AFKUtil.isAfk(sender)) { + AFKUtil.unAfk(sender, silent); + } else { + DataManager.setData(sender, "afk_time", System.currentTimeMillis()); + DataManager.setData(sender, "afk_reason", reason); + DataManager.setState(sender, "afk_silent", silent); + DataManager.setState(sender, "afk", true); + + if (!silent) Utils.broadcast("ยง7 * ", Utils.getName(sender) + "ยง7 is now AFK", null); + } + + return true; + } + + private boolean getListenSetting(String name, String def) { + return DataManager.getConfigOrDefault(name, def).equals("listen"); + } + + @Command(hook = "update_afk_listeners") + public boolean update_afk_listeners(CommandSender sender) { + Utils.broadcast(null, "Updating afk listeners...", recipient -> recipient.hasPermission("utils.afk.admin")); + + listener.listenTo( + getListenSetting("move", "listen"), + getListenSetting("look", "ignore"), + getListenSetting("chat", "listen"), + getListenSetting("interact", "listen"), + getListenSetting("command", "ignore") + ); + + return true; + } +} diff --git a/src/main/java/com/redstoner/modules/afk/AFKListener.java b/src/main/java/com/redstoner/modules/afk/AFKListener.java new file mode 100644 index 0000000..fab0b5e --- /dev/null +++ b/src/main/java/com/redstoner/modules/afk/AFKListener.java @@ -0,0 +1,64 @@ +package com.redstoner.modules.afk; + +import com.redstoner.misc.Utils; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.*; + +public class AFKListener implements Listener { + private boolean + move = false, + look = false, + chat = false, + interact = false, + command = false; + + protected void listenTo(boolean move, boolean look, boolean chat, boolean interact, boolean command) { + this.move = move; + this.look = look; + this.chat = chat; + this.interact = interact; + this.command = command; + + String lt = "Listening to:"; + + if (move) lt += " move"; + if (look) lt += " look"; + if (chat) lt += " chat"; + if (interact) lt+= " interact"; + if (command) lt += " command"; + + Utils.broadcast(null, lt, recipient -> recipient.hasPermission("utils.afk.admin")); + } + + @EventHandler + public void onMove(PlayerMoveEvent event) { + double distance = event.getFrom().distance(event.getTo()); + + boolean moved = distance > 0; + boolean looked = (event.getFrom().getPitch() != event.getTo().getPitch()) || (event.getFrom().getYaw() != event.getTo().getYaw()); + + if ((move && moved) || (look && looked)) AFKUtil.checkedUnAfk(event.getPlayer()); + } + + @EventHandler + @SuppressWarnings("deprecation") + public void onChat(PlayerChatEvent event) { + if (chat) AFKUtil.checkedUnAfk(event.getPlayer()); + } + + @EventHandler + public void onInteract(PlayerInteractEvent event) { + if (interact) AFKUtil.checkedUnAfk(event.getPlayer()); + } + + @EventHandler + public void onCommand(PlayerCommandPreprocessEvent event) { + if (command) AFKUtil.checkedUnAfk(event.getPlayer()); + } + + @EventHandler + public void onLeave(PlayerQuitEvent event) { + AFKUtil.unAfk(event.getPlayer(), true); + } +}
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/afk/AFKUtil.java b/src/main/java/com/redstoner/modules/afk/AFKUtil.java new file mode 100644 index 0000000..3746632 --- /dev/null +++ b/src/main/java/com/redstoner/modules/afk/AFKUtil.java @@ -0,0 +1,30 @@ +package com.redstoner.modules.afk; + +import com.redstoner.misc.Utils; +import com.redstoner.modules.datamanager.DataManager; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class AFKUtil { + protected static void unAfk(CommandSender sender, boolean silent) { + DataManager.setState(sender, "afk", false); + + if (!silent) Utils.broadcast("ยง7 * ", Utils.getName(sender) + "ยง7 is no longer AFK", null); + } + + protected static boolean isAfk(CommandSender sender) { + return DataManager.getState(sender, "afk"); + } + + protected static boolean isVanished(Player player) { + return DataManager.getState(player, "vanished"); + } + + protected static boolean isSilent(CommandSender sender) { + return DataManager.getState(sender, "afk_silent"); + } + + protected static void checkedUnAfk(Player player) { + if (isAfk(player) && !isVanished(player)) unAfk(player, isSilent(player)); + } +}
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/afk/module.info b/src/main/java/com/redstoner/modules/afk/module.info new file mode 100644 index 0000000..fb1fca6 --- /dev/null +++ b/src/main/java/com/redstoner/modules/afk/module.info @@ -0,0 +1,3 @@ +displayName: AFK +category: Chat +description: Allows a user to announce they're afk ,and will also notify players messaging them, that they're afk and might not see the message
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMod.java b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMod.java new file mode 100644 index 0000000..ae7799e --- /dev/null +++ b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMod.java @@ -0,0 +1,42 @@ +package com.redstoner.modules.blockplacemods; + +import com.redstoner.modules.datamanager.DataManager; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; + +public class BlockPlaceMod implements Listener { + public final String name; + public final String[] aliases; + public final String description; + public final ModType type; + public final String typeDescription; + + public final boolean enabledByDefault; + + protected BlockPlaceMod(String name, String description, ModType type, String typeDescription, boolean enabledByDefault, String... aliases) { + this.name = name; + this.aliases = aliases; + this.description = description; + + this.type = type; + this.typeDescription = typeDescription; + + this.enabledByDefault = enabledByDefault; + } + + protected final boolean hasEnabled(Player player) { + String uuid = player.getUniqueId().toString(); + return (boolean) DataManager.getOrDefault(uuid, "BlockPlaceMods", name, enabledByDefault); + } + + protected final Object getState(Player player) { + String uuid = player.getUniqueId().toString(); + return DataManager.getOrDefault(uuid, "BlockPlaceMods", name + "_state", null); + } + + public boolean onEnable() { + return true; + } + + public void onDisable() {} +} diff --git a/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.cmd b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.cmd new file mode 100644 index 0000000..5e1206c --- /dev/null +++ b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.cmd @@ -0,0 +1,43 @@ +command bpm { + alias set; + alias toggle; + alias mod; + + perm blockplacemods.use; + type player; + + [empty] { + help Lists the block place mods and their statuses.; + run list_mods; + } + + list [empty] { + help Lists the block place mods and their statuses.; + run list_mods; + } + + reset [string:mod] { + help Resets the specified mod's settings to the default value.; + run reset_mod mod; + } + + toggle [string:mod] { + help Toggles a block place mod.; + run toggle_mod mod; + } + + set [string:mod] [string:value] { + help Sets the specified mod's state to the specified value. Only works for mods that have a state.; + run set_mod_value mod value; + } + + [string:mod] { + help Toggles a block place mod.; + run toggle_mod_no_prefix mod; + } + + [string:mod] [string:value] { + help Sets the specified mod's state to the specified value. Only works for mods that have a state.; + run set_mod_value mod value; + } +}
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java new file mode 100644 index 0000000..1306235 --- /dev/null +++ b/src/main/java/com/redstoner/modules/blockplacemods/BlockPlaceMods.java @@ -0,0 +1,213 @@ +package com.redstoner.modules.blockplacemods; + +import com.nemez.cmdmgr.Command; +import com.redstoner.annotations.AutoRegisterListener; +import com.redstoner.annotations.Commands; +import com.redstoner.annotations.Version; +import com.redstoner.coremods.moduleLoader.ModuleLoader; +import com.redstoner.misc.CommandHolderType; +import com.redstoner.misc.Main; +import com.redstoner.modules.Module; +import com.redstoner.modules.blockplacemods.mods.ModBetterDirectional; +import com.redstoner.modules.blockplacemods.mods.ModCauldron; +import com.redstoner.modules.blockplacemods.mods.ModSlab; +import com.redstoner.modules.datamanager.DataManager; +import net.nemez.chatapi.click.Message; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Commands (CommandHolderType.File) +@AutoRegisterListener +@Version (major = 4, minor = 1, revision = 1, compatible = 4) +public class BlockPlaceMods implements Module, Listener { + private static final Map<String, BlockPlaceMod> mods = new HashMap<>(); + private static final List<BlockPlaceMod> enabledMods = new ArrayList<>(); + + private final BlockPlaceMod[] modsToRegister = { + new ModCauldron(), + new ModSlab(), + new ModBetterDirectional("Observer", Material.OBSERVER, "observers", false), + new ModBetterDirectional("Piston", Material.PISTON, "pistons", false), + }; + + @Override + public boolean onEnable() { + for (BlockPlaceMod mod : modsToRegister) { + mods.put(mod.name.toLowerCase(), mod); + + for (String alias : mod.aliases) { + mods.put(alias.toLowerCase(), mod); + } + + if (mod.onEnable()) { + enabledMods.add(mod); + Bukkit.getPluginManager().registerEvents(mod, Main.plugin); + } else { + getLogger().warn("Failed to enable the mod, &e" + mod.name + "&7!"); + } + } + + return true; + } + + @Override + public void onDisable() { + for (BlockPlaceMod mod : enabledMods) { + mod.onDisable(); + HandlerList.unregisterAll(mod); + } + + enabledMods.clear(); + mods.clear(); + } + + @Command (async = Command.AsyncType.ALWAYS, hook = "list_mods") + public void listMods(CommandSender sender) { + Player player = (Player) sender; + String uuid = player.getUniqueId().toString(); + + Message msg = new Message(sender, sender); + + msg.appendText(getLogger().getHeader() + "\n"); + + int curMod = 1; + for (BlockPlaceMod mod : modsToRegister) { + + boolean enabled = (boolean) DataManager.getOrDefault(uuid, "BlockPlaceMods", mod.name, mod.enabledByDefault); + boolean loaded = enabledMods.contains(mod); + + String text = (enabled? "&a" : "&c") + (loaded? "" : "&m") + mod.name; + String hover = (enabled? "&aEnabled" : "&cDisabled") + (loaded? "" : "\n&c&oThis mod is not loaded, report to staff!"); + + if (mod.type != ModType.STATELESS) { + Object state = DataManager.getOrDefault(uuid, "BlockPlaceMods", mod.name + "_state", null); + if (state != null) + hover += ("\n\n&7Value: &e" + state.toString() + "\n&7Type: &e" + mod.type.asString() + " \n&7Meaning: " + mod.typeDescription); + } + + hover += "\n\n&7" + mod.description + "\n&e&oClick to " + (enabled? "&c&oDisable" : "&a&oEnable"); + msg.appendSendChatHover(text, "/bpm " + mod.name, hover); + + if (curMod != modsToRegister.length) + msg.appendText("&7, "); + curMod++; + } + msg.appendText("\n\n&2Hover over a mod for details.") + .send(); + } + + @Command (async = Command.AsyncType.ALWAYS, hook = "reset_mod") + public void resetMod(CommandSender sender, String mod) { + BlockPlaceMod bpm = mods.get(mod.toLowerCase()); + + if (bpm == null) { + getLogger().message(sender, true, "The mod, &e" + mod + "&7, does not exist!"); + return; + } + + Player player = (Player) sender; + DataManager.removeData(player.getUniqueId().toString(), "BlockPlaceMods", bpm.name); + DataManager.removeData(player.getUniqueId().toString(), "BlockPlaceMods", bpm.name + "_state"); + + getLogger().message(sender, "The &3" + bpm.name + "&7 mod has been reset back to it's original settings."); + } + + @Command (async = Command.AsyncType.ALWAYS, hook = "toggle_mod_no_prefix") + public void toggleModNoPrefix(CommandSender sender, String mod) { + if (mod.equals("help")) + try { + Bukkit.getScheduler().callSyncMethod(ModuleLoader.getPlugin(), () -> Bukkit.dispatchCommand(sender, "bpm help 1")).get(); + } catch (Exception e) { + getLogger().message(sender, true, "&4An error accorded trying to show you the help! Please inform a staff member!"); + e.printStackTrace(); + } + else + toggleMod(sender, mod); + } + + @Command (async = Command.AsyncType.ALWAYS, hook = "toggle_mod") + public void toggleMod(CommandSender sender, String mod) { + BlockPlaceMod bpm = mods.get(mod.toLowerCase()); + + if (bpm == null) { + getLogger().message(sender, true, "The mod, &e" + mod + "&7, does not exist!"); + return; + } + + Player player = (Player) sender; + String uuid = player.getUniqueId().toString(); + + boolean current = (boolean) DataManager.getOrDefault(uuid, "BlockPlaceMods", bpm.name, bpm.enabledByDefault); + DataManager.setData(uuid, "BlockPlaceMods", bpm.name, !current); + + getLogger().message(sender, "The &3" + bpm.name + "&7 mod has been " + (current ? "&cDisabled&7!" : "&aEnabled&7!")); + } + + @Command (async = Command.AsyncType.ALWAYS, hook = "set_mod_value") + public void setModValue(CommandSender sender, String mod, String value) { + BlockPlaceMod bpm = mods.get(mod.toLowerCase()); + + if (bpm == null) { + getLogger().message(sender, true, "The mod, &e" + mod + "&7, does not exist!"); + return; + } + + Player player = (Player) sender; + String uuid = player.getUniqueId().toString(); + + switch (bpm.type) { + case STATELESS: + getLogger().message(sender, true, "You cannot change the value of a stateless mod!"); + break; + case STRING: + DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", value); + getLogger().message(sender, "Changed the value of &3" + bpm.name + "&7 to &e" + value); + break; + case INTEGER: + try { + DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", Integer.parseInt(value)); + getLogger().message(sender, "Changed the value of &3" + bpm.name + "&7 to &e" + value); + } catch (NumberFormatException e) { + getLogger().message(sender, true, "The specified value must be an integer!"); + } + break; + case UNSIGNED_INTEGER: + try { + int val = Integer.parseInt(value); + + if (val < 0) { + getLogger().message(sender, true, "The specified value must be zero or a positive integer!"); + break; + } + DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", val); + getLogger().message(sender, "Changed the value of &3" + bpm.name + "&7 to &e" + value); + } catch (NumberFormatException e) { + getLogger().message(sender, true, "The specified value must be zero or a positive integer!"); + } + break; + case REDSTONE_LEVEL: + try { + int val = Integer.parseInt(value); + + if (val < 1 || val > 15) { + getLogger().message(sender, true, "The specified value must be an integer between 1 and 15!"); + break; + } + DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", val); + getLogger().message(sender, "Changed the value of &3" + bpm.name + "&7 to &e" + value); + } catch (NumberFormatException e) { + getLogger().message(sender, true, "The specified value must be an integer between 1 and 15!"); + } + break; + } + } +} diff --git a/src/main/java/com/redstoner/modules/blockplacemods/ModType.java b/src/main/java/com/redstoner/modules/blockplacemods/ModType.java new file mode 100644 index 0000000..d7511d2 --- /dev/null +++ b/src/main/java/com/redstoner/modules/blockplacemods/ModType.java @@ -0,0 +1,19 @@ +package com.redstoner.modules.blockplacemods; + +public enum ModType { + STATELESS("Stateless"), + INTEGER("Integer"), + UNSIGNED_INTEGER("Positive Integer"), + STRING("String"), + REDSTONE_LEVEL("Redstone Level"); + + private String asString; + + private ModType(String asString) { + this.asString = asString; + } + + public String asString() { + return asString; + } +} diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModBetterDirectional.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModBetterDirectional.java new file mode 100644 index 0000000..99a9f5d --- /dev/null +++ b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModBetterDirectional.java @@ -0,0 +1,73 @@ +package com.redstoner.modules.blockplacemods.mods; + +import com.redstoner.modules.blockplacemods.BlockPlaceMod; +import com.redstoner.modules.blockplacemods.ModType; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.Directional; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockPlaceEvent; + +public class ModBetterDirectional extends BlockPlaceMod { + private static final BlockFace[][][] dirMap = { + { + { null, null, null }, + { null, BlockFace.WEST, null }, // (-1, 0, 0) + { null, null, null } + }, + { + { null, BlockFace.DOWN, null }, // (0, -1, 0) + { BlockFace.NORTH, BlockFace.SELF, BlockFace.SOUTH }, // (0, 0, x) + { null, BlockFace.UP, null } // (0, 1, 0) + }, + { + { null, null, null }, + { null, BlockFace.EAST, null }, // (1, 0, 0) + { null, null, null } + } + }; + + private final Material material; + + public ModBetterDirectional(String name, Material material, String materialPlural, boolean enabledByDefault) { + super( + name, + "With this mod enabled " + materialPlural + " are placed with the bottom on the block clicked.", + ModType.STATELESS, + null, + enabledByDefault, + "BetterDirectional" + material.name().toLowerCase() + ); + + this.material = material; + } + + @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) { + if ( + event.getBlock().getType() == material + && !event.getPlayer().isSneaking() + && hasEnabled(event.getPlayer()) + && event.getPlayer().getGameMode() == GameMode.CREATIVE + ) { + Block block = event.getBlock(); + Directional data = (Directional) block.getBlockData(); + + data.setFacing(getDirection(event)); + block.setBlockData(data); + } + } + + private BlockFace getDirection(BlockPlaceEvent event) { + Location original = event.getBlockPlaced().getLocation(); + Location against = event.getBlockAgainst().getLocation(); + + Location dir = original.subtract(against); + + return dirMap[dir.getBlockX() + 1][dir.getBlockY() + 1][dir.getBlockZ() + 1]; + } +} diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModCauldron.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModCauldron.java new file mode 100644 index 0000000..d28c9ba --- /dev/null +++ b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModCauldron.java @@ -0,0 +1,63 @@ +package com.redstoner.modules.blockplacemods.mods; + +import com.redstoner.modules.blockplacemods.BlockPlaceMod; +import com.redstoner.modules.blockplacemods.ModType; +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.data.Levelled; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerInteractEvent; + +public class ModCauldron extends BlockPlaceMod { + public ModCauldron() { + super( + "Cauldron", + "With this mod enabled cauldrons are placed filled and cycle on a shiftless right click with an empty hand.", + ModType.STATELESS, + null, + true, + "CauldronFill", "AutoCauldron" + ); + } + + @EventHandler + public void onPlayerInteract(PlayerInteractEvent event) { + if ( + event.getAction() == Action.RIGHT_CLICK_BLOCK + && !event.isCancelled() + && !event.getPlayer().isSneaking() + && event.getClickedBlock().getType() == Material.CAULDRON + && hasEnabled(event.getPlayer()) + && event.getPlayer().getGameMode() == GameMode.CREATIVE + && event.getPlayer().getInventory().getItemInMainHand().getType() == Material.AIR + ) { + Block block = event.getClickedBlock(); + Levelled data = (Levelled) block.getBlockData(); + + int newLevel = (data.getLevel() + 1) % (data.getMaximumLevel() + 1); + + data.setLevel(newLevel); + block.setBlockData(data); + } + } + + @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) { + if ( + event.getBlock().getType() == Material.CAULDRON + && !event.getPlayer().isSneaking() + && hasEnabled(event.getPlayer()) + && event.getPlayer().getGameMode() == GameMode.CREATIVE + ) { + Block block = event.getBlock(); + Levelled data = (Levelled) block.getBlockData(); + + data.setLevel(data.getMaximumLevel()); + block.setBlockData(data); + } + } +} diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModSlab.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModSlab.java new file mode 100644 index 0000000..9e18bef --- /dev/null +++ b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModSlab.java @@ -0,0 +1,39 @@ +package com.redstoner.modules.blockplacemods.mods; + +import com.redstoner.modules.blockplacemods.BlockPlaceMod; +import com.redstoner.modules.blockplacemods.ModType; +import org.bukkit.GameMode; +import org.bukkit.block.Block; +import org.bukkit.block.data.type.Slab; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockPlaceEvent; + +public class ModSlab extends BlockPlaceMod { + public ModSlab() { + super( + "Slab", + "With this mod enabled Slabs are placed on the top half of the block unless you are sneaking.", + ModType.STATELESS, + null, + true, + "Step", "AutoSlab", "AutoStep", "SlabRotation", "StepRotation" + ); + } + + @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) { + if ( + event.getBlock().getBlockData() instanceof Slab + && !event.getPlayer().isSneaking() + && hasEnabled(event.getPlayer()) + && event.getPlayer().getGameMode() == GameMode.CREATIVE + ) { + Block block = event.getBlock(); + Slab data = (Slab) block.getBlockData(); + + data.setType(Slab.Type.TOP); + block.setBlockData(data); + } + } +} diff --git a/src/main/java/com/redstoner/modules/blockplacemods/mods/ModTorch.java b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModTorch.java new file mode 100644 index 0000000..a96a2ca --- /dev/null +++ b/src/main/java/com/redstoner/modules/blockplacemods/mods/ModTorch.java @@ -0,0 +1,78 @@ +package com.redstoner.modules.blockplacemods.mods; + +import com.redstoner.misc.Main; +import com.redstoner.modules.blockplacemods.BlockPlaceMod; +import com.redstoner.modules.blockplacemods.ModType; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.material.RedstoneTorch; + +import java.util.HashMap; +import java.util.Map; + +public class ModTorch extends BlockPlaceMod { + private static final Map<Block, Block> monitorBlocks = new HashMap<>(); + + private int monitorId = -1; + + public ModTorch() { + super( + "Torch", + "With this mod enabled redstone torches placed on redstone blocks get auto removed after they turn off.", + ModType.STATELESS, + null, + true, + "AutoTorch", "TorchRemoval", "RedstoneTorch" + ); + } + + @Override + public boolean onEnable() { + monitorId = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.plugin, () -> { + for (Block block : monitorBlocks.keySet()) { + Block against = monitorBlocks.get(block); + + if (block.getType() != Material.REDSTONE_TORCH || against.getType() != Material.REDSTONE_BLOCK) { + monitorBlocks.remove(block); + return; + } + + RedstoneTorch data = (RedstoneTorch) block.getBlockData(); + + if (!data.isPowered()) { + block.setType(Material.AIR); + } + } + }, 2, 2); + + return monitorId != -1; + } + + @Override + public void onDisable() { + Bukkit.getScheduler().cancelTask(monitorId); + monitorId = -1; + } + + @EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) { + if ( + event.getBlock().getType() == Material.REDSTONE_TORCH + && !event.getPlayer().isSneaking() + && hasEnabled(event.getPlayer()) + && event.getPlayer().getGameMode() == GameMode.CREATIVE + ) { + Block block = event.getBlock(); + Block against = event.getBlockAgainst(); + + if (against.getType() == Material.REDSTONE_BLOCK) { + monitorBlocks.put(block, against); + } + } + } +} diff --git a/src/main/java/com/redstoner/modules/blockplacemods/module.info b/src/main/java/com/redstoner/modules/blockplacemods/module.info new file mode 100644 index 0000000..2d1904f --- /dev/null +++ b/src/main/java/com/redstoner/modules/blockplacemods/module.info @@ -0,0 +1,3 @@ +displayName: BlockPlaceMods +category: Other +description: Adds features to block placing.
\ No newline at end of file diff --git a/src/com/redstoner/modules/chat/Chat.cmd b/src/main/java/com/redstoner/modules/chat/Chat.cmd index fdd65e3..339e128 100644 --- a/src/com/redstoner/modules/chat/Chat.cmd +++ b/src/main/java/com/redstoner/modules/chat/Chat.cmd @@ -1,12 +1,12 @@ command me { - perm utils.me; + perm utils.chat.me; [string:text...] { help /me's in chat.; run me text; } } command action { - perm utils.action; + perm utils.chat.action; [string:text...] { help /action's in chat.; run action text; @@ -14,34 +14,41 @@ command action { } command chat { alias speak; + perm utils.chat; [string:message...] { - perm utils.chat; run chat message; help A way to speak in normal chat with normal formatting if you have ACT or CGT on.; } } +command chatn { + alias speakn; + perm utils.chat.chatn; + [string:name] [string:message...] { + run chatn name message; + help A way to speak in normal chat with normal formatting for console users.; + } +} command shrug { + perm utils.chat.shrug; [string:message...] { - perm utils.shrug; run shrug message; help Appends the shrug emoticon to the end of your message.; } [empty] { - perm utils.shrug; run shrugnoarg; help Just the shrug emoticon.; } } command say { - [string:message...] { - perm utils.say; + perm utils.chat.say; + [string:message...] { run say message; help A replacement for the default say command to make the format be more consistant.; } } command sayn { + perm utils.chat.sayn; [string:name] [string:message...] { - perm utils.sayn; type console; run sayn name message; help A replacement for the default say command to make the format be more consistant.; @@ -49,25 +56,35 @@ command sayn { } command mute { + perm utils.chat.mute; [string:player] { - perm utils.chat.admin; run mute player; help Mutes a player.; } } command print { + perm utils.chat.print; [string:message...] { - perm utils.print; run print message; help A way to just print something in to chat with all the formatting things a user has.; } } command unmute { + perm utils.chat.mute; [string:player] { - perm utils.chat.admin; run unmute player; help Unmutes a player.; } } + +command chatonly { + alias co; + perm utilschat.chatonly; + [empty] { + run chatonly; + help Shows that you're onlu able to chat, nothing else.; + type player; + } +}
\ No newline at end of file diff --git a/src/com/redstoner/modules/chat/Chat.java b/src/main/java/com/redstoner/modules/chat/Chat.java index 3c95609..ebe2d07 100644 --- a/src/com/redstoner/modules/chat/Chat.java +++ b/src/main/java/com/redstoner/modules/chat/Chat.java @@ -1,7 +1,10 @@ package com.redstoner.modules.chat; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; +import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; @@ -11,6 +14,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerQuitEvent; import com.nemez.cmdmgr.Command; import com.redstoner.annotations.AutoRegisterListener; @@ -25,184 +29,211 @@ import com.redstoner.modules.datamanager.DataManager; import com.redstoner.modules.ignore.Ignore; import net.nemez.chatapi.ChatAPI; +import net.nemez.chatapi.click.Message; @Commands(CommandHolderType.File) @AutoRegisterListener -@Version(major = 4, minor = 1, revision = 0, compatible = 4) -public class Chat implements Module, Listener -{ +@Version(major = 5, minor = 0, revision = 0, compatible = 4) +public class Chat implements Module, Listener { private final Map<String, String> defaults = new HashMap<>(); - - public Chat() - { - defaults.put("chat", " %n ยง7โยงr %m"); - defaults.put("me", " ยง7- %n ยง7โฆ %m"); - defaults.put("action", " ยง7- %n ยง7โฆ %m"); - defaults.put("say", " ยง7[ยง9%nยง7]:ยงr %m"); - defaults.put("shrug", " %n ยง7โยงr %m ยฏ\\_(ใ)_/ยฏ"); + private Set<UUID> chatonly = new HashSet<>(); + + public Chat() { + defaults.put("chat", " %n %cยง7โยงr %m"); + defaults.put("me", " ยง7- %n %cยง7โฆ %m"); + defaults.put("action", " ยง7- %n %cยง7โฆ %m"); + defaults.put("say", " ยง7[ยง9%nยง7]%cยง7:ยงr %m"); + defaults.put("shrug", " %n %cยง7โยงr %m ยฏ\\_(ใ)_/ยฏ"); defaults.put("print", "%m"); + defaults.put("%c", "ยงc*"); + defaults.put("%c-hover", "ยงcChat Only"); } - + @Override - public void firstLoad() - { - Module.super.firstLoad(); + public void firstLoad() { DataManager.setConfig("chat", defaults.get("chat")); DataManager.setConfig("me", defaults.get("me")); DataManager.setConfig("action", defaults.get("action")); DataManager.setConfig("say", defaults.get("say")); DataManager.setConfig("shrug", defaults.get("shrug")); DataManager.setConfig("print", defaults.get("print")); + DataManager.setConfig("%c", defaults.get("%c")); + DataManager.setConfig("%c-hover", defaults.get("%c-hover")); } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerChat(AsyncPlayerChatEvent event) - { - if (event.isCancelled()) - return; + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onPlayerChat(AsyncPlayerChatEvent event) { Player player = event.getPlayer(); String message = event.getMessage(); + event.setCancelled(true); broadcastFormatted("chat", player, message, event); } - + + @EventHandler + public void onLeave(PlayerQuitEvent event) { + chatonly.remove(event.getPlayer().getUniqueId()); + } + @Command(hook = "me") - public boolean me(CommandSender sender, String message) - { + public boolean me(CommandSender sender, String message) { broadcastFormatted("me", sender, message); return true; } - + @Command(hook = "chat") - public boolean chat(CommandSender sender, String message) - { + public boolean chat(CommandSender sender, String message) { broadcastFormatted("chat", sender, message); return true; } - + + @Command(hook = "chatn") + public boolean chatn(CommandSender sender, String name, String message) { + broadcastFormatted("chat", sender, message, name); + return true; + } + @Command(hook = "action") - public boolean action(CommandSender sender, String message) - { + public boolean action(CommandSender sender, String message) { broadcastFormatted("action", sender, message); return true; } - + @Command(hook = "say") - public boolean say(CommandSender sender, String message) - { + public boolean say(CommandSender sender, String message) { String name; - if (sender instanceof Player) - name = ((Player) sender).getName(); - else - name = "ยง9CONSOLE"; + + if (sender instanceof Player) name = ((Player) sender).getName(); + else name = "ยง9CONSOLE"; + broadcastFormatted("say", sender, message, name); return true; } - + @Command(hook = "sayn") - public boolean say(CommandSender sender, String name, String message) - { + public boolean say(CommandSender sender, String name, String message) { broadcastFormatted("say", sender, message, name); return true; } - + @Command(hook = "shrug") - public boolean shrug(CommandSender sender, String message) - { + public boolean shrug(CommandSender sender, String message) { broadcastFormatted("shrug", sender, message); return true; } - + @Command(hook = "shrugnoarg") - public boolean shrug(CommandSender sender) - { + public boolean shrug(CommandSender sender) { broadcastFormatted("shrug", sender, ""); return true; } - + @Command(hook = "print") - public boolean print(CommandSender sender, String message) - { + public boolean print(CommandSender sender, String message) { broadcastFormatted("print", sender, message); return true; } - + @Command(hook = "mute") - public boolean mute(CommandSender sender, String player) - { + public boolean mute(CommandSender sender, String player) { Player p = Bukkit.getPlayer(player); - if (p == null) - { + + if (p == null) { getLogger().message(sender, true, "That player couldn't be found!"); return true; } + DataManager.setData(p, "muted", true); + getLogger().message(sender, "Muted player &e" + Utils.getName(p) + "&7!"); getLogger().message(p, "You have been &cmuted&7!"); + return true; } - + @Command(hook = "unmute") - public boolean unmute(CommandSender sender, String player) - { + public boolean unmute(CommandSender sender, String player) { Player p = Bukkit.getPlayer(player); - if (p == null) - { + + if (p == null) { getLogger().message(sender, true, "That player couldn't be found!"); return true; } + DataManager.setData(p, "muted", false); + getLogger().message(sender, "Unmuted player &e" + Utils.getName(p) + "&7!"); getLogger().message(p, "You have been &aunmuted&7!"); + return true; } - - public boolean broadcastFormatted(String format, CommandSender sender, String message) - { + + @Command(hook = "chatonly") + public void chatonly(CommandSender sender) { + UUID uuid = ((Player) sender).getUniqueId(); + + if (chatonly.contains(uuid)) { + chatonly.remove(uuid); + getLogger().message(sender, "You are no longer tagged with being only able to chat."); + } else { + chatonly.add(uuid); + getLogger().message(sender, "You are now tagged with being only able to chat."); + } + } + + public boolean broadcastFormatted(String format, CommandSender sender, String message) { return broadcastFormatted(format, sender, message, Utils.getName(sender), null); } - - public boolean broadcastFormatted(String format, CommandSender sender, String message, String name) - { + + public boolean broadcastFormatted(String format, CommandSender sender, String message, String name) { return broadcastFormatted(format, sender, message, name, null); } - - public boolean broadcastFormatted(String format, CommandSender sender, String message, AsyncPlayerChatEvent event) - { + + public boolean broadcastFormatted(String format, CommandSender sender, String message, AsyncPlayerChatEvent event) { return broadcastFormatted(format, sender, message, Utils.getName(sender), event); } - - public boolean broadcastFormatted(String format, CommandSender sender, String message, String name, - AsyncPlayerChatEvent event) - { - if ((boolean) DataManager.getOrDefault(sender, "muted", false)) - { + + public boolean broadcastFormatted(String format, CommandSender sender, String message, String name, AsyncPlayerChatEvent event) { + boolean isChatOnly = sender instanceof Player && chatonly.contains(((Player) sender).getUniqueId()); + + if ((boolean) DataManager.getOrDefault(sender, "muted", false)) { getLogger().message(sender, true, "You have been muted!"); - getLogger().info(" &7User &e" + Utils.getName(sender) + " &7tried to &e" + format + " &7(&e" + message - + "&7) while being &cmuted&7."); + getLogger().info(" &7User &e" + Utils.getName(sender) + " &7tried to &e" + format + " &7(&e" + message + "&7) while being &cmuted&7."); return false; } + String raw = (String) DataManager.getConfigOrDefault(format, defaults.get(format)); String formatted = raw.replace("%n", name).replace("%m", message); - Utils.broadcast("", ChatAPI.colorify(sender, formatted), - wrap(ModuleLoader.exists("Ignore") ? Ignore.getIgnoredBy(sender) : null, event)); + BroadcastFilter filter = wrap(ModuleLoader.exists("Ignore") ? Ignore.getIgnoredBy(sender) : null, event); + + if (isChatOnly) { + + String part1 = formatted.substring(0, formatted.indexOf("%c")); + String part2 = formatted.substring(formatted.indexOf("%c") + 2); + String indicatior = (String) DataManager.getConfigOrDefault("%c", defaults.get("%c")); + String indicatiorHover = (String) DataManager.getConfigOrDefault("%c-hover", defaults.get("%c-hover")); + + Message msg = ChatAPI.createMessage(null) + .appendText(part1) + .appendTextHover(indicatior, indicatiorHover) + .appendText(part2); + Utils.broadcast("", msg, filter); + return true; + } + + Utils.broadcast("", ChatAPI.colorify(sender, formatted.replace("%c", "")), filter); + return true; } - - public BroadcastFilter wrap(BroadcastFilter filter, AsyncPlayerChatEvent event) - { - if (event == null) - return filter; - else - return new BroadcastFilter() - { - @Override - public boolean sendTo(CommandSender recipient) - { - if (recipient instanceof ConsoleCommandSender) - return true; - return filter.sendTo(recipient) && event.getRecipients().contains(recipient); - } - }; + + public BroadcastFilter wrap(BroadcastFilter filter, AsyncPlayerChatEvent event) { + if (event == null) return filter; + else return new BroadcastFilter() { + @Override + public boolean sendTo(CommandSender recipient) { + if (recipient instanceof ConsoleCommandSender || filter == null) return true; + return filter.sendTo(recipient) && event.getRecipients().contains(recipient); + } + }; } } diff --git a/src/main/java/com/redstoner/modules/chat/module.info b/src/main/java/com/redstoner/modules/chat/module.info new file mode 100644 index 0000000..a2ace0e --- /dev/null +++ b/src/main/java/com/redstoner/modules/chat/module.info @@ -0,0 +1,3 @@ +displayName: Chat +category: Chat +description: Stylizes chat and adds a bunch of chat commands, including &e/me&7 and &e/shrug
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/chatalias/Chatalias.cmd b/src/main/java/com/redstoner/modules/chatalias/Chatalias.cmd new file mode 100644 index 0000000..b84f54c --- /dev/null +++ b/src/main/java/com/redstoner/modules/chatalias/Chatalias.cmd @@ -0,0 +1,16 @@ +command alias { + add [flag:-r] [flag:-rnd] [string:keyword] [string:replacement...] { + help Adds a new alias. Set -r to make it a regex-alias. \nSet -rnd to make it a random alias and use `&e || &b` (with the spaces) to separate the results.; + run addalias -r -rnd keyword replacement; + } + del [flag:-r] [flag:-rnd] [string:keyword] { + help Deletes an alias. -r indicates if it was a regex-alias and -rnd indicates if it was a random-alias. ; + run delalias -r -rnd keyword; + } + list { + help Lists your aliases.; + run listaliases; + } + perm utils.alias; + type player; +}
\ No newline at end of file diff --git a/src/com/redstoner/modules/chatalias/Chatalias.java b/src/main/java/com/redstoner/modules/chatalias/Chatalias.java index eb13b4d..df7e8e1 100644 --- a/src/com/redstoner/modules/chatalias/Chatalias.java +++ b/src/main/java/com/redstoner/modules/chatalias/Chatalias.java @@ -1,9 +1,9 @@ package com.redstoner.modules.chatalias; import java.io.File; -import java.util.ArrayList; import java.util.Set; import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; import java.util.regex.Pattern; import org.bukkit.Bukkit; @@ -32,286 +32,304 @@ import net.nemez.chatapi.ChatAPI; @Commands(CommandHolderType.File) @AutoRegisterListener -@Version(major = 4, minor = 1, revision = 0, compatible = 4) -public class Chatalias implements Module, Listener -{ - private final String[] commands = new String[] {"e?r", "e?m .+?", "e?t", "e?w", "e?msg .+?", "e?message .+?", - "e?whisper .+?", "e?me", "cgsay", "ac", "bc", "say", "sayn .+?", "chat", "shrug", "action"}; +@Version(major = 5, minor = 0, revision = 0, compatible = 4) +public class Chatalias implements Module, Listener { + private final String[] commands = new String[] { "e?r", "e?m .+?", "e?t", "e?w", "e?msg .+?", "e?message .+?", "e?whisper .+?", "e?me", "cgsay", "ac", "bc", + "say", "sayn .+?", "chat", "shrug", "action", "speak", "chatn", "speakn" }; private JSONObject aliases = new JSONObject(); - + @Override - public boolean onEnable() - { - for (Player p : Bukkit.getOnlinePlayers()) - { + public boolean onEnable() { + for (Player p : Bukkit.getOnlinePlayers()) { loadAliases(p.getUniqueId()); } + return true; } - + @Override - public void onDisable() - { - for (Object key : aliases.keySet()) - { + public void onDisable() { + for (Object key : aliases.keySet()) { UUID uuid = UUID.fromString((String) key); saveAliases(uuid); } } - + @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) - { + public void onPlayerJoin(PlayerJoinEvent event) { loadAliases(event.getPlayer().getUniqueId()); } - + @EventHandler - public void onPlayerLeave(PlayerQuitEvent event) - { + public void onPlayerLeave(PlayerQuitEvent event) { aliases.remove(event.getPlayer().getUniqueId().toString()); } - + @SuppressWarnings("unchecked") @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerChat(AsyncPlayerChatEvent event) - { + public void onPlayerChat(AsyncPlayerChatEvent event) { Player player = event.getPlayer(); UUID uuid = player.getUniqueId(); - if (!aliases.containsKey(uuid.toString())) - { + + if (!aliases.containsKey(uuid.toString())) { loadAliases(player.getUniqueId()); - if (!aliases.containsKey(uuid.toString())) - return; + + if (!aliases.containsKey(uuid.toString())) return; } + JSONObject playerAliases = (JSONObject) aliases.get(uuid.toString()); boolean changed = false; - for (Object key : playerAliases.keySet()) - { + + for (Object key : playerAliases.keySet()) { String keyword = (String) key; String replacement = (String) playerAliases.get(key); - if (keyword.startsWith("R: ")) - { + + if (keyword.startsWith("RND;")) { + keyword = keyword.replace("RND;", ""); + String[] results = replacement.split(" \\|\\| "); + + for (String str : results) { + System.out.println(str); + } + + int rand = ThreadLocalRandom.current().nextInt(0, results.length); + + replacement = results[rand]; + } + + if (keyword.startsWith("R: ")) { keyword = keyword.replace("R: ", ""); event.setMessage(event.getMessage().replaceAll(keyword, replacement)); - } - else - { - if (keyword.startsWith("N: ")) - keyword = keyword.replace("N: ", ""); - else - { + } else { + if (keyword.startsWith("N: ")) keyword = keyword.replace("N: ", ""); + else { changed = true; playerAliases.put("N: " + key, replacement); } + event.setMessage(event.getMessage().replace(keyword, replacement)); } + int maxLength; - try - { + + try { maxLength = Integer.valueOf(getPermissionContent(player, "utils.alias.length.")); - } - catch (NumberFormatException e) - { + } catch (NumberFormatException e) { maxLength = 255; } - if (event.getMessage().length() > maxLength) - { + + if (event.getMessage().length() > maxLength) { getLogger().message(player, true, "The generated message is too long!"); event.setCancelled(true); return; } } + event.setMessage(ChatAPI.colorify(event.getPlayer(), event.getMessage())); - if (changed) - saveAliases(uuid); + + if (changed) saveAliases(uuid); } - + @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerCommand(PlayerCommandPreprocessEvent event) - { - if (event.isCancelled()) - return; + public void onPlayerCommand(PlayerCommandPreprocessEvent event) { + if (event.isCancelled()) return; + boolean listening = false; String command = ""; - for (String s : commands) - { + + for (String s : commands) { command = "^\\/(.*:)?" + s + " "; - if (event.getMessage().matches(command + ".*")) - { + + if (event.getMessage().matches(command + ".*")) { listening = true; break; } } - if (!listening) - return; + + if (!listening) return; + Player player = event.getPlayer(); UUID uuid = player.getUniqueId(); JSONObject playerAliases = (JSONObject) aliases.get(uuid.toString()); String temp = event.getMessage().replaceAll(command, ""); + command = event.getMessage().replaceAll(Pattern.quote(temp) + "$", ""); event.setMessage(event.getMessage().replaceFirst(Pattern.quote(command), "")); - for (Object key : playerAliases.keySet()) - { + + for (Object key : playerAliases.keySet()) { String keyword = (String) key; String replacement = (String) playerAliases.get(key); - if (keyword.startsWith("R: ")) - { + + if (keyword.startsWith("RND;")) { + keyword = keyword.replace("RND;", ""); + String[] results = replacement.split(" \\|\\| "); + + int rand = ThreadLocalRandom.current().nextInt(0, results.length); + + replacement = results[rand]; + } + + if (keyword.startsWith("R: ")) { keyword = keyword.replace("R: ", ""); event.setMessage(event.getMessage().replaceAll(keyword, replacement)); - } - else - { - if (keyword.startsWith("N: ")) - keyword = keyword.replace("N: ", ""); + } else { + if (keyword.startsWith("N: ")) keyword = keyword.replace("N: ", ""); event.setMessage(event.getMessage().replace(keyword, replacement)); } + int maxLength; - try - { + + try { maxLength = Integer.valueOf(getPermissionContent(player, "utils.alias.length.")); - } - catch (NumberFormatException e) - { + } catch (NumberFormatException e) { maxLength = 255; } - if (event.getMessage().length() > maxLength) - { + + if (event.getMessage().length() > maxLength) { getLogger().message(player, true, "The generated message is too long!"); event.setCancelled(true); + return; } } + event.setMessage(command + event.getMessage()); } - + @SuppressWarnings("unchecked") @Command(hook = "addalias") - public boolean addAlias(CommandSender sender, boolean regex, String keyword, String replacement) - { - if (regex && keyword.equals(".*")) - { + public boolean addAlias(CommandSender sender, boolean regex, boolean random, String keyword, String replacement) { + if (regex && keyword.equals(".*")) { getLogger().message(sender, true, "You may not define the wildcard regex as an alias."); return true; } + Player player = (Player) sender; UUID uuid = player.getUniqueId(); JSONObject data = (JSONObject) aliases.get(uuid.toString()); - keyword = (regex ? "R: " : "N: ") + keyword; - if (!data.containsKey(keyword)) - { + keyword = (random ? "RND;" : "") + (regex ? "R: " : "N: ") + keyword; + + if (!data.containsKey(keyword)) { int maxAmount; - try - { + + try { maxAmount = Integer.valueOf(getPermissionContent(player, "utils.alias.amount.")); - } - catch (NumberFormatException e) - { + } catch (NumberFormatException e) { maxAmount = 25; } - if (data.size() == maxAmount) - { + + if (data.size() == maxAmount) { getLogger().message(sender, true, "You already reached your maximum of aliases!"); return true; } } + data.put(keyword, replacement); - if (sender.hasPermission("essentials.chat.color")) - getLogger().message(sender, - "Successfully created alias " + keyword.substring(3) + " ยง7-> " + replacement + " ยง7for you."); - else - getLogger().message(sender, - "Successfully created alias " + keyword.substring(3) + " ยง7-> " + replacement + " ยง7for you."); + + if (sender.hasPermission("essentials.chat.color")) { + getLogger().message(sender, "Successfully created alias " + keyword.substring(random ? 7 : 3) + " ยง7-> " + replacement + " ยง7for you."); + } else { + getLogger().message(sender, "Successfully created alias " + keyword.substring(random ? 7 : 3) + " ยง7-> " + replacement + " ยง7for you."); + } + saveAliases(uuid); return true; } - + @Command(hook = "delalias") - public boolean delAlias(CommandSender sender, boolean regex, String keyword) - { + public boolean delAlias(CommandSender sender, boolean regex, boolean random, String keyword) { Player player = (Player) sender; UUID uuid = player.getUniqueId(); JSONObject data = (JSONObject) aliases.get(uuid.toString()); - keyword = (regex ? "R: " : "N: ") + keyword; - if (data.remove(keyword) != null) - { + + keyword = (random ? "RND;" : "") + (regex ? "R: " : "N: ") + keyword; + + if (data.remove(keyword) != null) { getLogger().message(sender, "Successfully removed the alias!"); saveAliases(uuid); + return true; - } - else - { - getLogger().message(sender, true, "That alias doesn't exist! Hint: regex/no regex does matter for this."); + } else { + getLogger().message(sender, true, "That alias doesn't exist! Hint: regex/no regex and random/not random does matter for this."); return true; } } - + @Command(hook = "listaliases") - public boolean listAliases(CommandSender sender) - { - ArrayList<String> message = new ArrayList<>(); + public boolean listAliases(CommandSender sender) { + ChatAPI.createMessage(sender).appendText(getLogger().getHeader()).send(); + Player player = (Player) sender; UUID uuid = player.getUniqueId(); JSONObject data = (JSONObject) aliases.get(uuid.toString()); - for (Object key : data.keySet()) - message.add((String) key + " ยง7-> " + data.get(key)); - getLogger().message(sender, message.toArray(new String[] {})); + + for (Object key : data.keySet()) { + String d_key = (String) key; + d_key = d_key.replace("RND;N:", "RND:").replace("RND;R:", "R-RND:"); + + ChatAPI.createMessage(sender).appendText(d_key + " ยง7-> " + data.get(key)).send(); + } + return true; } - - private String getPermissionContent(Player player, String permnode) - { + + private String getPermissionContent(Player player, String permnode) { Set<PermissionAttachmentInfo> perms = player.getEffectivePermissions(); - for (PermissionAttachmentInfo perm : perms) - if (perm.getPermission().toString().startsWith(permnode)) - return perm.getPermission().replace(permnode, ""); + + for (PermissionAttachmentInfo perm : perms) if (perm.getPermission().toString().startsWith(permnode)) return perm.getPermission().replace(permnode, ""); return null; } - + @SuppressWarnings("unchecked") - private void loadAliases(UUID uuid) - { + private void loadAliases(UUID uuid) { JSONObject defaults = new JSONObject(); - defaults.put("dataFormat", "v1"); + defaults.put("dataFormat", "v2"); + JSONObject data = new JSONObject(); data.put("N: ./", "/"); + defaults.put("data", data); - JSONObject playerAliases = JsonManager - .getObject(new File(Main.plugin.getDataFolder(), "aliases/" + uuid.toString() + ".json")); - if (playerAliases == null) - { + + JSONObject playerAliases = JsonManager.getObject(new File(Main.plugin.getDataFolder(), "aliases/" + uuid.toString() + ".json")); + + if (playerAliases == null) { playerAliases = defaults; } + String dataFormat = (String) playerAliases.get("dataFormat"); - if (dataFormat == null) - { + + if (dataFormat == null) { JSONObject temp = new JSONObject(); - temp.put("dataFormat", "v1"); + temp.put("dataFormat", "v2"); + JSONObject tempAliases = new JSONObject(); - { - for (Object key : playerAliases.keySet()) - { - tempAliases.put("N: " + key, playerAliases.get(key)); - } + + for (Object key : playerAliases.keySet()) { + tempAliases.put("N: " + key, playerAliases.get(key)); } + temp.put("data", tempAliases); aliases.put(uuid.toString(), temp.get("data")); - } - else if (dataFormat.equals("v1")) + + } else if (dataFormat.equals("v2")) { + aliases.put(uuid.toString(), playerAliases.get("data")); + } else if (dataFormat.equals("v1")) { aliases.put(uuid.toString(), playerAliases.get("data")); - else - { + saveAliases(uuid); + } else { getLogger().error("Unknown data format for alias set of player " + uuid.toString()); aliases.put(uuid.toString(), ((JSONObject) defaults.get("data")).clone()); saveAliases(uuid); } } - + @SuppressWarnings("unchecked") - private void saveAliases(UUID uuid) - { + private void saveAliases(UUID uuid) { JSONObject temp = new JSONObject(); - temp.put("dataFormat", "v1"); + + temp.put("dataFormat", "v2"); temp.put("data", aliases.get(uuid.toString())); + JsonManager.save(temp, new File(Main.plugin.getDataFolder(), "aliases/" + uuid.toString() + ".json")); } } diff --git a/src/main/java/com/redstoner/modules/chatalias/module.info b/src/main/java/com/redstoner/modules/chatalias/module.info new file mode 100644 index 0000000..caa70a1 --- /dev/null +++ b/src/main/java/com/redstoner/modules/chatalias/module.info @@ -0,0 +1,3 @@ +displayName: ChatAlias +category: Chat +description: Allows players to create aliases. For example wb -> Welcome Back
\ No newline at end of file diff --git a/src/com/redstoner/modules/chatgroups/Chatgroups.cmd b/src/main/java/com/redstoner/modules/chatgroups/Chatgroups.cmd index 33fd0c5..8aabdee 100644 --- a/src/com/redstoner/modules/chatgroups/Chatgroups.cmd +++ b/src/main/java/com/redstoner/modules/chatgroups/Chatgroups.cmd @@ -1,4 +1,5 @@ command cgt { + perm utils.chatgroups; [empty] { help Toggles your cgtoggle status.; type player; @@ -6,6 +7,7 @@ command cgt { } } command cgkey { + perm utils.chatgroups; [string:key] { help Sets your chatgroup key.; run setcgkey key; @@ -13,12 +15,14 @@ command cgkey { } } command cgsay { + perm utils.chatgroups; [string:message...] { help Chats in your chatgroup.; run cgsay message; } } command cg { + perm utils.chatgroups; join [string:group] { help Joins a chatgroup.; run cgjoin group; diff --git a/src/main/java/com/redstoner/modules/chatgroups/Chatgroups.java b/src/main/java/com/redstoner/modules/chatgroups/Chatgroups.java new file mode 100644 index 0000000..6609786 --- /dev/null +++ b/src/main/java/com/redstoner/modules/chatgroups/Chatgroups.java @@ -0,0 +1,363 @@ +package com.redstoner.modules.chatgroups; + +import java.io.File; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.json.simple.JSONObject; + +import com.nemez.cmdmgr.Command; +import com.redstoner.annotations.AutoRegisterListener; +import com.redstoner.annotations.Commands; +import com.redstoner.annotations.Version; +import com.redstoner.coremods.moduleLoader.ModuleLoader; +import com.redstoner.misc.BroadcastFilter; +import com.redstoner.misc.CommandHolderType; +import com.redstoner.misc.JsonManager; +import com.redstoner.misc.Main; +import com.redstoner.misc.Utils; +import com.redstoner.modules.Module; +import com.redstoner.modules.ignore.Ignore; +import com.redstoner.modules.socialspy.Socialspy; + +import net.nemez.chatapi.ChatAPI; + +/** + * The ChatGroups module. Allows people to have private sub-chats that can be + * accessed via a single char prefix or a toggle. + * + * @author Pepich + */ +@Commands(CommandHolderType.File) +@AutoRegisterListener +@Version(major = 5, minor = 0, revision = 0, compatible = 4) +public class Chatgroups implements Module, Listener { + private static final char defaultKey = ':'; + private static final File groupsLocation = new File(Main.plugin.getDataFolder(), "chatgroups.json"); + private static final File keysLocation = new File(Main.plugin.getDataFolder(), "chatgroup_keys.json"); + private ArrayList<UUID> cgtoggled; + private static JSONObject groups, keys; + + @Override + public boolean onEnable() { + groups = JsonManager.getObject(groupsLocation); + if (groups == null) { + groups = new JSONObject(); + saveGroups(); + } + keys = JsonManager.getObject(keysLocation); + if (keys == null) { + keys = new JSONObject(); + saveKeys(); + } + cgtoggled = new ArrayList<>(); + return true; + } + + @Override + public void onDisable() { + saveKeys(); + saveGroups(); + } + + /** + * Prints chatgroup info (like players in the group, groupname) to the sender. + * + * @param sender the issuer of the command. + * @return true. + */ + @SuppressWarnings("unchecked") + @Command(hook = "cginfo") + public boolean cgInfo(CommandSender sender) { + String group = getGroup(sender); + if (group == null) getLogger().message(sender, true, "You are not in a chatgroup!"); + else { + ArrayList<String> message = new ArrayList<>(); + message.add("ยง7Your current chatgroup is: ยง6" + group); + ArrayList<String> players = new ArrayList<>(); + Iterator<String> iter = groups.keySet().iterator(); + while (iter.hasNext()) { + String id = iter.next(); + if (((String) groups.get(id)).equals(group)) { + if (!id.equals("CONSOLE")) { + UUID uuid = UUID.fromString(id); + Player p = Bukkit.getPlayer(uuid); + if (p != null) players.add(p.getDisplayName()); + else players.add(Bukkit.getOfflinePlayer(UUID.fromString(id)).getName()); + } else players.add(id); + } + } + StringBuilder sb = new StringBuilder("&6Other players in this group: &9"); + for (String player : players) { + sb.append(player); + sb.append("&7, &9"); + } + sb.delete(sb.length() - 2, sb.length()); + message.add(sb.toString()); + getLogger().message(sender, message.toArray(new String[] {})); + } + return true; + } + + /** + * Prints a Players cgkey to their chat. + * + * @param sender the issuer of the command. + */ + public void getCgKey(CommandSender sender) { + getLogger().message(sender, "Your current cgkey is ยง6" + getKey((Player) sender)); + } + + /** + * Sets the cgkey of a Player. + * + * @param sender the issuer of the command. + * @param key the key to be set. Set to NULL or "" to get your current key. + * @return true. + */ + @SuppressWarnings("unchecked") + @Command(hook = "setcgkey") + public boolean setCgKey(CommandSender sender, String key) { + if (key.length() > 1) { + getLogger().message(sender, true, "Could not set your key to ยง6" + key + " ยง7, it can be at most one char."); + return true; + } + if (key == null || key.length() == 0) { + getCgKey(sender); + return true; + } + getLogger().message(sender, "Set your key to ยง6" + key); + keys.put(((Player) sender).getUniqueId().toString(), key + ""); + saveKeys(); + return true; + } + + /** + * Lets a Player toggle their auto-cg status to allow for automatically sending + * chat messages to their chatgroup. + * + * @param sender the issuer of the command. + * @return true. + */ + @Command(hook = "cgtoggle") + public boolean cgToggleCommand(CommandSender sender) { + if (getGroup(sender) != null) if (cgtoggled.contains(((Player) sender).getUniqueId())) { + cgtoggled.remove(((Player) sender).getUniqueId()); + getLogger().message(sender, "CGT now ยงcdisabled"); + } else { + cgtoggled.add(((Player) sender).getUniqueId()); + getLogger().message(sender, "CGT now ยงaenabled"); + } + else getLogger().message(sender, true, "You are not in a chatgroup!"); + return true; + } + + /** + * Lets a CommandSender leave their group. + * + * @param sender the command issuer. + * @return true. + */ + @Command(hook = "cgleave") + public boolean cgLeave(CommandSender sender) { + String group = removeGroup(sender); + if (group == null) { + getLogger().message(sender, true, "You were not in a chatgroup!"); + return true; + } + String name = Utils.getName(sender); + sendToGroup(group, "&9" + name + " &7left the group!"); + getLogger().message(sender, "Successfully removed you from your group!"); + if (sender instanceof Player) cgtoggled.remove(((Player) sender).getUniqueId()); + return true; + } + + /** + * Lets a CommandSender join a group. + * + * @param sender the command issuer. + * @param name the name of the group. + * @return true. + */ + @Command(hook = "cgjoin") + public boolean cgJoin(CommandSender sender, String name) { + String pname = Utils.getName(sender); + String group = getGroup(sender); + if (group != null && group.equals(name)) getLogger().message(sender, true, "You were already in group ยง6" + name); + else { + setGroup(sender, null); + if (group != null) sendToGroup(group, "&9" + pname + " &7left the group!"); + sendToGroup(name, "&9" + pname + " &7joined the group!"); + setGroup(sender, name); + getLogger().message(sender, "Successfully joined group ยง6" + name); + } + return true; + } + + /** + * Sends a message to a group. + * + * @param sender the sender of the message - the message will be sent to the + * group of the sender. + * @param message the message to be sent. + * @return true. + */ + @Command(hook = "cgsay") + public boolean cgSay(CommandSender sender, String message) { + String group = getGroup(sender); + if (group != null) sendToGroup(sender, message); + else getLogger().message(sender, true, "You are not in a chatgroup right now!"); + return true; + } + + /** + * Deals with chat events to allow for cgkeys and cgtoggle. + * + * @param event the chat event containing the player and the message. + */ + @EventHandler + public void onPlayerChat(AsyncPlayerChatEvent event) { + String group = getGroup(event.getPlayer()); + Player player = event.getPlayer(); + if (group != null) { + if (event.getMessage().startsWith(getKey(player))) { + event.setCancelled(true); + sendToGroup(event.getPlayer(), event.getMessage().substring(1)); + } else if (cgtoggled.contains(event.getPlayer().getUniqueId())) { + event.setCancelled(true); + sendToGroup(event.getPlayer(), event.getMessage()); + } + } + } + + /** + * Finds the group of a CommandSender. + * + * @param target the CommandSender to get the group of. + * @return the group of the target or NULL if he doesn't have one. + */ + public static String getGroup(CommandSender target) { + if (target instanceof Player) return (String) groups.get(((Player) target).getUniqueId().toString()); + else return (String) groups.get("CONSOLE"); + } + + /** + * Sets the group of the CommandSender. + * + * @param target the CommandSender to set the group of. + * @param group the name of the group to join. + */ + @SuppressWarnings("unchecked") + private void setGroup(CommandSender target, String group) { + if (target instanceof Player) groups.put(((Player) target).getUniqueId().toString(), group); + else groups.put("CONSOLE", group); + saveGroups(); + } + + /** + * Removes a CommandSender from their chatgroup. Will also save the groups after + * finishing + * + * @param target the CommandSender to get their group removed. + */ + private String removeGroup(CommandSender target) { + String group; + if (target instanceof Player) group = (String) groups.remove(((Player) target).getUniqueId().toString()); + else group = (String) groups.remove("CONSOLE"); + saveGroups(); + return group; + } + + /** + * This method will find the ChatgGroup key of any player. + * + * @param player the player to get the key from. + * @return the key. + */ + public static String getKey(Player player) { + String key = (String) keys.get(player.getUniqueId().toString()); + return (key == null ? "" + defaultKey : key); + } + + /** + * This method sends a message to a chatgroup. + * + * @param sender the sender of the message. Also defines which group the + * message will be sent to. + * @param message the message to be sent. + */ + private void sendToGroup(CommandSender sender, String message) { + String name = Utils.getName(sender); + String group = getGroup(sender); + message = ChatAPI.colorify(null, message); + + BroadcastFilter ignore = ModuleLoader.exists("Ignore") ? Ignore.getIgnoredBy(sender) : null; + Utils.broadcast("ยง8[ยงbCGยง8] ยง9", name + "ยง8: ยง6" + message, new BroadcastFilter() { + @Override + public boolean sendTo(CommandSender recipient) { + + String rgroup = getGroup(recipient); + if (rgroup != null && (ignore == null ? true : ignore.sendTo(recipient))) return rgroup.equals(group); + else return false; + } + }); + if (ModuleLoader.getModule("Socialspy") != null) { + Socialspy.spyBroadcast(sender, "ยงe" + group + " ยงa(cg)", message, "/cg", new BroadcastFilter() { + @Override + public boolean sendTo(CommandSender recipient) { + return getGroup(recipient) == null || !getGroup(recipient).equals(group); + } + }); + } + if (getGroup(Bukkit.getConsoleSender()) == null || !getGroup(Bukkit.getConsoleSender()).equals(group)) { + getLogger().info(name + " in " + group + ": " + message + " ยง8(hidden)"); + } + } + + /** + * This method sends a message to a chatgroup. + * + * @param sender the sender of the message. Also defines which group the + * message will be sent to. + * @param message the message to be sent. + */ + private void sendToGroup(String group, String message) { + message = ChatAPI.colorify(null, message); + Utils.broadcast(null, message, new BroadcastFilter() { + @Override + public boolean sendTo(CommandSender recipient) { + String rgroup = getGroup(recipient); + if (rgroup != null) return rgroup.equals(group); + else return false; + } + }); + if (ModuleLoader.getModule("Socialspy") != null) { + Socialspy.spyBroadcast(Bukkit.getConsoleSender(), "ยงe" + group + " ยงa(cg)", message, "/cg", new BroadcastFilter() { + @Override + public boolean sendTo(CommandSender recipient) { + return getGroup(recipient) == null || !getGroup(recipient).equals(group); + } + }); + } + if (getGroup(Bukkit.getConsoleSender()) == null || !getGroup(Bukkit.getConsoleSender()).equals(group)) { + getLogger().info("In " + group + ": " + message + " ยง8(hidden)"); + } + } + + /** Saves the groups. */ + private void saveGroups() { + JsonManager.save(groups, groupsLocation); + } + + /** Saves the keys. */ + private void saveKeys() { + JsonManager.save(keys, keysLocation); + } +} diff --git a/src/main/java/com/redstoner/modules/chatgroups/module.info b/src/main/java/com/redstoner/modules/chatgroups/module.info new file mode 100644 index 0000000..553654c --- /dev/null +++ b/src/main/java/com/redstoner/modules/chatgroups/module.info @@ -0,0 +1,3 @@ +displayName: ChatGroups +category: Chat +description: Adds a secondary chat for people who speak a different language or working on projects together
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/check/Check.cmd b/src/main/java/com/redstoner/modules/check/Check.cmd new file mode 100644 index 0000000..1fd7d0d --- /dev/null +++ b/src/main/java/com/redstoner/modules/check/Check.cmd @@ -0,0 +1,16 @@ +command check { + perm utils.check; + + [string:player] { + run checkCommand player; + help Get info on a player; + } +} +command ipinfo { + perm utils.check; + + [string:ip] { + run ipinfo ip; + help Get the info about the given IP.; + } +}
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/check/Check.java b/src/main/java/com/redstoner/modules/check/Check.java new file mode 100644 index 0000000..8ebdcc0 --- /dev/null +++ b/src/main/java/com/redstoner/modules/check/Check.java @@ -0,0 +1,320 @@ +package com.redstoner.modules.check; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Scanner; +import java.util.concurrent.ExecutionException; + +import com.redstoner.exceptions.NonSaveableConfigException; +import com.redstoner.misc.mysql.Config; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; +import org.bukkit.event.Listener; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; + +import com.nemez.cmdmgr.Command; +import com.nemez.cmdmgr.Command.AsyncType; +import com.nemez.cmdmgr.CommandManager; +import com.redstoner.annotations.Commands; +import com.redstoner.annotations.Version; +import com.redstoner.coremods.moduleLoader.ModuleLoader; +import com.redstoner.misc.CommandHolderType; +import com.redstoner.misc.Main; +import com.redstoner.misc.mysql.MysqlHandler; +import com.redstoner.misc.mysql.elements.ConstraintOperator; +import com.redstoner.misc.mysql.elements.MysqlConstraint; +import com.redstoner.misc.mysql.elements.MysqlDatabase; +import com.redstoner.misc.mysql.elements.MysqlTable; +import com.redstoner.modules.Module; + +import net.nemez.chatapi.click.Message; + +@Commands(CommandHolderType.File) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) +public class Check implements Module, Listener { + MysqlTable table; + String noTableReason; + + @Override + public boolean onEnable() { + Config config; + + try { + config = Config.getConfig("check.json"); + } catch (IOException | org.json.simple.parser.ParseException e1) { + e1.printStackTrace(); + return false; + } + + if (config == null || !config.containsKey("database") || !config.containsKey("table")) { + getLogger().warn("Could not load the Check config file, ip info for offline users and website data will be unavaliable!"); + noTableReason = "Could not load the config file"; + + config.put("database", "redstoner"); + config.put("table", "users"); + + try { + config.save(); + getLogger().info("A default config file has been created for you."); + } catch (IOException | NonSaveableConfigException e) { + getLogger().error("A default config file was unable to be created."); + } + + return true; + } + + try { + getLogger().info("Attempting to load the database and the table, this might take a few seconds."); + MysqlDatabase database = MysqlHandler.INSTANCE.getDatabase(config.get("database") + "?autoReconnect=true"); + table = database.getTable(config.get("table")); + } catch (Exception e) { + getLogger().warn("Could not use the Check config file, ip info for offline users and website data will be unavaliable!"); + noTableReason = "Could not use the config file"; + } + + return true; + } + + @Override + public void postEnable() { + CommandManager.registerCommand(getCommandString(), this, Main.plugin); + } + + @SuppressWarnings("deprecation") + @Command(hook = "checkCommand", async = AsyncType.ALWAYS) + public void checkCommand(final CommandSender sender, final String player) { + OfflinePlayer oPlayer = Bukkit.getPlayer(player); + if (oPlayer == null) oPlayer = Bukkit.getServer().getOfflinePlayer(player); + + sendData(sender, oPlayer); + + if (ModuleLoader.exists("Tag")) { + try { + Bukkit.getScheduler().callSyncMethod(ModuleLoader.getPlugin(), () -> Bukkit.dispatchCommand(sender, "tag check " + player)).get(); + } catch (ExecutionException | InterruptedException e) { + Message msg = new Message(sender, null); + msg.appendText("&4Running /tag check failed! Please inform a dev about this incident!"); + + e.printStackTrace(); + } + } + } + + @Command(hook = "ipinfo", async = AsyncType.ALWAYS) + public void ipinfo(final CommandSender sender, final String ip) { + String[] info = getIpInfo(ip); + + Message msg = new Message(sender, null); + + if (info == null) { + msg.appendText("\n&6> &cData Unavailable"); + } else { + String region = info[1]; + String asn = info[2]; + String org = info[3]; + + msg.appendText("\n&6> IP: ").appendSuggestHover("&e" + ip, ip, "Click to copy!"); + msg.appendText("\n&6> Region: ").appendSuggestHover("&e" + region, region, "Click to copy!"); + msg.appendText("\n&6> ASN: ").appendSuggestHover("&e" + asn, asn, "Click to copy!"); + msg.appendText("\n&6> Org: ").appendSuggestHover("&e" + org, org, "Click to copy!"); + } + + msg.send(); + } + + public String read(URL url) { + String data = ""; + + try { + Scanner in = new Scanner(new InputStreamReader(url.openStream())); + + while (in.hasNextLine()) { + data += in.nextLine(); + } + + in.close(); + return data; + } catch (IOException e) {} + + return null; + } + + public String[] getIpInfo(OfflinePlayer player) { + String ip = ""; + + if (player.isOnline()) { + ip = player.getPlayer().getAddress().getHostString(); + } else if (table != null) { + try { + ip = (String) table.get("last_ip", new MysqlConstraint("uuid", ConstraintOperator.EQUAL, player.getUniqueId().toString().replace("-", "")))[0]; + } catch (Exception e) { + return null; + } + } else { + return null; + } + return getIpInfo(ip); + } + + public String[] getIpInfo(String ip) { + String[] info = new String[4]; + + try { + URL ipinfo = new URL("https://ipapi.co/" + ip + "/json"); + JSONObject json = (JSONObject) new JSONParser().parse(read(ipinfo)); + + info[0] = ip; + + Object o_country = json.get("country_name"); + Object o_region = json.get("region"); + Object o_asn = json.get("asn"); + Object o_org = json.get("org"); + + String country = o_country == null ? "Unknown" : (String) o_country; + String region = o_region == null ? "" : ", " + (String) o_region; + String asn = o_asn == null ? "Unknown" : (String) o_asn; + String org = o_org == null ? "Unknown" : (String) o_org; + + info[1] = country.equals("") ? "Unknown" : country + (region.equals(", ") ? "" : region); + info[2] = asn.equals("") ? "Unknown" : asn; + info[3] = org.equals("") ? "Unknown" : org; + + return info; + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + public String getFirstJoin(OfflinePlayer player) { + Long firstJoin = player.getFirstPlayed(); + Date date = new Date(firstJoin); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + + return format.format(date); + } + + public String getLastSeen(OfflinePlayer player) { + Long lastSeen = player.getLastPlayed(); + Date date = new Date(lastSeen); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + + return format.format(date); + } + + public Object[] getWebsiteData(OfflinePlayer player) { + if (table == null) + return null; + + MysqlConstraint constraint = new MysqlConstraint("uuid", ConstraintOperator.EQUAL, player.getUniqueId().toString().replace("-", "")); + + try { + int id = (int) table.get("id", constraint)[0]; + String email = (String) table.get("email", constraint)[0]; + boolean confirmed = (boolean) table.get("confirmed", constraint)[0]; + + return new Object[] { "https://redstoner.com/users/" + id, email, confirmed }; + } catch (Exception e) { + try { + int id = (int) table.get("id", constraint)[0]; + String email = (String) table.get("email", constraint)[0]; + boolean confirmed = (boolean) table.get("confirmed", constraint)[0]; + + return new Object[] { "https://redstoner.com/users/" + id, email, confirmed }; + } catch (Exception e2) {} + + return new Object[] { null }; + } + } + + public String getAllNames(OfflinePlayer player) { + String uuid = player.getUniqueId().toString().replace("-", ""); + String nameString = ""; + + try { + String rawJson = read(new URL("https://api.mojang.com/user/profiles/" + uuid + "/names")); + JSONArray names = (JSONArray) new JSONParser().parse(rawJson); + + for (Object obj : names) { + nameString += "&e" + ((JSONObject) obj).get("name") + "&7, "; + } + + nameString = nameString.substring(0, nameString.length() - 2); + return nameString; + } catch (Exception e) {} + + return "None"; + } + + public void sendData(CommandSender sender, OfflinePlayer player) { + try { + // data + String uuid = player.getUniqueId().toString(); + + String firstJoin = getFirstJoin(player); + String lastSeen = getLastSeen(player); + firstJoin = (firstJoin.equals("1970-01-01 01:00")) ? "&eNever" : "&7(yyyy-MM-dd hh:mm) &e" + firstJoin; + lastSeen = (lastSeen.equals("1970-1-1 01:00")) ? "&eNever" : "&7(yyyy-MM-dd hh:mm) &e" + lastSeen; + + Object[] websiteData = getWebsiteData(player); + + + String[] ipInfo = getIpInfo(player); + + String namesUsed = getAllNames(player); + + // messages + Message msg = new Message(sender, null); + + msg.appendText("\n" + getLogger().getHeader()); + msg.appendText("\n&7Data provided by redstoner:"); + msg.appendText("\n&6> UUID: ").appendSuggestHover("&e" + uuid, uuid, "Click to copy!"); + msg.appendText("\n&6> First joined: &e" + firstJoin); + msg.appendText("\n&6> Last Seen: &e" + lastSeen); + + if (websiteData != null) { + String websiteUrl = (websiteData[0] == null) ? "None" : (String) websiteData[0]; + String email = (websiteData[0] == null) ? "Unknown" : (String) websiteData[1]; + boolean emailNotConfirmed = (websiteData[0] == null) ? false : !((boolean) websiteData[2]); + + msg.appendText("\n&6> Website account: &e").appendLink(websiteUrl, websiteUrl); + msg.appendText("\n&6> Email: &e" + (emailNotConfirmed ? "\n&6> &cEmail NOT Confirmed!" : "")).appendSuggestHover("&e" + email, email, "Click to copy!"); + } + else { + msg.appendTextHover("\n&6> Website account: &cData Unavailable", "&c" + noTableReason); + msg.appendTextHover("\n&6> Email: &cData Unavailable", "&c" + noTableReason); + } + msg.appendText("\n\n&7Data provided by ipapi.co:"); + + if (ipInfo == null && table == null) { + msg.appendTextHover("\n&6> &cData Unavailable", "&c" + noTableReason); + } else if (ipInfo == null) { + msg.appendText("\n&6> &cData Unavailable"); + } else { + String ip = ipInfo[0]; + String region = ipInfo[1]; + String asn = ipInfo[2]; + String org = ipInfo[3]; + + msg.appendText("\n&6> IP: ").appendSuggestHover("&e" + ip, ip, "Click to copy!"); + msg.appendText("\n&6> Region: ").appendSuggestHover("&e" + region, region, "Click to copy!"); + msg.appendText("\n&6> ASN: ").appendSuggestHover("&e" + asn, asn, "Click to copy!"); + msg.appendText("\n&6> Org: ").appendSuggestHover("&e" + org, org, "Click to copy!"); + } + + msg.appendText("\n\n&7Data provided by mojang:"); + msg.appendText("\n&6> All ingame names used so far: &e" + namesUsed); + msg.send(); + } catch (Exception e) { + getLogger().message(sender, true, "Sorry, something went wrong while fetching data"); + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/redstoner/modules/check/module.info b/src/main/java/com/redstoner/modules/check/module.info new file mode 100644 index 0000000..e680102 --- /dev/null +++ b/src/main/java/com/redstoner/modules/check/module.info @@ -0,0 +1,3 @@ +displayName: Check +category: Staff +description: A tool to get basic data about players, such as forums account, playtimes and similar
\ No newline at end of file diff --git a/src/com/redstoner/modules/clear/Clear.cmd b/src/main/java/com/redstoner/modules/clear/Clear.cmd index 117804b..0c86e30 100644 --- a/src/com/redstoner/modules/clear/Clear.cmd +++ b/src/main/java/com/redstoner/modules/clear/Clear.cmd @@ -7,7 +7,7 @@ command clear{ } [string:player] { help Clears someone elses inventory; - perm utils.admin.clear; + perm utils.clear.other; run clearother player; } }
\ No newline at end of file diff --git a/src/com/redstoner/modules/clear/Clear.java b/src/main/java/com/redstoner/modules/clear/Clear.java index a6ea86f..10e0df8 100644 --- a/src/com/redstoner/modules/clear/Clear.java +++ b/src/main/java/com/redstoner/modules/clear/Clear.java @@ -12,33 +12,31 @@ import com.redstoner.misc.CommandHolderType; import com.redstoner.modules.Module; @Commands(CommandHolderType.File) -@Version(major = 4, minor = 1, revision = 0, compatible = 4) -public class Clear implements Module -{ +@Version(major = 4, minor = 0, revision = 0, compatible = 4) +public class Clear implements Module { @Command(hook = "clear") - public boolean clearInventory(CommandSender sender) - { + public boolean clearInventory(CommandSender sender) { Player player = (Player) sender; + Inventory inv = player.getInventory(); - for (int i = 0; i < 36; i++) - inv.clear(i); + for (int i = 0; i < 36; i++) inv.clear(i); + getLogger().message(sender, "Cleared your inventory!"); return true; } - + @Command(hook = "clearother") - public boolean clearOtherInventory(CommandSender sender, String name) - { + public boolean clearOtherInventory(CommandSender sender, String name) { Player player = Bukkit.getPlayer(name); - if (player == null) - getLogger().message(sender, true, "That player couldn't be found!"); - else - { + + if (player == null) getLogger().message(sender, true, "That player couldn't be found!"); + else { Inventory inv = player.getInventory(); - for (int i = 0; i < 36; i++) - inv.clear(i); + for (int i = 0; i < 36; i++) inv.clear(i); + getLogger().message(sender, "Cleared " + player.getDisplayName() + "&7's inventory!"); } + return true; } } diff --git a/src/main/java/com/redstoner/modules/clear/module.info b/src/main/java/com/redstoner/modules/clear/module.info new file mode 100644 index 0000000..5e5d0b2 --- /dev/null +++ b/src/main/java/com/redstoner/modules/clear/module.info @@ -0,0 +1,3 @@ +displayName: Clear +category: Other +description: Allows players to clear their inventories
\ No newline at end of file diff --git a/src/com/redstoner/modules/cycle/Cycle.cmd b/src/main/java/com/redstoner/modules/cycle/Cycle.cmd index dc8e10a..dd67999 100644 --- a/src/com/redstoner/modules/cycle/Cycle.cmd +++ b/src/main/java/com/redstoner/modules/cycle/Cycle.cmd @@ -1,12 +1,12 @@ command cycle { + perm utils.cycle; + type player; on { help Turns on cycle; - type player; run cycle_on; } off { help Turns off cycle; - type player; run cycle_off; } }
\ No newline at end of file diff --git a/src/com/redstoner/modules/cycle/Cycle.java b/src/main/java/com/redstoner/modules/cycle/Cycle.java index b0a6310..40334b1 100644 --- a/src/com/redstoner/modules/cycle/Cycle.java +++ b/src/main/java/com/redstoner/modules/cycle/Cycle.java @@ -24,119 +24,109 @@ import com.redstoner.modules.Module; @Commands(CommandHolderType.File) @AutoRegisterListener -@Version(major = 4, minor = 1, revision = 0, compatible = 4) -public class Cycle implements Module, Listener -{ +@Version(major = 5, minor = 0, revision = 0, compatible = 4) +public class Cycle implements Module, Listener { private File cycleFile = new File(Main.plugin.getDataFolder(), "cycle.json"); private JSONArray no_cyclers; - + @Override - public boolean onEnable() - { + public boolean onEnable() { no_cyclers = JsonManager.getArray(cycleFile); - if (no_cyclers == null) - no_cyclers = new JSONArray(); + if (no_cyclers == null) no_cyclers = new JSONArray(); + return true; } - + @Override - public void onDisable() - { + public void onDisable() { saveCyclers(); } - - private void saveCyclers() - { + + private void saveCyclers() { JsonManager.save(no_cyclers, cycleFile); } - + @Command(hook = "cycle_on") - public boolean cycleOn(CommandSender sender) - { + public boolean cycleOn(CommandSender sender) { UUID uid = ((Player) sender).getUniqueId(); - if (no_cyclers.remove(uid.toString())) - { + + if (no_cyclers.remove(uid.toString())) { getLogger().message(sender, "Cycle enabled!"); saveCyclers(); - } - else - getLogger().message(sender, "Cycle was already enabled!"); + } else getLogger().message(sender, "Cycle was already enabled!"); + return true; } - + @SuppressWarnings("unchecked") @Command(hook = "cycle_off") - public boolean cycleOff(CommandSender sender) - { + public boolean cycleOff(CommandSender sender) { UUID uid = ((Player) sender).getUniqueId(); - if (!no_cyclers.contains(uid.toString())) - { + + if (!no_cyclers.contains(uid.toString())) { getLogger().message(sender, "Cycle disabled!"); no_cyclers.add(uid.toString()); saveCyclers(); - } - else - getLogger().message(sender, "Cycle was already disabled!"); + } else getLogger().message(sender, "Cycle was already disabled!"); + return true; } - + @EventHandler - public void onInventoryCycle(PlayerItemHeldEvent event) - { + public void onInventoryCycle(PlayerItemHeldEvent event) { Player player = event.getPlayer(); UUID uid = player.getUniqueId(); - if (!player.getGameMode().equals(GameMode.CREATIVE) || player.isSneaking() - || no_cyclers.contains(uid.toString())) - return; + + if (!player.getGameMode().equals(GameMode.CREATIVE) || player.isSneaking() || no_cyclers.contains(uid.toString())) return; + int prev_slot = event.getPreviousSlot(); int new_slot = event.getNewSlot(); - if (prev_slot == 0 && new_slot == 8) - shift(player, false); - else if (prev_slot == 8 && new_slot == 0) - shift(player, true); + + if (prev_slot == 0 && new_slot == 8) shift(player, false); + else if (prev_slot == 8 && new_slot == 0) shift(player, true); } - - private void shift(Player player, boolean down) - { + + private void shift(Player player, boolean down) { Inventory inv = player.getInventory(); ItemStack[] items = inv.getStorageContents(); + int shift = down ? -9 : 9; shift = (shift + items.length) % items.length; - for (int i = 0; i < 4; i++) - { + + for (int i = 0; i < 4; i++) { items = join(subset(items, shift, items.length), subset(items, 0, shift)); + ItemStack[] hotbar = subset(items, 0, 9); boolean found = false; - for (ItemStack item : hotbar) - if (item != null) - { - found = true; - break; - } - if (found) + + for (ItemStack item : hotbar) if (item != null) { + found = true; break; + } + + if (found) break; } + inv.setStorageContents(items); } - - private ItemStack[] subset(ItemStack[] items, int start, int end) - { + + private ItemStack[] subset(ItemStack[] items, int start, int end) { ItemStack[] result = new ItemStack[end - start]; - for (int i = start; i < end; i++) - { + + for (int i = start; i < end; i++) { result[i - start] = items[i]; } + return result; } - - private ItemStack[] join(ItemStack[] items1, ItemStack[] items2) - { + + private ItemStack[] join(ItemStack[] items1, ItemStack[] items2) { ItemStack[] result = new ItemStack[items1.length + items2.length]; - for (int i = 0; i < items1.length; i++) - result[i] = items1[i]; + + for (int i = 0; i < items1.length; i++) result[i] = items1[i]; int offset = items1.length; - for (int i = 0; i < items2.length; i++) - result[i + offset] = items2[i]; + for (int i = 0; i < items2.length; i++) result[i + offset] = items2[i]; + return result; } } diff --git a/src/main/java/com/redstoner/modules/cycle/module.info b/src/main/java/com/redstoner/modules/cycle/module.info new file mode 100644 index 0000000..ecfd0b0 --- /dev/null +++ b/src/main/java/com/redstoner/modules/cycle/module.info @@ -0,0 +1,3 @@ +displayName: Cycle +category: Other +description: Basically more hotbars. When you scroll over, it will load the next line of your inventory as your hotbar
\ No newline at end of file diff --git a/src/com/redstoner/modules/damnspam/DamnSpam.cmd b/src/main/java/com/redstoner/modules/damnspam/DamnSpam.cmd index 404968e..bf7f06a 100644 --- a/src/com/redstoner/modules/damnspam/DamnSpam.cmd +++ b/src/main/java/com/redstoner/modules/damnspam/DamnSpam.cmd @@ -1,15 +1,14 @@ command damnspam { perm utils.damnspam; + type player; [double:seconds] { run damnspamSingle seconds; help Set single input cooldown for button or lever.; - type player; } [double:secondsOff] [double:secondsOn] { run damnspamDouble secondsOff secondsOn; help Set input cooldown after it's been turned off and turned on (for lever only).; - type player; } }
\ No newline at end of file diff --git a/src/com/redstoner/modules/damnspam/DamnSpam.java b/src/main/java/com/redstoner/modules/damnspam/DamnSpam.java index d825843..c9e1777 100644 --- a/src/com/redstoner/modules/damnspam/DamnSpam.java +++ b/src/main/java/com/redstoner/modules/damnspam/DamnSpam.java @@ -39,309 +39,309 @@ import com.redstoner.modules.Module; @Commands(CommandHolderType.File) @AutoRegisterListener -@Version(major = 4, minor = 1, revision = 0, compatible = 4) -public class DamnSpam implements Module, Listener -{ +@Version(major = 5, minor = 0, revision = 0, compatible = 4) +public class DamnSpam implements Module, Listener { File configFile = new File(Main.plugin.getDataFolder(), "DamnSpam.json"); + Map<String, SpamInput> inputs; - boolean changingInput = false; List<Material> acceptedInputs; + HashMap<Material, int[][]> attachedBlocks; HashMap<Player, SpamInput> players; + + boolean changingInput = false; int maxTimeout = 240; + String timeoutErrorString = "The timeout must be -1 or within 0 and " + maxTimeout; - + + private static final BlockFace[] DIRECTIONS = { BlockFace.DOWN, BlockFace.UP, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST, BlockFace.EAST }; + + private static final int[][] LEVER_ATTACHED_BLOCKS = new int[][] { { 0, 7, 8, 15 }, { 5, 6, 13, 14 }, { 4, 12 }, { 3, 11 }, { 2, 10 }, { 1, 9 } }; + private static final int[][] BUTTON_ATTACHED_BLOCKS = new int[][] { { 0, 8 }, { 5, 6, 7, 13, 14, 15 }, { 4, 12 }, { 3, 11 }, { 2, 10 }, { 1, 9 } }; + + // @formatter:off + private static final Material[] BUTTONS = { + Material.ACACIA_BUTTON, + Material.BIRCH_BUTTON, + Material.DARK_OAK_BUTTON, + Material.JUNGLE_BUTTON, + Material.OAK_BUTTON, + Material.SPRUCE_BUTTON, + Material.STONE_BUTTON + }; + // @formatter:on + @Override - public boolean onEnable() - { + public boolean onEnable() { loadInputs(); + acceptedInputs = new ArrayList<Material>(); - Collections.addAll(acceptedInputs, Material.WOOD_BUTTON, Material.STONE_BUTTON, Material.LEVER); + acceptedInputs.add(Material.LEVER); + + Collections.addAll(acceptedInputs, BUTTONS); + attachedBlocks = new HashMap<Material, int[][]>(); - attachedBlocks.put(Material.LEVER, - new int[][] {{0, 7, 8, 15}, {5, 6, 13, 14}, {4, 12}, {3, 11}, {2, 10}, {1, 9}}); - attachedBlocks.put(Material.STONE_BUTTON, - new int[][] {{0, 8}, {5, 6, 7, 13, 14, 15}, {4, 12}, {3, 11}, {2, 10}, {1, 9}}); - attachedBlocks.put(Material.WOOD_BUTTON, - new int[][] {{0, 8}, {5, 6, 7, 13, 14, 15}, {4, 12}, {3, 11}, {2, 10}, {1, 9}}); + attachedBlocks.put(Material.LEVER, LEVER_ATTACHED_BLOCKS); + + for (Material button : BUTTONS) { + attachedBlocks.put(button, BUTTON_ATTACHED_BLOCKS); + } + players = new HashMap<Player, SpamInput>(); return true; } - - public void loadInputs() - { + + public void loadInputs() { inputs = new HashMap<String, SpamInput>(); - try - { + + try { FileReader reader = new FileReader(configFile); JSONObject json = (JSONObject) new JSONParser().parse(reader); - for (Object key : json.keySet()) - { + + for (Object key : json.keySet()) { JSONObject inputData = (JSONObject) json.get(key); String uuid = (String) inputData.get("creator"); Double timeoutOn = (Double) inputData.get("timeout_on"); Double timeoutOff = (Double) inputData.get("timeout_off"); Double lastTime = (Double) inputData.get("last_time"); + inputs.put((String) key, new SpamInput(uuid, timeoutOff, timeoutOn, lastTime)); } - } - catch (IOException | ParseException e) - { + } catch (IOException | ParseException e) { e.printStackTrace(); } } - + @SuppressWarnings("unchecked") - public void saveInputs() - { + public void saveInputs() { JSONObject json = new JSONObject(); - for (String key : inputs.keySet()) - { + + for (String key : inputs.keySet()) { JSONObject jsonInput = new JSONObject(); SpamInput input = inputs.get(key); + jsonInput.put("creator", input.player); jsonInput.put("timeout_on", input.timeoutOn); jsonInput.put("timeout_off", input.timeoutOff); jsonInput.put("last_time", input.lastTime); + json.put(key, jsonInput); } - try - { + try { PrintWriter writer = new PrintWriter(configFile); writer.write(json.toJSONString()); writer.close(); - } - catch (FileNotFoundException e) - { + } catch (FileNotFoundException e) { e.printStackTrace(); } } - - public String locationString(Location loc) - { + + public String locationString(Location loc) { return loc.getWorld().getName() + ";" + loc.getBlockX() + ";" + loc.getBlockY() + ";" + loc.getBlockZ(); } - - public boolean isAcceptableTimeout(double timeout) - { + + public boolean isAcceptableTimeout(double timeout) { return (timeout > 0 && timeout <= maxTimeout) || timeout == -1; } - - public boolean canBuild(Player player, Block block) - { + + public boolean canBuild(Player player, Block block) { BlockBreakEvent event = new BlockBreakEvent(block, player); Bukkit.getPluginManager().callEvent(event); + return !event.isCancelled(); } - + @Command(hook = "damnspamSingle") - public void damnspam(CommandSender sender, double seconds) - { + public void damnspam(CommandSender sender, double seconds) { boolean destroyingInput = false; + seconds = (double) Math.round(seconds * 100) / 100; - if (seconds == 0) - destroyingInput = true; - else if (!isAcceptableTimeout(seconds)) - { + + if (seconds == 0) destroyingInput = true; + else if (!isAcceptableTimeout(seconds)) { getLogger().message(sender, true, "The timeout must be -1 or within 0 and " + maxTimeout); return; } + getLogger().message(sender, "Please click the input you would like to set."); setPlayer((Player) sender, destroyingInput, seconds, seconds); } - + @Command(hook = "damnspamDouble") - public void damnspam(CommandSender sender, double secondsOff, double secondsOn) - { + public void damnspam(CommandSender sender, double secondsOff, double secondsOn) { boolean destroyingInput = false; + secondsOn = (double) Math.round(secondsOn * 100) / 100; secondsOff = (double) Math.round(secondsOff * 100) / 100; - if (secondsOn == 0 && secondsOff == 0) - { + + if (secondsOn == 0 && secondsOff == 0) { destroyingInput = true; - } - else if (!(isAcceptableTimeout(secondsOn) && isAcceptableTimeout(secondsOff))) - { + } else if (!(isAcceptableTimeout(secondsOn) && isAcceptableTimeout(secondsOff))) { getLogger().message(sender, true, "The timeout must be -1 or within 0 and " + maxTimeout); return; } + getLogger().message(sender, "Please click the input you would like to set."); setPlayer((Player) sender, destroyingInput, secondsOff, secondsOn); } - - public void setPlayer(Player player, boolean destroying, double timeoutOff, double timeoutOn) - { + + public void setPlayer(Player player, boolean destroying, double timeoutOff, double timeoutOn) { SpamInput input = null; - if (!destroying) - { + + if (!destroying) { input = new SpamInput(player.getUniqueId().toString(), timeoutOff, timeoutOn, 0); } + players.put(player, input); } - - public boolean attemptInputRegister(Player player, Block block, Cancellable event) - { - if (players.containsKey(player)) - { - if (!acceptedInputs.contains(block.getType())) - { + + public boolean attemptInputRegister(Player player, Block block, Cancellable event) { + if (players.containsKey(player)) { + if (!acceptedInputs.contains(block.getType())) { getLogger().message(player, true, "That block is not an acceptable input!"); return true; } + String typeStr = block.getType().toString().toLowerCase().replace("_", " "); String locationStr = locationString(block.getLocation()); + changingInput = true; boolean buildCheck = canBuild(player, block); changingInput = false; - if (!buildCheck) - { - getLogger().message(player, true, - "Something went wrong trying to change the timeout on this " + typeStr + "!"); + + if (!buildCheck) { + getLogger().message(player, true, "Something went wrong trying to change the timeout on this " + typeStr + "!"); event.setCancelled(true); return true; } + SpamInput input = players.get(player); - if (input == null) - { - if (!inputs.containsKey(locationStr)) - { - getLogger().message(player, true, - "Something went wrong trying to change the timeout on this " + typeStr + "!"); + + if (input == null) { + if (!inputs.containsKey(locationStr)) { + getLogger().message(player, true, "Something went wrong trying to change the timeout on this " + typeStr + "!"); event.setCancelled(true); return true; } + inputs.remove(locationStr); getLogger().message(player, "Successfully removed the timeout for this " + typeStr); - } - else - { + } else { inputs.put(locationStr, players.get(player)); getLogger().message(player, "Successfully set a timeout for this " + typeStr); } + event.setCancelled(true); players.remove(player); saveInputs(); + return true; } return false; } - - public void checkBlockBreak(BlockBreakEvent event, Block block) - { - if (!acceptedInputs.contains(block.getType())) - return; + + public void checkBlockBreak(BlockBreakEvent event, Block block) { + if (!acceptedInputs.contains(block.getType())) return; String posStr = locationString(block.getLocation()); - if (!inputs.containsKey(posStr)) - return; + if (!inputs.containsKey(posStr)) return; + SpamInput input = inputs.get(posStr); Player sender = event.getPlayer(); + String typeStr = block.getType().toString().toLowerCase().replace("_", " "); - String inputStr = (block.getLocation().equals(event.getBlock()) ? "this " + typeStr - : "the " + typeStr + " attached to that block"); - if (!sender.isSneaking()) - { + String inputStr = (block.getLocation().equals(event.getBlock()) ? "this " + typeStr : "the " + typeStr + " attached to that block"); + + if (!sender.isSneaking()) { getLogger().message(sender, true, "You cannot destroy " + inputStr); getLogger().message(sender, true, "Sneak and break or set the timeout to 0 if you want to remove it."); + event.setCancelled(true); return; } - if (sender.hasPermission("damnspam.admin") || sender.getUniqueId().toString().equals(input.player)) - { + + if (sender.hasPermission("damnspam.admin") || sender.getUniqueId().toString().equals(input.player)) { inputs.remove(posStr); saveInputs(); getLogger().message(sender, "Succesfully removed " + inputStr); - } - else - { + } else { getLogger().message(sender, true, "You are not allowed to remove " + inputStr); event.setCancelled(true); } } - + @SuppressWarnings("deprecation") - public List<Block> getAttachedBlocks(Block block) - { + public List<Block> getAttachedBlocks(Block block) { List<Block> blocks = new ArrayList<Block>(); - BlockFace[] directions = {BlockFace.DOWN, BlockFace.UP, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST, - BlockFace.EAST}; - for (int i = 0; i < directions.length; i++) - { - Block side = block.getRelative(directions[i]); + + for (int i = 0; i < DIRECTIONS.length; i++) { + Block side = block.getRelative(DIRECTIONS[i]); int[][] dvalues = attachedBlocks.get(side.getType()); - if (dvalues != null) - { + + if (dvalues != null) { boolean onSide = false; - for (int val : dvalues[i]) - { - if (side.getData() == (byte) val) - { + + for (int val : dvalues[i]) { + if (side.getData() == (byte) val) { onSide = true; break; } } - if (onSide) - blocks.add(side); + + if (onSide) blocks.add(side); } } + return blocks; } - + @EventHandler(priority = EventPriority.NORMAL) - public void onBreak(BlockBreakEvent event) - { - if (changingInput || event.isCancelled()) - return; + public void onBreak(BlockBreakEvent event) { + if (changingInput || event.isCancelled()) return; + boolean register = attemptInputRegister(event.getPlayer(), event.getBlock(), event); - if (!register) - { + + if (!register) { Block block = event.getBlock(); checkBlockBreak(event, block); - for (Block affected : getAttachedBlocks(block)) - { + + for (Block affected : getAttachedBlocks(block)) { checkBlockBreak(event, affected); } } } - + @SuppressWarnings("deprecation") @EventHandler(priority = EventPriority.HIGHEST) - public void onInteract(PlayerInteractEvent event) - { - if (event.getClickedBlock() == null) - return; + public void onInteract(PlayerInteractEvent event) { + if (event.getClickedBlock() == null) return; boolean register = attemptInputRegister(event.getPlayer(), event.getClickedBlock(), event); - if (!register && event.getAction().equals(Action.RIGHT_CLICK_BLOCK) && !event.isCancelled()) - { + + if (!register && event.getAction().equals(Action.RIGHT_CLICK_BLOCK) && !event.isCancelled()) { Player sender = event.getPlayer(); Block block = event.getClickedBlock(); String posStr = locationString(block.getLocation()); SpamInput data = inputs.get(posStr); - if (data != null) - { + + if (data != null) { String btype = block.getType().toString().toLowerCase().replace("_", " "); double checktime = 0; - if (btype.equals("lever") && block.getData() < 8) - checktime = data.timeoutOff; - else - checktime = data.timeoutOn; - double timeLeft = (data.lastTime + checktime) - - ((double) Math.round((double) System.currentTimeMillis() / 10) / 100); + + if (btype.equals("lever") && block.getData() < 8) checktime = data.timeoutOff; + else checktime = data.timeoutOn; + + double timeLeft = (data.lastTime + checktime) - ((double) Math.round((double) System.currentTimeMillis() / 10) / 100); timeLeft = (double) Math.round(timeLeft * 100) / 100; - if (checktime == -1) - { + + if (checktime == -1) { event.setCancelled(true); getLogger().message(sender, "This " + btype + " is locked permanently by /damnspam."); - } - else if (timeLeft > 0) - { + } else if (timeLeft > 0) { event.setCancelled(true); - getLogger().message(sender, "This " + btype + " has a damnspam timeout of " + checktime + ", with " - + timeLeft + " left."); - } - else - { + getLogger().message(sender, "This " + btype + " has a damnspam timeout of " + checktime + ", with " + timeLeft + " left."); + } else { data.lastTime = (double) Math.round((double) System.currentTimeMillis() / 10) / 100; } + inputs.put(posStr, data); } } diff --git a/src/com/redstoner/modules/damnspam/SpamInput.java b/src/main/java/com/redstoner/modules/damnspam/SpamInput.java index 9735dd9..59a7017 100644 --- a/src/com/redstoner/modules/damnspam/SpamInput.java +++ b/src/main/java/com/redstoner/modules/damnspam/SpamInput.java @@ -1,17 +1,17 @@ package com.redstoner.modules.damnspam; public class SpamInput { - - protected String player; - protected double timeoutOn; - protected double timeoutOff; - protected double lastTime; - + + protected String player; + protected double timeoutOn; + protected double timeoutOff; + protected double lastTime; + protected SpamInput(String player, double timeoutOff, double timeoutOn, double lastTime) { this.player = player; this.timeoutOff = timeoutOff; this.timeoutOn = timeoutOn; this.lastTime = lastTime; } - + } diff --git a/src/main/java/com/redstoner/modules/damnspam/module.info b/src/main/java/com/redstoner/modules/damnspam/module.info new file mode 100644 index 0000000..4736784 --- /dev/null +++ b/src/main/java/com/redstoner/modules/damnspam/module.info @@ -0,0 +1,3 @@ +displayName: Damnspam +category: Other +description: Protects levers and buttons from being spammed by providing a configurable timeout for inputs
\ No newline at end of file diff --git a/src/com/redstoner/modules/datamanager/DataManager.cmd b/src/main/java/com/redstoner/modules/datamanager/DataManager.cmd index f7d480a..792e9d5 100644 --- a/src/com/redstoner/modules/datamanager/DataManager.cmd +++ b/src/main/java/com/redstoner/modules/datamanager/DataManager.cmd @@ -9,7 +9,7 @@ command config { alias configs; alias setting; alias settings; - perm datamanager.admin; + perm utils.datamanager.admin; list { run config_list; help Lists all modules that have at least one config setting.; diff --git a/src/com/redstoner/modules/datamanager/DataManager.java b/src/main/java/com/redstoner/modules/datamanager/DataManager.java index 63ce1ce..197bc7a 100644 --- a/src/com/redstoner/modules/datamanager/DataManager.java +++ b/src/main/java/com/redstoner/modules/datamanager/DataManager.java @@ -2,7 +2,6 @@ package com.redstoner.modules.datamanager; import java.io.File; import java.io.FilenameFilter; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; @@ -36,59 +35,60 @@ import com.redstoner.modules.Module; @Commands(CommandHolderType.Stream) @AutoRegisterListener -@Version(major = 4, minor = 1, revision = 10, compatible = 4) -public final class DataManager implements CoreModule, Listener -{ +@Version(major = 5, minor = 0, revision = 0, compatible = 4) +public final class DataManager implements CoreModule, Listener { protected final File dataFolder = new File(Main.plugin.getDataFolder(), "data"); + protected JSONObject data = new JSONObject(); protected JSONObject config_data; + protected ArrayList<String> module_index; - int old_hash = 0; - protected HashMap<String, HashMap<String, Boolean>> states = new HashMap<>(); - private static DataManager previous_instance = null; protected ArrayList<String> subcommands; + protected List<String> scheduled_saves = new ArrayList<>(); + + protected HashMap<String, HashMap<String, Boolean>> states = new HashMap<>(); + + private static DataManager previous_instance = null; + + int old_hash = 0; int task_id; - + @Override - public void postEnable() - { - if (!dataFolder.exists()) - dataFolder.mkdirs(); - for (Player p : Bukkit.getOnlinePlayers()) - { + public void postEnable() { + if (!dataFolder.exists()) dataFolder.mkdirs(); + + for (Player p : Bukkit.getOnlinePlayers()) { loadData_(p.getUniqueId().toString()); } + subcommands = new ArrayList<>(); subcommands.add("list"); subcommands.add("get"); subcommands.add("set"); subcommands.add("remove"); - if (previous_instance == null) - states.put(getID(Bukkit.getConsoleSender()), new HashMap<String, Boolean>()); - else - { + + if (previous_instance == null) states.put(getID(Bukkit.getConsoleSender()), new HashMap<String, Boolean>()); + else { this.states = previous_instance.states; previous_instance = null; } + config_data = JsonManager.getObject(new File(dataFolder, "configs.json")); - if (config_data == null) - config_data = new JSONObject(); + if (config_data == null) config_data = new JSONObject(); + fixJson(); updateIndex(); + CommandManager.registerCommand(getClass().getResourceAsStream("DataManager.cmd"), this, Main.plugin); - + // Schedule save every ten seconds - task_id = Bukkit.getScheduler().runTaskTimerAsynchronously(Main.plugin, new Runnable() - { + task_id = Bukkit.getScheduler().runTaskTimerAsynchronously(Main.plugin, new Runnable() { @Override - public void run() - { - for (String id : scheduled_saves) - { + public void run() { + for (String id : scheduled_saves) { Object raw = data.get(id); - if (raw == null || ((JSONObject) raw).size() == 0) - continue; + if (raw == null || ((JSONObject) raw).size() == 0) continue; JSONObject json = (JSONObject) raw; JsonManager.save(json, new File(dataFolder, id + ".json")); } @@ -96,934 +96,793 @@ public final class DataManager implements CoreModule, Listener } }, 0, 20).getTaskId(); } - + @Override - public void onDisable() - { + public void onDisable() { previous_instance = this; - for (Player p : Bukkit.getOnlinePlayers()) - { + + for (Player p : Bukkit.getOnlinePlayers()) { saveAndUnload(p); } + JsonManager.save(config_data, new File(dataFolder, "configs.json")); Bukkit.getScheduler().cancelTask(task_id); } - + @Command(hook = "import_file") - public boolean importFile(CommandSender sender, String file, String module) - { - try - { + public boolean importFile(CommandSender sender, String file, String module) { + try { JSONObject object = JsonManager.getObject(new File(file)); importObject_(module, object); - } - catch (Exception e) - { + } catch (Exception e) { getLogger().error("Could not import data!"); } + return true; } - + @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) - { + public void onPlayerJoin(PlayerJoinEvent event) { loadData_(event.getPlayer().getUniqueId().toString()); } - + @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) - { + public void onPlayerQuit(PlayerQuitEvent event) { saveAndUnload(event.getPlayer()); } - - public static void loadData(CommandSender sender) - { + + public static void loadData(CommandSender sender) { loadData(getID(sender)); } - - public static void loadData(String id) - { - try - { + + public static void loadData(String id) { + try { Module mod = ModuleLoader.getModule("DataManager"); Method m = mod.getClass().getDeclaredMethod("loadData_", String.class); + m.setAccessible(true); m.invoke(mod, id); - } - catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - {} + } catch (Exception e) {} } - + @SuppressWarnings("unchecked") - protected synchronized void loadData_(String id) - { + protected synchronized void loadData_(String id) { JSONObject playerData = JsonManager.getObject(new File(dataFolder, id + ".json")); - if (playerData == null) - playerData = new JSONObject(); + if (playerData == null) playerData = new JSONObject(); + data.put(id.toString(), playerData); states.put(id.toString(), new HashMap<String, Boolean>()); } - - public static Object getOrDefault(CommandSender sender, String key, Object fallback) - { + + public static Object getOrDefault(CommandSender sender, String key, Object fallback) { return getOrDefault(getID(sender), Utils.getCaller("DataManager"), key, fallback); } - - public static Object getOrDefault(String id, String key, Object fallback) - { + + public static Object getOrDefault(String id, String key, Object fallback) { return getOrDefault(id, Utils.getCaller("DataManager"), key, fallback); } - - public static Object getOrDefault(String id, String module, String key, Object fallback) - { - try - { + + public static Object getOrDefault(String id, String module, String key, Object fallback) { + try { Module mod = ModuleLoader.getModule("DataManager"); - Method m = mod.getClass().getDeclaredMethod("getOrDefault_", String.class, String.class, String.class, - Object.class); + + Method m = mod.getClass().getDeclaredMethod("getOrDefault_", String.class, String.class, String.class, Object.class); m.setAccessible(true); + return m.invoke(mod, id, module, key, fallback); + } catch (Exception e) { + return fallback; } - catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - {} - return fallback; - } - - protected Object getOrDefault_(String id, String module, String key, Object fallback) - { + } + + protected Object getOrDefault_(String id, String module, String key, Object fallback) { Object o = getData_(id, module, key); return o == null ? fallback : o; } - - public static Object getData(CommandSender sender, String key) - { + + public static Object getData(CommandSender sender, String key) { return getData(getID(sender), Utils.getCaller("DataManager"), key); } - - public static Object getData(String id, String key) - { + + public static Object getData(String id, String key) { return getData(id, Utils.getCaller("DataManager"), key); } - - public static Object getData(String id, String module, String key) - { - try - { + + public static Object getData(String id, String module, String key) { + try { Module mod = ModuleLoader.getModule("DataManager"); + Method m = mod.getClass().getDeclaredMethod("getData_", String.class, String.class, String.class); m.setAccessible(true); + return m.invoke(mod, id, module, key); + } catch (Exception e) { + return null; } - catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - {} - return null; - } - - protected Object getData_(String id, String module, String key) - { - if (data.containsKey(id)) - { + } + + protected Object getData_(String id, String module, String key) { + if (data.containsKey(id)) { JSONObject moduleData = ((JSONObject) ((JSONObject) data.get(id)).get(module)); - if (moduleData == null) - return null; - if (key == null) - return moduleData; - else - return moduleData.get(key); - } - else + + if (moduleData == null) return null; + if (key == null) return moduleData; + else return moduleData.get(key); + } else { return loadAndGet(id, module, key); + } } - - protected synchronized Object loadAndGet(String id, String module, String key) - { + + protected synchronized Object loadAndGet(String id, String module, String key) { JSONObject playerData = JsonManager.getObject(new File(dataFolder, id + ".json")); - if (playerData == null) - return null; - if (key == null) - return playerData.get(module); - else - return ((JSONObject) playerData.get(module)).get(key); - } - - public static void setData(CommandSender sender, String key, Object value) - { + + if (playerData == null) return null; + if (key == null) return playerData.get(module); + else return ((JSONObject) playerData.get(module)).get(key); + } + + public static void setData(CommandSender sender, String key, Object value) { setData(getID(sender), Utils.getCaller("DataManager"), key, value); } - - public static void setData(String id, String key, Object value) - { + + public static void setData(String id, String key, Object value) { setData(id, Utils.getCaller("DataManager"), key, value); } - - public static void setData(String id, String module, String key, Object value) - { - try - { + + public static void setData(String id, String module, String key, Object value) { + try { Module mod = ModuleLoader.getModule("DataManager"); - Method m = mod.getClass().getDeclaredMethod("setData_", String.class, String.class, String.class, - Object.class); + + Method m = mod.getClass().getDeclaredMethod("setData_", String.class, String.class, String.class, Object.class); m.setAccessible(true); + m.invoke(mod, id, module, key, value); - } - catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - {} + } catch (Exception e) {} } - + @SuppressWarnings("unchecked") - protected void setData_(String id, String module, String key, Object value) - { - if (data.containsKey(id)) - { + protected void setData_(String id, String module, String key, Object value) { + if (data.containsKey(id)) { JSONObject moduleData = ((JSONObject) ((JSONObject) data.get(id)).get(module)); - if (moduleData == null) - { + + if (moduleData == null) { moduleData = new JSONObject(); ((JSONObject) data.get(id)).put(module, moduleData); } - if (key == null) - setDirectly_(id, module, value); - else - moduleData.put(key, value); + + if (key == null) setDirectly_(id, module, value); + else moduleData.put(key, value); + save_(id); - } - else + } else { loadAndSet(id, module, key, value); + } } - - public static void setDirectly(CommandSender sender, Object value) - { + + public static void setDirectly(CommandSender sender, Object value) { setDirectly(getID(sender), Utils.getCaller("DataManager"), value); } - - public static void setDirectly(String id, Object value) - { + + public static void setDirectly(String id, Object value) { setDirectly(id, Utils.getCaller("DataManager"), value); } - - public static void setDirectly(String id, String module, Object value) - { - try - { + + public static void setDirectly(String id, String module, Object value) { + try { Module mod = ModuleLoader.getModule("DataManager"); + Method m = mod.getClass().getDeclaredMethod("setDirectly_", String.class, String.class, Object.class); m.setAccessible(true); + m.invoke(mod, id, module, value); - } - catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - {} + } catch (Exception e) {} } - + @SuppressWarnings("unchecked") - protected void setDirectly_(String id, String module, Object value) - { - if (data.containsKey(id)) - { + protected void setDirectly_(String id, String module, Object value) { + if (data.containsKey(id)) { JSONObject playerdata = (JSONObject) data.get(id); playerdata.put(module, value); + save_(id); - } - else + } else { loadAndSetDirectly(id, module, value); + } } - + @SuppressWarnings("unchecked") - protected synchronized void loadAndSet(String id, String module, String key, Object value) - { + protected synchronized void loadAndSet(String id, String module, String key, Object value) { File dataFile = new File(dataFolder, id + ".json"); + JSONObject playerData = JsonManager.getObject(dataFile); - if (playerData == null) - playerData = new JSONObject(); + if (playerData == null) playerData = new JSONObject(); + JSONObject moduleData = ((JSONObject) playerData.get(module)); - if (moduleData == null) - { + if (moduleData == null) { moduleData = new JSONObject(); playerData.put(module, moduleData); } + moduleData.put(key, value); + JsonManager.save(playerData, dataFile); } - + @SuppressWarnings("unchecked") - protected void loadAndSetDirectly(String id, String module, Object value) - { + protected void loadAndSetDirectly(String id, String module, Object value) { File dataFile = new File(dataFolder, id + ".json"); + JSONObject playerData = JsonManager.getObject(dataFile); - if (playerData == null) - playerData = new JSONObject(); + if (playerData == null) playerData = new JSONObject(); + playerData.put(module, value); + JsonManager.save(playerData, dataFile); } - - public static void removeData(CommandSender sender, String key) - { + + public static void removeData(CommandSender sender, String key) { removeData(getID(sender), Utils.getCaller("DataManager"), key); } - - public static void removeData(String id, String key) - { + + public static void removeData(String id, String key) { removeData(id, Utils.getCaller("DataManager"), key); } - - public static void removeData(String id, String module, String key) - { - try - { + + public static void removeData(String id, String module, String key) { + try { Module mod = ModuleLoader.getModule("DataManager"); + Method m = mod.getClass().getDeclaredMethod("removeData_", String.class, String.class, String.class); m.setAccessible(true); + m.invoke(mod, id, module, key); - } - catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - {} + } catch (Exception e) {} } - + @SuppressWarnings("unchecked") - protected void removeData_(String id, String module, String key) - { - if (data.containsKey(id)) - { + protected void removeData_(String id, String module, String key) { + if (data.containsKey(id)) { JSONObject moduleData = ((JSONObject) ((JSONObject) data.get(id)).get(module)); - if (moduleData == null) - return; + if (moduleData == null) return; + moduleData.remove(key); data.put(module, data); + save_(id); - } - else + } else { loadAndRemove(id, module, key); + } } - - protected synchronized void loadAndRemove(String id, String module, String key) - { + + protected synchronized void loadAndRemove(String id, String module, String key) { File dataFile = new File(dataFolder, id + ".json"); + JSONObject playerData = JsonManager.getObject(dataFile); - if (playerData == null) - return; + if (playerData == null) return; + JSONObject moduleData = ((JSONObject) playerData.get(module)); - if (moduleData == null) - return; + if (moduleData == null) return; + moduleData.remove(key); + JsonManager.save(playerData, dataFile); } - - public static void importObject(JSONObject object) - { + + public static void importObject(JSONObject object) { importObject(object, Utils.getCaller("DataManager")); } - - public static void importObject(JSONObject object, String module) - { - try - { + + public static void importObject(JSONObject object, String module) { + try { Module mod = ModuleLoader.getModule("DataManager"); + Method m = mod.getClass().getDeclaredMethod("importObject_", String.class, String.class, String.class); m.setAccessible(true); + m.invoke(mod, module, object); - } - catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - {} - } - - protected void importObject_(String module, JSONObject object) - { - for (Object o : object.keySet()) - { + } catch (Exception e) {} + } + + protected void importObject_(String module, JSONObject object) { + for (Object o : object.keySet()) { String uid = null; - if (o instanceof String) - uid = (String) o; - else if (o instanceof UUID) - uid = ((UUID) o).toString(); - if (uid == null) - continue; + if (o instanceof String) uid = (String) o; + else if (o instanceof UUID) uid = ((UUID) o).toString(); + + if (uid == null) continue; + setDirectly_(uid, module, object.get(o)); } } - - public static void migrateAll(String oldName) - { + + public static void migrateAll(String oldName) { migrateAll(oldName, Utils.getCaller("DataManager")); } - - public static void migrateAll(String oldName, String newName) - { - try - { + + public static void migrateAll(String oldName, String newName) { + try { Module mod = ModuleLoader.getModule("DataManager"); + Method m = mod.getClass().getDeclaredMethod("migrateAll_", String.class, String.class); m.setAccessible(true); + m.invoke(mod, oldName, newName); - } - catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - {} - } - - protected void migrateAll_(String oldName, String newName) - { - for (String s : dataFolder.list(new FilenameFilter() - { + } catch (Exception e) {} + } + + protected void migrateAll_(String oldName, String newName) { + for (String s : dataFolder.list(new FilenameFilter() { @Override - public boolean accept(File dir, String name) - { + public boolean accept(File dir, String name) { return name.endsWith(".json"); } - })) - { + })) { migrate_(s.replace(".json", ""), oldName, newName); } } - - public static void migrate(String id, String oldName) - { + + public static void migrate(String id, String oldName) { migrate(id, oldName, Utils.getCaller("DataManager")); } - - public static void migrate(String id, String oldName, String newName) - { - try - { + + public static void migrate(String id, String oldName, String newName) { + try { Module mod = ModuleLoader.getModule("DataManager"); + Method m = mod.getClass().getDeclaredMethod("migrate_", String.class, String.class, String.class); m.setAccessible(true); + m.invoke(mod, id, oldName, newName); - } - catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - {} + } catch (Exception e) {} } - + @SuppressWarnings("unchecked") - protected void migrate_(String id, String oldName, String newName) - { - if (data.containsKey(id)) - { + protected void migrate_(String id, String oldName, String newName) { + if (data.containsKey(id)) { data.put(newName, data.get(oldName)); data.remove(oldName); + save_(id); - } - else + } else { loadAndMigrate(id, oldName, newName); + } } - + @SuppressWarnings("unchecked") - protected void loadAndMigrate(String id, String oldName, String newName) - { + protected void loadAndMigrate(String id, String oldName, String newName) { File dataFile = new File(dataFolder, id + ".json"); JSONObject data = JsonManager.getObject(dataFile); + data.put(newName, data.get(oldName)); data.remove(oldName); + JsonManager.save(data, dataFile); } - - public static void save(CommandSender sender) - { - try - { + + public static void save(CommandSender sender) { + try { Module mod = ModuleLoader.getModule("DataManager"); + Method m = mod.getClass().getDeclaredMethod("save_", CommandSender.class); m.setAccessible(true); + m.invoke(mod, sender); - } - catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - {} + } catch (Exception e) {} } - - protected void save_(CommandSender sender) - { + + protected void save_(CommandSender sender) { save_(getID(sender)); } - - public static void save(String id) - { - try - { + + public static void save(String id) { + try { Module mod = ModuleLoader.getModule("DataManager"); + Method m = mod.getClass().getDeclaredMethod("save_", String.class); m.setAccessible(true); + m.invoke(mod, id); - } - catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - {} + } catch (Exception e) {} } - - protected void save_(String id) - { + + protected void save_(String id) { scheduled_saves.add(id); } - - protected void saveAndUnload(CommandSender sender) - { + + protected void saveAndUnload(CommandSender sender) { saveAndUnload(getID(sender)); states.remove(getID(sender)); } - - protected void saveAndUnload(String id) - { + + protected void saveAndUnload(String id) { save_(id); data.remove(id); } - - private static String getID(CommandSender sender) - { - String id; - if (sender instanceof Player) - id = ((Player) sender).getUniqueId().toString(); - else - id = "CONSOLE"; - return id; - } - - public static void setState(CommandSender sender, String key, boolean value) - { - try - { + + private static String getID(CommandSender sender) { + if (sender instanceof Player) return ((Player) sender).getUniqueId().toString(); + else return "CONSOLE"; + } + + public static void setState(CommandSender sender, String key, boolean value) { + try { Module mod = ModuleLoader.getModule("DataManager"); + Method m = mod.getClass().getDeclaredMethod("setState_", CommandSender.class, String.class, boolean.class); m.setAccessible(true); + m.invoke(mod, sender, key, value); - } - catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - {} + } catch (Exception e) {} } - - protected void setState_(CommandSender sender, String key, boolean value) - { + + protected void setState_(CommandSender sender, String key, boolean value) { String id = getID(sender); + HashMap<String, Boolean> lstates = states.get(id); lstates.put(key, value); + states.put(id, lstates); } - - public static boolean getState(CommandSender sender, String key) - { - try - { + + public static boolean getState(CommandSender sender, String key) { + try { Module mod = ModuleLoader.getModule("DataManager"); + Method m = mod.getClass().getDeclaredMethod("getState_", CommandSender.class, String.class); m.setAccessible(true); + return (boolean) m.invoke(mod, sender, key); + } catch (Exception e) { + return false; } - catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - {} - return false; - } - - protected boolean getState_(CommandSender sender, String key) - { + } + + protected boolean getState_(CommandSender sender, String key) { String id = getID(sender); + HashMap<String, Boolean> lstates = states.get(id); - if (lstates == null) - return false; + if (lstates == null) return false; + return lstates.containsKey(key) ? lstates.get(key) : false; } - - protected boolean hasConfigChanged() - { + + protected boolean hasConfigChanged() { return old_hash != config_data.hashCode(); } - - protected void updateIndex() - { - if (!hasConfigChanged()) - return; + + protected void updateIndex() { + if (!hasConfigChanged()) return; + old_hash = config_data.hashCode(); module_index = new ArrayList<>(); - if (config_data.size() > 0) - { - for (Object key : config_data.keySet()) + + if (config_data.size() > 0) { + for (Object key : config_data.keySet()) { module_index.add(key.toString()); + } } } - + @SuppressWarnings("unchecked") - protected void fixJson() - { - for (Object key : config_data.keySet()) - { + protected void fixJson() { + for (Object key : config_data.keySet()) { JSONObject json = (JSONObject) config_data.get(key); - for (Object key2 : json.keySet()) - { + + for (Object key2 : json.keySet()) { Object o = json.get(key2); - if (!(o instanceof ConfigEntry)) - json.put(key2, new ConfigEntry((JSONObject) o)); + + if (!(o instanceof ConfigEntry)) json.put(key2, new ConfigEntry((JSONObject) o)); } + config_data.put(key, json); } } - - private List<String> subsetWhereStartsWith(List<String> list, String prefix) - { + + private List<String> subsetWhereStartsWith(List<String> list, String prefix) { ArrayList<String> subset = new ArrayList<>(); - if (prefix == null || prefix.equals("")) - return list; - for (String s : list) - if (s.toLowerCase().startsWith(prefix.toLowerCase())) + + if (prefix == null || prefix.equals("")) return list; + + for (String s : list) { + if (s.toLowerCase().startsWith(prefix.toLowerCase())) { subset.add(s); + } + } + return subset; } - + @SuppressWarnings("unchecked") @EventHandler - public void onTabComplete(TabCompleteEvent event) - { - if (event.getBuffer().toLowerCase().matches("^/?settings? .*") - || event.getBuffer().toLowerCase().matches("^/?configs? .*")) - { + public void onTabComplete(TabCompleteEvent event) { + if (event.getBuffer().toLowerCase().matches("^/?settings? .*") || event.getBuffer().toLowerCase().matches("^/?configs? .*")) { boolean argument_complete = event.getBuffer().endsWith(" "); String[] arguments = event.getBuffer().split(" "); + event.setCompletions(new ArrayList<String>()); - if (arguments.length == 1 || (arguments.length == 2 && !argument_complete)) + + if (arguments.length == 1 || (arguments.length == 2 && !argument_complete)) { event.setCompletions(subsetWhereStartsWith(subcommands, arguments.length >= 2 ? arguments[1] : "")); - else if (arguments.length == 2 || (arguments.length == 3 && !argument_complete)) - { - switch (arguments[1].toLowerCase()) - { + } else if (arguments.length == 2 || (arguments.length == 3 && !argument_complete)) { + switch (arguments[1].toLowerCase()) { case "list": case "get": - case "set": - { - event.setCompletions( - subsetWhereStartsWith(module_index, arguments.length == 3 ? arguments[2] : "")); + case "set": { + event.setCompletions(subsetWhereStartsWith(module_index, arguments.length == 3 ? arguments[2] : "")); break; } } - } - else if ((arguments.length == 3 && argument_complete) || (arguments.length == 4 && !argument_complete)) - { - switch (arguments[1].toLowerCase()) - { + } else if ((arguments.length == 3 && argument_complete) || (arguments.length == 4 && !argument_complete)) { + switch (arguments[1].toLowerCase()) { case "get": - case "set": - { + case "set": { Object o = config_data.get(arguments[2]); - if (o == null) - break; - event.setCompletions(subsetWhereStartsWith(new ArrayList<String>(((JSONObject) o).keySet()), - arguments.length == 4 ? arguments[3] : "")); + if (o == null) break; + event.setCompletions( + subsetWhereStartsWith(new ArrayList<String>(((JSONObject) o).keySet()), arguments.length == 4 ? arguments[3] : "")); break; } } - } - else - { - if (arguments[1].toLowerCase().equals("set")) - { + } else { + if (arguments[1].toLowerCase().equals("set")) { Object o = config_data.get(arguments[2]); - if (o == null) - return; + if (o == null) return; + Object o2 = ((JSONObject) o).get(arguments[3]); - if (o2 == null) - return; + if (o2 == null) return; + event.setCompletions(subsetWhereStartsWith(Arrays.asList(((ConfigEntry) o2).getCompleteOptions()), - arguments.length > 4 ? String.join(" ", Arrays.copyOfRange(arguments, 4, arguments.length)) - : "")); + arguments.length > 4 ? String.join(" ", Arrays.copyOfRange(arguments, 4, arguments.length)) : "")); } } } } - + @Command(hook = "config_list") - public boolean list(CommandSender sender) - { + public boolean list(CommandSender sender) { getLogger().message(sender, Arrays.toString(module_index.toArray(new String[] {}))); return true; } - + @Command(hook = "config_list2") - public boolean list(CommandSender sender, String module) - { + public boolean list(CommandSender sender, String module) { Object o = config_data.get(module); - if (o == null) - { + + if (o == null) { getLogger().message(sender, "This module has not registered any settings."); - } - else - { + } else { ArrayList<String> entries = new ArrayList<>(); JSONObject json = (JSONObject) o; - for (Object key : json.keySet()) - { + + for (Object key : json.keySet()) { String entry = key.toString(); entries.add("ยงe" + entry + "ยง7"); } - getLogger().message(sender, "The module ยงe" + module + "ยง7 has the following config settings: ", - Arrays.toString(entries.toArray(new String[] {}))); + + getLogger().message(sender, "The module ยงe" + module + "ยง7 has the following config settings: ", Arrays.toString(entries.toArray(new String[] {}))); } + return true; } - + @Command(hook = "config_get") - public boolean get(CommandSender sender, String module, String key) - { - getLogger().message(sender, new String[] {"ยงe" + module + "." + key + "ยง7 currently holds the value:", - getConfigOrDefault_(module, key, "<empty>").toString()}); + public boolean get(CommandSender sender, String module, String key) { + getLogger().message(sender, + new String[] { "ยงe" + module + "." + key + "ยง7 currently holds the value:", getConfigOrDefault_(module, key, "<empty>").toString() }); return true; } - + @Command(hook = "config_set") - public boolean set(CommandSender sender, String module, String key, String value) - { - if (setConfig_(module, key, value)) - { + public boolean set(CommandSender sender, String module, String key, String value) { + if (setConfig_(module, key, value)) { getLogger().message(sender, "Successfully changed the value for ยงe" + module + "." + key); + } else { + getLogger().message(sender, true, "ยง7\"ยงe" + value + "ยง7\" is not a valid value for setting ยงe" + module + "." + key); } - else - { - getLogger().message(sender, true, - "ยง7\"ยงe" + value + "ยง7\" is not a valid value for setting ยงe" + module + "." + key); - } + return true; } - + @Command(hook = "config_remove_all") - public boolean remove_all(CommandSender sender, String module) - { - if (removeAllConfig_(module)) - getLogger().message(sender, "Successfully deleted all config entries for module ยงe" + module + "ยง7!"); - else - getLogger().message(sender, true, "Could not delete all config entries for module ยงe" + module + "ยง7!"); + public boolean remove_all(CommandSender sender, String module) { + if (removeAllConfig_(module)) getLogger().message(sender, "Successfully deleted all config entries for module ยงe" + module + "ยง7!"); + else getLogger().message(sender, true, "Could not delete all config entries for module ยงe" + module + "ยง7!"); + return true; } - - public static Object getConfigOrDefault(String key, Object fallback) - { + + public static Object getConfigOrDefault(String key, Object fallback) { return getConfigOrDefault(Utils.getCaller("DataManager"), key, fallback); } - - public static Object getConfigOrDefault(String module, String key, Object fallback) - { - try - { + + public static Object getConfigOrDefault(String module, String key, Object fallback) { + try { Module mod = ModuleLoader.getModule("DataManager"); - Method m = mod.getClass().getDeclaredMethod("getConfigOrDefault_", String.class, String.class, - Object.class); + + Method m = mod.getClass().getDeclaredMethod("getConfigOrDefault_", String.class, String.class, Object.class); m.setAccessible(true); + return m.invoke(mod, module, key, fallback); + } catch (Exception e) { + return fallback; } - catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - {} - return fallback; - } - - protected Object getConfigOrDefault_(String module, String key, Object fallback) - { + } + + protected Object getConfigOrDefault_(String module, String key, Object fallback) { Object o = getConfigData_(module, key); return o == null ? fallback : o; } - - protected Object getConfigData_(String module, String key) - { + + protected Object getConfigData_(String module, String key) { module = module.toLowerCase(); Object o = config_data.get(module); - if (o == null) - return null; - else - { - JSONObject json = (JSONObject) o; - Object o2 = json.get(key); - if (o2 == null) - return null; - return ((ConfigEntry) o2).getValue(); - } + + if (o == null) return null; + + JSONObject json = (JSONObject) o; + Object o2 = json.get(key); + + if (o2 == null) return null; + + return ((ConfigEntry) o2).getValue(); } - - protected ConfigEntry getConfigEntry_(String module, String key) - { + + protected ConfigEntry getConfigEntry_(String module, String key) { module = module.toLowerCase(); Object o = config_data.get(module); - if (o == null) - return null; - else - { - JSONObject json = (JSONObject) o; - return (ConfigEntry) json.get(key); - } + + if (o == null) return null; + + JSONObject json = (JSONObject) o; + return (ConfigEntry) json.get(key); } - - public static void setConfig(String key, String value) - { + + public static void setConfig(String key, String value) { setConfig(Utils.getCaller("DataManager"), key, value, null); } - - public static void setConfig(String key, String value, String[] complete_options) - { + + public static void setConfig(String key, String value, String[] complete_options) { setConfig(Utils.getCaller("DataManager"), key, value, complete_options); } - - public static void setConfig(String module, String key, String value, String[] complete_options) - { - try - { + + public static void setConfig(String module, String key, String value, String[] complete_options) { + try { Module mod = ModuleLoader.getModule("DataManager"); - Method m = mod.getClass().getDeclaredMethod("setConfig_", String.class, String.class, String.class, - String[].class); + + Method m = mod.getClass().getDeclaredMethod("setConfig_", String.class, String.class, String.class, String[].class); m.setAccessible(true); + m.invoke(mod, module, key, value, complete_options); - } - catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - {} + } catch (Exception e) {} } - + @SuppressWarnings("unchecked") - protected boolean setConfig_(String module, String key, String value) - { + protected boolean setConfig_(String module, String key, String value) { module = module.toLowerCase(); ConfigEntry entry = getConfigEntry_(module, key); - if (entry == null) - entry = new ConfigEntry(value, null); - if (entry.attemptSet(value)) - { - Object o = config_data.get(module); - JSONObject json; - if (o == null) - json = new JSONObject(); - else - json = (JSONObject) o; - json.put(key, entry); - config_data.put(module, json); - updateIndex(); - return true; - } - else - return false; + + if (entry == null) entry = new ConfigEntry(value, null); + if (!entry.attemptSet(value)) return false; + + Object o = config_data.get(module); + JSONObject json; + + if (o == null) json = new JSONObject(); + else json = (JSONObject) o; + + json.put(key, entry); + config_data.put(module, json); + + updateIndex(); + return true; } - + @SuppressWarnings("unchecked") - protected void setConfig_(String module, String key, String value, String[] complete_options) - { + protected void setConfig_(String module, String key, String value, String[] complete_options) { module = module.toLowerCase(); ConfigEntry entry = new ConfigEntry(value, complete_options); + Object o = config_data.get(module); JSONObject json; - if (o == null) - json = new JSONObject(); - else - json = (JSONObject) o; + + if (o == null) json = new JSONObject(); + else json = (JSONObject) o; + json.put(key, entry); config_data.put(module, json); + updateIndex(); } - - public static boolean removeConfig(String key) - { + + public static boolean removeConfig(String key) { return removeConfig(Utils.getCaller("DataManager"), key); } - - public static boolean removeConfig(String module, String key) - { - try - { + + public static boolean removeConfig(String module, String key) { + try { Module mod = ModuleLoader.getModule("DataManager"); + Method m = mod.getClass().getDeclaredMethod("removeConfig_", String.class, String.class); m.setAccessible(true); + return (boolean) m.invoke(mod, module, key); + } catch (Exception e) { + return false; } - catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - {} - return false; } - + @SuppressWarnings("unchecked") - protected boolean removeConfig_(String module, String key) - { + protected boolean removeConfig_(String module, String key) { module = module.toLowerCase(); - if (key == null) - return removeAllConfig_(module); + + if (key == null) return removeAllConfig_(module); + Object o = config_data.get(module); JSONObject json; - if (o == null) - return false; - else - json = (JSONObject) o; + + if (o == null) return false; + else json = (JSONObject) o; + json.remove(key); - if (json.size() == 0) - config_data.remove(module); - else - config_data.put(module, json); + + if (json.size() == 0) config_data.remove(module); + else config_data.put(module, json); + updateIndex(); return true; } - - protected boolean removeAllConfig_(String module) - { + + protected boolean removeAllConfig_(String module) { module = module.toLowerCase(); - if (config_data.remove(module) == null) - return false; + + if (config_data.remove(module) == null) return false; + updateIndex(); return true; } } -class ConfigEntry -{ +class ConfigEntry { private String value; private String[] complete_options; - - public ConfigEntry(String value, String[] complete_options) - { + + public ConfigEntry(String value, String[] complete_options) { this.value = value; this.complete_options = complete_options; } - + @SuppressWarnings("unchecked") - public ConfigEntry(JSONObject json) - { - this(json.get("value").toString(), - (String[]) ((JSONArray) json.get("complete_options")).toArray(new String[] {})); - } - - protected boolean attemptSet(String value) - { - if (complete_options == null || complete_options.length == 0) - { + public ConfigEntry(JSONObject json) { + this(json.get("value").toString(), (String[]) ((JSONArray) json.get("complete_options")).toArray(new String[] {})); + } + + protected boolean attemptSet(String value) { + if (complete_options == null || complete_options.length == 0) { this.value = value; return true; - } - else - { - for (String s : complete_options) - { - if (s.equals(value)) - { + } else { + for (String s : complete_options) { + if (s.equals(value)) { this.value = value; return true; } } + return false; } } - - protected String[] getCompleteOptions() - { + + protected String[] getCompleteOptions() { return complete_options; } - - protected String getValue() - { + + protected String getValue() { return value; } - + @Override - public String toString() - { + public String toString() { return "{\"value\":\"" + value + "\",\"complete_options\":" - + (complete_options == null || complete_options.length == 0 ? "[]" - : "[\"" + String.join("\",\"", complete_options) + "\"]") - + "}"; + + (complete_options == null || complete_options.length == 0 ? "[]" : "[\"" + String.join("\",\"", complete_options) + "\"]") + "}"; } } diff --git a/src/main/java/com/redstoner/modules/datamanager/module.info b/src/main/java/com/redstoner/modules/datamanager/module.info new file mode 100644 index 0000000..713107d --- /dev/null +++ b/src/main/java/com/redstoner/modules/datamanager/module.info @@ -0,0 +1,3 @@ +displayName: Datamanager +category: Other +description: Adds easy module and player based data management
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/discord/Discord.cmd b/src/main/java/com/redstoner/modules/discord/Discord.cmd new file mode 100644 index 0000000..848d483 --- /dev/null +++ b/src/main/java/com/redstoner/modules/discord/Discord.cmd @@ -0,0 +1,8 @@ +command discord { + perm utils.discord; + [empty] { + help Info, Register Instructions, and Token for the Discord; + run discord; + type player; + } +} diff --git a/src/main/java/com/redstoner/modules/discord/Discord.java b/src/main/java/com/redstoner/modules/discord/Discord.java new file mode 100644 index 0000000..22999ec --- /dev/null +++ b/src/main/java/com/redstoner/modules/discord/Discord.java @@ -0,0 +1,126 @@ +package com.redstoner.modules.discord; + +import java.io.IOException; +import java.security.SecureRandom; + +import com.redstoner.exceptions.NonSaveableConfigException; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.nemez.cmdmgr.Command; +import com.redstoner.annotations.Commands; +import com.redstoner.annotations.Version; +import com.redstoner.misc.CommandHolderType; +import com.redstoner.misc.mysql.Config; +import com.redstoner.misc.mysql.MysqlHandler; +import com.redstoner.misc.mysql.elements.ConstraintOperator; +import com.redstoner.misc.mysql.elements.MysqlConstraint; +import com.redstoner.misc.mysql.elements.MysqlDatabase; +import com.redstoner.misc.mysql.elements.MysqlField; +import com.redstoner.misc.mysql.elements.MysqlTable; +import com.redstoner.misc.mysql.types.number.TinyInt; +import com.redstoner.misc.mysql.types.text.VarChar; +import com.redstoner.modules.Module; + +import net.nemez.chatapi.click.Message; + +@Commands(CommandHolderType.File) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) +public class Discord implements Module { + private MysqlTable table; + + private String inviteLink; + + private final String tokenCharacters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + private SecureRandom rnd = new SecureRandom(); + + @Override + public boolean onEnable() { + Config config; + + try { + config = Config.getConfig("Discord.json"); + } catch (IOException | org.json.simple.parser.ParseException e1) { + e1.printStackTrace(); + return false; + } + + if (config == null || !config.containsKey("database") || !config.containsKey("table") || !config.containsKey("inviteLink")) { + getLogger().error("Could not load the Discord config file, disabling!"); + + config.put("database", "redstoner"); + config.put("table", "discord"); + config.put("inviteLink", "https://discord.gg/example"); + + try { + config.save(); + } catch (IOException | NonSaveableConfigException e) {} + + return false; + } + + inviteLink = config.get("inviteLink"); + + try { + MysqlDatabase database = MysqlHandler.INSTANCE.getDatabase(config.get("database") + "?autoReconnect=true"); + + MysqlField token = new MysqlField("token", new VarChar(8), false); + MysqlField uuid = new MysqlField("uuid", new VarChar(36), false); + MysqlField used = new MysqlField("used", new TinyInt(1), false); + + database.createTableIfNotExists((String) config.get("table"), token, uuid, used); + + table = database.getTable(config.get("table")); + } catch (NullPointerException e) { + getLogger().error("Could not use the Discord config, aborting!"); + return false; + } + + return true; + } + + @Command(hook = "discord") + public void discord(CommandSender sender) { + Player p = (Player) sender; + String pUUID = p.getUniqueId().toString().replaceAll("-", ""); + + String token = null; + int tries = 0; + + while (token == null) { + token = randomToken(8); + Object[] results = table.get("token", new MysqlConstraint("token", ConstraintOperator.EQUAL, token)); + + if (results.length > 0) { + token = null; + tries++; + } + + if (tries > 10) break; + } + + if (token == null) { + new Message(sender, null).appendText( + "\n&4Could not find an unused token in 10 tries (a 1 in over 20 trillion chance)! Please take a screenshot and run the command again!") + .send(); + return; + } + + table.delete(new MysqlConstraint("uuid", ConstraintOperator.EQUAL, pUUID)); + table.insert(pUUID, token); + + new Message(sender, null).appendText("\n&cRedstoner&7 has a &2Discord&7 Now! \nClick ") + .appendLinkHover("&e" + inviteLink, inviteLink, "&aClick to Join").appendText("&7 to join. \n\nTo sync you rank, copy ") + .appendSuggestHover("&e" + token, token, "&aClick to Copy").appendText("&7 into &3#rank-sync&7.\n").send(); + } + + private String randomToken(int length) { + StringBuilder sb = new StringBuilder(length); + + for (int i = 0; i < length; i++) { + sb.append(tokenCharacters.charAt(rnd.nextInt(tokenCharacters.length()))); + } + + return sb.toString(); + } +} diff --git a/src/main/java/com/redstoner/modules/discord/module.info b/src/main/java/com/redstoner/modules/discord/module.info new file mode 100644 index 0000000..5a75ac8 --- /dev/null +++ b/src/main/java/com/redstoner/modules/discord/module.info @@ -0,0 +1,3 @@ +displayName: Discord +category: External +description: Links your minecraft account to your discord account to sync your rank.
\ No newline at end of file diff --git a/src/com/redstoner/modules/friends/Friends.cmd b/src/main/java/com/redstoner/modules/friends/Friends.cmd index ea205c9..ea205c9 100644 --- a/src/com/redstoner/modules/friends/Friends.cmd +++ b/src/main/java/com/redstoner/modules/friends/Friends.cmd diff --git a/src/com/redstoner/modules/friends/Friends.java b/src/main/java/com/redstoner/modules/friends/Friends.java index 2eb9728..9e06a3f 100644 --- a/src/com/redstoner/modules/friends/Friends.java +++ b/src/main/java/com/redstoner/modules/friends/Friends.java @@ -1,6 +1,5 @@ package com.redstoner.modules.friends; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Set; import java.util.UUID; @@ -30,331 +29,323 @@ import com.redstoner.modules.datamanager.DataManager; @AutoRegisterListener @Commands(CommandHolderType.File) -@Version(major = 4, minor = 0, revision = 0, compatible = 4) -public class Friends implements CoreModule -{ +@Version(major = 5, minor = 0, revision = 0, compatible = 4) +public class Friends implements CoreModule { @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerJoin(PlayerJoinEvent e) - { + public void onPlayerJoin(PlayerJoinEvent e) { JSONArray friended_by = (JSONArray) DataManager.getOrDefault(e.getPlayer(), "friended_by", new JSONArray()); - for (Object obj : friended_by) - { + + for (Object obj : friended_by) { UUID uuid = UUID.fromString((String) obj); Player p = Bukkit.getPlayer(uuid); - if (p != null && p.canSee(e.getPlayer())) - { + + if (p != null && p.canSee(e.getPlayer())) { getLogger().message(p, "Your friend &e" + e.getPlayer().getDisplayName() + "&7 just joined!"); p.playSound(p.getLocation(), Sound.ENTITY_CHICKEN_EGG, 1, 1); } } - JSONArray notifications = (JSONArray) DataManager.getOrDefault(e.getPlayer(), "scheduled_notifications", - new JSONArray()); - for (Object obj : notifications) + + JSONArray notifications = (JSONArray) DataManager.getOrDefault(e.getPlayer(), "scheduled_notifications", new JSONArray()); + + for (Object obj : notifications) { getLogger().message(e.getPlayer(), (String) obj); + } } - + @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerLeave(PlayerQuitEvent e) - { + public void onPlayerLeave(PlayerQuitEvent e) { JSONArray friended_by = (JSONArray) DataManager.getOrDefault(e.getPlayer(), "friended_by", new JSONArray()); - for (Object obj : friended_by) - { + + for (Object obj : friended_by) { UUID uuid = UUID.fromString((String) obj); Player p = Bukkit.getPlayer(uuid); - if (p != null && p.canSee(e.getPlayer())) - { + + if (p != null && p.canSee(e.getPlayer())) { getLogger().message(p, "Your friend &e" + e.getPlayer().getDisplayName() + "&7 just left!"); p.playSound(p.getLocation(), Sound.ENTITY_CHICKEN_EGG, 1, 1); } } } - - @SuppressWarnings({"unchecked", "deprecation"}) + + @SuppressWarnings({ "unchecked", "deprecation" }) @Command(hook = "add") - public boolean add(CommandSender sender, String target) - { - if (target.equalsIgnoreCase("CONSOLE")) - { + public boolean add(CommandSender sender, String target) { + if (target.equalsIgnoreCase("CONSOLE")) { getLogger().message(sender, true, "You can't add console to your friends!"); return true; } + OfflinePlayer p = Bukkit.getPlayer(target); - if (p == null) - p = Bukkit.getOfflinePlayer(target); - if (p == null) - { + + if (p == null) p = Bukkit.getOfflinePlayer(target); + if (p == null) { getLogger().message(sender, true, "That player couldn't be found!"); return true; } + JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "friends", new JSONArray())); - if (friends.contains(p.getUniqueId().toString())) - { + + if (friends.contains(p.getUniqueId().toString())) { getLogger().message(sender, true, "You are already friends with this person!"); return true; } + friends.add(p.getUniqueId().toString()); + DataManager.setData(sender, "friends", friends); DataManager.save(sender); - JSONArray friended_by = ((JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "friended_by", - new JSONArray())); + + JSONArray friended_by = ((JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "friended_by", new JSONArray())); friended_by.add(getID(sender)); + DataManager.setData(p.getUniqueId().toString(), "friended_by", friended_by); + DataManager.save(p.getUniqueId().toString()); + getLogger().message(sender, "You are now friends with &e" + p.getName() + "&7!"); - if (p instanceof Player) - { + + if (p instanceof Player) { getLogger().message((Player) p, "&e" + Utils.getName(sender) + "&7 added you as a friend!"); - } - else - { - JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), - "scheduled_notifications", new JSONArray()); + } else { + JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "scheduled_notifications", new JSONArray()); + notifications.add("&e" + Utils.getName(sender) + "&7 added you as a friend!"); notifications.remove("&e" + Utils.getName(sender) + "&7 removed you as a friend!"); + DataManager.setData(p.getUniqueId().toString(), "scheduled_notifications", notifications); } + return true; } - - @SuppressWarnings({"deprecation", "unchecked"}) + + @SuppressWarnings({ "deprecation", "unchecked" }) @Command(hook = "add_grouped") - public boolean add_grouped(CommandSender sender, String target, String group) - { - if (target.equalsIgnoreCase("CONSOLE")) - { + public boolean add_grouped(CommandSender sender, String target, String group) { + if (target.equalsIgnoreCase("CONSOLE")) { getLogger().message(sender, true, "You can't add console to your friends!"); return true; } + OfflinePlayer p = Bukkit.getPlayer(target); - if (p == null) - p = Bukkit.getOfflinePlayer(target); - if (p == null) - { + + if (p == null) p = Bukkit.getOfflinePlayer(target); + if (p == null) { getLogger().message(sender, true, "That player couldn't be found!"); return true; } + JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "groups." + group, new JSONArray())); - if (friends.contains(p.getUniqueId().toString())) - { + + if (friends.contains(p.getUniqueId().toString())) { getLogger().message(sender, true, "This person already is part of that friendsgroup!"); return true; } + friends.add(p.getUniqueId().toString()); + DataManager.setData(sender, "groups." + group, friends); DataManager.save(sender); + getLogger().message(sender, "&e" + p.getName() + "&7 is now part of the group &e" + group + "&7!"); - if (p instanceof Player) - { - getLogger().message((Player) p, - "&e" + Utils.getName(sender) + " &7added you to their friendsgroup &e" + group + "&7!"); - } - else - { - JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), - "scheduled_notifications", new JSONArray()); + + if (p instanceof Player) { + getLogger().message((Player) p, "&e" + Utils.getName(sender) + " &7added you to their friendsgroup &e" + group + "&7!"); + } else { + JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "scheduled_notifications", new JSONArray()); + notifications.add("&e" + Utils.getName(sender) + " &7added you to their friendsgroup &e" + group + "&7!"); - notifications - .remove("&e" + Utils.getName(sender) + " &7removed you from their friendsgroup &e" + group + "&7!"); + notifications.remove("&e" + Utils.getName(sender) + " &7removed you from their friendsgroup &e" + group + "&7!"); + DataManager.setData(p.getUniqueId().toString(), "scheduled_notifications", notifications); } + return true; } - - @SuppressWarnings({"deprecation", "unchecked"}) + + @SuppressWarnings({ "deprecation", "unchecked" }) @Command(hook = "del") - public boolean del(CommandSender sender, String target) - { - if (target.equalsIgnoreCase("CONSOLE")) - { + public boolean del(CommandSender sender, String target) { + if (target.equalsIgnoreCase("CONSOLE")) { getLogger().message(sender, true, "You can't add console to your friends!"); return true; } + OfflinePlayer p = Bukkit.getPlayer(target); - if (p == null) - p = Bukkit.getOfflinePlayer(target); - if (p == null) - { + + if (p == null) p = Bukkit.getOfflinePlayer(target); + if (p == null) { getLogger().message(sender, true, "That player couldn't be found!"); return true; } + JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "friends", new JSONArray())); - if (friends.contains(p.getUniqueId().toString())) - { - getLogger().message(sender, true, "You are already friends with this person!"); + + if (!friends.contains(p.getUniqueId().toString())) { + getLogger().message(sender, true, "You are not friends with that player!"); return true; } + friends.remove(p.getUniqueId().toString()); + DataManager.setData(sender, "friends", friends); DataManager.save(sender); - JSONArray friended_by = ((JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "friended_by", - new JSONArray())); + + JSONArray friended_by = ((JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "friended_by", new JSONArray())); + DataManager.setData(p.getUniqueId().toString(), "friended_by", friended_by); friended_by.remove(getID(sender)); + DataManager.save(p.getUniqueId().toString()); - getLogger().message(sender, "You are now friends with &e" + p.getName() + "&7!"); - if (p instanceof Player) - { - getLogger().message((Player) p, "&e" + Utils.getName(sender) + "&7 added you as a friend!"); - } - else - { - JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), - "scheduled_notifications", new JSONArray()); + + getLogger().message(sender, "You are no longer friends with &e" + p.getName() + "&7!"); + + if (p instanceof Player) { + getLogger().message((Player) p, "&e" + Utils.getName(sender) + "&7 removed you as a friend!"); + } else { + JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "scheduled_notifications", new JSONArray()); + notifications.add("&e" + Utils.getName(sender) + "&7 removed you as a friend!"); notifications.remove("&e" + Utils.getName(sender) + "&7 added you as a friend!"); + DataManager.setData(p.getUniqueId().toString(), "scheduled_notifications", notifications); } + return true; } - - @SuppressWarnings({"deprecation", "unchecked"}) + + @SuppressWarnings({ "deprecation", "unchecked" }) @Command(hook = "del_grouped") - public boolean del_grouped(CommandSender sender, String target, String group) - { - if (target.equalsIgnoreCase("CONSOLE")) - { + public boolean del_grouped(CommandSender sender, String target, String group) { + if (target.equalsIgnoreCase("CONSOLE")) { getLogger().message(sender, true, "You can't add console to your friends!"); return true; } + OfflinePlayer p = Bukkit.getPlayer(target); - if (p == null) - p = Bukkit.getOfflinePlayer(target); - if (p == null) - { + + if (p == null) p = Bukkit.getOfflinePlayer(target); + if (p == null) { getLogger().message(sender, true, "That player couldn't be found!"); return true; } + JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "groups." + group, new JSONArray())); - if (friends.contains(p.getUniqueId().toString())) - { - getLogger().message(sender, true, "This person already is part of that friendsgroup!"); + + if (!friends.contains(p.getUniqueId().toString())) { + getLogger().message(sender, true, "This person isn't a part of that friendsgroup!"); return true; } + friends.add(p.getUniqueId().toString()); + DataManager.setData(sender, "groups." + group, friends); DataManager.save(sender); - getLogger().message(sender, "&e" + p.getName() + "&7 is now part of the group &e" + group + "&7!"); - if (p instanceof Player) - { - getLogger().message((Player) p, - "&e" + Utils.getName(sender) + " &7added you to their friendsgroup &e" + group + "&7!"); - } - else - { - JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), - "scheduled_notifications", new JSONArray()); - notifications - .add("&e" + Utils.getName(sender) + " &7removed you from their friendsgroup &e" + group + "&7!"); - notifications - .remove("&e" + Utils.getName(sender) + " &7added you to their friendsgroup &e" + group + "&7!"); + + getLogger().message(sender, "&e" + p.getName() + "&7 is no longer a part of the group &e" + group + "&7!"); + + if (p instanceof Player) { + getLogger().message((Player) p, "&e" + Utils.getName(sender) + " &7removed you from their friendsgroup &e" + group + "&7!"); + } else { + JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "scheduled_notifications", new JSONArray()); + + notifications.add("&e" + Utils.getName(sender) + " &7removed you from their friendsgroup &e" + group + "&7!"); + notifications.remove("&e" + Utils.getName(sender) + " &7added you to their friendsgroup &e" + group + "&7!"); + DataManager.setData(p.getUniqueId().toString(), "scheduled_notifications", notifications); } + return true; } - + @Command(hook = "list") - public boolean list(CommandSender sender) - { + public boolean list(CommandSender sender) { JSONArray friends = (JSONArray) DataManager.getOrDefault(sender, "friends", new JSONArray()); - if (friends.size() == 0) - { - getLogger().message(sender, true, "You didn't add anyone to your friendslist yet."); - } - else - { + + if (friends.size() == 0) { + getLogger().message(sender, true, "You didn't add anyone to your friends list yet."); + } else { StringBuilder sb = new StringBuilder(); - for (Object o : friends.toArray()) - { + + for (Object o : friends.toArray()) { UUID id = UUID.fromString((String) o); Player p = Bukkit.getPlayer(id); - if (p != null) - sb.append(p.getDisplayName() + "&7, "); - else - sb.append("&9" + Bukkit.getOfflinePlayer(id).getName() + "&7, "); + + if (p != null) sb.append(p.getDisplayName() + "&7, "); + else sb.append("&9" + Bukkit.getOfflinePlayer(id).getName() + "&7, "); } + String out = sb.toString().replaceAll(", $", ""); getLogger().message(sender, "You have a total of &e" + friends.size() + "&7 friends:", out); } + return true; } - + @Command(hook = "list_group") - public boolean list_group(CommandSender sender, String group) - { + public boolean list_group(CommandSender sender, String group) { JSONArray friends = (JSONArray) DataManager.getOrDefault(sender, "group." + group, new JSONArray()); - if (friends.size() == 0) - { + + if (friends.size() == 0) { getLogger().message(sender, true, "You didn't add anyone to this group yet."); - } - else - { + } else { StringBuilder sb = new StringBuilder(); - for (Object o : friends.toArray()) - { + + for (Object o : friends.toArray()) { UUID id = UUID.fromString((String) o); Player p = Bukkit.getPlayer(id); - if (p != null) - sb.append(p.getDisplayName() + "&7, "); - else - sb.append("&9" + Bukkit.getOfflinePlayer(id).getName() + "&7, "); + + if (p != null) sb.append(p.getDisplayName() + "&7, "); + else sb.append("&9" + Bukkit.getOfflinePlayer(id).getName() + "&7, "); } + String out = sb.toString().replaceAll(", $", ""); getLogger().message(sender, "You have a total of &e" + friends.size() + "&7 friends added to this group:", out); } + return true; } - + @Command(hook = "list_groups") - public boolean list_groups(CommandSender sender) - { + public boolean list_groups(CommandSender sender) { JSONObject raw = (JSONObject) DataManager.getOrDefault(sender, null, new JSONObject()); Set<?> keys = raw.keySet(); - if (keys.size() == 0 || (keys.contains("friends") && keys.size() == 1)) - { + + if (keys.size() == 0 || (keys.contains("friends") && keys.size() == 1)) { getLogger().message(sender, true, "You don't have any custom groups made yet."); return true; - } - else - { + } else { StringBuilder sb = new StringBuilder(); - for (Object o : keys) - { - sb.append("&e" + (String) o + "&7, "); + + for (Object o : keys) { + sb.append("&e" + ((String) o).substring(6) + "&7, "); } + String out = sb.toString().replaceAll(", $", ""); getLogger().message(sender, "", out); } + return true; } - - public static boolean isFriend(CommandSender player, CommandSender friend) - { + + public static boolean isFriend(CommandSender player, CommandSender friend) { return isFriend(player, friend, null); } - - public static boolean isFriend(CommandSender player, CommandSender friend, String condition) - { - try - { + + public static boolean isFriend(CommandSender player, CommandSender friend, String condition) { + try { Module mod = ModuleLoader.getModule("Friends"); Method m = mod.getClass().getDeclaredMethod("isFriend_", String.class); + return (boolean) m.invoke(mod, player, friend, condition); + } catch (Exception e) { + return false; } - catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - {} - return false; } - - protected boolean isFriend_(CommandSender player, CommandSender friend, String group) - { - if (group == null) - group = "friends"; - else if (!group.startsWith("group.")) - group = "group." + group; + + protected boolean isFriend_(CommandSender player, CommandSender friend, String group) { + if (group == null) group = "friends"; + else if (!group.startsWith("group.")) group = "group." + group; + JSONArray array = (JSONArray) DataManager.getOrDefault(player, group, new JSONArray()); return array.contains(getID(friend)); } - - private final String getID(CommandSender sender) - { - if (sender instanceof Player) - return ((Player) sender).getUniqueId().toString(); - else - return sender.getName(); + + private final String getID(CommandSender sender) { + if (sender instanceof Player) return ((Player) sender).getUniqueId().toString(); + else return sender.getName(); } } diff --git a/src/main/java/com/redstoner/modules/friends/module.info b/src/main/java/com/redstoner/modules/friends/module.info new file mode 100644 index 0000000..41062ba --- /dev/null +++ b/src/main/java/com/redstoner/modules/friends/module.info @@ -0,0 +1,3 @@ +displayName: Friends +category: Other +description: Notifies players when a friend comes online. Also used by other modules for various features
\ No newline at end of file diff --git a/src/com/redstoner/modules/ignore/Ignore.cmd b/src/main/java/com/redstoner/modules/ignore/Ignore.cmd index 382846b..d8360d0 100644 --- a/src/com/redstoner/modules/ignore/Ignore.cmd +++ b/src/main/java/com/redstoner/modules/ignore/Ignore.cmd @@ -1,20 +1,19 @@ command ignore { + perm utils.ignore; [string:player] { - perm utils.ignore; run ignore player; type player; help Ignores or Unignores a player.; } [empty] { - perm utils.ignore; run list; type player; help Lists everyone you ignore.; } } command unignore { + perm utils.ignore; [string:player] { - perm utils.ignore; run unignore player; type player; help Unignore a player.; diff --git a/src/com/redstoner/modules/ignore/Ignore.java b/src/main/java/com/redstoner/modules/ignore/Ignore.java index c830700..0596bb9 100644 --- a/src/com/redstoner/modules/ignore/Ignore.java +++ b/src/main/java/com/redstoner/modules/ignore/Ignore.java @@ -1,6 +1,5 @@ package com.redstoner.modules.ignore; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.UUID; @@ -26,134 +25,112 @@ import net.nemez.chatapi.click.Message; @Commands(CommandHolderType.File) @AutoRegisterListener -@Version(major = 4, minor = 0, revision = 0, compatible = 4) -public class Ignore implements Module -{ - +@Version(major = 5, minor = 0, revision = 0, compatible = 4) +public class Ignore implements Module { @Command(hook = "unignore", async = AsyncType.ALWAYS) - public boolean unignore(CommandSender sender, String player) - { + public boolean unignore(CommandSender sender, String player) { return ignore(sender, player, false); } - + @Command(hook = "ignore", async = AsyncType.ALWAYS) - public boolean ignore(CommandSender sender, String player) - { + public boolean ignore(CommandSender sender, String player) { return ignore(sender, player, true); } - + @Command(hook = "list", async = AsyncType.ALWAYS) - public boolean list(CommandSender sender) - { + public boolean list(CommandSender sender) { getLogger().message(sender, "ยง7You are currently ignoring:"); - + JSONArray ignores = (JSONArray) DataManager.getOrDefault(sender, "ignores", new JSONArray()); - - if (ignores.isEmpty()) - { + + if (ignores.isEmpty()) { new Message(sender, null).appendText(" ยง7Nobody \\o/").send(); return true; } - + String players; OfflinePlayer pi = Bukkit.getOfflinePlayer(UUID.fromString((String) ignores.get(0))); players = " ยง3" + pi.getName() + "ยง7"; - - for (int i = 1; i < ignores.size(); i++) - { + + for (int i = 1; i < ignores.size(); i++) { OfflinePlayer p = Bukkit.getOfflinePlayer(UUID.fromString((String) ignores.get(i))); players += ", ยง3" + p.getName() + "ยง7"; } - + Message m = new Message(sender, null); m.appendText(players); m.send(); + return true; } - - @SuppressWarnings({"unchecked", "deprecation"}) - public boolean ignore(CommandSender sender, String player, boolean allowIgnore) - { + + @SuppressWarnings({ "unchecked", "deprecation" }) + public boolean ignore(CommandSender sender, String player, boolean allowIgnore) { JSONArray ignores = (JSONArray) DataManager.getOrDefault(sender, "ignores", new JSONArray()); - + Player p = Utils.isUUID(player) ? Bukkit.getPlayer(UUID.fromString(player)) : Bukkit.getPlayer(player); - - OfflinePlayer op = Utils.isUUID(player) ? Bukkit.getOfflinePlayer(UUID.fromString(player)) - : Bukkit.getOfflinePlayer(player); - + + OfflinePlayer op = Utils.isUUID(player) ? Bukkit.getOfflinePlayer(UUID.fromString(player)) : Bukkit.getOfflinePlayer(player); + String pName = p != null ? p.getDisplayName() : op.getName(); String pUUID = p != null ? p.getUniqueId().toString() : op.getUniqueId().toString(); String sUUID = ((Player) sender).getUniqueId().toString(); - - if (pUUID.equals(sUUID)) - { + + if (pUUID.equals(sUUID)) { getLogger().message(sender, true, "ยง7You can't ignore yourself :P"); return true; } - - if (ignores.contains(pUUID)) - { + + if (ignores.contains(pUUID)) { ignores.remove(pUUID); getLogger().message(sender, "ยง7You are no longer ignoring ยง3" + pName + "ยง7."); - } - else if (!allowIgnore) - { + } else if (!allowIgnore) { getLogger().message(sender, "ยง7You weren't ignoring ยง3" + pName + "ยง7."); - } - else - { + } else { ignores.add(pUUID); getLogger().message(sender, "ยง7You are now ignoring ยง3" + pName + "ยง7."); } + DataManager.setData(sender, "ignores", ignores); + return true; - + } - - public static BroadcastFilter getIgnoredBy(CommandSender sender) - { - try - { + + public static BroadcastFilter getIgnoredBy(CommandSender sender) { + try { Module mod = ModuleLoader.getModule("Ignore"); + Method m = mod.getClass().getDeclaredMethod("_getIgnoredBy", CommandSender.class); m.setAccessible(true); + return (BroadcastFilter) m.invoke(mod, sender); + } catch (Exception e) { + return null; } - catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException - | InvocationTargetException e) - {} - return null; } - + @SuppressWarnings("unused") - private BroadcastFilter _getIgnoredBy(CommandSender sender) - { - return new BroadcastFilter() - { - - private final String sUUID = sender instanceof Player ? ((Player) sender).getUniqueId().toString() - : "CONSOLE"; - + private BroadcastFilter _getIgnoredBy(CommandSender sender) { + return new BroadcastFilter() { + private final String sUUID = sender instanceof Player ? ((Player) sender).getUniqueId().toString() : "CONSOLE"; + @Override - public boolean sendTo(CommandSender recipient) - { - if (sUUID.equals("CONSOLE")) - return true; - - if (recipient instanceof Player) - { + public boolean sendTo(CommandSender recipient) { + if (sUUID.equals("CONSOLE")) return true; + + if ((recipient instanceof Player)) { + Player player = (Player) recipient; - - if (sender.hasPermission("utils.ignore.override")) - return true; - + + if (sender.hasPermission("utils.ignore.override")) return true; + JSONArray ignores = (JSONArray) DataManager.getOrDefault(recipient, "ignores", new JSONArray()); return !ignores.contains(sUUID); } - else - return true; + return true; + } }; } - } diff --git a/src/main/java/com/redstoner/modules/ignore/module.info b/src/main/java/com/redstoner/modules/ignore/module.info new file mode 100644 index 0000000..79bb1fb --- /dev/null +++ b/src/main/java/com/redstoner/modules/ignore/module.info @@ -0,0 +1,3 @@ +displayName: Ignore +category: Chat +description: Allows someone to ignore players' chat messages and integrates with other modules
\ No newline at end of file diff --git a/src/com/redstoner/modules/lagchunks/LagChunks.cmd b/src/main/java/com/redstoner/modules/lagchunks/LagChunks.cmd index 142a437..0426952 100644 --- a/src/com/redstoner/modules/lagchunks/LagChunks.cmd +++ b/src/main/java/com/redstoner/modules/lagchunks/LagChunks.cmd @@ -1,4 +1,5 @@ command lc { + alias lagchunks; perm utils.lagchunks; list { diff --git a/src/com/redstoner/modules/lagchunks/LagChunks.java b/src/main/java/com/redstoner/modules/lagchunks/LagChunks.java index 1debf12..542f032 100644 --- a/src/com/redstoner/modules/lagchunks/LagChunks.java +++ b/src/main/java/com/redstoner/modules/lagchunks/LagChunks.java @@ -1,8 +1,11 @@ package com.redstoner.modules.lagchunks; -import java.util.ArrayList; -import java.util.List; - +import com.nemez.cmdmgr.Command; +import com.nemez.cmdmgr.Command.AsyncType; +import com.redstoner.annotations.Commands; +import com.redstoner.annotations.Version; +import com.redstoner.misc.CommandHolderType; +import com.redstoner.modules.Module; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Location; @@ -10,72 +13,56 @@ import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import com.nemez.cmdmgr.Command; -import com.nemez.cmdmgr.Command.AsyncType; -import com.redstoner.annotations.Commands; -import com.redstoner.annotations.Version; -import com.redstoner.misc.CommandHolderType; -import com.redstoner.modules.Module; +import java.util.ArrayList; +import java.util.List; + +@Commands (CommandHolderType.File) +@Version (major = 5, minor = 0, revision = 0, compatible = 4) +public class LagChunks implements Module { + private List<LaggyChunk> laggyChunks = new ArrayList<>(); -@Commands(CommandHolderType.File) -@Version(major = 4, minor = 1, revision = 0, compatible = 4) -public class LagChunks implements Module -{ - private List<LaggyChunk> laggyChunks = new ArrayList<LaggyChunk>(); - - private void scan(int amount) - { + private void scan(int amount) { laggyChunks.clear(); - for (World world : Bukkit.getServer().getWorlds()) - { - for (Chunk chunk : world.getLoadedChunks()) - { - if (chunk.getEntities().length > amount) - { + + for (World world : Bukkit.getServer().getWorlds()) { + for (Chunk chunk : world.getLoadedChunks()) { + if (chunk.getEntities().length > amount) { Location entLoc = chunk.getEntities()[0].getLocation(); laggyChunks.add(new LaggyChunk(entLoc.getBlockX(), entLoc.getBlockY(), entLoc.getBlockZ(), world, - chunk.getEntities().length)); + chunk.getEntities().length + )); } } } } - - @Command(hook = "list_cmd") - public void list(CommandSender sender) - { - if (laggyChunks.size() > 0) - { - ArrayList<String> message = new ArrayList<String>(); - for (LaggyChunk lc : laggyChunks) - { + + @Command (hook = "list_cmd") + public void list(CommandSender sender) { + if (laggyChunks.size() > 0) { + ArrayList<String> message = new ArrayList<>(); + for (LaggyChunk lc : laggyChunks) { message.add("ยงb[ยงa" + laggyChunks.indexOf(lc) + "ยงb]: ยงa" + lc.x + "ยง7, ยงa" + lc.y + "ยง7, ยงa" + lc.z - + " ยง7(" + lc.world.getName() + ") ยงa- ยงb" + lc.amount + " entities"); + + " ยง7(" + lc.world.getName() + ") ยงa- ยงb" + lc.amount + " entities"); } message.add("ยง2-------------------"); getLogger().message(sender, message.toArray(new String[] {})); - } - else + } else getLogger().message(sender, true, "Couldn't find any chunks with that many entities."); } - - @Command(hook = "scan_cmd", async = AsyncType.ALWAYS) - public void scan_cmd(CommandSender sender, int amount) - { + + @Command (hook = "scan_cmd", async = AsyncType.ALWAYS) + public void scan_cmd(CommandSender sender, int amount) { scan(amount); list(sender); } - - @Command(hook = "tp") - public void tp(CommandSender sender, int number) - { + + @Command (hook = "tp") + public void tp(CommandSender sender, int number) { Player player = (Player) sender; - if (number < laggyChunks.size()) - { + if (number < laggyChunks.size()) { player.teleport(laggyChunks.get(number).getLocation()); getLogger().message(player, "ยงaTeleported to chunk " + number + "!"); - } - else - { + } else { getLogger().message(sender, true, "ยง4Invalid chunk number! Use ยงe/lc list ยง4to show laggy chunks!"); } } diff --git a/src/com/redstoner/modules/lagchunks/LaggyChunk.java b/src/main/java/com/redstoner/modules/lagchunks/LaggyChunk.java index 3ff4d6f..3ff4d6f 100644 --- a/src/com/redstoner/modules/lagchunks/LaggyChunk.java +++ b/src/main/java/com/redstoner/modules/lagchunks/LaggyChunk.java diff --git a/src/main/java/com/redstoner/modules/lagchunks/module.info b/src/main/java/com/redstoner/modules/lagchunks/module.info new file mode 100644 index 0000000..c39824f --- /dev/null +++ b/src/main/java/com/redstoner/modules/lagchunks/module.info @@ -0,0 +1,3 @@ +displayName: LagChunks +category: Staff +description: Collects information about entities across the map and displays chunk info
\ No newline at end of file diff --git a/src/com/redstoner/modules/list/List.cmd b/src/main/java/com/redstoner/modules/list/List.cmd index f4caf02..9b4fb78 100644 --- a/src/com/redstoner/modules/list/List.cmd +++ b/src/main/java/com/redstoner/modules/list/List.cmd @@ -9,6 +9,7 @@ command list { alias eplist; alias who; alias ewho; + perm utils.list; [empty] { run list; help Shows all online players sorted by rank.; @@ -19,6 +20,7 @@ command list { } } command staff { + perm utils.list; [empty] { help Shows all online staff.; run staff; diff --git a/src/com/redstoner/modules/list/List.java b/src/main/java/com/redstoner/modules/list/List.java index d5a0016..6fa0a64 100644 --- a/src/com/redstoner/modules/list/List.java +++ b/src/main/java/com/redstoner/modules/list/List.java @@ -18,7 +18,7 @@ import com.redstoner.modules.datamanager.DataManager; import net.nemez.chatapi.click.Message; @Commands(CommandHolderType.File) -@Version(major = 4, minor = 0, revision = 5, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class List implements Module { private HashMap<String, Integer> onConsole; diff --git a/src/main/java/com/redstoner/modules/list/module.info b/src/main/java/com/redstoner/modules/list/module.info new file mode 100644 index 0000000..8a05ed3 --- /dev/null +++ b/src/main/java/com/redstoner/modules/list/module.info @@ -0,0 +1,3 @@ +displayName: List +category: Other +description: Lists the players online separated by rank and subrank.
\ No newline at end of file diff --git a/src/com/redstoner/modules/loginsecurity/CancelledEventsHandler.java b/src/main/java/com/redstoner/modules/loginsecurity/CancelledEventsHandler.java index e39d781..91dae9a 100644 --- a/src/com/redstoner/modules/loginsecurity/CancelledEventsHandler.java +++ b/src/main/java/com/redstoner/modules/loginsecurity/CancelledEventsHandler.java @@ -15,6 +15,7 @@ import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerPickupArrowEvent; import org.bukkit.event.player.PlayerPickupItemEvent; +@SuppressWarnings("deprecation") public class CancelledEventsHandler implements Listener { private LoginSecurity mainClass; diff --git a/src/com/redstoner/modules/loginsecurity/CryptographyHandler.java b/src/main/java/com/redstoner/modules/loginsecurity/CryptographyHandler.java index 48e81a9..48e81a9 100644 --- a/src/com/redstoner/modules/loginsecurity/CryptographyHandler.java +++ b/src/main/java/com/redstoner/modules/loginsecurity/CryptographyHandler.java diff --git a/src/com/redstoner/modules/loginsecurity/LoginSecurity.cmd b/src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.cmd index 952b3ed..952b3ed 100644 --- a/src/com/redstoner/modules/loginsecurity/LoginSecurity.cmd +++ b/src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.cmd diff --git a/src/com/redstoner/modules/loginsecurity/LoginSecurity.java b/src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.java index 7bcb89a..d32e29c 100644 --- a/src/com/redstoner/modules/loginsecurity/LoginSecurity.java +++ b/src/main/java/com/redstoner/modules/loginsecurity/LoginSecurity.java @@ -36,7 +36,7 @@ import com.redstoner.modules.Module; @Commands(CommandHolderType.File) @AutoRegisterListener -@Version(major = 4, minor = 1, revision = 0, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class LoginSecurity implements Module, Listener { protected static Map<UUID, Location> loggingIn; diff --git a/src/com/redstoner/modules/loginsecurity/RepeatingLoginRunnable.java b/src/main/java/com/redstoner/modules/loginsecurity/RepeatingLoginRunnable.java index 4e8db6d..4e8db6d 100644 --- a/src/com/redstoner/modules/loginsecurity/RepeatingLoginRunnable.java +++ b/src/main/java/com/redstoner/modules/loginsecurity/RepeatingLoginRunnable.java diff --git a/src/main/java/com/redstoner/modules/loginsecurity/module.info b/src/main/java/com/redstoner/modules/loginsecurity/module.info new file mode 100644 index 0000000..7f04aa7 --- /dev/null +++ b/src/main/java/com/redstoner/modules/loginsecurity/module.info @@ -0,0 +1,3 @@ +displayName: LoginSecurity +category: Other +description: Secure your account with an additional password required when you join the server
\ No newline at end of file diff --git a/src/com/redstoner/modules/logs/LogEntry.java b/src/main/java/com/redstoner/modules/logs/LogEntry.java index 3ccc844..3ccc844 100644 --- a/src/com/redstoner/modules/logs/LogEntry.java +++ b/src/main/java/com/redstoner/modules/logs/LogEntry.java diff --git a/src/com/redstoner/modules/logs/LogHandler.java b/src/main/java/com/redstoner/modules/logs/LogHandler.java index 76f3849..624a7b5 100644 --- a/src/com/redstoner/modules/logs/LogHandler.java +++ b/src/main/java/com/redstoner/modules/logs/LogHandler.java @@ -7,7 +7,8 @@ import java.io.FileReader; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStreamReader; -import java.util.ArrayList; +import java.util.Map; +import java.util.TreeMap; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import java.util.zip.GZIPInputStream; @@ -22,11 +23,12 @@ public class LogHandler extends Thread { private CommandSender sender; private String regex, fileName; - private static ArrayList<CommandSender> stillSearching = new ArrayList<>(); + private static Map<String, LogHandler> activeSearches = new TreeMap<>(); public int totalFiles = 0; public int filesSearched = 0; public int totalLines = 0; public int currentLine = 0; + private boolean isCanceled = false; protected LogHandler(CommandSender sender, String regex, String fileName) { @@ -37,15 +39,24 @@ public class LogHandler extends Thread public void doSearch() { - if (stillSearching.contains(sender)) + String id = Utils.getID(sender); + if (activeSearches.containsKey(id)) { Logs.logger.message(sender, true, "ยง4 DO NOT EVER TRY TO QUERY TWO SEARCHES AT ONCE. Go die...!"); return; } - stillSearching.add(sender); + activeSearches.put(Utils.getID(sender), this); this.start(); } + public static void cancel(CommandSender sender) { + LogHandler handler = activeSearches.remove(Utils.getID(sender)); + if (handler == null) + Logs.logger.message(sender, true, "You aren't running a search."); + else + handler.isCanceled = true; + } + /** Searches the logs for a certain regex and forwards any matches to the sender. * * @param sender the issuer of the search @@ -55,8 +66,10 @@ public class LogHandler extends Thread { long starttime = System.currentTimeMillis(); int matches = 0; + String id = Utils.getID(sender); Logs.logger.message(sender, "Starting log search for &e" + regex + "&7 in &e" + fileName - + " &7now. &cPlease do not query any other searches until this one completes."); + + " &7now."); + Logs.logger.message(sender, "&cDon't run another query until this one is done!"); try { if (!regex.startsWith("^")) @@ -72,9 +85,11 @@ public class LogHandler extends Thread catch (PatternSyntaxException e) { Logs.logger.message(sender, true, "An error occured trying to compile the filename pattern!"); - stillSearching.remove(sender); + Logs.logger.message(sender, true, "&2Reason: &7" + e.getDescription()); + activeSearches.remove(id); return; } + File[] files = logFolder.listFiles(new FilenameFilter() { @Override @@ -83,11 +98,11 @@ public class LogHandler extends Thread return fileNamePattern.matcher(name).matches(); } }); - totalFiles = files.length; + totalFiles = files == null? 0 : files.length; if (totalFiles == 0) { Logs.logger.message(sender, true, "No files found!"); - stillSearching.remove(sender); + activeSearches.remove(id); return; } else @@ -102,7 +117,8 @@ public class LogHandler extends Thread catch (PatternSyntaxException e) { Logs.logger.message(sender, true, "An error occured trying to compile the search pattern!"); - stillSearching.remove(sender); + Logs.logger.message(sender, true, "&2Reason: " + e.getDescription()); + activeSearches.remove(id); return; } for (File file : files) @@ -114,12 +130,16 @@ public class LogHandler extends Thread new InputStreamReader(new GZIPInputStream(new FileInputStream(file)))); matches += searchStream(inputReader, searchPattern, sender, file.getName()); inputReader.close(); + if (isCanceled) + break; } else { BufferedReader inputReader = new BufferedReader(new FileReader(file)); matches += searchStream(inputReader, searchPattern, sender, file.getName()); inputReader.close(); + if (isCanceled) + break; } filesSearched++; if (progress) @@ -133,14 +153,15 @@ public class LogHandler extends Thread { Logs.logger.message(sender, true, "An unexpected error occured, please check your search parameters and try again!"); - stillSearching.remove(sender); + activeSearches.remove(id); return; } - stillSearching.remove(sender); + activeSearches.remove(id); + if ((boolean) DataManager.getOrDefault(Utils.getID(sender), "Logs", "summary", true)) { String[] message = new String[2]; - message[0] = "ยงaYour search completed after " + (System.currentTimeMillis() - starttime) + "ms!"; + message[0] = (isCanceled? "ยงaYou search was ยงcterminatedยงa after " : "ยงaYour search completed after ") + (System.currentTimeMillis() - starttime) + "ms!"; message[1] = "ยง7In total: ยงe" + filesSearched + "ยง7 File(s) and ยงe" + totalLines + "ยง7 Line(s) were searched, ยงa" + matches + "ยง7 Match(es) were found!"; Logs.logger.message(sender, message); @@ -170,13 +191,15 @@ public class LogHandler extends Thread currentLine = 0; while ((line = inputReader.readLine()) != null) { + if (isCanceled) + break; totalLines++; currentLine++; if (searchPattern.matcher(line).matches()) { if (((p != null) && (!p.isOnline()))) { - stillSearching.remove(sender); + activeSearches.remove(Utils.getID(sender)); throw new IOException("The player has left during the search. Aborting now."); } LogEntry entry = new LogEntry(filename, line, currentLine, totalLines); diff --git a/src/com/redstoner/modules/logs/Logs.cmd b/src/main/java/com/redstoner/modules/logs/Logs.cmd index c5283fe..c64c1a2 100644 --- a/src/com/redstoner/modules/logs/Logs.cmd +++ b/src/main/java/com/redstoner/modules/logs/Logs.cmd @@ -1,34 +1,34 @@ command log { perm utils.logs; alias logs; + type player; + search [string:file(s)] [string:search...] { run search_logs file(s) search; help Performs the specified search operation on the logs. Wildcards are supported in filenames. Search string is a regex.; - type player; + } + terminate { + run terminate_search; + help Stops the search.; } format { run show_format; help Displays your current log output format with an example result.; - type player; } format_help { run show_format_help; help Displays all available placeholders for the formatting; - type player; } option_help { run show_option_help; help Displays all available options.; - type player; } set format [string:format] { run set_format format; help Sets a new log output format; - type player; } set [string:option] [boolean:state] { run set_option option state; help Allows you to enable or disable various features such as sumamries, live progress updates, etc...; - type player; } }
\ No newline at end of file diff --git a/src/com/redstoner/modules/logs/Logs.java b/src/main/java/com/redstoner/modules/logs/Logs.java index b54bfc9..054befd 100644 --- a/src/com/redstoner/modules/logs/Logs.java +++ b/src/main/java/com/redstoner/modules/logs/Logs.java @@ -15,7 +15,7 @@ import com.redstoner.modules.ModuleLogger; import com.redstoner.modules.datamanager.DataManager; @Commands(CommandHolderType.File) -@Version(major = 4, minor = 0, revision = 4, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class Logs implements Module { public static final String defaultFormat = "ยง7 > %f: %r"; @@ -26,13 +26,6 @@ public class Logs implements Module protected static ModuleLogger logger; @Override - public void firstLoad() - { - Module.super.firstLoad(); - DataManager.setConfig("logs.root", "/etc/minecraft/redstoner/logs"); - } - - @Override public boolean onEnable() { Module.super.onEnable(); @@ -42,7 +35,7 @@ public class Logs implements Module public static File getLogsDir() { - return new File((String) DataManager.getConfigOrDefault("logs.root", "../logs")); + return new File((String) DataManager.getConfigOrDefault("logs.root", "logs")); } @Command(hook = "search_logs") @@ -53,6 +46,13 @@ public class Logs implements Module return true; } + @Command(hook = "terminate_search") + public boolean terminate_search(CommandSender sender) + { + LogHandler.cancel(sender); + return true; + } + // FORMATTING @Command(hook = "show_format") public boolean show_format(CommandSender sender) diff --git a/src/main/java/com/redstoner/modules/logs/module.info b/src/main/java/com/redstoner/modules/logs/module.info new file mode 100644 index 0000000..922bf57 --- /dev/null +++ b/src/main/java/com/redstoner/modules/logs/module.info @@ -0,0 +1,3 @@ +displayName: Logs +category: Staff +description: Allows staff to Search server logs in-game
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/mail/Mail.cmd b/src/main/java/com/redstoner/modules/mail/Mail.cmd new file mode 100644 index 0000000..705dafe --- /dev/null +++ b/src/main/java/com/redstoner/modules/mail/Mail.cmd @@ -0,0 +1,81 @@ +command mail { + perm utils.mail; + type player; + + [empty] { + run read; + help Shows your inbox of mails.; + } + read [empty] { + run read; + help Shows your inbox of messages.; + } + delete [int:id] { + run delete id; + help Deletes the given message.; + } + clear [empty] { + run clear; + help Clears your inbox.; + } + send [string:player] [string:message...] { + run send player message; + help Send a message to the given player.; + } + reply [int:id] [string:message...] { + run reply id message; + help Reply to a players message.; + } + retract [int:id] { + run retract_id id; + help Retract the given message, if the player has not read it yet.; + } + retract [empty] { + run retract; + help Retract the last message you sent, if the player has not read it yet.; + } + archive [empty] { + run archive_read; + help Shoes are archived messages.; + } + archive read [empty]{ + run archive_read; + help Shoes are archived messages.; + } + archive [int:id] { + run archive id; + help Archives a message.; + } + unarchive [int:id] { + run unarchive id; + help Unarchives a message.; + } + settings theme { + [string:s_theme] { + run settings_theme_set s_theme; + help Sets the theme for your inbox. Available themes are: Light, Dark, and Gold.; + } + run settings_theme; + help Shows your current theme setting.; + } + settings actions { + [string:s_actions] { + run settings_actions_set s_actions; + help Sets the action set for your inbox. Available options are: \nMinimal: No click actions,\nSimple: Delete, and \nStandard: Delete, and Reply. \nAll actions are still available as commands.; + } + run settings_actions; + help Shows your current action set setting.; + } + settings names { + [string:s_names] { + run settings_names_set s_names; + help Sets if you want to see player's username or display name. Available options are: username or displayname; + } + run settings_names; + help Shows your current names setting.; + } + [string:player] [string:message...] { + run send player message; + help Send a message to the given player.; + } +}
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/mail/Mail.java b/src/main/java/com/redstoner/modules/mail/Mail.java new file mode 100644 index 0000000..ee26842 --- /dev/null +++ b/src/main/java/com/redstoner/modules/mail/Mail.java @@ -0,0 +1,620 @@ +package com.redstoner.modules.mail; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TimeZone; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import com.nemez.cmdmgr.Command; +import com.redstoner.annotations.AutoRegisterListener; +import com.redstoner.annotations.Commands; +import com.redstoner.annotations.Version; +import com.redstoner.coremods.moduleLoader.ModuleLoader; +import com.redstoner.misc.CommandHolderType; +import com.redstoner.misc.JsonManager; +import com.redstoner.misc.Main; +import com.redstoner.misc.Utils; +import com.redstoner.modules.Module; +import com.redstoner.modules.datamanager.DataManager; +import com.redstoner.modules.ignore.Ignore; + +import net.nemez.chatapi.ChatAPI; + +@AutoRegisterListener +@Commands(CommandHolderType.File) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) +public class Mail implements Module, Listener +{ + + private Map<String, List<Msg>> playerToMsg = new HashMap<>(); + private Map<Integer, Msg> idToMsg = new HashMap<>(); + private Map<String, Integer> lastSent = new HashMap<>(); + private Map<String, Map<Integer, Msg>> archives = new HashMap<>(); + private int lastID = 1; + + @Command(hook = "read") + public void read(CommandSender sender) { + + String uuid = ((Player)sender).getUniqueId().toString(); + + List<Msg> list = playerToMsg.get(uuid); + if (list == null) { + getLogger().message(sender, true, "You have no new messages."); + return; + } + + boolean shownTut = (boolean) DataManager.getOrDefault(sender, "showntut", false); + + if (!shownTut) { + ChatAPI.createMessage(sender) + .appendText(getLogger().getHeader() + "\n&7Looks like you've never read your" + + " messages before, here is a quick overview of it.\n\n&9There are 3 themes: ") + .appendSendChatHover("&eLight", "/mail settings theme light", + "&7[&cX&7][&9I&7][&8Reply&7] &afriend22&7: &fTest message!") + .appendText("&7, ") + .appendSendChatHover("&eDark", "/mail settings theme dark", + "&8[&cX&8][&9I&8][&7Reply&8] &afriend22&7: &fTest message!") + .appendText("&7, and ") + .appendSendChatHover("&eGold", "/mail settings theme gold", + "&6[&fX&6][&fI&6][&fReply&6] &afriend22&6: &fTest message!") + .appendText("\n&7&o Hover to preview, click to select. Default is Dark.") + + .appendText("\n&9There are also 4 action sets: ") + .appendSendChatHover("&eMinimal", "/mail settings actions minimal", + "&8[&9I&8] &afriend22&7: &fTest message!") + .appendText("&7, ") + .appendSendChatHover("&eSimple", "/mail settings actions simple", + "&8[&cX&8][&9I&8] &afriend22&7: &fTest message!") + .appendText("&7, ") + .appendSendChatHover("&eNormal", "/mail settings actions normal", + "&8[&cX&8][&9I&8][&7Reply&8] &afriend22&7: &fTest message!") + .appendText("&7, and ") + .appendSendChatHover("&eFull", "/mail settings actions full", + "&8[&cX&8][&9I&8][&7Reply&8][&6Archive&8] &afriend22&7: &fTest message!") + .appendText("\n&7&o Hover to preview, click to select. Default is Normal") + + .appendText("\n&9You can see names in 2 ways: ") + .appendSendChatHover("&eUsernames", "/mail settings names username", + "&8[&cX&8][&9I&8][&7Reply&8] &afriend22&7: &fTest message!") + .appendText("&7 or ") + .appendSendChatHover("&eDisplayName", "/mail settings names displayname", + "&8[&cX&8][&9I&8][&7Reply&8] &a&ofriendinator&r&7: &fTest message!") + .appendText("\n&7&o Hover to preview, click to select. Default is Username") + + .appendText("\n\n&9What the things on the left mean:\n" + + " &8[&cX&8]&7 - Deletes the message\n" + + " &8[&9I&8]&7 - Shows some basic info when hovered over.\n" + + " &8[&7Reply&8]&7 - Replys to the message; forms a message chain.\n" + + " &8[&6Archive&8]&7 - Archives the message.\n\n" + + "For command help run ") + .appendSendChatHover("&e/mail help", "/mail help", "Click to run") + .appendText("&7 to get a list of commands.\n&2Now do ") + .appendSendChatHover("&e/mail read","/mail","Click to run") + .appendText("&2 again to start reading.") + .send(); + DataManager.setData(sender, "showntut", true); + DataManager.setData(sender, "theme", "DARK"); + DataManager.setData(sender, "actions", "NORMAL"); + DataManager.setData(sender, "names", "username"); + return; + } + + String themeStr = (String) DataManager.getData(sender, "theme"); + String actions = (String) DataManager.getData(sender, "actions"); + String names = (String) DataManager.getData(sender, "names"); + Theme theme; + + if (!isValidTheme(themeStr)) { + theme = Theme.DARK; + DataManager.setData(sender, "theme", theme); + getLogger().message(sender, true, "Something went wrong with your theme setting. The setting has been reset."); + } + else + theme = Theme.valueOf(themeStr); + if (!isValidActions(actions)) { + actions = "NORMAL"; + DataManager.setData(sender, "actions", actions); + getLogger().message(sender, true, "Something went wrong with your action set setting. The setting has been reset."); + } + if (!isValidNames(names)) { + names = "username"; + DataManager.setData(sender, "names", names); + getLogger().message(sender, true, "Something went wrong with your names setting. The setting has been reset."); + } + + boolean useDisplayName = names.equals("displayname"); + + ChatAPI.send(sender, "\n" + getLogger().getHeader()); + ChatAPI.send(sender, ""); + switch (actions) { + case "MINIMAL": + for (Msg m : list) { + m.showMinimal(sender, theme, useDisplayName); + m.read(); + } + break; + case "SIMPLE": + for (Msg m : list) { + m.showSimple(sender, theme, useDisplayName); + m.read(); + } + break; + case "NORMAL": + for (Msg m : list) { + m.showNormal(sender, theme, useDisplayName); + m.read(); + } + break; + case "FULL": + for (Msg m : list) { + m.showFull(sender, theme, useDisplayName); + m.read(); + } + break; + } + + ChatAPI.createMessage(sender).appendText("\n" + theme.getClearColor() + "Do ") + .appendSendChatHover(theme.getClearAccentColor() + "/mail clear","/mail clear","&cClick to Clear") + .appendText(theme.getClearColor() + " to clear all of your messages.") + .send(); + + savePlayerMsgs(uuid); + + } + + @Command(hook = "delete") + public void delete(CommandSender sender, int id) { + Msg msg = idToMsg.get(id); + String uuid = ((Player)sender).getUniqueId().toString(); + + if (msg == null || !msg.getReciever().equals(uuid)) { + getLogger().message(sender, true, "You have no messages with that ID[" + id + "]."); + return; + } + + idToMsg.remove(id); + + List<Msg> list = playerToMsg.get(uuid); + list.remove(msg); + if (list.isEmpty()) + playerToMsg.remove(uuid); + else + playerToMsg.put(uuid, list); + + getLogger().message(sender, "Message Deleted. [ID=" + id + "]"); + savePlayerMsgs(uuid); + } + + @Command(hook = "clear") + public void clear(CommandSender sender) { + String uuid = ((Player)sender).getUniqueId().toString(); + + List<Msg> list = playerToMsg.get(uuid); + + if (list == null) { + getLogger().message(sender, "Messages Cleared."); + return; + } + + playerToMsg.remove(uuid); + for (Msg m : list) + idToMsg.remove(m.getID()); + + getLogger().message(sender, "Messages Cleared."); + savePlayerMsgs(uuid); + } + + @Command(hook = "send") + @SuppressWarnings("deprecation") + public void send(CommandSender sender, String player, String message) { + OfflinePlayer op = Bukkit.getOfflinePlayer(player); + if (!op.hasPlayedBefore()) + getLogger().message(sender, true, "&e" + player + "&7 has never joined the server."); + else + sendMessage(sender, op.getPlayer().getUniqueId().toString(), message, null); + } + + @Command(hook = "reply") + public void reply(CommandSender sender, int id, String message) { + String uuid = ((Player)sender).getUniqueId().toString(); + + Msg msg = idToMsg.get(id); + + if (msg == null || !msg.getReciever().equals(uuid)) { + getLogger().message(sender, true, "You have no messages with that ID[" + id + "]."); + return; + } + + sendMessage(sender, msg.getSender(), message, msg.getChain()); + + } + + + public void sendMessage(CommandSender sender, String r_uuid, String message, String chain) { + + Player r = Bukkit.getOfflinePlayer(UUID.fromString(r_uuid)).getPlayer(); + + if (ModuleLoader.exists("Ignore") ? !Ignore.getIgnoredBy(sender).sendTo(r) : false) + { + getLogger().message(sender, true, Utils.getName(r) + " has ignored you. Your message was not sent."); + return; + } + + String s_uuid = ((Player)sender).getUniqueId().toString(); + + Date date = new Date(); + SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + int id = getNextID(); + + Msg msg = new Msg(id, s_uuid, r_uuid, dateFormat.format(date), message, chain, false); + + idToMsg.put(id, msg); + List<Msg> list = playerToMsg.getOrDefault(r_uuid, new ArrayList<>()); + list.add(msg); + playerToMsg.put(r_uuid, list); + lastSent.put(s_uuid, id); + + getLogger().message(sender, "Message Sent! [ID=" + id + "]"); + ChatAPI.createMessage(sender) + .appendText(getLogger().getPrefix() + "Click ") + .appendSendChatHover("&ehere", "/mail retract " + id, "&cClick to Retract") + .appendText("&7 or do ") + .appendSuggestHover("&e/mail retract [id]", "/mail retract", "Click to Copy") + .appendText("&7 to retract it.") + .send(); + + + if (r.isOnline()) { + int num = playerToMsg.get(r_uuid).size(); + ChatAPI.createMessage(r) + .appendText(getLogger().getPrefix() + "&7You got &e" + num + "&7 message" + (num == 1? "" : "s") + "! Do ") + .appendSendChatHover("&e/mail", "/mail", "Click to read your messages") + .appendText("&7 to read them.") + .send(); + } + + savePlayerMsgs(r_uuid); + } + + @Command(hook = "retract") + public void retract(CommandSender sender) { + String uuid = ((Player)sender).getUniqueId().toString(); + int id = lastSent.get(uuid); + if (id == 0) + getLogger().message(sender, true, "You haven't sent a message this session."); + else + retract_id(sender, id); + } + + @Command(hook = "retract_id") + public void retract_id(CommandSender sender, int id) { + String uuid = ((Player)sender).getUniqueId().toString(); + Msg msg = idToMsg.get(id); + + if (msg == null || !msg.getSender().equals(uuid)) + getLogger().message(sender, true, "Unable to retract, that message doesn't exist. You either put in the wrong id, or it was deleted by the reciever."); + else if (msg.isRead()) + getLogger().message(sender, true, "Unable to retract, message has already been read."); + else { + idToMsg.remove(id); + + String r_uuid = msg.getReciever(); + List<Msg> list = playerToMsg.get(r_uuid); + list.remove(msg); + if (list.isEmpty()) + playerToMsg.remove(r_uuid); + else + playerToMsg.put(r_uuid, list); + getLogger().message(sender, "Message Retracted."); + savePlayerMsgs(r_uuid); + } + } + + @Command(hook = "archive_read") + public void archive_read(CommandSender sender) { + String uuid = ((Player)sender).getUniqueId().toString(); + Map<Integer, Msg> list = archives.get(uuid); + + if (list == null) { + getLogger().message(sender, true, "You have no archived messages."); + return; + } + + ChatAPI.send(sender, "&2--=[ Archived ]=--"); + ChatAPI.send(sender, ""); + + String themeStr = (String) DataManager.getData(sender, "theme"); + String names = (String) DataManager.getData(sender, "names"); + Theme theme; + + if (!isValidTheme(themeStr)) { + theme = Theme.DARK; + DataManager.setData(sender, "theme", theme); + getLogger().message(sender, true, "Something went wrong with your theme setting. The setting has been reset."); + } + else + theme = Theme.valueOf(themeStr); + if (!isValidNames(names)) { + names = "username"; + DataManager.setData(sender, "names", names); + getLogger().message(sender, true, "Something went wrong with your names setting. The setting has been reset."); + } + + for (Msg m : list.values()) { + m.showArchived(sender, theme, names.equals("displayname")); + } + + ChatAPI.send(sender, "\n&2These messages don't count towards your mail count."); + } + + @Command(hook = "archive") + public void archive(CommandSender sender, int id) { + String uuid = ((Player)sender).getUniqueId().toString(); + Msg msg = idToMsg.get(id); + + if (msg == null || !msg.getReciever().equals(uuid)) { + getLogger().message(sender, true, "You have no messages with that ID[" + id + "]."); + return; + } + + msg.read(); + + List<Msg> list = playerToMsg.get(uuid); + list.remove(msg); + if (list.isEmpty()) + playerToMsg.remove(uuid); + else + playerToMsg.put(uuid, list); + idToMsg.remove(id); + + Map<Integer,Msg> list2 = archives.getOrDefault(uuid, new HashMap<>()); + int lastAID = list2.size(); + list2.put(lastAID, msg); + archives.put(uuid, list2); + + msg.setID(list2.size() -1); + getLogger().message(sender, "Message Archived. [ID=" + id + "] [ArchiveID=" + lastAID + "]"); + savePlayerMsgs(uuid); + savePlayerArchive(uuid); + } + + @Command(hook = "unarchive") + public void unarchive(CommandSender sender, int id) { + String uuid = ((Player)sender).getUniqueId().toString(); + Map<Integer,Msg> list = archives.get(uuid); + + if (id < 0 || id >= list.size()) { + getLogger().message(sender, true, "You have no archived messages with that ID."); + return; + } + + Msg msg = list.get(id); + msg.setID(getNextID()); + + list.remove(id); + if (list.isEmpty()) + archives.remove(uuid); + else + archives.put(uuid, list); + List<Msg> list2 = playerToMsg.getOrDefault(uuid, new ArrayList<>()); + list2.add(msg); + playerToMsg.put(uuid, list2); + idToMsg.put(msg.getID(), msg); + + getLogger().message(sender, "Message Unarchived. [ArchiveID=" + id + "] [ID=" + msg.getID() + "]"); + savePlayerMsgs(uuid); + savePlayerArchive(uuid); + } + + @Command(hook = "settings_theme") + public void settings_theme(CommandSender sender) { + String theme = (String) DataManager.getData(sender, "theme"); + if (!isValidTheme(theme)) { + theme = Theme.DARK.toString(); + DataManager.setData(sender, "theme", theme); + } + getLogger().message(sender, "Your current theme is &e" + theme + "&7."); + + } + @Command(hook = "settings_theme_set") + public void settings_theme_set(CommandSender sender, String theme) { + if (!isValidTheme(theme)) { + ChatAPI.createMessage(sender) + .appendText(getLogger().getPrefix(true) + "Invalid theme. Available themes are: ") + .appendSendChatHover("&eLight", "/mail settings theme light", "Click to switch to &eLight") + .appendText("&7, ") + .appendSendChatHover("&eDark", "/mail settings theme dark", "Click to switch to &eDark") + .appendText("&7, ") + .appendSendChatHover("&eGold", "/mail settings theme gold", "Click to switch to &eGold") + .send(); + + return; + } + DataManager.setData(sender, "theme", theme.toUpperCase()); + getLogger().message(sender, "Theme set to &e" + theme + "&7."); + } + @Command(hook = "settings_actions") + public void settings_actions(CommandSender sender) { + String actions = (String) DataManager.getData(sender, "actions"); + if (!isValidActions(actions)) { + actions = "NORMAL"; + DataManager.setData(sender, "actions", actions); + } + getLogger().message(sender, "Your current action set is &e" + actions.toLowerCase() + "."); + } + @Command(hook = "settings_actions_set") + public void settings_actions_set(CommandSender sender, String actions) { + if (!isValidActions(actions)) { + + ChatAPI.createMessage(sender) + .appendText(getLogger().getPrefix(true) + "Invalid action set. Available options are:") + .appendSendChatHover("\n &eMinimal", "/mail settings actions minimal", "Click to switch to &eMinimal") + .appendText("&7: No click actions, ") + .appendSendChatHover("\n &eSimple", "/mail settings actions simple", "Click to switch to &eSimple") + .appendText("&7: Delete, ") + .appendSendChatHover("\n &eNormal", "/mail settings actions normal", "Click to switch to &eNormal") + .appendText("&7: : Delete and Reply.") + .appendSendChatHover("\n &eFull", "/mail settings actions full", "Click to switch to &eFull") + .appendText("&7: : Delete, Reply, and Archive.\nAll actions are still available with commands.") + .send(); + + return; + } + DataManager.setData(sender, "actions", actions.toUpperCase()); + getLogger().message(sender, "Action Set set to &e" + actions.toLowerCase() + "&7."); + } + @Command(hook = "settings_names") + public void settings_names(CommandSender sender) { + String names = (String) DataManager.getData(sender, "names"); + if (!isValidNames(names)) { + names = "username"; + DataManager.setData(sender, "names", names); + } + getLogger().message(sender, "Your current names setting is &e" + names.toLowerCase() + "."); + } + @Command(hook = "settings_names_set") + public void settings_names_set(CommandSender sender, String names) { + if (!isValidNames(names)) { + ChatAPI.createMessage(sender) + .appendText(getLogger().getPrefix(true) + "Invalid name setting. Available options are: ") + .appendSendChatHover("&eusername", "/mail settings names username", "Click to switch to &eusernames") + .appendText(" &7or ") + .appendSendChatHover("&edisplaynames", "/mail settings names displaynames", "Click to switch to &edisplaynames") + .send(); + + return; + } + DataManager.setData(sender, "names", names.toLowerCase()); + getLogger().message(sender, "Names setting set to &e" + names.toLowerCase() + "&7."); + } + + private boolean isValidTheme(String theme) { + return theme != null && (theme.equalsIgnoreCase("light") + || theme.equalsIgnoreCase("dark") + || theme.equalsIgnoreCase("gold")); + } + + private boolean isValidActions(String actions) { + return actions != null && (actions.equalsIgnoreCase("minimal") + || actions.equalsIgnoreCase("simple") + || actions.equalsIgnoreCase("normal") + || actions.equalsIgnoreCase("full")); + } + private boolean isValidNames(String names) { + return names != null && (names.equalsIgnoreCase("username") + || names.equalsIgnoreCase("displayname")); + } + + private int getNextID() { + if (lastID > 99999999) + getLogger().warn("IDs have exceeded 8 digits, reload suggested."); + return lastID++; + } + + public void postEnable() { + File dir = new File(Main.plugin.getDataFolder(), "/mail"); + File[] filesInDir = dir.listFiles(); + if (filesInDir == null) + return; + for (File file : filesInDir) { + if (file.isFile()) { + JSONArray msgs = JsonManager.getArray(file); + String uuid = file.getName().substring(0, file.getName().indexOf(".json")); + + List<Msg> list = new ArrayList<>(); + for (Object o : msgs) { + Msg m = Msg.fromJSONObject((JSONObject)o, getNextID()); + list.add(m); + idToMsg.put(m.getID(), m); + } + if (!list.isEmpty()) + playerToMsg.put(uuid, list); + } + } + + Bukkit.getOnlinePlayers().forEach((Player p) -> loadPlayer(p)); + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + loadPlayer(event.getPlayer()); + + } + + public void loadPlayer(Player p) { + String uuid = p.getUniqueId().toString(); + + File jsonfile = new File(Main.plugin.getDataFolder(), "/mail/archive/" + uuid + ".json"); + JSONArray fromArchive = JsonManager.getArray(jsonfile); + Map<Integer,Msg> archives = new HashMap<>(); + + if (fromArchive != null) { + int i = 0; + for (Object o : fromArchive) { + Msg m = Msg.fromJSONObject(((JSONObject)o), i); + archives.put(i, m); + i++; + } + if (!archives.isEmpty()) + this.archives.put(uuid, archives); + } + + + List<Msg> list = playerToMsg.get(uuid); + if (list != null && !list.isEmpty()) + ChatAPI.createMessage(p) + .appendText(getLogger().getPrefix() + "&7You got &e" + list.size() + + "&7 message" + (list.size() == 1? "" : "s") + "! Do ") + .appendSendChatHover("&e/mail", "/mail", "Click to read your messages") + .appendText("&7 to read them.") + .send(); + } + + @SuppressWarnings("unchecked") + public void savePlayerMsgs(String uuid) { + + File jsonfile = new File(Main.plugin.getDataFolder(), "/mail/" + uuid + ".json"); + + List<Msg> messages = playerToMsg.getOrDefault(uuid, new ArrayList<>()); + + JSONArray m_array = new JSONArray(); + + for (Msg m : messages) + m_array.add(m.toJSONObject()); + + JsonManager.save(m_array, jsonfile); + } + + @SuppressWarnings("unchecked") + public void savePlayerArchive(String uuid) { + + File jsonfile = new File(Main.plugin.getDataFolder(), "/mail/archive/" + uuid + ".json"); + + Map<Integer,Msg> arch = archives.getOrDefault(uuid, new HashMap<>()); + + JSONArray a_array = new JSONArray(); + + for (Msg m : arch.values()) + a_array.add(m.toJSONObject()); + + JsonManager.save(a_array, jsonfile); + } +} diff --git a/src/main/java/com/redstoner/modules/mail/Msg.java b/src/main/java/com/redstoner/modules/mail/Msg.java new file mode 100644 index 0000000..8bb666f --- /dev/null +++ b/src/main/java/com/redstoner/modules/mail/Msg.java @@ -0,0 +1,206 @@ +package com.redstoner.modules.mail; + +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.json.simple.JSONObject; + +import net.nemez.chatapi.ChatAPI; +import net.nemez.chatapi.click.Message; + +public class Msg { + + private int id; + private String sender; + private String reciever; + private String timeSent; + private String message; + private String chain; + private boolean read; + + public Msg(int id, String sender, String reciever, String timeSent, String message, String chain, boolean read) { + this.id = id; + this.sender = sender; + this.reciever = reciever; + this.timeSent = timeSent; + this.message = message; + this.chain = chain; + this.read = read; + } + + public String getSender() { + return sender; + } + + public String getReciever() { + return reciever; + } + + + public void read() { + read = true; + } + + public boolean isRead() { + return read; + } + + public void setID(int id) { + this.id = id; + } + + public int getID() { + return id; + } + + public String getChain() { + Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer(); + + String line = getPrefix(p) + p.getName() + "&7:&f " + message; + + if (chain == null) + return line; + else + return chain + "\n" + line; + } + + public void showMinimal(CommandSender viewer, Theme theme, boolean showDisplayName) { + Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer(); + String name = getPrefix(p) + p.getName(); + + Message msg = ChatAPI.createMessage(viewer) + .appendText(theme.getBracketColor() + "[") + .appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id) + .appendText(theme.getBracketColor() + "] "); + if (showDisplayName) + msg.appendTextHover(p.getDisplayName(), name); + else + msg.appendText(name); + msg.appendText(theme.getColonColor() + ": "); + if (chain == null) + msg.appendText(message).send(); + else + msg.appendTextHover(message, chain).send(); + } + + public void showSimple(CommandSender viewer, Theme theme, boolean showDisplayName) { + Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer(); + String name = getPrefix(p) + p.getName(); + + Message msg = ChatAPI.createMessage(viewer) + .appendText(theme.getBracketColor() + "[") + .appendSendChatHover(theme.getDeleteColor() + "X", "/mail delete " + id, "&cDelete") + .appendText(theme.getBracketColor() + "][") + .appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id) + .appendText(theme.getBracketColor() + "] "); + if (showDisplayName) + msg.appendTextHover(p.getDisplayName(), name); + else + msg.appendText(name); + msg.appendText(theme.getColonColor() + ": "); + if (chain == null) + msg.appendText(message).send(); + else + msg.appendTextHover(message, chain).send(); + } + + public void showNormal(CommandSender viewer, Theme theme, boolean showDisplayName) { + Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer(); + String name = getPrefix(p) + p.getName(); + + Message msg = ChatAPI.createMessage(viewer) + .appendText(theme.getBracketColor() + "[") + .appendSendChatHover(theme.getDeleteColor() + "X", "/mail delete " + id, "&cDelete") + .appendText(theme.getBracketColor() + "][") + .appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id) + .appendText(theme.getBracketColor() + "][") + .appendSuggestHover(theme.getReplyColor() + "Reply", "/mail reply " + id + " ", "&7Reply") + .appendText(theme.getBracketColor() + "] "); + if (showDisplayName) + msg.appendTextHover(p.getDisplayName(), name); + else + msg.appendText(name); + msg.appendText(theme.getColonColor() + ": "); + if (chain == null) + msg.appendText(message).send(); + else + msg.appendTextHover(message, chain).send(); + } + + public void showFull(CommandSender viewer, Theme theme, boolean showDisplayName) { + Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer(); + String name = getPrefix(p) + p.getName(); + + Message msg = ChatAPI.createMessage(viewer) + .appendText(theme.getBracketColor() + "[") + .appendSendChatHover(theme.getDeleteColor() + "X", "/mail delete " + id, "&cDelete") + .appendText(theme.getBracketColor() + "][") + .appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id) + .appendText(theme.getBracketColor() + "][") + .appendSuggestHover(theme.getReplyColor() + "Reply", "/mail reply " + id + " ", "&7Reply") + .appendText(theme.getBracketColor() + "][") + .appendSendChatHover(theme.getArchiveColor() + "Archive", "/mail archive " + id + " ", "&6Archive") + .appendText(theme.getBracketColor() + "] "); + if (showDisplayName) + msg.appendTextHover(p.getDisplayName(), name); + else + msg.appendText(name); + msg.appendText(theme.getColonColor() + ": "); + if (chain == null) + msg.appendText(message).send(); + else + msg.appendTextHover(message, chain).send(); + } + + public void showArchived(CommandSender viewer, Theme theme, boolean showDisplayName) { + Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer(); + String name = getPrefix(p) + p.getName(); + + Message msg = ChatAPI.createMessage(viewer) + .appendText(theme.getBracketColor() + "[") + .appendSendChatHover(theme.getArchiveColor() + "Unarchive", "/mail unarchive " + id, "&6Unarchive") + .appendText(theme.getBracketColor() + "][") + .appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id) + .appendText(theme.getBracketColor() + "] "); + if (showDisplayName) + msg.appendTextHover(p.getDisplayName(), name); + else + msg.appendText(name); + msg.appendText(theme.getColonColor() + ": "); + if (chain == null) + msg.appendText(message).send(); + else + msg.appendTextHover(message, chain).send(); + } + + private String getPrefix(Player player) + { + String[] teams = new String[] {"admin", "mod", "trainingmod", "helper", "trusted", "builder", "member", "visitor"}; + String[] prefixes = new String[] {"&4", "&c", "&c", "&9", "&3", "&a", "&f", "&7"}; + + for (int i = 0; i < teams.length; i++) + if (player.hasPermission("group." + teams[i])) + return prefixes[i]; + return "&7"; + + } + + @SuppressWarnings("unchecked") + public JSONObject toJSONObject() { + JSONObject j = new JSONObject(); + j.put("sender", sender); + j.put("reciever", reciever); + j.put("timeSent", timeSent); + j.put("message", message); + j.put("chain", chain); + j.put("read", read); + return j; + } + + public static Msg fromJSONObject(JSONObject j, int id) { + return new Msg(id, (String) j.get("sender"), (String) j.get("reciever"), (String) j.get("timeSent"), + (String) j.get("message"), (String) j.get("chain"), (boolean)j.get("read")); + } +} diff --git a/src/main/java/com/redstoner/modules/mail/Theme.java b/src/main/java/com/redstoner/modules/mail/Theme.java new file mode 100644 index 0000000..575e0a5 --- /dev/null +++ b/src/main/java/com/redstoner/modules/mail/Theme.java @@ -0,0 +1,53 @@ +package com.redstoner.modules.mail; + +public enum Theme { + LIGHT("&7","&c","&9","&8","&e","&7","&2", "&e"), + DARK("&8","&c","&9","&7","&6","&7","&2", "&e"), + GOLD("&6","&f","&f","&f","&f","&6","&6", "&6"); + + private String bracketColor; + private String deleteColor; + private String infoColor; + private String replyColor; + private String archiveColor; + private String colonColor; + private String clearColor; + private String clearAccentColor; + + private Theme(String bracketColor, String deleteColor, String infoColor, String replyColor, + String archiveColor, String colonColor, String clearColor, String clearAccentColor) { + this.bracketColor = bracketColor; + this.deleteColor = deleteColor; + this.infoColor = infoColor; + this.replyColor = replyColor; + this.archiveColor = archiveColor; + this.colonColor = colonColor; + this.clearColor = clearColor; + this.clearAccentColor = clearAccentColor; + } + + public String getBracketColor() { + return bracketColor; + } + public String getDeleteColor() { + return deleteColor; + } + public String getInfoColor() { + return infoColor; + } + public String getReplyColor() { + return replyColor; + } + public String getArchiveColor() { + return archiveColor; + } + public String getColonColor() { + return colonColor; + } + public String getClearColor() { + return clearColor; + } + public String getClearAccentColor() { + return clearAccentColor; + } +} diff --git a/src/main/java/com/redstoner/modules/mail/module.info b/src/main/java/com/redstoner/modules/mail/module.info new file mode 100644 index 0000000..2740d76 --- /dev/null +++ b/src/main/java/com/redstoner/modules/mail/module.info @@ -0,0 +1,3 @@ +displayName: Mail +category: Chat +description: A better version of essentials's mail feature.
\ No newline at end of file diff --git a/src/com/redstoner/modules/mentio/Mentio.cmd b/src/main/java/com/redstoner/modules/mentio/Mentio.cmd index 230adf8..c70e3e0 100644 --- a/src/com/redstoner/modules/mentio/Mentio.cmd +++ b/src/main/java/com/redstoner/modules/mentio/Mentio.cmd @@ -1,4 +1,5 @@ command mentio { + perm utils.mentio; add [string:trigger] { help Triggers you when the trigger gets said.; run addmentio trigger; @@ -11,6 +12,5 @@ command mentio { help Lists your mentios.; run listmentios; } - perm utils.mentio; type player; }
\ No newline at end of file diff --git a/src/com/redstoner/modules/mentio/Mentio.java b/src/main/java/com/redstoner/modules/mentio/Mentio.java index 3db8edf..0f2169e 100644 --- a/src/com/redstoner/modules/mentio/Mentio.java +++ b/src/main/java/com/redstoner/modules/mentio/Mentio.java @@ -30,7 +30,7 @@ import net.nemez.chatapi.click.Message; @Commands(CommandHolderType.File) @AutoRegisterListener -@Version(major = 4, minor = 1, revision = 0, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class Mentio implements Module, Listener { private File mentioLocation = new File(Main.plugin.getDataFolder(), "mentio.json"); @@ -56,12 +56,7 @@ public class Mentio implements Module, Listener Player player = (Player) sender; UUID uuid = player.getUniqueId(); JSONArray playerMentios = (JSONArray) mentios.get(uuid.toString()); - if (playerMentios == null) - { - playerMentios = new JSONArray(); - playerMentios.add(player.getName()); - playerMentios.add(player.getDisplayName().split(" ")[0].replaceAll("ยง[0-9a-fk-o]", "")); - } + playerMentios = defaultMentio(playerMentios, player); if (playerMentios.contains(trigger)) getLogger().message(sender, true, "You already had that as a mentio!"); else @@ -81,12 +76,7 @@ public class Mentio implements Module, Listener Player player = (Player) sender; UUID uuid = player.getUniqueId(); JSONArray playerMentios = (JSONArray) mentios.get(uuid.toString()); - if (playerMentios == null) - { - playerMentios = new JSONArray(); - playerMentios.add(player.getName()); - playerMentios.add(player.getDisplayName().split(" ")[0].replaceAll("ยง[0-9a-fk-o]", "")); - } + playerMentios = defaultMentio(playerMentios, player); if (!playerMentios.remove(trigger)) getLogger().message(sender, true, "You didn't have that as a mentio!"); else @@ -98,7 +88,6 @@ public class Mentio implements Module, Listener return true; } - @SuppressWarnings("unchecked") @Command(hook = "listmentios") public boolean listMentios(CommandSender sender) { @@ -106,12 +95,7 @@ public class Mentio implements Module, Listener Player player = (Player) sender; UUID uuid = player.getUniqueId(); JSONArray playerMentios = (JSONArray) mentios.get(uuid.toString()); - if (playerMentios == null) - { - playerMentios = new JSONArray(); - playerMentios.add(player.getName()); - playerMentios.add(player.getDisplayName().split(" ")[0].replaceAll("ยง[0-9a-fk-or]", "")); - } + playerMentios = defaultMentio(playerMentios, player); for (Object raw : playerMentios) { String mentio = (String) raw; @@ -122,6 +106,19 @@ public class Mentio implements Module, Listener } @SuppressWarnings("unchecked") + private JSONArray defaultMentio(JSONArray mentios, Player player) { + if (mentios == null) + { + mentios = new JSONArray(); + mentios.add(player.getName()); + + String displayName = player.getDisplayName().split(" ")[0].replaceAll("ยง[0-9a-fk-or]", ""); + if (!player.getName().equals(displayName)) + mentios.add(displayName); + } + return mentios; + } + @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerChat(AsyncPlayerChatEvent event) { @@ -133,12 +130,7 @@ public class Mentio implements Module, Listener return; UUID uuid = player.getUniqueId(); JSONArray playerMentios = (JSONArray) mentios.get(uuid.toString()); - if (playerMentios == null) - { - playerMentios = new JSONArray(); - playerMentios.add(player.getName()); - playerMentios.add(player.getDisplayName().split(" ")[0].replaceAll("ยง[0-9a-fk-o]", "")); - } + playerMentios = defaultMentio(playerMentios, player); for (Object raw : playerMentios) { String mentio = (String) raw; diff --git a/src/main/java/com/redstoner/modules/mentio/module.info b/src/main/java/com/redstoner/modules/mentio/module.info new file mode 100644 index 0000000..6c4c5b7 --- /dev/null +++ b/src/main/java/com/redstoner/modules/mentio/module.info @@ -0,0 +1,3 @@ +displayName: Mentio +category: Chat +description: Plays a sound and highlights keywords from a player defined list
\ No newline at end of file diff --git a/src/com/redstoner/modules/message/Message.cmd b/src/main/java/com/redstoner/modules/message/Message.cmd index 382e52e..f6e7608 100644 --- a/src/com/redstoner/modules/message/Message.cmd +++ b/src/main/java/com/redstoner/modules/message/Message.cmd @@ -11,10 +11,10 @@ command message { alias ew; alias whisper; alias ewhisper; + perm utils.message; [string:player] [string:message...] { run message player message; help Sends a direct message to a player.; - perm utils.message; } } @@ -22,14 +22,15 @@ command reply { alias r; alias er; alias ereply; + perm utils.message; [string:message...] { run reply message; help Sends a direct message to the last person you talked to.; - perm utils.message; } } command pmtoggle { + perm utils.message.toggle; [empty] { help Turns off your toggle.; type player; diff --git a/src/com/redstoner/modules/message/Message.java b/src/main/java/com/redstoner/modules/message/Message.java index 8c9f95d..0faf882 100644 --- a/src/com/redstoner/modules/message/Message.java +++ b/src/main/java/com/redstoner/modules/message/Message.java @@ -27,7 +27,7 @@ import com.redstoner.modules.socialspy.Socialspy; import net.nemez.chatapi.ChatAPI; @Commands(CommandHolderType.File) -@Version(major = 4, minor = 0, revision = 4, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class Message implements Module { HashMap<CommandSender, CommandSender> replyTargets = new HashMap<>(); diff --git a/src/main/java/com/redstoner/modules/message/module.info b/src/main/java/com/redstoner/modules/message/module.info new file mode 100644 index 0000000..6be8066 --- /dev/null +++ b/src/main/java/com/redstoner/modules/message/module.info @@ -0,0 +1,3 @@ +displayName: Message +category: Chat +description: A better version of minecraft's &e/msg&7 command
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/misc/Misc.cmd b/src/main/java/com/redstoner/modules/misc/Misc.cmd new file mode 100644 index 0000000..545030d --- /dev/null +++ b/src/main/java/com/redstoner/modules/misc/Misc.cmd @@ -0,0 +1,91 @@ +command tempadd { + perm pex; + + [string:user] [string:group] { + help Adds a user to a group for 1w.; + run tempadddef user group; + } + + [string:user] [string:group] [string:duration] { + help Adds a user to a group for a specified duration.; + run tempadd user group duration; + } +} + +command echo { + perm utils.misc.echo; + + [string:text...] { + help Echoes back to you.; + run echo text; + } +} + +command ping { + perm utils.misc.ping; + + [empty] { + help Pongs :D; + run ping; + } + + [string:player] { + help Gets the specified player's ping.; + run ping_player player; + } +} + +command sudo { + perm utils.misc.sudo; + + [string:name] [string:command...] { + help Sudo'es another user (or console); + run sudo name command; + } +} + +command hasperm { + perm utils.misc.hasperm; + + [flag:-f] [string:name] [string:node] { + help Checks if a player has a given permission node or not. Returns \"true/false\" in chat. When -f is set, it returns it unformatted.; + run hasperm -f name node; + } +} + +command nightvision { + alias nv; + alias illuminate; + + perm utils.misc.nightvision; + + type player; + + [empty] { + help Gives the player infinte night vision; + run illuminate; + } +} + +command minecart { + alias cart; + + perm utils.misc.spawncart; + + type player; + + default [string:variation] { + help Sets a default minecart variation.; + run minecart_default variation; + } + + [string:variation] { + help Spawns a certain minecart; + run minecart_variation variation; + } + + [empty] { + help Spawns a minecart; + run minecart; + } +}
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/misc/Misc.java b/src/main/java/com/redstoner/modules/misc/Misc.java new file mode 100644 index 0000000..c773e6b --- /dev/null +++ b/src/main/java/com/redstoner/modules/misc/Misc.java @@ -0,0 +1,337 @@ +package com.redstoner.modules.misc; + +import com.nemez.cmdmgr.Command; +import com.redstoner.annotations.AutoRegisterListener; +import com.redstoner.annotations.Commands; +import com.redstoner.annotations.Version; +import com.redstoner.misc.CommandHolderType; +import com.redstoner.misc.Utils; +import com.redstoner.modules.Module; +import com.redstoner.modules.datamanager.DataManager; +import net.nemez.chatapi.ChatAPI; +import net.nemez.chatapi.click.Message; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockFromToEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.UUID; + +@Commands (CommandHolderType.File) +@AutoRegisterListener +@Version (major = 5, minor = 0, revision = 0, compatible = 4) +public class Misc implements Module, Listener { + private static final String[] SUDO_BLACKLIST = new String[] { + "(.*:)?e?sudo", + "(.*:)?script.*", + "(.*:)?stop", + "(.*:)?modules", + "(.*:)?sayn", + "(.*:)?pex", + "(.*:)?console_.*", + "(.*:)?op", + "(.*:)?login", + "(.*:)?register", + "(.*:)?.*pass" + }; + + private static final String[] WELCOME_MSG = new String[] { + "&4 Welcome to the Redstoner Server!\n", + "&6 Before you ask us things, take a quick look at &a&nredstoner.com/info\n", + "&6 Thank you and happy playing!)\n\n" + }; + + private static final PotionEffect NIGHT_VISION = new PotionEffect(PotionEffectType.NIGHT_VISION, Integer.MAX_VALUE, 0, false, false); + + @EventHandler + public void onFirstJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + + if (!player.hasPlayedBefore()) { + Utils.broadcast("", "\nยงaยงlPlease welcome ยงf" + player.getDisplayName() + " ยงaยงlto Redstoner!\n", recipient -> !recipient.equals(player)); + + getLogger().message(player, WELCOME_MSG); + } + + Material spawnBlock = player.getLocation().getBlock().getType(); + + if (spawnBlock == Material.END_PORTAL || spawnBlock == Material.NETHER_PORTAL) { + getLogger().message(player, "&4Looks like you spawned in a portal... Let me help you out"); + getLogger().message(player, "&6You can use /back if you &nreally&6 want to go back"); + + player.teleport(player.getWorld().getSpawnLocation()); + } + } + + // Disables spectator teleportation + @EventHandler (priority = EventPriority.LOWEST) + public void onTeleport(PlayerTeleportEvent event) { + Player player = event.getPlayer(); + + if (!event.isCancelled() && event.getCause() == TeleportCause.SPECTATE && !player.hasPermission("utils.tp")) { + getLogger().message(event.getPlayer(), true, "Spectator teleportation is disabled!"); + + event.setCancelled(true); + } + } + + // Disables water and lava breaking stuff + @EventHandler + public void onLiquidFlow(BlockFromToEvent event) { + Material m = event.getToBlock().getType(); + + switch (m) { + case AIR: + case WATER: + case LAVA: + return; + default: { + event.setCancelled(true); + } + } + } + + @Command (hook = "tempadddef") + public boolean tempAddDef(CommandSender sender, String user, String group) { + return tempAdd(sender, user, group, "7d"); + } + + @Command (hook = "tempadd") + public boolean tempAdd(CommandSender sender, String user, String group, String duration) { + int parsed = MiscUtil.parseDuration(duration); + + if (parsed == -1) { + getLogger().message(sender, true, "That is not a valid duration! (format: 1y2m3d4h5m6s)"); + return true; + } + + Bukkit.dispatchCommand(sender, "pex user " + user + " group add " + group + " * " + parsed); + getLogger().message(sender, "User " + user + " added to group " + group + " for " + duration); + + return true; + } + + @Command (hook = "echo") + public boolean echo(CommandSender sender, String text) { + sender.sendMessage(ChatAPI.colorify(null, text)); + + return true; + } + + @Command (hook = "ping") + public boolean ping(CommandSender sender) { + if (sender instanceof Player) { + int ping = MiscUtil.getPing((Player) sender); + + if (ping == -1) { + getLogger().message(sender, "An error occured while getting your ping! Please message a staff member."); + } else { + getLogger().message(sender, "Your ping is " + ping + "ms."); + } + } else { + sender.sendMessage("That's not how this works... <insert facepalm emoji here>"); + } + + return true; + } + + @Command (hook = "ping_player") + public boolean ping(CommandSender sender, String player) { + Player playerObj = Bukkit.getPlayer(player); + + if (playerObj == null) { + getLogger().message(sender, "That player is not online!"); + return true; + } + + int ping = MiscUtil.getPing(playerObj); + + if (ping == -1) { + getLogger().message(sender, "An error occured while getting that player's ping! Please message a staff member."); + } else { + getLogger().message(sender, ChatColor.GRAY + playerObj.getDisplayName() + ChatColor.GRAY + "'s ping is " + ping + "ms."); + } + + return true; + } + + @Command (hook = "sudo") + public boolean sudo(CommandSender sender, String name, String command) { + CommandSender target; + + if (name.equalsIgnoreCase("console")) { + target = Bukkit.getConsoleSender(); + } else { + target = Bukkit.getPlayer(name); + } + + if (target == null) { + getLogger().message(sender, false, "That player couldn't be found!"); + return true; + } + + if (command.startsWith("/") || target.equals(Bukkit.getConsoleSender())) { + String[] args = command.split(" "); + + for (String regex : SUDO_BLACKLIST) { + if (args[0].matches((target.equals(Bukkit.getConsoleSender()) ? "" : "\\/") + regex)) { + getLogger().message(sender, true, "You can't sudo anyone into using that command!"); + return true; + } + } + + Bukkit.dispatchCommand(target, command.replaceFirst("/", "")); + getLogger().message(sender, "Sudoed " + Utils.getName(target) + "&7 into running " + command); + } else { + ((Player) target).chat(command); + getLogger().message(sender, "Sudoed " + Utils.getName(target) + "&7 into saying " + command); + } + + return true; + } + + @Command (hook = "hasperm") + public boolean hasPerm(CommandSender sender, boolean noformat, String name, String node) { + Player p; + + if (name.contains("-")) { + try { + p = Bukkit.getPlayer(UUID.fromString(name)); + } catch (Exception e) { + if (noformat) { + sender.sendMessage("ERR: Invalid UUID"); + } else { + getLogger().message(sender, "That UUID is not valid!"); + } + + return true; + } + } else { + p = Bukkit.getPlayer(name); + } + + if (p == null) { + if (noformat) { + Message m = new Message(sender, null); + m.appendText("ERR: Invalid player"); + m.send(); + } else { + getLogger().message(sender, "That player couldn't be found!"); + } + + return true; + } + + if (noformat) { + Message m = new Message(sender, null); + m.appendText("" + p.hasPermission(node)); + m.send(); + } else { + getLogger().message(sender, ChatColor.GRAY + p.getDisplayName() + ChatColor.GRAY + ( + p.hasPermission(node) + ? " has that permission." + : " does not have that permission." + )); + } + + return true; + } + + @Command (hook = "illuminate") + public void illuminate(CommandSender sender) { + Player player = (Player) sender; + if (player.hasPotionEffect(PotionEffectType.NIGHT_VISION)) { + player.removePotionEffect(PotionEffectType.NIGHT_VISION); + getLogger().message(sender, "Night Vision Disabled."); + } else { + player.addPotionEffect(NIGHT_VISION, true); + getLogger().message(sender, "Night Vision Enabled."); + } + } + + @Command (hook = "minecart") + public void minecart(CommandSender sender) { + String type = (String) DataManager.getOrDefault(sender, "minecart_default", "normal"); + minecartType(sender, type); + } + + @Command (hook = "minecart_variation") + public boolean minecartType(CommandSender sender, String type) { + if (type.equals("help") || type.equals("h") || type.equals("?")) return false; + + Player p = (Player) sender; + + if (!MiscUtil.canBuild(p, p.getLocation())) { + getLogger().message(sender, true, "You do not have permission to build here!"); + return true; + } + + EntityType typeE = convertMinecartTypeString(type.toLowerCase()); + + if (typeE != null) { + p.getWorld().spawnEntity(p.getLocation(), typeE); + getLogger().message(sender, "Minecart Spawned!"); + } else { + getLogger().message(sender, true, "The type of Minecart you've requested does not exist."); + } + + return false; + } + + @Command (hook = "minecart_default") + public boolean minecartDefault(CommandSender sender, String type) { + EntityType typeE = convertMinecartTypeString(type.toLowerCase()); + + if (type.equals("help") || type.equals("h") || type.equals("?")) return false; + + if (typeE != null) { + DataManager.setData(sender, "minecart_default", type); + getLogger().message(sender, "Set your default minecart to: " + type.toLowerCase()); + } else { + getLogger().message(sender, true, "The type of Minecart you've requested does not exist."); + } + + return true; + } + + public EntityType convertMinecartTypeString(String type) { + EntityType typeE = null; + + switch (type) { + case "normal": + typeE = EntityType.MINECART; + break; + case "chest": + typeE = EntityType.MINECART_CHEST; + break; + case "furnace": + typeE = EntityType.MINECART_FURNACE; + break; + case "hopper": + typeE = EntityType.MINECART_HOPPER; + break; + case "tnt": + typeE = EntityType.MINECART_TNT; + break; + case "command": + typeE = EntityType.MINECART_COMMAND; + break; + case "spawner": + typeE = EntityType.MINECART_MOB_SPAWNER; + break; + } + + return typeE; + } +}
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/misc/MiscUtil.java b/src/main/java/com/redstoner/modules/misc/MiscUtil.java new file mode 100644 index 0000000..f2fde6f --- /dev/null +++ b/src/main/java/com/redstoner/modules/misc/MiscUtil.java @@ -0,0 +1,55 @@ +package com.redstoner.modules.misc; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.block.BlockBreakEvent; + +import java.lang.reflect.InvocationTargetException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class MiscUtil { + private static final Pattern durationPattern = Pattern.compile("^(?:(?:(\\d*)y)?(?:(\\d*)m)?(?:(\\d*)d)?(?:(\\d*)h)?(?:(\\d*)m)?(?:(\\d*)s)?){1}$"); + + private static int getIntGroup(Matcher matcher, int group) { + String strGroup = matcher.group(group); + return Integer.parseInt(strGroup == null ? "0" : strGroup); + } + + protected static int parseDuration(String duration) { + Matcher m = durationPattern.matcher(duration); + + if (m.matches()) { + int years = getIntGroup(m, 1); + int months = getIntGroup(m, 2); + int days = getIntGroup(m, 3); + int hours = getIntGroup(m, 4); + int minutes = getIntGroup(m, 5); + int seconds = getIntGroup(m, 6); + + return (years * 31557600) + (months * 2629800) + (days * 86400) + (hours * 3600) + (minutes * 60) + seconds; + } else { + return -1; + } + } + + protected static int getPing(Player player) { + try { + Object entityPlayer = player.getClass().getMethod("getHandle").invoke(player); + + int ping = (int) entityPlayer.getClass().getField("ping").get(entityPlayer); + return ping; + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | NoSuchFieldException e) { + e.printStackTrace(); + } + + return -1; + } + + protected static boolean canBuild(Player player, Location location) { + BlockBreakEvent event = new BlockBreakEvent(location.getBlock(), player); + Bukkit.getPluginManager().callEvent(event); + return !event.isCancelled(); + } +} diff --git a/src/main/java/com/redstoner/modules/misc/module.info b/src/main/java/com/redstoner/modules/misc/module.info new file mode 100644 index 0000000..37d7aec --- /dev/null +++ b/src/main/java/com/redstoner/modules/misc/module.info @@ -0,0 +1,3 @@ +displayName: Miscellaneous +category: Other +description: A collection of useful things
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/motd/Motd.cmd b/src/main/java/com/redstoner/modules/motd/Motd.cmd new file mode 100644 index 0000000..52107ef --- /dev/null +++ b/src/main/java/com/redstoner/modules/motd/Motd.cmd @@ -0,0 +1,17 @@ +command motd { + get { + help Returns the motd; + run getmotd; + perm utils.motd.get; + } + set [string:motd...] { + help Sets the motd. Use --reset to reset to default; + run setmotd motd; + perm utils.motd.set; + } + [empty] { + help Returns the motd; + run getmotd; + perm utils.motd.get; + } +}
\ No newline at end of file diff --git a/src/com/redstoner/modules/motd/Motd.java b/src/main/java/com/redstoner/modules/motd/Motd.java index 1334e1a..9495b61 100644 --- a/src/com/redstoner/modules/motd/Motd.java +++ b/src/main/java/com/redstoner/modules/motd/Motd.java @@ -16,7 +16,7 @@ import com.redstoner.modules.Module; @Commands(CommandHolderType.File) @AutoRegisterListener -@Version(major = 4, minor = 1, revision = 0, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class Motd implements Module, Listener { private String default_motd, motd; diff --git a/src/main/java/com/redstoner/modules/motd/module.info b/src/main/java/com/redstoner/modules/motd/module.info new file mode 100644 index 0000000..7c56304 --- /dev/null +++ b/src/main/java/com/redstoner/modules/motd/module.info @@ -0,0 +1,3 @@ +displayName: MOTD +category: Staff +description: Changes the MOTD in-game
\ No newline at end of file diff --git a/src/com/redstoner/modules/nametags/Nametags.cmd b/src/main/java/com/redstoner/modules/nametags/Nametags.cmd index 4095b42..7164add 100644 --- a/src/com/redstoner/modules/nametags/Nametags.cmd +++ b/src/main/java/com/redstoner/modules/nametags/Nametags.cmd @@ -1,4 +1,5 @@ command tab { + perm utils.nametags; sort { help Resorts the entirety of tab.; run sort; @@ -7,5 +8,4 @@ command tab { help Resorts one player.; run sortspecific player; } - perm utils.tab.admin; }
\ No newline at end of file diff --git a/src/com/redstoner/modules/nametags/Nametags.java b/src/main/java/com/redstoner/modules/nametags/Nametags.java index 3a66b18..2ec8f97 100644 --- a/src/com/redstoner/modules/nametags/Nametags.java +++ b/src/main/java/com/redstoner/modules/nametags/Nametags.java @@ -21,7 +21,7 @@ import com.redstoner.modules.Module; @Commands(CommandHolderType.File) @AutoRegisterListener -@Version(major = 4, minor = 1, revision = 2, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class Nametags implements Module, Listener { @EventHandler @@ -109,7 +109,7 @@ public class Nametags implements Module, Listener public void sortSpecific(Player player) { Bukkit.dispatchCommand(Bukkit.getConsoleSender(), - "scoreboard teams join " + getTeam(player) + " " + player.getName()); + "minecraft:team join " + getTeam(player) + " " + player.getName()); } private String getTeam(Player player) diff --git a/src/main/java/com/redstoner/modules/nametags/module.info b/src/main/java/com/redstoner/modules/nametags/module.info new file mode 100644 index 0000000..de53d65 --- /dev/null +++ b/src/main/java/com/redstoner/modules/nametags/module.info @@ -0,0 +1,3 @@ +displayName: Nametags +category: Other +description: Sorts tab by rank and colors players' nametags
\ No newline at end of file diff --git a/src/com/redstoner/modules/naming/Naming.cmd b/src/main/java/com/redstoner/modules/naming/Naming.cmd index 1b9bc1a..f21f15a 100644 --- a/src/com/redstoner/modules/naming/Naming.cmd +++ b/src/main/java/com/redstoner/modules/naming/Naming.cmd @@ -1,24 +1,24 @@ command anvil { + perm utils.naming; [empty] { run anvil; type player; help Opens anvil GUI.; - perm utils.anvil; } } command name { + perm utils.naming; [string:name...] { run name name; type player; help Names item in hand.; - perm utils.name; } } command lore { + perm utils.naming; [optional:-a] [string:lore...] { run lore -a lore; type player; help Adds lore to item in hand.; - perm utils.lore; } }
\ No newline at end of file diff --git a/src/com/redstoner/modules/naming/Naming.java b/src/main/java/com/redstoner/modules/naming/Naming.java index 9564966..f445336 100644 --- a/src/com/redstoner/modules/naming/Naming.java +++ b/src/main/java/com/redstoner/modules/naming/Naming.java @@ -20,7 +20,7 @@ import com.redstoner.modules.Module; import net.md_5.bungee.api.ChatColor; @Commands(CommandHolderType.File) -@Version(major = 4, minor = 1, revision = 0, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class Naming implements Module { @Command(hook = "anvil") diff --git a/src/main/java/com/redstoner/modules/naming/module.info b/src/main/java/com/redstoner/modules/naming/module.info new file mode 100644 index 0000000..b3b1f24 --- /dev/null +++ b/src/main/java/com/redstoner/modules/naming/module.info @@ -0,0 +1,3 @@ +displayName: Naming +category: Other +description: Lets you change an item name and lore
\ No newline at end of file diff --git a/src/com/redstoner/modules/onlineplayers/OnlinePlayers.java b/src/main/java/com/redstoner/modules/onlineplayers/OnlinePlayers.java index f09d100..626da9d 100644 --- a/src/com/redstoner/modules/onlineplayers/OnlinePlayers.java +++ b/src/main/java/com/redstoner/modules/onlineplayers/OnlinePlayers.java @@ -20,7 +20,7 @@ import com.redstoner.modules.Module; import com.redstoner.modules.datamanager.DataManager; @AutoRegisterListener -@Version(major = 4, minor = 0, revision = 3, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) @SuppressWarnings("unchecked") public class OnlinePlayers implements Module, Listener { diff --git a/src/main/java/com/redstoner/modules/onlineplayers/module.info b/src/main/java/com/redstoner/modules/onlineplayers/module.info new file mode 100644 index 0000000..65c1254 --- /dev/null +++ b/src/main/java/com/redstoner/modules/onlineplayers/module.info @@ -0,0 +1,3 @@ +displayName: OnlinePlayers +category: External +description: Provides a list of all players online with data in a .json file used for Redstoner's "Who's online feature"
\ No newline at end of file diff --git a/src/com/redstoner/modules/reports/Reports.cmd b/src/main/java/com/redstoner/modules/reports/Reports.cmd index 336c418..8f594d5 100644 --- a/src/com/redstoner/modules/reports/Reports.cmd +++ b/src/main/java/com/redstoner/modules/reports/Reports.cmd @@ -1,14 +1,23 @@ command report { + perm utils.report; [string:message...] { - type player; - help Report a player or incident; run report message; + help Report a player or incident; + type player; } } +command undoreport { + alias retractreport; + perm utils.report; + [empty] { + run report_retract; + help Retracts the last report you sent.; + } +} command rp { - perm utils.report; + perm utils.report.admin; - open { + list { help List all open reports; run report_open; } diff --git a/src/com/redstoner/modules/reports/Reports.java b/src/main/java/com/redstoner/modules/reports/Reports.java index 0e55ccc..cad76ee 100644 --- a/src/com/redstoner/modules/reports/Reports.java +++ b/src/main/java/com/redstoner/modules/reports/Reports.java @@ -20,13 +20,13 @@ import com.redstoner.misc.JsonManager; import com.redstoner.misc.Main; import com.redstoner.modules.Module; -import net.md_5.bungee.api.ChatColor; +import net.nemez.chatapi.click.Message; /** Report module. Allows reports to be created and handled by staff * * @author Redempt */ @Commands(CommandHolderType.File) -@Version(major = 4, minor = 1, revision = 0, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class Reports implements Module { private int task = 0; @@ -109,28 +109,25 @@ public class Reports implements Module JSONObject report = (JSONObject) reports.get(id); reports.remove(id); archived.add(report); - sender.sendMessage(ChatColor.GREEN + "Report #" + id + " closed!"); + getLogger().message(sender, "Report #" + id + " closed!"); } @Command(hook = "report_open") public void listOpen(CommandSender sender) { int i = 0; + + Message msg = new Message(sender, null).appendText("\n" + getLogger().getHeader()); for (Object object : reports) { JSONObject report = (JSONObject) object; - String message = ""; - message += ChatColor.DARK_GRAY + "[" + ChatColor.YELLOW + i + ChatColor.DARK_GRAY + "]"; - message += "[" + ChatColor.YELLOW + report.get("time") + ChatColor.DARK_GRAY + "] "; - message += ChatColor.DARK_AQUA + "" + report.get("name"); - message += ChatColor.WHITE + ": " + ChatColor.YELLOW + report.get("message"); - sender.sendMessage(message); + msg.appendText("\n&8[&e" + i + "&8][&e" + report.get("time") + "&8]&3" + + report.get("name") + "&f: &e" + report.get("message")); i++; } if (i == 0) - { - sender.sendMessage(ChatColor.GREEN + "There are no open reports."); - } + msg.appendText("\n&cThere are no open reports."); + msg.send(); } @SuppressWarnings("unchecked") @@ -143,12 +140,35 @@ public class Reports implements Module report.put("name", player.getName()); report.put("time", dateFormat.format(new Date())); report.put("message", message); - String loc = ""; - // Location to string - loc += player.getLocation().getBlockX() + ";" + player.getLocation().getBlockY() + ";" - + player.getLocation().getBlockZ() + ";" + player.getLocation().getWorld().getName(); + String loc = player.getLocation().getBlockX() + ";" + player.getLocation().getBlockY() + ";" + + player.getLocation().getBlockZ() + ";" + player.getLocation().getWorld().getName(); report.put("location", loc); reports.add(report); - sender.sendMessage(ChatColor.GREEN + "Report created!"); + getLogger().message(sender, "Report created! Use &e/undoreport&7 to retract the report."); + } + + + @Command(hook = "report_retract") + public void retractReport(CommandSender sender) + { + String p_name = ((Player) sender).getName(); + + JSONObject lastReport = null; + + for (Object o_report : reports) { + JSONObject report = (JSONObject) o_report; + + String r_name = (String) report.get("name"); + if (r_name.equals(p_name)) + lastReport = report; + } + + if (lastReport == null) { + getLogger().message(sender, true, "You haven't submitted a report."); + return; + } + + reports.remove(lastReport); + getLogger().message(sender, "Successfully retracted your last report."); } } diff --git a/src/main/java/com/redstoner/modules/reports/module.info b/src/main/java/com/redstoner/modules/reports/module.info new file mode 100644 index 0000000..8d24e3a --- /dev/null +++ b/src/main/java/com/redstoner/modules/reports/module.info @@ -0,0 +1,3 @@ +displayName: Reports +category: Staff +description: Adds a /report command for people to use when no staff is on
\ No newline at end of file diff --git a/src/com/redstoner/modules/saylol/Saylol.cmd b/src/main/java/com/redstoner/modules/saylol/Saylol.cmd index 8cc4d44..b81605a 100644 --- a/src/com/redstoner/modules/saylol/Saylol.cmd +++ b/src/main/java/com/redstoner/modules/saylol/Saylol.cmd @@ -1,4 +1,6 @@ command lol { + alias kek; + add [string:text...] { help Lols a text.; run addlol text; diff --git a/src/com/redstoner/modules/saylol/Saylol.java b/src/main/java/com/redstoner/modules/saylol/Saylol.java index 7081aec..a523615 100644 --- a/src/com/redstoner/modules/saylol/Saylol.java +++ b/src/main/java/com/redstoner/modules/saylol/Saylol.java @@ -25,7 +25,7 @@ import net.nemez.chatapi.click.ClickCallback; import net.nemez.chatapi.click.Message; @Commands(CommandHolderType.File) -@Version(major = 4, minor = 1, revision = 0, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class Saylol implements Module { private long lastLol = 0; diff --git a/src/main/java/com/redstoner/modules/saylol/module.info b/src/main/java/com/redstoner/modules/saylol/module.info new file mode 100644 index 0000000..8af4c08 --- /dev/null +++ b/src/main/java/com/redstoner/modules/saylol/module.info @@ -0,0 +1,3 @@ +displayName: Saylol +category: Chat +description: Adds the famous saylol plugin as a module
\ No newline at end of file diff --git a/src/com/redstoner/modules/scriptutils/Scriptutils.cmd b/src/main/java/com/redstoner/modules/scriptutils/Scriptutils.cmd index c8498b2..e4e7ac1 100644 --- a/src/com/redstoner/modules/scriptutils/Scriptutils.cmd +++ b/src/main/java/com/redstoner/modules/scriptutils/Scriptutils.cmd @@ -47,20 +47,6 @@ command script_backup_error { run script_backup_error; } } -command script_trim { - [empty] { - help Prints the world trimming started message and starts trimming; - type console; - run script_trim; - } -} -command script_trim_result { - [string:size] [string:data...] { - help Prints the trimming finished message; - type console; - run script_trim_result size data; - } -} command script_backup_database_begin { [empty] { help Prints the database backup started message and admin-chat warning; @@ -96,20 +82,6 @@ command script_backup_database_abort { run script_backup_database_abort; } } -command script_spigot_update { - [empty] { - help Prints the spigot update message; - type console; - run script_spigot_update; - } -} -command script_disk_filled { - [string:percentage] { - help Prints the admin-chat warning for disk is filled; - type console; - run script_disk_filled percentage; - } -} command script_shutdown { [string:reason] { help Saves all worlds, kicks players and shuts down the server; diff --git a/src/com/redstoner/modules/scriptutils/Scriptutils.java b/src/main/java/com/redstoner/modules/scriptutils/Scriptutils.java index 1d634c0..75521db 100644 --- a/src/com/redstoner/modules/scriptutils/Scriptutils.java +++ b/src/main/java/com/redstoner/modules/scriptutils/Scriptutils.java @@ -11,7 +11,7 @@ import com.redstoner.misc.Utils; import com.redstoner.modules.Module; @Commands(CommandHolderType.File) -@Version(major = 4, minor = 1, revision = 0, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class Scriptutils implements Module { /** Prints Bukkit restart message @@ -89,24 +89,6 @@ public class Scriptutils implements Module Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "save-on"); } - /** Prints the world trimming started message and starts trimming */ - @Command(hook = "script_trim") - public void print_backup_trim(CommandSender sender) - { - Utils.broadcast("", "ยง4 =ยง3 Deleting all chunks beyond border now.", null); - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "wb Creative trim 1000000 15"); - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "wb trim confirm"); - } - - /** Prints the trimming finished message - * arg 0 size difference of world - * arg 1: world border trim data */ - @Command(hook = "script_trim_result") - public void print_backup_trim_res(CommandSender sender, String size, String data) - { - Utils.broadcast("", "ยง4 =ยง3 Chunk deletion saved " + data + " (ยงa" + size + "MBยง3)", null); - } - /** Prints the database backup started message and admin-chat warning */ @Command(hook = "script_backup_database_begin") public void print_backup_db_begin(CommandSender sender) @@ -146,25 +128,6 @@ public class Scriptutils implements Module Utils.broadcast("", "ยง6 =ยง2 Database backup aborted.", null); } - /** Prints the spigot update message */ - @Command(hook = "script_spigot_update") - public void print_update(CommandSender sender) - { - Utils.broadcast("", "ยง9 =ยง2 A new Spigot version has been downloaded!", null); - Utils.broadcast("", "ยง9 =ยง2 Update will be applied after the next reboot.", null); - } - - /** Prints the admin-chat warning for disk is filled - * arg 0 fill percentage */ - @Command(hook = "script_disk_filled") - public void print_disk_filled(CommandSender sender, String percentage) - { - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), - "ac ยง4ยงlWARNING:ยง6 Disk is filled > 96% (" + percentage + "%);"); - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "ac ยง4 Server will shut down at 98%!"); - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "ac ยง4 Contact an admin ยงnimmediatelyยง4!"); - } - /** Saves all worlds, kicks players and shuts down the server * arg 0: reason */ @Command(hook = "script_shutdown") diff --git a/src/main/java/com/redstoner/modules/scriptutils/module.info b/src/main/java/com/redstoner/modules/scriptutils/module.info new file mode 100644 index 0000000..ce7f01c --- /dev/null +++ b/src/main/java/com/redstoner/modules/scriptutils/module.info @@ -0,0 +1,3 @@ +displayName: ScriptUtils +category: External +description: Provides commands to external scripts for sending predefined messages in chat
\ No newline at end of file diff --git a/src/com/redstoner/modules/seen/Seen.cmd b/src/main/java/com/redstoner/modules/seen/Seen.cmd index d17e655..213aa34 100644 --- a/src/com/redstoner/modules/seen/Seen.cmd +++ b/src/main/java/com/redstoner/modules/seen/Seen.cmd @@ -1,39 +1,36 @@ command seen { - [string:player] { + perm utils.seen; + [string:player] { help Displays information about a player.; - perm utils.seen; run seen player; } [string:player] [flag:ips] { help Displays information about a player.; - perm utils.seen; run seen2 player ips; } } command firstseen { - [empty] { - run firstseen; - type player; - help Gives the date and time they first joined; - perm utils.firstseen; - } - [string:person] { - run firstseenP person; - help Gives the date and time when a player first joined; - perm utils.firstseen.other; - } + perm utils.seen.firstseen; + [empty] { + run firstseen; + type player; + help Gives the date and time they first joined; + } + [string:person] { + run firstseenP person; + help Gives the date and time when a player first joined; + } } command playtime { + perm utils.playtime; [empty] { type player; run playtimeDef; - perm utils.playtime; help Displays your total playtime!; } [string:name] { run playtime name; - perm utils.playtime.others; help Displays the playtime of another player. The player must be online!; } } @@ -42,12 +39,12 @@ command uuid { [empty] { type player; run uuidDef; - perm utils.uuid; + perm utils.seen.uuid; help Displays your UUID (click to copy); } [string:name] { run uuid name; - perm utils.uuid.other; + perm utils.seen.uuid.other; help Displays someone elses UUID (click to copy); } }
\ No newline at end of file diff --git a/src/com/redstoner/modules/seen/Seen.java b/src/main/java/com/redstoner/modules/seen/Seen.java index 0948152..e6d0e3d 100644 --- a/src/com/redstoner/modules/seen/Seen.java +++ b/src/main/java/com/redstoner/modules/seen/Seen.java @@ -36,7 +36,7 @@ import net.nemez.chatapi.click.Message; @AutoRegisterListener @Commands(CommandHolderType.File) -@Version(major = 4, minor = 0, revision = 9, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class Seen implements Module, Listener { HashMap<UUID, JSONArray> names = new HashMap<>(); @@ -101,8 +101,11 @@ public class Seen implements Module, Listener { message.add("They're currently &eAFK&7:"); String reason = (String) DataManager.getOrDefault(p.getUniqueId().toString(), "AFK", "afk_reason", ""); + Long timeAFK = (Long) DataManager.getOrDefault(p.getUniqueId().toString(), "AFK", "afk_time", 0L); + + message.add(" &7Duration: &e" + DateUtil.formatDateDiff(timeAFK)); if (reason.length() >= 1) - message.add(" &3- " + reason); + message.add(" &7Reason: &e" + reason); } if (DataManager.getState((Player) p, "vanished")) message.add("They're currently &evanished&7!"); @@ -128,8 +131,8 @@ public class Seen implements Module, Listener message.add("They've joined with the following IPs: &e" + _ips.toJSONString().replaceAll("[\"\\[\\]]", "").replace(",", "&7, &e")); } - message.add( - "Their current IP is: &a" + DataManager.getOrDefault(p.getUniqueId().toString(), "ip", "unknown")); + String ipStr = online? "Their current IP is: &a" : "Their last known IP is: &a"; + message.add(ipStr + DataManager.getOrDefault(p.getUniqueId().toString(), "ip", "unknown")); } getLogger().message(sender, message.toArray(new String[] {})); return true; @@ -255,28 +258,29 @@ public class Seen implements Module, Listener + "ยง7 couldn't be found! Hint: Currently, you can only check statistics of players that are online!"); return true; } - int ticks_lived = player.getStatistic(Statistic.PLAY_ONE_TICK); + + int ticks_lived = player.getStatistic(Statistic.PLAY_ONE_MINUTE); int days = ticks_lived / 1728000; int hours = (ticks_lived % 1728000) / 72000; int minutes = (ticks_lived % 72000) / 1200; + if (sender.getName().equals(name)) { - getLogger().message(sender, - "You have played for &b" - + (days == 0 && hours == 0 && minutes == 0 ? "less than a minute." - : ("a total of: &e" + (days != 0 ? (days + "d ") : "") - + ((hours != 0 || days != 0) ? (hours + "h ") : "") - + ((minutes != 0 || hours != 0 || days != 0) ? (minutes + "m") : ""))) - + "&7."); + getLogger().message(sender, "You have played for a total of: &e" + + (days == 0 && hours == 0 && minutes == 0 ? "< 1m" + : (days != 0 ? days + "d " : "") + + (hours != 0 || days != 0 ? hours + "h " : "") + + (minutes != 0 || hours != 0 || days != 0 ? minutes + "m" : "")) + + "&7."); } else { - getLogger().message(sender, "&3" + name + " &7has played for " - + (days == 0 && hours == 0 && minutes == 0 ? "less than a minute." - : ("a total of: &e" + (days != 0 ? (days + "d ") : "") - + ((hours != 0 || days != 0) ? (hours + "h ") : "") - + ((minutes != 0 || hours != 0 || days != 0) ? (minutes + "m") : ""))) - + "&7."); + getLogger().message(sender, "&3" + Utils.getName(player) + " &7has played for a total of: &e" + + (days == 0 && hours == 0 && minutes == 0 ? "< 1m" + : (days != 0 ? days + "d " : "") + + (hours != 0 || days != 0 ? hours + "h " : "") + + (minutes != 0 || hours != 0 || days != 0 ? minutes + "m" : "")) + + "&7."); } return true; } diff --git a/src/main/java/com/redstoner/modules/seen/module.info b/src/main/java/com/redstoner/modules/seen/module.info new file mode 100644 index 0000000..3a89651 --- /dev/null +++ b/src/main/java/com/redstoner/modules/seen/module.info @@ -0,0 +1,3 @@ +displayName: Seen +category: Other +description: Allows players to see how long someone has been online/offline, previous names, when they first joined, and much time they've logged
\ No newline at end of file diff --git a/src/com/redstoner/modules/signalstrength/SignalStrength.cmd b/src/main/java/com/redstoner/modules/signalstrength/SignalStrength.cmd index 1cfb0fd..1cfb0fd 100644 --- a/src/com/redstoner/modules/signalstrength/SignalStrength.cmd +++ b/src/main/java/com/redstoner/modules/signalstrength/SignalStrength.cmd diff --git a/src/com/redstoner/modules/signalstrength/SignalStrength.java b/src/main/java/com/redstoner/modules/signalstrength/SignalStrength.java index b613b09..2480bfc 100644 --- a/src/com/redstoner/modules/signalstrength/SignalStrength.java +++ b/src/main/java/com/redstoner/modules/signalstrength/SignalStrength.java @@ -28,12 +28,11 @@ import com.redstoner.misc.CommandHolderType; import com.redstoner.modules.Module; @Commands(CommandHolderType.File) -@Version(major = 4, minor = 0, revision = 2, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class SignalStrength implements Module { - private static final String namePrefix = ChatColor.GREEN.toString() + ChatColor.RESET + ChatColor.DARK_PURPLE - + "Signal Strength: " + ChatColor.RED + ChatColor.BOLD; + private static final String namePrefix = ChatColor.DARK_PURPLE + "Signal Strength: " + ChatColor.RED + ChatColor.BOLD; private static String nameForSignalStrength(int strength) { diff --git a/src/main/java/com/redstoner/modules/signalstrength/module.info b/src/main/java/com/redstoner/modules/signalstrength/module.info new file mode 100644 index 0000000..2a8549d --- /dev/null +++ b/src/main/java/com/redstoner/modules/signalstrength/module.info @@ -0,0 +1,3 @@ +displayName: SignalStrength +category: Other +description: Sets the amount of items in a container to achieve the given signal strength
\ No newline at end of file diff --git a/src/com/redstoner/modules/skullclick/SkullClick.java b/src/main/java/com/redstoner/modules/skullclick/SkullClick.java index d581d19..3f08a89 100644 --- a/src/com/redstoner/modules/skullclick/SkullClick.java +++ b/src/main/java/com/redstoner/modules/skullclick/SkullClick.java @@ -14,7 +14,7 @@ import com.redstoner.misc.CommandHolderType; import com.redstoner.modules.Module;
@Commands(CommandHolderType.None)
-@Version(major = 4, minor = 0, revision = 0, compatible = 4)
+@Version(major = 5, minor = 0, revision = 0, compatible = 4)
@AutoRegisterListener
public class SkullClick implements Module, Listener
{
diff --git a/src/main/java/com/redstoner/modules/skullclick/module.info b/src/main/java/com/redstoner/modules/skullclick/module.info new file mode 100644 index 0000000..535ef3d --- /dev/null +++ b/src/main/java/com/redstoner/modules/skullclick/module.info @@ -0,0 +1,3 @@ +displayName: SkullClick +category: Other +description: Click a skull and find out who it was, before they were beheaded. You cruel monster
\ No newline at end of file diff --git a/src/com/redstoner/modules/socialspy/Socialspy.cmd b/src/main/java/com/redstoner/modules/socialspy/Socialspy.cmd index 32159b9..c1e372c 100644 --- a/src/com/redstoner/modules/socialspy/Socialspy.cmd +++ b/src/main/java/com/redstoner/modules/socialspy/Socialspy.cmd @@ -1,4 +1,5 @@ command socialspy { + perm utils.socialspy; format { run config_format_show; help Displays your current format; @@ -59,14 +60,12 @@ command socialspy { run off; type player; } - [empty] { - run toggle; - type player; - } - perm utils.socialspy; migrate { run migrate; type console; } - type all; + [empty] { + run toggle; + type player; + } }
\ No newline at end of file diff --git a/src/com/redstoner/modules/socialspy/Socialspy.java b/src/main/java/com/redstoner/modules/socialspy/Socialspy.java index e1caac9..26d27fd 100644 --- a/src/com/redstoner/modules/socialspy/Socialspy.java +++ b/src/main/java/com/redstoner/modules/socialspy/Socialspy.java @@ -25,7 +25,7 @@ import com.redstoner.modules.datamanager.DataManager; import net.nemez.chatapi.click.Message; @Commands(CommandHolderType.File) -@Version(major = 4, minor = 0, revision = 3, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class Socialspy implements CoreModule { @Command(hook = "config_prefix_default") diff --git a/src/main/java/com/redstoner/modules/socialspy/module.info b/src/main/java/com/redstoner/modules/socialspy/module.info new file mode 100644 index 0000000..f894598 --- /dev/null +++ b/src/main/java/com/redstoner/modules/socialspy/module.info @@ -0,0 +1,3 @@ +displayName: Socialspy +category: Staff +description: Allows staff to see DMs, Chatgroups and other stuff that offers socialspy integration
\ No newline at end of file diff --git a/src/com/redstoner/modules/tag/Tag.cmd b/src/main/java/com/redstoner/modules/tag/Tag.cmd index caa95ab..94bff60 100644 --- a/src/com/redstoner/modules/tag/Tag.cmd +++ b/src/main/java/com/redstoner/modules/tag/Tag.cmd @@ -1,22 +1,19 @@ command tag { + perm utils.tag; add [string:player] [string:tag...] { help Tags a player.; run addtag player tag; - perm utils.tag; } del [string:player] [int:id] { help Removes a tag.; run deltag player id; - perm utils.tag; } check [string:player] { help Lists all tags of a player.;\ run checktag player; - perm utils.tag; } [string:player] [string:tag...] { help Tags a player.; run addtag player tag; - perm utils.tag; } }
\ No newline at end of file diff --git a/src/com/redstoner/modules/tag/Tag.java b/src/main/java/com/redstoner/modules/tag/Tag.java index ae3302d..ce11fea 100644 --- a/src/com/redstoner/modules/tag/Tag.java +++ b/src/main/java/com/redstoner/modules/tag/Tag.java @@ -20,7 +20,7 @@ import com.redstoner.misc.Main; import com.redstoner.modules.Module; @Commands(CommandHolderType.File) -@Version(major = 4, minor = 0, revision = 1, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class Tag implements Module { private File tagLocation = new File(Main.plugin.getDataFolder(), "tag.json"); diff --git a/src/main/java/com/redstoner/modules/tag/module.info b/src/main/java/com/redstoner/modules/tag/module.info new file mode 100644 index 0000000..5448df8 --- /dev/null +++ b/src/main/java/com/redstoner/modules/tag/module.info @@ -0,0 +1,3 @@ +displayName: Tag +category: Staff +description: Add comments to players for easier communication (e.g. "Has spammed before")
\ No newline at end of file diff --git a/src/com/redstoner/modules/teleport/Teleport.cmd b/src/main/java/com/redstoner/modules/teleport/Teleport.cmd index 4e5930e..86ce18e 100644 --- a/src/com/redstoner/modules/teleport/Teleport.cmd +++ b/src/main/java/com/redstoner/modules/teleport/Teleport.cmd @@ -8,11 +8,13 @@ command teleport { alias etpo; alias tp2p; alias etp2p; - [player:string] { + [string:player] { run tp player; + perm utils.teleport.tp; } - [player:string] [player2:string] { + [string:player] [string:player2] { run tp2 player player2; + perm utils.teleport.tp.other; } } @@ -22,8 +24,10 @@ command teleporthere { alias etphere; alias tpohere; alias etpohere; - [player:string] { - run tph player; + perm utils.teleport.tp; + [string:player] { + run tphere player; + perm utils.teleport.tp.here; } } @@ -35,7 +39,8 @@ command teleportask { alias etpr; alias tpask; alias etpask; - [player:string] { + perm utils.teleport.tpa; + [string:player] { run tpa player; } } @@ -48,60 +53,60 @@ command teleportaskhere { alias etrphere; alias tpaskhere; alias etpaskhere; - [player:string] { - run tpah player; + perm utils.teleport.tpa; + [string:player] { + run tpahere player; help ask another player to teleport to you.; } } command tpall { alias etpall; + perm utils.teleport.tpall; [empty] { run tpall; help Teleports everyone to you.; } - [player] { + [string:player] { run tpall2 player; help Teleports everyone to the specified player.; } - perm utils.admin.teleport; } command tpaall { alias etpall; + perm utils.teleport.tpaall; [empty] { run tpaall; help Sends a tpa request to every player.; - perm utils.admin.teleport; } - [player:string] { + [string:player] { run tpaall2 player; help Sends a tpa request to every player.; } - perm utils.admin.teleport; } command tpaccept { alias etpaccept; alias tpyes; alias etpyes; + perm utils.teleport.request; [empty] { run tpaccept; help Accepts the latest pending tpa request.; } - [index:int] { + [int:index] { run tpaccept2 index; help Accepts the specified pending tpa request.; } - perm utils.teleport.request; } command tpacancel { alias etpacencel; + perm utils.teleport.request; [empty] { run tpacancel; help Cancels an outgoing pending tpa request.; - perm utils.teleport.request; } } @@ -113,7 +118,7 @@ command tpdeny { [empty] { run tpdeny; } - [index:int] { + [int:index] { run tpdeny2 index; } } @@ -122,21 +127,21 @@ command tplist { alias etplist; alias tpl; alias etpl; + perm utils.teleport.request; [empty] { - run tpl; + run tplist; } } command tptoggle { alias etptoggle; - [status:string] { + perm utils.teleport.toggle; + [string:status] { run tptoggle status; help sets your tpa status; - perm utils.teleport.toggle; } - [command:string] [status:string] { + [string:command] [string:status] { run tptoggle2 command status; help sets your tpa status for only one command (e.g. tpa/tpahere).; - perm utils.teleport.toggle; } }
\ No newline at end of file diff --git a/src/com/redstoner/modules/teleport/Teleport.java b/src/main/java/com/redstoner/modules/teleport/Teleport.java index 7680852..3ad9f63 100644 --- a/src/com/redstoner/modules/teleport/Teleport.java +++ b/src/main/java/com/redstoner/modules/teleport/Teleport.java @@ -16,7 +16,7 @@ import com.redstoner.modules.datamanager.DataManager; import net.nemez.chatapi.click.Message; @Commands(CommandHolderType.File) -@Version(major = 4, minor = 0, revision = 0, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class Teleport implements Module { public static final String PERMISSION_TELEPORT = "utils.admin.teleport"; @@ -63,6 +63,12 @@ public class Teleport implements Module return true; } + @Command(hook = "tphere") + public boolean tphere(CommandSender sender, String player) + { + return true; + } + @Command(hook = "tpa") public boolean tpa(CommandSender sender, String player) { @@ -75,10 +81,81 @@ public class Teleport implements Module return true; } + @Command(hook = "tpall") + public boolean tpall(CommandSender sender) + { + return true; + } + + @Command(hook = "tpall2") + public boolean tpall2(CommandSender sender, String player) + { + return true; + } + + @Command(hook = "tpaall") + public boolean tpaall(CommandSender sender) + { + return true; + } + + @Command(hook = "tpaall2") + public boolean tpaall2(CommandSender sender, String player) + { + return true; + } + + @Command(hook = "tpaccept") + public boolean tpaccept(CommandSender sender) + { + return true; + } + + @Command(hook = "tpaccept2") + public boolean tpaccept2(CommandSender sender, int index) + { + return true; + } + + @Command(hook = "tpdeny") + public boolean tpdeny(CommandSender sender) + { + return true; + } + + @Command(hook = "tpdeny2") + public boolean tpdeny2(CommandSender sender, int index) + { + return true; + } + + @Command(hook = "tpacancel") + public boolean tpacancel(CommandSender sender) + { + return true; + } + + @Command(hook = "tplist") + public boolean tplist(CommandSender sender) + { + return true; + } + + @Command(hook = "tptoggle") + public boolean tptoggle(CommandSender sender, String status) + { + return true; + } + + @Command(hook = "tptoggle2") + public boolean tptoggle2(CommandSender sender, String command, String status) + { + return true; + } + @Command(hook = "tpmenu") public boolean tpinventory(CommandSender sender) { - return true; } diff --git a/src/main/java/com/redstoner/modules/teleport/module.info b/src/main/java/com/redstoner/modules/teleport/module.info new file mode 100644 index 0000000..ec4e600 --- /dev/null +++ b/src/main/java/com/redstoner/modules/teleport/module.info @@ -0,0 +1,3 @@ +displayName: Teleport +category: Other +description: Allows players to teleport to each other, with permission of course
\ No newline at end of file diff --git a/src/com/redstoner/modules/tilechunks/LaggyTileChunk.java b/src/main/java/com/redstoner/modules/tilechunks/LaggyTileChunk.java index e2456d3..e2456d3 100644 --- a/src/com/redstoner/modules/tilechunks/LaggyTileChunk.java +++ b/src/main/java/com/redstoner/modules/tilechunks/LaggyTileChunk.java diff --git a/src/com/redstoner/modules/tilechunks/TileChunks.cmd b/src/main/java/com/redstoner/modules/tilechunks/TileChunks.cmd index c0e0773..29f1d68 100644 --- a/src/com/redstoner/modules/tilechunks/TileChunks.cmd +++ b/src/main/java/com/redstoner/modules/tilechunks/TileChunks.cmd @@ -1,4 +1,5 @@ command lct { + alias tilechunks; perm utils.tilechunks; list { diff --git a/src/com/redstoner/modules/tilechunks/TileChunks.java b/src/main/java/com/redstoner/modules/tilechunks/TileChunks.java index 75a3fd2..a32f05e 100644 --- a/src/com/redstoner/modules/tilechunks/TileChunks.java +++ b/src/main/java/com/redstoner/modules/tilechunks/TileChunks.java @@ -18,7 +18,7 @@ import com.redstoner.misc.CommandHolderType; import com.redstoner.modules.Module; @Commands(CommandHolderType.File) -@Version(major = 4, minor = 1, revision = 0, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class TileChunks implements Module { private List<LaggyTileChunk> laggyChunks = new ArrayList<>(); diff --git a/src/main/java/com/redstoner/modules/tilechunks/module.info b/src/main/java/com/redstoner/modules/tilechunks/module.info new file mode 100644 index 0000000..ae9c56d --- /dev/null +++ b/src/main/java/com/redstoner/modules/tilechunks/module.info @@ -0,0 +1,3 @@ +displayName: TileChunk +category: Staff +description: Collects information about tile entities across the map and displays chunk info
\ No newline at end of file diff --git a/src/com/redstoner/modules/vanish/Vanish.cmd b/src/main/java/com/redstoner/modules/vanish/Vanish.cmd index 618a4c1..efbc755 100644 --- a/src/com/redstoner/modules/vanish/Vanish.cmd +++ b/src/main/java/com/redstoner/modules/vanish/Vanish.cmd @@ -20,14 +20,15 @@ command vanish { [string:name] { help Toggles someone elses vanish; run vanish_other name; - perm utils.vanishother; + perm utils.vanish.other; } } command imout { + alias imin; + perm utils.vanish.imout; [empty] { help Makes you magically disappear; type player; - perm utils.imout; run imout; } }
\ No newline at end of file diff --git a/src/com/redstoner/modules/vanish/Vanish.java b/src/main/java/com/redstoner/modules/vanish/Vanish.java index d4e57e8..107f40d 100644 --- a/src/com/redstoner/modules/vanish/Vanish.java +++ b/src/main/java/com/redstoner/modules/vanish/Vanish.java @@ -26,7 +26,7 @@ import com.redstoner.modules.datamanager.DataManager; @Commands(CommandHolderType.File) @AutoRegisterListener -@Version(major = 4, minor = 1, revision = 0, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class Vanish implements Module, Listener { private ArrayList<UUID> vanished = new ArrayList<>(); diff --git a/src/main/java/com/redstoner/modules/vanish/module.info b/src/main/java/com/redstoner/modules/vanish/module.info new file mode 100644 index 0000000..ccd82fc --- /dev/null +++ b/src/main/java/com/redstoner/modules/vanish/module.info @@ -0,0 +1,3 @@ +displayName: Vanish +category: Staff +description: Allows staff to hide from the public entirely. &iPoof
\ No newline at end of file diff --git a/src/com/redstoner/modules/warn/Warn.cmd b/src/main/java/com/redstoner/modules/warn/Warn.cmd index 5021e0f..fcd4a8d 100644 --- a/src/com/redstoner/modules/warn/Warn.cmd +++ b/src/main/java/com/redstoner/modules/warn/Warn.cmd @@ -1,15 +1,15 @@ command warn { + perm utils.warn; [empty] { run warn; help Warns other players about definite lag; - perm utils.warn; } } command warnp { + perm utils.warn; [empty] { run warnp; help Warns other players about possible lag; - perm utils.warn; } }
\ No newline at end of file diff --git a/src/com/redstoner/modules/warn/Warn.java b/src/main/java/com/redstoner/modules/warn/Warn.java index c272c67..657c8e5 100644 --- a/src/com/redstoner/modules/warn/Warn.java +++ b/src/main/java/com/redstoner/modules/warn/Warn.java @@ -10,7 +10,7 @@ import com.redstoner.misc.Utils; import com.redstoner.modules.Module; @Commands(CommandHolderType.File) -@Version(major = 4, minor = 1, revision = 0, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class Warn implements Module { @Command(hook = "warn") diff --git a/src/main/java/com/redstoner/modules/warn/module.info b/src/main/java/com/redstoner/modules/warn/module.info new file mode 100644 index 0000000..5ecd46e --- /dev/null +++ b/src/main/java/com/redstoner/modules/warn/module.info @@ -0,0 +1,3 @@ +displayName: Warn +category: Chat +description: Warns other players when someone is about to do something laggy
\ No newline at end of file diff --git a/src/com/redstoner/modules/webtoken/WebToken.cmd b/src/main/java/com/redstoner/modules/webtoken/WebToken.cmd index 898d212..898d212 100644 --- a/src/com/redstoner/modules/webtoken/WebToken.cmd +++ b/src/main/java/com/redstoner/modules/webtoken/WebToken.cmd diff --git a/src/com/redstoner/modules/webtoken/WebToken.java b/src/main/java/com/redstoner/modules/webtoken/WebToken.java index 6a4a8b0..3a521bf 100644 --- a/src/com/redstoner/modules/webtoken/WebToken.java +++ b/src/main/java/com/redstoner/modules/webtoken/WebToken.java @@ -24,7 +24,7 @@ import com.redstoner.misc.mysql.elements.MysqlTable; import com.redstoner.modules.Module; @Commands(CommandHolderType.File) -@Version(major = 4, minor = 1, revision = 0, compatible = 4) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) public class WebToken implements Module { private static final int TOKEN_LENGTH = 6; diff --git a/src/main/java/com/redstoner/modules/webtoken/module.info b/src/main/java/com/redstoner/modules/webtoken/module.info new file mode 100644 index 0000000..765a274 --- /dev/null +++ b/src/main/java/com/redstoner/modules/webtoken/module.info @@ -0,0 +1,3 @@ +displayName: WebToken +category: External +description: Provides a way to generate the token for website signup
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/worldborder/WorldBorder.cmd b/src/main/java/com/redstoner/modules/worldborder/WorldBorder.cmd new file mode 100644 index 0000000..f8f981d --- /dev/null +++ b/src/main/java/com/redstoner/modules/worldborder/WorldBorder.cmd @@ -0,0 +1,16 @@ +command worldborder { + alias wb; + perm utils.worldborder; + get [string:world] { + run getwb world; + help Gets the current info about the given world's worder.; + } + set [string:world] [int:cx] [int:cz] [int:r] { + run setwb world cx cz r; + help Sets the world border with the given center (cx,cz) and a given radius (r).; + } + remove [string:world] { + run remwb world; + help Removes the World Border from the given world.; + } +}
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/worldborder/WorldBorder.java b/src/main/java/com/redstoner/modules/worldborder/WorldBorder.java new file mode 100644 index 0000000..c8da4c3 --- /dev/null +++ b/src/main/java/com/redstoner/modules/worldborder/WorldBorder.java @@ -0,0 +1,193 @@ +package com.redstoner.modules.worldborder; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerPortalEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.vehicle.VehicleMoveEvent; +import org.json.simple.JSONObject; + +import com.nemez.cmdmgr.Command; +import com.redstoner.annotations.AutoRegisterListener; +import com.redstoner.annotations.Commands; +import com.redstoner.annotations.Version; +import com.redstoner.misc.CommandHolderType; +import com.redstoner.misc.JsonManager; +import com.redstoner.misc.Main; +import com.redstoner.modules.Module; + +import net.nemez.chatapi.ChatAPI; + +@AutoRegisterListener +@Commands(CommandHolderType.File) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) +public class WorldBorder implements Module, Listener { + + Map<String, WorldBorderInfo> borderInfos = new HashMap<>(); + + @Command(hook = "getwb") + public void getWorldBorder(CommandSender sender, String world) { + if (Bukkit.getWorld(world) == null) { + getLogger().message(sender, true, "The world, &e" + world + "&7, doesn't exist."); + return; + } + + WorldBorderInfo info = borderInfos.get(world); + if (info == null) + getLogger().message(sender, true, "The world, &e" + world +"&7, hasn't been configured yet."); + else + getLogger().message(sender, "&e" + world + "&7's World Border is " + info.getMessage()); + } + + @Command(hook = "setwb") + public void setWorldBorder(CommandSender sender, String world, int cx, int cz, int r) { + if (Bukkit.getWorld(world) == null) { + getLogger().message(sender, true, "The world, &e" + world + "&7, doesn't exist."); + return; + } + + WorldBorderInfo info = new WorldBorderInfo(cx, cz, r); + borderInfos.put(world, info); + save(); + getLogger().message(sender, "World Border for &e" + world + "&7 is now " + info.getMessage()); + } + + @Command(hook = "remwb") + public void removeWorldBorder(CommandSender sender, String world) { + if (Bukkit.getWorld(world) == null) { + getLogger().message(sender, true, "The world, &e" + world + "&7, doesn't exist."); + return; + } + + WorldBorderInfo info = borderInfos.remove(world); + if (info == null) { + getLogger().message(sender, true, "The world, &e" + world +"&7, hasn't been configured yet."); + return; + } + save(); + getLogger().message(sender, "World Border for &e" + world + "&7 has been removed."); + } + + @SuppressWarnings("unchecked") + private void save() { + File file = new File(Main.plugin.getDataFolder(), "WorldBorder.json"); + JSONObject j = new JSONObject(); + + for(String world : borderInfos.keySet()) + j.put(world, borderInfos.get(world).toJSONObject()); + JsonManager.save(j, file); + } + + @SuppressWarnings("unchecked") + public void postEnable() { + File file = new File(Main.plugin.getDataFolder(), "WorldBorder.json"); + + if (!file.exists()) { + JSONObject j = new JSONObject(); + j.put("placeholder", new WorldBorderInfo(0, 0, 0).toJSONObject()); + JsonManager.save(j, file); + return; + } + + JSONObject j = JsonManager.getObject(file); + + if (j.get("placeholder") != null) { + j.remove("placeholder"); + getLogger().warn("Detected placeholder in config, ignoring!"); + } + + for (Object o : j.keySet()) { + String world = (String) o; + WorldBorderInfo info = WorldBorderInfo.fromJSONObject((JSONObject) j.get(world)); + borderInfos.put(world, info); + getLogger().info("Loaded world, &e" + world + "&7, with the boarder " + info.getMessage()); + } + } + + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onBlockPlace(BlockPlaceEvent event) { + + Location loc = event.getBlockPlaced().getLocation(); + if (loc == null) + return; + + World world = loc.getWorld(); + if (world == null) + return; + WorldBorderInfo info = borderInfos.get(world.getName()); + if (info == null) + return; + + if (!info.isCordanateWithinBounds(loc.getBlockX(), loc.getBlockZ())) + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onVehicleMove(VehicleMoveEvent event) { + Location to = event.getTo(); + WorldBorderInfo info = borderInfos.get(to.getWorld().getName()); + if (!info.isCordanateWithinBounds(to.getBlockX(), to.getBlockZ())) + event.getVehicle().remove(); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onPlayerMove(PlayerMoveEvent event) { + + Player p = event.getPlayer(); + + Location loc = getFinalLocation(p, event.getFrom(), + event.getTo(), "&cYou've Reached the WorldBorder!"); + if (loc == null) + event.setCancelled(true); + else + event.setTo(loc); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onPlayerTeleport(PlayerTeleportEvent event) { + Location loc = getFinalLocation(event.getPlayer(), event.getFrom(), + event.getTo(), "&cYou've Teleported to an Invalid Location, returning!"); + if (loc == null) + event.setCancelled(true); + else + event.setTo(loc); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onPlayerPortal(PlayerPortalEvent event) { + Location loc = getFinalLocation(event.getPlayer(), event.getFrom(), + event.getTo(), "&cYou've Reached an Invalid Location, returning!"); + if (loc == null) + event.setCancelled(true); + else + event.setTo(loc); + } + + + private Location getFinalLocation(Player p, Location from, Location to, String message) { + WorldBorderInfo info = borderInfos.get(to.getWorld().getName()); + + if (info == null || info.isCordanateWithinBounds(to.getBlockX(), to.getBlockZ())) + return to; + else { + System.out.println(p.isInsideVehicle()); + if (p.isInsideVehicle()) + p.getVehicle().remove(); + ChatAPI.sendActionBar(p, message); + return from; + } + } +} diff --git a/src/main/java/com/redstoner/modules/worldborder/WorldBorderInfo.java b/src/main/java/com/redstoner/modules/worldborder/WorldBorderInfo.java new file mode 100644 index 0000000..7ff4430 --- /dev/null +++ b/src/main/java/com/redstoner/modules/worldborder/WorldBorderInfo.java @@ -0,0 +1,46 @@ +package com.redstoner.modules.worldborder; + +import org.json.simple.JSONObject; + +public class WorldBorderInfo { + + private final String message; + private final int cx, cz, r; + private final int maxX, minX, maxZ, minZ; + + public WorldBorderInfo(int cx, int cz, int r) { + this.cx = cx; + this.cz = cz; + this.r = r; + this.maxX = cx + r; + this.minX = cx - r; + this.maxZ = cz + r; + this.minZ = cz - r; + this.message = "&7centered at &e(" + cx + "," + cz + ")&7 with a radius of &e" + r + "&7."; + } + + public boolean isCordanateWithinBounds(int x, int z) { + return x > minX && x < maxX && z > minZ && z < maxZ; + } + + public String getMessage() { + return message; + } + + @SuppressWarnings("unchecked") + public JSONObject toJSONObject() { + JSONObject j = new JSONObject(); + + j.put("cx", cx); + j.put("cz", cz); + j.put("r", r); + + return j; + } + + public static WorldBorderInfo fromJSONObject(JSONObject j) { + return new WorldBorderInfo(((Long)j.get("cx")).intValue(), + ((Long)j.get("cz")).intValue(), ((Long)j.get("r")).intValue()); + } + +} diff --git a/src/main/java/com/redstoner/modules/worldborder/module.info b/src/main/java/com/redstoner/modules/worldborder/module.info new file mode 100644 index 0000000..707e522 --- /dev/null +++ b/src/main/java/com/redstoner/modules/worldborder/module.info @@ -0,0 +1,3 @@ +displayName: WorldBorder +category: Other +description: prevents player from going too far, and prevents blocks from being placed there
\ No newline at end of file diff --git a/src/com/redstoner/utils/CommandException.java b/src/main/java/com/redstoner/utils/CommandException.java index 0b12125..0b12125 100644 --- a/src/com/redstoner/utils/CommandException.java +++ b/src/main/java/com/redstoner/utils/CommandException.java diff --git a/src/com/redstoner/utils/CommandMap.java b/src/main/java/com/redstoner/utils/CommandMap.java index 4003b01..4003b01 100644 --- a/src/com/redstoner/utils/CommandMap.java +++ b/src/main/java/com/redstoner/utils/CommandMap.java diff --git a/src/com/redstoner/utils/ItemProperties.java b/src/main/java/com/redstoner/utils/ItemProperties.java index cddd0a4..13dc620 100644 --- a/src/com/redstoner/utils/ItemProperties.java +++ b/src/main/java/com/redstoner/utils/ItemProperties.java @@ -6,6 +6,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.function.BiConsumer; +import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -19,6 +20,7 @@ import org.json.simple.parser.ParseException; public class ItemProperties { private int id = 0; + private Material type; private byte data = 0; private int amount = 1; private Map<Enchantment, Integer> enchantments; @@ -34,7 +36,8 @@ public class ItemProperties { if (item == null) return; - id = item.getTypeId(); + id = item.getType().getId(); + type = item.getType(); data = item.getData().getData(); amount = item.getAmount(); enchantments = new HashMap<>(); @@ -59,7 +62,7 @@ public class ItemProperties @SuppressWarnings("deprecation") public ItemStack toItemStack() { - ItemStack result = new ItemStack(id, amount, data); + ItemStack result = new ItemStack(type, amount, data); ItemMeta meta = result.getItemMeta(); if (meta == null) return result; @@ -87,7 +90,7 @@ public class ItemProperties return result; } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "deprecation" }) public JSONObject toJSONObject() { JSONObject object = new JSONObject(); @@ -125,7 +128,7 @@ public class ItemProperties return toJSONObject().toString(); } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "unchecked", "deprecation" }) public ItemProperties loadFrom(JSONObject object) { for (Object obj : object.entrySet()) diff --git a/src/com/redstoner/utils/ThrowingSupplier.java b/src/main/java/com/redstoner/utils/ThrowingSupplier.java index 986746b..986746b 100644 --- a/src/com/redstoner/utils/ThrowingSupplier.java +++ b/src/main/java/com/redstoner/utils/ThrowingSupplier.java |