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.createOfflinePlayerUUID()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
EmptyNotificationService()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
IpBanList()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
IpBanListEntry()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
NameAndId()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
ServerOpList()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
ServerOpListEntry()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
UserBanList()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
UserBanListEntry()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
UserWhiteList()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
UserWhiteListEntry()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
StringUtil.isNullOrEmpty()
- 引用位置:
-
- 引用位置:
参数/字段/构造调用 - 关联成员:
File()
- 引用位置: