use of codecrafter47.bungeetablistplus.player.RedisPlayer in project BungeeTabListPlus by CodeCrafter47.
the class RedisPlayerManager method updatePlayers.
private void updatePlayers() {
Set<UUID> playersOnline;
try {
playersOnline = RedisBungee.getApi().getPlayersOnline();
} catch (Throwable th) {
if (!redisBungeeAPIError) {
logger.log(Level.WARNING, "Error using RedisBungee API", th);
redisBungeeAPIError = true;
}
return;
}
redisBungeeAPIError = false;
// fetch names for new players
Map<UUID, String> uuidToNameMap = new Object2ObjectOpenHashMap<>();
for (UUID uuid : playersOnline) {
if (!byUUID.containsKey(uuid) && ProxyServer.getInstance().getPlayer(uuid) == null) {
try {
uuidToNameMap.put(uuid, RedisBungee.getApi().getNameFromUuid(uuid));
} catch (Throwable ex) {
logger.log(Level.WARNING, "Error while using RedisBungee API", ex);
}
}
}
redisConnectionSuccessful = true;
try {
mainThread.submit(() -> {
// remove players which have gone offline
for (Iterator<UUID> iterator = byUUID.keySet().iterator(); iterator.hasNext(); ) {
UUID uuid = iterator.next();
if (!playersOnline.contains(uuid) || ProxyServer.getInstance().getPlayer(uuid) != null) {
RedisPlayer redisPlayer = byUUID.get(uuid);
iterator.remove();
listeners.forEach(listener -> listener.onPlayerRemoved(redisPlayer));
}
}
// add new players
for (UUID uuid : uuidToNameMap.keySet()) {
if (!byUUID.containsKey(uuid) && ProxyServer.getInstance().getPlayer(uuid) == null) {
RedisPlayer redisPlayer = new RedisPlayer(uuid, uuidToNameMap.get(uuid));
byUUID.put(uuid, redisPlayer);
listeners.forEach(listener -> listener.onPlayerAdded(redisPlayer));
}
}
}).sync();
} catch (InterruptedException ignored) {
}
}
use of codecrafter47.bungeetablistplus.player.RedisPlayer in project BungeeTabListPlus by CodeCrafter47.
the class RedisPlayerManager method onRedisMessage.
@EventHandler
@SuppressWarnings("unchecked")
public void onRedisMessage(PubSubMessageEvent event) {
String channel = event.getChannel();
if (channel.equals(CHANNEL_DATA_REQUEST)) {
ByteArrayDataInput input = ByteStreams.newDataInput(Base64.getDecoder().decode(event.getMessage()));
try {
UUID uuid = DataStreamUtils.readUUID(input);
ProxiedPlayer proxiedPlayer = ProxyServer.getInstance().getPlayer(uuid);
if (proxiedPlayer != null) {
BungeePlayer player = bungeePlayerProvider.getPlayerIfPresent(proxiedPlayer);
if (player != null) {
DataKey<?> key = DataStreamUtils.readDataKey(input, keyRegistry, missingDataKeyLogger);
if (key != null) {
player.addDataChangeListener((DataKey<Object>) key, new DataChangeListener(player, (DataKey<Object>) key));
updateData(uuid, (DataKey<Object>) key, player.get(key));
}
}
}
} catch (IOException ex) {
logger.log(Level.SEVERE, "Unexpected error reading redis message", ex);
}
} else if (channel.equals(CHANNEL_DATA_UPDATE)) {
ByteArrayDataInput input = ByteStreams.newDataInput(Base64.getDecoder().decode(event.getMessage()));
try {
UUID uuid = DataStreamUtils.readUUID(input);
RedisPlayer player = byUUID.get(uuid);
if (player != null) {
DataCache cache = player.getData();
DataKey<?> key = DataStreamUtils.readDataKey(input, keyRegistry, missingDataKeyLogger);
if (key != null) {
boolean removed = input.readBoolean();
if (removed) {
mainThread.execute(() -> cache.updateValue(key, null));
} else {
Object value = typeRegistry.getTypeAdapter(key.getType()).read(input);
mainThread.execute(() -> cache.updateValue((DataKey<Object>) key, value));
}
}
}
} catch (IOException ex) {
logger.log(Level.SEVERE, "Unexpected error reading redis message", ex);
}
} else if (channel.equals(CHANNEL_DATA_OLD) || channel.equals(CHANNEL_REQUEST_DATA_OLD)) {
logger.warning("BungeeTabListPlus on at least one proxy in your network is outdated.");
}
}
Aggregations