Some checks failed
EpicKnarvik97/Stargate/pipeline/head There was a failure building this commit
116 lines
3.8 KiB
Java
116 lines
3.8 KiB
Java
package net.knarcraft.stargate.utility;
|
|
|
|
import net.knarcraft.stargate.Stargate;
|
|
import net.knarcraft.stargate.portal.Portal;
|
|
import net.knarcraft.stargate.portal.PortalHandler;
|
|
import net.knarcraft.stargate.portal.PortalRegistry;
|
|
import net.knarcraft.stargate.portal.property.PortalOwner;
|
|
import org.bukkit.OfflinePlayer;
|
|
import org.bukkit.World;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.HashSet;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Set;
|
|
import java.util.UUID;
|
|
|
|
/**
|
|
* Helps migrate player names to UUID where necessary
|
|
*/
|
|
public final class UUIDMigrationHelper {
|
|
|
|
private UUIDMigrationHelper() {
|
|
|
|
}
|
|
|
|
private static Map<String, List<Portal>> playerNamesToMigrate;
|
|
|
|
/**
|
|
* Migrates the player's name to a UUID
|
|
*
|
|
* <p>If any portals are missing a UUID for their owner, and the given player is the owner of those portals, the
|
|
* given player's UUID will be used as UUID for the portals' owner.</p>
|
|
*
|
|
* @param player <p>The player to migrate</p>
|
|
*/
|
|
public static void migrateUUID(OfflinePlayer player) {
|
|
Map<String, List<Portal>> playersToMigrate = getPlayersToMigrate();
|
|
String playerName = player.getName();
|
|
|
|
//Nothing to do
|
|
if (!playersToMigrate.containsKey(playerName)) {
|
|
return;
|
|
}
|
|
|
|
Stargate.debug("UUIDMigrationHelper::migrateUUID", String.format("Migrating name to UUID for player %s",
|
|
playerName));
|
|
List<Portal> portalsOwned = playersToMigrate.get(playerName);
|
|
if (portalsOwned == null) {
|
|
return;
|
|
}
|
|
|
|
migratePortalsToUUID(portalsOwned, player.getUniqueId());
|
|
|
|
//Remove the player to prevent the migration to happen every time the player joins
|
|
playersToMigrate.remove(playerName);
|
|
}
|
|
|
|
/**
|
|
* Migrates a list of portals to use UUID instead of only player name
|
|
*
|
|
* @param portals <p>The portals to migrate</p>
|
|
* @param uniqueId <p>The unique ID of the portals' owner</p>
|
|
*/
|
|
private static void migratePortalsToUUID(List<Portal> portals, UUID uniqueId) {
|
|
Set<World> worldsToSave = new HashSet<>();
|
|
|
|
//Get the real portal from the copy and set UUID
|
|
for (Portal portalCopy : portals) {
|
|
Portal portal = PortalHandler.getByName(portalCopy.getCleanName(), portalCopy.getCleanNetwork());
|
|
if (portal != null) {
|
|
portal.getOwner().setUUID(uniqueId);
|
|
worldsToSave.add(portal.getWorld());
|
|
}
|
|
}
|
|
|
|
//Need to make sure the changes are saved
|
|
for (World world : worldsToSave) {
|
|
PortalFileHelper.saveAllPortals(world);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Gets all player names which need to be migrated to UUIDs
|
|
*
|
|
* @return <p>The player names to migrate</p>
|
|
*/
|
|
private static Map<String, List<Portal>> getPlayersToMigrate() {
|
|
//Make sure to only go through portals once
|
|
if (playerNamesToMigrate != null) {
|
|
return playerNamesToMigrate;
|
|
}
|
|
|
|
playerNamesToMigrate = new HashMap<>();
|
|
for (Portal portal : PortalRegistry.getAllPortals()) {
|
|
PortalOwner owner = portal.getOwner();
|
|
String ownerName = owner.getName();
|
|
|
|
//If a UUID is missing, add the portal to the list owned by the player
|
|
if (owner.getUUID() == null) {
|
|
List<Portal> portalList = playerNamesToMigrate.get(ownerName);
|
|
if (portalList == null) {
|
|
List<Portal> newList = new ArrayList<>();
|
|
newList.add(portal);
|
|
playerNamesToMigrate.put(ownerName, newList);
|
|
} else {
|
|
portalList.add(portal);
|
|
}
|
|
}
|
|
}
|
|
return playerNamesToMigrate;
|
|
}
|
|
|
|
}
|