package xyz.stachel.bonzotimer; import net.minecraft.client.Minecraft; import net.minecraft.event.ClickEvent; import net.minecraft.util.ChatComponentText; import net.minecraft.util.ChatStyle; import net.minecraft.util.EnumChatFormatting; import net.minecraftforge.client.event.ClientChatReceivedEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import org.jetbrains.annotations.NotNull; import net.minecraftforge.fml.common.gameevent.TickEvent; import java.util.HashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ChatHandler { private static final String IGN_PATTERN = "([a-zA-Z0-9_]{2,16})"; private static final String PLAYER_PATTERN = "(?:\\[(?:VIP\\+?|MVP\\+{0,2}|YOUTUBE|MOD|ADMIN)\\] )?" + IGN_PATTERN; private static final Pattern PARTY_PATTERN = Pattern.compile("Party > " + PLAYER_PATTERN + ": (.*)"); private static final Pattern TRANSFER_PATTERN = Pattern.compile("The party was transferred to " + PLAYER_PATTERN +" by " + PLAYER_PATTERN); private static final Pattern TRANSFER_LEAVE_PATTERN = Pattern.compile("The party was transferred to " + PLAYER_PATTERN + " because " + PLAYER_PATTERN + "left"); private static final Pattern PROMOTE_PATTERN = Pattern.compile(PLAYER_PATTERN + " has promoted " + PLAYER_PATTERN + " to Party Leader"); private static final Pattern LEAVE_PATTERN = Pattern.compile(PLAYER_PATTERN + " has left the party."); private static final Pattern LEAP_PATTERN = Pattern.compile("You have teleported to " + IGN_PATTERN + "!"); private int transferCountdown = 0; private boolean autotransferEnabled = false; private String oldLeader = null; private HashMap rejoiners = new HashMap<>(); public void setTransferEnabled(boolean b) { this.autotransferEnabled = b; } @SubscribeEvent public void onTick(TickEvent.@NotNull ClientTickEvent event) { if (transferCountdown > 1) { transferCountdown--; } else if (transferCountdown == 1 && Minecraft.getMinecraft().thePlayer != null && this.oldLeader != null) { transferCountdown--; Minecraft.getMinecraft().thePlayer.sendChatMessage("/p transfer " + this.oldLeader); } rejoiners.replaceAll((k, v) -> v > 0 ? (byte)(v - 1) : v); } @SubscribeEvent public void onChatReceived(@NotNull ClientChatReceivedEvent event) { if (event.type == 2) return; final String strippedMessage = event.message.getUnformattedText().replaceAll("§[0-9a-fklmnor]", "").trim(); branched: { literal: switch (strippedMessage) { case "Your Bonzo's Mask saved your life!": case "Your ⚚ Bonzo's Mask saved your life!": Timer.setInstance(new Timer((byte) 60)); Minecraft.getMinecraft().thePlayer.sendChatMessage("Bonzo's Mask popped (3s)"); break branched; case "Second Wind Activated! Your Spirit Mask saved your life!": case "Second Wind Activated! Your ⚚ Spirit Mask saved your life!": Timer.setInstance(new Timer((byte) 60)); Minecraft.getMinecraft().thePlayer.sendChatMessage("Spirit Mask popped (3s)"); break branched; case "Your Phoenix Pet saved you from certain death!": Timer.setInstance(new Timer((byte) 60)); Minecraft.getMinecraft().thePlayer.sendChatMessage("Phoenix pet popped (3s)"); break branched; default: break literal; }; if (autotransferEnabled) { final Matcher transfer = TRANSFER_PATTERN.matcher(strippedMessage); final Matcher promote = PROMOTE_PATTERN.matcher(strippedMessage); String newLeader = ""; if (transfer.matches()) { this.oldLeader = transfer.group(2); newLeader = transfer.group(1); } else if (promote.matches()) { this.oldLeader = promote.group(1); newLeader = promote.group(2); } if (!newLeader.isEmpty() && newLeader.equals(Minecraft.getMinecraft().thePlayer.getName())) { this.transferCountdown = 10; break branched; } } final Matcher partyChat = PARTY_PATTERN.matcher(strippedMessage); if (partyChat.matches()) { final String partyMessage = partyChat.group(2); final String user = partyChat.group(1); switch (partyMessage) { case "!warp": case "!w": Minecraft.getMinecraft().thePlayer.sendChatMessage("/p warp"); break branched; case "!help": Minecraft.getMinecraft().thePlayer.sendChatMessage("Commands: !warp, !m7, !f7, !ptme, !allinv, !reinv"); break branched; case "!m7": Minecraft.getMinecraft().thePlayer.sendChatMessage("/joindungeon master_catacombs_floor_seven"); break branched; case "!f7": Minecraft.getMinecraft().thePlayer.sendChatMessage("/joindungeon catacombs_floor_seven"); break branched; case "!allinvite": case "!allinv": Minecraft.getMinecraft().thePlayer.sendChatMessage("/p settings allinvite"); break branched; case "!reinv": rejoiners.put(user, (byte) 100); break branched; case "!ptme": case "!pt": event.message.appendSibling( new ChatComponentText(" [ACCEPT]") .setChatStyle(new ChatStyle() .setChatClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/p transfer " + user)) .setColor(EnumChatFormatting.RED).setBold(true)) ); break branched; case "?m7": Minecraft.getMinecraft().thePlayer.sendChatMessage("Please select the MAGE or BERSERK dungeon class and stay with the tank while trying to reach MILESTONE 3. After reaching milestone 3, please run /hub, you will be warped back later! :D"); break branched; case "?help": Minecraft.getMinecraft().thePlayer.sendChatMessage("Helper messages: ?m7"); break branched; } } final Matcher leave = LEAVE_PATTERN.matcher(strippedMessage); if (leave.matches()) { final String leaver = leave.group(1).trim(); if (rejoiners.getOrDefault(leaver, (byte) 0) != 0) { Minecraft.getMinecraft().thePlayer.sendChatMessage("/party invite " + leaver); } break branched; }; final Matcher tansLeave = TRANSFER_LEAVE_PATTERN.matcher(strippedMessage); if (transLeave.matches()) { final String leave = transfer.group(2).trim(); if (rejoiners.getOrDefault(leaver, (byte) 0) != 0) { Minecraft.getMinecraft().thePlayer.sendChatMessage("/party invite " + leaver); } break branched; }; final Matcher leap = LEAP_PATTERN.matcher(strippedMessage); if (leap.matches()) { final String target = leap.group(1).trim(); Minecraft.getMinecraft().thePlayer.sendChatMessage("Gonna touch " + target + "."); break branched; } }; }; }