2020-05-29 10:14:21 +00:00
package me.totalfreedom.totalfreedommod.sql ;
import java.sql.Connection ;
import java.sql.DatabaseMetaData ;
import java.sql.DriverManager ;
import java.sql.PreparedStatement ;
import java.sql.ResultSet ;
import java.sql.SQLException ;
import java.text.MessageFormat ;
2022-04-15 12:27:32 +00:00
import java.util.UUID ;
2020-05-29 10:14:21 +00:00
import me.totalfreedom.totalfreedommod.FreedomService ;
2020-12-25 19:46:43 +00:00
import me.totalfreedom.totalfreedommod.admin.Admin ;
2020-05-29 10:14:21 +00:00
import me.totalfreedom.totalfreedommod.banning.Ban ;
2020-06-30 07:25:38 +00:00
import me.totalfreedom.totalfreedommod.player.PlayerData ;
2020-05-29 10:14:21 +00:00
import me.totalfreedom.totalfreedommod.util.FLog ;
import me.totalfreedom.totalfreedommod.util.FUtil ;
public class SQLite extends FreedomService
{
private final String FILE_NAME = " database.db " ;
private Connection connection ;
@Override
2020-07-01 01:51:06 +00:00
public void onStart ( )
2020-05-29 10:14:21 +00:00
{
connect ( ) ;
checkTables ( ) ;
}
@Override
2020-07-01 01:51:06 +00:00
public void onStop ( )
2020-05-29 10:14:21 +00:00
{
disconnect ( ) ;
}
public void connect ( )
{
try
{
connection = DriverManager . getConnection ( " jdbc:sqlite: " + plugin . getDataFolder ( ) + " / " + FILE_NAME ) ;
FLog . info ( " Successfully connected to the database. " ) ;
}
catch ( SQLException e )
{
FLog . severe ( " Failed to connect to the database: " + e . getMessage ( ) ) ;
}
}
public void disconnect ( )
{
try
{
if ( connection ! = null )
{
connection . close ( ) ;
}
}
catch ( SQLException e )
{
FLog . severe ( " Failed to disconnect from the database: " + e . getMessage ( ) ) ;
}
}
public void checkTables ( )
{
try
{
DatabaseMetaData meta = connection . getMetaData ( ) ;
2020-12-25 19:46:43 +00:00
if ( tableExists ( meta , " bans " ) )
2020-05-29 10:14:21 +00:00
{
try
{
2020-08-10 05:25:04 +00:00
connection . createStatement ( ) . execute ( " CREATE TABLE `bans` (`name` VARCHAR, `uuid` VARCHAR, `ips` VARCHAR, `by` VARCHAR NOT NULL, `at` LONG NOT NULL, `expires` LONG, `reason` VARCHAR); " ) ;
2020-05-29 10:14:21 +00:00
}
catch ( SQLException e )
{
FLog . severe ( " Failed to create the bans table: " + e . getMessage ( ) ) ;
}
}
2020-12-25 19:46:43 +00:00
if ( tableExists ( meta , " admins " ) )
2020-05-29 10:14:21 +00:00
{
try
{
2022-11-17 08:34:45 +00:00
connection . createStatement ( ) . execute ( " CREATE TABLE `admins` (`uuid` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `rank` VARCHAR NOT NULL, `active` BOOLEAN NOT NULL, `last_login` LONG NOT NULL, `command_spy` BOOLEAN NOT NULL, `potion_spy` BOOLEAN NOT NULL, `ac_format` VARCHAR); " ) ;
2020-05-29 10:14:21 +00:00
}
catch ( SQLException e )
{
2020-12-04 00:28:53 +00:00
FLog . severe ( " Failed to create the admins table: " + e . getMessage ( ) ) ;
2020-05-29 10:14:21 +00:00
}
2023-07-25 17:56:06 +00:00
} else
{
try
{
connection . createStatement ( ) . execute ( " ALTER TABLE `admins` DROP COLUMN `ptero_id` " ) ;
} catch ( SQLException e )
{
// Ignore the error. If someone else wants to add WORKING AND TESTED CODE to check if the `ptero_id` column exists, they can, but I couldn't find a good way.
}
2020-05-29 10:14:21 +00:00
}
2020-12-25 19:46:43 +00:00
if ( tableExists ( meta , " players " ) )
2020-06-30 07:25:38 +00:00
{
try
{
2022-04-15 13:52:06 +00:00
connection . createStatement ( ) . execute ( " CREATE TABLE `players` (`uuid` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `notes` VARCHAR, `tag` VARCHAR, `discord_id` VARCHAR, `master_builder` BOOLEAN NOT NULL, `ride_mode` VARCHAR NOT NULL, `coins` INT, `items` VARCHAR, `total_votes` INT NOT NULL, `display_discord` BOOLEAN NOT NULL, `login_message` VARCHAR, `inspect` BOOLEAN NOT NULL); " ) ;
2020-06-30 07:25:38 +00:00
}
catch ( SQLException e )
{
FLog . severe ( " Failed to create the players table: " + e . getMessage ( ) ) ;
}
}
2020-05-29 10:14:21 +00:00
}
catch ( SQLException e )
{
FLog . severe ( " Failed to check tables on database: " + e . getMessage ( ) ) ;
}
}
public void truncate ( String table )
{
try
{
2020-06-30 07:25:38 +00:00
connection . createStatement ( ) . execute ( " DELETE FROM " + table ) ;
2020-05-29 10:14:21 +00:00
}
catch ( SQLException e )
{
FLog . severe ( " Failed to truncate " + table + " : " + e . getMessage ( ) ) ;
}
}
public ResultSet getBanList ( ) throws SQLException
{
return connection . createStatement ( ) . executeQuery ( " SELECT * FROM bans " ) ;
}
2020-12-04 00:28:53 +00:00
public ResultSet getAdminList ( ) throws SQLException
2020-05-29 10:14:21 +00:00
{
2020-12-04 00:28:53 +00:00
return connection . createStatement ( ) . executeQuery ( " SELECT * FROM admins " ) ;
2020-05-29 10:14:21 +00:00
}
2020-12-04 00:28:53 +00:00
public void setAdminValue ( Admin admin , String key , Object value )
2020-05-29 10:14:21 +00:00
{
try
{
2022-04-15 13:09:23 +00:00
Object [ ] data = { key , admin . getUuid ( ) } ;
PreparedStatement statement = connection . prepareStatement ( MessageFormat . format ( " UPDATE admins SET {0}=? WHERE uuid=''{1}'' " , data ) ) ;
2020-05-29 10:14:21 +00:00
statement = setUnknownType ( statement , 1 , value ) ;
statement . executeUpdate ( ) ;
}
catch ( SQLException e )
{
2020-12-04 00:28:53 +00:00
FLog . severe ( " Failed to update admin value: " ) ;
2020-10-02 09:27:06 +00:00
FLog . severe ( e ) ;
2020-06-30 07:25:38 +00:00
}
}
public void setPlayerValue ( PlayerData player , String key , Object value )
{
try
{
2022-09-11 21:33:05 +00:00
Object [ ] data = { key , player . getUuid ( ) } ;
2022-04-15 12:27:32 +00:00
PreparedStatement statement = connection . prepareStatement ( MessageFormat . format ( " UPDATE players SET {0}=? WHERE uuid=''{1}'' " , data ) ) ;
2020-06-30 07:25:38 +00:00
statement = setUnknownType ( statement , 1 , value ) ;
statement . executeUpdate ( ) ;
}
catch ( SQLException e )
{
FLog . severe ( " Failed to update player value: " + e . getMessage ( ) ) ;
2020-05-29 10:14:21 +00:00
}
}
public PreparedStatement setUnknownType ( PreparedStatement statement , int index , Object value ) throws SQLException
{
2020-07-09 22:18:29 +00:00
if ( value = = null )
{
statement . setString ( index , null ) ;
}
else if ( value . getClass ( ) . equals ( String . class ) )
2020-05-29 10:14:21 +00:00
{
String v = ( String ) value ;
statement . setString ( index , v ) ;
}
else if ( value . getClass ( ) . equals ( Integer . class ) )
{
int v = ( int ) value ;
statement . setInt ( index , v ) ;
}
else if ( value . getClass ( ) . equals ( Boolean . class ) )
{
boolean v = ( boolean ) value ;
statement . setBoolean ( index , v ) ;
}
else if ( value . getClass ( ) . equals ( Long . class ) )
{
long v = ( long ) value ;
statement . setLong ( index , v ) ;
}
return statement ;
}
public Object getValue ( ResultSet resultSet , String key , Object value ) throws SQLException
{
Object result = null ;
if ( value instanceof String )
{
result = resultSet . getString ( key ) ;
}
else if ( value instanceof Integer )
{
result = resultSet . getInt ( key ) ;
}
else if ( value instanceof Boolean )
{
2020-09-12 03:27:26 +00:00
result = resultSet . getObject ( key ) ;
2020-05-29 10:14:21 +00:00
}
else if ( value instanceof Long )
{
result = resultSet . getLong ( key ) ;
}
return result ;
}
2020-12-04 00:28:53 +00:00
public void addAdmin ( Admin admin )
2020-05-29 10:14:21 +00:00
{
try
{
2022-11-17 08:34:45 +00:00
PreparedStatement statement = connection . prepareStatement ( " INSERT INTO admins VALUES (?, ?, ?, ?, ?, ?, ?, ?) " ) ;
2022-04-15 13:09:23 +00:00
statement . setString ( 1 , admin . getUuid ( ) . toString ( ) ) ;
2020-12-04 00:28:53 +00:00
statement . setString ( 2 , FUtil . listToString ( admin . getIps ( ) ) ) ;
statement . setString ( 3 , admin . getRank ( ) . toString ( ) ) ;
statement . setBoolean ( 4 , admin . isActive ( ) ) ;
statement . setLong ( 5 , admin . getLastLogin ( ) . getTime ( ) ) ;
statement . setBoolean ( 6 , admin . getCommandSpy ( ) ) ;
statement . setBoolean ( 7 , admin . getPotionSpy ( ) ) ;
statement . setString ( 8 , admin . getAcFormat ( ) ) ;
2020-05-29 10:14:21 +00:00
statement . executeUpdate ( ) ;
}
catch ( SQLException e )
{
2020-12-04 00:28:53 +00:00
FLog . severe ( " Failed to add admin: " ) ;
2020-10-02 09:27:06 +00:00
FLog . severe ( e ) ;
2020-05-29 10:14:21 +00:00
}
}
2020-06-30 07:25:38 +00:00
public void addPlayer ( PlayerData player )
{
try
{
2022-04-15 13:52:06 +00:00
PreparedStatement statement = connection . prepareStatement ( " INSERT INTO players VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) " ) ;
2022-04-15 12:27:32 +00:00
statement . setString ( 1 , player . getUuid ( ) . toString ( ) ) ;
2020-06-30 07:25:38 +00:00
statement . setString ( 2 , FUtil . listToString ( player . getIps ( ) ) ) ;
statement . setString ( 3 , FUtil . listToString ( player . getNotes ( ) ) ) ;
statement . setString ( 4 , player . getTag ( ) ) ;
statement . setString ( 5 , player . getDiscordID ( ) ) ;
2022-04-15 13:52:06 +00:00
statement . setBoolean ( 6 , player . isMasterBuilder ( ) ) ;
2022-11-05 04:26:19 +00:00
statement . setString ( 7 , player . getRideMode ( ) . name ( ) ) ;
2022-04-15 13:52:06 +00:00
statement . setInt ( 8 , player . getCoins ( ) ) ;
statement . setString ( 9 , FUtil . listToString ( player . getItems ( ) ) ) ;
statement . setInt ( 10 , player . getTotalVotes ( ) ) ;
statement . setBoolean ( 11 , player . doesDisplayDiscord ( ) ) ;
statement . setString ( 12 , player . getLoginMessage ( ) ) ;
statement . setBoolean ( 13 , player . hasInspection ( ) ) ;
2020-06-30 07:25:38 +00:00
statement . executeUpdate ( ) ;
}
catch ( SQLException e )
{
2020-10-02 09:27:06 +00:00
FLog . severe ( " Failed to add player: " ) ;
FLog . severe ( e ) ;
2020-06-30 07:25:38 +00:00
}
}
2022-04-15 13:09:23 +00:00
public ResultSet getAdminByUuid ( UUID uuid )
2020-05-29 10:14:21 +00:00
{
try
{
2022-04-15 13:09:23 +00:00
ResultSet resultSet = connection . createStatement ( ) . executeQuery ( MessageFormat . format ( " SELECT * FROM admins WHERE uuid=''{0}'' " , uuid . toString ( ) ) ) ;
2020-05-29 10:14:21 +00:00
if ( resultSet . next ( ) )
{
return resultSet ;
}
}
catch ( SQLException e )
{
2020-12-04 00:28:53 +00:00
FLog . severe ( " Failed to get admin by name: " ) ;
2020-10-02 09:27:06 +00:00
FLog . severe ( e ) ;
2020-05-29 10:14:21 +00:00
}
return null ;
}
2022-04-15 12:27:32 +00:00
public ResultSet getPlayerByUuid ( UUID uuid )
2020-06-30 07:25:38 +00:00
{
try
{
2022-04-15 12:27:32 +00:00
ResultSet resultSet = connection . createStatement ( ) . executeQuery ( MessageFormat . format ( " SELECT * FROM players WHERE uuid=''{0}'' " , uuid . toString ( ) ) ) ;
2020-06-30 07:25:38 +00:00
if ( resultSet . next ( ) )
{
return resultSet ;
}
}
catch ( SQLException e )
{
2022-04-15 12:27:32 +00:00
FLog . severe ( " Failed to get player by UUID: " ) ;
2020-10-02 09:27:06 +00:00
FLog . severe ( e ) ;
2020-06-30 07:25:38 +00:00
}
return null ;
}
public ResultSet getMasterBuilders ( )
{
try
{
2020-07-10 09:09:47 +00:00
return connection . createStatement ( ) . executeQuery ( " SELECT * FROM players WHERE master_builder=true " ) ;
2020-06-30 07:25:38 +00:00
}
catch ( SQLException e )
{
2020-10-02 09:27:06 +00:00
FLog . severe ( " Failed to get Master Builders: " ) ;
FLog . severe ( e ) ;
2020-06-30 07:25:38 +00:00
}
return null ;
}
public ResultSet getPlayerByIp ( String ip )
{
try
{
ResultSet resultSet = connection . createStatement ( ) . executeQuery ( MessageFormat . format ( " SELECT * FROM players WHERE ips LIKE ''%{0}%'' " , ip ) ) ;
if ( resultSet . next ( ) )
{
return resultSet ;
}
}
catch ( SQLException e )
{
2020-10-02 09:27:06 +00:00
FLog . severe ( " Failed to get player by ip: " ) ;
FLog . severe ( e ) ;
2020-06-30 07:25:38 +00:00
}
return null ;
}
2020-12-04 00:28:53 +00:00
public void removeAdmin ( Admin admin )
2020-05-29 10:14:21 +00:00
{
try
{
2020-12-04 00:28:53 +00:00
connection . createStatement ( ) . executeUpdate ( MessageFormat . format ( " DELETE FROM admins where name=''{0}'' " , admin . getName ( ) ) ) ;
2020-05-29 10:14:21 +00:00
}
catch ( SQLException e )
{
2020-12-04 00:28:53 +00:00
FLog . severe ( " Failed to remove admin: " ) ;
2020-10-02 09:27:06 +00:00
FLog . severe ( e ) ;
2020-05-29 10:14:21 +00:00
}
}
public void addBan ( Ban ban )
{
try
{
2020-08-10 05:25:04 +00:00
PreparedStatement statement = connection . prepareStatement ( " INSERT INTO bans VALUES (?, ?, ?, ?, ?, ?, ?) " ) ;
2020-05-29 10:14:21 +00:00
statement . setString ( 1 , ban . getUsername ( ) ) ;
2020-08-10 05:25:04 +00:00
String uuid = null ;
if ( ban . hasUUID ( ) )
{
uuid = ban . getUuid ( ) . toString ( ) ;
}
statement . setString ( 2 , uuid ) ;
statement . setString ( 3 , FUtil . listToString ( ban . getIps ( ) ) ) ;
statement . setString ( 4 , ban . getBy ( ) ) ;
statement . setLong ( 5 , ban . getAt ( ) . getTime ( ) ) ;
statement . setLong ( 6 , ban . getExpiryUnix ( ) ) ;
statement . setString ( 7 , ban . getReason ( ) ) ;
2020-05-29 10:14:21 +00:00
statement . executeUpdate ( ) ;
}
catch ( SQLException e )
{
FLog . severe ( " Failed to add ban: " + e . getMessage ( ) ) ;
}
}
public void removeBan ( Ban ban )
{
try
{
2020-06-30 07:25:38 +00:00
connection . createStatement ( ) . executeUpdate ( MessageFormat . format ( " DELETE FROM bans WHERE name=''{0}'' " , ban . getUsername ( ) ) ) ;
for ( String ip : ban . getIps ( ) )
{
connection . createStatement ( ) . executeUpdate ( MessageFormat . format ( " DELETE FROM bans WHERE ips LIKE ''%{0}%'' " , ip ) ) ;
}
2020-05-29 10:14:21 +00:00
}
catch ( SQLException e )
{
FLog . severe ( " Failed to remove ban: " + e . getMessage ( ) ) ;
}
}
public boolean tableExists ( DatabaseMetaData meta , String name ) throws SQLException
{
2020-12-25 19:46:43 +00:00
return ! meta . getTables ( null , null , name , null ) . next ( ) ;
2020-05-29 10:14:21 +00:00
}
}