From 87ecf13e8a59b5eb4aa68c423afdb9c2587580b2 Mon Sep 17 00:00:00 2001 From: TheRealNull Date: Mon, 6 Jan 2020 17:18:17 -0500 Subject: [PATCH 1/3] 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 @@ 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.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 @@ protected PasswordAuthentication getPasswordAuthentication() } } - SentryClient client = Sentry.init("https://fa31d674e44247fa93966c69a903770f@sentry.io/1811856"); client.setRelease(RuneLiteProperties.getPlusVersion()); @@ -299,7 +302,6 @@ protected PasswordAuthentication getPasswordAuthentication() 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 @@ private void start() throws Exception 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 @@ protected void startUp() { 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 @@ @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.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.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.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 @@ private void onCommandExecuted(CommandExecuted commandExecuted) } } + @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.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 void onMessage(@NotNull WebSocket webSocket, @NotNull String text) 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 From 0572763eb340a9c132fd0107e557fdb2f5913f5d Mon Sep 17 00:00:00 2001 From: TheRealNull Date: Mon, 6 Jan 2020 17:40:39 -0500 Subject: [PATCH 2/3] cleanup --- .../java/net/runelite/client/RuneLite.java | 4 +- .../client/plugins/party/PartyPlugin.java | 37 +++++++------------ .../java/net/runelite/client/ws/WSClient.java | 28 +++++++------- 3 files changed, 29 insertions(+), 40 deletions(-) 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 7b14b2d48c..14f93d3cc3 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -162,8 +162,8 @@ public class RuneLite @Inject private Provider chatboxPanelManager; - @Inject - private Provider partyService; + @Inject + private Provider partyService; @Inject private Hooks hooks; 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 5aa260b5e8..daa7fa3e37 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 @@ -30,7 +30,6 @@ 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; @@ -87,7 +86,12 @@ import net.runelite.client.ws.PartyService; import net.runelite.client.ws.WSClient; import net.runelite.http.api.ws.WebsocketMessage; -import net.runelite.http.api.ws.messages.party.*; +import net.runelite.http.api.ws.messages.party.Join; +import net.runelite.http.api.ws.messages.party.PartyChatMessage; +import net.runelite.http.api.ws.messages.party.PartyMemberMessage; +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; @PluginDescriptor( name = "Party", @@ -97,52 +101,37 @@ @Singleton public class PartyPlugin extends Plugin implements KeyListener { + @Getter(AccessLevel.PACKAGE) + private final Map partyDataMap = Collections.synchronizedMap(new HashMap<>()); + @Getter(AccessLevel.PACKAGE) + private final List pendingTilePings = Collections.synchronizedList(new ArrayList<>()); + @Inject + @Named("developerMode") + boolean developerMode; @Inject private Client client; - @Inject private PartyService party; - @Inject private WSClient ws; - @Inject private OverlayManager overlayManager; - @Inject private PartyStatsOverlay partyStatsOverlay; - @Inject private PartyPingOverlay partyPingOverlay; - @Inject private KeyManager keyManager; - @Inject private WSClient wsClient; - @Inject private WorldMapPointManager worldMapManager; - @Inject private PartyConfig config; - @Inject private ChatMessageManager chatMessageManager; - @Inject private EventBus eventBus; - - @Inject - @Named("developerMode") - boolean developerMode; - - @Getter(AccessLevel.PACKAGE) - private final Map partyDataMap = Collections.synchronizedMap(new HashMap<>()); - - @Getter(AccessLevel.PACKAGE) - private final List pendingTilePings = Collections.synchronizedList(new ArrayList<>()); - private int lastHp, lastPray; private boolean hotkeyDown, doSync; private boolean sendAlert; 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 a0b2496f3c..caa840efbf 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.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.*; +import net.runelite.http.api.ws.messages.party.PartyMemberMessage; import okhttp3.Request; import okhttp3.Response; import okhttp3.WebSocket; @@ -148,9 +148,17 @@ public void close() } @Override - public void onOpen(@NotNull WebSocket webSocket, @NotNull Response response) + public void onClosed(@NotNull WebSocket webSocket, int code, @NotNull String reason) { - log.info("Websocket {} opened", webSocket); + log.info("Websocket {} closed: {}/{}", webSocket, code, reason); + this.webSocket = null; + } + + @Override + public void onFailure(@NotNull WebSocket webSocket, @NotNull Throwable t, Response response) + { + log.warn("Error in websocket {}:{}", response, t); + this.webSocket = null; } @Override @@ -175,21 +183,13 @@ public void onMessage(@NotNull WebSocket webSocket, @NotNull String text) } else { - eventBus.post(WebsocketMessage.class, message); + eventBus.post(WebsocketMessage.class, message); } } @Override - public void onClosed(@NotNull WebSocket webSocket, int code, @NotNull String reason) - { - log.info("Websocket {} closed: {}/{}", webSocket, code, reason); - this.webSocket = null; - } - - @Override - public void onFailure(@NotNull WebSocket webSocket, @NotNull Throwable t, Response response) + public void onOpen(@NotNull WebSocket webSocket, @NotNull Response response) { - log.warn("Error in websocket {}:{}", response, t); - this.webSocket = null; + log.info("Websocket {} opened", webSocket); } } From 2f2b154e8096a7b1a2b8caad9c49903605ac2251 Mon Sep 17 00:00:00 2001 From: Kyle <48519776+xKylee@users.noreply.github.com> Date: Sat, 11 Jan 2020 22:24:49 +0000 Subject: [PATCH 3/3] Update DiscordUserInfo.java --- .../net/runelite/client/plugins/discord/DiscordUserInfo.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 430208a23c..fdf47d4e3e 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,8 +30,7 @@ @Value @EqualsAndHashCode(callSuper = true) -public -class DiscordUserInfo extends PartyMemberMessage +public class DiscordUserInfo extends PartyMemberMessage { private final String userId; private final String avatarId;