[Util] UUID-Klasse mit Cache

Hier könnt ihr anderen Leuten helfen, indem ihr Anleitungen oder praktische Codesegmente zur Verfügung stellt.

[Util] UUID-Klasse mit Cache

Beitragvon Sep2703 » So 28. Sep 2014, 13:29

Hey,

heute möchte ich euch eine kleine von mir geschriebene Klasse zur Verfügung stellen.
Damit kommt ihr an die UUID eines Spielers (anhand des Names).
Es wird kein Umweg über Drittanbieter genommen und es ist eine kleine "Cache" integriert.
Code: Alles auswählen
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.net.URL;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. import org.bukkit.craftbukkit.libs.com.google.gson.JsonElement;
  9. import org.bukkit.craftbukkit.libs.com.google.gson.JsonObject;
  10. import org.bukkit.craftbukkit.libs.com.google.gson.JsonParser;
  11. public class UUIDFetcher {
  12.    
  13.    private static Map<String, String> uuidCache;
  14.    
  15.    static {
  16.       uuidCache = new HashMap<String, String>();
  17.    }
  18.    public static String getUUID(String username) {
  19.       if (uuidCache.containsKey(username)) return uuidCache.get(username);
  20.       try {
  21.          URL url = new URL("https://api.mojang.com/users/profiles/minecraft/" + username);
  22.          InputStream stream = url.openStream();
  23.          InputStreamReader inr = new InputStreamReader(stream);
  24.          BufferedReader reader = new BufferedReader(inr);
  25.          String s = null;
  26.          StringBuilder sb = new StringBuilder();
  27.          while ((s = reader.readLine()) != null) {
  28.             sb.append(s);
  29.          }
  30.          String result = sb.toString();
  31.          
  32.          JsonElement element = new JsonParser().parse(result);
  33.          JsonObject obj = element.getAsJsonObject();
  34.          
  35.          String uuid = obj.get("id").toString();
  36.          
  37.          uuid = uuid.substring(1);
  38.          uuid = uuid.substring(0, uuid.length() - 1);
  39.          
  40.          uuidCache.put(username, uuid);
  41.          
  42.          return uuid;
  43.          
  44.       } catch (IOException e) {
  45.          e.printStackTrace();
  46.       }
  47.       return null;
  48.    }
  49. }

Hinweis: Ihr benötigt eine Bukkit- oder Spigot-Version zusätzlich.
Ich parse den JSON-String mit GSON. Diese Bibliothek ist in Bukkit bzw. Spigot integriert.



Benutzung:

Neue Klasse erstellen - Code einbinden - Package-Deklaration (erste Zeile) hinzufügen.
Dann braucht ihr den Code in der Klasse selbst nicht mehr zu beachten und könnt einfach die getUUID()-Methode statisch aufrufen.
Als Parameter übergebt ihr einen String (Username) und ihr bekommt die UUID in Form eines Strings zurückgegeben.
Wenn der Benutzername nicht existiert oder es anderweitig zu einem Fehler kommt, ist der Rückgabewert null.


Viel Spaß damit!
Du möchtest programmieren lernen oder dein Bukkit-/Spigot-Wissen erweitern?
Hier habe ich für dich kostenlose Tutorials: https://youtube.com/janhektor
Benutzeravatar
Sep2703
 
Beiträge: 677
Registriert: Mi 8. Jan 2014, 15:13
Wohnort: 127.0.0.1

Re: [Util] UUID-Klasse mit Cache

Beitragvon Twister_21 » So 28. Sep 2014, 13:31

Das ist eine wirklich sehr nützliche Klasse.
Mit freundlichen Grüßen
Twister21
Benutzeravatar
Twister_21
 
Beiträge: 652
Registriert: Mi 11. Jun 2014, 05:51
Wohnort: Deutschland

Re: [Util] UUID-Klasse mit Cache

Beitragvon Howaner » Mo 10. Nov 2014, 07:07

Hat Bukkit selbst nicht auch einen Cache?
Benutzeravatar
Howaner
 
Beiträge: 34
Registriert: Di 18. Mär 2014, 14:01

Re: [Util] UUID-Klasse mit Cache

Beitragvon Twister_21 » Fr 19. Dez 2014, 15:22

Gibt es da auch einen Weg anders herum? Also von UUID -> Spielername. Mit der Methode von BungeeCord (ProxyServer.getInstance().getPlayer(uuid) funktioniert das nicht so. Kann man denn bei der Methode auch einen String nehmen? Da gibts immer ein Fehler.
Mit freundlichen Grüßen
Twister21
Benutzeravatar
Twister_21
 
Beiträge: 652
Registriert: Mi 11. Jun 2014, 05:51
Wohnort: Deutschland

Re: [Util] UUID-Klasse mit Cache

Beitragvon Jofkos » Fr 19. Dez 2014, 15:33

Twister_21 hat geschrieben:Gibt es da auch einen Weg anders herum? Also von UUID -> Spielername. Mit der Methode von BungeeCord (ProxyServer.getInstance().getPlayer(uuid) funktioniert das nicht so. Kann man denn bei der Methode auch einen String nehmen? Da gibts immer ein Fehler.
dieser uuid fetcher gibt direkt 'ne uuid zurück, oder wie meinst du das?
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Re: [Util] UUID-Klasse mit Cache

Beitragvon Twister_21 » Fr 19. Dez 2014, 15:38

Ich will, wenn ich eine UUID hab, diese wieder zu dem entsprechenden Spielernamen umwandeln.

Es tritt bei dieser Klasse übrigens noch ein fehler auf, wenn der Spieler nicht existiert:
Code: Alles auswählen
  1. 17:52:11 [INFORMATION] An internal error occurred whilst executing this command, please check the console log for details.
  2. 17:52:11 [WARNUNG] Error in dispatching command
  3. java.lang.IllegalStateException: Not a JSON Object: null
  4.     at com.google.gson.JsonElement.getAsJsonObject(JsonElement.java:90)
  5.     at de.twister_21.bungeecord.UUID.getUUID(UUID.java:38)
  6.     at Commands.Command_unban.execute(Command_unban.java:28)
  7.     at net.md_5.bungee.api.plugin.PluginManager.dispatchCommand(PluginManager.java:162)
  8.     at net.md_5.bungee.api.plugin.PluginManager.dispatchCommand(PluginManager.java:116)
  9.     at net.md_5.bungee.BungeeCordLauncher.main(BungeeCordLauncher.java:57)
  10.     at net.md_5.bungee.Bootstrap.main(Bootstrap.java:15)


Hier:
Code: Alles auswählen
  1. JsonObject obj = element.getAsJsonObject();


Ich frage hier ab, ob der Spieler eine UUID hat:
Code: Alles auswählen
  1.   if(UUID.getUUID(args[0]) != null) {


Achso, hab noch was vergessen, ist mir gerade erst so wirklich aufgefallen. Wenn man die Klasse mit BungeeCordd verwenden will, gibt es die Imports
Code: Alles auswählen
  1. import org.bukkit.craftbukkit.libs.com.google.gson.JsonElement;
  2. import org.bukkit.craftbukkit.libs.com.google.gson.JsonObject;
  3. import org.bukkit.craftbukkit.libs.com.google.gson.JsonParser;



nicht, sondern nur:
Code: Alles auswählen
  1. import com.google.gson.JsonElement;
  2. import com.google.gson.JsonObject;
  3. import com.google.gson.JsonParser;


Kann man die Klasse trotzdem genauso verwenden, oder ist das vieleicht der Fehler?

Ok, habs getestet (also in spigot) , tritt aber auch der Fehler auf:

Code: Alles auswählen
  1. Caused by: java.lang.IllegalStateException: Not a JSON Object: null
  2.         at org.bukkit.craftbukkit.libs.com.google.gson.JsonElement.getAsJsonObject(JsonElement.java:84) ~[spigot.jar:git-Spigot-1.7.9-R0.2-205-g0a049fa]
  3.         at de.twister_21.globalnametag.UUID.getUUID(UUID.java:38) ~[?:?]
  4.         at Commands.Command_tag.onCommand(Command_tag.java:56) ~[?:?]
  5.         at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[spigot.jar:git-Spigot-1.7.9-R0.2-205-g0a049fa]
  6.         ... 13 more


Kann man diesen Null-Fehler irgendwie umgehen?
Mit freundlichen Grüßen
Twister21
Benutzeravatar
Twister_21
 
Beiträge: 652
Registriert: Mi 11. Jun 2014, 05:51
Wohnort: Deutschland

Re: [Util] UUID-Klasse mit Cache

Beitragvon Twister_21 » Sa 20. Dez 2014, 09:52

#push
Hat noch jemand eine Idee, wie man
1. den Fehler vermeiden kann, wenn der Spieler keine UUID hat.
2. die UUID in einen Spielernamen umwandeln kann.
Mit freundlichen Grüßen
Twister21
Benutzeravatar
Twister_21
 
Beiträge: 652
Registriert: Mi 11. Jun 2014, 05:51
Wohnort: Deutschland

Re: [Util] UUID-Klasse mit Cache

Beitragvon ImGameboy » Sa 20. Dez 2014, 14:56

Bukkit.getPlayer(uuid).getName() (oder so ähnlich)
Wie können Spieler denn keine UUID haben? Zur Not: try-catch
Lückenstopfer ^^
Benutzeravatar
ImGameboy
 
Beiträge: 210
Registriert: Mi 17. Sep 2014, 15:25

Re: [Util] UUID-Klasse mit Cache

Beitragvon Twister_21 » Sa 20. Dez 2014, 19:28

Na die Mojang-API gibt doch nur die API's von Premium-Spielern. Über die genannte Methode kam es aber bei mir zu Fehlern. Muss ich später noch mal austesten.

Wie arbeiten denn aber die anderen hier im Forum mit UUID's? Fange gerade erst damit an und suche noch die beste Variante.
Mit freundlichen Grüßen
Twister21
Benutzeravatar
Twister_21
 
Beiträge: 652
Registriert: Mi 11. Jun 2014, 05:51
Wohnort: Deutschland

Re: [Util] UUID-Klasse mit Cache

Beitragvon Jofkos » Sa 20. Dez 2014, 23:48

Twister_21 hat geschrieben:Na die Mojang-API gibt doch nur die API's von Premium-Spielern. Über die genannte Methode kam es aber bei mir zu Fehlern. Muss ich später noch mal austesten.

Wie arbeiten denn aber die anderen hier im Forum mit UUID's? Fange gerade erst damit an und suche noch die beste Variante.

Du bekommst von einem Namen nur die UUID (und anders herum) über die Mojang API, da sich der Name (zumindest Theoretisch) ändern lässt. Ich nutze dafür meine eigene Klasse.
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Nächste

Zurück zu Anleitungen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast