Gestionnaire de Profil de Jeu

Un GameProfile représente le profil d’un joueur, y compris les données comme le nom, l”UUID, et d’autres données arbitraires, connues en tant que propriétés. SpongeAPI fournit la classe GameProfileManager pour récupérer, créer, et remplir les GameProfiles. Vous pouvez obtenir une instance du GameProfileManager en utilisant le code suivant.

import org.spongepowered.api.Sponge;
import org.spongepowered.api.profile.GameProfileManager;

GameProfileManager profileManager = Sponge.getServer().getGameProfileManager();

Récupération de GameProfiles

Il est important de noter que Sponge maintient un cache de GameProfiles à utiliser comme un remplacement au lieu de faire une requête à l’API de Mojang à chaque fois qu’un GameProfile est demandé. Les méthodes pour récupérer des GameProfiles offrent un second argument boolean qui détermine si le cache doit être utilisé ou non. Par défaut, le cache sera utilisé lorsque cela est possible.

Un GameProfile peut être recherché en utilisant soit un UUID ou un pseudo. Notez que le même profil sera toujours retourné quand on recherche avec un UUID, mais comme les pseudos peuvent être changés, ça peut ne pas être nécessairement le cas lorsqu’on recherche avec un pseudo.

Récupération par le pseudo

import org.spongepowered.api.profile.GameProfile;

import java.util.concurrent.CompletableFuture;

CompletableFuture<GameProfile> futureGameProfile = profileManager.get("Notch");

Récupération par l’UUID

import java.util.UUID;

CompletableFuture<GameProfile> futureGameProfile =
    profileManager.get(UUID.fromString("069a79f4-44e9-4726-a5be-fca90e38aaf5"));

Astuce

Vous pouvez aussi récupérer plusieurs GameProfiles à la fois en utilisant GameProfileManager#getAllById(Iterable<UUID>, boolean) ou GameProfileManager#getAllByName(Iterable<String>, boolean). Ces deux méthodes retournent un CompletableFuture<Collection<GameProfile>>.

Notez que chacune de ces méthodes retournent une sorte de CompletableFuture. Cela indique que le GameProfile (ou la Collection<GameProfile>) peut ne pas être disponible immédiatement en raison des requêtes en attente à l’API de Mojang. La Javadocs pour les CompletableFuture décrit toutes les fonctionnalités de la classe, mais nous nous concentrerons sur la méthode get dans le but de cet article.

Pour récupérer un GameProfile depuis un CompletableFuture<GameProfile>, vous pouvez simplement appeler la méthode CompletableFuture#get.

GameProfile gameProfile = futureGameProfile.get();

Avertissement

Si le GameProfile n’est pas disponible immédiatement (si le cache n’est pas utilisé ou ne contient pas le GameProfile), alors get va attendre que le future soit complété. Pour cette raison, il n’est pas conseillé de l’utiliser sur le thread principal puisqu’il arrêtera le serveur. Alternativement, vous pouvez utiliser la méthode CompletableFuture#thenAccept(Consumer<? super T>) pour spécifier un Consumer à être exécuté lors de la complétion.

Création de GameProfiles

Vous pouvez générer un nouveau GameProfile en utilisant GameProfile#of(UUID, String). Notez que le pseudo ne nécessite pas forcément de correspondre à l”UUID de ce joueur. De même, l”UUID n’a pas besoin d’appartenir à un joueur valide.

GameProfile gameProfile = GameProfile.of(
        UUID.fromString("00000000-0000-0000-0000-000000000000"),
        "Herobrine");

Note

Il n’est pas obligatoire de spécifier le nom du GameProfile (null est un argument valide).

Remplissage de GameProfiles

Remplir un GameProfile complète le profile en récupérant les informations comme le skin du player depuis l’API de Mojang. Notez que si de fausses données comme le pseudo sont associées à un certain UUID, il sera remplacé par les données réelles depuis l’API de Mojang.

GameProfile filledProfile = profileManager.fill(gameProfile).get();

ProfileProperties

Les GameProfiles peuvent être utilisés pour stocker des données arbitraires à propos d’un joueur en utilisant les ProfilePropertys. Toutefois, cela ne peut pas être utilisé comme stockage permanent de données, carles données ne persistent pas à travers les redémarrages du serveur. Nous pouvons récupérer les propriétés d’un GameProfile en utilisant la méthode GameProfile#getPropertyMap(), qui retourne un Multimap. Depuis là, vous pouvez récupérer des ProfilePropertys existants ou en stocker de nouveaux, qui sont représentés sous forme d’une pair clé-valeur. Pour générer un nouveau ProfileProperty, appelez simplement la méthode ProfileProperty#of(String, String). Le troisième argument (signature) est optionnel. Cependant, une signature valide de Mojang doit être spécifiée pour certaines propriétés.

import org.spongepowered.api.profile.property.ProfileProperty;

import java.util.Collection;

profile.getPropertyMap().put(
    "key", ProfileProperty.of("foo", "bar", null));
Collection<ProfileProperty> customProperties = profile.getPropertyMap().get("key");

GameProfileCache

Vous pouvez également directement accéder au GameProfileCache utilisé par Sponge pour stocker des GameProfiles. Pour faire ceci, appelez simplement la méthode GameProfileManager#getCache(). En utilisant le GameProfileCache, vous pouvez rechercher des GameProfiles, ajouter des GameProfiles nouvellement construits, et remplir les profils avec des données stockées dans le cache.

import org.spongepowered.api.profile.GameProfileCache;

GameProfile fakeProfile =
    GameProfile.of(UUID.fromString("00000000-0000-0000-0000-000000000000"),
    "Herobrine");
GameProfileCache cache = profileManager.getCache();
cache.add(profile);

Astuce

GameProfileCache#add(GameProfile) accepte également un second argument boolean, qui détermine si les entrées existantes du cache doivent être remplacées, et un troisième argument Date qui définit l’expiration du GameProfile.

Si vous décidez un jour que vous devez retirer un GameProfile du cache, vous pouvez appeler GameProfileCache#remove(GameProfile). Si vous avez besoin de retirer tous les GameProfiles du cache, vous pouvez appeler GameProfileCache#clear().

Le GameProfileCache peut également être défini par des plugins avec la méthode GameProfileManager#setCache(GameProfileCache). Pour restaurer le cache original, utilisez la même méthode, en passant le résultat de GameProfileManager#getDefaultCache().