From 61e69ab35dff013e057310e141c2bacf75e3cfa4 Mon Sep 17 00:00:00 2001 From: udu3324 <47045986+udu3324@users.noreply.github.com> Date: Sun, 2 Jun 2024 10:49:17 -0500 Subject: [PATCH 1/7] Update build.yml jdk --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e2fa68a..15ae91e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ jobs: matrix: # Use these Java versions java: [ - 17, # Current Java LTS & minimum supported by Minecraft + 21, # Current Java LTS & minimum supported by Minecraft ] # and run on both Linux and Windows os: [ubuntu-22.04, windows-2022] @@ -33,7 +33,7 @@ jobs: - name: build run: ./gradlew build - name: capture build artifacts - if: ${{ runner.os == 'Linux' && matrix.java == '17' }} # Only upload artifacts built from latest java on one OS + if: ${{ runner.os == 'Linux' && matrix.java == '21' }} # Only upload artifacts built from latest java on one OS uses: actions/upload-artifact@v3 with: name: Artifacts From 4ed6267a4ce9270cfd44c16afcbbca7a42fb31b6 Mon Sep 17 00:00:00 2001 From: udu3324 <47045986+udu3324@users.noreply.github.com> Date: Tue, 4 Jun 2024 12:13:04 -0500 Subject: [PATCH 2/7] Create FUNDING.yml --- .github/FUNDING.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..e075f0b --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,14 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: udu3324 +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +polar: # Replace with a single Polar username +buy_me_a_coffee: # Replace with a single Buy Me a Coffee username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] From 2dd0de6bfc55eaa2d1fee0006ce49a7f48045577 Mon Sep 17 00:00:00 2001 From: udu3324 Date: Tue, 18 Jun 2024 19:45:33 -0500 Subject: [PATCH 3/7] Make ToggleSpecificAds more accurate --- .../com/udu3324/poinpow/api/Minecraft.java | 67 +++++++++++++++++++ .../java/com/udu3324/poinpow/api/Minehut.java | 46 +++++++++++++ .../udu3324/poinpow/utils/BlockLobbyAds.java | 7 +- .../poinpow/utils/ToggleSpecificAds.java | 44 +++++++++--- 4 files changed, 151 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/udu3324/poinpow/api/Minecraft.java diff --git a/src/main/java/com/udu3324/poinpow/api/Minecraft.java b/src/main/java/com/udu3324/poinpow/api/Minecraft.java new file mode 100644 index 0000000..5a9e96b --- /dev/null +++ b/src/main/java/com/udu3324/poinpow/api/Minecraft.java @@ -0,0 +1,67 @@ +package com.udu3324.poinpow.api; + +import com.udu3324.poinpow.Poinpow; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +public class Minecraft { + public static Map uuidOfPlayers = new HashMap<>(); + + //this gets a player's uuid from their ign + public static String getUUID(String ign) { + try { + //check if player's uuid has already been cached + if (uuidOfPlayers.containsKey(ign)) { + //Poinpow.log.info("ign {} cached with uuid {}", uuid, playerRank.get(ign)); + return uuidOfPlayers.get(ign); + } + + URL apiURL = new URL("https://api.mojang.com/users/profiles/minecraft/" + ign); + HttpURLConnection connection = (HttpURLConnection) apiURL.openConnection(); + connection.setRequestMethod("GET"); + + if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { + Poinpow.log.error("Player ({}) not found! ({})", ign, connection.getResponseCode()); + return null; + } + + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String inputLine; + StringBuilder response = new StringBuilder(); + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + + String json = response.toString().replaceAll(" ", ""); + + connection.disconnect(); + + //parse uuid + int start = json.indexOf("id\":\"") + 5; + int end = json.indexOf("\",\"", start); + + json = json.substring(start, end); + + uuidOfPlayers.put(ign, json); + + return json; + } catch (Exception e) { + Poinpow.log.error("Response to minecraft api was unsuccessful. Player ign: {} - {}", ign, e); + return null; + } + } + + public static String insertUUIDDashes(String uuid) { + StringBuilder sb = new StringBuilder(uuid); + sb.insert(8, "-"); + sb.insert(13, "-"); + sb.insert(18, "-"); + sb.insert(23, "-"); + return sb.toString(); + } +} diff --git a/src/main/java/com/udu3324/poinpow/api/Minehut.java b/src/main/java/com/udu3324/poinpow/api/Minehut.java index 92a9333..773b5ac 100644 --- a/src/main/java/com/udu3324/poinpow/api/Minehut.java +++ b/src/main/java/com/udu3324/poinpow/api/Minehut.java @@ -7,11 +7,16 @@ import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; +import java.util.HashMap; +import java.util.Map; public class Minehut { + public static Map playerRank = new HashMap<>(); + //(BuggyAl) this gets information about a server in json public static JsonObject getServer(ClientPlayerEntity player, String serverName) { try { @@ -36,4 +41,45 @@ public static JsonObject getServer(ClientPlayerEntity player, String serverName) return null; } } + + //this gets a player's mh rank through their uuid, has to have dashes in + public static String getRank(String uuid) { + try { + //check if rank of player already has been cached + if (playerRank.containsKey(uuid)) { + //Poinpow.log.info("uuid {} cached with rank {}", uuid, playerRank.get(uuid)); + return playerRank.get(uuid); + } + + URL apiURL = new URL("https://api.minehut.com/cosmetics/profile/" + uuid); + HttpURLConnection connection = (HttpURLConnection) apiURL.openConnection(); + connection.setRequestMethod("GET"); + + if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { + Poinpow.log.error("Player ({}) not found! ({})", uuid, connection.getResponseCode()); + return null; + } + + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + + String json; + json = in.readLine(); + + in.close(); + + connection.disconnect(); + + //parse rank + int start = json.indexOf("rank\":\"") + 7; + int end = json.indexOf("\",\"", start); + + String rank = json.substring(start, end); + playerRank.put(uuid, rank); + + return rank; + } catch (Exception e) { + Poinpow.log.error("Response to minehut api was unsuccessful. Player uuid: {} {}", uuid, e); + return null; + } + } } diff --git a/src/main/java/com/udu3324/poinpow/utils/BlockLobbyAds.java b/src/main/java/com/udu3324/poinpow/utils/BlockLobbyAds.java index cae9d9f..08ace90 100644 --- a/src/main/java/com/udu3324/poinpow/utils/BlockLobbyAds.java +++ b/src/main/java/com/udu3324/poinpow/utils/BlockLobbyAds.java @@ -23,11 +23,12 @@ public static Boolean check(String chat, CallbackInfo ci) { //if it's not a suspected ad, return if (!(pattern.matcher(chat).find() || chat.contains(": /join"))) return false; - //since it's an ad, check the rank if its allowed - boolean yeah = ToggleSpecificAds.checkRank(chat); + //confirmed an ad - if (yeah) return false; + //check if the rank is allowed to send it, return to allow sending + if (ToggleSpecificAds.checkRank(chat)) return false; + Poinpow.log.info("Blocked: {}", chat.replace("\n", "")); ci.cancel(); return true; diff --git a/src/main/java/com/udu3324/poinpow/utils/ToggleSpecificAds.java b/src/main/java/com/udu3324/poinpow/utils/ToggleSpecificAds.java index 88e42bb..cfb0014 100644 --- a/src/main/java/com/udu3324/poinpow/utils/ToggleSpecificAds.java +++ b/src/main/java/com/udu3324/poinpow/utils/ToggleSpecificAds.java @@ -1,6 +1,8 @@ package com.udu3324.poinpow.utils; import com.udu3324.poinpow.Config; +import com.udu3324.poinpow.api.Minecraft; +import com.udu3324.poinpow.api.Minehut; import com.udu3324.poinpow.commands.Commands; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import com.mojang.brigadier.Command; @@ -21,24 +23,46 @@ public class ToggleSpecificAds { //return true if a rank that is toggled is matched public static boolean checkRank(String chat) { - String rank = chat.substring(0, chat.indexOf(":")); - - //return true if none are activated + //return if none are activated if (!(defaultRank || vip || vipPlus || pro || legend || patron)) return false; - //check for if the rank portion contains it - if (rank.contains("[VIP]") && vip) { + //get ign from chat, then the uuid, then get their rank + String ign = chat.substring(0, chat.indexOf(":")); + ign = ign.substring(ign.lastIndexOf(" ") + 1); + + String uuid = Minecraft.getUUID(ign); + + //wi-fi errors, fake username, etc. + if (uuid == null) { + return false; + } + + //reformat the uuid because minehut is stupid + uuid = Minecraft.insertUUIDDashes(uuid); + + //use mh api to get their rank instead of parsing untrusted chat + String rank = Minehut.getRank(uuid); + + //wi-fi errors, etc. no clue why this scenario would ever happen + if (rank == null) { + return false; + } + + System.out.println("rank: " + rank); + + //check if their rank is toggled or not + if (rank.equals("VIP") && vip) { return true; - } else if (rank.contains("[VIP+]") && vipPlus) { + } else if (rank.equals("VIP_PLUS") && vipPlus) { return true; - } else if (rank.contains("[PRO]") && pro) { + } else if (rank.equals("PRO") && pro) { return true; - } else if (rank.contains("[LEGEND]") && legend) { + } else if (rank.equals("LEGEND") && legend) { return true; - } else if (rank.contains("[PATRON]") && patron) { + } else if (rank.equals("PATRON") && patron) { return true; - } else return !(rank.contains("VIP") || rank.contains("PRO") || rank.contains("LEGEND") || rank.contains("PATRON")) && defaultRank; + } else return rank.equals("DEFAULT") && defaultRank; } public static int toggle(FabricClientCommandSource source, String rank) { From 2510cc58459c37cc1572d85da896a9657ccf5e1d Mon Sep 17 00:00:00 2001 From: udu3324 Date: Thu, 20 Jun 2024 17:01:27 -0500 Subject: [PATCH 4/7] Add MuteLobbyChat and improve ToggleSpecificAds --- src/main/java/com/udu3324/poinpow/Config.java | 3 + .../java/com/udu3324/poinpow/api/Minehut.java | 23 ++++- .../udu3324/poinpow/commands/Commands.java | 8 ++ .../com/udu3324/poinpow/mixin/ChatMixin.java | 19 +++- .../poinpow/mixin/WorldLoadedMixin.java | 4 + .../poinpow/utils/BlockLobbyMapAds.java | 17 +--- .../udu3324/poinpow/utils/MuteLobbyChat.java | 83 ++++++++++++++++++ .../udu3324/poinpow/utils/ServerLookup.java | 5 ++ .../poinpow/utils/ToggleSpecificAds.java | 24 ++++- src/main/resources/assets/poinpow/image.jpg | Bin 0 -> 67337 bytes 10 files changed, 167 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/udu3324/poinpow/utils/MuteLobbyChat.java create mode 100644 src/main/resources/assets/poinpow/image.jpg diff --git a/src/main/java/com/udu3324/poinpow/Config.java b/src/main/java/com/udu3324/poinpow/Config.java index 656765a..4fcd274 100644 --- a/src/main/java/com/udu3324/poinpow/Config.java +++ b/src/main/java/com/udu3324/poinpow/Config.java @@ -239,6 +239,8 @@ public static void create() { BlockRaids.toggled.set(Boolean.parseBoolean(getValueFromConfig(HubCommandBack.name))); BlockChestAds.toggled.set(Boolean.parseBoolean(getValueFromConfig(BlockChestAds.name))); + MuteLobbyChat.toggled = Boolean.parseBoolean(getValueFromConfig(MuteLobbyChat.name)); + defaultRank = Boolean.parseBoolean(getValueFromConfig(name + "_default")); vip = Boolean.parseBoolean(getValueFromConfig(name + "_vip")); vipPlus = Boolean.parseBoolean(getValueFromConfig(name + "_vipPlus")); @@ -268,6 +270,7 @@ private static void writeDefaultConfig() throws IOException { w.write(HubCommandBack.name + ": true" + System.lineSeparator()); w.write(BlockRaids.name + ": true" + System.lineSeparator()); w.write(BlockChestAds.name + ": true" + System.lineSeparator()); + w.write(MuteLobbyChat.name + ": false" + System.lineSeparator()); w.write(name + "_default: false" + System.lineSeparator()); w.write(name + "_vip: false" + System.lineSeparator()); diff --git a/src/main/java/com/udu3324/poinpow/api/Minehut.java b/src/main/java/com/udu3324/poinpow/api/Minehut.java index 773b5ac..e481e8f 100644 --- a/src/main/java/com/udu3324/poinpow/api/Minehut.java +++ b/src/main/java/com/udu3324/poinpow/api/Minehut.java @@ -3,7 +3,10 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.udu3324.poinpow.Poinpow; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.scoreboard.Scoreboard; +import net.minecraft.scoreboard.ScoreboardObjective; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -11,12 +14,26 @@ import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; +import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class Minehut { public static Map playerRank = new HashMap<>(); + public static Boolean inLobby() { + if (MinecraftClient.getInstance().player == null) return null; + + // check for scoreboard + Scoreboard scoreboard = MinecraftClient.getInstance().player.getScoreboard(); + ArrayList scores = new ArrayList<>(); + for (ScoreboardObjective objective : scoreboard.getObjectives()) { + scores.add(objective.getDisplayName().toString()); + } + + return scores.toString().toLowerCase().contains("minehut"); + } + //(BuggyAl) this gets information about a server in json public static JsonObject getServer(ClientPlayerEntity player, String serverName) { try { @@ -24,10 +41,14 @@ public static JsonObject getServer(ClientPlayerEntity player, String serverName) HttpURLConnection connection = (HttpURLConnection) apiURL.openConnection(); connection.setRequestMethod("GET"); - if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { + if (connection.getResponseCode() == 500) { player.sendMessage(Text.literal("Server not found! (" + connection.getResponseCode() + ")").styled(style -> style .withColor(Formatting.RED))); return null; + } else if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { // bruh + player.sendMessage(Text.literal("Server not found! API may be down. (" + connection.getResponseCode() + ")").styled(style -> style + .withColor(Formatting.RED))); + return null; } JsonObject obj = JsonParser.parseReader(new InputStreamReader(connection.getInputStream())).getAsJsonObject().get("server").getAsJsonObject(); diff --git a/src/main/java/com/udu3324/poinpow/commands/Commands.java b/src/main/java/com/udu3324/poinpow/commands/Commands.java index 0dc9f6d..3dbd061 100644 --- a/src/main/java/com/udu3324/poinpow/commands/Commands.java +++ b/src/main/java/com/udu3324/poinpow/commands/Commands.java @@ -23,6 +23,7 @@ public class Commands { //register poinpow commands in the mc brigadier public static void register(CommandDispatcher dispatcher) { ServerLookup.registerCommand(dispatcher); + MuteLobbyChat.registerCommand(dispatcher); dispatcher.register(literal("poinpow") .executes(ctx -> help(ctx.getSource())) @@ -193,6 +194,13 @@ private static int help(FabricClientCommandSource source) { .withColor(Formatting.DARK_GRAY) )); + //toggle lobby chat + source.sendFeedback(Text.literal("[" + MuteLobbyChat.toggled + "] " + MuteLobbyChat.name).styled(style -> style + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.literal(MuteLobbyChat.description + "\n\nClick to Toggle"))) + .withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/" + MuteLobbyChat.name)) + .withColor(Formatting.DARK_GRAY) + )); + //chat phrase filter source.sendFeedback(Text.literal("/poinpow " + ChatPhraseFilter.name + " ").styled(style -> style .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.literal(ChatPhraseFilter.description + "\n\nClick to change"))) diff --git a/src/main/java/com/udu3324/poinpow/mixin/ChatMixin.java b/src/main/java/com/udu3324/poinpow/mixin/ChatMixin.java index 4a9f05e..a9f5e13 100644 --- a/src/main/java/com/udu3324/poinpow/mixin/ChatMixin.java +++ b/src/main/java/com/udu3324/poinpow/mixin/ChatMixin.java @@ -1,7 +1,9 @@ package com.udu3324.poinpow.mixin; +import com.udu3324.poinpow.api.Minehut; import com.udu3324.poinpow.commands.Commands; import com.udu3324.poinpow.utils.*; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.hud.ChatHud; import net.minecraft.client.gui.hud.MessageIndicator; import net.minecraft.network.message.MessageSignatureData; @@ -13,13 +15,23 @@ @Mixin(ChatHud.class) public class ChatMixin { - @Inject(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;Lnet/minecraft/client/gui/hud/MessageIndicator;)V", at = @At("HEAD"), cancellable = true) + @Inject(method = "Lnet/minecraft/client/gui/hud/ChatHud;addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;Lnet/minecraft/client/gui/hud/MessageIndicator;)V", at = @At("HEAD"), cancellable = true) private void onMessage(Text message, MessageSignatureData signature, MessageIndicator indicator, CallbackInfo ci) { String chat = message.getString(); //don't allow blockers to run while help command is running if (Commands.running) return; + //if lobby chat is toggled, don't run checks + if (MuteLobbyChat.toggled) { + // if they're in lobby & the message isn't allowed, cancel. + Boolean inLobby = Minehut.inLobby(); + if (inLobby != null && inLobby && !MuteLobbyChat.isAllowed(chat)) { + ci.cancel(); + return; + } + } + if (BlockLobbyWelcome.check(chat, ci)) return; if (BlockLobbyAds.check(chat, ci)) return; @@ -32,4 +44,9 @@ private void onMessage(Text message, MessageSignatureData signature, MessageIndi ChatPhraseFilter.check(chat, ci); } + + @Inject(method = "Lnet/minecraft/client/gui/hud/ChatHud;render(Lnet/minecraft/client/gui/DrawContext;IIIZ)V", at = @At("RETURN"), cancellable = true) + private void onRender(DrawContext context, int currentTick, int mouseX, int mouseY, boolean focused, CallbackInfo ci) { + MuteLobbyChat.check(); + } } diff --git a/src/main/java/com/udu3324/poinpow/mixin/WorldLoadedMixin.java b/src/main/java/com/udu3324/poinpow/mixin/WorldLoadedMixin.java index eea1532..a3f3f1c 100644 --- a/src/main/java/com/udu3324/poinpow/mixin/WorldLoadedMixin.java +++ b/src/main/java/com/udu3324/poinpow/mixin/WorldLoadedMixin.java @@ -3,6 +3,7 @@ import com.udu3324.poinpow.Poinpow; import com.udu3324.poinpow.api.GitHubVersion; import com.udu3324.poinpow.utils.AutoSkipBarrier; +import com.udu3324.poinpow.utils.MuteLobbyChat; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.minecraft.client.MinecraftClient; @@ -28,5 +29,8 @@ private static void onLoad(ClientPlayConnectionEvents.Join[] callbacks, ClientPl if (Poinpow.onMinehut) GitHubVersion.check(); AutoSkipBarrier.check(); + + //allow to send a check only once cause chat gets rendered per tick + MuteLobbyChat.canSendCheck = true; } } diff --git a/src/main/java/com/udu3324/poinpow/utils/BlockLobbyMapAds.java b/src/main/java/com/udu3324/poinpow/utils/BlockLobbyMapAds.java index 317876e..3f80281 100644 --- a/src/main/java/com/udu3324/poinpow/utils/BlockLobbyMapAds.java +++ b/src/main/java/com/udu3324/poinpow/utils/BlockLobbyMapAds.java @@ -1,19 +1,16 @@ package com.udu3324.poinpow.utils; import com.udu3324.poinpow.Poinpow; -import net.minecraft.client.MinecraftClient; +import com.udu3324.poinpow.api.Minehut; import net.minecraft.client.gui.hud.ClientBossBar; import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.Entity; import net.minecraft.entity.decoration.ItemFrameEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; -import net.minecraft.scoreboard.Scoreboard; -import net.minecraft.scoreboard.ScoreboardObjective; import net.minecraft.text.Text; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.ArrayList; import java.util.Map; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; @@ -31,16 +28,8 @@ public static void block(Entity entity) { // return if not on minehut if (!Poinpow.onMinehut) return; - if (MinecraftClient.getInstance().player == null) return; - - // check for scoreboard - Scoreboard scoreboard = MinecraftClient.getInstance().player.getScoreboard(); - ArrayList scores = new ArrayList<>(); - for (ScoreboardObjective objective : scoreboard.getObjectives()) { - scores.add(objective.getDisplayName().toString()); - } - - if (!scores.toString().toLowerCase().contains("minehut")) return; + Boolean inLobby = Minehut.inLobby(); + if (inLobby == null || !inLobby) return; // remove if item frame has a map in it ItemFrameEntity itemFrame = (ItemFrameEntity) entity; diff --git a/src/main/java/com/udu3324/poinpow/utils/MuteLobbyChat.java b/src/main/java/com/udu3324/poinpow/utils/MuteLobbyChat.java new file mode 100644 index 0000000..a33435b --- /dev/null +++ b/src/main/java/com/udu3324/poinpow/utils/MuteLobbyChat.java @@ -0,0 +1,83 @@ +package com.udu3324.poinpow.utils; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; +import com.udu3324.poinpow.Config; +import com.udu3324.poinpow.api.Minehut; +import com.udu3324.poinpow.commands.Commands; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.ClickEvent; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +public class MuteLobbyChat { + public static String name = "muteLobbyChat"; + public static String description = "This mutes the lobby chat if you don't want to see it."; + + public static boolean toggled = false; + public static boolean canSendCheck = false; + + public static void registerCommand(CommandDispatcher dispatcher) { + dispatcher.register(ClientCommandManager.literal(name).executes(ctx -> toggle(ctx.getSource()))); + } + + private static int toggle(FabricClientCommandSource source) { + Commands.running = true; + + //don't allow check as they already know + canSendCheck = false; + + if (toggled) { + source.sendFeedback(Text.literal("Lobby chat has been unmuted.").styled(style -> style + .withColor(Formatting.RED))); + + toggled = false; + } else { + source.sendFeedback(Text.literal("Lobby chat has been muted.").styled(style -> style + .withColor(Formatting.GREEN))); + + toggled = true; + } + + Config.setValueFromConfig(name, String.valueOf(toggled)); + + Commands.running = false; + return Command.SINGLE_SUCCESS; + } + + public static boolean isAllowed(String chat) { + if (MinecraftClient.getInstance().player == null || MinecraftClient.getInstance().player.getName().getLiteralString() == null) return false; + + //it is a /msg from someone + if (chat.startsWith("To") || chat.startsWith("From")) { + //it is a /msg from someone + return true; + } else if (!chat.contains(":")) { + //misc message should be allowed + return true; + } else if (chat.toLowerCase().contains(MinecraftClient.getInstance().player.getName().getLiteralString().toLowerCase())) { + //messages with the player's ign + return true; + } else { + return false; + } + } + + //this is run when joining back into the lobby while it is muted. + public static void check() { + if (!canSendCheck) return; + + if (!toggled) return; + + Boolean inLobby = Minehut.inLobby(); + if (inLobby != null && inLobby) { + MinecraftClient.getInstance().inGameHud.getChatHud().addMessage(Text.literal("Lobby is currently muted by you. (click)").styled(style -> style + .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/" + MuteLobbyChat.name)) + .withColor(Formatting.DARK_GRAY))); + } + + canSendCheck = false; + } +} diff --git a/src/main/java/com/udu3324/poinpow/utils/ServerLookup.java b/src/main/java/com/udu3324/poinpow/utils/ServerLookup.java index 59594f4..c8a8629 100644 --- a/src/main/java/com/udu3324/poinpow/utils/ServerLookup.java +++ b/src/main/java/com/udu3324/poinpow/utils/ServerLookup.java @@ -8,6 +8,7 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.udu3324.poinpow.Poinpow; import com.udu3324.poinpow.api.Minehut; +import com.udu3324.poinpow.commands.Commands; import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.client.MinecraftClient; @@ -56,6 +57,8 @@ private static int lookup(String serverName) { status = Formatting.GREEN + "Online"; } + Commands.running = true; + player.sendMessage(Text.literal("")); player.sendMessage(Text.literal(serverName + " is ").styled(style -> style .withColor(Formatting.GOLD)) @@ -104,6 +107,8 @@ private static int lookup(String serverName) { } player.sendMessage(Text.literal("")); + + Commands.running = false; }).start(); return Command.SINGLE_SUCCESS; diff --git a/src/main/java/com/udu3324/poinpow/utils/ToggleSpecificAds.java b/src/main/java/com/udu3324/poinpow/utils/ToggleSpecificAds.java index cfb0014..53bbc03 100644 --- a/src/main/java/com/udu3324/poinpow/utils/ToggleSpecificAds.java +++ b/src/main/java/com/udu3324/poinpow/utils/ToggleSpecificAds.java @@ -44,12 +44,12 @@ public static boolean checkRank(String chat) { //use mh api to get their rank instead of parsing untrusted chat String rank = Minehut.getRank(uuid); - //wi-fi errors, etc. no clue why this scenario would ever happen + //wi-fi errors, etc. no clue why this scenario would ever happen... :) if (rank == null) { - return false; + return fallback(chat); } - System.out.println("rank: " + rank); + //System.out.println("rank: " + rank); //check if their rank is toggled or not if (rank.equals("VIP") && vip) { @@ -65,6 +65,24 @@ public static boolean checkRank(String chat) { } else return rank.equals("DEFAULT") && defaultRank; } + // fallback in case if mh api does not work (minehut sucks, and their staff are probably underpaid to do stuff) + private static boolean fallback(String chat) { + String rank = chat.substring(0, chat.indexOf(":")); + + //check if the rank portion in chat contains it + if (rank.contains("[VIP]") && vip) { + return true; + } else if (rank.contains("[VIP+]") && vipPlus) { + return true; + } else if (rank.contains("[PRO]") && pro) { + return true; + } else if (rank.contains("[LEGEND]") && legend) { + return true; + } else if (rank.contains("[PATRON]") && patron) { + return true; + } else return !(rank.contains("[PATRON]") || rank.contains("[LEGEND]") || rank.contains("[PRO]") || rank.contains("[VIP+]") || rank.contains("[VIP]")) && defaultRank; + } + public static int toggle(FabricClientCommandSource source, String rank) { Commands.running = true; diff --git a/src/main/resources/assets/poinpow/image.jpg b/src/main/resources/assets/poinpow/image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9a9efbdfa4ff0a30f079bbbe69d76f9db9976dc3 GIT binary patch literal 67337 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 avl6_H#sBgZ{)Z%t|3CbH;F0{Z^q&9=R!N)y literal 0 HcmV?d00001 From 2afa97daae23baaed4eec77e83d407c77eab59c7 Mon Sep 17 00:00:00 2001 From: udu3324 Date: Thu, 20 Jun 2024 17:38:12 -0500 Subject: [PATCH 5/7] Update readme --- README.md | 62 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index bb28726..dd20677 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,44 @@ ![Mod Banner](https://github.com/udu3324/Poinpow/blob/master/src/main/resources/assets/poinpow/banner.png?raw=true) -![License](https://img.shields.io/github/license/udu3324/poinpow) -![Latest Releases](https://img.shields.io/github/v/release/udu3324/Poinpow) -![Github Downloads](https://img.shields.io/github/downloads/udu3324/poinpow/total) -![Modrinth Downloads](https://img.shields.io/badge/dynamic/json?color=1bd96a&label=modrinth&query=downloads&suffix=%20downloads&url=https%3A%2F%2Fapi.modrinth.com%2Fv2%2Fproject%2Fpoinpow) -![Mod loader: Fabric](https://img.shields.io/badge/modloader-Fabric-decea6?style=round) -![Requires](https://img.shields.io/badge/requires-Fabric%20API-dece5a?style=round) +![License](https://img.shields.io/github/license/udu3324/poinpow) +![Latest Releases](https://img.shields.io/github/v/release/udu3324/Poinpow) +![Github Downloads](https://img.shields.io/github/downloads/udu3324/poinpow/total) +![Modrinth Downloads](https://img.shields.io/badge/dynamic/json?color=1bd96a&label=modrinth&query=downloads&suffix=%20downloads&url=https%3A%2F%2Fapi.modrinth.com%2Fv2%2Fproject%2Fpoinpow) +![Mod loader: Fabric](https://img.shields.io/badge/modloader-Fabric-decea6?style=round) +![Requires](https://img.shields.io/badge/requires-Fabric%20API-dece5a?style=round) [![Discord Server](https://img.shields.io/badge/Official%20Discord%20Server-7289DA?style=round&logo=discord&logoColor=white)](https://discord.gg/NXm9tJvyBT) # ๐Ÿ“˜ Features -Poinpow adds **utilities/features** that **make the player experience 102% better**. If you catch a bug, create an issue in the repo or send it to me in this [discord server](https://discord.gg/NXm9tJvyBT). - -- **AutoSkipBarrier** - Automatically skip the ads when joining minehut or free servers. -- **HubCommandBack** - Adds back the hub command. -- **BlockMinehutAds** - Blocks ads from minehut that are sent in free servers `Example: [Minehut] boost your server speed!!!` -- **ChatPhraseFilter** - Filters and blocks messages in chat based on a regex list. -- **BlockLobbyAds** - Blocks player made ads in the lobby. `Example: [Ad] NintendoOS: /join fishwind join my server for op yes` -- **BlockFreeCredits** - Blocks the vote messages encouraging to vote for free credits. -- **BlockLobbyWelcome** - Blocks the lobby join message that sometimes has an ad in it. -- **BlockLobbyMapAds** - Removes the humungous map art that advertises things in lobby. -- **BlockRaids** - Blocks the raid messages in hub. -- **ToggleSpecificAds** - Extends BlockLobbyAds to toggle which ranks can advertise. -- **BlockChestAds** - Removes the ads inside the compass server listing in hub. -- **ServerLookup** - A command to see details about a minehut server. (by [BuggyAl](https://github.com/BuggyAl)) - -![](https://cdn.modrinth.com/data/zmUzIoT1/images/aaa8cda2723de8979014cde22db46d34c8160553.png) -Skipping ads **automatically** with AutoSkipBarrier **(extremely fast)** - -![](https://cdn.modrinth.com/data/zmUzIoT1/images/c49843c5f4e7412df0c53670e94f3434eb4c4238.png) +Poinpow is a Minecraft mod that adds **amazing features** that **makes the player experience 103% better**. (QoL) Features that Minehut locks behind a paywall (ex: removing ads, muting chat, etc.) are in Poinpow. + +| Features | Command | +|:------------------|:-------------------------------------------------------------------------------------------------------| +| AutoSkipBarrier | Automatically skips the transition ads when joining minehut/free servers. | +| BlockLobbyAds | Blocks player made ads in the lobby. | +| ToggleSpecificAds | Extends the functionality of BlockLobbyAds to block certain ads based on ranks. | +| ChatPhraseFilter | Filters and blocks messages in chat based on a regex list. | +| ServerLookup | A command to see details about a minehut server. Contributed by [BuggyAl](https://github.com/BuggyAl). | +| MuteLobbyChat | A command that mutes Minehut's lobby, only allowing `/msg`, joins, and some other stuff. | +| HubCommandBack | Adds back the `/hub` command. It redirects the command `/hub` to `/mh` when necessary. | +| BlockChestAds | Removes the ads inside the compass server listing in hub. | +| BlockLobbyMapAds | Removes the humungous map art that advertises things in lobby. | +| BlockLobbyWelcome | Blocks the lobby join message that sometimes has an ad in it. | +| BlockRaids | Blocks the raid messages in hub. | +| BlockFreeCredits | Blocks the vote messages encouraging to vote for free credits. | +| BlockMinehutAds | Blocks ads from Minehut that are sent in free servers. | + + +![screenshot of me using AutoSkipBarrier](https://cdn.modrinth.com/data/zmUzIoT1/images/aaa8cda2723de8979014cde22db46d34c8160553.png) +Skipping ads **automatically** with AutoSkipBarrier **(extremely fast)** +![screenshot of me using BlockLobbyAds and BlockLobbyMapAds](https://cdn.modrinth.com/data/zmUzIoT1/images/c49843c5f4e7412df0c53670e94f3434eb4c4238.png) Example of **BlockLobbyAds** (blocks ads made by player) and **BlockLobbyMapAds**. It clears up chat a lot and blocks those awful map ads. -![](https://cdn.modrinth.com/data/zmUzIoT1/images/75745e7d81968d0ad369493ab3174f0d2a605517.png) -/poinpow - An **intractable/clickable** help command that easily allows the toggling of features. -## ๐Ÿ’พ How to Install +![commands of poinpow](https://cdn.modrinth.com/data/zmUzIoT1/images/75745e7d81968d0ad369493ab3174f0d2a605517.png) +/poinpow - An **intractable/clickable** help command that easily allows the toggling of features. (image may be outdated) + +## ๐Ÿ’พ How to Install the Mod 1. Make sure you have **[Fabric](https://fabricmc.net/use/installer/)** installed in your mc launcher 2. Download the latest release of **Poinpow** [here](https://github.com/udu3324/poinpow/releases) 3. Download the latest release of **Fabric API** [here](https://modrinth.com/mod/fabric-api/versions) @@ -50,7 +54,7 @@ If you want to **contribute to the code** or **make the jar yourself**, you can 3. Open a terminal and cd to the folder 4. Run `gradlew build` or `.\gradlew build` depending on your system os 5. Done! The jar should be in `/build/libs` -6. (optional) Open up the folder in your IDE (intellij recommended) to look at the code and contribute to it if you want :> +6. (optional) Open up the folder in your IDE (intellij recommended) to look at the code and contribute to it if you want to. Run `.\gradlew runClient` to run the mod directly in your IDE. ## ๐Ÿงพ Is it Against the Rules? **No.** I read the rules, and it doesn't break any. Unless..... "Minehut reserves the right to suspend or refuse service for users and servers at any time at their discretion." bruh From acd7b4379c312cad3ef2b1d462f96db1ae184331 Mon Sep 17 00:00:00 2001 From: udu3324 Date: Thu, 20 Jun 2024 18:01:30 -0500 Subject: [PATCH 6/7] Update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dd20677..bb58ebe 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ [![Discord Server](https://img.shields.io/badge/Official%20Discord%20Server-7289DA?style=round&logo=discord&logoColor=white)](https://discord.gg/NXm9tJvyBT) # ๐Ÿ“˜ Features -Poinpow is a Minecraft mod that adds **amazing features** that **makes the player experience 103% better**. (QoL) Features that Minehut locks behind a paywall (ex: removing ads, muting chat, etc.) are in Poinpow. +Poinpow is a fabric mod that adds **amazing features** and **makes the player experience 103% better**. (QoL) Features that Minehut locks behind a paywall (ex: removing ads, muting chat, etc.) are in Poinpow. | Features | Command | |:------------------|:-------------------------------------------------------------------------------------------------------| From 8ac26015f7c90a0bce6a38143c2562425394f16a Mon Sep 17 00:00:00 2001 From: udu3324 Date: Thu, 20 Jun 2024 19:32:11 -0500 Subject: [PATCH 7/7] update version number --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 7c311a1..ac7848e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ org.gradle.parallel=true loader_version=0.15.11 # Mod Properties - mod_version = 1.7 + mod_version = 1.7.1 maven_group = com.udu3324 archives_base_name = poinpow