88 lines
3.2 KiB
Python
88 lines
3.2 KiB
Python
""" Username to UUID
|
|
Converts a Minecraft username to it's UUID equivalent.
|
|
|
|
Uses the official Mojang API to fetch player data.
|
|
"""
|
|
|
|
### Import necessary modules
|
|
import http.client
|
|
import json
|
|
from mcuuid.tools import is_valid_minecraft_username
|
|
from mcuuid.tools import is_valid_mojang_uuid
|
|
|
|
### Main class
|
|
class GetPlayerData:
|
|
def __init__(self, identifier, timestamp=None):
|
|
self.valid = True
|
|
"""
|
|
Get the UUID of the player.
|
|
|
|
Parameters
|
|
----------
|
|
username: string
|
|
The known minecraft username
|
|
timestamp : long integer (optional)
|
|
The time at which the player used this name, expressed as a Unix timestamp.
|
|
"""
|
|
|
|
# Handle the timestamp
|
|
get_args = ""
|
|
if timestamp is not None:
|
|
get_args = "?at=" + str(timestamp)
|
|
|
|
# Build the request path based on the identifier
|
|
req = ""
|
|
if is_valid_minecraft_username(identifier):
|
|
req = "/users/profiles/minecraft/" + identifier + get_args
|
|
elif is_valid_mojang_uuid(identifier):
|
|
req = "/user/profiles/" + identifier + "/names" + get_args
|
|
else:
|
|
self.valid = False
|
|
|
|
# Proceed only, when the identifier was valid
|
|
if self.valid:
|
|
# Request the player data
|
|
http_conn = http.client.HTTPSConnection("api.mojang.com");
|
|
http_conn.request("GET", req,
|
|
headers={'User-Agent':'https://github.com/clerie/mcuuid', 'Content-Type':'application/json'});
|
|
response = http_conn.getresponse().read().decode("utf-8")
|
|
|
|
# In case the answer is empty, the user dont exist
|
|
if not response:
|
|
self.valid = False
|
|
# If there is an answer, fill out the variables
|
|
else:
|
|
# Parse the JSON
|
|
json_data = json.loads(response)
|
|
|
|
### Handle the response of the different requests on different ways
|
|
# Request using username
|
|
if is_valid_minecraft_username(identifier):
|
|
# The UUID
|
|
self.uuid = json_data['id']
|
|
# The username written correctly
|
|
self.username = json_data['name']
|
|
#Request using UUID
|
|
elif is_valid_mojang_uuid(identifier):
|
|
# The UUID
|
|
self.uuid = identifier
|
|
|
|
current_name = ""
|
|
current_time = 0
|
|
|
|
# Getting the username based on timestamp
|
|
for name in json_data:
|
|
# Prepare the JSON
|
|
# The first name has no change time
|
|
if 'changedToAt' not in name:
|
|
name['changedToAt'] = 0
|
|
|
|
# Get the right name on timestamp
|
|
if current_time <= name['changedToAt'] and (timestamp is None or name['changedToAt'] <= timestamp):
|
|
current_time = name['changedToAt']
|
|
current_name = name['name']
|
|
|
|
|
|
# The username written correctly
|
|
self.username = current_name
|