OldUsersConverter.java

net.minecraft.server.players.OldUsersConverter

信息

  • 全限定名:net.minecraft.server.players.OldUsersConverter
  • 类型:public class
  • 包:net.minecraft.server.players
  • 源码路径:src/main/java/net/minecraft/server/players/OldUsersConverter.java
  • 起始行号:L30
  • 职责:

    TODO

字段/常量

  • LOGGER

    • 类型: Logger
    • 修饰符: private static final
    • 源码定位: L31
    • 说明:

      TODO

  • OLD_IPBANLIST

    • 类型: File
    • 修饰符: public static final
    • 源码定位: L32
    • 说明:

      TODO

  • OLD_USERBANLIST

    • 类型: File
    • 修饰符: public static final
    • 源码定位: L33
    • 说明:

      TODO

  • OLD_OPLIST

    • 类型: File
    • 修饰符: public static final
    • 源码定位: L34
    • 说明:

      TODO

  • OLD_WHITELIST

    • 类型: File
    • 修饰符: public static final
    • 源码定位: L35
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.server.players.OldUsersConverter.ConversionError
    • 类型: class
    • 修饰符: private static
    • 源码定位: L426
    • 说明:

      TODO

构造器

方法

下面的方法块按源码顺序生成。

static List<String> readOldListFormat(File file, Map<String,String[]> userMap) @ L37

  • 方法名:readOldListFormat
  • 源码定位:L37
  • 返回类型:List
  • 修饰符:static

参数:

  • file: File
  • userMap: Map<String,String[]>

说明:

TODO

private static void lookupPlayers(MinecraftServer server, Collection<String> names, ProfileLookupCallback callback) @ L51

  • 方法名:lookupPlayers
  • 源码定位:L51
  • 返回类型:void
  • 修饰符:private static

参数:

  • server: MinecraftServer
  • names: Collection
  • callback: ProfileLookupCallback

说明:

TODO

public static boolean convertUserBanlist(MinecraftServer server) @ L62

  • 方法名:convertUserBanlist
  • 源码定位:L62
  • 返回类型:boolean
  • 修饰符:public static

参数:

  • server: MinecraftServer

说明:

TODO

public static boolean convertIpBanlist(MinecraftServer server) @ L118

  • 方法名:convertIpBanlist
  • 源码定位:L118
  • 返回类型:boolean
  • 修饰符:public static

参数:

  • server: MinecraftServer

说明:

TODO

public static boolean convertOpsList(MinecraftServer server) @ L154

  • 方法名:convertOpsList
  • 源码定位:L154
  • 返回类型:boolean
  • 修饰符:public static

参数:

  • server: MinecraftServer

说明:

TODO

public static boolean convertWhiteList(MinecraftServer server) @ L199

  • 方法名:convertWhiteList
  • 源码定位:L199
  • 返回类型:boolean
  • 修饰符:public static

参数:

  • server: MinecraftServer

说明:

TODO

public static UUID convertMobOwnerIfNecessary(MinecraftServer server, String owner) @ L244

  • 方法名:convertMobOwnerIfNecessary
  • 源码定位:L244
  • 返回类型:UUID
  • 修饰符:public static

参数:

  • server: MinecraftServer
  • owner: String

说明:

TODO

public static boolean convertPlayers(DedicatedServer server) @ L278

  • 方法名:convertPlayers
  • 源码定位:L278
  • 返回类型:boolean
  • 修饰符:public static

参数:

  • server: DedicatedServer

说明:

TODO

private static void ensureDirectoryExists(File directory) @ L354

  • 方法名:ensureDirectoryExists
  • 源码定位:L354
  • 返回类型:void
  • 修饰符:private static

参数:

  • directory: File

说明:

TODO

public static boolean areOldUserlistsRemoved() @ L364

  • 方法名:areOldUserlistsRemoved
  • 源码定位:L364
  • 返回类型:boolean
  • 修饰符:public static

参数:

说明:

TODO

private static void renameOldFile(File file) @ L410

  • 方法名:renameOldFile
  • 源码定位:L410
  • 返回类型:void
  • 修饰符:private static

参数:

  • file: File

说明:

TODO

private static Date parseDate(String dateString, Date defaultValue) @ L415

  • 方法名:parseDate
  • 源码定位:L415
  • 返回类型:Date
  • 修饰符:private static

参数:

  • dateString: String
  • defaultValue: Date

说明:

TODO

代码

public class OldUsersConverter {
    private static final Logger LOGGER = LogUtils.getLogger();
    public static final File OLD_IPBANLIST = new File("banned-ips.txt");
    public static final File OLD_USERBANLIST = new File("banned-players.txt");
    public static final File OLD_OPLIST = new File("ops.txt");
    public static final File OLD_WHITELIST = new File("white-list.txt");
 
    static List<String> readOldListFormat(File file, Map<String, String[]> userMap) throws IOException {
        List<String> lines = Files.readLines(file, StandardCharsets.UTF_8);
 
        for (String line : lines) {
            line = line.trim();
            if (!line.startsWith("#") && !line.isEmpty()) {
                String[] parts = line.split("\\|");
                userMap.put(parts[0].toLowerCase(Locale.ROOT), parts);
            }
        }
 
        return lines;
    }
 
    private static void lookupPlayers(MinecraftServer server, Collection<String> names, ProfileLookupCallback callback) {
        String[] filteredNames = names.stream().filter(s -> !StringUtil.isNullOrEmpty(s)).toArray(String[]::new);
        if (server.usesAuthentication()) {
            server.services().profileRepository().findProfilesByNames(filteredNames, callback);
        } else {
            for (String name : filteredNames) {
                callback.onProfileLookupSucceeded(name, UUIDUtil.createOfflinePlayerUUID(name));
            }
        }
    }
 
    public static boolean convertUserBanlist(MinecraftServer server) {
        final UserBanList bans = new UserBanList(PlayerList.USERBANLIST_FILE, new EmptyNotificationService());
        if (OLD_USERBANLIST.exists() && OLD_USERBANLIST.isFile()) {
            if (bans.getFile().exists()) {
                try {
                    bans.load();
                } catch (IOException var6) {
                    LOGGER.warn("Could not load existing file {}", bans.getFile().getName(), var6);
                }
            }
 
            try {
                final Map<String, String[]> userMap = Maps.newHashMap();
                readOldListFormat(OLD_USERBANLIST, userMap);
                ProfileLookupCallback callback = new ProfileLookupCallback() {
                    @Override
                    public void onProfileLookupSucceeded(String profileName, UUID profileId) {
                        NameAndId profile = new NameAndId(profileId, profileName);
                        server.services().nameToIdCache().add(profile);
                        String[] userDef = userMap.get(profile.name().toLowerCase(Locale.ROOT));
                        if (userDef == null) {
                            OldUsersConverter.LOGGER.warn("Could not convert user banlist entry for {}", profile.name());
                            throw new OldUsersConverter.ConversionError("Profile not in the conversionlist");
                        } else {
                            Date created = userDef.length > 1 ? OldUsersConverter.parseDate(userDef[1], null) : null;
                            String source = userDef.length > 2 ? userDef[2] : null;
                            Date expires = userDef.length > 3 ? OldUsersConverter.parseDate(userDef[3], null) : null;
                            String reason = userDef.length > 4 ? userDef[4] : null;
                            bans.add(new UserBanListEntry(profile, created, source, expires, reason));
                        }
                    }
 
                    @Override
                    public void onProfileLookupFailed(String profileName, Exception exception) {
                        OldUsersConverter.LOGGER.warn("Could not lookup user banlist entry for {}", profileName, exception);
                        if (!(exception instanceof ProfileNotFoundException)) {
                            throw new OldUsersConverter.ConversionError("Could not request user " + profileName + " from backend systems", exception);
                        }
                    }
                };
                lookupPlayers(server, userMap.keySet(), callback);
                bans.save();
                renameOldFile(OLD_USERBANLIST);
                return true;
            } catch (IOException var4) {
                LOGGER.warn("Could not read old user banlist to convert it!", (Throwable)var4);
                return false;
            } catch (OldUsersConverter.ConversionError var5) {
                LOGGER.error("Conversion failed, please try again later", (Throwable)var5);
                return false;
            }
        } else {
            return true;
        }
    }
 
    public static boolean convertIpBanlist(MinecraftServer server) {
        IpBanList ipBans = new IpBanList(PlayerList.IPBANLIST_FILE, new EmptyNotificationService());
        if (OLD_IPBANLIST.exists() && OLD_IPBANLIST.isFile()) {
            if (ipBans.getFile().exists()) {
                try {
                    ipBans.load();
                } catch (IOException var11) {
                    LOGGER.warn("Could not load existing file {}", ipBans.getFile().getName(), var11);
                }
            }
 
            try {
                Map<String, String[]> userMap = Maps.newHashMap();
                readOldListFormat(OLD_IPBANLIST, userMap);
 
                for (String key : userMap.keySet()) {
                    String[] userDef = userMap.get(key);
                    Date created = userDef.length > 1 ? parseDate(userDef[1], null) : null;
                    String source = userDef.length > 2 ? userDef[2] : null;
                    Date expires = userDef.length > 3 ? parseDate(userDef[3], null) : null;
                    String reason = userDef.length > 4 ? userDef[4] : null;
                    ipBans.add(new IpBanListEntry(key, created, source, expires, reason));
                }
 
                ipBans.save();
                renameOldFile(OLD_IPBANLIST);
                return true;
            } catch (IOException var10) {
                LOGGER.warn("Could not parse old ip banlist to convert it!", (Throwable)var10);
                return false;
            }
        } else {
            return true;
        }
    }
 
    public static boolean convertOpsList(MinecraftServer server) {
        final ServerOpList opsList = new ServerOpList(PlayerList.OPLIST_FILE, new EmptyNotificationService());
        if (OLD_OPLIST.exists() && OLD_OPLIST.isFile()) {
            if (opsList.getFile().exists()) {
                try {
                    opsList.load();
                } catch (IOException var6) {
                    LOGGER.warn("Could not load existing file {}", opsList.getFile().getName(), var6);
                }
            }
 
            try {
                List<String> lines = Files.readLines(OLD_OPLIST, StandardCharsets.UTF_8);
                ProfileLookupCallback callback = new ProfileLookupCallback() {
                    @Override
                    public void onProfileLookupSucceeded(String profileName, UUID profileId) {
                        NameAndId profile = new NameAndId(profileId, profileName);
                        server.services().nameToIdCache().add(profile);
                        opsList.add(new ServerOpListEntry(profile, server.operatorUserPermissions(), false));
                    }
 
                    @Override
                    public void onProfileLookupFailed(String profileName, Exception exception) {
                        OldUsersConverter.LOGGER.warn("Could not lookup oplist entry for {}", profileName, exception);
                        if (!(exception instanceof ProfileNotFoundException)) {
                            throw new OldUsersConverter.ConversionError("Could not request user " + profileName + " from backend systems", exception);
                        }
                    }
                };
                lookupPlayers(server, lines, callback);
                opsList.save();
                renameOldFile(OLD_OPLIST);
                return true;
            } catch (IOException var4) {
                LOGGER.warn("Could not read old oplist to convert it!", (Throwable)var4);
                return false;
            } catch (OldUsersConverter.ConversionError var5) {
                LOGGER.error("Conversion failed, please try again later", (Throwable)var5);
                return false;
            }
        } else {
            return true;
        }
    }
 
    public static boolean convertWhiteList(MinecraftServer server) {
        final UserWhiteList whitelist = new UserWhiteList(PlayerList.WHITELIST_FILE, new EmptyNotificationService());
        if (OLD_WHITELIST.exists() && OLD_WHITELIST.isFile()) {
            if (whitelist.getFile().exists()) {
                try {
                    whitelist.load();
                } catch (IOException var6) {
                    LOGGER.warn("Could not load existing file {}", whitelist.getFile().getName(), var6);
                }
            }
 
            try {
                List<String> lines = Files.readLines(OLD_WHITELIST, StandardCharsets.UTF_8);
                ProfileLookupCallback callback = new ProfileLookupCallback() {
                    @Override
                    public void onProfileLookupSucceeded(String profileName, UUID profileId) {
                        NameAndId profile = new NameAndId(profileId, profileName);
                        server.services().nameToIdCache().add(profile);
                        whitelist.add(new UserWhiteListEntry(profile));
                    }
 
                    @Override
                    public void onProfileLookupFailed(String profileName, Exception exception) {
                        OldUsersConverter.LOGGER.warn("Could not lookup user whitelist entry for {}", profileName, exception);
                        if (!(exception instanceof ProfileNotFoundException)) {
                            throw new OldUsersConverter.ConversionError("Could not request user " + profileName + " from backend systems", exception);
                        }
                    }
                };
                lookupPlayers(server, lines, callback);
                whitelist.save();
                renameOldFile(OLD_WHITELIST);
                return true;
            } catch (IOException var4) {
                LOGGER.warn("Could not read old whitelist to convert it!", (Throwable)var4);
                return false;
            } catch (OldUsersConverter.ConversionError var5) {
                LOGGER.error("Conversion failed, please try again later", (Throwable)var5);
                return false;
            }
        } else {
            return true;
        }
    }
 
    public static @Nullable UUID convertMobOwnerIfNecessary(MinecraftServer server, String owner) {
        if (!StringUtil.isNullOrEmpty(owner) && owner.length() <= 16) {
            Optional<UUID> profileId = server.services().nameToIdCache().get(owner).map(NameAndId::id);
            if (profileId.isPresent()) {
                return profileId.get();
            } else if (!server.isSingleplayer() && server.usesAuthentication()) {
                final List<NameAndId> profiles = new ArrayList<>();
                ProfileLookupCallback callback = new ProfileLookupCallback() {
                    @Override
                    public void onProfileLookupSucceeded(String profileName, UUID profileIdx) {
                        NameAndId profile = new NameAndId(profileIdx, profileName);
                        server.services().nameToIdCache().add(profile);
                        profiles.add(profile);
                    }
 
                    @Override
                    public void onProfileLookupFailed(String profileName, Exception exception) {
                        OldUsersConverter.LOGGER.warn("Could not lookup user whitelist entry for {}", profileName, exception);
                    }
                };
                lookupPlayers(server, Lists.newArrayList(owner), callback);
                return !profiles.isEmpty() ? profiles.getFirst().id() : null;
            } else {
                return UUIDUtil.createOfflinePlayerUUID(owner);
            }
        } else {
            try {
                return UUID.fromString(owner);
            } catch (IllegalArgumentException var5) {
                return null;
            }
        }
    }
 
    public static boolean convertPlayers(DedicatedServer server) {
        final File worldPlayerDirectory = server.getWorldPath(LevelResource.PLAYER_OLD_DATA_DIR).toFile();
        final File worldNewPlayerDirectory = new File(worldPlayerDirectory.getParentFile(), LevelResource.PLAYER_DATA_DIR.id());
        final File unknownPlayerDirectory = new File(worldPlayerDirectory.getParentFile(), "unknownplayers");
        if (worldPlayerDirectory.exists() && worldPlayerDirectory.isDirectory()) {
            File[] playerFiles = worldPlayerDirectory.listFiles();
            List<String> playerNames = Lists.newArrayList();
 
            for (File file : playerFiles) {
                String fileName = file.getName();
                if (fileName.toLowerCase(Locale.ROOT).endsWith(".dat")) {
                    String playerName = fileName.substring(0, fileName.length() - ".dat".length());
                    if (!playerName.isEmpty()) {
                        playerNames.add(playerName);
                    }
                }
            }
 
            try {
                final String[] names = playerNames.toArray(new String[playerNames.size()]);
                ProfileLookupCallback callback = new ProfileLookupCallback() {
                    @Override
                    public void onProfileLookupSucceeded(String profileName, UUID profileId) {
                        NameAndId profile = new NameAndId(profileId, profileName);
                        server.services().nameToIdCache().add(profile);
                        this.movePlayerFile(worldNewPlayerDirectory, this.getFileNameForProfile(profileName), profileId.toString());
                    }
 
                    @Override
                    public void onProfileLookupFailed(String profileName, Exception exception) {
                        OldUsersConverter.LOGGER.warn("Could not lookup user uuid for {}", profileName, exception);
                        if (exception instanceof ProfileNotFoundException) {
                            String fileNameForProfile = this.getFileNameForProfile(profileName);
                            this.movePlayerFile(unknownPlayerDirectory, fileNameForProfile, fileNameForProfile);
                        } else {
                            throw new OldUsersConverter.ConversionError("Could not request user " + profileName + " from backend systems", exception);
                        }
                    }
 
                    private void movePlayerFile(File directory, String oldName, String newName) {
                        File oldFileName = new File(worldPlayerDirectory, oldName + ".dat");
                        File newFileName = new File(directory, newName + ".dat");
                        OldUsersConverter.ensureDirectoryExists(directory);
                        if (!oldFileName.renameTo(newFileName)) {
                            throw new OldUsersConverter.ConversionError("Could not convert file for " + oldName);
                        }
                    }
 
                    private String getFileNameForProfile(String profileName) {
                        String fileName = null;
 
                        for (String name : names) {
                            if (name != null && name.equalsIgnoreCase(profileName)) {
                                fileName = name;
                                break;
                            }
                        }
 
                        if (fileName == null) {
                            throw new OldUsersConverter.ConversionError("Could not find the filename for " + profileName + " anymore");
                        } else {
                            return fileName;
                        }
                    }
                };
                lookupPlayers(server, Lists.newArrayList(names), callback);
                return true;
            } catch (OldUsersConverter.ConversionError var12) {
                LOGGER.error("Conversion failed, please try again later", (Throwable)var12);
                return false;
            }
        } else {
            return true;
        }
    }
 
    private static void ensureDirectoryExists(File directory) {
        if (directory.exists()) {
            if (!directory.isDirectory()) {
                throw new OldUsersConverter.ConversionError("Can't create directory " + directory.getName() + " in world save directory.");
            }
        } else if (!directory.mkdirs()) {
            throw new OldUsersConverter.ConversionError("Can't create directory " + directory.getName() + " in world save directory.");
        }
    }
 
    public static boolean areOldUserlistsRemoved() {
        boolean foundUserBanlist = false;
        if (OLD_USERBANLIST.exists() && OLD_USERBANLIST.isFile()) {
            foundUserBanlist = true;
        }
 
        boolean foundIpBanlist = false;
        if (OLD_IPBANLIST.exists() && OLD_IPBANLIST.isFile()) {
            foundIpBanlist = true;
        }
 
        boolean foundOpList = false;
        if (OLD_OPLIST.exists() && OLD_OPLIST.isFile()) {
            foundOpList = true;
        }
 
        boolean foundWhitelist = false;
        if (OLD_WHITELIST.exists() && OLD_WHITELIST.isFile()) {
            foundWhitelist = true;
        }
 
        if (!foundUserBanlist && !foundIpBanlist && !foundOpList && !foundWhitelist) {
            return true;
        } else {
            LOGGER.warn("**** FAILED TO START THE SERVER AFTER ACCOUNT CONVERSION!");
            LOGGER.warn("** please remove the following files and restart the server:");
            if (foundUserBanlist) {
                LOGGER.warn("* {}", OLD_USERBANLIST.getName());
            }
 
            if (foundIpBanlist) {
                LOGGER.warn("* {}", OLD_IPBANLIST.getName());
            }
 
            if (foundOpList) {
                LOGGER.warn("* {}", OLD_OPLIST.getName());
            }
 
            if (foundWhitelist) {
                LOGGER.warn("* {}", OLD_WHITELIST.getName());
            }
 
            return false;
        }
    }
 
    private static void renameOldFile(File file) {
        File newFile = new File(file.getName() + ".converted");
        file.renameTo(newFile);
    }
 
    private static Date parseDate(String dateString, Date defaultValue) {
        Date parsedDate;
        try {
            parsedDate = BanListEntry.DATE_FORMAT.parse(dateString);
        } catch (ParseException var4) {
            parsedDate = defaultValue;
        }
 
        return parsedDate;
    }
 
    private static class ConversionError extends RuntimeException {
        private ConversionError(String message, Throwable cause) {
            super(message, cause);
        }
 
        private ConversionError(String message) {
            super(message);
        }
    }
}

引用的其他类

  • UUIDUtil

    • 引用位置: 方法调用
    • 关联成员: UUIDUtil.createOfflinePlayerUUID()
  • MinecraftServer

    • 引用位置: 参数
  • DedicatedServer

    • 引用位置: 参数
  • EmptyNotificationService

    • 引用位置: 构造调用
    • 关联成员: EmptyNotificationService()
  • IpBanList

    • 引用位置: 构造调用
    • 关联成员: IpBanList()
  • IpBanListEntry

    • 引用位置: 构造调用
    • 关联成员: IpBanListEntry()
  • NameAndId

    • 引用位置: 构造调用
    • 关联成员: NameAndId()
  • ServerOpList

    • 引用位置: 构造调用
    • 关联成员: ServerOpList()
  • ServerOpListEntry

    • 引用位置: 构造调用
    • 关联成员: ServerOpListEntry()
  • UserBanList

    • 引用位置: 构造调用
    • 关联成员: UserBanList()
  • UserBanListEntry

    • 引用位置: 构造调用
    • 关联成员: UserBanListEntry()
  • UserWhiteList

    • 引用位置: 构造调用
    • 关联成员: UserWhiteList()
  • UserWhiteListEntry

    • 引用位置: 构造调用
    • 关联成员: UserWhiteListEntry()
  • StringUtil

    • 引用位置: 方法调用
    • 关联成员: StringUtil.isNullOrEmpty()
  • EventLogDirectory

    • 引用位置: 参数/字段/构造调用
    • 关联成员: File()