From 5dae61070856f265a4d05559e1ac651809bd7a35 Mon Sep 17 00:00:00 2001 From: obvWolf Date: Mon, 8 Apr 2024 08:16:51 -0500 Subject: [PATCH] Gotta combine the gamemode commands --- .idea/misc.xml | 3 + build.gradle | 5 +- build.sh | 45 +++++++ gradlew | 2 +- libs/PDK-1.3.3.jar | Bin 0 -> 90045 bytes .../me/trouper/ultrautils/UltraUtils.java | 21 ++- .../commands/EnderChestCommand.java | 34 +++++ .../commands/UltraUtilsCommand.java | 55 +++++++- .../commands/admin/BroadcastCommand.java | 26 ++++ .../commands/admin/MacroToolCommand.java | 122 ++++++++++++++++++ .../commands/admin/WorldCommand.java | 68 ++++++++++ .../commands/gamemode/GMACommand.java | 19 +-- .../commands/gamemode/GMCCommand.java | 19 +-- .../commands/gamemode/GMSCommand.java | 19 +-- .../commands/gamemode/GMSPCommand.java | 19 +-- .../commands/gamemode/GamemodeCommand.java | 18 +-- .../commands/mobility/FlyCommand.java | 9 +- .../commands/mobility/SpeedCommand.java | 11 +- .../commands/workstations/AnvilCommand.java | 5 +- .../workstations/CartographyCommand.java | 5 +- .../workstations/CraftingCommand.java | 5 +- .../workstations/GrindstoneCommand.java | 5 +- .../commands/workstations/LoomCommand.java | 5 +- .../workstations/SmithingCommand.java | 5 +- .../workstations/StonecutterCommand.java | 5 +- .../trouper/ultrautils/data/IPLocation.java | 4 + .../me/trouper/ultrautils/data/IpInfo.java | 7 + .../me/trouper/ultrautils/data/Storage.java | 20 ++- .../ultrautils/data/config/Config.java | 4 + .../ultrautils/events/JoinLeaveEvent.java | 7 +- .../ultrautils/events/MacroUseEvent.java | 28 ++++ .../trouper/ultrautils/functions/IPUtils.java | 100 ++++++++++++++ .../ultrautils/functions/ImageUtils.java | 99 ++++++++++++++ .../trouper/ultrautils}/functions/Text.java | 2 +- .../ultrautils/functions/TimeUtils.java | 22 ++++ src/main/resources/plugin.yml | 45 +++++++ 36 files changed, 764 insertions(+), 104 deletions(-) create mode 100755 build.sh mode change 100644 => 100755 gradlew create mode 100644 libs/PDK-1.3.3.jar create mode 100644 src/main/java/me/trouper/ultrautils/commands/EnderChestCommand.java create mode 100644 src/main/java/me/trouper/ultrautils/commands/admin/BroadcastCommand.java create mode 100644 src/main/java/me/trouper/ultrautils/commands/admin/MacroToolCommand.java create mode 100644 src/main/java/me/trouper/ultrautils/commands/admin/WorldCommand.java create mode 100644 src/main/java/me/trouper/ultrautils/data/IPLocation.java create mode 100644 src/main/java/me/trouper/ultrautils/data/IpInfo.java create mode 100644 src/main/java/me/trouper/ultrautils/events/MacroUseEvent.java create mode 100644 src/main/java/me/trouper/ultrautils/functions/IPUtils.java create mode 100644 src/main/java/me/trouper/ultrautils/functions/ImageUtils.java rename src/main/java/{ => me/trouper/ultrautils}/functions/Text.java (98%) create mode 100644 src/main/java/me/trouper/ultrautils/functions/TimeUtils.java 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 0000000000000000000000000000000000000000..84c267dec54ffe708772f5107b78e6224aaf3a4f GIT binary patch literal 90045 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

N8w2K~MEYR-K*kXh)?gVY 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 { + 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