playerscouter: fix conmod exception, and various other updates. (#1294)

* playerscouter: fix conmod exception, and various other updates.

* playerscouter: revert config caching removal.
This commit is contained in:
Ganom
2019-08-14 21:11:05 -04:00
committed by GitHub
parent a3c3b9edf6
commit dd4986a9dd
3 changed files with 159 additions and 126 deletions

View File

@@ -31,30 +31,25 @@ import lombok.ToString;
import net.runelite.api.Player; import net.runelite.api.Player;
import net.runelite.http.api.hiscore.HiscoreResult; import net.runelite.http.api.hiscore.HiscoreResult;
/*
You may be asking, why in the fuck is there so much information
being gathered? The answer is, why not. Always plan for the future.
Better to have too much than to have too little.
*/
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
@Setter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE)
@ToString(exclude = "player") @ToString(exclude = "player")
class PlayerContainer class PlayerContainer
{ {
private boolean httpRetry;
private boolean scouted;
private HiscoreResult skills; private HiscoreResult skills;
private int prayer;
private int risk;
private int scoutTimer;
private int weapon;
private int wildyLevel;
private LinkedHashMap<Integer, Integer> gear; private LinkedHashMap<Integer, Integer> gear;
private LinkedHashMap<Integer, Integer> riskedGear; private LinkedHashMap<Integer, Integer> riskedGear;
private Player player; private Player player;
private String location; private String location;
private String name; private String name;
private String targetString; private String targetString;
private boolean httpRetry;
private boolean scouted;
private int prayer;
private int risk;
private int scoutTimer;
private int weapon;
private int wildyLevel;
PlayerContainer(Player player) PlayerContainer(Player player)
{ {
@@ -66,8 +61,8 @@ class PlayerContainer
this.prayer = -1; this.prayer = -1;
this.risk = 0; this.risk = 0;
this.riskedGear = new LinkedHashMap<>(); this.riskedGear = new LinkedHashMap<>();
this.scouted = false;
this.scoutTimer = 500; this.scoutTimer = 500;
this.scouted = false;
this.skills = null; this.skills = null;
this.targetString = ""; this.targetString = "";
this.weapon = 0; this.weapon = 0;

View File

@@ -94,7 +94,7 @@ public class PlayerScouter extends Plugin
private static final DiscordClient DISCORD_CLIENT = new DiscordClient(); private static final DiscordClient DISCORD_CLIENT = new DiscordClient();
private static final Map<WorldArea, String> WILD_LOCS = WorldLocation.getLocationMap(); private static final Map<WorldArea, String> WILD_LOCS = WorldLocation.getLocationMap();
private static final SimpleDateFormat SDF = new SimpleDateFormat("MMM dd h:mm a z"); private static final SimpleDateFormat SDF = new SimpleDateFormat("MMM dd h:mm a z");
private static final String ICONBASEURL = "https://www.osrsbox.com/osrsbox-db/items-icons/"; // Add item id + ".png" private static final String ICON_URL = "https://www.osrsbox.com/osrsbox-db/items-icons/"; // Add item id + ".png"
@Inject @Inject
private Client client; private Client client;
@Inject @Inject
@@ -103,17 +103,18 @@ public class PlayerScouter extends Plugin
private PlayerScouterConfig config; private PlayerScouterConfig config;
@Inject @Inject
private EventBus eventBus; private EventBus eventBus;
private Set<PlayerContainer> playerContainer = new HashSet<>(); private final ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
private ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2); private final Set<PlayerContainer> playerContainer = new HashSet<>();
private Map<HiscoreResult, String> resultCache = new HashMap<>(); private final Map<String, HiscoreResult> resultCache = new HashMap<>();
private Map<String, Integer> blacklist = new HashMap<>(); private final Map<String, Integer> blacklist = new HashMap<>();
private HttpUrl url; private HttpUrl webhook;
private int minimumRisk; private int minimumRisk;
private int minimumValue; private int minimumValue;
private int timeout; private int timeout;
private boolean onlyWildy; private boolean onlyWildy;
private boolean outputItems; private boolean outputItems;
private boolean scoutFriends;
private boolean scoutClan;
@Provides @Provides
PlayerScouterConfig provideConfig(ConfigManager configManager) PlayerScouterConfig provideConfig(ConfigManager configManager)
@@ -125,8 +126,15 @@ public class PlayerScouter extends Plugin
protected void startUp() protected void startUp()
{ {
blacklist.clear(); blacklist.clear();
updateConfig();
addSubscriptions(); addSubscriptions();
updateConfig();
if (client.getGameState() == GameState.LOGGED_IN)
{
for (Player player : client.getPlayers())
{
addPlayer(player);
}
}
} }
@Override @Override
@@ -195,14 +203,17 @@ public class PlayerScouter extends Plugin
private void onPlayerSpawned(PlayerSpawned event) private void onPlayerSpawned(PlayerSpawned event)
{ {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
addPlayer(player);
}
if (player == client.getLocalPlayer()) private void addPlayer(Player player)
{ {
return; if (player == client.getLocalPlayer()
} || (!blacklist.isEmpty() && blacklist.containsKey(player.getName()))
|| (!this.scoutFriends && client.isFriended(player.getName(), false)
if (!blacklist.isEmpty() && blacklist.keySet().contains(player.getName())) || (!this.scoutClan && client.isClanMember(player.getName()))))
{ {
log.debug("Player Rejected: {}", player.getName());
return; return;
} }
@@ -210,7 +221,6 @@ public class PlayerScouter extends Plugin
blacklist.put(player.getName(), client.getTickCount() + this.timeout); blacklist.put(player.getName(), client.getTickCount() + this.timeout);
} }
private void resetBlacklist() private void resetBlacklist()
{ {
if (blacklist.isEmpty()) if (blacklist.isEmpty())
@@ -218,11 +228,13 @@ public class PlayerScouter extends Plugin
return; return;
} }
blacklist.forEach((k, v) -> Iterator<Map.Entry<String, Integer>> iter = blacklist.entrySet().iterator();
iter.forEachRemaining(entry ->
{ {
if (v == client.getTickCount()) if (entry.getValue() == client.getTickCount())
{ {
blacklist.remove(k, v); iter.remove();
} }
}); });
} }
@@ -233,27 +245,24 @@ public class PlayerScouter extends Plugin
{ {
return true; return true;
} }
return client.getVar(Varbits.IN_WILDERNESS) == 1 || WorldType.isPvpWorld(client.getWorldType()); return client.getVar(Varbits.IN_WILDERNESS) == 1 || WorldType.isPvpWorld(client.getWorldType());
} }
private void updateConfig() private void updateConfig()
{ {
this.url = HttpUrl.parse(config.webhook()); this.webhook = HttpUrl.parse(config.webhook());
this.minimumRisk = config.minimumRisk(); this.minimumRisk = config.minimumRisk();
this.minimumValue = config.minimumValue(); this.minimumValue = config.minimumValue();
this.timeout = config.timeout(); this.timeout = config.timeout();
this.onlyWildy = config.onlyWildy(); this.onlyWildy = config.onlyWildy();
this.outputItems = config.outputItems(); this.outputItems = config.outputItems();
this.scoutClan = config.scoutClan();
this.scoutFriends = config.scoutFriends();
} }
private void update(PlayerContainer player) private void update(PlayerContainer player)
{ {
player.setRisk(0);
updatePlayerGear(player);
updateStats(player);
player.setLocation(location(player));
player.setWildyLevel(PvPUtil.getWildernessLevelFrom(player.getPlayer().getWorldLocation()));
player.setTargetString(targetStringBuilder(player));
if (player.isScouted()) if (player.isScouted())
{ {
player.setScoutTimer(player.getScoutTimer() - 1); player.setScoutTimer(player.getScoutTimer() - 1);
@@ -262,39 +271,37 @@ public class PlayerScouter extends Plugin
player.setScouted(false); player.setScouted(false);
player.setScoutTimer(500); player.setScoutTimer(500);
} }
return;
} }
player.setRisk(0);
updatePlayerGear(player);
updateStats(player);
player.setLocation(location(player));
player.setWildyLevel(PvPUtil.getWildernessLevelFrom(player.getPlayer().getWorldLocation()));
player.setTargetString(targetStringBuilder(player));
log.debug(player.toString()); log.debug(player.toString());
} }
private void updateStats(PlayerContainer player) private void updateStats(PlayerContainer player)
{ {
if (player.getSkills() == null) if (player.isHttpRetry() || player.getSkills() != null)
{ {
if (player.isHttpRetry()) return;
}
executorService.submit(() ->
{
player.setHttpRetry(true);
HiscoreResult result;
if (resultCache.containsKey(player.getName()))
{ {
return; result = resultCache.get(player.getName());
} }
executorService.submit(() -> else
{ {
player.setHttpRetry(true);
HiscoreResult result = null;
try try
{ {
if (!resultCache.values().contains(player.getName())) result = HISCORE_CLIENT.lookup(player.getName());
{
result = HISCORE_CLIENT.lookup(player.getName());
}
else
{
for (Map.Entry<HiscoreResult, String> entry : resultCache.entrySet())
{
if (!entry.getValue().equals(player.getName()))
{
continue;
}
result = entry.getKey();
}
}
} }
catch (IOException ex) catch (IOException ex)
{ {
@@ -302,65 +309,71 @@ public class PlayerScouter extends Plugin
player.setHttpRetry(false); player.setHttpRetry(false);
return; return;
} }
resultCache.put(result, player.getName()); }
if (result == null)
{
player.setHttpRetry(false); player.setHttpRetry(false);
player.setSkills(result); return;
player.setPrayer(player.getSkills().getPrayer().getLevel()); }
}); resultCache.put(player.getName(), result);
} player.setSkills(result);
player.setPrayer(player.getSkills().getPrayer().getLevel());
});
} }
private void updatePlayerGear(PlayerContainer player) private void updatePlayerGear(PlayerContainer player)
{ {
Map<Integer, Integer> prices = new HashMap<>(); Map<Integer, Integer> prices = new HashMap<>();
if (player.getPlayer().getPlayerAppearance() != null) if (player.getPlayer().getPlayerAppearance() == null)
{ {
for (KitType kitType : KitType.values()) return;
{
if (kitType.equals(KitType.RING) || kitType.equals(KitType.AMMUNITION))
{
continue;
}
final int id = player.getPlayer().getPlayerAppearance().getEquipmentId(kitType);
if (id == -1)
{
continue;
}
if (kitType.equals(KitType.WEAPON))
{
player.setWeapon(id);
}
final ItemStats item = itemManager.getItemStats(id, false);
final ItemDefinition itemDefinition = itemManager.getItemDefinition(id);
if (item == null)
{
log.debug("Item is null: {}", id);
continue;
}
if (PvPValueBrokenItem.breaksOnDeath(id))
{
prices.put(id, itemManager.getBrokenValue(id));
log.debug("Item has a broken value: Id {}, Value {}", id, itemManager.getBrokenValue(id));
}
if (!itemDefinition.isTradeable() && !PvPValueBrokenItem.breaksOnDeath(id))
{
prices.put(id, itemDefinition.getPrice());
}
else if (itemDefinition.isTradeable())
{
prices.put(id, itemManager.getItemPrice(id, false));
}
}
updateGear(player, prices);
} }
for (KitType kitType : KitType.values())
{
if (kitType.equals(KitType.RING) || kitType.equals(KitType.AMMUNITION))
{
continue;
}
final int id = player.getPlayer().getPlayerAppearance().getEquipmentId(kitType);
if (id == -1)
{
continue;
}
if (kitType.equals(KitType.WEAPON))
{
player.setWeapon(id);
}
final ItemStats item = itemManager.getItemStats(id, false);
final ItemDefinition itemDefinition = itemManager.getItemDefinition(id);
if (item == null)
{
log.debug("Item is null: {}", id);
continue;
}
if (PvPValueBrokenItem.breaksOnDeath(id))
{
prices.put(id, itemManager.getBrokenValue(id));
log.debug("Item has a broken value: Id {}, Value {}", id, itemManager.getBrokenValue(id));
}
if (!itemDefinition.isTradeable() && !PvPValueBrokenItem.breaksOnDeath(id))
{
prices.put(id, itemDefinition.getPrice());
}
else if (itemDefinition.isTradeable())
{
prices.put(id, itemManager.getItemPrice(id, false));
}
}
updateGear(player, prices);
} }
private void updateGear(PlayerContainer player, Map<Integer, Integer> prices) private void updateGear(PlayerContainer player, Map<Integer, Integer> prices)
@@ -462,7 +475,7 @@ public class PlayerScouter extends Plugin
} }
ThumbnailEmbed image = ThumbnailEmbed.builder() ThumbnailEmbed image = ThumbnailEmbed.builder()
.url(ICONBASEURL + player.getWeapon() + ".png") .url(ICON_URL + player.getWeapon() + ".png")
.build(); .build();
fieldList.add(FieldEmbed.builder() fieldList.add(FieldEmbed.builder()
@@ -510,14 +523,16 @@ public class PlayerScouter extends Plugin
.value("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") .value("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
.build()); .build());
final int[] items = {0}; int items = 0;
player.getRiskedGear().forEach((gear, value) -> for (Map.Entry<Integer, Integer> entry : player.getRiskedGear().entrySet())
{ {
Integer gear = entry.getKey();
Integer value = entry.getValue();
if (value <= 0 || value <= this.minimumValue) if (value <= 0 || value <= this.minimumValue)
{ {
items[0]++; items++;
return; continue;
} }
ItemStats item = itemManager.getItemStats(gear, false); ItemStats item = itemManager.getItemStats(gear, false);
@@ -525,7 +540,7 @@ public class PlayerScouter extends Plugin
if (item == null) if (item == null)
{ {
log.error("Item is Null: {}", gear); log.error("Item is Null: {}", gear);
return; continue;
} }
fieldList.add(FieldEmbed.builder() fieldList.add(FieldEmbed.builder()
@@ -533,19 +548,19 @@ public class PlayerScouter extends Plugin
.value("Value: " + StackFormatter.quantityToRSDecimalStack(value)) .value("Value: " + StackFormatter.quantityToRSDecimalStack(value))
.inline(true) .inline(true)
.build()); .build());
}); }
if (items[0] > 0) if (items > 0)
{ {
fieldList.add(FieldEmbed.builder() fieldList.add(FieldEmbed.builder()
.name("Items below value: " + this.minimumValue) .name("Items below value: " + this.minimumValue)
.value(Integer.toString(items[0])) .value(Integer.toString(items))
.inline(true) .inline(true)
.build()); .build());
} }
} }
String icon = ICONBASEURL + Objects.requireNonNull(getEntry(player.getGear())).getKey() + ".png"; String icon = ICON_URL + Objects.requireNonNull(getEntry(player.getGear())).getKey() + ".png";
String name = "☠️ " + player.getName() + " ☠️"; String name = "☠️ " + player.getName() + " ☠️";
if (player.getPlayer().getSkullIcon() == null) if (player.getPlayer().getSkullIcon() == null)
@@ -560,7 +575,7 @@ public class PlayerScouter extends Plugin
private void message(String name, String iconUrl, ThumbnailEmbed thumbnail, List<FieldEmbed> fields, String color) private void message(String name, String iconUrl, ThumbnailEmbed thumbnail, List<FieldEmbed> fields, String color)
{ {
log.debug("Message Contents: {}, {}, {}, {}, {}", name, " ", thumbnail, Arrays.toString(fields.toArray()), this.url); log.debug("Message Contents: {}, {}, {}, {}, {}", name, " ", thumbnail, Arrays.toString(fields.toArray()), this.webhook);
log.debug("Fields: {}", fields); log.debug("Fields: {}", fields);
if (name.isEmpty() || fields.isEmpty()) if (name.isEmpty() || fields.isEmpty())
@@ -588,7 +603,7 @@ public class PlayerScouter extends Plugin
DiscordMessage discordMessage = new DiscordMessage("Gabon Scouter", " ", "https://i.imgur.com/2A6dr7q.png"); DiscordMessage discordMessage = new DiscordMessage("Gabon Scouter", " ", "https://i.imgur.com/2A6dr7q.png");
discordMessage.getEmbeds().add(discordEmbed); discordMessage.getEmbeds().add(discordEmbed);
DISCORD_CLIENT.message(this.url, discordMessage); DISCORD_CLIENT.message(this.webhook, discordMessage);
fields.clear(); fields.clear();
} }

View File

@@ -34,7 +34,8 @@ public interface PlayerScouterConfig extends Config
keyName = "webhook", keyName = "webhook",
name = "Webhook Url", name = "Webhook Url",
description = "Input the url for your webhook.", description = "Input the url for your webhook.",
position = 0 position = 0,
secret = true
) )
default String webhook() default String webhook()
{ {
@@ -52,11 +53,33 @@ public interface PlayerScouterConfig extends Config
return true; return true;
} }
@ConfigItem(
keyName = "scoutClan",
name = "Scout Clan Members",
description = "Enable this to scout clan members.",
position = 2
)
default boolean scoutClan()
{
return true;
}
@ConfigItem(
keyName = "scoutFriends",
name = "Scout Friends",
description = "Enable this to scout friends.",
position = 3
)
default boolean scoutFriends()
{
return true;
}
@ConfigItem( @ConfigItem(
keyName = "outputItems", keyName = "outputItems",
name = "Output Items", name = "Output Items",
description = "This will output all of their risked gear to the webhook.", description = "This will output all of their risked gear to the webhook.",
position = 2 position = 4
) )
default boolean outputItems() default boolean outputItems()
{ {
@@ -67,7 +90,7 @@ public interface PlayerScouterConfig extends Config
keyName = "minimumRisk", keyName = "minimumRisk",
name = "Minimum Risk", name = "Minimum Risk",
description = "Minimum risk for the player to be scouted.", description = "Minimum risk for the player to be scouted.",
position = 3 position = 5
) )
default int minimumRisk() default int minimumRisk()
{ {
@@ -78,7 +101,7 @@ public interface PlayerScouterConfig extends Config
keyName = "minimumValue", keyName = "minimumValue",
name = "Minimum Value", name = "Minimum Value",
description = "Minimum value for the item to be posted on discord.", description = "Minimum value for the item to be posted on discord.",
position = 4 position = 6
) )
default int minimumValue() default int minimumValue()
{ {
@@ -89,7 +112,7 @@ public interface PlayerScouterConfig extends Config
keyName = "timeout", keyName = "timeout",
name = "Timeout", name = "Timeout",
description = "Minimum amount of ticks before the player can be scouted again. (1 tick = 600ms)", description = "Minimum amount of ticks before the player can be scouted again. (1 tick = 600ms)",
position = 5 position = 7
) )
default int timeout() default int timeout()
{ {