aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java
diff options
context:
space:
mode:
authorJakub Kolodziej <jakvb.kolodziej@gmail.com>2023-06-19 00:52:02 +0200
committerJakub Kolodziej <jakvb.kolodziej@gmail.com>2023-06-19 01:13:07 +0200
commitb21711bf9f5fcc5b28235a44d659e3ae4b5f6e7d (patch)
treecb38275ec274272a0244b5cb3fe704c412d98fe5 /src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java
parenta84e6bab5f4205a7d2cf04fd73ec08ab16f9155d (diff)
downloadSkyblocker-b21711bf9f5fcc5b28235a44d659e3ae4b5f6e7d.tar.gz
Skyblocker-b21711bf9f5fcc5b28235a44d659e3ae4b5f6e7d.tar.bz2
Skyblocker-b21711bf9f5fcc5b28235a44d659e3ae4b5f6e7d.zip
Possibly shorter solution + tests added
Diffstat (limited to 'src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java')
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java
new file mode 100644
index 00000000..8becd757
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Reparty.java
@@ -0,0 +1,94 @@
+package me.xmrvizzy.skyblocker.skyblock.dungeon;
+
+import me.xmrvizzy.skyblocker.SkyblockerMod;
+import me.xmrvizzy.skyblocker.chat.ChatFilterResult;
+import me.xmrvizzy.skyblocker.chat.ChatPatternListener;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import me.xmrvizzy.skyblocker.utils.Utils;
+import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
+import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.network.ClientPlayerEntity;
+import net.minecraft.text.Text;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class Reparty extends ChatPatternListener {
+ private static final MinecraftClient client = MinecraftClient.getInstance();
+ private static final SkyblockerMod skyblocker = SkyblockerMod.getInstance();
+ public static final Pattern PLAYER = Pattern.compile(" ([a-zA-Z0-9_]{2,16}) ●");
+ private static final int BASE_DELAY = 10;
+
+ private String[] players;
+ private int playersSoFar;
+ private boolean repartying;
+ private String partyLeader;
+
+ public Reparty() {
+ super("^(?:You are not currently in a party\\." +
+ "|Party (?:Membe|Moderato)rs(?: \\(([0-9]+)\\)|:( .*))" +
+ "|([\\[A-z+\\]]* )?(?<disband>[A-z0-9_]*) has disbanded .*" +
+ "|.*\n([\\[A-z+\\]]* )?(?<invite>[A-z0-9_]*) has invited you to join their party!" +
+ "\nYou have 60 seconds to accept. Click here to join!\n.*)$");
+
+ this.repartying = false;
+ ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("rp").executes(context -> {
+ if (!Utils.isOnSkyblock() || this.repartying || client.player == null) return 0;
+ this.repartying = true;
+ SkyblockerMod.getInstance().messageScheduler.sendMessageAfterCooldown("/p list");
+ return 0;
+ })));
+ }
+
+ @Override
+ public ChatFilterResult state() {
+ return (SkyblockerConfig.get().general.acceptReparty || this.repartying) ? ChatFilterResult.FILTER : ChatFilterResult.PASS;
+ }
+
+ @Override
+ public boolean onMatch(Text message, Matcher matcher) {
+ if (matcher.group(1) != null && repartying) {
+ this.playersSoFar = 0;
+ this.players = new String[Integer.parseInt(matcher.group(1)) - 1];
+ } else if (matcher.group(2) != null && repartying) {
+ Matcher m = PLAYER.matcher(matcher.group(2));
+ while (m.find()) {
+ this.players[playersSoFar++] = m.group(1);
+ }
+ } else if (matcher.group("disband") != null && !matcher.group("disband").equals(client.getSession().getUsername())) {
+ partyLeader = matcher.group("disband");
+ skyblocker.scheduler.schedule(() -> partyLeader = null, 21);
+ return false;
+ } else if (matcher.group("invite") != null && matcher.group("invite").equals(partyLeader)) {
+ String command = "/party accept " + partyLeader;
+ sendCommand(command, 0);
+ return false;
+ } else {
+ this.repartying = false;
+ return false;
+ }
+ if (this.playersSoFar == this.players.length) {
+ reparty();
+ }
+ return false;
+ }
+
+ private void reparty() {
+ ClientPlayerEntity playerEntity = client.player;
+ if (playerEntity == null) {
+ this.repartying = false;
+ return;
+ }
+ sendCommand("/p disband", 1);
+ for (int i = 0; i < this.players.length; ++i) {
+ String command = "/p invite " + this.players[i];
+ sendCommand(command, i + 2);
+ }
+ skyblocker.scheduler.schedule(() -> this.repartying = false, this.players.length + 2);
+ }
+
+ private void sendCommand(String command, int delay) {
+ skyblocker.messageScheduler.queueMessage(command, delay * BASE_DELAY);
+ }
+} \ No newline at end of file