From 2f128b7995cded35f9b0ca41f5ef6fa70d633b7f Mon Sep 17 00:00:00 2001 From: bowser0000 Date: Mon, 20 Jul 2020 19:27:24 -0400 Subject: /dhelp, /guildof, fix brackets Add /dhelp which returns list of commands. Add /guildof which returns guild and guildmaster of a person. Swap <> and [] for parameters. --- README.md | 23 ++++---- me/Danker/TheMod.java | 6 +- me/Danker/commands/DHelpCommand.java | 45 ++++++++++++++ me/Danker/commands/DisplayCommand.java | 6 +- me/Danker/commands/GuildOfCommand.java | 105 +++++++++++++++++++++++++++++++++ me/Danker/commands/LootCommand.java | 6 +- me/Danker/commands/MoveCommand.java | 6 +- me/Danker/commands/SetkeyCommand.java | 4 +- me/Danker/commands/SkillsCommand.java | 4 +- me/Danker/commands/SlayerCommand.java | 4 +- me/Danker/commands/ToggleCommand.java | 6 +- me/Danker/handlers/APIHandler.java | 37 ++++++++++++ 12 files changed, 222 insertions(+), 30 deletions(-) create mode 100644 me/Danker/commands/DHelpCommand.java create mode 100644 me/Danker/commands/GuildOfCommand.java diff --git a/README.md b/README.md index 21bebb7..091bc4c 100644 --- a/README.md +++ b/README.md @@ -4,22 +4,23 @@ QOL changes that enhances your Hypixel Skyblock experience. Created to add featu ## Current features - Guild party desktop notifications (toggleable) - Coordinate and angle display (toggleable) -- Slayer item tracker -- Slayer API command -- Skill API command +- Slayer item tracker (with GUI display) +- API commands ## Commands -- /toggle [gparty/coords/list] - Toggles features. /toggle list returns values of every toggle. -- /setkey [key] - Sets API key. +- /dhelp - Returns this message in-game. +- /toggle - Toggles features. /toggle list returns values of every toggle. +- /setkey - Sets API key. - /getkey - Returns key set with /setkey. -- /loot [zombie/spider/wolf] - Returns loot received from the slayer quest. -- /display [zombie/spider/wolf/off] - Text display for slayer tracker. -- /move [coords/display] [x] [y] - Moves text display to specified X and Y coordinates. -- /slayer - Uses API to get slayer xp of a person. If no name is provided, it checks yours. -- /skills - Uses API to get skill levlels of a person. If no name is provided, it checks yours. +- /loot - Returns loot received from slayer quests. +- /display - Text display for slayer tracker. +- /move - Moves text display to specified X and Y coordinates. +- /slayer [name] - Uses API to get slayer xp of a person. If no name is provided, it checks yours. +- /skills [name] - Uses API to get skill levels of a person. If no name is provided, it checks yours. +- /guildof [name] - Uses API to get guild name and guild master of a person. If no name is provided, it checks yours. ### Notes - Slayer tracker for token drops and 20% chance drops uses a 12x12x12 bounding box centered on the player to detect the drops. If you are out of the range of the item drop, it will not count on the tracker. - API commands may take a while depending on your internet connection. -- API commands send one request to Mojang and two requests to the Hypixel API. This means doing more than 60 API commands/minute will get you rate-limited. If you have an unlimited Hypixel API key, this is changed to 600 API commands/10 minutes. +- If you use too many API commands too fast, you can and will get rate-limited. - An incorrect API key will result in an HTTP error code of 402. diff --git a/me/Danker/TheMod.java b/me/Danker/TheMod.java index 5d603a3..0064d00 100644 --- a/me/Danker/TheMod.java +++ b/me/Danker/TheMod.java @@ -7,8 +7,10 @@ import java.awt.TrayIcon; import java.text.NumberFormat; import java.util.List; +import me.Danker.commands.DHelpCommand; import me.Danker.commands.DisplayCommand; import me.Danker.commands.GetkeyCommand; +import me.Danker.commands.GuildOfCommand; import me.Danker.commands.LootCommand; import me.Danker.commands.MoveCommand; import me.Danker.commands.ReloadConfigCommand; @@ -42,7 +44,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; public class TheMod { public static final String MODID = "Danker's Skyblock Mod"; - public static final String VERSION = "1.5.2"; + public static final String VERSION = "1.5.3"; static int checkItemsNow = 0; static int itemsChecked = 0; @@ -68,6 +70,8 @@ public class TheMod ClientCommandHandler.instance.registerCommand(new MoveCommand()); ClientCommandHandler.instance.registerCommand(new SlayerCommand()); ClientCommandHandler.instance.registerCommand(new SkillsCommand()); + ClientCommandHandler.instance.registerCommand(new GuildOfCommand()); + ClientCommandHandler.instance.registerCommand(new DHelpCommand()); } // It randomly broke, so I had to make it the highest priority diff --git a/me/Danker/commands/DHelpCommand.java b/me/Danker/commands/DHelpCommand.java new file mode 100644 index 0000000..5e71f81 --- /dev/null +++ b/me/Danker/commands/DHelpCommand.java @@ -0,0 +1,45 @@ +package me.Danker.commands; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; + +public class DHelpCommand extends CommandBase { + + @Override + public String getCommandName() { + return "dhelp"; + } + + @Override + public String getCommandUsage(ICommandSender arg0) { + return getCommandName(); + } + + @Override + public int getRequiredPermissionLevel() { + return 0; + } + + @Override + public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException { + EntityPlayer player = (EntityPlayer) arg0; + + player.addChatMessage(new ChatComponentText(EnumChatFormatting.GOLD + "Danker's Skyblock Mod Version 1.5.3\n" + + EnumChatFormatting.AQUA + "<> = Mandatory parameter. [] = Optional parameter.\n" + + EnumChatFormatting.GOLD + "/dhelp" + EnumChatFormatting.AQUA + " - Returns this message.\n" + + EnumChatFormatting.GOLD + "/toggle " + EnumChatFormatting.AQUA + " - Toggles features. /toggle list returns values of every toggle.\n" + + EnumChatFormatting.GOLD + "/setkey " + EnumChatFormatting.AQUA + " - Sets API key.\n" + + EnumChatFormatting.GOLD + "/getkey" + EnumChatFormatting.AQUA + " - Returns key set with /setkey.\n" + + EnumChatFormatting.GOLD + "/loot " + EnumChatFormatting.AQUA + " - Returns loot received from slayer quests.\n" + + EnumChatFormatting.GOLD + "/display " + EnumChatFormatting.AQUA + " - Text display for slayer tracker.\n" + + EnumChatFormatting.GOLD + "/move " + EnumChatFormatting.AQUA + " - Moves text display to specified X and Y coordinates.\n" + + EnumChatFormatting.GOLD + "/slayer [player]" + EnumChatFormatting.AQUA + " - Uses API to get slayer xp of a person. If no name is provided, it checks yours.\n" + + EnumChatFormatting.GOLD + "/skills [player]" + EnumChatFormatting.AQUA + " - Uses API to get skill levels of a person. If no name is provided, it checks yours.\n" + + EnumChatFormatting.GOLD + "/guildof [player]" + EnumChatFormatting.AQUA + " - Uses API to get guild name and guild master of a person. If no name is provided, it checks yours.")); + } + +} diff --git a/me/Danker/commands/DisplayCommand.java b/me/Danker/commands/DisplayCommand.java index 09d7c0f..998aead 100644 --- a/me/Danker/commands/DisplayCommand.java +++ b/me/Danker/commands/DisplayCommand.java @@ -18,7 +18,7 @@ public class DisplayCommand extends CommandBase { @Override public String getCommandUsage(ICommandSender arg0) { - return getCommandName() + " [zombie/spider/wolf/off]"; + return getCommandName() + " "; } @Override @@ -31,7 +31,7 @@ public class DisplayCommand extends CommandBase { final EntityPlayer player = (EntityPlayer) arg0; if (arg1.length == 0) { - player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /display [zombie/spider/wolf/off]")); + player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /display ")); return; } @@ -46,7 +46,7 @@ public class DisplayCommand extends CommandBase { } else if (arg1[0].equalsIgnoreCase("off")) { display = "off"; } else { - player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /display [zombie/spider/wolf/off]")); + player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /display ")); return; } player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Display set to " + EnumChatFormatting.DARK_GREEN + display + EnumChatFormatting.GREEN + ".")); diff --git a/me/Danker/commands/GuildOfCommand.java b/me/Danker/commands/GuildOfCommand.java new file mode 100644 index 0000000..20b759d --- /dev/null +++ b/me/Danker/commands/GuildOfCommand.java @@ -0,0 +1,105 @@ +package me.Danker.commands; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import me.Danker.handlers.APIHandler; +import me.Danker.handlers.ConfigHandler; +import net.minecraft.command.CommandBase; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; + +public class GuildOfCommand extends CommandBase { + + @Override + public String getCommandName() { + return "guildof"; + } + + @Override + public String getCommandUsage(ICommandSender arg0) { + return getCommandName() + " [name]"; + } + + @Override + public int getRequiredPermissionLevel() { + return 0; + } + + @Override + public void processCommand(ICommandSender arg0, String[] arg1) throws CommandException { + // MULTI THREAD DRIFTING + new Thread(() -> { + APIHandler ah = new APIHandler(); + ConfigHandler cf = new ConfigHandler(); + EntityPlayer player = (EntityPlayer) arg0; + + // Check key + String key = cf.getString("api", "APIKey"); + if (key.equals("")) { + player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "API key not set. Use /setkey.")); + } + + // Get UUID for Hypixel API requests + String username; + String uuid; + if (arg1.length == 0) { + username = player.getName(); + uuid = player.getUniqueID().toString().replaceAll("[\\-]", ""); + player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Checking guild of " + EnumChatFormatting.DARK_GREEN + username)); + } else { + username = arg1[0]; + player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Checking guild of " + EnumChatFormatting.DARK_GREEN + username)); + uuid = ah.getUUID(username); + } + + // Find guild ID + System.out.println("Fetching guild..."); + String guildURL = "https://api.hypixel.net/guild?player=" + uuid + "&key=" + key; + JsonObject guildResponse = ah.getResponse(guildURL); + if (!guildResponse.get("success").getAsBoolean()) { + String reason = guildResponse.get("cause").getAsString(); + player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Failed with reason: " + reason)); + return; + } + + System.out.println("Fetching guild stats and members..."); + + String guildName = "N/A"; + String guildMaster = "N/A"; + // Check if player is in guild + if (!guildResponse.get("guild").isJsonNull()) { + guildName = guildResponse.get("guild").getAsJsonObject().get("name").getAsString(); + + // Loop through members to find guildmaster + JsonArray guildMembers = guildResponse.get("guild").getAsJsonObject().get("members").getAsJsonArray(); + for (JsonElement member : guildMembers) { + JsonObject memberObject = member.getAsJsonObject(); + String memberRank = memberObject.get("rank").getAsString(); + + if (memberRank.equals("GUILDMASTER") || memberRank.equals("Guild Master")) { + // Get username from UUID + String gmUUID = memberObject.get("uuid").getAsString(); + String gmNameURL = "https://api.mojang.com/user/profiles/" + gmUUID + "/names"; + JsonArray gmNameResponse = ah.getArrayResponse(gmNameURL); + + String gmName = gmNameResponse.get(gmNameResponse.size() - 1).getAsJsonObject().get("name").getAsString(); + guildMaster = gmName; + break; + } + } + } + + player.addChatMessage(new ChatComponentText(EnumChatFormatting.AQUA + "" + EnumChatFormatting.BOLD + "-------------------\n" + + EnumChatFormatting.AQUA + " " + username + "'s Guild:\n" + + EnumChatFormatting.GREEN + " Guild: " + EnumChatFormatting.DARK_GREEN + EnumChatFormatting.BOLD + guildName + "\n" + + EnumChatFormatting.GREEN + " Guildmaster: " + EnumChatFormatting.DARK_GREEN + EnumChatFormatting.BOLD + guildMaster + "\n" + + EnumChatFormatting.AQUA + " " + EnumChatFormatting.BOLD + "-------------------")); + }).start(); + } + +} diff --git a/me/Danker/commands/LootCommand.java b/me/Danker/commands/LootCommand.java index 9beec87..e61fde7 100644 --- a/me/Danker/commands/LootCommand.java +++ b/me/Danker/commands/LootCommand.java @@ -84,7 +84,7 @@ public class LootCommand extends CommandBase { @Override public String getCommandUsage(ICommandSender arg0) { - return getCommandName() + " [zombie/spider/wolf]"; + return getCommandName() + " "; } @Override @@ -97,7 +97,7 @@ public class LootCommand extends CommandBase { final EntityPlayer player = (EntityPlayer) arg0; if (arg1.length == 0) { - player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /loot [zombie/spider/wolf]")); + player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /loot ")); return; } @@ -184,7 +184,7 @@ public class LootCommand extends CommandBase { EnumChatFormatting.AQUA + " Bosses Since RNG: " + bossesBetween + "\n" + EnumChatFormatting.GREEN + "" + EnumChatFormatting.BOLD + " -------------------")); } else { - player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /loot [zombie/spider/wolf]")); + player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /loot ")); } } diff --git a/me/Danker/commands/MoveCommand.java b/me/Danker/commands/MoveCommand.java index d402680..797cffa 100644 --- a/me/Danker/commands/MoveCommand.java +++ b/me/Danker/commands/MoveCommand.java @@ -20,7 +20,7 @@ public class MoveCommand extends CommandBase { @Override public String getCommandUsage(ICommandSender arg0) { - return getCommandName() + " [coords/display] [x] [y]"; + return getCommandName() + " "; } @Override @@ -34,7 +34,7 @@ public class MoveCommand extends CommandBase { final ConfigHandler cf = new ConfigHandler(); if (arg1.length < 2) { - player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /move [coords/display] [x] [y]")); + player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /move ")); return; } @@ -51,7 +51,7 @@ public class MoveCommand extends CommandBase { cf.writeIntConfig("locations", "displayY", displayXY[1]); player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Tracker display has been moved to " + EnumChatFormatting.DARK_GREEN + arg1[1] + ", " + arg1[2])); } else { - player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /move [coords/display] [x] [y]")); + player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /move ")); } } diff --git a/me/Danker/commands/SetkeyCommand.java b/me/Danker/commands/SetkeyCommand.java index 14f2336..f68ff75 100644 --- a/me/Danker/commands/SetkeyCommand.java +++ b/me/Danker/commands/SetkeyCommand.java @@ -18,7 +18,7 @@ public class SetkeyCommand extends CommandBase implements ICommand { @Override public String getCommandUsage(ICommandSender arg0) { - return getCommandName() + " [key]"; + return getCommandName() + " "; } @Override @@ -31,7 +31,7 @@ public class SetkeyCommand extends CommandBase implements ICommand { final EntityPlayer player = (EntityPlayer)arg0; if (arg1.length == 0) { - player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /setkey [key]")); + player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /setkey ")); return; } diff --git a/me/Danker/commands/SkillsCommand.java b/me/Danker/commands/SkillsCommand.java index 00a1e5d..dc70175 100644 --- a/me/Danker/commands/SkillsCommand.java +++ b/me/Danker/commands/SkillsCommand.java @@ -182,7 +182,7 @@ public class SkillsCommand extends CommandBase { @Override public String getCommandUsage(ICommandSender arg0) { - return getCommandName() + " "; + return getCommandName() + " [name]"; } @Override @@ -315,7 +315,7 @@ public class SkillsCommand extends CommandBase { EnumChatFormatting.GREEN + " Taming: " + EnumChatFormatting.DARK_GREEN + EnumChatFormatting.BOLD + tamingLevel + "\n" + EnumChatFormatting.AQUA + " Average Skill Level: " + EnumChatFormatting.GOLD + EnumChatFormatting.BOLD + skillAvg + "\n" + EnumChatFormatting.AQUA + " True Average Skill Level: " + EnumChatFormatting.GOLD + EnumChatFormatting.BOLD + trueAvg + "\n" + - EnumChatFormatting.AQUA + "" + EnumChatFormatting.BOLD + "-------------------")); + EnumChatFormatting.AQUA + " " + EnumChatFormatting.BOLD + "-------------------")); }).start(); } diff --git a/me/Danker/commands/SlayerCommand.java b/me/Danker/commands/SlayerCommand.java index 090e85f..8f528e6 100644 --- a/me/Danker/commands/SlayerCommand.java +++ b/me/Danker/commands/SlayerCommand.java @@ -24,7 +24,7 @@ public class SlayerCommand extends CommandBase { @Override public String getCommandUsage(ICommandSender arg0) { - return getCommandName() + " "; + return getCommandName() + " [name]"; } @Override @@ -95,7 +95,7 @@ public class SlayerCommand extends CommandBase { EnumChatFormatting.AQUA + " Zombie XP: " + EnumChatFormatting.BLUE + EnumChatFormatting.BOLD + NumberFormat.getIntegerInstance().format(zombieXP) + "\n" + EnumChatFormatting.AQUA + " Spider XP: " + EnumChatFormatting.BLUE + EnumChatFormatting.BOLD + NumberFormat.getIntegerInstance().format(spiderXP) + "\n" + EnumChatFormatting.AQUA + " Wolf XP: " + EnumChatFormatting.BLUE + EnumChatFormatting.BOLD + NumberFormat.getIntegerInstance().format(wolfXP) + "\n" + - EnumChatFormatting.AQUA + "" + EnumChatFormatting.BOLD + "-------------------")); + EnumChatFormatting.AQUA + " " + EnumChatFormatting.BOLD + "-------------------")); }).start(); } diff --git a/me/Danker/commands/ToggleCommand.java b/me/Danker/commands/ToggleCommand.java index bbcafc1..6baa7af 100644 --- a/me/Danker/commands/ToggleCommand.java +++ b/me/Danker/commands/ToggleCommand.java @@ -20,7 +20,7 @@ public class ToggleCommand extends CommandBase implements ICommand { @Override public String getCommandUsage(ICommandSender arg0) { - return getCommandName() + " [gparty/coords/list]"; + return getCommandName() + " "; } @Override @@ -34,7 +34,7 @@ public class ToggleCommand extends CommandBase implements ICommand { final ConfigHandler cf = new ConfigHandler(); if (arg1.length == 0) { - player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /toggle [gparty/coords/list]")); + player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /toggle ")); return; } @@ -50,7 +50,7 @@ public class ToggleCommand extends CommandBase implements ICommand { player.addChatMessage(new ChatComponentText(EnumChatFormatting.GREEN + "Guild party notifications: " + EnumChatFormatting.DARK_GREEN + gpartyToggled + "\n" + EnumChatFormatting.GREEN + " Coord/Angle display: " + EnumChatFormatting.DARK_GREEN + coordsToggled)); } else { - player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /toggle [gparty/coords/list]")); + player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /toggle ")); } } } diff --git a/me/Danker/handlers/APIHandler.java b/me/Danker/handlers/APIHandler.java index 94868a2..006842b 100644 --- a/me/Danker/handlers/APIHandler.java +++ b/me/Danker/handlers/APIHandler.java @@ -54,6 +54,43 @@ public class APIHandler { return new JsonObject(); } + // Only used for UUID => Username + public static JsonArray getArrayResponse(String urlString) { + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + + try { + URL url = new URL(urlString); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + + if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { + BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); + String input; + StringBuffer response = new StringBuffer(); + + while ((input = in.readLine()) != null) { + response.append(input); + } + in.close(); + + Gson gson = new Gson(); + JsonArray array = gson.fromJson(response.toString(), JsonArray.class); + + return array; + } else { + player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Request failed. HTTP Error Code: " + conn.getResponseCode())); + } + } catch (MalformedURLException ex) { + player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "An error has occured. See logs for more details.")); + System.err.println(ex); + } catch (IOException ex) { + player.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "An error has occured. See logs for more details.")); + System.err.println(ex); + } + + return new JsonArray(); + } + public static String getUUID(String username) { Gson gson = new Gson(); -- cgit