From 2de3848cc3d7fd580bbd87ab057a0d1c68cb9698 Mon Sep 17 00:00:00 2001 From: ljacqu Date: Mon, 14 Mar 2016 21:48:33 +0100 Subject: [PATCH] #430 Remove PlayerAuth constructors in favor of builder - Remove various PlayerAuth constructors - Clean up FlatFile class - Add some javadoc to PlayerAuth --- src/main/java/fr/xephi/authme/AuthMe.java | 5 +- .../xephi/authme/cache/auth/PlayerAuth.java | 113 ++------ .../authme/converter/CrazyLoginConverter.java | 29 +- .../authme/converter/vAuthFileReader.java | 14 +- .../xephi/authme/converter/xAuthToFlat.java | 14 +- .../fr/xephi/authme/datasource/FlatFile.java | 252 +++++------------- 6 files changed, 125 insertions(+), 302 deletions(-) diff --git a/src/main/java/fr/xephi/authme/AuthMe.java b/src/main/java/fr/xephi/authme/AuthMe.java index b4827cef..3fe90ba9 100644 --- a/src/main/java/fr/xephi/authme/AuthMe.java +++ b/src/main/java/fr/xephi/authme/AuthMe.java @@ -677,7 +677,10 @@ public class AuthMe extends JavaPlugin { } String name = player.getName().toLowerCase(); if (PlayerCache.getInstance().isAuthenticated(name) && !player.isDead() && Settings.isSaveQuitLocationEnabled) { - final PlayerAuth auth = new PlayerAuth(player.getName().toLowerCase(), player.getLocation().getX(), player.getLocation().getY(), player.getLocation().getZ(), player.getWorld().getName(), player.getName()); + final PlayerAuth auth = PlayerAuth.builder() + .name(player.getName().toLowerCase()) + .realName(player.getName()) + .location(player.getLocation()).build(); database.updateQuitLoc(auth); } if (LimboCache.getInstance().hasLimboPlayer(name)) { diff --git a/src/main/java/fr/xephi/authme/cache/auth/PlayerAuth.java b/src/main/java/fr/xephi/authme/cache/auth/PlayerAuth.java index c8b4c6b5..9bc57e20 100644 --- a/src/main/java/fr/xephi/authme/cache/auth/PlayerAuth.java +++ b/src/main/java/fr/xephi/authme/cache/auth/PlayerAuth.java @@ -8,20 +8,24 @@ import static com.google.common.base.Preconditions.checkNotNull; /** + * AuthMe player data. */ public class PlayerAuth { + /** The player's name in lowercase, e.g. "xephi". */ private String nickname; + /** The player's name in the correct casing, e.g. "Xephi". */ + private String realName; private HashedPassword password; + private String email; private String ip; + private int groupId; private long lastLogin; + // Fields storing the player's quit location private double x; private double y; private double z; private String world; - private int groupId; - private String email; - private String realName; /** * @param serialized String @@ -31,80 +35,19 @@ public class PlayerAuth { } /** - * Constructor for PlayerAuth. + * Constructor. Instantiate objects with the {@link #builder() builder}. * - * @param nickname String - * @param x double - * @param y double - * @param z double - * @param world String - * @param realName String - */ - public PlayerAuth(String nickname, double x, double y, double z, String world, String realName) { - this(nickname, new HashedPassword(""), -1, "127.0.0.1", System.currentTimeMillis(), x, y, z, world, - "your@email.com", realName); - } - - /** - * Constructor for PlayerAuth. - * - * @param nickname String - * @param hash String - * @param ip String - * @param lastLogin long - * @param realName String - */ - public PlayerAuth(String nickname, String hash, String ip, long lastLogin, String realName) { - this(nickname, new HashedPassword(hash), -1, ip, lastLogin, 0, 0, 0, "world", "your@email.com", realName); - } - - /** - * Constructor for PlayerAuth. - * - * @param nickname String - * @param hash String - * @param ip String - * @param lastLogin long - * @param email String - * @param realName String - */ - public PlayerAuth(String nickname, String hash, String ip, long lastLogin, String email, String realName) { - this(nickname, new HashedPassword(hash), -1, ip, lastLogin, 0, 0, 0, "world", email, realName); - } - - /** - * Constructor for PlayerAuth. - * - * @param nickname String - * @param hash String - * @param ip String - * @param lastLogin long - * @param x double - * @param y double - * @param z double - * @param world String - * @param email String - * @param realName String - */ - public PlayerAuth(String nickname, String hash, String ip, long lastLogin, double x, double y, double z, - String world, String email, String realName) { - this(nickname, new HashedPassword(hash), -1, ip, lastLogin, x, y, z, world, email, realName); - } - - /** - * Constructor for PlayerAuth. - * - * @param nickname String - * @param password String - * @param groupId int - * @param ip String - * @param lastLogin long - * @param x double - * @param y double - * @param z double - * @param world String - * @param email String - * @param realName String + * @param nickname all lowercase name of the player + * @param password password + * @param groupId the group id + * @param ip the associated ip address + * @param lastLogin player's last login (timestamp) + * @param x quit location: x coordinate + * @param y quit location: y coordinate + * @param z quit location: z coordinate + * @param world quit location: world name + * @param email the associated email + * @param realName the player's name with proper casing */ private PlayerAuth(String nickname, HashedPassword password, int groupId, String ip, long lastLogin, double x, double y, double z, String world, String email, String realName) { @@ -121,24 +64,6 @@ public class PlayerAuth { this.realName = realName; } - /** - * Method set. - * - * @param auth PlayerAuth - */ - public void set(PlayerAuth auth) { - this.setEmail(auth.getEmail()); - this.setPassword(auth.getPassword()); - this.setIp(auth.getIp()); - this.setLastLogin(auth.getLastLogin()); - this.setNickname(auth.getNickname()); - this.setQuitLocX(auth.getQuitLocX()); - this.setQuitLocY(auth.getQuitLocY()); - this.setQuitLocZ(auth.getQuitLocZ()); - this.setWorld(auth.getWorld()); - this.setRealName(auth.getRealName()); - } - public void setNickname(String nickname) { this.nickname = nickname.toLowerCase(); diff --git a/src/main/java/fr/xephi/authme/converter/CrazyLoginConverter.java b/src/main/java/fr/xephi/authme/converter/CrazyLoginConverter.java index 8b4ee564..c617ccad 100644 --- a/src/main/java/fr/xephi/authme/converter/CrazyLoginConverter.java +++ b/src/main/java/fr/xephi/authme/converter/CrazyLoginConverter.java @@ -31,27 +31,13 @@ public class CrazyLoginConverter implements Converter { this.sender = sender; } - /** - * Method getInstance. - * - * @return CrazyLoginConverter - */ - public CrazyLoginConverter getInstance() { - return this; - } - - /** - * Method run. - * - * @see java.lang.Runnable#run() - */ @Override public void run() { String fileName = Settings.crazyloginFileName; try { File source = new File(AuthMe.getInstance().getDataFolder() + File.separator + fileName); if (!source.exists()) { - sender.sendMessage("Error while trying to import datas, please put " + fileName + " in AuthMe folder!"); + sender.sendMessage("Error while trying to import data, please put " + fileName + " in AuthMe folder!"); return; } String line; @@ -59,14 +45,17 @@ public class CrazyLoginConverter implements Converter { while ((line = users.readLine()) != null) { if (line.contains("|")) { String[] args = line.split("\\|"); - if (args.length < 2) + if (args.length < 2 || "name".equalsIgnoreCase(args[0])) { continue; - if (args[0].equalsIgnoreCase("name")) - continue; - String playerName = args[0].toLowerCase(); + } + String playerName = args[0]; String psw = args[1]; if (psw != null) { - PlayerAuth auth = new PlayerAuth(playerName, psw, "127.0.0.1", System.currentTimeMillis(), playerName); + PlayerAuth auth = PlayerAuth.builder() + .name(playerName.toLowerCase()) + .realName(playerName) + .password(psw, null) + .build(); database.saveAuth(auth); } } diff --git a/src/main/java/fr/xephi/authme/converter/vAuthFileReader.java b/src/main/java/fr/xephi/authme/converter/vAuthFileReader.java index bb25b04b..4c5b3b4f 100644 --- a/src/main/java/fr/xephi/authme/converter/vAuthFileReader.java +++ b/src/main/java/fr/xephi/authme/converter/vAuthFileReader.java @@ -12,6 +12,8 @@ import java.io.IOException; import java.util.Scanner; import java.util.UUID; +import static fr.xephi.authme.util.StringUtils.makePath; + class vAuthFileReader { private final AuthMe plugin; @@ -28,7 +30,7 @@ class vAuthFileReader { } public void convert() { - final File file = new File(plugin.getDataFolder().getParent() + File.separator + "vAuth" + File.separator + "passwords.yml"); + final File file = new File(plugin.getDataFolder().getParent(), makePath("vAuth", "passwords.yml")); Scanner scanner; try { scanner = new Scanner(file); @@ -46,9 +48,15 @@ class vAuthFileReader { } if (pname == null) continue; - auth = new PlayerAuth(pname.toLowerCase(), password, "127.0.0.1", System.currentTimeMillis(), "your@email.com", pname); + auth = PlayerAuth.builder() + .name(pname.toLowerCase()) + .realName(pname) + .password(password, null).build(); } else { - auth = new PlayerAuth(name.toLowerCase(), password, "127.0.0.1", System.currentTimeMillis(), "your@email.com", name); + auth = PlayerAuth.builder() + .name(name.toLowerCase()) + .realName(name) + .password(password, null).build(); } database.saveAuth(auth); } diff --git a/src/main/java/fr/xephi/authme/converter/xAuthToFlat.java b/src/main/java/fr/xephi/authme/converter/xAuthToFlat.java index 8d9bca70..34ec2a5e 100644 --- a/src/main/java/fr/xephi/authme/converter/xAuthToFlat.java +++ b/src/main/java/fr/xephi/authme/converter/xAuthToFlat.java @@ -50,7 +50,10 @@ class xAuthToFlat { String pl = getIdPlayer(id); String psw = getPassword(id); if (psw != null && !psw.isEmpty() && pl != null) { - PlayerAuth auth = new PlayerAuth(pl, psw, "192.168.0.1", 0, "your@email.com", pl); + PlayerAuth auth = PlayerAuth.builder() + .name(pl.toLowerCase()) + .realName(pl) + .password(psw, null).build(); database.saveAuth(auth); } } @@ -69,7 +72,8 @@ class xAuthToFlat { PreparedStatement ps = null; ResultSet rs = null; try { - String sql = String.format("SELECT `playername` FROM `%s` WHERE `id` = ?", xAuth.getPlugin().getDatabaseController().getTable(DatabaseTables.ACCOUNT)); + String sql = String.format("SELECT `playername` FROM `%s` WHERE `id` = ?", + xAuth.getPlugin().getDatabaseController().getTable(DatabaseTables.ACCOUNT)); ps = conn.prepareStatement(sql); ps.setInt(1, id); rs = ps.executeQuery(); @@ -91,7 +95,8 @@ class xAuthToFlat { PreparedStatement ps = null; ResultSet rs = null; try { - String sql = String.format("SELECT * FROM `%s`", xAuth.getPlugin().getDatabaseController().getTable(DatabaseTables.ACCOUNT)); + String sql = String.format("SELECT * FROM `%s`", + xAuth.getPlugin().getDatabaseController().getTable(DatabaseTables.ACCOUNT)); ps = conn.prepareStatement(sql); rs = ps.executeQuery(); while (rs.next()) { @@ -112,7 +117,8 @@ class xAuthToFlat { PreparedStatement ps = null; ResultSet rs = null; try { - String sql = String.format("SELECT `password`, `pwtype` FROM `%s` WHERE `id` = ?", xAuth.getPlugin().getDatabaseController().getTable(DatabaseTables.ACCOUNT)); + String sql = String.format("SELECT `password`, `pwtype` FROM `%s` WHERE `id` = ?", + xAuth.getPlugin().getDatabaseController().getTable(DatabaseTables.ACCOUNT)); ps = conn.prepareStatement(sql); ps.setInt(1, accountId); rs = ps.executeQuery(); diff --git a/src/main/java/fr/xephi/authme/datasource/FlatFile.java b/src/main/java/fr/xephi/authme/datasource/FlatFile.java index 0765c787..288012da 100644 --- a/src/main/java/fr/xephi/authme/datasource/FlatFile.java +++ b/src/main/java/fr/xephi/authme/datasource/FlatFile.java @@ -10,6 +10,7 @@ import fr.xephi.authme.settings.Settings; import java.io.BufferedReader; import java.io.BufferedWriter; +import java.io.Closeable; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; @@ -19,6 +20,8 @@ import java.util.ArrayList; import java.util.List; /** + * Deprecated flat file datasource. The only method guaranteed to work is {@link FlatFile#getAllAuths()} + * as to migrate the entries to {@link SQLite} when AuthMe starts. */ @Deprecated public class FlatFile implements DataSource { @@ -76,19 +79,11 @@ public class FlatFile implements DataSource { return true; } } - } catch (FileNotFoundException ex) { - ConsoleLogger.showError(ex.getMessage()); - return false; } catch (IOException ex) { ConsoleLogger.showError(ex.getMessage()); return false; } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) { - } - } + silentClose(br); } return false; } @@ -110,17 +105,12 @@ public class FlatFile implements DataSource { BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(source, true)); - bw.write(auth.getNickname() + ":" + auth.getPassword() + ":" + auth.getIp() + ":" + auth.getLastLogin() + ":" + auth.getQuitLocX() + ":" + auth.getQuitLocY() + ":" + auth.getQuitLocZ() + ":" + auth.getWorld() + ":" + auth.getEmail() + "\n"); + bw.write(auth.getNickname() + ":" + auth.getPassword().getHash() + ":" + auth.getIp() + ":" + auth.getLastLogin() + ":" + auth.getQuitLocX() + ":" + auth.getQuitLocY() + ":" + auth.getQuitLocZ() + ":" + auth.getWorld() + ":" + auth.getEmail() + "\n"); } catch (IOException ex) { ConsoleLogger.showError(ex.getMessage()); return false; } finally { - if (bw != null) { - try { - bw.close(); - } catch (IOException ignored) { - } - } + silentClose(bw); } return true; } @@ -131,6 +121,7 @@ public class FlatFile implements DataSource { } @Override + // Note ljacqu 20151230: This does not persist the salt; it is not supported in flat file. public boolean updatePassword(String user, HashedPassword password) { user = user.toLowerCase(); if (!isAuthAvailable(user)) { @@ -144,45 +135,18 @@ public class FlatFile implements DataSource { while ((line = br.readLine()) != null) { String[] args = line.split(":"); if (args[0].equals(user)) { - // Note ljacqu 20151230: This does not persist the salt; it is not supported in flat file. - switch (args.length) { - case 4: { - newAuth = new PlayerAuth(args[0], password.getHash(), args[2], Long.parseLong(args[3]), 0, 0, 0, "world", "your@email.com", args[0]); - break; - } - case 7: { - newAuth = new PlayerAuth(args[0], password.getHash(), args[2], Long.parseLong(args[3]), Double.parseDouble(args[4]), Double.parseDouble(args[5]), Double.parseDouble(args[6]), "world", "your@email.com", args[0]); - break; - } - case 8: { - newAuth = new PlayerAuth(args[0], password.getHash(), args[2], Long.parseLong(args[3]), Double.parseDouble(args[4]), Double.parseDouble(args[5]), Double.parseDouble(args[6]), args[7], "your@email.com", args[0]); - break; - } - case 9: { - newAuth = new PlayerAuth(args[0], password.getHash(), args[2], Long.parseLong(args[3]), Double.parseDouble(args[4]), Double.parseDouble(args[5]), Double.parseDouble(args[6]), args[7], args[8], args[0]); - break; - } - default: { - newAuth = new PlayerAuth(args[0], password.getHash(), args[2], 0, 0, 0, 0, "world", "your@email.com", args[0]); - break; - } + newAuth = buildAuthFromArray(args); + if (newAuth != null) { + newAuth.setPassword(password); } break; } } - } catch (FileNotFoundException ex) { - ConsoleLogger.showError(ex.getMessage()); - return false; } catch (IOException ex) { ConsoleLogger.showError(ex.getMessage()); return false; } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) { - } - } + silentClose(br); } if (newAuth != null) { removeAuth(user); @@ -204,44 +168,19 @@ public class FlatFile implements DataSource { while ((line = br.readLine()) != null) { String[] args = line.split(":"); if (args[0].equalsIgnoreCase(auth.getNickname())) { - switch (args.length) { - case 4: { - newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), 0, 0, 0, "world", "your@email.com", args[0]); - break; - } - case 7: { - newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), Double.parseDouble(args[4]), Double.parseDouble(args[5]), Double.parseDouble(args[6]), "world", "your@email.com", args[0]); - break; - } - case 8: { - newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), Double.parseDouble(args[4]), Double.parseDouble(args[5]), Double.parseDouble(args[6]), args[7], "your@email.com", args[0]); - break; - } - case 9: { - newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), Double.parseDouble(args[4]), Double.parseDouble(args[5]), Double.parseDouble(args[6]), args[7], args[8], args[0]); - break; - } - default: { - newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), 0, 0, 0, "world", "your@email.com", args[0]); - break; - } + newAuth = buildAuthFromArray(args); + if (newAuth != null) { + newAuth.setLastLogin(auth.getLastLogin()); + newAuth.setIp(auth.getIp()); } break; } } - } catch (FileNotFoundException ex) { - ConsoleLogger.showError(ex.getMessage()); - return false; } catch (IOException ex) { ConsoleLogger.showError(ex.getMessage()); return false; } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) { - } - } + silentClose(br); } if (newAuth != null) { removeAuth(auth.getNickname()); @@ -263,23 +202,22 @@ public class FlatFile implements DataSource { while ((line = br.readLine()) != null) { String[] args = line.split(":"); if (args[0].equalsIgnoreCase(auth.getNickname())) { - newAuth = new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), auth.getQuitLocX(), auth.getQuitLocY(), auth.getQuitLocZ(), auth.getWorld(), auth.getEmail(), args[0]); + newAuth = buildAuthFromArray(args); + if (newAuth != null) { + newAuth.setQuitLocX(auth.getQuitLocX()); + newAuth.setQuitLocY(auth.getQuitLocY()); + newAuth.setQuitLocZ(auth.getQuitLocZ()); + newAuth.setWorld(auth.getWorld()); + newAuth.setEmail(auth.getEmail()); + } break; } } - } catch (FileNotFoundException ex) { - ConsoleLogger.showError(ex.getMessage()); - return false; } catch (IOException ex) { ConsoleLogger.showError(ex.getMessage()); return false; } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) { - } - } + silentClose(br); } if (newAuth != null) { removeAuth(auth.getNickname()); @@ -311,25 +249,12 @@ public class FlatFile implements DataSource { for (String l : lines) { bw.write(l + "\n"); } - } catch (FileNotFoundException ex) { - ConsoleLogger.showError(ex.getMessage()); - return cleared; } catch (IOException ex) { ConsoleLogger.showError(ex.getMessage()); return cleared; } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) { - } - } - if (bw != null) { - try { - bw.close(); - } catch (IOException ignored) { - } - } + silentClose(br); + silentClose(bw); } return cleared; } @@ -355,25 +280,12 @@ public class FlatFile implements DataSource { for (String l : lines) { bw.write(l + "\n"); } - } catch (FileNotFoundException ex) { - ConsoleLogger.showError(ex.getMessage()); - return false; } catch (IOException ex) { ConsoleLogger.showError(ex.getMessage()); return false; } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) { - } - } - if (bw != null) { - try { - bw.close(); - } catch (IOException ignored) { - } - } + silentClose(br); + silentClose(bw); } return true; } @@ -387,35 +299,14 @@ public class FlatFile implements DataSource { while ((line = br.readLine()) != null) { String[] args = line.split(":"); if (args[0].equalsIgnoreCase(user)) { - switch (args.length) { - case 2: - return new PlayerAuth(args[0], args[1], "192.168.0.1", 0, "your@email.com", args[0]); - case 3: - return new PlayerAuth(args[0], args[1], args[2], 0, "your@email.com", args[0]); - case 4: - return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), "your@email.com", args[0]); - case 7: - return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Double.parseDouble(args[4]), Double.parseDouble(args[5]), Double.parseDouble(args[6]), "unavailableworld", "your@email.com", args[0]); - case 8: - return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Double.parseDouble(args[4]), Double.parseDouble(args[5]), Double.parseDouble(args[6]), args[7], "your@email.com", args[0]); - case 9: - return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Double.parseDouble(args[4]), Double.parseDouble(args[5]), Double.parseDouble(args[6]), args[7], args[8], args[0]); - } + return buildAuthFromArray(args); } } - } catch (FileNotFoundException ex) { - ConsoleLogger.showError(ex.getMessage()); - return null; } catch (IOException ex) { ConsoleLogger.showError(ex.getMessage()); return null; } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) { - } - } + silentClose(br); } return null; } @@ -437,7 +328,10 @@ public class FlatFile implements DataSource { while ((line = br.readLine()) != null) { String[] args = line.split(":"); if (args[0].equals(auth.getNickname())) { - newAuth = new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Double.parseDouble(args[4]), Double.parseDouble(args[5]), Double.parseDouble(args[6]), args[7], auth.getEmail(), args[0]); + newAuth = buildAuthFromArray(args); + if (newAuth != null) { + newAuth.setEmail(auth.getEmail()); + } break; } } @@ -545,18 +439,8 @@ public class FlatFile implements DataSource { ConsoleLogger.showError(ex.getMessage()); } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) { - } - } - if (bw != null) { - try { - bw.close(); - } catch (IOException ignored) { - } - } + silentClose(br); + silentClose(bw); } } @@ -595,12 +479,7 @@ public class FlatFile implements DataSource { ConsoleLogger.showError(ex.getMessage()); return result; } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) { - } - } + silentClose(br); } return result; } @@ -624,32 +503,15 @@ public class FlatFile implements DataSource { String line; while ((line = br.readLine()) != null) { String[] args = line.split(":"); - // We expect to encounter 2, 3, 4, 7, 8 or 9 fields. Ignore the line otherwise - if (args.length >= 2 && args.length != 5 && args.length != 6 && args.length <= 9) { - PlayerAuth.Builder builder = PlayerAuth.builder() - .name(args[0]).realName(args[0]) - .password(args[1], null); - if (args.length >= 3) builder.ip(args[2]); - if (args.length >= 4) builder.lastLogin(Long.parseLong(args[3])); - if (args.length >= 7) { - builder.locX(Double.parseDouble(args[4])) - .locY(Double.parseDouble(args[5])) - .locZ(Double.parseDouble(args[6])); - } - if (args.length >= 8) builder.locWorld(args[7]); - if (args.length >= 9) builder.email(args[8]); - auths.add(builder.build()); + PlayerAuth auth = buildAuthFromArray(args); + if (auth != null) { + auths.add(auth); } } } catch (IOException ex) { ConsoleLogger.logException("Error while getting auths from flatfile:", ex); } finally { - if (br != null) { - try { - br.close(); - } catch (IOException ignored) { - } - } + silentClose(br); } return auths; } @@ -663,4 +525,34 @@ public class FlatFile implements DataSource { public boolean isEmailStored(String email) { throw new UnsupportedOperationException("Flat file no longer supported"); } + + private static PlayerAuth buildAuthFromArray(String[] args) { + // Format allows 2, 3, 4, 7, 8, 9 fields. Anything else is unknown + if (args.length >= 2 && args.length <= 9 && args.length != 5 && args.length != 6) { + PlayerAuth.Builder builder = PlayerAuth.builder() + .name(args[0]).realName(args[0]).password(args[1], null); + + if (args.length >= 3) builder.ip(args[2]); + if (args.length >= 4) builder.lastLogin(Long.parseLong(args[3])); + if (args.length >= 7) { + builder.locX(Double.parseDouble(args[4])) + .locY(Double.parseDouble(args[5])) + .locZ(Double.parseDouble(args[6])); + } + if (args.length >= 8) builder.locWorld(args[7]); + if (args.length >= 9) builder.email(args[8]); + return builder.build(); + } + return null; + } + + private static void silentClose(Closeable closeable) { + if (closeable != null) { + try { + closeable.close(); + } catch (IOException ignored) { + // silent close + } + } + } }