mixins: refactor to use NameableContainer

This commit is contained in:
Owain van Brakel
2020-05-23 03:21:20 +02:00
parent 952fe24a03
commit ad1b7b8a0c
20 changed files with 135 additions and 264 deletions

View File

@@ -29,13 +29,6 @@ package net.runelite.api;
*/ */
public interface ClanMember extends ChatPlayer public interface ClanMember extends ChatPlayer
{ {
/**
* Gets the username of the member.
*
* @return the username
*/
String getUsername();
/** /**
* Gets the world the member is in. * Gets the world the member is in.
* *

View File

@@ -27,4 +27,19 @@ package net.runelite.api;
/** /**
* Represents the friend and ignore list manager. * Represents the friend and ignore list manager.
*/ */
public interface FriendManager {} public interface ClanMemberManager extends NameableContainer<ClanMember>
{
/**
* Gets the clan owner of the currently joined clan chat
*
* @return
*/
String getClanOwner();
/**
* Gets the clan chat name of the currently joined clan chat
*
* @return
*/
String getClanChatName();
}

View File

@@ -1195,58 +1195,20 @@ public interface Client extends GameShell
boolean isFriended(String name, boolean mustBeLoggedIn); boolean isFriended(String name, boolean mustBeLoggedIn);
/** /**
* Gets the number of players in the clan chat. * Retrieve the clan member manager
*
* @return the number of clan chat members
*/ */
int getClanChatCount(); @Nullable
ClanMemberManager getClanMemberManager();
/** /**
* Gets an array of players in the clan chat. * Retrieve the nameable container containing friends
*
* @return the clan chat members, null if not in a clan
*/ */
ClanMember[] getClanMembers(); NameableContainer<Friend> getFriendContainer();
/** /**
* Gets the clan owner of the currently joined clan chat * Retrieve the nameable container containing ignores
*/ */
String getClanOwner(); NameableContainer<Ignore> getIgnoreContainer();
/**
* Gets the clan chat name of the currently joined clan chat
*/
String getClanChatName();
/**
* Gets an array of players in the friends list.
*
* @return the friends list
*/
Friend[] getFriends();
/**
* Gets the number of friends on the friends list.
*/
int getFriendsCount();
/**
* Gets an array of players on the ignore list.
*/
Ignore[] getIgnores();
/**
* Gets the number of ignored players on the ignore list.
*/
int getIgnoreCount();
/**
* Checks whether a player is in the same clan chat.
*
* @param name the name of the player
* @return true if the player is in clan chat
*/
boolean isClanMember(String name);
/** /**
* Gets the clients saved preferences. * Gets the clients saved preferences.

View File

@@ -27,19 +27,4 @@ package net.runelite.api;
/** /**
* Represents a player in the friends list. * Represents a player in the friends list.
*/ */
public interface Friend extends ChatPlayer public interface Friend extends ChatPlayer {}
{
/**
* The name of the player.
*
* @return the name
*/
String getName();
/**
* The previous name the player had.
*
* @return the previous name
*/
String getPrevName();
}

View File

@@ -27,19 +27,4 @@ package net.runelite.api;
/** /**
* An entry on the ignore list. * An entry on the ignore list.
*/ */
public interface Ignore extends Nameable public interface Ignore extends Nameable {}
{
/**
* The name of the player.
*
* @return the name
*/
String getName();
/**
* The previous name the player had.
*
* @return the previous name
*/
String getPrevName();
}

View File

@@ -27,4 +27,19 @@ package net.runelite.api;
/** /**
* Represents a chat entity that has a name. * Represents a chat entity that has a name.
*/ */
public interface Nameable extends Comparable {} public interface Nameable extends Comparable
{
/**
* The name of the player.
*
* @return the name
*/
String getName();
/**
* The previous name the player had.
*
* @return the previous name
*/
String getPrevName();
}

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2018, Adam <Adam@sigterm.info> * Copyright (c) 2019, Adam <Adam@sigterm.info>
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@@ -22,28 +22,29 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
package net.runelite.mixins; package net.runelite.api;
import net.runelite.api.mixins.Inject; public interface NameableContainer<T extends Nameable>
import net.runelite.api.mixins.Mixin;
import net.runelite.rs.api.RSFriend;
import net.runelite.rs.api.RSUsername;
@Mixin(RSFriend.class)
public abstract class RSFriendMixin implements RSFriend
{ {
@Override /**
@Inject * Get the number of members in this container
public String getName() *
{ * @return
return getRsName().getName(); */
} int getCount();
@Override /**
@Inject * Get the members in this container
public String getPrevName() *
{ * @return
RSUsername prevName = getRsPrevName(); */
return prevName == null ? null : prevName.getName(); T[] getMembers();
}
} /**
* Find a nameable by name
*
* @param name the name
* @return
*/
T findByName(String name);
}

View File

@@ -31,13 +31,13 @@ import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import net.runelite.api.ClanMember; import net.runelite.api.ClanMember;
import net.runelite.api.ClanMemberManager;
import net.runelite.api.ClanMemberRank; import net.runelite.api.ClanMemberRank;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.GameState; import net.runelite.api.GameState;
@@ -79,19 +79,15 @@ public class ClanManager
@Override @Override
public ClanMemberRank load(@Nonnull String key) public ClanMemberRank load(@Nonnull String key)
{ {
final ClanMember[] clanMembersArr = client.getClanMembers(); final ClanMemberManager clanMemberManager = client.getClanMemberManager();
if (clanMemberManager == null)
if (clanMembersArr == null || clanMembersArr.length == 0)
{ {
return ClanMemberRank.UNRANKED; return ClanMemberRank.UNRANKED;
} }
return Arrays.stream(clanMembersArr)
.filter(Objects::nonNull) ClanMember clanMember = clanMemberManager.findByName(sanitize(key));
.filter(clanMember -> sanitize(clanMember.getUsername()).equals(sanitize(key))) return clanMember != null ? clanMember.getRank() : ClanMemberRank.UNRANKED;
.map(ClanMember::getRank)
.findAny()
.orElse(ClanMemberRank.UNRANKED);
} }
}); });
@@ -111,6 +107,12 @@ public class ClanManager
eventbus.subscribe(ClanChanged.class, this, this::onClanChanged); eventbus.subscribe(ClanChanged.class, this, this::onClanChanged);
} }
public boolean isClanMember(String name)
{
ClanMemberManager clanMemberManager = client.getClanMemberManager();
return clanMemberManager != null && clanMemberManager.findByName(name) != null;
}
public ClanMemberRank getRank(String playerName) public ClanMemberRank getRank(String playerName)
{ {
return clanRanksCache.getUnchecked(playerName); return clanRanksCache.getUnchecked(playerName);

View File

@@ -43,6 +43,7 @@ public class PlayerManager
private final Client client; private final Client client;
private final ItemManager itemManager; private final ItemManager itemManager;
private final EventBus eventBus; private final EventBus eventBus;
private final ClanManager clanManager;
private final Map<String, PlayerContainer> playerMap = new ConcurrentHashMap<>(); private final Map<String, PlayerContainer> playerMap = new ConcurrentHashMap<>();
private final Map<String, HiscoreResult> resultCache = new ConcurrentHashMap<>(); private final Map<String, HiscoreResult> resultCache = new ConcurrentHashMap<>();
private final ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2); private final ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
@@ -51,12 +52,14 @@ public class PlayerManager
PlayerManager( PlayerManager(
final Client client, final Client client,
final EventBus eventBus, final EventBus eventBus,
final ItemManager itemManager final ItemManager itemManager,
final ClanManager clanManager
) )
{ {
this.client = client; this.client = client;
this.itemManager = itemManager; this.itemManager = itemManager;
this.eventBus = eventBus; this.eventBus = eventBus;
this.clanManager = clanManager;
eventBus.subscribe(PlayerDespawned.class, this, this::onPlayerDespawned); eventBus.subscribe(PlayerDespawned.class, this, this::onPlayerDespawned);
eventBus.subscribe(AnimationChanged.class, this, this::onAnimationChanged); eventBus.subscribe(AnimationChanged.class, this, this::onAnimationChanged);
eventBus.subscribe(PlayerAppearanceChanged.class, this, this::onAppearenceChanged); eventBus.subscribe(PlayerAppearanceChanged.class, this, this::onAppearenceChanged);
@@ -206,7 +209,7 @@ public class PlayerManager
update(player); update(player);
player.setFriend(client.isFriended(player.getName(), false)); player.setFriend(client.isFriended(player.getName(), false));
player.setClan(client.isClanMember(player.getName())); player.setClan(clanManager.isClanMember(player.getName()));
} }
private void onPlayerDespawned(PlayerDespawned event) private void onPlayerDespawned(PlayerDespawned event)

View File

@@ -1,12 +1,12 @@
package net.runelite.mixins; package net.runelite.mixins;
import net.runelite.api.ClanMember;
import net.runelite.api.events.ClanMemberJoined; import net.runelite.api.events.ClanMemberJoined;
import net.runelite.api.events.ClanMemberLeft; import net.runelite.api.events.ClanMemberLeft;
import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Shadow; import net.runelite.api.mixins.Shadow;
import net.runelite.rs.api.RSClanChat; import net.runelite.rs.api.RSClanChat;
import net.runelite.rs.api.RSClanMate;
import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSUser; import net.runelite.rs.api.RSUser;
import net.runelite.rs.api.RSUsername; import net.runelite.rs.api.RSUsername;
@@ -21,7 +21,7 @@ public abstract class RSClanChatMixin implements RSClanChat
@Override @Override
public void rl$add(RSUsername name, RSUsername prevName) public void rl$add(RSUsername name, RSUsername prevName)
{ {
RSClanMate member = findByName(name); ClanMember member = findByName(name);
if (member == null) if (member == null)
{ {
return; return;
@@ -35,7 +35,7 @@ public abstract class RSClanChatMixin implements RSClanChat
@Override @Override
public void rl$remove(RSUser nameable) public void rl$remove(RSUser nameable)
{ {
RSClanMate member = findByName(nameable.getRsName()); ClanMember member = findByName(nameable.getRsName());
if (member == null) if (member == null)
{ {
return; return;

View File

@@ -8,13 +8,6 @@ import net.runelite.rs.api.RSClanMate;
@Mixin(RSClanMate.class) @Mixin(RSClanMate.class)
public abstract class RSClanMateMixin implements RSClanMate public abstract class RSClanMateMixin implements RSClanMate
{ {
@Override
@Inject
public String getUsername()
{
return getRsName().getName();
}
@Override @Override
@Inject @Inject
public ClanMemberRank getRank() public ClanMemberRank getRank()

View File

@@ -28,7 +28,6 @@ import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.HashSet; import java.util.HashSet;
@@ -39,7 +38,6 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.inject.Named; import javax.inject.Named;
import net.runelite.api.ChatMessageType; import net.runelite.api.ChatMessageType;
import net.runelite.api.ClanMember;
import net.runelite.api.EnumDefinition; import net.runelite.api.EnumDefinition;
import net.runelite.api.Friend; import net.runelite.api.Friend;
import net.runelite.api.GameState; import net.runelite.api.GameState;
@@ -58,6 +56,7 @@ import net.runelite.api.MenuOpcode;
import net.runelite.api.MessageNode; import net.runelite.api.MessageNode;
import net.runelite.api.NPC; import net.runelite.api.NPC;
import net.runelite.api.NPCDefinition; import net.runelite.api.NPCDefinition;
import net.runelite.api.NameableContainer;
import net.runelite.api.Node; import net.runelite.api.Node;
import net.runelite.api.ObjectDefinition; import net.runelite.api.ObjectDefinition;
import net.runelite.api.Player; import net.runelite.api.Player;
@@ -113,12 +112,9 @@ import net.runelite.api.widgets.WidgetItem;
import net.runelite.api.widgets.WidgetType; import net.runelite.api.widgets.WidgetType;
import net.runelite.rs.api.RSAbstractArchive; import net.runelite.rs.api.RSAbstractArchive;
import net.runelite.rs.api.RSChatChannel; import net.runelite.rs.api.RSChatChannel;
import net.runelite.rs.api.RSClanChat;
import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSEnumDefinition; import net.runelite.rs.api.RSEnumDefinition;
import net.runelite.rs.api.RSFriendSystem; import net.runelite.rs.api.RSFriendSystem;
import net.runelite.rs.api.RSFriendsList;
import net.runelite.rs.api.RSIgnoreList;
import net.runelite.rs.api.RSIndexedSprite; import net.runelite.rs.api.RSIndexedSprite;
import net.runelite.rs.api.RSItemContainer; import net.runelite.rs.api.RSItemContainer;
import net.runelite.rs.api.RSNPC; import net.runelite.rs.api.RSNPC;
@@ -905,124 +901,16 @@ public abstract class RSClientMixin implements RSClient
@Inject @Inject
@Override @Override
public int getClanChatCount() public NameableContainer<Friend> getFriendContainer()
{ {
final RSClanChat clanMemberManager = getClanMemberManager(); return getFriendManager().getFriendContainer();
return clanMemberManager != null ? clanMemberManager.getCount() : 0;
} }
@Inject @Inject
@Override @Override
public ClanMember[] getClanMembers() public NameableContainer<Ignore> getIgnoreContainer()
{ {
final RSClanChat clanMemberManager = getClanMemberManager(); return getFriendManager().getIgnoreContainer();
if (clanMemberManager == null)
{
return null;
}
final int count = clanMemberManager.getCount();
return Arrays.copyOf(clanMemberManager.getNameables(), count);
}
@Inject
@Override
public String getClanOwner()
{
return getClanMemberManager().getClanOwner();
}
@Inject
@Override
public String getClanChatName()
{
return getClanMemberManager().getClanChatName();
}
@Inject
@Override
public Friend[] getFriends()
{
final RSFriendSystem friendManager = getFriendManager();
if (friendManager == null)
{
return null;
}
final RSFriendsList friendContainer = friendManager.getFriendContainer();
if (friendContainer == null)
{
return null;
}
final int count = friendContainer.getCount();
return Arrays.copyOf(friendContainer.getNameables(), count);
}
@Inject
@Override
public int getFriendsCount()
{
final RSFriendSystem friendManager = getFriendManager();
if (friendManager == null)
{
return -1;
}
final RSFriendsList friendContainer = friendManager.getFriendContainer();
if (friendContainer == null)
{
return -1;
}
return friendContainer.getCount();
}
@Inject
@Override
public Ignore[] getIgnores()
{
final RSFriendSystem friendManager = getFriendManager();
if (friendManager == null)
{
return null;
}
final RSIgnoreList ignoreContainer = friendManager.getIgnoreContainer();
if (ignoreContainer == null)
{
return null;
}
final int count = ignoreContainer.getCount();
return Arrays.copyOf(ignoreContainer.getNameables(), count);
}
@Inject
@Override
public int getIgnoreCount()
{
final RSFriendSystem friendManager = getFriendManager();
if (friendManager == null)
{
return -1;
}
final RSIgnoreList ignoreContainer = friendManager.getIgnoreContainer();
if (ignoreContainer == null)
{
return -1;
}
return ignoreContainer.getCount();
}
@Inject
@Override
public boolean isClanMember(String name)
{
final RSClanChat clanMemberManager = getClanMemberManager();
return clanMemberManager != null && clanMemberManager.isMember(createName(name, getLoginType()));
} }
@FieldHook("isDraggingWidget") @FieldHook("isDraggingWidget")

View File

@@ -78,6 +78,6 @@ public abstract class RSMessageMixin implements RSMessage
{ {
RSClanChat cc = client.getClanMemberManager(); RSClanChat cc = client.getClanMemberManager();
return cc != null && cc.isMember(this.getSenderUsername()); return cc != null && cc.findByName(this.getSenderUsername()) != null;
} }
} }

View File

@@ -1,8 +1,12 @@
package net.runelite.mixins; package net.runelite.mixins;
import java.util.Arrays;
import net.runelite.api.Nameable;
import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.MethodHook; import net.runelite.api.mixins.MethodHook;
import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Shadow;
import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSUser; import net.runelite.rs.api.RSUser;
import net.runelite.rs.api.RSUserList; import net.runelite.rs.api.RSUserList;
import net.runelite.rs.api.RSUsername; import net.runelite.rs.api.RSUsername;
@@ -10,6 +14,9 @@ import net.runelite.rs.api.RSUsername;
@Mixin(RSUserList.class) @Mixin(RSUserList.class)
public abstract class RSUserListMixin implements RSUserList public abstract class RSUserListMixin implements RSUserList
{ {
@Shadow("client")
private static RSClient client;
/** /**
* Default implementation of rl$add * Default implementation of rl$add
* *
@@ -46,4 +53,20 @@ public abstract class RSUserListMixin implements RSUserList
{ {
rl$remove(nameable); rl$remove(nameable);
} }
@Inject
@Override
public Nameable[] getMembers()
{
Nameable[] nameables = this.getNameables();
int count = this.getCount();
return Arrays.copyOf(nameables, count);
}
@Inject
@Override
public Nameable findByName(String name)
{
return findByName(client.createName(name, client.getLoginType()));
}
} }

View File

@@ -2,11 +2,11 @@ package net.runelite.mixins;
import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Mixin;
import net.runelite.rs.api.RSIgnored; import net.runelite.rs.api.RSUser;
import net.runelite.rs.api.RSUsername; import net.runelite.rs.api.RSUsername;
@Mixin(RSIgnored.class) @Mixin(RSUser.class)
public abstract class RSIgnoredMixin implements RSIgnored public abstract class RSUserMixin implements RSUser
{ {
@Override @Override
@Inject @Inject

View File

@@ -1,8 +1,10 @@
package net.runelite.rs.api; package net.runelite.rs.api;
import net.runelite.api.ClanMember;
import net.runelite.api.ClanMemberManager;
import net.runelite.mapping.Import; import net.runelite.mapping.Import;
public interface RSClanChat extends RSUserList<RSClanMate> public interface RSClanChat extends RSUserList<ClanMember>, ClanMemberManager
{ {
@Import("owner") @Import("owner")
String getClanOwner(); String getClanOwner();

View File

@@ -1,9 +1,8 @@
package net.runelite.rs.api; package net.runelite.rs.api;
import net.runelite.api.FriendManager;
import net.runelite.mapping.Import; import net.runelite.mapping.Import;
public interface RSFriendSystem extends FriendManager public interface RSFriendSystem
{ {
@Import("friendsList") @Import("friendsList")
RSFriendsList getFriendContainer(); RSFriendsList getFriendContainer();

View File

@@ -1,3 +1,6 @@
package net.runelite.rs.api; package net.runelite.rs.api;
public interface RSFriendsList extends RSUserList<RSFriend> {} import net.runelite.api.Friend;
import net.runelite.api.NameableContainer;
public interface RSFriendsList extends NameableContainer<Friend> {}

View File

@@ -1,3 +1,6 @@
package net.runelite.rs.api; package net.runelite.rs.api;
public interface RSIgnoreList extends RSUserList<RSIgnored> {} import net.runelite.api.Ignore;
import net.runelite.api.NameableContainer;
public interface RSIgnoreList extends NameableContainer<Ignore> {}

View File

@@ -1,18 +1,17 @@
package net.runelite.rs.api; package net.runelite.rs.api;
import net.runelite.api.Nameable;
import net.runelite.api.NameableContainer;
import net.runelite.mapping.Import; import net.runelite.mapping.Import;
public interface RSUserList<T extends RSUser> public interface RSUserList<T extends Nameable> extends NameableContainer<T>
{ {
@Import("array")
Nameable[] getNameables();
@Import("getSize") @Import("getSize")
int getCount(); int getCount();
@Import("array")
T[] getNameables();
@Import("contains")
boolean isMember(RSUsername var1);
@Import("getByUsername") @Import("getByUsername")
T findByName(RSUsername name); T findByName(RSUsername name);