Search in sources :

Example 1 with DataKey

use of de.codecrafter47.data.api.DataKey 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.");
    }
}
Also used : ProxiedPlayer(net.md_5.bungee.api.connection.ProxiedPlayer) BungeePlayer(codecrafter47.bungeetablistplus.player.BungeePlayer) DataKey(de.codecrafter47.data.api.DataKey) IOException(java.io.IOException) ByteArrayDataInput(com.google.common.io.ByteArrayDataInput) RedisPlayer(codecrafter47.bungeetablistplus.player.RedisPlayer) DataCache(de.codecrafter47.data.api.DataCache) EventHandler(net.md_5.bungee.event.EventHandler)

Example 2 with DataKey

use of de.codecrafter47.data.api.DataKey in project BungeeTabListPlus by CodeCrafter47.

the class PlayerPlaceholderResolver method resolve.

@Nonnull
@Override
public PlaceholderBuilder<?, ?> resolve(PlaceholderBuilder<Player, ?> builder, List<PlaceholderArg> args, TemplateCreationContext tcc) throws UnknownPlaceholderException, PlaceholderException {
    if (!args.isEmpty() && aliasMap.containsKey(args.get(0).getText())) {
        String replacement = aliasMap.get(args.get(0).getText());
        tcc.getErrorHandler().addWarning("Placeholder '" + args.get(0).getText() + "' has been deprecated. Use '" + replacement + "' instead.", null);
        args.set(0, new PlaceholderArg.Text(replacement));
    }
    try {
        return super.resolve(builder, args, tcc);
    } catch (UnknownPlaceholderException e) {
        if (!args.isEmpty()) {
            String id = args.get(0).getText().toLowerCase();
            PlaceholderBuilder<?, ?> result = null;
            if (customPlaceholderDataKeys.containsKey(id)) {
                DataKey<String> dataKey = customPlaceholderDataKeys.get(id);
                result = builder.acquireData(new PlayerPlaceholderDataProviderSupplier<>(TypeToken.STRING, dataKey, (player, replacement) -> replacement), TypeToken.STRING);
            } else if (bridgeCustomPlaceholderDataKeys.containsKey(id)) {
                DataKey<String> dataKey = bridgeCustomPlaceholderDataKeys.get(id);
                result = builder.acquireData(new PlayerPlaceholderDataProviderSupplier<>(TypeToken.STRING, dataKey, (player, replacement) -> replacement), TypeToken.STRING);
            } else {
                for (String prefix : placeholderAPIPluginPrefixes) {
                    if (id.length() >= prefix.length() && id.substring(0, prefix.length()).equalsIgnoreCase(prefix)) {
                        id = args.remove(0).getText();
                        val resolver = create(BTLPDataKeys.createPlaceholderAPIDataKey("%" + id + "%"));
                        addPlaceholder(id, resolver);
                        return resolver.resolve(builder, args, tcc);
                    }
                }
            }
            if (result == null) {
                // prevent errors because bridge information has not been synced yet
                if (cache.getCustomPlaceholdersBridge().contains(id)) {
                    result = builder.acquireData(new PlayerPlaceholderDataProviderSupplier<>(TypeToken.STRING, BTLPDataKeys.createThirdPartyVariableDataKey(id), (player, replacement) -> replacement), TypeToken.STRING);
                } else {
                    for (String prefix : cache.getPAPIPrefixes()) {
                        if (id.length() >= prefix.length() && id.substring(0, prefix.length()).equalsIgnoreCase(prefix)) {
                            result = builder.acquireData(new PlayerPlaceholderDataProviderSupplier<>(TypeToken.STRING, BTLPDataKeys.createPlaceholderAPIDataKey("%" + id + "%"), (player, replacement) -> replacement), TypeToken.STRING);
                        }
                    }
                }
            }
            if (result != null) {
                args.remove(0);
                return result;
            }
        }
        throw e;
    }
}
Also used : Player(de.codecrafter47.taboverlay.config.player.Player) ToStringExpression(de.codecrafter47.taboverlay.config.expression.ToStringExpression) java.util(java.util) ExpressionTemplate(de.codecrafter47.taboverlay.config.expression.template.ExpressionTemplate) DataKey(de.codecrafter47.data.api.DataKey) lombok.val(lombok.val) AbstractActiveElement(de.codecrafter47.taboverlay.config.view.AbstractActiveElement) Function(java.util.function.Function) ExpressionUpdateListener(de.codecrafter47.taboverlay.config.expression.ExpressionUpdateListener) BukkitData(de.codecrafter47.data.bukkit.api.BukkitData) de.codecrafter47.taboverlay.config.placeholder(de.codecrafter47.taboverlay.config.placeholder) TypeToken(de.codecrafter47.data.api.TypeToken) TemplateCreationContext(de.codecrafter47.taboverlay.config.template.TemplateCreationContext) SpongeData(de.codecrafter47.data.sponge.api.SpongeData) Cache(codecrafter47.bungeetablistplus.cache.Cache) BungeeData(de.codecrafter47.data.bungee.api.BungeeData) MinecraftData(de.codecrafter47.data.minecraft.api.MinecraftData) BTLPDataKeys(codecrafter47.bungeetablistplus.common.BTLPDataKeys) Context(de.codecrafter47.taboverlay.config.context.Context) Nonnull(javax.annotation.Nonnull) BTLPBungeeDataKeys(codecrafter47.bungeetablistplus.data.BTLPBungeeDataKeys) lombok.val(lombok.val) DataKey(de.codecrafter47.data.api.DataKey) Nonnull(javax.annotation.Nonnull)

Aggregations

DataKey (de.codecrafter47.data.api.DataKey)2 Cache (codecrafter47.bungeetablistplus.cache.Cache)1 BTLPDataKeys (codecrafter47.bungeetablistplus.common.BTLPDataKeys)1 BTLPBungeeDataKeys (codecrafter47.bungeetablistplus.data.BTLPBungeeDataKeys)1 BungeePlayer (codecrafter47.bungeetablistplus.player.BungeePlayer)1 RedisPlayer (codecrafter47.bungeetablistplus.player.RedisPlayer)1 ByteArrayDataInput (com.google.common.io.ByteArrayDataInput)1 DataCache (de.codecrafter47.data.api.DataCache)1 TypeToken (de.codecrafter47.data.api.TypeToken)1 BukkitData (de.codecrafter47.data.bukkit.api.BukkitData)1 BungeeData (de.codecrafter47.data.bungee.api.BungeeData)1 MinecraftData (de.codecrafter47.data.minecraft.api.MinecraftData)1 SpongeData (de.codecrafter47.data.sponge.api.SpongeData)1 Context (de.codecrafter47.taboverlay.config.context.Context)1 ExpressionUpdateListener (de.codecrafter47.taboverlay.config.expression.ExpressionUpdateListener)1 ToStringExpression (de.codecrafter47.taboverlay.config.expression.ToStringExpression)1 ExpressionTemplate (de.codecrafter47.taboverlay.config.expression.template.ExpressionTemplate)1 de.codecrafter47.taboverlay.config.placeholder (de.codecrafter47.taboverlay.config.placeholder)1 Player (de.codecrafter47.taboverlay.config.player.Player)1 TemplateCreationContext (de.codecrafter47.taboverlay.config.template.TemplateCreationContext)1