diff --git a/.idea/misc.xml b/.idea/misc.xml index 53589ce..d7d60b7 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -12,4 +12,7 @@ + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 522e9ee..dd10e82 100644 --- a/build.gradle +++ b/build.gradle @@ -27,12 +27,15 @@ repositories { name = 'sonatype' url = 'https://oss.sonatype.org/content/groups/public/' } + maven { url "https://repo.dmulloy2.net/repository/public/" } } dependencies { compileOnly 'io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT' implementation 'com.google.code.gson:gson:2.10.1' - implementation files("libs/PDK-1.3.4.jar") + implementation files("libs/PDK-1.3.3.jar") + compileOnly 'com.comphenix.protocol:ProtocolLib:5.1.0' + implementation 'com.maxmind.geoip2:geoip2:2.17.0' } def targetJavaVersion = 17 diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..0e75572 --- /dev/null +++ b/build.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +# Run Gradle build +./gradlew build + +# Check if the build was successful +if [ $? -eq 0 ]; then + echo "Gradle build successful." + + # SFTP upload + SFTP_HOST="home-server" + SFTP_USER="trouper" + SFTP_REMOTE_DIR="/home/trouper/minecraft/data/plugins/" + + # Create a temporary file with a unique name + TEMP_FILE=$(mktemp) + + # Specify the local file to upload + LOCAL_FILE="/run/media/trouper/'1TB drive'/IJ/IdeaProjects/UltraUtils/build/libs/UltraUtils-0.0.1.jar" + + # Write the SFTP commands to the temporary file + echo "put $LOCAL_FILE $SFTP_REMOTE_DIR" > "$TEMP_FILE" + echo "bye" >> "$TEMP_FILE" + + # Use sftp non-interactively with the specified commands + sftp -oStrictHostKeyChecking=no -P 689 -oBatchMode=no -b "$TEMP_FILE" "$SFTP_USER@$SFTP_HOST" + + # Remove the temporary file + rm -f "$TEMP_FILE" + + # SSH command to reload the plugin on the host + #SSH_COMMANDS=( + # "pm reload UltraUtils" + # "execute at @a run playsound minecraft:entity.experience_orb.pickup master @a \~ \~ \~ 100 1 1" + # "tellraw @a '\"'[Server] Reload Complete, Upload Successful.'\"'" + #) + + #for cmd in "${SSH_COMMANDS[@]}"; do + # ssh -oStrictHostKeyChecking=no -oBatchMode=no "$SFTP_USER@$SFTP_HOST" "docker exec docker_mc_1 mc-send-to-console $cmd" + #done + + echo "Plugin Uploaded." +else + echo "Gradle build failed." +fi diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 index 1b6c787..a416d75 --- a/gradlew +++ b/gradlew @@ -31,7 +31,7 @@ # # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: -# * functions; +# * me.trouper.ultrautils.functions; # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», # «${var#prefix}», «${var%suffix}», and «$( cmd )»; # * compound commands having a testable exit status, especially «case»; diff --git a/libs/PDK-1.3.3.jar b/libs/PDK-1.3.3.jar new file mode 100644 index 0000000..84c267d Binary files /dev/null and b/libs/PDK-1.3.3.jar differ diff --git a/src/main/java/me/trouper/ultrautils/UltraUtils.java b/src/main/java/me/trouper/ultrautils/UltraUtils.java index 75d7295..d7ae732 100644 --- a/src/main/java/me/trouper/ultrautils/UltraUtils.java +++ b/src/main/java/me/trouper/ultrautils/UltraUtils.java @@ -2,12 +2,19 @@ package me.trouper.ultrautils; import io.github.itzispyder.pdk.PDK; import io.github.itzispyder.pdk.utils.misc.JsonSerializable; +import me.trouper.ultrautils.commands.EnderChestCommand; import me.trouper.ultrautils.commands.UltraUtilsCommand; +import me.trouper.ultrautils.commands.admin.BroadcastCommand; +import me.trouper.ultrautils.commands.admin.MacroToolCommand; +import me.trouper.ultrautils.commands.admin.WorldCommand; import me.trouper.ultrautils.commands.gamemode.*; import me.trouper.ultrautils.commands.mobility.FlyCommand; import me.trouper.ultrautils.commands.mobility.SpeedCommand; import me.trouper.ultrautils.commands.workstations.*; import me.trouper.ultrautils.data.config.Config; +import me.trouper.ultrautils.data.config.Storage; +import me.trouper.ultrautils.events.JoinLeaveEvent; +import me.trouper.ultrautils.events.MacroUseEvent; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; @@ -18,7 +25,9 @@ public final class UltraUtils extends JavaPlugin { private static UltraUtils instance; private static final File configFile = new File("plugins/UltraUtils/main-config.json"); + private static final File storagefile = new File("plugins/UltraUtils/storage.json"); public static Config config = JsonSerializable.load(configFile, Config.class, new Config()); + public static Storage storage = JsonSerializable.load(storagefile, Storage.class, new Storage()); public static final Logger log = Bukkit.getLogger(); /** @@ -58,12 +67,17 @@ public final class UltraUtils extends JavaPlugin { new StonecutterCommand().register(); new FlyCommand().register(); new SpeedCommand().register(); + new WorldCommand().register(); + new BroadcastCommand().register(); + new MacroToolCommand().register(); + new EnderChestCommand().register(); // Events + new JoinLeaveEvent().register(); + new MacroUseEvent().register(); log.info(""" - Finished! - UltraUtils has loaded. + Finished, UltraUtils has loaded. """); } @@ -72,10 +86,11 @@ public final class UltraUtils extends JavaPlugin { // Init config = JsonSerializable.load(configFile, Config.class,new Config()); + storage = JsonSerializable.load(storagefile, Storage.class,new Storage()); // Save config.save(); - + storage.save(); } diff --git a/src/main/java/me/trouper/ultrautils/commands/EnderChestCommand.java b/src/main/java/me/trouper/ultrautils/commands/EnderChestCommand.java new file mode 100644 index 0000000..0f7ead7 --- /dev/null +++ b/src/main/java/me/trouper/ultrautils/commands/EnderChestCommand.java @@ -0,0 +1,34 @@ +package me.trouper.ultrautils.commands; + +import io.github.itzispyder.pdk.commands.Args; +import io.github.itzispyder.pdk.commands.CommandRegistry; +import io.github.itzispyder.pdk.commands.CustomCommand; +import io.github.itzispyder.pdk.commands.Permission; +import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import me.trouper.ultrautils.functions.Text; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +@CommandRegistry(value = "enderchest",permission = @Permission("ultrautils.enderchest"),playersOnly = true) +public class EnderChestCommand implements CustomCommand { + @Override + public void dispatchCommand(CommandSender sender, Command command, Args args) { + Player user = (Player) sender; + Player target = Bukkit.getPlayer(args.get(0).toString()); + if (target == null) target = user; + if (user.equals(target)) { + user.openInventory(user.getEnderChest()); + } else if (user.hasPermission("ultrautils.enderchest.others")) { + user.openInventory(target.getEnderChest()); + } else { + user.sendMessage(Text.prefix("You lack the permission to see other player's enderchest.")); + } + } + + @Override + public void dispatchCompletions(CompletionBuilder b, CommandSender sender) { + + } +} diff --git a/src/main/java/me/trouper/ultrautils/commands/UltraUtilsCommand.java b/src/main/java/me/trouper/ultrautils/commands/UltraUtilsCommand.java index b1b1bc6..8ceef67 100644 --- a/src/main/java/me/trouper/ultrautils/commands/UltraUtilsCommand.java +++ b/src/main/java/me/trouper/ultrautils/commands/UltraUtilsCommand.java @@ -6,17 +6,59 @@ import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; import me.trouper.ultrautils.UltraUtils; +import me.trouper.ultrautils.functions.ImageUtils; +import me.trouper.ultrautils.functions.Text; +import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.ScoreboardManager; +import org.bukkit.scoreboard.Team; + +import java.util.List; @CommandRegistry(value = "ultrautils", permission = @Permission("ultrautils.admin"), printStackTrace = true) public class UltraUtilsCommand implements CustomCommand { @Override - public void dispatchCommand(CommandSender sender, Args args) { + public void dispatchCommand(CommandSender sender, Command command, Args args) { Player p = (Player) sender; switch (args.get(0).toString()) { + case "resetscoreboard" -> { + p.sendMessage(Text.prefix("Starting vanilla scoreboard reset...")); + ScoreboardManager manager = Bukkit.getScoreboardManager(); + if (manager == null) return; + Scoreboard board = manager.getMainScoreboard(); + for (Objective objective : board.getObjectives()) { + p.sendMessage(Text.color("&7Removing objective &a%s&7.".formatted(objective.getName()))); + objective.unregister(); + } + for (Team team : board.getTeams()) { + p.sendMessage(Text.color("&7Removing team &a%s&7.".formatted(team.getName()))); + team.unregister(); + } + for (OfflinePlayer offlinePlayer : Bukkit.getOfflinePlayers()) { + p.sendMessage(Text.color("&7Removing entry &a%s&7.".formatted(offlinePlayer.getName()))); + board.resetScores(offlinePlayer); + } + p.sendMessage(Text.prefix("Scoreboard reset complete!")); + } + case "image" -> { + String url = args.get(1).toString(); + List imageLines = ImageUtils.imageToList("https://crafatar.com/avatars/0e68b123-6df9-4201-a822-4ffae822d429?size=8"); + imageLines.set(2,imageLines.get(2) + " "); + imageLines.set(3,imageLines.get(3) + " §bNice One"); + imageLines.set(4,imageLines.get(4) + " §fImage Printer"); + imageLines.set(5,imageLines.get(5) + " "); + imageLines.set(7,imageLines.get(7) + " §8§m=========================="); + imageLines.set(0,imageLines.get(0) + " §8§m=========================="); + Bukkit.broadcastMessage(String.join("\n", imageLines)); + } case "toggle" -> { switch (args.get(1).toString()) { case "debug" -> { @@ -25,13 +67,18 @@ public class UltraUtilsCommand implements CustomCommand { } } } + default -> { + sender.sendMessage(Component.text(Text.prefix( + "&bAuthor:&f obvWolf" + ))); + } } } @Override - public void dispatchCompletions(CompletionBuilder b) { + public void dispatchCompletions(CompletionBuilder b, CommandSender sender) { b.then(b.arg("toggle") - .then(b.arg("debug")) - ); + .then(b.arg("debug"))) + .then(b.arg("resetscoreboard")); } } diff --git a/src/main/java/me/trouper/ultrautils/commands/admin/BroadcastCommand.java b/src/main/java/me/trouper/ultrautils/commands/admin/BroadcastCommand.java new file mode 100644 index 0000000..f254bb2 --- /dev/null +++ b/src/main/java/me/trouper/ultrautils/commands/admin/BroadcastCommand.java @@ -0,0 +1,26 @@ +package me.trouper.ultrautils.commands.admin; + +import io.github.itzispyder.pdk.commands.Args; +import io.github.itzispyder.pdk.commands.CommandRegistry; +import io.github.itzispyder.pdk.commands.CustomCommand; +import io.github.itzispyder.pdk.commands.Permission; +import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import me.trouper.ultrautils.UltraUtils; +import me.trouper.ultrautils.functions.Text; +import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +@CommandRegistry(value = "broadcast", permission = @Permission("ultrautils.broadcast")) +public class BroadcastCommand implements CustomCommand { + + @Override + public void dispatchCommand(CommandSender commandSender, Command command, Args args) { + Bukkit.getServer().broadcast(Component.text(Text.color(UltraUtils.config.broadcastPrefix + args.getAll().toString()))); + } + + @Override + public void dispatchCompletions(CompletionBuilder completionBuilder, CommandSender sender) { + + } +} diff --git a/src/main/java/me/trouper/ultrautils/commands/admin/MacroToolCommand.java b/src/main/java/me/trouper/ultrautils/commands/admin/MacroToolCommand.java new file mode 100644 index 0000000..b5448d5 --- /dev/null +++ b/src/main/java/me/trouper/ultrautils/commands/admin/MacroToolCommand.java @@ -0,0 +1,122 @@ +package me.trouper.ultrautils.commands.admin; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import io.github.itzispyder.pdk.commands.Args; +import io.github.itzispyder.pdk.commands.CommandRegistry; +import io.github.itzispyder.pdk.commands.CustomCommand; +import io.github.itzispyder.pdk.commands.Permission; +import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import me.trouper.ultrautils.UltraUtils; +import me.trouper.ultrautils.functions.Text; +import org.bukkit.NamespacedKey; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; + +import java.util.ArrayList; +import java.util.List; + +@CommandRegistry(value = "macrotool",permission = @Permission("ultrautils.macrotool"),playersOnly = true,printStackTrace = true) +public class MacroToolCommand implements CustomCommand { + @Override + public void dispatchCommand(CommandSender sender, Command cmd, Args args) { + Player p = (Player) sender; + String command = args.getAll(1).toString(); + ItemStack item = p.getInventory().getItemInMainHand(); + if (item.isEmpty()) { + p.sendMessage(Text.prefix("You must hold out an item!")); + return; + } + switch (args.get(0).toString()) { + case "add" -> { + p.sendMessage(Text.prefix("Adding the macro &e%s&7 to your item.".formatted(command))); + addMacro(item,command); + } + case "remove" -> { + p.sendMessage(Text.prefix("Removing the macro &e%s&7 from your item.".formatted(command))); + removeMacro(item,command); + } + case "clear" -> { + p.sendMessage(Text.prefix("Cleared the macros on your item.")); + clearMacros(item); + } + case "get" -> { + p.sendMessage(Text.prefix("Macros: &b%s".formatted(getMacros(item).toString()))); + } + } + + + } + + @Override + public void dispatchCompletions(CompletionBuilder b, CommandSender sender) { + b.then(b.arg("add","clear","get")) + .then(b.arg("remove") + .then(b.arg(getMacros(((Player) sender).getInventory().getItemInMainHand())))); + } + + private static final NamespacedKey MACROS_KEY = new NamespacedKey(UltraUtils.getInstance(), "macros"); + + public void setMacros(ItemStack item, List commands) { + ItemMeta meta = item.getItemMeta(); + PersistentDataContainer data = meta.getPersistentDataContainer(); + + JsonObject obj = new JsonObject(); + JsonArray macroList = new JsonArray(); + + for (String macro : commands) { + macroList.add(macro); + } + + obj.add("macro-commands", macroList); + data.set(MACROS_KEY,PersistentDataType.STRING, obj.toString()); + item.setItemMeta(meta); + } + + public void addMacro(ItemStack item, String command) { + List currentCommands = getMacros(item); + currentCommands.add(command); + setMacros(item,currentCommands); + } + + public void removeMacro(ItemStack item, String command) { + List currentCommands = getMacros(item); + if (!currentCommands.remove(command)) return; + setMacros(item,currentCommands); + } + + public void clearMacros(ItemStack item) { + ItemMeta meta = item.getItemMeta(); + PersistentDataContainer data = meta.getPersistentDataContainer(); + data.remove(MACROS_KEY); + item.setItemMeta(meta); + } + + public List getMacros(ItemStack item) { + ItemMeta meta = item.getItemMeta(); + PersistentDataContainer data = meta.getPersistentDataContainer(); + List commands = new ArrayList<>(); + + String json = data.get(MACROS_KEY, PersistentDataType.STRING); + + if (json == null) return new ArrayList<>(); + + JsonObject loaded = JsonParser.parseString(json).getAsJsonObject(); + + for (JsonElement element : loaded.get("macro-commands").getAsJsonArray()) { + commands.add(element.getAsString()); + } + + return commands; + } + + + +} diff --git a/src/main/java/me/trouper/ultrautils/commands/admin/WorldCommand.java b/src/main/java/me/trouper/ultrautils/commands/admin/WorldCommand.java new file mode 100644 index 0000000..ea58a63 --- /dev/null +++ b/src/main/java/me/trouper/ultrautils/commands/admin/WorldCommand.java @@ -0,0 +1,68 @@ +package me.trouper.ultrautils.commands.admin; + +import io.github.itzispyder.pdk.commands.Args; +import io.github.itzispyder.pdk.commands.CommandRegistry; +import io.github.itzispyder.pdk.commands.CustomCommand; +import io.github.itzispyder.pdk.commands.Permission; +import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import io.github.itzispyder.pdk.utils.ServerUtils; +import me.trouper.ultrautils.functions.Text; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +@CommandRegistry(value = "world",permission = @Permission("ultrautils.world"),printStackTrace = true) +public class WorldCommand implements CustomCommand { + + @Override + public void dispatchCommand(CommandSender sender, Command command, Args args) { + String worldName = args.get(0).toString(); + World world = Bukkit.getWorld(worldName); + if (world == null) { + sender.sendMessage(Text.prefix("That world does not exist!")); + return; + } + Player target = Bukkit.getPlayer(args.get(1).toString()); + if (target == null && !(sender instanceof Player)) { + sender.sendMessage(Text.prefix("You must be a player, or specify a target user to execute this command!")); + return; + } + if (target == null) target = (Player) sender; + Location where = world.getSpawnLocation(); + if (where == null) where = new Location(world,0,64,0); + + + if (target.equals((Player) sender)) { + target.teleport(where); + sender.sendMessage(Text.prefix("Successfully moved you to &e%s&7.".formatted(world.getName()))); + + } else if (sender.hasPermission("ultrautils.world.others")) { + target.teleport(where); + target.sendMessage(Text.prefix("You have been moved to &a%s&7.".formatted(world.getName()))); + sender.sendMessage(Text.prefix("Moved &a%s&7 to &e%s&7.".formatted(target.getName(),world.getName()))); + } else { + sender.sendMessage(Text.prefix("You do not have permission to move other players.")); + } + + } + + @Override + public void dispatchCompletions(CompletionBuilder b, CommandSender sender) { + List worlds = new ArrayList<>(); + for (World world : Bukkit.getWorlds()) { + worlds.add(world.getName()); + } + List players = new ArrayList<>(); + for (Player player : ServerUtils.players()) { + players.add(player.getName()); + } + b.then(b.arg(worlds) + .then(b.arg(players))); + } +} diff --git a/src/main/java/me/trouper/ultrautils/commands/gamemode/GMACommand.java b/src/main/java/me/trouper/ultrautils/commands/gamemode/GMACommand.java index 3bafb1b..08b6683 100644 --- a/src/main/java/me/trouper/ultrautils/commands/gamemode/GMACommand.java +++ b/src/main/java/me/trouper/ultrautils/commands/gamemode/GMACommand.java @@ -1,25 +1,22 @@ package me.trouper.ultrautils.commands.gamemode; -import functions.Text; import io.github.itzispyder.pdk.commands.Args; import io.github.itzispyder.pdk.commands.CommandRegistry; import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; -import io.github.itzispyder.pdk.utils.ServerUtils; +import me.trouper.ultrautils.functions.Text; import org.bukkit.Bukkit; import org.bukkit.GameMode; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.List; - -@CommandRegistry(value = "gma",permission = @Permission("ultrautils.gamemode.adventure")) +@CommandRegistry(value = "gma",permission = @Permission("ultrautils.gamemode.adventure"),printStackTrace = true) public class GMACommand implements CustomCommand { @Override - public void dispatchCommand(CommandSender commandSender, Args args) { + public void dispatchCommand(CommandSender commandSender, Command command, Args args) { Player target = Bukkit.getPlayer(args.get(0).toString()); if (target == null && (commandSender instanceof Player)) target = (Player) commandSender; if (target == null) { @@ -34,11 +31,7 @@ public class GMACommand implements CustomCommand { } @Override - public void dispatchCompletions(CompletionBuilder b) { - List players = new ArrayList<>(); - for (Player player : ServerUtils.players()) { - players.add(player.getName()); - } - b.then(b.arg(players)); + public void dispatchCompletions(CompletionBuilder b, CommandSender sender) { + b.arg(Bukkit.getOnlinePlayers(),Player::getName); } } diff --git a/src/main/java/me/trouper/ultrautils/commands/gamemode/GMCCommand.java b/src/main/java/me/trouper/ultrautils/commands/gamemode/GMCCommand.java index ee33afc..c082f13 100644 --- a/src/main/java/me/trouper/ultrautils/commands/gamemode/GMCCommand.java +++ b/src/main/java/me/trouper/ultrautils/commands/gamemode/GMCCommand.java @@ -1,25 +1,22 @@ package me.trouper.ultrautils.commands.gamemode; -import functions.Text; import io.github.itzispyder.pdk.commands.Args; import io.github.itzispyder.pdk.commands.CommandRegistry; import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; -import io.github.itzispyder.pdk.utils.ServerUtils; +import me.trouper.ultrautils.functions.Text; import org.bukkit.Bukkit; import org.bukkit.GameMode; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.List; - -@CommandRegistry(value = "gmc",permission = @Permission("ultrautils.gamemode.creative")) +@CommandRegistry(value = "gmc",permission = @Permission("ultrautils.gamemode.creative"),printStackTrace = true) public class GMCCommand implements CustomCommand { @Override - public void dispatchCommand(CommandSender commandSender, Args args) { + public void dispatchCommand(CommandSender commandSender, Command command, Args args) { Player target = Bukkit.getPlayer(args.get(0).toString()); if (target == null && (commandSender instanceof Player)) target = (Player) commandSender; if (target == null) { @@ -33,11 +30,7 @@ public class GMCCommand implements CustomCommand { GamemodeCommand.setGameMode(commandSender,target,GameMode.CREATIVE,"ultrautils.gamemode.creative");} @Override - public void dispatchCompletions(CompletionBuilder b) { - List players = new ArrayList<>(); - for (Player player : ServerUtils.players()) { - players.add(player.getName()); - } - b.then(b.arg(players)); + public void dispatchCompletions(CompletionBuilder b, CommandSender sender) { + b.arg(Bukkit.getOnlinePlayers(),Player::getName); } } diff --git a/src/main/java/me/trouper/ultrautils/commands/gamemode/GMSCommand.java b/src/main/java/me/trouper/ultrautils/commands/gamemode/GMSCommand.java index 02b67d7..2a134fa 100644 --- a/src/main/java/me/trouper/ultrautils/commands/gamemode/GMSCommand.java +++ b/src/main/java/me/trouper/ultrautils/commands/gamemode/GMSCommand.java @@ -1,25 +1,22 @@ package me.trouper.ultrautils.commands.gamemode; -import functions.Text; import io.github.itzispyder.pdk.commands.Args; import io.github.itzispyder.pdk.commands.CommandRegistry; import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; -import io.github.itzispyder.pdk.utils.ServerUtils; +import me.trouper.ultrautils.functions.Text; import org.bukkit.Bukkit; import org.bukkit.GameMode; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.List; - -@CommandRegistry(value = "gms",permission = @Permission("ultrautils.gamemode.survival")) +@CommandRegistry(value = "gms",permission = @Permission("ultrautils.gamemode.survival"),printStackTrace = true) public class GMSCommand implements CustomCommand { @Override - public void dispatchCommand(CommandSender commandSender, Args args) { + public void dispatchCommand(CommandSender commandSender, Command command, Args args) { Player target = Bukkit.getPlayer(args.get(0).toString()); if (target == null && (commandSender instanceof Player)) target = (Player) commandSender; if (target == null) { @@ -33,11 +30,7 @@ public class GMSCommand implements CustomCommand { GamemodeCommand.setGameMode(commandSender,target,GameMode.SURVIVAL,"ultrautils.gamemode.survival");} @Override - public void dispatchCompletions(CompletionBuilder b) { - List players = new ArrayList<>(); - for (Player player : ServerUtils.players()) { - players.add(player.getName()); - } - b.then(b.arg(players)); + public void dispatchCompletions(CompletionBuilder b, CommandSender sender) { + b.arg(Bukkit.getOnlinePlayers(),Player::getName); } } diff --git a/src/main/java/me/trouper/ultrautils/commands/gamemode/GMSPCommand.java b/src/main/java/me/trouper/ultrautils/commands/gamemode/GMSPCommand.java index ed53e78..19be441 100644 --- a/src/main/java/me/trouper/ultrautils/commands/gamemode/GMSPCommand.java +++ b/src/main/java/me/trouper/ultrautils/commands/gamemode/GMSPCommand.java @@ -1,25 +1,22 @@ package me.trouper.ultrautils.commands.gamemode; -import functions.Text; import io.github.itzispyder.pdk.commands.Args; import io.github.itzispyder.pdk.commands.CommandRegistry; import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; -import io.github.itzispyder.pdk.utils.ServerUtils; +import me.trouper.ultrautils.functions.Text; import org.bukkit.Bukkit; import org.bukkit.GameMode; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.List; - -@CommandRegistry(value = "gmc",permission = @Permission("ultrautils.gamemode.spectator")) +@CommandRegistry(value = "gmsp",permission = @Permission("ultrautils.gamemode.spectator"),printStackTrace = true) public class GMSPCommand implements CustomCommand { @Override - public void dispatchCommand(CommandSender commandSender, Args args) { + public void dispatchCommand(CommandSender commandSender, Command command, Args args) { Player target = Bukkit.getPlayer(args.get(0).toString()); if (target == null && (commandSender instanceof Player)) target = (Player) commandSender; if (target == null) { @@ -34,11 +31,7 @@ public class GMSPCommand implements CustomCommand { } @Override - public void dispatchCompletions(CompletionBuilder b) { - List players = new ArrayList<>(); - for (Player player : ServerUtils.players()) { - players.add(player.getName()); - } - b.then(b.arg(players)); + public void dispatchCompletions(CompletionBuilder b, CommandSender sender) { + b.arg(Bukkit.getOnlinePlayers(),Player::getName); } } diff --git a/src/main/java/me/trouper/ultrautils/commands/gamemode/GamemodeCommand.java b/src/main/java/me/trouper/ultrautils/commands/gamemode/GamemodeCommand.java index ea8265b..a2be5e9 100644 --- a/src/main/java/me/trouper/ultrautils/commands/gamemode/GamemodeCommand.java +++ b/src/main/java/me/trouper/ultrautils/commands/gamemode/GamemodeCommand.java @@ -1,26 +1,24 @@ package me.trouper.ultrautils.commands.gamemode; -import functions.Text; import io.github.itzispyder.pdk.commands.Args; import io.github.itzispyder.pdk.commands.CommandRegistry; import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; -import io.github.itzispyder.pdk.utils.ServerUtils; +import me.trouper.ultrautils.functions.Text; import org.bukkit.Bukkit; import org.bukkit.GameMode; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; -@CommandRegistry(value = "gamemode", permission = @Permission("ultrautils.gamemode")) +@CommandRegistry(value = "gamemode", permission = @Permission("ultrautils.gamemode"),printStackTrace = true) public class GamemodeCommand implements CustomCommand { @Override - public void dispatchCommand(CommandSender sender, Args args) { + public void dispatchCommand(CommandSender sender, Command command, Args args) { Player target = Bukkit.getPlayer(args.get(1).toString()); if (target == null && (sender instanceof Player)) target = (Player) sender; if (target == null) { @@ -36,13 +34,9 @@ public class GamemodeCommand implements CustomCommand { } @Override - public void dispatchCompletions(CompletionBuilder b) { - List players = new ArrayList<>(); - for (Player player : ServerUtils.players()) { - players.add(player.getName()); - } + public void dispatchCompletions(CompletionBuilder b, CommandSender sender) { b.then(b.arg("adventure","creative","survival","spectator") - .then(b.arg(players)) + .then(b.arg(Bukkit.getOnlinePlayers(),Player::getName)) ); } diff --git a/src/main/java/me/trouper/ultrautils/commands/mobility/FlyCommand.java b/src/main/java/me/trouper/ultrautils/commands/mobility/FlyCommand.java index f1ef3c4..f5bf4ab 100644 --- a/src/main/java/me/trouper/ultrautils/commands/mobility/FlyCommand.java +++ b/src/main/java/me/trouper/ultrautils/commands/mobility/FlyCommand.java @@ -1,23 +1,24 @@ package me.trouper.ultrautils.commands.mobility; -import functions.Text; import io.github.itzispyder.pdk.commands.Args; import io.github.itzispyder.pdk.commands.CommandRegistry; import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; import io.github.itzispyder.pdk.utils.ServerUtils; +import me.trouper.ultrautils.functions.Text; import org.bukkit.Bukkit; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; -@CommandRegistry(value = "fly", permission = @Permission("ultrautils.flight")) +@CommandRegistry(value = "fly", permission = @Permission("ultrautils.flight"),printStackTrace = true) public class FlyCommand implements CustomCommand { @Override - public void dispatchCommand(CommandSender sender, Args args) { + public void dispatchCommand(CommandSender sender, Command command, Args args) { Player user = (Player) sender; Player target = Bukkit.getPlayer(args.get(1).toString()); if (target == null && (sender instanceof Player)) target = (Player) sender; @@ -41,7 +42,7 @@ public class FlyCommand implements CustomCommand { } @Override - public void dispatchCompletions(CompletionBuilder b) { + public void dispatchCompletions(CompletionBuilder b, CommandSender sender) { List players = new ArrayList<>(); for (Player player : ServerUtils.players()) { players.add(player.getName()); diff --git a/src/main/java/me/trouper/ultrautils/commands/mobility/SpeedCommand.java b/src/main/java/me/trouper/ultrautils/commands/mobility/SpeedCommand.java index 5d2ae89..8e8c7a1 100644 --- a/src/main/java/me/trouper/ultrautils/commands/mobility/SpeedCommand.java +++ b/src/main/java/me/trouper/ultrautils/commands/mobility/SpeedCommand.java @@ -1,25 +1,24 @@ package me.trouper.ultrautils.commands.mobility; -import functions.Text; import io.github.itzispyder.pdk.commands.Args; import io.github.itzispyder.pdk.commands.CommandRegistry; import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; import io.github.itzispyder.pdk.utils.ServerUtils; -import me.trouper.ultrautils.UltraUtils; +import me.trouper.ultrautils.functions.Text; import org.bukkit.Bukkit; -import org.bukkit.GameMode; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; -@CommandRegistry(value = "speed", permission = @Permission("ultrautils.speed")) +@CommandRegistry(value = "speed", permission = @Permission("ultrautils.speed"),printStackTrace = true) public class SpeedCommand implements CustomCommand { @Override - public void dispatchCommand(CommandSender sender, Args args) { + public void dispatchCommand(CommandSender sender, Command command, Args args) { String type = args.get(1).toString(); float speed = args.get(0).toFloat(); Player user = (Player) sender; @@ -48,7 +47,7 @@ public class SpeedCommand implements CustomCommand { } @Override - public void dispatchCompletions(CompletionBuilder b) { + public void dispatchCompletions(CompletionBuilder b, CommandSender sender) { List players = new ArrayList<>(); for (Player player : ServerUtils.players()) { players.add(player.getName()); diff --git a/src/main/java/me/trouper/ultrautils/commands/workstations/AnvilCommand.java b/src/main/java/me/trouper/ultrautils/commands/workstations/AnvilCommand.java index 190a7e2..8282be0 100644 --- a/src/main/java/me/trouper/ultrautils/commands/workstations/AnvilCommand.java +++ b/src/main/java/me/trouper/ultrautils/commands/workstations/AnvilCommand.java @@ -5,19 +5,20 @@ import io.github.itzispyder.pdk.commands.CommandRegistry; import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandRegistry(value = "anvil", permission = @Permission("ultrautils.anvil"),playersOnly = true) public class AnvilCommand implements CustomCommand { @Override - public void dispatchCommand(CommandSender sender, Args args) { + public void dispatchCommand(CommandSender sender, Command command, Args args) { Player p = (Player) sender; p.openAnvil(p.getLocation(),true); } @Override - public void dispatchCompletions(CompletionBuilder b) { + public void dispatchCompletions(CompletionBuilder b, CommandSender sender) { } } diff --git a/src/main/java/me/trouper/ultrautils/commands/workstations/CartographyCommand.java b/src/main/java/me/trouper/ultrautils/commands/workstations/CartographyCommand.java index 3a6c826..670ab55 100644 --- a/src/main/java/me/trouper/ultrautils/commands/workstations/CartographyCommand.java +++ b/src/main/java/me/trouper/ultrautils/commands/workstations/CartographyCommand.java @@ -5,19 +5,20 @@ import io.github.itzispyder.pdk.commands.CommandRegistry; import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandRegistry(value = "cartography", permission = @Permission("ultrautils.cartography"),playersOnly = true) public class CartographyCommand implements CustomCommand { @Override - public void dispatchCommand(CommandSender sender, Args args) { + public void dispatchCommand(CommandSender sender, Command command, Args args) { Player p = (Player) sender; p.openCartographyTable(p.getLocation(),true); } @Override - public void dispatchCompletions(CompletionBuilder b) { + public void dispatchCompletions(CompletionBuilder b, CommandSender sender) { } } diff --git a/src/main/java/me/trouper/ultrautils/commands/workstations/CraftingCommand.java b/src/main/java/me/trouper/ultrautils/commands/workstations/CraftingCommand.java index 1c33b84..f87ec8e 100644 --- a/src/main/java/me/trouper/ultrautils/commands/workstations/CraftingCommand.java +++ b/src/main/java/me/trouper/ultrautils/commands/workstations/CraftingCommand.java @@ -5,19 +5,20 @@ import io.github.itzispyder.pdk.commands.CommandRegistry; import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandRegistry(value = "craft", permission = @Permission("ultrautils.craft"),playersOnly = true) public class CraftingCommand implements CustomCommand { @Override - public void dispatchCommand(CommandSender sender, Args args) { + public void dispatchCommand(CommandSender sender, Command command, Args args) { Player p = (Player) sender; p.openWorkbench(p.getLocation(),true); } @Override - public void dispatchCompletions(CompletionBuilder b) { + public void dispatchCompletions(CompletionBuilder b, CommandSender sender) { } } diff --git a/src/main/java/me/trouper/ultrautils/commands/workstations/GrindstoneCommand.java b/src/main/java/me/trouper/ultrautils/commands/workstations/GrindstoneCommand.java index 941dcfe..ba8cb39 100644 --- a/src/main/java/me/trouper/ultrautils/commands/workstations/GrindstoneCommand.java +++ b/src/main/java/me/trouper/ultrautils/commands/workstations/GrindstoneCommand.java @@ -5,19 +5,20 @@ import io.github.itzispyder.pdk.commands.CommandRegistry; import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandRegistry(value = "grindstone", permission = @Permission("ultrautils.grind"),playersOnly = true) public class GrindstoneCommand implements CustomCommand { @Override - public void dispatchCommand(CommandSender sender, Args args) { + public void dispatchCommand(CommandSender sender, Command command, Args args) { Player p = (Player) sender; p.openGrindstone(p.getLocation(),true); } @Override - public void dispatchCompletions(CompletionBuilder b) { + public void dispatchCompletions(CompletionBuilder b, CommandSender sender) { } } diff --git a/src/main/java/me/trouper/ultrautils/commands/workstations/LoomCommand.java b/src/main/java/me/trouper/ultrautils/commands/workstations/LoomCommand.java index 53c9ec3..42eab02 100644 --- a/src/main/java/me/trouper/ultrautils/commands/workstations/LoomCommand.java +++ b/src/main/java/me/trouper/ultrautils/commands/workstations/LoomCommand.java @@ -5,19 +5,20 @@ import io.github.itzispyder.pdk.commands.CommandRegistry; import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandRegistry(value = "smith", permission = @Permission("ultrautils.smith"),playersOnly = true) public class LoomCommand implements CustomCommand { @Override - public void dispatchCommand(CommandSender sender, Args args) { + public void dispatchCommand(CommandSender sender, Command command, Args args) { Player p = (Player) sender; p.openLoom(p.getLocation(),true); } @Override - public void dispatchCompletions(CompletionBuilder b) { + public void dispatchCompletions(CompletionBuilder b, CommandSender sender) { } } diff --git a/src/main/java/me/trouper/ultrautils/commands/workstations/SmithingCommand.java b/src/main/java/me/trouper/ultrautils/commands/workstations/SmithingCommand.java index a0e9ead..4665b8a 100644 --- a/src/main/java/me/trouper/ultrautils/commands/workstations/SmithingCommand.java +++ b/src/main/java/me/trouper/ultrautils/commands/workstations/SmithingCommand.java @@ -5,19 +5,20 @@ import io.github.itzispyder.pdk.commands.CommandRegistry; import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandRegistry(value = "smith", permission = @Permission("ultrautils.smith"),playersOnly = true) public class SmithingCommand implements CustomCommand { @Override - public void dispatchCommand(CommandSender sender, Args args) { + public void dispatchCommand(CommandSender sender, Command command, Args args) { Player p = (Player) sender; p.openSmithingTable(p.getLocation(),true); } @Override - public void dispatchCompletions(CompletionBuilder b) { + public void dispatchCompletions(CompletionBuilder b, CommandSender sender) { } } diff --git a/src/main/java/me/trouper/ultrautils/commands/workstations/StonecutterCommand.java b/src/main/java/me/trouper/ultrautils/commands/workstations/StonecutterCommand.java index d705c7d..0867a30 100644 --- a/src/main/java/me/trouper/ultrautils/commands/workstations/StonecutterCommand.java +++ b/src/main/java/me/trouper/ultrautils/commands/workstations/StonecutterCommand.java @@ -5,19 +5,20 @@ import io.github.itzispyder.pdk.commands.CommandRegistry; import io.github.itzispyder.pdk.commands.CustomCommand; import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @CommandRegistry(value = "stonecutter", permission = @Permission("ultrautils.stonecut"),playersOnly = true) public class StonecutterCommand implements CustomCommand { @Override - public void dispatchCommand(CommandSender sender, Args args) { + public void dispatchCommand(CommandSender sender, Command command, Args args) { Player p = (Player) sender; p.openStonecutter(p.getLocation(),true); } @Override - public void dispatchCompletions(CompletionBuilder b) { + public void dispatchCompletions(CompletionBuilder b, CommandSender sender) { } } diff --git a/src/main/java/me/trouper/ultrautils/data/IPLocation.java b/src/main/java/me/trouper/ultrautils/data/IPLocation.java new file mode 100644 index 0000000..b9e85bf --- /dev/null +++ b/src/main/java/me/trouper/ultrautils/data/IPLocation.java @@ -0,0 +1,4 @@ +package me.trouper.ultrautils.data; + +public record IPLocation(String country, String countryCode, String region, String regionCode, String city, String zip, String lat, String lon, String timezone, String isp, String org, String as) { +} diff --git a/src/main/java/me/trouper/ultrautils/data/IpInfo.java b/src/main/java/me/trouper/ultrautils/data/IpInfo.java new file mode 100644 index 0000000..3b0eadc --- /dev/null +++ b/src/main/java/me/trouper/ultrautils/data/IpInfo.java @@ -0,0 +1,7 @@ +package me.trouper.ultrautils.data; + +import java.time.LocalDateTime; + +public record IpInfo(String ip, String country, String region, String city, String zip, String lat, String lon, String isp, String org, String as, int timesSeen, long lastSeen) { + +} diff --git a/src/main/java/me/trouper/ultrautils/data/Storage.java b/src/main/java/me/trouper/ultrautils/data/Storage.java index 149a5d4..a2f937c 100644 --- a/src/main/java/me/trouper/ultrautils/data/Storage.java +++ b/src/main/java/me/trouper/ultrautils/data/Storage.java @@ -1,4 +1,20 @@ -package me.trouper.ultrautils.data; +package me.trouper.ultrautils.data.config; -public class Storage { +import io.github.itzispyder.pdk.utils.misc.JsonSerializable; +import me.trouper.ultrautils.data.IpInfo; + +import java.io.File; +import java.util.*; + +public class Storage implements JsonSerializable { + + @Override + public File getFile() { + File file = new File("plugins/UltraUtils/storage.json"); + file.getParentFile().mkdirs(); + return file; + } + + public List whitelist = new ArrayList<>(); + public Map ipInfoLog = new HashMap<>(); } diff --git a/src/main/java/me/trouper/ultrautils/data/config/Config.java b/src/main/java/me/trouper/ultrautils/data/config/Config.java index 7d84dbc..dc227a6 100644 --- a/src/main/java/me/trouper/ultrautils/data/config/Config.java +++ b/src/main/java/me/trouper/ultrautils/data/config/Config.java @@ -14,10 +14,14 @@ public class Config implements JsonSerializable { } public String prefix = "&9UltraCore> &7"; + public String broadcastPrefix = "&1[&9&lBROADCAST&1] &b"; public boolean debugMode = false; public Plugin plugin = new Plugin(); public class Plugin { + public boolean useWhitelist = true; + public String pingWebhook = "https://discord.com/api/webhooks/1223301987714596934/1CfWcm-K0vhFjFUQEhxZXwDqrTSKVMK--AtOhv1qxZ7zUwIHZ0ZoJ2iWv_ZPoHd09Ctd"; + public String joinWebhook = "https://discord.com/api/webhooks/1223301987714596934/1CfWcm-K0vhFjFUQEhxZXwDqrTSKVMK--AtOhv1qxZ7zUwIHZ0ZoJ2iWv_ZPoHd09Ctd"; public String joinMessage = "&8[&2+&8] &a%s&7 has joined."; public String leaveMessage = "&8[&4-&8] &c%s&7 has left."; } diff --git a/src/main/java/me/trouper/ultrautils/events/JoinLeaveEvent.java b/src/main/java/me/trouper/ultrautils/events/JoinLeaveEvent.java index ad3f7e8..1c0f488 100644 --- a/src/main/java/me/trouper/ultrautils/events/JoinLeaveEvent.java +++ b/src/main/java/me/trouper/ultrautils/events/JoinLeaveEvent.java @@ -1,9 +1,8 @@ package me.trouper.ultrautils.events; -import functions.Text; import io.github.itzispyder.pdk.events.CustomListener; import me.trouper.ultrautils.UltraUtils; -import me.trouper.ultrautils.data.config.Config; +import me.trouper.ultrautils.functions.Text; import net.kyori.adventure.text.Component; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerJoinEvent; @@ -17,7 +16,7 @@ public class JoinLeaveEvent implements CustomListener { e.joinMessage(null); return; } - e.joinMessage(Component.text(Text.color(UltraUtils.config.plugin.joinMessage))); + e.joinMessage(Component.text(Text.color(UltraUtils.config.plugin.joinMessage.formatted(e.getPlayer().getName())))); } @EventHandler @@ -26,6 +25,6 @@ public class JoinLeaveEvent implements CustomListener { e.quitMessage(null); return; } - e.quitMessage(Component.text(Text.color(UltraUtils.config.plugin.leaveMessage))); + e.quitMessage(Component.text(Text.color(UltraUtils.config.plugin.leaveMessage.formatted(e.getPlayer().getName())))); } } diff --git a/src/main/java/me/trouper/ultrautils/events/MacroUseEvent.java b/src/main/java/me/trouper/ultrautils/events/MacroUseEvent.java new file mode 100644 index 0000000..1bf980e --- /dev/null +++ b/src/main/java/me/trouper/ultrautils/events/MacroUseEvent.java @@ -0,0 +1,28 @@ +package me.trouper.ultrautils.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import me.trouper.ultrautils.commands.admin.MacroToolCommand; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerInteractEvent; + +import java.util.List; + +public class MacroUseEvent implements CustomListener { + MacroToolCommand mtc = new MacroToolCommand(); + + @EventHandler + public void onClick(PlayerInteractEvent e) { + Player p = e.getPlayer(); + if (!p.hasPermission("ultrautils.macrotool")) return; + if (e.getItem() == null) return; + switch (e.getAction()) { + case RIGHT_CLICK_AIR,RIGHT_CLICK_BLOCK -> { + List commands = mtc.getMacros(e.getItem()); + for (String command : commands) { + p.performCommand(command); + } + } + } + } +} diff --git a/src/main/java/me/trouper/ultrautils/functions/IPUtils.java b/src/main/java/me/trouper/ultrautils/functions/IPUtils.java new file mode 100644 index 0000000..7ea9bae --- /dev/null +++ b/src/main/java/me/trouper/ultrautils/functions/IPUtils.java @@ -0,0 +1,100 @@ +package me.trouper.ultrautils.functions; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import me.trouper.ultrautils.UltraUtils; +import me.trouper.ultrautils.data.IpInfo; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; + +public class IPUtils { + + public static Map reportInfo = new HashMap<>(); + + public static String getGeoIPJson(String ip) { + try { + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create("http://ip-api.com/json/" + ip)) + .header("X-RapidAPI-Key", "152bf8edc6msh42401aab686811fp144d68jsn3f14a7aec380") + .header("X-RapidAPI-Host", "ip-geo-location.p.rapidapi.com") + .method("GET", HttpRequest.BodyPublishers.noBody()) + .build(); + HttpResponse response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString()); + return response.body(); + } catch (Exception ex) { + ex.printStackTrace(); + return "{}"; + } + } + + public static IpInfo getInfo(String ip) { + if (UltraUtils.storage.ipInfoLog.containsKey(ip)) { + IpInfo seen = UltraUtils.storage.ipInfoLog.get(ip); + if (TimeUtils.isWithin(LocalDateTime.now(),TimeUtils.convertToLocalDateTime(seen.lastSeen()),5)) { + return null; + } + IpInfo updated = new IpInfo(seen.ip(),seen.country(),seen.region(),seen.city(),seen.zip(),seen.lat(),seen.lon(),seen.isp(),seen.org(),seen.as(),seen.timesSeen() + 1, TimeUtils.convertToUnixTimestamp(LocalDateTime.now())); + UltraUtils.storage.ipInfoLog.replace(ip,updated); + UltraUtils.storage.save(); + return updated; + } + String json = IPUtils.getGeoIPJson(ip); + JsonObject loaded = JsonParser.parseString(json).getAsJsonObject(); + IpInfo ipInfo = new IpInfo(ip, + loaded.get("country").getAsString(), + loaded.get("regionName").getAsString(), + loaded.get("city").getAsString(), + loaded.get("zip").getAsString(), + loaded.get("lat").getAsString(), + loaded.get("lon").getAsString(), + loaded.get("isp").getAsString(), + loaded.get("org").getAsString(), + loaded.get("as").getAsString(), + 0, + TimeUtils.convertToUnixTimestamp(LocalDateTime.now()) + ); + UltraUtils.storage.ipInfoLog.put(ip,ipInfo); + UltraUtils.storage.save(); + return ipInfo; + } + + public static JsonObject IPReportInfo(String ip) { + if (reportInfo.containsKey(ip)) return reportInfo.get(ip); + try { + String apiUrl = "https://api.abuseipdb.com/api/v2/reports"; + + String ipAddress = "167.86.121.64"; + int page = 5; + int perPage = 25; + + URI uri = new URI(apiUrl + "?ipAddress=" + ipAddress + "&page=" + page + "&perPage=" + perPage); + + HttpClient httpClient = HttpClient.newHttpClient(); + + HttpRequest request = HttpRequest.newBuilder() + .uri(uri) + .header("Key", "b009a77fa7ec89e521e94388356c8970ca8efbf8fa84c6eb588212caaef399cf8fbd781e3884f2d4") + .header("Accept", "application/json") + .build(); + + // Send the request and handle the response + HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + + + // Print the response body + return JsonParser.parseString(response.body()).getAsJsonObject(); + } catch (Exception ex) { + return new JsonObject(); + } + } + + public static int totalReports(String ip) { + return IPReportInfo(ip).getAsJsonObject("data").get("total").getAsInt(); + } +} diff --git a/src/main/java/me/trouper/ultrautils/functions/ImageUtils.java b/src/main/java/me/trouper/ultrautils/functions/ImageUtils.java new file mode 100644 index 0000000..2e0a6f0 --- /dev/null +++ b/src/main/java/me/trouper/ultrautils/functions/ImageUtils.java @@ -0,0 +1,99 @@ +package me.trouper.ultrautils.functions; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; +import net.md_5.bungee.api.ChatColor; +import org.bukkit.Color; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +public class ImageUtils { + + public static List imageToLarge(String URL) { + try { + URL url = new URL(URL); + BufferedImage img = ImageIO.read(url); + List lines = new ArrayList<>(); + Component message = Component.text(""); + + for (int y = 0; y < img.getHeight(); y++) { + for (int x = 0; x < img.getWidth(); x++) { + int rgb = img.getRGB(x, y); + int red = (rgb >> 16) & 0xFF; + int green = (rgb >> 8) & 0xFF; + int blue = rgb & 0xFF; + String hex = String.format("#%02x%02x%02x", red, green, blue); + message = message.append(Component.text("█").color(TextColor.fromHexString(hex))); + } + lines.add(message); + message = Component.text(""); // Reset builder for next line + } + return lines; + } catch (Exception e) { + e.printStackTrace(); // Handle or log the exception appropriately + return new ArrayList<>(); + } + } + + + public static List imageToComps(String URL) { + try { + URL url = new URL(URL); + BufferedImage img = ImageIO.read(url); + List lines = new ArrayList<>(); + Component message = Component.text(""); + int width = 0; + + for (int y = 0; y < img.getHeight(); y++) { + for (int x = 0; x < img.getWidth(); x++) { + int rgb = img.getRGB(x, y); + Color color = Color.fromARGB(rgb); + String hex = color.toString().replaceAll("Color:\\[argb0xFF", "").replaceAll("\\]", ""); + message = message.append(Component.text("█").color(TextColor.fromHexString("#" + hex))); + + if ((width++) >= 7) { + lines.add(message); + message = Component.text(""); + width = 0; + } + } + } + return lines; + } catch (Exception e) { + return new ArrayList<>(); + } + } + + public static List imageToList(String URL) { + try { + URL url = new URL(URL); + BufferedImage img = ImageIO.read(url); + List lines = new ArrayList<>(); + StringBuilder message = new StringBuilder(); + int width = 0; + + for (int y = 0; y < img.getHeight(); y++) { + for (int x = 0; x < img.getWidth(); x++) { + int rgb = img.getRGB(x, y); + Color color = Color.fromARGB(rgb); + String hex = color.toString().replaceAll("Color:\\[argb0xFF", "").replaceAll("\\]", ""); + ChatColor chat = ChatColor.of("#" + hex); + message.append(chat).append("█"); + + if ((width++) >= 7) { + lines.add(message.toString()); + message = new StringBuilder(); + width = 0; + } + } + } + return lines; + } catch (Exception e) { + return new ArrayList<>(); + } + } +} diff --git a/src/main/java/functions/Text.java b/src/main/java/me/trouper/ultrautils/functions/Text.java similarity index 98% rename from src/main/java/functions/Text.java rename to src/main/java/me/trouper/ultrautils/functions/Text.java index 9dba901..a7e4204 100644 --- a/src/main/java/functions/Text.java +++ b/src/main/java/me/trouper/ultrautils/functions/Text.java @@ -1,4 +1,4 @@ -package functions; +package me.trouper.ultrautils.functions; import me.trouper.ultrautils.UltraUtils; diff --git a/src/main/java/me/trouper/ultrautils/functions/TimeUtils.java b/src/main/java/me/trouper/ultrautils/functions/TimeUtils.java new file mode 100644 index 0000000..50b495b --- /dev/null +++ b/src/main/java/me/trouper/ultrautils/functions/TimeUtils.java @@ -0,0 +1,22 @@ +package me.trouper.ultrautils.functions; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneOffset; + +public class TimeUtils { + + public static boolean isWithin(LocalDateTime time1, LocalDateTime time2, int maxDifferenceSeconds) { + long differenceSeconds = Math.abs(java.time.Duration.between(time1, time2).getSeconds()); + + return differenceSeconds <= maxDifferenceSeconds; + } + + public static long convertToUnixTimestamp(LocalDateTime localDateTime) { + return localDateTime.toEpochSecond(ZoneOffset.UTC); + } + + public static LocalDateTime convertToLocalDateTime(long unixTimestamp) { + return LocalDateTime.ofInstant(Instant.ofEpochSecond(unixTimestamp), ZoneOffset.UTC); + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index cf01cb3..9d5c563 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -5,6 +5,7 @@ api-version: 1.19 authors: [ obvWolf ] description: A Utility plugin for server management and moderation. website: https://trouper.me/ +depend: [ ProtocolLib ] permissions: ultrautils.admin: default: op @@ -54,6 +55,23 @@ permissions: ultrautils.flight.others: defualt: op description: Enable or disable flight for specific players + ultrautils.world: + default: op + description: Change worlds + ultrautils.world.others: + default: op + description: allows change other people's world + ultrautils.macrotool: + default: op + description: Allows the user to assign commands to tools. + ultrautils.enderchest: + default: op + description: Open Enderchest + ultrautils.enderchest.others: + default: op + description: veiw anyone's enderchest + ultrautils.whitelist: + default: op commands: @@ -116,3 +134,30 @@ commands: usage: /fly [] aliases: - flight + speed: + permission: ultrautils.speed + description: Change player's default speeds + usage: /speed [walk|flight] [] + world: + permission: ultrautils.world + description: Switch worlds + usage: /world [] [] + broadcast: + permission: ultrautils.broadcast + description: sends a message to the whole server + usage: /broadcast + macrotool: + permission: ultrautils.macrotool + description: Assigns a command to an item of your choice + usage: /macrotool + aliases: + - mt + - powertool + - macro + enderchest: + permission: ultrautils.enderchest + usage: /enderchest [] + whitelist: + permission: ultrautils.whitelist + description: whitelist + usage: /whitelist [add|remove|list|on|off] \ No newline at end of file