Relational Placeholders

Relational placeholders work with two users and are useful for comparisons or relationships.


Creating Relational Placeholders

public class RelationNeuron extends BukkitNeuron {
    
    public RelationNeuron(Plugin plugin) {
        super(plugin, Namespace.of("rel"));
        
        // Compare player names
        registerRelational("same_name", context -> {
            String name1 = context.user().getName();
            String name2 = context.other().getName();
            return name1.equals(name2) ? "yes" : "no";
        });
        
        // Distance between players - requires both to be players
        registerRelational("distance", context -> {
            Player player1 = context.user().requirePlayer();
            Player player2 = context.other().requirePlayer();
            
            Location loc1 = player1.getLocation();
            Location loc2 = player2.getLocation();
            double distance = loc1.distance(loc2);
            return String.format("%.2f", distance);
        });
        
        // Mixed example - check if users are in same world
        registerRelational("same_world", context -> {
            Player player1 = context.user().requirePlayer();
            Player player2 = context.other().requirePlayer();
            
            return player1.getWorld().equals(player2.getWorld()) ? "yes" : "no";
        });
    }
}

Usage:

String same = synapse.translate("Same name: ${rel.same_name}", player1, player2);
// Result: "Same name: no"

String distance = synapse.translate("Distance: ${rel.distance} blocks", player1, player2);
// Result: "Distance: 15.67 blocks"

Relational Placeholder Options

Relational placeholders also support caching, but with both users considered:

registerRelational("friendship_level", context -> {
    return calculateRelationship(
        context.user().getUniqueId(),
        context.other().getUniqueId()
    );
}, options -> {
    options.cache(true);                    // Cache relationship data
    options.cacheTTL(10, TimeUnit.MINUTES); // Cache for 10 minutes
});

Available Options:

  • cache(boolean) - Enable result caching per user pair (default: false)
  • cacheTTL(long, TimeUnit) - How long to cache results (default: 20 seconds)

Caching Behavior:

  • Cache key includes both user IDs, namespace, placeholder name, and arguments
  • Cached from the perspective of the primary user
  • Different user pairs create separate cache entries
  • Expensive relationship calculations benefit most from caching