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 GameProfile
s. 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 GameProfile
s à 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 GameProfile
s 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 GameProfile
s à 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 GameProfile
s 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 ProfileProperty
s 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 GameProfile
s. Pour faire ceci, appelez simplement la méthode GameProfileManager#getCache(). En utilisant le GameProfileCache
, vous pouvez rechercher des GameProfile
s, ajouter des GameProfile
s 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 GameProfile
s 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().