From 87ecf13e8a59b5eb4aa68c423afdb9c2587580b2 Mon Sep 17 00:00:00 2001 From: TheRealNull Date: Mon, 6 Jan 2020 17:18:17 -0500 Subject: [PATCH] discord: party support --- .../http/api/ws/WebsocketMessage.java | 1 + .../java/net/runelite/client/RuneLite.java | 7 +- .../client/plugins/discord/DiscordPlugin.java | 2 +- .../plugins/discord/DiscordUserInfo.java | 1 + .../client/plugins/party/PartyPlugin.java | 90 ++++++++++++++++++- .../java/net/runelite/client/ws/WSClient.java | 15 ++-- 6 files changed, 103 insertions(+), 13 deletions(-) diff --git a/http-api/src/main/java/net/runelite/http/api/ws/WebsocketMessage.java b/http-api/src/main/java/net/runelite/http/api/ws/WebsocketMessage.java index 227e61eb56..fb52fa0e33 100644 --- a/http-api/src/main/java/net/runelite/http/api/ws/WebsocketMessage.java +++ b/http-api/src/main/java/net/runelite/http/api/ws/WebsocketMessage.java @@ -29,6 +29,7 @@ import net.runelite.api.events.Event; public class WebsocketMessage implements Event { protected boolean _party; + public String text; public boolean isParty() { diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index ad72c932a5..7b14b2d48c 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -81,6 +81,7 @@ import net.runelite.client.ui.overlay.arrow.ArrowWorldOverlay; import net.runelite.client.ui.overlay.infobox.InfoBoxOverlay; import net.runelite.client.ui.overlay.tooltip.TooltipOverlay; import net.runelite.client.ui.overlay.worldmap.WorldMapOverlay; +import net.runelite.client.ws.PartyService; import org.slf4j.LoggerFactory; @Singleton @@ -161,6 +162,9 @@ public class RuneLite @Inject private Provider chatboxPanelManager; + @Inject + private Provider partyService; + @Inject private Hooks hooks; @@ -248,7 +252,6 @@ public class RuneLite } } - SentryClient client = Sentry.init("https://fa31d674e44247fa93966c69a903770f@sentry.io/1811856"); client.setRelease(RuneLiteProperties.getPlusVersion()); @@ -299,7 +302,6 @@ public class RuneLite true)); injector.getInstance(RuneLite.class).start(); - final long end = System.currentTimeMillis(); final RuntimeMXBean rb = ManagementFactory.getRuntimeMXBean(); final long uptime = rb.getUptime(); @@ -372,6 +374,7 @@ public class RuneLite xpDropManager.get(); playerManager.get(); chatboxPanelManager.get(); + partyService.get(); eventBus.subscribe(GameStateChanged.class, this, hooks::onGameStateChanged); eventBus.subscribe(ScriptCallbackEvent.class, this, hooks::onScriptCallbackEvent); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java index 40fa5ffafd..8697b22abb 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java @@ -153,7 +153,7 @@ public class DiscordPlugin extends Plugin { partyService.setUsername(discordService.getCurrentUser().username + "#" + discordService.getCurrentUser().discriminator); } - + wsClient.unregisterMessage(DiscordUserInfo.class); wsClient.registerMessage(DiscordUserInfo.class); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordUserInfo.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordUserInfo.java index 360d58652e..430208a23c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordUserInfo.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordUserInfo.java @@ -30,6 +30,7 @@ import net.runelite.http.api.ws.messages.party.PartyMemberMessage; @Value @EqualsAndHashCode(callSuper = true) +public class DiscordUserInfo extends PartyMemberMessage { private final String userId; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPlugin.java index 5fa8ea24d0..5aa260b5e8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPlugin.java @@ -24,10 +24,13 @@ */ package net.runelite.client.plugins.party; +import com.google.gson.Gson; +import com.google.gson.JsonObject; import com.google.inject.Binder; import com.google.inject.Provides; import java.awt.Color; import java.awt.event.KeyEvent; +import java.lang.reflect.Member; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collections; @@ -60,6 +63,7 @@ import net.runelite.client.chat.ChatMessageBuilder; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.chat.QueuedMessage; import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.ConfigChanged; import net.runelite.client.events.OverlayMenuClicked; @@ -68,6 +72,7 @@ import net.runelite.client.input.KeyListener; import net.runelite.client.input.KeyManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.discord.DiscordUserInfo; import net.runelite.client.plugins.party.data.PartyData; import net.runelite.client.plugins.party.data.PartyTilePingData; import net.runelite.client.plugins.party.messages.LocationUpdate; @@ -81,9 +86,8 @@ import net.runelite.client.util.ColorUtil; import net.runelite.client.ws.PartyMember; import net.runelite.client.ws.PartyService; import net.runelite.client.ws.WSClient; -import net.runelite.http.api.ws.messages.party.UserJoin; -import net.runelite.http.api.ws.messages.party.UserPart; -import net.runelite.http.api.ws.messages.party.UserSync; +import net.runelite.http.api.ws.WebsocketMessage; +import net.runelite.http.api.ws.messages.party.*; @PluginDescriptor( name = "Party", @@ -126,6 +130,9 @@ public class PartyPlugin extends Plugin implements KeyListener @Inject private ChatMessageManager chatMessageManager; + @Inject + private EventBus eventBus; + @Inject @Named("developerMode") boolean developerMode; @@ -486,6 +493,83 @@ public class PartyPlugin extends Plugin implements KeyListener } } + @Subscribe + private void onPartyMemberMessage(PartyMemberMessage event) + { + JsonObject jobj = new Gson().fromJson(event.text, JsonObject.class); + if (jobj.get("type").getAsString().equals("SkillUpdate")) + { + Skill skillToUpdate = Skill.valueOf(jobj.get("skill").getAsString()); + SkillUpdate skillUpdateEvent = new SkillUpdate(skillToUpdate, jobj.get("value").getAsInt(), jobj.get("max").getAsInt()); + skillUpdateEvent.setMemberId(event.getMemberId()); + eventBus.post(SkillUpdate.class, skillUpdateEvent); + return; + } + + if (jobj.get("type").getAsString().equals("LocationUpdate")) + { + WorldPoint worldPoint = new WorldPoint(jobj.get("worldPoint").getAsJsonObject().get("x").getAsInt(), jobj.get("worldPoint").getAsJsonObject().get("y").getAsInt(), jobj.get("worldPoint").getAsJsonObject().get("plane").getAsInt()); + LocationUpdate locationUpdate = new LocationUpdate(worldPoint); + locationUpdate.setMemberId(event.getMemberId()); + eventBus.post(LocationUpdate.class, locationUpdate); + return; + } + + if (jobj.get("type").getAsString().equals("DiscordUserInfo")) + { + DiscordUserInfo info = new DiscordUserInfo(jobj.get("userId").getAsString(), jobj.get("avatarId").getAsString()); + info.setMemberId(event.getMemberId()); + eventBus.post(DiscordUserInfo.class, info); + return; + } + } + + @Subscribe + private void onWebsocketMessage(WebsocketMessage event) + { + JsonObject jobj = new Gson().fromJson(event.text, JsonObject.class); + if (jobj.get("type").getAsString().equals("UserJoin")) + { + UserJoin joinEvent = new UserJoin(UUID.fromString(jobj.get("memberId").getAsString()), UUID.fromString(jobj.get("partyId").getAsString()), jobj.get("name").getAsString()); + eventBus.post(UserJoin.class, joinEvent); + return; + } + if (jobj.get("type").getAsString().equals("Join")) + { + Join joinEvent = new Join(UUID.fromString(jobj.get("partyId").getAsString()), jobj.get("name").getAsString()); + eventBus.post(Join.class, joinEvent); + return; + } + if (jobj.get("type").getAsString().equals("PartyChatMessage")) + { + PartyChatMessage partyChatMessageEvent = new PartyChatMessage(jobj.get("value").getAsString()); + eventBus.post(PartyChatMessage.class, partyChatMessageEvent); + return; + } + if (jobj.get("type").getAsString().equals("UserPart")) + { + UserPart userPartEvent = new UserPart(UUID.fromString(jobj.get("memberId").getAsString())); + eventBus.post(UserPart.class, userPartEvent); + return; + } + if (jobj.get("type").getAsString().equals("UserSync")) + { + UserSync userPartEvent = new UserSync(); + eventBus.post(UserSync.class, userPartEvent); + return; + } + if (jobj.get("type").getAsString().equals("TilePing")) + { + WorldPoint worldPoint = new WorldPoint(jobj.get("worldPoint").getAsJsonObject().get("x").getAsInt(), jobj.get("worldPoint").getAsJsonObject().get("y").getAsInt(), jobj.get("worldPoint").getAsJsonObject().get("plane").getAsInt()); + TilePing tilePing = new TilePing(worldPoint); + eventBus.post(TilePing.class, tilePing); + return; + } + + log.debug("Unhandled WS event: {}", event.text); + + } + @Nullable PartyData getPartyData(final UUID uuid) { diff --git a/runelite-client/src/main/java/net/runelite/client/ws/WSClient.java b/runelite-client/src/main/java/net/runelite/client/ws/WSClient.java index f68e7c4173..a0b2496f3c 100644 --- a/runelite-client/src/main/java/net/runelite/client/ws/WSClient.java +++ b/runelite-client/src/main/java/net/runelite/client/ws/WSClient.java @@ -39,7 +39,7 @@ import net.runelite.http.api.RuneLiteAPI; import net.runelite.http.api.ws.WebsocketGsonFactory; import net.runelite.http.api.ws.WebsocketMessage; import net.runelite.http.api.ws.messages.Handshake; -import net.runelite.http.api.ws.messages.party.PartyMessage; +import net.runelite.http.api.ws.messages.party.*; import okhttp3.Request; import okhttp3.Response; import okhttp3.WebSocket; @@ -167,15 +167,16 @@ public class WSClient extends WebSocketListener implements AutoCloseable log.debug("Failed to deserialize message", e); return; } + message.text = text; - if (message.isParty() && !(message instanceof PartyMessage)) + if (message instanceof PartyMemberMessage) { - // spoofed message? - return; + eventBus.post(PartyMemberMessage.class, message); + } + else + { + eventBus.post(WebsocketMessage.class, message); } - - log.debug("Got: {}", text); - eventBus.post(PartyMessage.class, message); } @Override