From a06cc35c0e027d7b0f8b99c796dd6d1ebc1fa741 Mon Sep 17 00:00:00 2001 From: NK Date: Mon, 15 May 2023 21:22:01 +0200 Subject: [PATCH] v2.0.1! --- .github/CHANGELOG.md | 7 +- .github/README.md | 42 +-- gradle.properties | 2 +- src/main/java/me/night0721/lilase/Lilase.java | 7 +- .../me/night0721/lilase/config/AHConfig.java | 24 -- .../lilase/config/ConfigHandler.java | 129 +------- .../lilase/events/ScoreboardRenderEvent.java | 4 +- .../lilase/events/SniperFlipperEvents.java | 80 ++--- .../night0721/lilase/features/cofl/Cofl.java | 40 ++- .../lilase/features/cofl/QueueItem.java | 6 +- .../lilase/features/flipper/Flipper.java | 170 ++++++---- .../lilase/features/sniper/PageFlipper.java | 2 +- .../lilase/features/sniper/Sniper.java | 301 ------------------ .../lilase/mixins/MixinGuiIngame.java | 2 +- .../lilase/utils/DiscordWebhook.java | 8 +- .../lilase/utils/KeyBindingManager.java | 17 +- .../java/me/night0721/lilase/utils/Utils.java | 31 +- 17 files changed, 246 insertions(+), 626 deletions(-) diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index 28cd6e6..150891f 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -36,4 +36,9 @@ - v2.0 - Added a config for disabling words and crabby - Fixing cofl macro cannot open issue - - Adding auto sell to cofl macro \ No newline at end of file + - Adding auto sell to cofl macro +- v2.0.1 + - Fix webhook issues, now it would send when soneone bought your item + - Remove sniper option, only cofl macro exist now + - Added purse to webhook + - Added many more stuff to debug \ No newline at end of file diff --git a/.github/README.md b/.github/README.md index c7a3951..6f4e35e 100644 --- a/.github/README.md +++ b/.github/README.md @@ -1,6 +1,6 @@

Auction House Flipper - Lilase

- +icon
# Introduction: @@ -9,11 +9,9 @@ If you have any questions please join [Discord Server](https://night0721.me/disc For how to use, see **[here](https://github.com/night0721/lilase#how-to-use)** # Features: -- Auto buy any item you want, with query customised by yourself - Auto walk to the auction house - Auto sell after buying with profit check, so profit is ensured -- Can customise fetch time (the faster, the higher chance to get the item you want) -- Webhook system to send you that an item has been bought +- Webhook system to send you that an item has been bought, sold, flipped - Failsafe in Limbo - Auto reconnect to server when disconnected - Auto skip confirmation screen @@ -25,6 +23,7 @@ For how to use, see **[here](https://github.com/night0721/lilase#how-to-use)** - Modules toggleable in game - Check maximum profit percentage before buying so duped items won't be bought - COFL macro +- auto sell to cofl macro - Server ID on scoreboard hider - page flipper [WIP] @@ -39,57 +38,24 @@ For how to use, see **[here](https://github.com/night0721/lilase#how-to-use)** 8. save the file and press END key to start auction house sniper(or change it in control settings) 9. For example configuration, see [here](https://github.com/night0721/Lilase#example-config) -# **IMPORTANT INFO** - -List of things you can put in Tier section -``` -ANY, COMMON, UNCOMMON, RARE, EPIC, LEGENDARY, MYTHIC, DIVINE, SPECIAL, VERY_SPECIAL -``` -List of things you can put in Type section -``` -ANY, WEAPON, ARMOR, ACCESSORIES, CONSUMABLES, BLOCKS, MISC -``` # Changelog: [ChangeLog](https://github.com/night0721/Lilase/blob/master/.github/CHANGELOG.md) # To Do Features: - Console client?? - Page flipper for specific items(query) -- Wither Impact in lore check -- Blue omelette in lore check - pre api? # Example Config: -```cfg +```json { - "APIKey": "", "SendMessageToWebhook": true, "Webhook": "", "ReconnectDelay": 20, - "AuctionHouseDelay": 8, "BedSpamDelay": 100, "OnlySniper": false, - "checkMaximumProfitPercentageBeforeBuy": false, - "MaximumProfitPercentage": 1000, - "MinimumProfitPercentage": 400, - "items": [ - {"Name": " ", "Type": "ANY", "Price": 1000, "Tier": "ANY"}, - { - "Name": "Livid Dagger", - "Type": "WEAPON", - "Price": 5000000, - "Tier": "LEGENDARY" - }, - {"Name": "", "Type": "", "Price": 0, "Tier": ""} - ], - "blacklist": [ - {"Name": "Rune", "Type": "ANY", "Price": 1, "Tier": "ANY"}, - {"Name": "", "Type": "", "Price": 0, "Tier": ""}, - {"Name": "", "Type": "", "Price": 0, "Tier": ""} - ], "BedSpam": true, "GUI": true, - "checkProfitPercentageBeforeBuy": false, "GUI_COLOR": -1, "SniperMode": true } diff --git a/gradle.properties b/gradle.properties index 59de5b0..a8ea5c5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name = Lilase mod_id = lilase -mod_version = 2.0 +mod_version = 2.0.1 essential.defaults.loom=0 diff --git a/src/main/java/me/night0721/lilase/Lilase.java b/src/main/java/me/night0721/lilase/Lilase.java index 1142ec4..087e230 100644 --- a/src/main/java/me/night0721/lilase/Lilase.java +++ b/src/main/java/me/night0721/lilase/Lilase.java @@ -26,15 +26,13 @@ import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; -import java.io.IOException; - import static me.night0721.lilase.config.AHConfig.RECONNECT_DELAY; @Mod(modid = Lilase.MODID, name = Lilase.MOD_NAME, version = Lilase.VERSION, acceptedMinecraftVersions = "[1.8.9]") public class Lilase { public static final String MOD_NAME = "Lilase"; public static final String MODID = "Lilase"; - public static final String VERSION = "2.0"; + public static final String VERSION = "2.0.1"; public static final Minecraft mc = Minecraft.getMinecraft(); public static Sniper sniper; public static PageFlipper pageFlipper; @@ -66,11 +64,10 @@ public class Lilase { } @SubscribeEvent - public void onTick(TickEvent.ClientTickEvent event) throws IOException { + public void onTick(TickEvent.ClientTickEvent event) { if (mc.thePlayer == null || event.phase != TickEvent.Phase.START) return; tickAmount++; if (tickAmount % 20 == 0) Utils.checkFooter(); - if (tickAmount % (20 * 60) == 0) sniper.start(); if (tickAmount % 2400 == 0) configHandler.checkWebhookAndAPI(); if (pageFlipper != null) pageFlipper.switchStates(); if (QueueItem.flipper != null) QueueItem.flipper.switchStates(); diff --git a/src/main/java/me/night0721/lilase/config/AHConfig.java b/src/main/java/me/night0721/lilase/config/AHConfig.java index 4663f77..3afb4fd 100644 --- a/src/main/java/me/night0721/lilase/config/AHConfig.java +++ b/src/main/java/me/night0721/lilase/config/AHConfig.java @@ -15,15 +15,9 @@ public class AHConfig extends Config { addListener("SEND_MESSAGE", () -> Lilase.configHandler.setBoolean("SendMessageToWebhook", SEND_MESSAGE)); addListener("WEBHOOK", () -> Lilase.configHandler.setString("Webhook", WEBHOOK)); addListener("RECONNECT_DELAY", () -> Lilase.configHandler.setInt("ReconnectDelay", Math.round(RECONNECT_DELAY))); - addListener("AUCTION_HOUSE_DELAY", () -> Lilase.configHandler.setInt("AuctionHouseDelay", Math.round(AUCTION_HOUSE_DELAY))); - addListener("SNIPER_MODE", () -> Lilase.configHandler.setInt("SniperMode", SNIPER_MODE)); addListener("BED_SPAM", () -> Lilase.configHandler.setBoolean("BedSpam", BED_SPAM)); addListener("BED_SPAM_DELAY", () -> Lilase.configHandler.setInt("BedSpamDelay", Math.round(BED_SPAM_DELAY))); addListener("ONLY_SNIPER", () -> Lilase.configHandler.setBoolean("OnlySniper", ONLY_SNIPER)); - addListener("CHECK_PERCENTAGE", () -> Lilase.configHandler.setBoolean("checkProfitPercentageBeforeBuy", CHECK_PERCENTAGE)); - addListener("MINIMUM_PROFIT_PERCENTAGE", () -> Lilase.configHandler.setInt("MinimumProfitPercentage", Math.round(MINIMUM_PROFIT_PERCENTAGE))); - addListener("CHECK_MAXIMUM_PROFIT", () -> Lilase.configHandler.setBoolean("checkMaxiumProfitPercentageBeforeBuy", CHECK_MAXIMUM_PROFIT)); - addListener("MAXIMUM_PROFIT_PERCENTAGE", () -> Lilase.configHandler.setInt("MaximumProfitPercentage", MAXIMUM_PROFIT_PERCENTAGE)); addListener("GUI", () -> Lilase.configHandler.setBoolean("GUI", GUI)); addListener("GUI_COLOR", () -> Lilase.configHandler.setInt("GUI_COLOR", GUI_COLOR.getRGB())); addDependency("WEBHOOK", "SEND_MESSAGE"); @@ -32,12 +26,6 @@ public class AHConfig extends Config { addDependency("GUI_COLOR", "GUI"); } - @Slider(name = "Time per fetch (seconds)", min = 5, max = 15, step = 1, category = "Auction House", subcategory = "Sniper", description = "Time between each fetch of the auction house, the faster the fetch, the more likely you will snipe the item") - public static int AUCTION_HOUSE_DELAY = 8; - - @Dropdown(name = "Sniper Mode", category = "Auction House", subcategory = "Sniper", options = {"API", "Page Flipper[WIP]", "COFL"}) - public static int SNIPER_MODE = 2; - @Switch(name = "Bed Spam & Skip Confirm", category = "Auction House", subcategory = "Sniper", description = "Spam the bed to buy the item just after the grace period ends and skips the confirmation of buying the item") public static boolean BED_SPAM = true; @@ -56,18 +44,6 @@ public class AHConfig extends Config { @Number(name = "Reconnect Delay", min = 5, max = 20, category = "Failsafe", description = "Delay between each reconnect attempt to the server") public static int RECONNECT_DELAY = 20; - @Switch(name = "Check Profit Percentage Before Buying", category = "Flipper", description = "Check the profit percentage before buying the item, if the profit percentage is too low, it will not buy the item") - public static boolean CHECK_PERCENTAGE = false; - - @Number(name = "Minimum Profit Percentage", min = 100, max = 5000, step = 50, category = "Flipper", description = "Profit percentage to check before buying the item, if the profit percentage is too low, it will not buy the item") - public static int MINIMUM_PROFIT_PERCENTAGE = 400; - - @Switch(name = "Check Maximum Profit Before Buying", category = "Flipper", description = "Check the maximal profit before buying the item, if the maximal profit is too high, it will not buy the item (Can prevent duped items)") - public static boolean CHECK_MAXIMUM_PROFIT = false; - - @Number(name = "Maximum Profit Percentage", min = 1000, max = 10000, step = 1000, category = "Flipper", description = "Maximum profit to check before buying the item, if the maximal profit is too high, it will not buy the item (Can prevent duped items)") - public static int MAXIMUM_PROFIT_PERCENTAGE = 1000; - @Checkbox(name = "GUI", category = "GUI", description = "Enable the GUI") public static boolean GUI = true; diff --git a/src/main/java/me/night0721/lilase/config/ConfigHandler.java b/src/main/java/me/night0721/lilase/config/ConfigHandler.java index 9d19ac9..3ed380c 100644 --- a/src/main/java/me/night0721/lilase/config/ConfigHandler.java +++ b/src/main/java/me/night0721/lilase/config/ConfigHandler.java @@ -1,7 +1,6 @@ package me.night0721.lilase.config; import com.google.gson.Gson; -import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import me.night0721.lilase.utils.Utils; @@ -10,7 +9,7 @@ import java.io.*; public class ConfigHandler { private final Gson gson = new Gson(); - String path = "/config/Lilase.json"; + private final String path = "/config/Lilase.json"; private JsonObject config; public void init() { @@ -20,7 +19,6 @@ public class ConfigHandler { public void reloadConfig() { // TODO: Fix - if (hasNoKey("APIKey")) setString("APIKey", ""); if (hasNoKey("SendMessageToWebhook")) setBoolean("SendMessageToWebhook", true); if (hasNoKey("Webhook")) setString("Webhook", ""); if (hasNoKey("ReconnectDelay")) setInt("ReconnectDelay", 20); @@ -29,27 +27,8 @@ public class ConfigHandler { if (hasNoKey("BedSpam")) setBoolean("BedSpam", true); if (hasNoKey("BedSpamDelay")) setInt("BedSpamDelay", 100); if (hasNoKey("OnlySniper")) setBoolean("OnlySniper", false); - if (hasNoKey("checkProfitPercentageBeforeBuy")) setBoolean("checkProfitPercentageBeforeBuy", false); - if (hasNoKey("checkMaximumProfitPercentageBeforeBuy")) - setBoolean("checkMaximumProfitPercentageBeforeBuy", false); - if (hasNoKey("MaximumProfitPercentage")) setInt("MaximumProfitPercentage", 1000); //1000% - if (hasNoKey("MinimumProfitPercentage")) setInt("MinimumProfitPercentage", 400); //400% if (hasNoKey("GUI")) setBoolean("GUI", true); if (hasNoKey("GUI_COLOR")) setInt("GUI_COLOR", 0x003153); - if (hasNoKey("items")) setArray("items", new JsonObject[]{}); - if (hasNoKey("blacklist")) setArray("blacklist", new JsonObject[]{}); - for (int i = 1; i <= 3; i++) { - if (hasNoItemKey(i, "Name")) setItems(i, "Name", ""); - if (hasNoItemKey(i, "Type")) setItems(i, "Type", ""); - if (hasNoItemKey(i, "Price")) setItems(i, "Price", 0); - if (hasNoItemKey(i, "Tier")) setItems(i, "Tier", ""); - } - for (int i = 1; i <= 3; i++) { - if (hasNoBlacklistKey(i, "Name")) setBlacklists(i, "Name", ""); - if (hasNoBlacklistKey(i, "Type")) setBlacklists(i, "Type", ""); - if (hasNoBlacklistKey(i, "Price")) setBlacklists(i, "Price", 0); - if (hasNoBlacklistKey(i, "Tier")) setBlacklists(i, "Tier", ""); - } } public void checkWebhookAndAPI() { @@ -80,63 +59,12 @@ public class ConfigHandler { return config.get(key) == null; } - public boolean hasNoItemKey(int i, String key) { - config = readConfigFile(); - try { - if (config.getAsJsonArray("items").get(i - 1) == null) return true; - } catch (Exception e) { - return true; - } - return config.getAsJsonArray("items").get(i - 1).getAsJsonObject().get(key) == null; - } - - public boolean hasNoBlacklistKey(int i, String key) { - config = readConfigFile(); - try { - if (config.getAsJsonArray("blacklist").get(i - 1) == null) return true; - } catch (Exception e) { - return true; - } - return config.getAsJsonArray("blacklist").get(i - 1).getAsJsonObject().get(key) == null; - } - - public boolean getBoolean(String key) { - config = readConfigFile(); - if (config.get(key) != null) return config.get(key).getAsBoolean(); - return false; - } - - public int getInt(String key) { - config = readConfigFile(); - if (config.get(key) != null) return config.get(key).getAsInt(); - return 0; - } - public String getString(String key) { config = readConfigFile(); if (config.get(key) != null) return config.get(key).getAsString(); return null; } - public String getString(int item, String key) { - config = readConfigFile(); - try { - if (config.getAsJsonArray("items").get(item - 1).getAsJsonObject().get(key) != null) - return config.getAsJsonArray("items").get(item - 1).getAsJsonObject().get(key).getAsString(); - } catch (Exception ignore) { - } - return ""; - } - - public int getInt(int item, String key) { - config = readConfigFile(); - try { - if (config.getAsJsonArray("items").get(item - 1).getAsJsonObject().get(key) != null) - return config.getAsJsonArray("items").get(item - 1).getAsJsonObject().get(key).getAsInt(); - } catch (Exception ignore) { - } - return 0; - } public void setBoolean(String key, boolean value) { config = readConfigFile(); @@ -159,61 +87,6 @@ public class ConfigHandler { writeJsonToFile(config); } - public void setArray(String key, JsonObject[] value) { - config = readConfigFile(); - if (config.get(key) != null) config.remove(key); - JsonArray array = new JsonArray(); - for (JsonObject object : value) { - array.add(object); - } - config.add(key, array); - writeJsonToFile(config); - } - - public void setItems(int item, String key, Object value) { - config = readConfigFile(); - try { - if (config.getAsJsonArray("items").get(item - 1).getAsJsonObject().get(key) != null) - config.getAsJsonArray("items").get(item - 1).getAsJsonObject().remove(key); - } catch (Exception e) { - JsonObject object = new JsonObject(); - object.addProperty("Name", ""); - object.addProperty("Type", ""); - object.addProperty("Price", 0); - object.addProperty("Tier", ""); - config.getAsJsonArray("items").add(object); - } - if (value instanceof Integer) - config.getAsJsonArray("items").get(item - 1).getAsJsonObject().addProperty(key, (Integer) value); - else if (value instanceof String) - config.getAsJsonArray("items").get(item - 1).getAsJsonObject().addProperty(key, (String) value); - else if (value instanceof Boolean) - config.getAsJsonArray("items").get(item - 1).getAsJsonObject().addProperty(key, (Boolean) value); - writeJsonToFile(config); - } - - public void setBlacklists(int item, String key, Object value) { - config = readConfigFile(); - try { - if (config.getAsJsonArray("blacklist").get(item - 1).getAsJsonObject().get(key) != null) - config.getAsJsonArray("blacklist").get(item - 1).getAsJsonObject().remove(key); - } catch (Exception e) { - JsonObject object = new JsonObject(); - object.addProperty("Name", ""); - object.addProperty("Type", ""); - object.addProperty("Price", 0); - object.addProperty("Tier", ""); - config.getAsJsonArray("blacklist").add(object); - } - if (value instanceof Integer) - config.getAsJsonArray("blacklist").get(item - 1).getAsJsonObject().addProperty(key, (Integer) value); - else if (value instanceof String) - config.getAsJsonArray("blacklist").get(item - 1).getAsJsonObject().addProperty(key, (String) value); - else if (value instanceof Boolean) - config.getAsJsonArray("blacklist").get(item - 1).getAsJsonObject().addProperty(key, (Boolean) value); - writeJsonToFile(config); - } - public void writeJsonToFile(JsonObject jsonObject) { try { BufferedWriter writer = new BufferedWriter(new FileWriter(System.getProperty("user.dir") + path)); diff --git a/src/main/java/me/night0721/lilase/events/ScoreboardRenderEvent.java b/src/main/java/me/night0721/lilase/events/ScoreboardRenderEvent.java index 0e7175c..0591364 100644 --- a/src/main/java/me/night0721/lilase/events/ScoreboardRenderEvent.java +++ b/src/main/java/me/night0721/lilase/events/ScoreboardRenderEvent.java @@ -8,8 +8,8 @@ import net.minecraftforge.fml.common.eventhandler.Event; // TODO: Implement Lombok Library for clean code @Cancelable public class ScoreboardRenderEvent extends Event { - public ScoreObjective objective; - public ScaledResolution resolution; + public final ScoreObjective objective; + public final ScaledResolution resolution; public ScoreboardRenderEvent(ScoreObjective objective, ScaledResolution resolution) { this.objective = objective; diff --git a/src/main/java/me/night0721/lilase/events/SniperFlipperEvents.java b/src/main/java/me/night0721/lilase/events/SniperFlipperEvents.java index 3b16847..e9665b3 100644 --- a/src/main/java/me/night0721/lilase/events/SniperFlipperEvents.java +++ b/src/main/java/me/night0721/lilase/events/SniperFlipperEvents.java @@ -27,6 +27,7 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.InputEvent; import org.lwjgl.input.Keyboard; +import java.awt.*; import java.util.ArrayList; import java.util.Calendar; import java.util.List; @@ -36,7 +37,7 @@ import java.util.regex.Pattern; import static me.night0721.lilase.config.AHConfig.GUI_COLOR; import static me.night0721.lilase.config.AHConfig.SEND_MESSAGE; -import static me.night0721.lilase.features.flipper.Flipper.rotation; +import static me.night0721.lilase.features.flipper.Flipper.*; import static me.night0721.lilase.features.flipper.FlipperState.START; import static me.night0721.lilase.utils.PlayerUtils.sendPacketWithoutEvent; @@ -44,21 +45,39 @@ public class SniperFlipperEvents { private int windowId = 1, price; private boolean buying = false, bought = false; private final Clock clock = new Clock(); - private final Pattern - AUCTION_SOLD_PATTERN = Pattern.compile("^(.*?) bought (.*?) for ([\\d,]+) coins CLICK$"), - BOUGHT_PATTERN = Pattern.compile("You purchased (\\w+(?:\\s+\\w+)*) for ([\\d,]+)\\s*(\\w+)!"), - BOUGHT_PATTERN_2 = Pattern.compile("You claimed (.+?) from (.+?)'s auction!"), - BOUGHT_PATTERN_3 = Pattern.compile("You (purchased|claimed)( (\\\\d+x))? ([^\\\\s]+(\\\\s+[^\\\\d,]+)*)((,| for) (\\\\d+,?)+ coins?(!)?)?"); - // TODO: Split into one pattern + private final Pattern AUCTION_SOLD_PATTERN = Pattern.compile("^(.*?) bought (.*?) for ([\\d,]+) coins CLICK$"), + pattern = Pattern.compile("You purchased (\\w+(?:\\s+\\w+)*) for ([\\d,]+)\\s*(\\w+)|You claimed (.+?) from (.+?)'s auction!|(You (purchased|claimed)( (\\\\d+x))? ([^\\\\s]+(\\\\s+[^\\\\d,]+)*)((,| for) (\\\\d+,?)+ coins?(!)?))?"); public static final List postedNames = new ArrayList<>(); @SubscribeEvent public void onChat(ClientChatReceivedEvent event) throws InterruptedException { String message = event.message.getUnformattedText(); - Matcher matcher = AUCTION_SOLD_PATTERN.matcher(message); - Matcher boughtMatcher = BOUGHT_PATTERN.matcher(message); - Matcher boughtMatcher2 = BOUGHT_PATTERN_2.matcher(message); - Matcher boughtMatcher3 = BOUGHT_PATTERN_3.matcher(message); + if (message.startsWith("§6[Auction]")) { + Matcher matcher = AUCTION_SOLD_PATTERN.matcher(ScoreboardUtils.cleanSB(message)); + if (matcher.matches()) { + try { + webhook.setUsername("Lilase"); + webhook.setAvatarUrl(icon); + webhook.addEmbed(new DiscordWebhook.EmbedObject() + .setTitle("Someone bought an item!") + .setFooter("Purse: " + format.format(Utils.getPurse()), icon) + .addField("Item:", matcher.group(2), true) + .addField("Price:", matcher.group(3), true) + .addField("Purchaser:", matcher.group(1).split("[Auction] ")[1], true) + .setColor(Color.decode("#003153"))); + if (SEND_MESSAGE) webhook.execute(); + Utils.debugLog("Notified Webhook"); + } catch (Exception e) { + e.printStackTrace(); + Utils.debugLog("Failed to send webhook"); + } + Lilase.sniper.incrementAuctionsFlipped(); + } + } + /* + §6[Auction] §aphiinix_ §ebought §fImplosion Belt §efor §6900,000 coins §lCLICK + */ + Matcher boughtMatcher = pattern.matcher(message); if (!message.contains(":")) { if (message.equals("You didn't participate in this auction!")) { Utils.debugLog("Failed to buy item, not fast enough. Closing the menu"); @@ -66,22 +85,12 @@ public class SniperFlipperEvents { } else if (message.equals("You don't have enough coins to afford this bid!")) { Utils.debugLog("Failed to buy item, not enough money. Closing the menu"); InventoryUtils.clickOpenContainerSlot(49); - } else if (message.contains("Your new API key is")) { - Utils.debugLog("Detected new API key, saving it to config"); - Utils.debugLog("Saved new API key to config"); - String apiKey = message.replace("Your new API key is ", ""); - Lilase.configHandler.setString("APIKey", apiKey); - } else if ((boughtMatcher.matches() || boughtMatcher2.matches() || boughtMatcher3.matches()) && bought) { + } else if (boughtMatcher.matches() && bought) { new Thread(() -> { bought = false; Utils.debugLog("Bought an item, starting to sell"); - try { - if (SEND_MESSAGE) Lilase.sniper.webhook.execute(); - } catch (Exception e) { - Utils.debugLog("Failed to send webhook"); - } - Utils.debugLog("Target price " + Cofl.price); - price = Cofl.price; + Utils.debugLog("Target price " + Cofl.target); + price = Cofl.target; try { Thread.sleep(1500); } catch (InterruptedException e) { @@ -93,26 +102,24 @@ public class SniperFlipperEvents { InventoryUtils.clickOpenContainerSlot(13); Lilase.mc.thePlayer.closeScreen(); Utils.debugLog("Cannot post item as the cost is too low, stopping fliiper and starting sniper"); - Lilase.sniper.toggleAuction(); + Lilase.cofl.toggleAuction(); Flipper.state = FlipperState.NONE; } else if (message.contains("Can't create a BIN auction for this item for a PRICE this LOW!")) { Lilase.mc.thePlayer.closeScreen(); Utils.debugLog("Cannot post item as the cost is too low, stopping fliiper and starting sniper"); - Lilase.sniper.toggleAuction(); + Lilase.cofl.toggleAuction(); Flipper.state = FlipperState.NONE; } else if (message.contains("You were spawned in Limbo")) { Utils.debugLog("Detected in Limbo, stopping everything for 5 minutes"); Utils.addTitle("You got sent to Limbo!"); Flipper.state = FlipperState.NONE; - if (Lilase.sniper.getOpen()) Lilase.sniper.toggleAuction(); + if (Lilase.cofl.getOpen()) Lilase.cofl.toggleAuction(); Thread.sleep(5000); Utils.sendServerMessage("/lobby"); Thread.sleep(5000); Utils.sendServerMessage("/skyblock"); Thread bzchillingthread = new Thread(bazaarChilling); bzchillingthread.start(); - } else if (matcher.matches() && postedNames.contains(matcher.group(2))) { - Lilase.sniper.incrementAuctionsFlipped(); } } } @@ -156,7 +163,7 @@ public class SniperFlipperEvents { } Lilase.mc.thePlayer.sendChatMessage("/hub"); Thread.sleep(6000); - Lilase.sniper.toggleAuction(); + Lilase.cofl.toggleAuction(); } catch (Exception ignore) { } @@ -175,6 +182,7 @@ public class SniperFlipperEvents { if (Flipper.state != FlipperState.NONE) { new Thread(() -> { Utils.debugLog("Interrupting Flipper selling"); + Flipper.sendInterrupt(); Lilase.mc.thePlayer.closeScreen(); Flipper.state = FlipperState.NONE; Lilase.cofl.toggleAuction(); @@ -184,8 +192,8 @@ public class SniperFlipperEvents { Utils.debugLog("[PageFlipper] Interrupting PageFlipper sniping"); Lilase.pageFlipper.toggleAuction(); }).start(); - } else if (Lilase.sniper.getOpen()) { - Lilase.sniper.toggleAuction(); + } else if (Lilase.cofl.getOpen()) { + Lilase.cofl.toggleAuction(); } } } @@ -214,7 +222,7 @@ public class SniperFlipperEvents { @SubscribeEvent(priority = EventPriority.HIGHEST) public void onInventoryRendering(GuiScreenEvent.BackgroundDrawnEvent event) { String windowName = InventoryUtils.getInventoryName(); - if (AHConfig.BED_SPAM && (Lilase.sniper.getOpen() || Lilase.pageFlipper.getOpen() || Lilase.cofl.getOpen())) { + if (AHConfig.BED_SPAM && (Lilase.pageFlipper.getOpen() || Lilase.cofl.getOpen())) { if ("BIN Auction View".equals(windowName)) { ItemStack is = InventoryUtils.getStackInOpenContainerSlot(31); if (is != null) { @@ -237,17 +245,13 @@ public class SniperFlipperEvents { buying = false; Lilase.mc.thePlayer.closeScreen(); } - } else { - System.out.println("No item in slot 31, ??"); -// buying = false; -// Lilase.mc.thePlayer.closeScreen(); } } if (buying && "Confirm Purchase".equals(windowName)) { System.out.println("Window ID: " + Lilase.mc.thePlayer.openContainer.windowId); Lilase.mc.playerController.windowClick(windowId + 1, 11, 0, 0, Lilase.mc.thePlayer); buying = false; - if (Lilase.sniper.buying || Lilase.cofl.getQueue().isRunning()) bought = true; + if (Lilase.cofl.getQueue().isRunning()) bought = true; } } } diff --git a/src/main/java/me/night0721/lilase/features/cofl/Cofl.java b/src/main/java/me/night0721/lilase/features/cofl/Cofl.java index b2d71b6..099ff17 100644 --- a/src/main/java/me/night0721/lilase/features/cofl/Cofl.java +++ b/src/main/java/me/night0721/lilase/features/cofl/Cofl.java @@ -3,18 +3,25 @@ package me.night0721.lilase.features.cofl; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import me.night0721.lilase.Lilase; -import me.night0721.lilase.config.AHConfig; +import me.night0721.lilase.features.flipper.Flipper; +import me.night0721.lilase.features.flipper.FlipperState; +import me.night0721.lilase.player.EffectState; import me.night0721.lilase.utils.UngrabUtils; import me.night0721.lilase.utils.Utils; import java.io.PrintStream; +import java.util.concurrent.ThreadLocalRandom; import java.util.regex.Pattern; +import static me.night0721.lilase.config.AHConfig.SEND_MESSAGE; + public class Cofl { private final Queue queue = new Queue(); private boolean open = false; public static int price = 0; - public Thread thread = new Thread(() -> { + public static int target = 0; + private final ThreadLocalRandom random = ThreadLocalRandom.current(); + public final Thread thread = new Thread(() -> { while (true) { try { Thread.sleep(1); @@ -45,19 +52,22 @@ public class Cofl { public void handleMessage(String str) { try { - if (AHConfig.SNIPER_MODE != 2 || !getOpen() || !str.startsWith("Received:")) return; + if (!getOpen() || !str.startsWith("Received:")) return; if (pattern.matcher(str).find()) { +// Utils.debugLog("Doing some motion as we don't want to be AFK"); + Lilase.mc.thePlayer.inventory.currentItem = random.nextInt(9); String[] split = str.split("Received: "); JsonObject auction = new JsonParser().parse(new JsonParser().parse(split[1]).getAsJsonObject().get("data").getAsString()).getAsJsonObject(); String itemName = auction.get("auction").getAsJsonObject().get("itemName").getAsString(); String id = auction.get("auction").getAsJsonObject().get("uuid").getAsString(); - price = auction.get("target").getAsInt(); + price = auction.get("auction").getAsJsonObject().get("startingBid").getAsInt(); + target = auction.get("target").getAsInt(); // Utils.debugLog("Item Name: " + itemName); // Utils.debugLog("ID: " + id); // Utils.debugLog("Price: " + price); - if (itemName != null && id != null && price != 0) { - Utils.debugLog("Adding auction to queue: " + id, "Target Price: " + price, "Name: " + itemName); - getQueue().add(new QueueItem(id, itemName, price)); + if (itemName != null && id != null && price != 0 && target != 0) { + Utils.debugLog("Adding auction to queue: " + id, "Price: " + price, "Target Price: " + target, "Name: " + itemName); + getQueue().add(new QueueItem(id, itemName, price, target)); getQueue().scheduleClear(); } } @@ -75,7 +85,17 @@ public class Cofl { setOpen(false); UngrabUtils.regrabMouse(); } else { - if (Utils.checkInHub()) { + if (SEND_MESSAGE && Lilase.configHandler.getString("Webhook").equals("")) { + Utils.sendMessage("Sending message to Webhook is on but Webhook is missing, stopping"); + setOpen(false); + return; + } + if (Flipper.state != FlipperState.NONE) { + Utils.sendMessage("Flipper is running, stopping"); + setOpen(false); + return; + } + if (Utils.cookie == EffectState.ON || Utils.checkInHub()) { Utils.sendMessage("Started COFL Sniper"); setOpen(true); boolean threadStatus = thread.isAlive(); @@ -84,7 +104,9 @@ public class Cofl { thread.start(); } UngrabUtils.ungrabMouse(); - } else Utils.sendMessage("Detected not in hub, please go to hub to start"); + } else { + Utils.sendMessage("Detected not in hub, please go to hub to start"); + } } } diff --git a/src/main/java/me/night0721/lilase/features/cofl/QueueItem.java b/src/main/java/me/night0721/lilase/features/cofl/QueueItem.java index 931b229..9ddb91b 100644 --- a/src/main/java/me/night0721/lilase/features/cofl/QueueItem.java +++ b/src/main/java/me/night0721/lilase/features/cofl/QueueItem.java @@ -7,17 +7,19 @@ import me.night0721.lilase.utils.Utils; public class QueueItem { private final String command, name; private final int price; + private final int target; public static Flipper flipper = null; - public QueueItem(String command, String name, int price) { + public QueueItem(String command, String name, int price, int target) { this.command = command; this.name = name; this.price = price; + this.target = target; } public void openAuction() { Utils.debugLog("Executing: " + command); Utils.sendServerMessage("/viewauction " + command); - flipper = new Flipper(name, price); + flipper = new Flipper(name, price, target); } } \ No newline at end of file diff --git a/src/main/java/me/night0721/lilase/features/flipper/Flipper.java b/src/main/java/me/night0721/lilase/features/flipper/Flipper.java index 29755c6..1c48505 100644 --- a/src/main/java/me/night0721/lilase/features/flipper/Flipper.java +++ b/src/main/java/me/night0721/lilase/features/flipper/Flipper.java @@ -1,7 +1,5 @@ package me.night0721.lilase.features.flipper; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import me.night0721.lilase.Lilase; import me.night0721.lilase.events.SniperFlipperEvents; import me.night0721.lilase.player.EffectState; @@ -9,61 +7,64 @@ import me.night0721.lilase.player.Rotation; import me.night0721.lilase.utils.*; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityArmorStand; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; import net.minecraft.util.StringUtils; -import javax.net.ssl.HttpsURLConnection; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.net.URL; +import java.awt.*; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.Locale; + +import static me.night0721.lilase.config.AHConfig.SEND_MESSAGE; // TODO: Fix repeating code (I will do it soon) public class Flipper { - private final String itemname; - private static String bytedata; - private final int itemprice; + private static String itemname = ""; + private static int itemprice = 0; + private static int target = 0; public static FlipperState state = FlipperState.NONE; public static final Rotation rotation = new Rotation(); private final Clock buyWait = new Clock(); - private static JsonObject object; + public static final DiscordWebhook webhook = new DiscordWebhook(Lilase.configHandler.getString("Webhook")); + public static final NumberFormat format = NumberFormat.getInstance(Locale.US); + public static final DecimalFormat df = new DecimalFormat("#.##"); + public static final String icon = "https://camo.githubusercontent.com/57a8295f890970d2173b895c7a0f6c60527fb3bec4489b233b221ab45cb9fa42/68747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f3834323031343930393236343935333335342f313038323337333237353033383030333231302f6c696c6173652e706e67"; - public Flipper(String name, String data, int price) { - itemname = name; - bytedata = data; - itemprice = price; - } - public Flipper(String name, int price) { + public Flipper(String name, int price, int targetprice) { itemname = name; itemprice = price; + target = targetprice; + webhook.setUsername("Lilase"); + webhook.setAvatarUrl(icon); } - public int getItemPrice() { - if (object == null) { - try { - object = getItemData(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - return object.get("price").getAsInt(); - } - - public int checkProfitPercentage() throws IOException { - if (object == null) object = getItemData(); - return object.get("price").getAsInt() / itemprice * 100; - } public void sellItem() { + Utils.checkFooter(); Lilase.sniper.incrementAuctionsSniped(); Utils.sendMessage("Flipper is running, stopping, will resume when flipper is done"); - if (Lilase.sniper.getOpen()) Lilase.sniper.toggleAuction(); if (Lilase.cofl.getOpen()) Lilase.cofl.toggleAuction(); UngrabUtils.ungrabMouse(); - Utils.checkFooter(); Utils.debugLog("Cookie: " + (Utils.cookie == EffectState.ON ? "ON" : "OFF")); Utils.debugLog("Have screen: " + (Lilase.mc.currentScreen != null ? "Yes" : "No")); + Utils.debugLog("Profit Percentage: " + target / itemprice); + try { + webhook.addEmbed(new DiscordWebhook.EmbedObject() + .setTitle("Just purchased an item!") + .setFooter("Purse: " + format.format(Utils.getPurse()), icon) + .addField("Item:", itemname, true) + .addField("Price:", format.format(itemprice), true) + .addField("Target Price:", format.format(target), true) + .addField("Profit Percentage:", df.format(target / itemprice * 100L) + "%", true) + .setColor(Color.decode("#003153"))); + if (SEND_MESSAGE) webhook.execute(); + Utils.debugLog("Notified Webhook"); + } catch (Exception e) { + e.printStackTrace(); + Utils.debugLog("Failed to send webhook"); + } if (Utils.cookie != EffectState.ON) { Utils.sendServerMessage("/hub"); state = FlipperState.WALKING_TO_FIRST_POINT; @@ -123,8 +124,25 @@ public class Flipper { if (InventoryUtils.isStoneButton() && buyWait.passed()) { if (InventoryUtils.getSlotForItem(itemname) == -1) { Utils.debugLog("Cannot find item in inventory, stopping flipper"); + try { + webhook.addEmbed(new DiscordWebhook.EmbedObject() + .setTitle("Failed to post an item!") + .setDescription("Could not find item in inventory, sending so you can post it manually") + .setFooter("Purse: " + format.format(Utils.getPurse()), icon) + .addField("Item:", itemname, true) + .addField("Price:", format.format(itemprice), true) + .addField("Target Price:", format.format(target), true) + .addField("Profit Percentage:", Float.parseFloat(df.format(target / itemprice * 100L)) + "%", true) + .setColor(Color.decode("#ff0000"))); + if (SEND_MESSAGE) webhook.execute(); + Utils.debugLog("Notified Webhook"); + } catch (Exception e) { + e.printStackTrace(); + Utils.debugLog("Failed to send webhook"); + } + Lilase.mc.thePlayer.closeScreen(); state = FlipperState.NONE; - Lilase.sniper.setOpen(true); + Lilase.cofl.setOpen(true); return; } InventoryUtils.clickOpenContainerSlot(InventoryUtils.getSlotForItem(itemname)); @@ -138,8 +156,46 @@ public class Flipper { buyWait.schedule(1000); } // TODO: Ternary Expression } else if (InventoryUtils.inventoryNameContains("Manage Auction") && buyWait.passed()) { - InventoryUtils.clickOpenContainerSlot(24); - buyWait.schedule(1500); + ItemStack slot24 = InventoryUtils.getStackInOpenContainerSlot(24); + ItemStack slot33 = InventoryUtils.getStackInOpenContainerSlot(33); + ItemStack slot42 = InventoryUtils.getStackInOpenContainerSlot(42); + ItemStack slot51 = InventoryUtils.getStackInOpenContainerSlot(51); + + if (slot24 != null && slot24.getItem() == Items.golden_horse_armor) { + InventoryUtils.clickOpenContainerSlot(24); + buyWait.schedule(1000); + } else if (slot33 != null && slot33.getItem() == Items.golden_horse_armor) { + InventoryUtils.clickOpenContainerSlot(33); + buyWait.schedule(1000); + } else if (slot42 != null && slot42.getItem() == Items.golden_horse_armor) { + InventoryUtils.clickOpenContainerSlot(42); + buyWait.schedule(1000); + } else if (slot51 != null && slot51.getItem() == Items.golden_horse_armor) { + InventoryUtils.clickOpenContainerSlot(51); + buyWait.schedule(1000); + } else { + Utils.debugLog("Can't find create auction button, stopping flipper"); + try { + webhook.addEmbed(new DiscordWebhook.EmbedObject() + .setTitle("Failed to post an item!") + .setDescription("Could not find create auction button, sending so you can post it manually") + .setFooter("Purse: " + format.format(Utils.getPurse()), icon) + .addField("Item:", itemname, true) + .addField("Price:", format.format(itemprice), true) + .addField("Target Price:", format.format(target), true) + .addField("Profit Percentage:", Float.parseFloat(df.format(target / itemprice * 100L)) + "%", true) + .setColor(Color.decode("#ff0000"))); + if (SEND_MESSAGE) webhook.execute(); + Utils.debugLog("Notified Webhook"); + } catch (Exception e) { + e.printStackTrace(); + Utils.debugLog("Failed to send webhook"); + } + Lilase.mc.thePlayer.closeScreen(); + state = FlipperState.NONE; + Lilase.cofl.setOpen(true); + return; + } } case START: if (!InventoryUtils.isStoneButton() && InventoryUtils.isToAuctionItem(itemname) && InventoryUtils.inventoryNameStartsWith("Create BIN Auction") && buyWait.passed()) { @@ -163,28 +219,24 @@ public class Flipper { break; } } - - public static JsonObject getItemData() throws IOException { - URL url = new URL("https://www.night0721.me/api/skyblock"); - HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); - connection.addRequestProperty("Content-Type", "text/plain"); - connection.setDoOutput(true); - connection.setRequestMethod("POST"); - OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream()); - out.write(bytedata); - out.close(); - BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); - String inputLine; - StringBuilder content = new StringBuilder(); - while ((inputLine = in.readLine()) != null) - content.append(inputLine); - in.close(); - connection.disconnect(); - object = (JsonObject) new JsonParser().parse(content.toString()); - System.out.println("Price" + object.get("price")); - return object; + public static void sendInterrupt() { + try { + webhook.addEmbed(new DiscordWebhook.EmbedObject() + .setTitle("Failed to post an item!") + .setDescription("Could not find create as interruption, sending so you can post it manually") + .setFooter("Purse: " + format.format(Utils.getPurse()), icon) + .addField("Item:", itemname, true) + .addField("Price:", format.format(itemprice), true) + .addField("Target Price:", format.format(target), true) + .addField("Profit Percentage:", Float.parseFloat(df.format(target / itemprice * 100L)) + "%", true) + .setColor(Color.decode("#ff0000"))); + if (SEND_MESSAGE) webhook.execute(); + Utils.debugLog("Notified Webhook"); + } catch (Exception e) { + e.printStackTrace(); + Utils.debugLog("Failed to send webhook"); + } } - public static float distanceToFirstPoint() { return (float) Math.sqrt(Math.pow(Lilase.mc.thePlayer.posX - (-2.5), 2) + Math.pow(Lilase.mc.thePlayer.posZ - (-91.5), 2)); } diff --git a/src/main/java/me/night0721/lilase/features/sniper/PageFlipper.java b/src/main/java/me/night0721/lilase/features/sniper/PageFlipper.java index 94c311a..cb11e6f 100644 --- a/src/main/java/me/night0721/lilase/features/sniper/PageFlipper.java +++ b/src/main/java/me/night0721/lilase/features/sniper/PageFlipper.java @@ -13,7 +13,7 @@ import static me.night0721.lilase.features.flipper.Flipper.*; public class PageFlipper { public PageFlipperState state = PageFlipperState.NONE; - public Clock cooldown = new Clock(); + public final Clock cooldown = new Clock(); public boolean open = false; private Thread loop; diff --git a/src/main/java/me/night0721/lilase/features/sniper/Sniper.java b/src/main/java/me/night0721/lilase/features/sniper/Sniper.java index 11123c1..cf2282b 100644 --- a/src/main/java/me/night0721/lilase/features/sniper/Sniper.java +++ b/src/main/java/me/night0721/lilase/features/sniper/Sniper.java @@ -1,264 +1,9 @@ package me.night0721.lilase.features.sniper; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import me.night0721.lilase.Lilase; -import me.night0721.lilase.config.AHConfig; -import me.night0721.lilase.features.flipper.Flipper; -import me.night0721.lilase.features.flipper.FlipperState; -import me.night0721.lilase.player.EffectState; -import me.night0721.lilase.utils.DiscordWebhook; -import me.night0721.lilase.utils.UngrabUtils; -import me.night0721.lilase.utils.Utils; - -import javax.net.ssl.HttpsURLConnection; -import java.awt.*; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.URL; -import java.text.DecimalFormat; -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; -import java.util.concurrent.ThreadLocalRandom; -import java.util.concurrent.TimeUnit; - -import static me.night0721.lilase.config.AHConfig.SEND_MESSAGE; - public class Sniper { - private Boolean open = false; - public Boolean buying = false; private int auctionsSniped = 0; private int auctionsPosted = 0; private int auctionsFlipped = 0; - public final DiscordWebhook webhook = new DiscordWebhook(Lilase.configHandler.getString("Webhook")); - private final List items = new ArrayList<>(); - private final List blacklist = new ArrayList<>(); - private final List posted = new ArrayList<>(); - private final ThreadLocalRandom randomSlot; - public static Flipper flipper; - private final List times = Arrays.asList(TimeUnit.DAYS.toMillis(365), TimeUnit.DAYS.toMillis(30), TimeUnit.DAYS.toMillis(1), TimeUnit.HOURS.toMillis(1), TimeUnit.MINUTES.toMillis(1), TimeUnit.SECONDS.toMillis(1)); - private final List timesString = Arrays.asList("year", "month", "day", "hour", "minute", "second"); - - public Sniper() { - for (int i = 1; i <= 99; i++) { - if (!Lilase.configHandler.getString(i, "Name").equals("") && !Lilase.configHandler.getString(i, "Type").equals("") && !Lilase.configHandler.getString(i, "Tier").equals("") && Lilase.configHandler.getInt(i, "Price") != 0) { - try { - ItemType.valueOf(Lilase.configHandler.getString(i, "Type")); - ItemType.valueOf(Lilase.configHandler.getString(i, "Tier")); - } catch (IllegalArgumentException e) { - System.out.println("Invalid item type or tier for item " + i + ", please check your config"); - } - items.add(new Item(Lilase.configHandler.getString(i, "Name"), ItemType.valueOf(Lilase.configHandler.getString(i, "Type")), Lilase.configHandler.getInt(i, "Price"), ItemTier.valueOf(Lilase.configHandler.getString(i, "Tier")))); - } - } - for (int i = 1; i <= 99; i++) { - if (!Lilase.configHandler.getString(i, "Name").equals("")) - blacklist.add(new Item(Lilase.configHandler.getString(i, "Name"), null, null, null)); - } - webhook.setUsername("Lilase - Auction House"); - webhook.setAvatarUrl("https://th.bing.com/th/id/OIP.Lk2cSujieY70GbsgPZ0TyAHaEK?w=325&h=182&c=7&r=0&o=5&pid=1.7"); - webhook.setTts(false); - randomSlot = ThreadLocalRandom.current(); - } - - private JsonObject getHypixelData(String player) throws IOException { - URL url = new URL("https://api.hypixel.net/player?key=" + Lilase.configHandler.getString("APIKey") + "&uuid=" + player); - HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); - connection.setRequestProperty("Content-Type", "application/json"); - connection.setRequestMethod("GET"); - connection.setConnectTimeout(5000); - connection.setReadTimeout(5000); - BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); - String inputLine; - StringBuilder content = new StringBuilder(); - while ((inputLine = in.readLine()) != null) { - content.append(inputLine); - } - in.close(); - connection.disconnect(); - return (JsonObject) new JsonParser().parse(content.toString()); - } - - public void start() throws IOException { - if (AHConfig.SNIPER_MODE != 0) return; - if (!open) return; - if (Utils.cookie != EffectState.ON && !Utils.checkInHub()) { - Utils.sendMessage("You have no cookie but you are not in hub, stopping"); - setOpen(false); - return; - } - if (items.size() == 0) { - Utils.sendMessage("No Item queued, stopping"); - setOpen(false); - return; - } - if (Lilase.configHandler.getString("APIKey").equals("") || Lilase.configHandler.getString("Webhook").equals("")) { - Utils.sendMessage("Missing APIKey, stopping"); - setOpen(false); - return; - } - if (SEND_MESSAGE && Lilase.configHandler.getString("Webhook").equals("")) { - Utils.sendMessage("Sending message to Webhook is on but Webhook is missing, stopping"); - setOpen(false); - return; - } - if (Flipper.state != FlipperState.NONE) { - Utils.sendMessage("Flipper is running, stopping"); - setOpen(false); - return; - } - if (Lilase.mc.currentScreen != null) Lilase.mc.thePlayer.closeScreen(); - Utils.debugLog("Doing some motion as we don't want to be AFK"); - Lilase.mc.thePlayer.inventory.currentItem = randomSlot.nextInt(9); - URL url = new URL("https://api.hypixel.net/skyblock/auctions"); - HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); - connection.setRequestProperty("Content-Type", "application/json"); - connection.setRequestMethod("GET"); - connection.setConnectTimeout(5000); - connection.setReadTimeout(5000); - int status = connection.getResponseCode(); - if (status != 200) { - Utils.sendMessage("Error getting data from Hypixel API, either API down or internal error"); - return; - } - BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); - String inputLine; - StringBuilder content = new StringBuilder(); - while ((inputLine = in.readLine()) != null) { - content.append(inputLine); - } - in.close(); - connection.disconnect(); - Utils.sendMessage("Getting item from auction house"); - JsonObject data = (JsonObject) new JsonParser().parse(content.toString()); - JsonArray auctions = data.getAsJsonArray("auctions"); - for (int i = 0; i < auctions.size(); i++) { - JsonObject auction = auctions.get(i).getAsJsonObject(); - for (Item item : items) { - String lore = " "; - ItemType type = item.getType(); - String itemName = auction.get("item_name").getAsString(); - String uuid = auction.get("uuid").getAsString(); - Integer price = auction.get("starting_bid").getAsInt(); - boolean found = false; - switch (item.query) { - case "Bal": - lore = "Made of Lava"; - break; - case "Squid": - lore = "More Ink"; - break; - case "Monkey": - lore = "Treeborn"; - break; - case "Ocelot": - lore = "Tree Hugger"; - break; - case "Dolphin": - lore = "Echolocation"; - break; - case "Flying Fish": - lore = "Water Bender"; - break; - } - if (posted.contains(uuid)) break; - for (Item blacklisted : blacklist) { - if (itemName.contains(blacklisted.getQuery())) { - found = true; - break; - } - } - if (found) break; - if (!itemName.toLowerCase().contains(item.query.toLowerCase())) break; - if (!auction.get("item_lore").getAsString().contains(lore)) break; - if (price > item.getPrice()) break; - if (item.getTier() != ItemTier.ANY) - if (!auction.get("tier").getAsString().equals(item.getTier().name())) break; - if (type != ItemType.ANY) if (!auction.get("category").getAsString().equals(type.getLowercase())) break; - if (!auction.get("bin").getAsBoolean()) break; - if (!posted.contains(uuid)) { - posted.add(uuid); - flipper = new Flipper(itemName, auction.get("item_bytes").getAsString(), price); - NumberFormat format = NumberFormat.getInstance(Locale.US); - JsonObject profile = getHypixelData(auction.get("auctioneer").getAsString()); - String profileName = profile.get("player").getAsJsonObject().get("displayname").getAsString(); - if (profileName.equalsIgnoreCase(Lilase.mc.thePlayer.getName())) break; - String updated = auction.get("item_lore").getAsString().replaceAll("§[0-9a-z]", ""); - DecimalFormat df = new DecimalFormat("#.##"); - if (Lilase.configHandler.getBoolean("checkProfitPercentageBeforeBuy")) { - float multi = flipper.checkProfitPercentage(); - Utils.debugLog("Found an item, checking profit percentage"); - if (multi > Lilase.configHandler.getInt("ProfitPercentage")) { - Utils.debugLog("Higher than required profit percentage, buying now"); - buying = true; - } - } else { - Utils.debugLog("Found an item, trying to buy"); - buying = true; - } - if (buying) { - Utils.sendServerMessage("/viewauction " + uuid); - webhook.addEmbed(new DiscordWebhook.EmbedObject().setTitle("Bought an item on low price").setUrl("https://sky.coflnet.com/auction/" + uuid).setAuthor("night0721", "https://github.com/night0721", "https://avatars.githubusercontent.com/u/77528305?v=4").setDescription(updated.replace("\n", "\\n")).addField("Item", itemName, true).addField("Price", format.format(price) + " coins", true).addField("Profit", format.format(flipper.getItemPrice() - price) + " coins", true).addField("Profit Percentage", Float.parseFloat(df.format(flipper.getItemPrice() - price)) + "%", true).addField("Seller", profileName, true).addField("Started for", toDuration(System.currentTimeMillis() - auction.get("start").getAsLong()), true).addField("Ends in", getTimeSinceDate(auction.get("end").getAsLong() - System.currentTimeMillis()), true).setColor(Color.decode("#003153"))); - webhook.setContent(itemName + " is sale at " + format.format(price) + "! `" + "/viewauction " + uuid + "`"); - } - return; - } - } - } - } - - public String toDuration(long duration) { - StringBuilder res = new StringBuilder(); - for (int i = 0; i < times.size(); i++) { - Long current = times.get(i); - long temp = duration / current; - if (temp > 0) { - res.append(temp).append(" ").append(timesString.get(i)).append(temp != 1 ? "s" : "").append(" ago"); - break; - } - } - if ("".equals(res.toString())) return "0 seconds ago"; - else return res.toString(); - } - - private String getTimeSinceDate(long timeSinceDate) { - long seconds = TimeUnit.MILLISECONDS.toSeconds(timeSinceDate); - long minutes = TimeUnit.MILLISECONDS.toMinutes(timeSinceDate); - long hours = TimeUnit.MILLISECONDS.toHours(timeSinceDate); - long days = TimeUnit.MILLISECONDS.toDays(timeSinceDate); - if (seconds < 60) return "in " + seconds + " seconds"; - else if (minutes < 60) return "in " + minutes + " minutes"; - else if (hours < 24) return "in " + hours + " hours"; - else return "in " + days + " days"; - - } - - public void toggleAuction() { - if (getOpen()) { - Utils.sendMessage("Stopped AH Sniper"); - setOpen(false); - UngrabUtils.regrabMouse(); - } else { - if (Utils.checkInHub()) { - Utils.sendMessage("Started AH Sniper"); - setOpen(true); - UngrabUtils.ungrabMouse(); - } else Utils.sendMessage("Detected not in hub, please go to hub to start"); - } - } - - public Boolean getOpen() { - return open; - } - - public void setOpen(Boolean open) { - this.open = open; - } public int getAuctionsSniped() { return auctionsSniped; @@ -286,50 +31,4 @@ public class Sniper { } -enum ItemTier { - ANY, COMMON, UNCOMMON, RARE, EPIC, LEGENDARY, MYTHIC, DIVINE, SPECIAL, VERY_SPECIAL -} -enum ItemType { - ANY("any"), WEAPON("weapon"), ARMOR("armor"), ACCESSORIES("accessories"), CONSUMABLES("consumables"), BLOCKS("blocks"), MISC("misc"); - - public final String lowercase; - - public String getLowercase() { - return lowercase; - } - - ItemType(String lowercase) { - this.lowercase = lowercase; - } -} - -class Item { - public final String query; - public final ItemType type; - public final Integer price; - public final ItemTier tier; - - public Item(String query, ItemType type, Integer price, ItemTier tier) { - this.query = query; - this.type = type; - this.price = price; - this.tier = tier; - } - - public String getQuery() { - return query; - } - - public ItemType getType() { - return type; - } - - public Integer getPrice() { - return price; - } - - public ItemTier getTier() { - return tier; - } -} \ No newline at end of file diff --git a/src/main/java/me/night0721/lilase/mixins/MixinGuiIngame.java b/src/main/java/me/night0721/lilase/mixins/MixinGuiIngame.java index 1c697ab..6a7e6b6 100644 --- a/src/main/java/me/night0721/lilase/mixins/MixinGuiIngame.java +++ b/src/main/java/me/night0721/lilase/mixins/MixinGuiIngame.java @@ -26,7 +26,7 @@ public class MixinGuiIngame { if (txt.startsWith("www")) return "§4w§cw§6w§e.§2n§ai§bg§3h§1t§90§d7§42§c1§6.§em§2e"; if (txt.startsWith("SKY")) return "§d§lLILASE"; if (Pattern.compile("\\d{2}/\\d{2}/\\d{2}").matcher(txt).find()) return txt.split(" ")[0]; - if (text.startsWith(EnumChatFormatting.RED + "") && Pattern.compile("\\d+").matcher(txt).matches()) return ""; + if (text.startsWith(String.valueOf(EnumChatFormatting.RED)) && Pattern.compile("\\d+").matcher(txt).matches()) return ""; else return text; } diff --git a/src/main/java/me/night0721/lilase/utils/DiscordWebhook.java b/src/main/java/me/night0721/lilase/utils/DiscordWebhook.java index cf8bc35..6b59ebf 100644 --- a/src/main/java/me/night0721/lilase/utils/DiscordWebhook.java +++ b/src/main/java/me/night0721/lilase/utils/DiscordWebhook.java @@ -118,8 +118,14 @@ public class DiscordWebhook { jsonEmbed.put("fields", jsonFields.toArray()); embedObjects.add(jsonEmbed); } + if (embedObjects.size() > 1) { + for (int i = 1; i < embedObjects.size(); i++) { + embedObjects.remove(i); + } + } json.put("embeds", embedObjects.toArray()); } + System.out.println(json); URL url = new URL(this.url); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); connection.addRequestProperty("Content-Type", "application/json"); @@ -127,7 +133,7 @@ public class DiscordWebhook { connection.setDoOutput(true); connection.setRequestMethod("POST"); OutputStream stream = connection.getOutputStream(); - stream.write(json.toString().getBytes(StandardCharsets.UTF_16)); + stream.write(json.toString().getBytes(StandardCharsets.UTF_8)); stream.flush(); stream.close(); connection.getInputStream().close(); diff --git a/src/main/java/me/night0721/lilase/utils/KeyBindingManager.java b/src/main/java/me/night0721/lilase/utils/KeyBindingManager.java index 2837724..7cec754 100644 --- a/src/main/java/me/night0721/lilase/utils/KeyBindingManager.java +++ b/src/main/java/me/night0721/lilase/utils/KeyBindingManager.java @@ -1,7 +1,6 @@ package me.night0721.lilase.utils; import me.night0721.lilase.Lilase; -import me.night0721.lilase.config.AHConfig; import net.minecraft.client.settings.KeyBinding; import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -21,20 +20,12 @@ public class KeyBindingManager { public void onKeyPress(InputEvent.KeyInputEvent event) { if (keyBindings[0].isPressed()) { // TODO: Add sniper interface and use nested switch loop to prevent .toggleAuction(); repeating - switch (AHConfig.SNIPER_MODE) { - case 0: - Lilase.sniper.toggleAuction(); - break; - case 1: - Lilase.pageFlipper.toggleAuction(); - break; - case 2: - Lilase.cofl.toggleAuction(); - break; - } + Lilase.cofl.toggleAuction(); } - if (keyBindings[1].isPressed()) + if (keyBindings[1].isPressed()) { Lilase.config.openGui(); + ScoreboardUtils.cleanSB("§6[Auction] §aphiinix_ §ebought §fImplosion Belt §efor §6900,000 coins §lCLICK"); + } } public static void rightClick() { diff --git a/src/main/java/me/night0721/lilase/utils/Utils.java b/src/main/java/me/night0721/lilase/utils/Utils.java index 5f76c02..a462a2d 100644 --- a/src/main/java/me/night0721/lilase/utils/Utils.java +++ b/src/main/java/me/night0721/lilase/utils/Utils.java @@ -7,13 +7,17 @@ import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IChatComponent; +import java.util.List; +import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static me.night0721.lilase.Lilase.mc; public class Utils { public static IChatComponent header = null, footer = null; private static final Pattern PATTERN_HUB_LOCATIONS = Pattern.compile("(forest|village|farm|mountain|wilderness|community|graveyard|bazaar|auction)"); + private static final Pattern PATTERN_PURSE = Pattern.compile("(Purse|Piggy): (?:§.)?([0-9.,]+)"); public static EffectState cookie; public static String translateAlternateColorCodes(String text) { @@ -48,12 +52,35 @@ public class Utils { } } + public static int getPurse() { + String purse = ""; + List matches = ScoreboardUtils.getSidebarLines().stream() + .map(ScoreboardUtils::cleanSB) + .map(PATTERN_PURSE::matcher) + .filter(Matcher::find) + .map(Matcher::group) + .collect(Collectors.toList()); + String purseline = matches.get(0); + Matcher matcher = PATTERN_PURSE.matcher(purseline); + if (matcher.find()) { + System.out.println("Group: " + matcher.group()); + purse = matcher.group(2); + purse = purse.replace(",", ""); + purse = purse.replaceAll("\\..*", ""); + Utils.debugLog("Purse: " + purse); + return Integer.parseInt(purse); + } + return Integer.parseInt(purse); + + } + + public static void sendMessage(String message) { - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.LIGHT_PURPLE + "" + EnumChatFormatting.BOLD + "[Lilase] " + EnumChatFormatting.RESET + EnumChatFormatting.GREEN + EnumChatFormatting.BOLD + message)); + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.LIGHT_PURPLE + String.valueOf(EnumChatFormatting.BOLD) + "[Lilase] " + EnumChatFormatting.RESET + EnumChatFormatting.GREEN + EnumChatFormatting.BOLD + message)); } public static void debugLog(String message) { - mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.LIGHT_PURPLE + "" + "[Lilase] " + EnumChatFormatting.RESET + EnumChatFormatting.WHITE + message)); + mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.LIGHT_PURPLE + "[Lilase] " + EnumChatFormatting.RESET + EnumChatFormatting.WHITE + message)); } public static void debugLog(String... messages) {