0

Use Mojang's session API to get usernames from UUIDs

This commit is contained in:
Luc Ritchie
2014-03-09 16:22:00 -04:00
parent 1cf131a8fc
commit 0e1bd4369a

View File

@@ -19,6 +19,7 @@ import logging
import json import json
import sys import sys
import re import re
import urllib2
import Queue import Queue
import multiprocessing import multiprocessing
@@ -30,6 +31,8 @@ from overviewer_core import logger
from overviewer_core import nbt from overviewer_core import nbt
from overviewer_core import configParser, world from overviewer_core import configParser, world
UUID_LOOKUP_URL = 'https://sessionserver.mojang.com/session/minecraft/profile/'
def replaceBads(s): def replaceBads(s):
"Replaces bad characters with good characters!" "Replaces bad characters with good characters!"
bads = [" ", "(", ")"] bads = [" ", "(", ")"]
@@ -132,10 +135,11 @@ def handlePlayers(rset, render, worldpath):
dimension = int(mystdim.group(1)) dimension = int(mystdim.group(1))
else: else:
raise raise
# TODO: get player names from UUIDs once Mojang makes available an API to do it
playerdir = os.path.join(worldpath, "playerdata") playerdir = os.path.join(worldpath, "playerdata")
useUUIDs = True
if not os.path.isdir(playerdir): if not os.path.isdir(playerdir):
playerdir = os.path.join(worldpath, "players") playerdir = os.path.join(worldpath, "players")
useUUIDs = False
if os.path.isdir(playerdir): if os.path.isdir(playerdir):
playerfiles = os.listdir(playerdir) playerfiles = os.listdir(playerdir)
@@ -156,6 +160,13 @@ def handlePlayers(rset, render, worldpath):
logging.warning("Skipping bad player dat file %r", playerfile) logging.warning("Skipping bad player dat file %r", playerfile)
continue continue
playername = playerfile.split(".")[0] playername = playerfile.split(".")[0]
if useUUIDs:
try:
profile = json.loads(urllib2.urlopen(UUID_LOOKUP_URL + playername.replace('-','')).read())
if 'name' in profile:
playername = profile['name']
except ValueError:
logging.warning("Unable to get player name for UUID %s", playername)
if isSinglePlayer: if isSinglePlayer:
playername = 'Player' playername = 'Player'
if data['Dimension'] == dimension: if data['Dimension'] == dimension: