diff --git a/runelite-client/src/main/java/net/runelite/client/party/PartyService.java b/runelite-client/src/main/java/net/runelite/client/party/PartyService.java index 3fd143bede..ebd9371d0f 100644 --- a/runelite-client/src/main/java/net/runelite/client/party/PartyService.java +++ b/runelite-client/src/main/java/net/runelite/client/party/PartyService.java @@ -53,6 +53,7 @@ import net.runelite.client.events.PartyMemberAvatar; import net.runelite.client.party.messages.Join; import net.runelite.client.party.messages.Part; import net.runelite.client.party.messages.PartyChatMessage; +import net.runelite.client.party.messages.PartyMessage; import net.runelite.client.party.messages.UserJoin; import net.runelite.client.party.messages.UserPart; import net.runelite.client.party.messages.UserSync; @@ -180,6 +181,22 @@ public class PartyService wsClient.send(new Join(partyId, USERNAME)); } + public void send(T message) + { + if (!wsClient.isOpen()) + { + log.debug("Reconnecting to server"); + + PartyMember local = getLocalMember(); + members.removeIf(m -> m != local); + + wsClient.connect(); + wsClient.send(new Join(partyId, USERNAME)); + } + + wsClient.send(message); + } + @Subscribe(priority = 1) // run prior to plugins so that the member is joined by the time the plugins see it. public void onUserJoin(final UserJoin message) { @@ -190,13 +207,17 @@ public class PartyService return; } - final PartyMember partyMember = new PartyMember(message.getMemberId(), cleanUsername(message.getName())); - members.add(partyMember); + PartyMember partyMember = getMemberById(message.getMemberId()); + if (partyMember == null) + { + partyMember = new PartyMember(message.getMemberId(), cleanUsername(message.getName())); + members.add(partyMember); + log.debug("User {} joins party, {} members", partyMember, members.size()); + } final PartyMember localMember = getLocalMember(); - // Send info to other clients that this user successfully finished joining party - if (localMember != null && message.getMemberId().equals(localMember.getMemberId())) + if (localMember != null && localMember == partyMember) { final UserSync userSync = new UserSync(); userSync.setMemberId(message.getMemberId()); @@ -207,7 +228,10 @@ public class PartyService @Subscribe(priority = 1) // run prior to plugins so that the member is removed by the time the plugins see it. public void onUserPart(final UserPart message) { - members.removeIf(member -> member.getMemberId().equals(message.getMemberId())); + if (members.removeIf(member -> member.getMemberId().equals(message.getMemberId()))) + { + log.debug("User {} leaves party, {} members", message.getMemberId(), members.size()); + } } @Subscribe diff --git a/runelite-client/src/main/java/net/runelite/client/party/WSClient.java b/runelite-client/src/main/java/net/runelite/client/party/WSClient.java index 55c67fc3e3..302ebcbcc5 100644 --- a/runelite-client/src/main/java/net/runelite/client/party/WSClient.java +++ b/runelite-client/src/main/java/net/runelite/client/party/WSClient.java @@ -96,7 +96,7 @@ public class WSClient extends WebSocketListener implements AutoCloseable } } - private void connect() + void connect() { if (sessionId == null) { @@ -115,6 +115,11 @@ public class WSClient extends WebSocketListener implements AutoCloseable send(handshake); } + boolean isOpen() + { + return webSocket != null; + } + public void registerMessage(final Class message) { if (messages.add(message)) 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 b83c61fd46..a7de70a68f 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 @@ -281,7 +281,7 @@ public class DiscordPlugin extends Plugin discordUser.avatar ); userInfo.setMemberId(localMember.getMemberId()); - wsClient.send(userInfo); + partyService.send(userInfo); } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsCounterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsCounterPlugin.java index b8636fd2b5..5a71ea0da8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsCounterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/dpscounter/DpsCounterPlugin.java @@ -199,7 +199,7 @@ public class DpsCounterPlugin extends Plugin { final DpsUpdate dpsUpdate = new DpsUpdate(hit, isBoss); dpsUpdate.setMemberId(localMember.getMemberId()); - wsClient.send(dpsUpdate); + partyService.send(dpsUpdate); } if (dpsConfig.bossDamage() && !isBoss) 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 1a6226f6ee..068f3e0efc 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 @@ -104,9 +104,6 @@ public class PartyPlugin extends Plugin @Inject private PartyService party; - @Inject - private WSClient ws; - @Inject private OverlayManager overlayManager; @@ -266,7 +263,7 @@ public class PartyPlugin extends Plugin event.consume(); final TilePing tilePing = new TilePing(selectedSceneTile.getWorldLocation()); tilePing.setMemberId(party.getLocalMember().getMemberId()); - wsClient.send(tilePing); + party.send(tilePing); } @Subscribe @@ -326,7 +323,7 @@ public class PartyPlugin extends Plugin final LocationUpdate locationUpdate = new LocationUpdate(location); locationUpdate.setMemberId(localMember.getMemberId()); - wsClient.send(locationUpdate); + party.send(locationUpdate); } @Subscribe @@ -342,7 +339,7 @@ public class PartyPlugin extends Plugin // Request sync final UserSync userSync = new UserSync(); userSync.setMemberId(party.getLocalMember().getMemberId()); - ws.send(userSync); + party.send(userSync); } } @@ -442,21 +439,21 @@ public class PartyPlugin extends Plugin { final SkillUpdate update = new SkillUpdate(Skill.HITPOINTS, currentHealth, realHealth); update.setMemberId(localMember.getMemberId()); - ws.send(update); + party.send(update); } if (forceSend || currentPrayer != lastPray) { final SkillUpdate update = new SkillUpdate(Skill.PRAYER, currentPrayer, realPrayer); update.setMemberId(localMember.getMemberId()); - ws.send(update); + party.send(update); } if (forceSend || !characterName.equals(lastCharacterName)) { final CharacterNameUpdate update = new CharacterNameUpdate(characterName); update.setMemberId(localMember.getMemberId()); - ws.send(update); + party.send(update); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java index 575e807097..3f47bedc7c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java @@ -84,7 +84,6 @@ import net.runelite.client.game.SpriteManager; import net.runelite.client.input.KeyManager; import net.runelite.client.party.PartyMember; import net.runelite.client.party.PartyService; -import net.runelite.client.party.WSClient; import net.runelite.client.party.messages.PartyChatMessage; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -156,9 +155,6 @@ public class RaidsPlugin extends Plugin @Inject private PartyService party; - @Inject - private WSClient ws; - @Inject private ChatCommandManager chatCommandManager; @@ -494,7 +490,7 @@ public class RaidsPlugin extends Plugin { final PartyChatMessage message = new PartyChatMessage(layoutMessage); message.setMemberId(localMember.getMemberId()); - ws.send(message); + party.send(message); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java index fccb15e6ee..7183d2c0d5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/specialcounter/SpecialCounterPlugin.java @@ -302,7 +302,7 @@ public class SpecialCounterPlugin extends Plugin { final SpecialCounterUpdate specialCounterUpdate = new SpecialCounterUpdate(interactingId, specialWeapon, hit, client.getWorld(), localPlayerId); specialCounterUpdate.setMemberId(party.getLocalMember().getMemberId()); - wsClient.send(specialCounterUpdate); + party.send(specialCounterUpdate); } playerInfoDrops.add(createSpecInfoDrop(specialWeapon, hit, localPlayerId)); diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/raids/RaidsPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/raids/RaidsPluginTest.java index ef8ceae5c8..9bab623f62 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/raids/RaidsPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/raids/RaidsPluginTest.java @@ -34,11 +34,10 @@ import net.runelite.client.Notifier; import net.runelite.client.chat.ChatClient; import net.runelite.client.config.ChatColorConfig; import net.runelite.client.config.RuneLiteConfig; +import net.runelite.client.party.PartyService; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.util.ImageCapture; -import net.runelite.client.party.PartyService; -import net.runelite.client.party.WSClient; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Before; @@ -92,10 +91,6 @@ public class RaidsPluginTest @Bind OverlayManager overlayManager; - @Mock - @Bind - WSClient wsClient; - @Mock @Bind RaidsConfig raidsConfig;