76 lines
2.5 KiB
Java
76 lines
2.5 KiB
Java
package cc.fascinated.player;
|
|
|
|
import cc.fascinated.mojang.MojangAPIService;
|
|
import cc.fascinated.mojang.types.MojangApiProfile;
|
|
import cc.fascinated.mojang.types.MojangSessionServerProfile;
|
|
import cc.fascinated.player.impl.Player;
|
|
import cc.fascinated.util.UUIDUtils;
|
|
import net.jodah.expiringmap.ExpirationPolicy;
|
|
import net.jodah.expiringmap.ExpiringMap;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import java.util.Map;
|
|
import java.util.UUID;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
@Service
|
|
public class PlayerManagerService {
|
|
|
|
/**
|
|
* The cache of players.
|
|
*/
|
|
private final Map<UUID, Player> players = ExpiringMap.builder()
|
|
.expiration(1, TimeUnit.HOURS)
|
|
.expirationPolicy(ExpirationPolicy.CREATED)
|
|
.build();
|
|
|
|
/**
|
|
* The cache of player names to UUIDs.
|
|
*/
|
|
private final Map<String, UUID> playerNameToUUIDCache = ExpiringMap.builder()
|
|
.expiration(1, TimeUnit.DAYS)
|
|
.expirationPolicy(ExpirationPolicy.CREATED)
|
|
.build();
|
|
|
|
private final MojangAPIService mojangAPIService;
|
|
|
|
public PlayerManagerService(MojangAPIService mojangAPIService) {
|
|
this.mojangAPIService = mojangAPIService;
|
|
}
|
|
|
|
/**
|
|
* Gets a player by their UUID.
|
|
*
|
|
* @param id the uuid or name of the player
|
|
* @return the player or null if the player does not exist
|
|
*/
|
|
public Player getPlayer(String id) {
|
|
UUID uuid;
|
|
if (id.length() == 32 || id.length() == 36) {
|
|
uuid = UUID.fromString(id.length() == 32 ? UUIDUtils.addUUIDDashes(id) : id);
|
|
} else {
|
|
uuid = playerNameToUUIDCache.get(id.toUpperCase());
|
|
}
|
|
|
|
if (players.containsKey(uuid)) {
|
|
return players.get(uuid);
|
|
}
|
|
|
|
MojangSessionServerProfile profile = uuid == null ? null : mojangAPIService.getSessionServerProfile(uuid.toString());
|
|
if (profile == null) {
|
|
MojangApiProfile apiProfile = mojangAPIService.getApiProfile(id);
|
|
if (apiProfile == null) {
|
|
return null;
|
|
}
|
|
profile = mojangAPIService.getSessionServerProfile(apiProfile.getId().length() == 32 ? UUIDUtils.addUUIDDashes(apiProfile.getId()) : apiProfile.getId());
|
|
}
|
|
if (profile == null) { // The player cannot be found using their name or UUID
|
|
return null;
|
|
}
|
|
Player player = new Player(profile);
|
|
players.put(player.getUuid(), player);
|
|
playerNameToUUIDCache.put(player.getName().toUpperCase(), player.getUuid());
|
|
return player;
|
|
}
|
|
}
|