aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/kr/syeyoung/dungeonsguide/party/PartyManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/kr/syeyoung/dungeonsguide/party/PartyManager.java')
-rw-r--r--src/main/java/kr/syeyoung/dungeonsguide/party/PartyManager.java219
1 files changed, 219 insertions, 0 deletions
diff --git a/src/main/java/kr/syeyoung/dungeonsguide/party/PartyManager.java b/src/main/java/kr/syeyoung/dungeonsguide/party/PartyManager.java
new file mode 100644
index 00000000..08492ae8
--- /dev/null
+++ b/src/main/java/kr/syeyoung/dungeonsguide/party/PartyManager.java
@@ -0,0 +1,219 @@
+package kr.syeyoung.dungeonsguide.party;
+
+import kr.syeyoung.dungeonsguide.RichPresenceManager;
+import kr.syeyoung.dungeonsguide.commands.CommandReparty;
+import kr.syeyoung.dungeonsguide.e;
+import kr.syeyoung.dungeonsguide.events.SkyblockJoinedEvent;
+import kr.syeyoung.dungeonsguide.events.StompConnectedEvent;
+import kr.syeyoung.dungeonsguide.stomp.StompInterface;
+import kr.syeyoung.dungeonsguide.stomp.StompMessageHandler;
+import kr.syeyoung.dungeonsguide.stomp.StompPayload;
+import kr.syeyoung.dungeonsguide.stomp.StompSubscription;
+import kr.syeyoung.dungeonsguide.utils.TextUtils;
+import lombok.Getter;
+import net.minecraft.client.Minecraft;
+import net.minecraftforge.client.event.ClientChatReceivedEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import scala.util.parsing.json.JSON;
+
+import java.security.SecureRandom;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+public class PartyManager implements StompMessageHandler {
+ public static final PartyManager INSTANCE = new PartyManager();
+
+ @Getter
+ private String partyID = null;
+ @Getter
+ private String askToJoinSecret = null;
+
+ private SecureRandom random = new SecureRandom();
+ private static final String validChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";
+
+ @Getter
+ private boolean allowAskToJoin = false;
+ @Getter
+ private boolean canInvite = false;
+
+ public void toggleAllowAskToJoin() {
+ if (canInvite) allowAskToJoin = !allowAskToJoin;
+ if (allowAskToJoin) {
+ generateNewAskToJoinSecret();
+ }
+ }
+
+ public void setPartyID(String partyID) {
+ if (this.partyID != null && partyID == null) {
+ JSONObject object = new JSONObject();
+ object.put("members", new JSONArray());
+ StompInterface stompInterface = e.getDungeonsGuide().getStompConnection();
+ stompInterface.send(new StompPayload().payload(object.toString()).header("destination", "/app/party.join"));
+ }
+ this.partyID = partyID;
+ this.askToJoinSecret = null;
+
+ if (partyID != null && !partyID.equals(this.partyID)) {
+ Minecraft.getMinecraft().thePlayer.sendChatMessage("/p invite -");
+ } else {
+ canInvite = true;
+ allowAskToJoin = false;
+ }
+
+ if (allowAskToJoin) {
+ generateNewAskToJoinSecret();
+ } else {
+ RichPresenceManager.INSTANCE.updatePresence();
+ }
+ }
+
+ public void generateNewAskToJoinSecret() {
+ if (partyID == null) {
+ JSONObject object = new JSONObject();
+ object.put("members", new JSONArray());
+ StompInterface stompInterface = e.getDungeonsGuide().getStompConnection();
+ stompInterface.send(new StompPayload().payload(object.toString()).header("destination", "/app/party.join"));
+ }
+
+ StringBuilder secretBuilder = new StringBuilder();
+ for (int i = 0; i < 20; i++) {
+ secretBuilder.append(validChars.charAt(random.nextInt(validChars.length())));
+ }
+ this.askToJoinSecret = secretBuilder.toString();
+
+ StompInterface stompInterface = e.getDungeonsGuide().getStompConnection();
+ stompInterface.send(new StompPayload().payload(new JSONObject().put("secret", askToJoinSecret).toString()).header("destination", "/app/party.setjoinsecret"));
+ RichPresenceManager.INSTANCE.updatePresence();
+ }
+
+ private boolean partyJoin = false;
+ private Set<String> members = new HashSet<>();
+ private Map<String, Long> recentlyJoined = new HashMap<>();
+ @SubscribeEvent
+ public void onMessage(ClientChatReceivedEvent chatReceivedEvent) {
+ if (chatReceivedEvent.type == 2) return;
+
+ String str = chatReceivedEvent.message.getFormattedText();
+
+ if (str.startsWith("§eYou have joined ")) {
+ setPartyID(null);
+ members.clear();
+ String strs[] = TextUtils.stripColor(str).split(" ");
+ for (String s : strs) {
+ if (s.endsWith("'s")) {
+ members.add(s.substring(0, s.indexOf("'s")));
+ partyJoin = true;
+ break;
+ }
+ }
+ } else if (str.startsWith("§eYou'll be partying with: ")) {
+ String[] players = TextUtils.stripColor(str.substring(27)).split(" ");
+ for (String player : players) {
+ if (player.startsWith("[")) continue;
+ members.add(player);
+ }
+ } else if (str.equals("§9§m-----------------------------§r")) {
+ if (partyJoin) {
+ partyJoin = false;
+ // REQ PARTY JOIN
+
+ JSONArray jsonArray = new JSONArray();
+ for (String member : members) {
+ jsonArray.put(member);
+ }
+ JSONObject object = new JSONObject();
+ object.put("members", jsonArray);
+ StompInterface stompInterface = e.getDungeonsGuide().getStompConnection();
+ stompInterface.send(new StompPayload().payload(object.toString()).header("destination", "/app/party.join"));
+ }
+ } else if (str.endsWith("§ejoined the party.§r")) {
+ String asd = null;
+ for (String s : TextUtils.stripColor(str).split(" ")) {
+ if (s.startsWith("[")) continue;
+ asd = s;
+ }
+ if (asd != null)
+ recentlyJoined.put(asd, System.currentTimeMillis());
+ } else if ((str.equals("§eYou left the party.§r")
+ || str.equals("§cThe party was disbanded because all invites expired and the party was empty§r"))
+ ){
+ setPartyID(null);
+ } else if (str.startsWith("§6Party Members ")) {
+ partyJoin = true;
+ members.clear();
+ } else if (str.startsWith("§cYou are not currently in a party.§r")) {
+ members.clear();
+ setPartyID(null);
+ } else if (str.startsWith("§eParty ") && str.contains(":")) {
+ String playerNames = TextUtils.stripColor(str.split(":")[1]);
+ for (String s : playerNames.split(" ")) {
+ if (s.isEmpty()) continue;
+ if (s.equals("●")) continue;
+ if (s.startsWith("[")) continue;
+ members.add(s);
+ }
+ } else if (str.equals("§cYou are not allowed to invite players.§r")) {
+ canInvite = false;
+ allowAskToJoin = false;
+ askToJoinSecret = "";
+ RichPresenceManager.INSTANCE.updatePresence();
+ } else if (str.equals("§cCouldn't find a player with that name!§r")) {
+ canInvite = true;
+ } else if (str.endsWith("§aenabled All Invite§r")) {
+ canInvite = true;
+ } else if (str.endsWith("§cdisabled All Invite§r")) {
+ canInvite = false;
+ allowAskToJoin = false;
+ askToJoinSecret = "";
+ RichPresenceManager.INSTANCE.updatePresence();
+ Minecraft.getMinecraft().thePlayer.sendChatMessage("/p invite -");
+ }
+ }
+
+ @SubscribeEvent
+ public void onSBJoin(SkyblockJoinedEvent skyblockJoinedEvent) {
+ Minecraft.getMinecraft().thePlayer.sendChatMessage("/pl");
+ }
+
+ @Override
+ public void handle(StompInterface stompInterface, StompPayload stompPayload) {
+ JSONObject object = new JSONObject(stompPayload.payload());
+ if ("/queue/party.check".equals(stompPayload.headers().get("destination"))) {
+ String playerName = object.getString("player");
+ String token = object.getString("token");
+ Long loong = recentlyJoined.get(playerName);
+ if (loong == null) {
+ stompInterface.send(new StompPayload().payload(new JSONObject().put("status", "failure").put("token", token).toString()).header("destination", "/app/party.check.resp"));
+ } else if (loong > System.currentTimeMillis() - 2000){
+ stompInterface.send(new StompPayload().payload(new JSONObject().put("status", "success").put("token", token).toString()).header("destination", "/app/party.check.resp"));
+ }
+ } else if ("/queue/party.join".equals(stompPayload.headers().get("destination"))) {
+ String playerName = object.getString("player");
+ String secret = object.getString("secret");
+ if (secret.equals(askToJoinSecret) && partyID != null) {
+ Minecraft.getMinecraft().thePlayer.sendChatMessage("/p invite "+playerName);
+ }
+ } else {
+ String str = object.getString("status");
+ if ("success".equals(str)) {
+ setPartyID(object.getString("partyId"));
+ } else {
+ setPartyID(null);
+ }
+ }
+ }
+
+ @SubscribeEvent
+ public void stompConnect(StompConnectedEvent stompConnectedEvent) {
+ stompConnectedEvent.getStompInterface().subscribe(StompSubscription.builder()
+ .stompMessageHandler(this).ackMode(StompSubscription.AckMode.AUTO).destination("/user/queue/party.resp").build());
+ stompConnectedEvent.getStompInterface().subscribe(StompSubscription.builder()
+ .stompMessageHandler(this).ackMode(StompSubscription.AckMode.AUTO).destination("/user/queue/party.check").build());
+ stompConnectedEvent.getStompInterface().subscribe(StompSubscription.builder()
+ .stompMessageHandler(this).ackMode(StompSubscription.AckMode.AUTO).destination("/user/queue/party.join").build());
+ }
+}