TextTemplates

Les TextTemplates sont une façon facile et pratique de stocker les messages avec des éléments variables. Par exemple, vous pouvez vous trouver vous-même désireux de créer un message configurable pour les joueurs qui rejoignent le serveur pour la première fois. Cela est facilement réalisable avec les TextTemplates en utilisant la stratégie suivante :

Disons que nous voulons créer un message de connexion où le texte est tout jaune et en italique sauf le nom du joueur, qui sera en gras et en couleur aqua, et le nom du serveur qui sera en gras et rouge. Nous pouvons créer un template de cette description en utilisant le code suivant :

import static org.spongepowered.api.text.TextTemplate.*;
import org.spongepowered.api.text.TextTemplate;
import org.spongepowered.api.text.format.TextColor;
import org.spongepowered.api.text.format.TextStyle;

TextTemplate template = of(
    TextColors.YELLOW, TextStyles.ITALIC, "Welcome to ",
    arg("server").color(TextColors.RED).style(TextStyles.BOLD), " ",
    arg("player").color(TextColors.AQUA).style(TextStyles.BOLD), "!"
);

Vous pouvez obtenir le résultat de ce text template avec la méthoe TextTemplate#apply(). La méthode apply() accepte une Map<String, TextElement> de paramètres, où les clés sont les noms des arguments et les valeurs sont les TextElement par lesquels vous souhaitez remplacer les arguments.

Note

Sauf si un argument est spécifié comme « optionnel » via Arg.optional(), quand il est créé, les paramètres manquants fournis à la méthode apply() vont lever une TextTemplateArgumentException. Les arguments peuvent également spécifier une valeur par défaut lors de leur création avec Arg.defaultValue()

Note

Bien que les arguments peuvent avoir du formatage de texte qui leur sont associés, il peut être remplacé en fournissant un objet Text avec un formatage personnalisé à la map de paramètres via la méthode apply().

Les TextTemplates, comme les objets Text eux-mêmes, sont sérialisables à Configurate. Pour sauvegarder un TextTemplate dans un fichier de configuration, utilisez le code suivant. Nous allons également ajouter un paramètre ici pour que l’utilisateur puisse définir le nom de son serveur.

Astuce

Pour en savoir plus sur comment utiliser Configurate pour créer des fichiers de configuration pour vos plugins, veuillez vous reporter à Configuration des plugins.

import ninja.leaping.configurate.ConfigurationNode;
import com.google.common.reflect.TypeToken;

ConfigurationNode node = loader.load();
node.getNode("serverName").setValue("My Sponge Server");
node.getNode("mytemplate").setValue(TypeToken.of(TextTemplate.class), template);
loader.save(node);

Cela va produire l’affichage suivant :

serverName="My Sponge Server"
mytemplate {
    arguments {
        player {
            optional=false
        }
        server {
            optional=false
        }
    }
    content {
        color=yellow
        extra=[
            "Welcome to ",
            {
                bold=true
                color=red
                text="{server}"
            },
            " ",
            {
                bold=true
                color=aqua
                text="{player}"
            },
            "!"
        ]
        italic=true
        text=""
    }
    options {
        closeArg="}"
        openArg="{"
    }
}

Vous pouvez récupérer des TextTemplates depuis les configurations à l’aide du code suivant :

TextTemplate template = node.getNode("mytemplate").getValue(TypeToken.of(TextTemplate.class));

Une fois que vous êtes satisfait de la mise en page de votre nouveau TextTemplate, allons de l’avant et envoyons-le au serveur quand un joueur rejoint le serveur pour la première fois. Nous pouvons y parvenir en utilisant le code suivant :

Astuce

Pour en savoir plus sur la façon de gérer des événements, veuillez vous reporter à Événements.

import com.google.common.collect.ImmutableMap;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.data.key.Keys;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.network.ClientConnectionEvent;
import org.spongepowered.api.text.Text;
import java.time.Instant;
import java.util.Optional;

@Listener
public void onJoin(ClientConnectionEvent.Join event) {
    Player player = event.getTargetEntity();
    Instant firstPlayed = player.firstPlayed().get();
    Instant lastPlayed = player.lastPlayed().get();
    if (firstPlayed.equals(lastPlayed)) {
        // Player has not been to this server before
        // First we will get the server name from our configuration file
        String serverName = node.getNode("serverName").getString();
        // Next we will send the template to the server,
        // using the "server" and "player" template parameters
        Text message = this.template.apply(ImmutableMap.of(
                "server", Text.of(serverName), "player", Text.of(player.getName())
        )).build();
        event.setMessage(message);
    }
}