initial commit
This commit is contained in:
72
src/main/java/cc/fascinated/player/PlayerManagerService.java
Normal file
72
src/main/java/cc/fascinated/player/PlayerManagerService.java
Normal file
@ -0,0 +1,72 @@
|
||||
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());
|
||||
}
|
||||
Player player = new Player(profile);
|
||||
players.put(player.getUuid(), player);
|
||||
playerNameToUUIDCache.put(player.getName().toUpperCase(), player.getUuid());
|
||||
return player;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user