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 031ba10941..58cf1cad70 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 @@ -37,7 +37,6 @@ import java.time.temporal.ChronoUnit; import java.util.EnumSet; import java.util.HashMap; import java.util.Map; -import java.util.UUID; import javax.imageio.ImageIO; import javax.inject.Named; import lombok.extern.slf4j.Slf4j; @@ -50,11 +49,8 @@ import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.StatChanged; import net.runelite.client.config.ConfigManager; import net.runelite.client.discord.DiscordService; -import net.runelite.client.discord.events.DiscordJoinGame; -import net.runelite.client.discord.events.DiscordReady; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.ConfigChanged; -import net.runelite.client.events.PartyChanged; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.task.Schedule; @@ -65,8 +61,7 @@ import net.runelite.client.util.LinkBrowser; 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.discord.DiscordUser; import net.runelite.http.api.ws.messages.party.UserSync; import okhttp3.Call; import okhttp3.Callback; @@ -137,11 +132,6 @@ public class DiscordPlugin extends Plugin checkForGameStateUpdate(); checkForAreaUpdate(); - if (discordService.getCurrentUser() != null) - { - partyService.setUsername(discordService.getCurrentUser().username + "#" + discordService.getCurrentUser().discriminator); - } - wsClient.registerMessage(DiscordUserInfo.class); } @@ -150,7 +140,6 @@ public class DiscordPlugin extends Plugin { clientToolbar.removeNavigation(discordButton); resetState(); - partyService.changeParty(null); wsClient.unregisterMessage(DiscordUserInfo.class); } @@ -209,30 +198,9 @@ public class DiscordPlugin extends Plugin } } - @Subscribe - public void onDiscordReady(DiscordReady event) - { - partyService.setUsername(event.getUsername() + "#" + event.getDiscriminator()); - } - - @Subscribe - public void onDiscordJoinGame(DiscordJoinGame joinGame) - { - UUID partyId = UUID.fromString(joinGame.getJoinSecret()); - partyService.changeParty(partyId); - updatePresence(); - } - @Subscribe public void onDiscordUserInfo(final DiscordUserInfo event) { - final PartyMember memberById = partyService.getMemberById(event.getMemberId()); - - if (memberById == null || memberById.getAvatar() != null) - { - return; - } - final CharMatcher matcher = CharMatcher.anyOf("abcdef0123456789"); // animated avatars contain a_ as prefix so we need to get rid of that first to check against matcher @@ -246,13 +214,7 @@ public class DiscordPlugin extends Plugin if (Strings.isNullOrEmpty(event.getAvatarId())) { - final String[] split = memberById.getName().split("#", 2); - if (split.length != 2) - { - return; - } - - int disc = Integer.parseInt(split[1]); + int disc = Integer.parseInt(event.getDiscriminator()); int avatarId = disc % 5; url = "https://cdn.discordapp.com/embed/avatars/" + avatarId + ".png"; } @@ -292,7 +254,7 @@ public class DiscordPlugin extends Plugin image = ImageIO.read(inputStream); } - partyService.setPartyMemberAvatar(memberById.getMemberId(), image); + partyService.setPartyMemberAvatar(event.getMemberId(), image); } finally { @@ -302,12 +264,6 @@ public class DiscordPlugin extends Plugin }); } - @Subscribe - public void onUserJoin(final UserJoin event) - { - updatePresence(); - } - @Subscribe public void onUserSync(final UserSync event) { @@ -315,30 +271,21 @@ public class DiscordPlugin extends Plugin if (localMember != null) { - if (discordService.getCurrentUser() != null) + final DiscordUser discordUser = discordService.getCurrentUser(); + if (discordUser != null) { final DiscordUserInfo userInfo = new DiscordUserInfo( - discordService.getCurrentUser().userId, - discordService.getCurrentUser().avatar); - + discordUser.userId, + discordUser.username, + discordUser.discriminator, + discordUser.avatar + ); userInfo.setMemberId(localMember.getMemberId()); wsClient.send(userInfo); } } } - @Subscribe - public void onUserPart(final UserPart event) - { - updatePresence(); - } - - @Subscribe - public void onPartyChanged(final PartyChanged event) - { - updatePresence(); - } - @Schedule( period = 1, unit = ChronoUnit.MINUTES @@ -348,11 +295,6 @@ public class DiscordPlugin extends Plugin discordState.checkForTimeout(); } - private void updatePresence() - { - discordState.refresh(); - } - private void resetState() { discordState.reset(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordState.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordState.java index 0fc41574cb..e2740e3c5e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordState.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordState.java @@ -38,8 +38,6 @@ import javax.inject.Named; import lombok.Data; import net.runelite.client.discord.DiscordPresence; import net.runelite.client.discord.DiscordService; -import net.runelite.client.ws.PartyService; -import static net.runelite.client.ws.PartyService.PARTY_MAX; /** * This class contains data about currently active discord state. @@ -57,7 +55,6 @@ class DiscordState private final List events = new ArrayList<>(); private final DiscordService discordService; private final DiscordConfig config; - private final PartyService party; private final String runeliteTitle; private final String runeliteVersion; private DiscordPresence lastPresence; @@ -66,14 +63,12 @@ class DiscordState private DiscordState( final DiscordService discordService, final DiscordConfig config, - final PartyService party, @Named("runelite.title") final String runeliteTitle, @Named("runelite.version") final String runeliteVersion ) { this.discordService = discordService; this.config = config; - this.party = party; this.runeliteTitle = runeliteTitle; this.runeliteVersion = runeliteVersion; } @@ -88,30 +83,6 @@ class DiscordState lastPresence = null; } - /** - * Force refresh discord presence - */ - void refresh() - { - if (lastPresence == null) - { - return; - } - - final DiscordPresence.DiscordPresenceBuilder presenceBuilder = DiscordPresence.builder() - .state(lastPresence.getState()) - .details(lastPresence.getDetails()) - .largeImageText(lastPresence.getLargeImageText()) - .startTimestamp(lastPresence.getStartTimestamp()) - .smallImageKey(lastPresence.getSmallImageKey()) - .partyMax(lastPresence.getPartyMax()); - - - setPresencePartyInfo(presenceBuilder); - - discordService.updatePresence(presenceBuilder.build()); - } - /** * Trigger new discord state update. * @@ -197,8 +168,7 @@ class DiscordState .state(MoreObjects.firstNonNull(state, "")) .details(MoreObjects.firstNonNull(details, "")) .largeImageText(runeliteTitle + " v" + versionShortHand) - .smallImageKey(imageKey) - .partyMax(PARTY_MAX); + .smallImageKey(imageKey); final Instant startTime; switch (config.elapsedTimeType()) @@ -225,8 +195,6 @@ class DiscordState presenceBuilder.startTimestamp(startTime); - setPresencePartyInfo(presenceBuilder); - final DiscordPresence presence = presenceBuilder.build(); // This is to reduce amount of RPC calls @@ -263,16 +231,4 @@ class DiscordState updatePresenceWithLatestEvent(); } } - - private void setPresencePartyInfo(DiscordPresence.DiscordPresenceBuilder presenceBuilder) - { - if (party.isInParty()) - { - presenceBuilder.partySize(party.getMembers().size()); - - // Set public party id and secret - presenceBuilder.partyId(party.getPublicPartyId().toString()); - presenceBuilder.joinSecret(party.getPartyId().toString()); - } - } } 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..1f96e67051 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 @@ -33,5 +33,7 @@ import net.runelite.http.api.ws.messages.party.PartyMemberMessage; class DiscordUserInfo extends PartyMemberMessage { private final String userId; + private final String username; + private final String discriminator; private final String avatarId; } 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 d158b151a7..ecd962ce85 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 @@ -208,7 +208,7 @@ public class DpsCounterPlugin extends Plugin } // If not in a party, user local player name - final String name = localMember == null ? player.getName() : localMember.getName(); + final String name = localMember == null ? player.getName() : localMember.getDisplayName(); DpsMember dpsMember = members.computeIfAbsent(name, DpsMember::new); dpsMember.addDamage(hit); @@ -240,7 +240,7 @@ public class DpsCounterPlugin extends Plugin return; } - String name = partyService.getMemberById(dpsUpdate.getMemberId()).getName(); + String name = partyService.getMemberById(dpsUpdate.getMemberId()).getDisplayName(); if (name == null) { return; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyConfig.java index 4d484f4cdc..885f25b80d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyConfig.java @@ -56,17 +56,6 @@ public interface PartyConfig extends Config return true; } - @ConfigItem( - keyName = "messages", - name = "Join messages", - description = "Enables members join/leave game messages", - position = 3 - ) - default boolean messages() - { - return true; - } - @ConfigItem( keyName = "recolorNames", name = "Recolor names", @@ -85,17 +74,6 @@ public interface PartyConfig extends Config position = 5 ) default boolean autoOverlay() - { - return true; - } - - @ConfigItem( - keyName = "includeSelf", - name = "Include yourself", - description = "Shows yourself in the panel as part of the party", - position = 6 - ) - default boolean includeSelf() { return false; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyMemberBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyMemberBox.java index 7b3839b406..04bea7d2d6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyMemberBox.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyMemberBox.java @@ -40,6 +40,7 @@ import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import lombok.AccessLevel; import lombok.Getter; +import net.runelite.client.ws.PartyMember; import net.runelite.client.plugins.party.data.PartyData; import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.DynamicGridLayout; @@ -61,9 +62,7 @@ class PartyMemberBox extends JPanel private final ProgressBar hpBar = new ProgressBar(); private final ProgressBar prayerBar = new ProgressBar(); - private final JLabel topName = new JLabel(); - private final JLabel bottomName = new JLabel(); - + private final JLabel name = new JLabel(); private final JLabel avatar = new JLabel(); private final PartyConfig config; @@ -113,14 +112,10 @@ class PartyMemberBox extends JPanel namesPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); namesPanel.setBorder(new EmptyBorder(2, 5, 2, 5)); - topName.setFont(FontManager.getRunescapeSmallFont()); - bottomName.setFont(FontManager.getRunescapeSmallFont()); + name.setFont(FontManager.getRunescapeSmallFont()); + name.putClientProperty("html.disable", Boolean.TRUE); - topName.putClientProperty("html.disable", Boolean.TRUE); - bottomName.putClientProperty("html.disable", Boolean.TRUE); - - namesPanel.add(topName); // top - namesPanel.add(bottomName); // bottom + namesPanel.add(name); headerPanel.add(avatar, BorderLayout.WEST); headerPanel.add(namesPanel, BorderLayout.CENTER); @@ -155,10 +150,12 @@ class PartyMemberBox extends JPanel void update() { + final PartyMember member = memberPartyData.getMember(); + // Avatar - if (!avatarSet && memberPartyData.getMember().getAvatar() != null) + if (!avatarSet && member.getAvatar() != null) { - ImageIcon icon = new ImageIcon(ImageUtil.resizeImage(memberPartyData.getMember().getAvatar(), 32, 32)); + ImageIcon icon = new ImageIcon(ImageUtil.resizeImage(member.getAvatar(), 32, 32)); icon.getImage().flush(); avatar.setIcon(icon); @@ -174,15 +171,12 @@ class PartyMemberBox extends JPanel prayerBar.setMaximumValue(memberPartyData.getMaxPrayer()); prayerBar.setCenterLabel(progressBarLabel(memberPartyData.getPrayer(), memberPartyData.getMaxPrayer())); - // Update name labels + // Update name label Color playerColor = config.recolorNames() ? memberPartyData.getColor() : Color.WHITE; - boolean isLoggedIn = !memberPartyData.getCharacterName().isEmpty(); + boolean isLoggedIn = member.isLoggedIn(); - topName.setForeground(playerColor); - topName.setText(memberPartyData.getMember().getName()); - - bottomName.setForeground(isLoggedIn ? playerColor : Color.GRAY); - bottomName.setText(isLoggedIn ? memberPartyData.getCharacterName() : "Logged out"); + name.setForeground(isLoggedIn ? playerColor : Color.GRAY); + name.setText(member.getDisplayName()); } private static String progressBarLabel(int current, int max) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPanel.java index 52d4799e95..590424eaf8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyPanel.java @@ -57,7 +57,6 @@ class PartyPanel extends PluginPanel private final PartyService party; private final PartyConfig config; - private final Map requestBoxes = new HashMap<>(); private final Map memberBoxes = new HashMap<>(); private final JButton startButton = new JButton(); @@ -68,7 +67,6 @@ class PartyPanel extends PluginPanel private final PluginErrorPanel noPartyPanel = new PluginErrorPanel(); private final PluginErrorPanel partyEmptyPanel = new PluginErrorPanel(); private final JComponent memberBoxPanel = new DragAndDropReorderPane(); - private final JComponent requestBoxPanel = new DragAndDropReorderPane(); @Inject PartyPanel(final PartyPlugin plugin, final PartyConfig config, final PartyService party) @@ -113,7 +111,6 @@ class PartyPanel extends PluginPanel topPanel.add(rejoinPartyButton, c); layoutPanel.add(topPanel); - layoutPanel.add(requestBoxPanel); layoutPanel.add(memberBoxPanel); startButton.setText(party.isInParty() ? BTN_LEAVE_TEXT : BTN_CREATE_TEXT); @@ -280,30 +277,4 @@ class PartyPanel extends PluginPanel { memberBoxes.forEach((key, value) -> value.update()); } - - void addRequest(String userId, String userName) - { - PartyRequestBox partyRequestBox = new PartyRequestBox(plugin, requestBoxPanel, userId, userName); - requestBoxes.put(userId, partyRequestBox); - requestBoxPanel.add(partyRequestBox); - requestBoxPanel.revalidate(); - } - - void removeAllRequests() - { - requestBoxes.forEach((key, value) -> requestBoxPanel.remove(value)); - requestBoxPanel.revalidate(); - requestBoxes.clear(); - } - - void removeRequest(String userId) - { - final PartyRequestBox requestBox = requestBoxes.remove(userId); - - if (requestBox != null) - { - requestBoxPanel.remove(requestBox); - requestBoxPanel.revalidate(); - } - } } 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 ae13a4a22f..c833be1e98 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 @@ -58,13 +58,9 @@ import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameTick; import net.runelite.api.events.MenuOptionClicked; import net.runelite.client.callback.ClientThread; -import net.runelite.client.chat.ChatColorType; -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.discord.DiscordService; -import net.runelite.client.discord.events.DiscordJoinRequest; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.ConfigChanged; import net.runelite.client.events.OverlayMenuClicked; @@ -138,9 +134,6 @@ public class PartyPlugin extends Plugin @Inject private ClientToolbar clientToolbar; - @Inject - private DiscordService discordService; - @Inject @Named("developerMode") boolean developerMode; @@ -157,7 +150,6 @@ public class PartyPlugin extends Plugin private int lastHp, lastPray; private String lastCharacterName = ""; private WorldPoint lastLocation; - private boolean sendAlert; @Override public void configure(Binder binder) @@ -207,7 +199,6 @@ public class PartyPlugin extends Plugin wsClient.unregisterMessage(TilePing.class); wsClient.unregisterMessage(LocationUpdate.class); wsClient.unregisterMessage(CharacterNameUpdate.class); - sendAlert = false; lastLocation = null; } @@ -231,21 +222,6 @@ public class PartyPlugin extends Plugin void leaveParty() { party.changeParty(null); - - if (!config.messages()) - { - return; - } - - final String leaveMessage = new ChatMessageBuilder() - .append(ChatColorType.HIGHLIGHT) - .append("You have left the party.") - .build(); - - chatMessageManager.queue(QueuedMessage.builder() - .type(ChatMessageType.FRIENDSCHATNOTIFICATION) - .runeLiteFormattedMessage(leaveMessage) - .build()); } @Subscribe @@ -253,22 +229,6 @@ public class PartyPlugin extends Plugin { if (event.getGroup().equals(PartyConfig.GROUP)) { - final PartyMember localMember = party.getLocalMember(); - - if (localMember != null) - { - if (config.includeSelf()) - { - final PartyData partyData = getPartyData(localMember.getMemberId()); - assert partyData != null; - SwingUtilities.invokeLater(() -> panel.addMember(partyData)); - } - else - { - SwingUtilities.invokeLater(() -> panel.removeMember(localMember.getMemberId())); - } - } - // rebuild the panel in the event the "Recolor names" option changes SwingUtilities.invokeLater(panel::updateAll); } @@ -314,35 +274,12 @@ public class PartyPlugin extends Plugin wsClient.send(tilePing); } - @Subscribe - public void onDiscordJoinRequest(DiscordJoinRequest request) - { - final String requestMessage = new ChatMessageBuilder() - .append(ChatColorType.HIGHLIGHT) - .append("New join request received. Check your Party panel.") - .build(); - - chatMessageManager.queue(QueuedMessage.builder() - .type(ChatMessageType.FRIENDSCHATNOTIFICATION) - .runeLiteFormattedMessage(requestMessage) - .build()); - - String userName = request.getUsername() + "#" + request.getDiscriminator(); - SwingUtilities.invokeLater(() -> panel.addRequest(request.getUserId(), userName)); - } - @Subscribe public void onGameStateChanged(GameStateChanged event) { checkStateChanged(false); } - public void replyToRequest(String userId, int reply) - { - discordService.respondToRequest(userId, reply); - panel.removeRequest(userId); - } - @Subscribe public void onTilePing(TilePing event) { @@ -400,12 +337,6 @@ public class PartyPlugin extends Plugin @Subscribe public void onGameTick(final GameTick event) { - if (sendAlert && client.getGameState() == GameState.LOGGED_IN) - { - sendAlert = false; - sendInstructionMessage(); - } - checkStateChanged(false); } @@ -430,11 +361,22 @@ public class PartyPlugin extends Plugin return; } - String name = event.getCharacterName(); - name = Text.removeTags(Text.toJagexName(name)); + final String name = Text.removeTags(Text.toJagexName(event.getCharacterName())); + final PartyMember member = partyData.getMember(); - partyData.setCharacterName(name); - SwingUtilities.invokeLater(() -> panel.updateMember(partyData.getMember().getMemberId())); + if (!name.isEmpty()) + { + member.setDisplayName(name); + member.setLoggedIn(true); + partyData.setColor(ColorUtil.fromObject(name)); + } + else + { + member.setLoggedIn(false); + partyData.setColor(Color.WHITE); + } + + SwingUtilities.invokeLater(() -> panel.updateMember(member.getMemberId())); } @Subscribe @@ -477,30 +419,8 @@ public class PartyPlugin extends Plugin @Subscribe public void onUserJoin(final UserJoin event) { - final PartyData partyData = getPartyData(event.getMemberId()); - - if (partyData == null || !config.messages()) - { - return; - } - - final String joinMessage = new ChatMessageBuilder() - .append(ChatColorType.HIGHLIGHT) - .append(partyData.getMember().getName()) - .append(" has joined the party!") - .build(); - - chatMessageManager.queue(QueuedMessage.builder() - .type(ChatMessageType.FRIENDSCHATNOTIFICATION) - .runeLiteFormattedMessage(joinMessage) - .build()); - - final PartyMember localMember = party.getLocalMember(); - - if (localMember != null && partyData.getMember().getMemberId().equals(localMember.getMemberId())) - { - sendAlert = true; - } + // this has a side effect of creating the party data + getPartyData(event.getMemberId()); } @Subscribe @@ -557,20 +477,6 @@ public class PartyPlugin extends Plugin if (removed != null) { - if (config.messages()) - { - final String joinMessage = new ChatMessageBuilder() - .append(ChatColorType.HIGHLIGHT) - .append(removed.getMember().getName()) - .append(" has left the party!") - .build(); - - chatMessageManager.queue(QueuedMessage.builder() - .type(ChatMessageType.FRIENDSCHATNOTIFICATION) - .runeLiteFormattedMessage(joinMessage) - .build()); - } - worldMapManager.remove(removed.getWorldMapPoint()); SwingUtilities.invokeLater(() -> panel.removeMember(event.getMemberId())); @@ -590,11 +496,7 @@ public class PartyPlugin extends Plugin config.setPreviousPartyId(String.valueOf(event.getPartyId())); } - SwingUtilities.invokeLater(() -> - { - panel.removeAllMembers(); - panel.removeAllRequests(); - }); + SwingUtilities.invokeLater(panel::removeAllMembers); } @Subscribe @@ -610,7 +512,7 @@ public class PartyPlugin extends Plugin chatMessageManager.queue(QueuedMessage.builder().type(ChatMessageType.GAMEMESSAGE).value("Local ID " + party.getLocalMember().getMemberId()).build()); for (PartyMember partyMember : party.getMembers()) { - chatMessageManager.queue(QueuedMessage.builder().type(ChatMessageType.GAMEMESSAGE).value(" " + partyMember.getName() + " " + partyMember.getMemberId()).build()); + chatMessageManager.queue(QueuedMessage.builder().type(ChatMessageType.GAMEMESSAGE).value("Member " + partyMember.getName() + " " + partyMember.getDisplayName() + " " + partyMember.getMemberId()).build()); } } @@ -636,7 +538,6 @@ public class PartyPlugin extends Plugin return partyDataMap.computeIfAbsent(uuid, (u) -> { final WorldMapPoint worldMapPoint = new PartyWorldMapPoint(new WorldPoint(0, 0, 0), memberById); - worldMapPoint.setTooltip(memberById.getName()); // When first joining a party, other members can join before getting a join for self PartyMember partyMember = party.getLocalMember(); @@ -648,32 +549,11 @@ public class PartyPlugin extends Plugin worldMapManager.add(worldMapPoint); } - PartyData partyData = new PartyData(memberById, worldMapPoint, ColorUtil.fromObject(memberById.getName())); + PartyData partyData = new PartyData(memberById, worldMapPoint); partyData.setShowOverlay(config.autoOverlay()); - if (config.includeSelf() || !isSelf) - { - SwingUtilities.invokeLater(() -> panel.addMember(partyData)); - } - else - { - SwingUtilities.invokeLater(panel::updateParty); - } - + SwingUtilities.invokeLater(() -> panel.addMember(partyData)); return partyData; }); } - - private void sendInstructionMessage() - { - final String helpMessage = new ChatMessageBuilder() - .append(ChatColorType.HIGHLIGHT) - .append("To leave the party, click \"Leave party\" on the party panel.") - .build(); - - chatMessageManager.queue(QueuedMessage.builder() - .type(ChatMessageType.FRIENDSCHATNOTIFICATION) - .runeLiteFormattedMessage(helpMessage) - .build()); - } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyRequestBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyRequestBox.java deleted file mode 100644 index f36b262285..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyRequestBox.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) 2021, Jonathan Rousseau - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.party; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.GridLayout; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JPanel; -import javax.swing.border.EmptyBorder; -import net.runelite.client.ui.ColorScheme; -import net.runelite.client.ui.DynamicGridLayout; -import net.runelite.client.ui.FontManager; -import net.runelite.client.ui.components.MouseDragEventForwarder; -import net.runelite.client.ui.components.shadowlabel.JShadowedLabel; -import net.runelite.client.util.ImageUtil; -import net.runelite.client.util.SwingUtil; -import net.runelite.discord.DiscordRPC; - -class PartyRequestBox extends JPanel -{ - private static final ImageIcon CONFIRM_ICON = new ImageIcon(ImageUtil.loadImageResource(PartyPlugin.class, "confirm_icon.png")); - private static final ImageIcon CONFIRM_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(ImageUtil.bufferedImageFromImage(CONFIRM_ICON.getImage()), 0.54f)); - private static final ImageIcon CANCEL_ICON = new ImageIcon(ImageUtil.loadImageResource(PartyPlugin.class, "cancel_icon.png")); - private static final ImageIcon CANCEL_HOVER_ICON = new ImageIcon(ImageUtil.alphaOffset(ImageUtil.bufferedImageFromImage(CANCEL_ICON.getImage()), 0.6f)); - - PartyRequestBox(final PartyPlugin plugin, final JComponent panel, String userId, String userName) - { - setLayout(new BorderLayout()); - setBorder(new EmptyBorder(5, 0, 0, 0)); - - /* The box's wrapping container */ - final JPanel container = new JPanel(); - container.setLayout(new BorderLayout()); - container.setBackground(ColorScheme.DARKER_GRAY_COLOR); - container.setBorder(new EmptyBorder(5, 5, 5, 5)); - - JPanel namesPanel = new JPanel(); - namesPanel.setLayout(new DynamicGridLayout(2, 1)); - namesPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); - namesPanel.setBorder(new EmptyBorder(2, 5, 2, 5)); - - JShadowedLabel nameLabel = new JShadowedLabel(); - nameLabel.setFont(FontManager.getRunescapeSmallFont()); - nameLabel.setForeground(Color.WHITE); - nameLabel.setText(userName); - - JShadowedLabel messageLabel = new JShadowedLabel(); - messageLabel.setFont(FontManager.getRunescapeSmallFont()); - messageLabel.setForeground(Color.WHITE); - messageLabel.setText("Wants to join your party!"); - - namesPanel.add(nameLabel); - namesPanel.add(messageLabel); - - JPanel actionsContainer = new JPanel(new GridLayout(1, 2, 8, 0)); - actionsContainer.setBackground(ColorScheme.DARKER_GRAY_COLOR); - - JButton confirmButton = new JButton(CONFIRM_ICON); - SwingUtil.removeButtonDecorations(confirmButton); - confirmButton.setToolTipText("Invite"); - confirmButton.setRolloverIcon(CONFIRM_HOVER_ICON); - confirmButton.addActionListener(e -> plugin.replyToRequest(userId, DiscordRPC.DISCORD_REPLY_YES)); - confirmButton.setPreferredSize(new Dimension(18, 18)); - - JButton cancelButton = new JButton(CANCEL_ICON); - SwingUtil.removeButtonDecorations(cancelButton); - cancelButton.setToolTipText("Reject"); - cancelButton.setRolloverIcon(CANCEL_HOVER_ICON); - cancelButton.addActionListener(e -> plugin.replyToRequest(userId, DiscordRPC.DISCORD_REPLY_NO)); - cancelButton.setPreferredSize(new Dimension(18, 18)); - - actionsContainer.add(confirmButton); - actionsContainer.add(cancelButton); - - container.add(namesPanel, BorderLayout.WEST); - container.add(actionsContainer, BorderLayout.EAST); - - // forward mouse drag events to parent panel for drag and drop reordering - MouseDragEventForwarder mouseDragEventForwarder = new MouseDragEventForwarder(panel); - container.addMouseListener(mouseDragEventForwarder); - container.addMouseMotionListener(mouseDragEventForwarder); - - add(container, BorderLayout.NORTH); - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyStatsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyStatsOverlay.java index e103649d35..501ae38682 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyStatsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyStatsOverlay.java @@ -41,7 +41,7 @@ import net.runelite.client.ui.overlay.components.ComponentConstants; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.ProgressBarComponent; import net.runelite.client.ui.overlay.components.TitleComponent; -import net.runelite.client.ws.PartyService; +import net.runelite.client.ws.PartyMember; public class PartyStatsOverlay extends OverlayPanel { @@ -51,15 +51,13 @@ public class PartyStatsOverlay extends OverlayPanel private static final Color PRAY_BG = Color.black; private final PartyPlugin plugin; - private final PartyService party; private final PartyConfig config; @Inject - private PartyStatsOverlay(final PartyPlugin plugin, final PartyService party, final PartyConfig config) + private PartyStatsOverlay(final PartyPlugin plugin, final PartyConfig config) { super(plugin); this.plugin = plugin; - this.party = party; this.config = config; panelComponent.setBorder(new Rectangle()); panelComponent.setGap(new Point(0, ComponentConstants.STANDARD_BORDER / 2)); @@ -81,9 +79,9 @@ public class PartyStatsOverlay extends OverlayPanel { partyDataMap.forEach((k, v) -> { - boolean isSelf = party.getLocalMember() != null && party.getLocalMember().getMemberId().equals(k); + final PartyMember member = v.getMember(); - if (!v.isShowOverlay() || (!config.includeSelf() && isSelf)) + if (!v.isShowOverlay()) { return; } @@ -92,7 +90,7 @@ public class PartyStatsOverlay extends OverlayPanel panel.getChildren().clear(); final TitleComponent name = TitleComponent.builder() - .text(v.getCharacterName().isEmpty() ? v.getMember().getName() : v.getCharacterName()) + .text(member.getDisplayName()) .color(config.recolorNames() ? v.getColor() : Color.WHITE) .build(); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyWorldMapPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyWorldMapPoint.java index 1c2bfd5b86..e85e32430c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyWorldMapPoint.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/PartyWorldMapPoint.java @@ -45,12 +45,23 @@ class PartyWorldMapPoint extends WorldMapPoint this.member = member; this.setSnapToEdge(true); this.setJumpOnClick(true); - this.setName(member.getName()); this.setImagePoint(new Point( ARROW.getWidth() / 2, ARROW.getHeight())); } + @Override + public String getName() + { + return member.getDisplayName(); + } + + @Override + public String getTooltip() + { + return member.getDisplayName(); + } + @Override public BufferedImage getImage() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/party/data/PartyData.java b/runelite-client/src/main/java/net/runelite/client/plugins/party/data/PartyData.java index f61a3b8866..053a16f5e6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/party/data/PartyData.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/party/data/PartyData.java @@ -41,12 +41,11 @@ public class PartyData private final PartyMember member; private final WorldMapPoint worldMapPoint; private final PanelComponent panel = new PanelComponent(); - private final Color color; + private Color color = Color.WHITE; private int hitpoints; private int maxHitpoints; private int prayer; private int maxPrayer; - private String characterName = ""; private boolean showOverlay; } 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 c1f72e1b42..78fadb0242 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 @@ -315,7 +315,7 @@ public class SpecialCounterPlugin extends Plugin return; } - String name = party.getMemberById(event.getMemberId()).getName(); + String name = party.getMemberById(event.getMemberId()).getDisplayName(); if (name == null) { return; diff --git a/runelite-client/src/main/java/net/runelite/client/ws/PartyMember.java b/runelite-client/src/main/java/net/runelite/client/ws/PartyMember.java index a5e6cc3275..cdc6ac1033 100644 --- a/runelite-client/src/main/java/net/runelite/client/ws/PartyMember.java +++ b/runelite-client/src/main/java/net/runelite/client/ws/PartyMember.java @@ -33,5 +33,7 @@ public class PartyMember { private final UUID memberId; private final String name; + private String displayName = ""; + private boolean loggedIn; private BufferedImage avatar; } diff --git a/runelite-client/src/main/java/net/runelite/client/ws/PartyService.java b/runelite-client/src/main/java/net/runelite/client/ws/PartyService.java index dc00df2e4d..d9f82836e0 100644 --- a/runelite-client/src/main/java/net/runelite/client/ws/PartyService.java +++ b/runelite-client/src/main/java/net/runelite/client/ws/PartyService.java @@ -25,18 +25,16 @@ */ package net.runelite.client.ws; -import com.google.common.base.Charsets; -import com.google.common.hash.Hashing; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Random; import java.util.UUID; import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; import lombok.Getter; -import lombok.Setter; import lombok.extern.slf4j.Slf4j; import net.runelite.api.ChatMessageType; import net.runelite.client.account.AccountSession; @@ -46,8 +44,8 @@ import net.runelite.client.chat.QueuedMessage; import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.PartyChanged; -import net.runelite.client.util.Text; import net.runelite.client.events.PartyMemberAvatar; +import net.runelite.client.util.Text; import static net.runelite.client.util.Text.JAGEX_PRINTABLE_CHAR_MATCHER; import net.runelite.http.api.ws.messages.party.Join; import net.runelite.http.api.ws.messages.party.Part; @@ -60,9 +58,9 @@ import net.runelite.http.api.ws.messages.party.UserSync; @Singleton public class PartyService { - public static final int PARTY_MAX = 15; private static final int MAX_MESSAGE_LEN = 150; private static final int MAX_USERNAME_LEN = 32; // same as Discord + private static final String USERNAME = "rluser-" + new Random().nextInt(Integer.MAX_VALUE); private final WSClient wsClient; private final SessionManager sessionManager; @@ -73,15 +71,9 @@ public class PartyService @Getter private UUID localPartyId = UUID.randomUUID(); - @Getter - private UUID publicPartyId; // public party id, for advertising on discord, derived from the secret - @Getter private UUID partyId; // secret party id - @Setter - private String username; - @Inject private PartyService(final WSClient wsClient, final SessionManager sessionManager, final EventBus eventBus, final ChatMessageManager chat) { @@ -94,12 +86,6 @@ public class PartyService public void changeParty(@Nullable UUID newParty) { - if (username == null) - { - log.warn("Tried to join a party with no username"); - return; - } - if (wsClient.sessionExists()) { wsClient.send(new Part()); @@ -108,8 +94,6 @@ public class PartyService log.debug("Party change to {}", newParty); members.clear(); partyId = newParty; - // The public party ID needs to be consistent across party members, but not a secret - publicPartyId = newParty != null ? UUID.nameUUIDFromBytes(Hashing.sha256().hashString(newParty.toString(), Charsets.UTF_8).asBytes()) : null; if (partyId == null) { @@ -135,7 +119,7 @@ public class PartyService } eventBus.post(new PartyChanged(partyId)); - wsClient.send(new Join(partyId, username)); + wsClient.send(new Join(partyId, USERNAME)); } @Subscribe(priority = 1) // run prior to plugins so that the member is joined by the time the plugins see it. @@ -171,11 +155,18 @@ public class PartyService @Subscribe public void onPartyChatMessage(final PartyChatMessage message) { + final PartyMember member = getMemberById(message.getMemberId()); + if (member == null || !member.isLoggedIn()) + { + log.debug("Dropping party chat from non logged-in member"); + return; + } + // Remove non-printable characters, and tags from message String sentMesage = JAGEX_PRINTABLE_CHAR_MATCHER.retainFrom(message.getValue()) .replaceAll("", ""); - // Cap the mesage length + // Cap the message length if (sentMesage.length() > MAX_MESSAGE_LEN) { sentMesage = sentMesage.substring(0, MAX_MESSAGE_LEN); @@ -184,14 +175,14 @@ public class PartyService chat.queue(QueuedMessage.builder() .type(ChatMessageType.FRIENDSCHAT) .sender("Party") - .name(getMemberById(message.getMemberId()).getName()) + .name(member.getDisplayName()) .runeLiteFormattedMessage(sentMesage) .build()); } public PartyMember getLocalMember() { - return getMemberByName(username); + return getMemberByName(USERNAME); } public PartyMember getMemberById(final UUID id)