package cn.citycraft.AuthMe.datasource; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import cn.citycraft.AuthMe.ConsoleLogger; import cn.citycraft.AuthMe.cache.auth.PlayerAuth; import cn.citycraft.AuthMe.settings.Settings; public class SQLite implements DataSource { private final String columnEmail; private final String columnGroup; private final String columnID; private final String columnIp; private final String columnLastLogin; private final String columnLogged; private final String columnName; private final String columnPassword; private final String columnRealName; private final String columnSalt; private Connection con; private final String database; private final String lastlocWorld; private final String lastlocX; private final String lastlocY; private final String lastlocZ; private final String tableName; public SQLite() throws ClassNotFoundException, SQLException { this.database = Settings.getMySQLDatabase; this.tableName = Settings.getMySQLTablename; this.columnName = Settings.getMySQLColumnName; this.columnPassword = Settings.getMySQLColumnPassword; this.columnIp = Settings.getMySQLColumnIp; this.columnLastLogin = Settings.getMySQLColumnLastLogin; this.columnSalt = Settings.getMySQLColumnSalt; this.columnGroup = Settings.getMySQLColumnGroup; this.lastlocX = Settings.getMySQLlastlocX; this.lastlocY = Settings.getMySQLlastlocY; this.lastlocZ = Settings.getMySQLlastlocZ; this.lastlocWorld = Settings.getMySQLlastlocWorld; this.columnEmail = Settings.getMySQLColumnEmail; this.columnID = Settings.getMySQLColumnId; this.columnLogged = Settings.getMySQLColumnLogged; this.columnRealName = Settings.getMySQLColumnRealName; try { this.connect(); this.setup(); } catch (ClassNotFoundException | SQLException cnf) { ConsoleLogger.showError("无法使用 SQLite 保存用户数据... !"); throw cnf; } } @Override public List autoPurgeDatabase(final long until) { PreparedStatement pst = null; ResultSet rs = null; final List list = new ArrayList<>(); try { pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE " + columnLastLogin + "(); } finally { close(rs); close(pst); } } @Override public synchronized void close() { try { con.close(); } catch (final SQLException ex) { ConsoleLogger.showError(ex.getMessage()); } } @Override public int getAccountsRegistered() { int result = 0; PreparedStatement pst = null; ResultSet rs; try { pst = con.prepareStatement("SELECT COUNT(*) FROM " + tableName + ";"); rs = pst.executeQuery(); if (rs != null && rs.next()) { result = rs.getInt(1); } } catch (final SQLException ex) { ConsoleLogger.showError(ex.getMessage()); return result; } finally { close(pst); } return result; } @Override public List getAllAuths() { final List auths = new ArrayList<>(); PreparedStatement pst = null; ResultSet rs; try { pst = con.prepareStatement("SELECT * FROM " + tableName + ";"); rs = pst.executeQuery(); while (rs.next()) { PlayerAuth pAuth; if (rs.getString(columnIp).isEmpty()) { pAuth = new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), "127.0.0.1", rs.getLong(columnLastLogin), rs.getDouble(lastlocX), rs.getDouble(lastlocY), rs .getDouble(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail), rs.getString(columnRealName)); } else { if (!columnSalt.isEmpty()) { pAuth = new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), rs.getString(columnSalt), rs.getInt(columnGroup), rs.getString(columnIp), rs .getLong(columnLastLogin), rs.getDouble(lastlocX), rs.getDouble(lastlocY), rs.getDouble(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail), rs .getString(columnRealName)); } else { pAuth = new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getDouble(lastlocX), rs .getDouble(lastlocY), rs.getDouble(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail), rs.getString(columnRealName)); } } auths.add(pAuth); } } catch (final SQLException ex) { ConsoleLogger.showError(ex.getMessage()); return auths; } finally { close(pst); } return auths; } @Override public List getAllAuthsByEmail(final String email) { PreparedStatement pst = null; ResultSet rs = null; final List countEmail = new ArrayList<>(); try { pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE " + columnEmail + "=?;"); pst.setString(1, email); rs = pst.executeQuery(); while (rs.next()) { countEmail.add(rs.getString(columnName)); } return countEmail; } catch (final SQLException ex) { ConsoleLogger.showError(ex.getMessage()); return new ArrayList<>(); } catch (final NullPointerException npe) { return new ArrayList<>(); } finally { close(rs); close(pst); } } @Override public List getAllAuthsByIp(final String ip) { PreparedStatement pst = null; ResultSet rs = null; final List countIp = new ArrayList<>(); try { pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE " + columnIp + "=?;"); pst.setString(1, ip); rs = pst.executeQuery(); while (rs.next()) { countIp.add(rs.getString(columnName)); } return countIp; } catch (final SQLException ex) { ConsoleLogger.showError(ex.getMessage()); return new ArrayList<>(); } catch (final NullPointerException npe) { return new ArrayList<>(); } finally { close(rs); close(pst); } } @Override public List getAllAuthsByName(final PlayerAuth auth) { PreparedStatement pst = null; ResultSet rs = null; final List countIp = new ArrayList<>(); try { pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE " + columnIp + "=?;"); pst.setString(1, auth.getIp()); rs = pst.executeQuery(); while (rs.next()) { countIp.add(rs.getString(columnName)); } return countIp; } catch (final SQLException ex) { ConsoleLogger.showError(ex.getMessage()); return new ArrayList<>(); } catch (final NullPointerException npe) { return new ArrayList<>(); } finally { close(rs); close(pst); } } @Override public synchronized PlayerAuth getAuth(final String user) { PreparedStatement pst = null; ResultSet rs = null; try { pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE LOWER(" + columnName + ")=LOWER(?);"); pst.setString(1, user); rs = pst.executeQuery(); if (rs.next()) { if (rs.getString(columnIp).isEmpty()) { return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), "192.168.0.1", rs.getLong(columnLastLogin), rs.getDouble(lastlocX), rs.getDouble(lastlocY), rs .getDouble(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail), rs.getString(columnRealName)); } if (!columnSalt.isEmpty()) { return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), rs.getString(columnSalt), rs.getInt(columnGroup), rs.getString(columnIp), rs .getLong(columnLastLogin), rs.getDouble(lastlocX), rs.getDouble(lastlocY), rs.getDouble(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail), rs .getString(columnRealName)); } return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getDouble(lastlocX), rs.getDouble(lastlocY), rs .getDouble(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail), rs.getString(columnRealName)); } return null; } catch (final SQLException ex) { ConsoleLogger.showError(ex.getMessage()); return null; } finally { close(rs); close(pst); } } @Override public int getIps(final String ip) { PreparedStatement pst = null; ResultSet rs = null; int countIp = 0; try { pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE " + columnIp + "=?;"); pst.setString(1, ip); rs = pst.executeQuery(); while (rs.next()) { countIp++; } return countIp; } catch (final SQLException ex) { ConsoleLogger.showError(ex.getMessage()); return 0; } finally { close(rs); close(pst); } } @Override public List getLoggedPlayers() { final List auths = new ArrayList<>(); PreparedStatement pst = null; ResultSet rs; try { pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE " + columnLogged + "=1;"); rs = pst.executeQuery(); while (rs.next()) { PlayerAuth pAuth; if (rs.getString(columnIp).isEmpty()) { pAuth = new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), "127.0.0.1", rs.getLong(columnLastLogin), rs.getDouble(lastlocX), rs.getDouble(lastlocY), rs .getDouble(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail), rs.getString(columnRealName)); } else { if (!columnSalt.isEmpty()) { pAuth = new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), rs.getString(columnSalt), rs.getInt(columnGroup), rs.getString(columnIp), rs .getLong(columnLastLogin), rs.getDouble(lastlocX), rs.getDouble(lastlocY), rs.getDouble(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail), rs .getString(columnRealName)); } else { pAuth = new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getDouble(lastlocX), rs .getDouble(lastlocY), rs.getDouble(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail), rs.getString(columnRealName)); } } auths.add(pAuth); } } catch (final SQLException ex) { ConsoleLogger.showError(ex.getMessage()); return auths; } finally { close(pst); } return auths; } @Override public DataSourceType getType() { return DataSourceType.SQLITE; } @Override public synchronized boolean isAuthAvailable(final String user) { PreparedStatement pst = null; ResultSet rs = null; try { pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE LOWER(" + columnName + ")=LOWER(?);"); pst.setString(1, user); rs = pst.executeQuery(); return rs.next(); } catch (final SQLException ex) { ConsoleLogger.showError(ex.getMessage()); return false; } finally { close(rs); close(pst); } } @Override public boolean isLogged(final String user) { PreparedStatement pst = null; ResultSet rs = null; try { pst = con.prepareStatement("SELECT * FROM " + tableName + " WHERE LOWER(" + columnName + ")=?;"); pst.setString(1, user); rs = pst.executeQuery(); if (rs.next()) { return (rs.getInt(columnLogged) == 1); } } catch (final SQLException ex) { ConsoleLogger.showError(ex.getMessage()); return false; } finally { close(rs); close(pst); } return false; } @Override public void purgeBanned(final List banned) { PreparedStatement pst = null; try { for (final String name : banned) { pst = con.prepareStatement("DELETE FROM " + tableName + " WHERE " + columnName + "=?;"); pst.setString(1, name); pst.executeUpdate(); } } catch (final SQLException ex) { ConsoleLogger.showError(ex.getMessage()); } finally { close(pst); } } @Override public int purgeDatabase(final long until) { PreparedStatement pst = null; try { pst = con.prepareStatement("DELETE FROM " + tableName + " WHERE " + columnLastLogin + "