2020-05-29 03:14:21 -07: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 ;
import me.totalfreedom.totalfreedommod.FreedomService ;
import me.totalfreedom.totalfreedommod.banning.Ban ;
2020-06-30 00:25:38 -07:00
import me.totalfreedom.totalfreedommod.player.PlayerData ;
2020-08-15 17:58:48 -05:00
import me.totalfreedom.totalfreedommod.staff.StaffMember ;
2020-05-29 03:14:21 -07: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-06-30 21:51:06 -04:00
public void onStart ( )
2020-05-29 03:14:21 -07:00
{
connect ( ) ;
checkTables ( ) ;
}
@Override
2020-06-30 21:51:06 -04:00
public void onStop ( )
2020-05-29 03:14:21 -07: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 ( ) ;
if ( ! tableExists ( meta , " bans " ) )
{
try
{
2020-08-09 22:25:04 -07: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 03:14:21 -07:00
}
catch ( SQLException e )
{
FLog . severe ( " Failed to create the bans table: " + e . getMessage ( ) ) ;
}
}
2020-08-15 17:42:46 -05:00
if ( ! tableExists ( meta , " staff " ) )
2020-05-29 03:14:21 -07:00
{
try
{
2020-08-15 17:42:46 -05:00
connection . createStatement ( ) . execute ( " CREATE TABLE `staff` (`username` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `rank` VARCHAR NOT NULL, `active` BOOLEAN NOT NULL, `last_login` LONG NOT NULL, `login_message` VARCHAR, `command_spy` BOOLEAN NOT NULL, `potion_spy` BOOLEAN NOT NULL, `ac_format` VARCHAR, `amp_username` VARCHAR); " ) ;
2020-05-29 03:14:21 -07:00
}
catch ( SQLException e )
{
2020-08-15 17:42:46 -05:00
FLog . severe ( " Failed to create the staff table: " + e . getMessage ( ) ) ;
2020-05-29 03:14:21 -07:00
}
}
2020-06-30 00:25:38 -07:00
if ( ! tableExists ( meta , " players " ) )
{
try
{
2020-08-04 15:16:11 -07:00
connection . createStatement ( ) . execute ( " CREATE TABLE `players` (`username` VARCHAR NOT NULL, `ips` VARCHAR NOT NULL, `notes` VARCHAR, `tag` VARCHAR, `discord_id` VARCHAR, `backup_codes` VARCHAR, `donator` BOOLEAN NOT NULL, `master_builder` BOOLEAN NOT NULL,`verification` BOOLEAN NOT NULL, `ride_mode` VARCHAR NOT NULL, `coins` INT NOT NULL, `items` VARCHAR, `total_votes` INT NOT NULL, `display_discord` BOOLEAN NOT NULL, `reddit_username` VARCHAR NOT NULL); " ) ;
2020-06-30 00:25:38 -07:00
}
catch ( SQLException e )
{
FLog . severe ( " Failed to create the players table: " + e . getMessage ( ) ) ;
}
}
2020-05-29 03:14:21 -07:00
}
catch ( SQLException e )
{
FLog . severe ( " Failed to check tables on database: " + e . getMessage ( ) ) ;
}
}
public void truncate ( String table )
{
try
{
2020-06-30 00:25:38 -07:00
connection . createStatement ( ) . execute ( " DELETE FROM " + table ) ;
2020-05-29 03:14:21 -07: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-08-15 17:42:46 -05:00
public ResultSet getStaffList ( ) throws SQLException
2020-05-29 03:14:21 -07:00
{
2020-08-15 17:42:46 -05:00
return connection . createStatement ( ) . executeQuery ( " SELECT * FROM staff " ) ;
2020-05-29 03:14:21 -07:00
}
2020-08-15 17:42:46 -05:00
public void setStaffMemberValue ( StaffMember staffMember , String key , Object value )
2020-05-29 03:14:21 -07:00
{
try
{
2020-08-15 17:42:46 -05:00
Object [ ] data = { key , staffMember . getName ( ) } ;
PreparedStatement statement = connection . prepareStatement ( MessageFormat . format ( " UPDATE staff SET {0}=? WHERE username=''{1}'' " , data ) ) ;
2020-05-29 03:14:21 -07:00
statement = setUnknownType ( statement , 1 , value ) ;
statement . executeUpdate ( ) ;
}
catch ( SQLException e )
{
2020-08-15 17:42:46 -05:00
FLog . severe ( " Failed to update staff member value: " + e . getMessage ( ) ) ;
2020-06-30 00:25:38 -07:00
}
}
public void setPlayerValue ( PlayerData player , String key , Object value )
{
try
{
Object [ ] data = { key , player . getName ( ) } ;
PreparedStatement statement = connection . prepareStatement ( MessageFormat . format ( " UPDATE players SET {0}=? WHERE username=''{1}'' " , data ) ) ;
statement = setUnknownType ( statement , 1 , value ) ;
statement . executeUpdate ( ) ;
}
catch ( SQLException e )
{
FLog . severe ( " Failed to update player value: " + e . getMessage ( ) ) ;
2020-05-29 03:14:21 -07:00
}
}
2020-08-15 17:42:46 -05:00
public void updateStaffMemberName ( String oldName , String newName )
2020-05-29 03:14:21 -07:00
{
try
{
2020-08-15 17:42:46 -05:00
PreparedStatement statement = connection . prepareStatement ( MessageFormat . format ( " UPDATE staff SET username=? WHERE username=''{0}'' " , oldName ) ) ;
2020-05-29 03:14:21 -07:00
statement = setUnknownType ( statement , 1 , newName ) ;
statement . executeUpdate ( ) ;
}
catch ( SQLException e )
{
2020-08-15 17:42:46 -05:00
FLog . severe ( " Failed to update staff member name: " + e . getMessage ( ) ) ;
2020-06-30 00:25:38 -07:00
}
}
public void updatePlayerName ( String oldName , String newName )
{
try
{
PreparedStatement statement = connection . prepareStatement ( MessageFormat . format ( " UPDATE players SET username=? WHERE username=''{0}'' " , oldName ) ) ;
statement = setUnknownType ( statement , 1 , newName ) ;
statement . executeUpdate ( ) ;
}
catch ( SQLException e )
{
FLog . severe ( " Failed to update player name: " + e . getMessage ( ) ) ;
2020-05-29 03:14:21 -07:00
}
}
public PreparedStatement setUnknownType ( PreparedStatement statement , int index , Object value ) throws SQLException
{
2020-07-09 15:18:29 -07:00
if ( value = = null )
{
statement . setString ( index , null ) ;
}
else if ( value . getClass ( ) . equals ( String . class ) )
2020-05-29 03:14:21 -07: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-11 22:27:26 -05:00
result = resultSet . getObject ( key ) ;
2020-05-29 03:14:21 -07:00
}
else if ( value instanceof Long )
{
result = resultSet . getLong ( key ) ;
}
return result ;
}
2020-08-15 17:42:46 -05:00
public void addStaffMember ( StaffMember staffMember )
2020-05-29 03:14:21 -07:00
{
try
{
2020-08-15 17:42:46 -05:00
PreparedStatement statement = connection . prepareStatement ( " INSERT INTO staff VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) " ) ;
statement . setString ( 1 , staffMember . getName ( ) ) ;
statement . setString ( 2 , FUtil . listToString ( staffMember . getIps ( ) ) ) ;
statement . setString ( 3 , staffMember . getRank ( ) . toString ( ) ) ;
statement . setBoolean ( 4 , staffMember . isActive ( ) ) ;
statement . setLong ( 5 , staffMember . getLastLogin ( ) . getTime ( ) ) ;
statement . setString ( 6 , staffMember . getLoginMessage ( ) ) ;
statement . setBoolean ( 7 , staffMember . getCommandSpy ( ) ) ;
statement . setBoolean ( 8 , staffMember . getPotionSpy ( ) ) ;
statement . setString ( 9 , staffMember . getAcFormat ( ) ) ;
statement . setString ( 10 , staffMember . getAmpUsername ( ) ) ;
2020-05-29 03:14:21 -07:00
statement . executeUpdate ( ) ;
}
catch ( SQLException e )
{
2020-09-11 22:27:26 -05:00
FLog . severe ( " Failed to add staff member: " + e ) ;
2020-05-29 03:14:21 -07:00
}
}
2020-06-30 00:25:38 -07:00
public void addPlayer ( PlayerData player )
{
try
{
2020-08-04 15:16:11 -07:00
PreparedStatement statement = connection . prepareStatement ( " INSERT INTO players VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) " ) ;
2020-06-30 00:25:38 -07:00
statement . setString ( 1 , player . getName ( ) ) ;
statement . setString ( 2 , FUtil . listToString ( player . getIps ( ) ) ) ;
statement . setString ( 3 , FUtil . listToString ( player . getNotes ( ) ) ) ;
statement . setString ( 4 , player . getTag ( ) ) ;
statement . setString ( 5 , player . getDiscordID ( ) ) ;
statement . setString ( 6 , FUtil . listToString ( player . getBackupCodes ( ) ) ) ;
2020-07-09 15:18:29 -07:00
statement . setBoolean ( 7 , player . isDonator ( ) ) ;
statement . setBoolean ( 8 , player . isMasterBuilder ( ) ) ;
statement . setBoolean ( 9 , player . hasVerification ( ) ) ;
statement . setString ( 10 , player . getRideMode ( ) ) ;
statement . setInt ( 11 , player . getCoins ( ) ) ;
statement . setString ( 12 , FUtil . listToString ( player . getItems ( ) ) ) ;
statement . setInt ( 13 , player . getTotalVotes ( ) ) ;
2020-07-20 07:05:00 -07:00
statement . setBoolean ( 14 , player . doesDisplayDiscord ( ) ) ;
2020-08-04 15:16:11 -07:00
statement . setString ( 15 , player . getRedditUsername ( ) ) ;
2020-06-30 00:25:38 -07:00
statement . executeUpdate ( ) ;
}
catch ( SQLException e )
{
2020-09-11 22:27:26 -05:00
FLog . severe ( " Failed to add player: " + e ) ;
2020-06-30 00:25:38 -07:00
}
}
2020-08-15 17:42:46 -05:00
public ResultSet getStaffMemberByName ( String name )
2020-05-29 03:14:21 -07:00
{
try
{
2020-08-15 17:42:46 -05:00
ResultSet resultSet = connection . createStatement ( ) . executeQuery ( MessageFormat . format ( " SELECT * FROM staff WHERE username=''{0}'' " , name ) ) ;
2020-05-29 03:14:21 -07:00
if ( resultSet . next ( ) )
{
return resultSet ;
}
}
catch ( SQLException e )
{
2020-09-11 22:27:26 -05:00
FLog . severe ( " Failed to get staff member by name: " + e ) ;
2020-05-29 03:14:21 -07:00
}
return null ;
}
2020-06-30 00:25:38 -07:00
public ResultSet getPlayerByName ( String name )
{
try
{
ResultSet resultSet = connection . createStatement ( ) . executeQuery ( MessageFormat . format ( " SELECT * FROM players WHERE username=''{0}'' " , name ) ) ;
if ( resultSet . next ( ) )
{
return resultSet ;
}
}
catch ( SQLException e )
{
2020-09-11 22:27:26 -05:00
FLog . severe ( " Failed to get player by name: " + e ) ;
2020-06-30 00:25:38 -07:00
}
return null ;
}
public ResultSet getMasterBuilders ( )
{
try
{
2020-07-10 02:09:47 -07:00
return connection . createStatement ( ) . executeQuery ( " SELECT * FROM players WHERE master_builder=true " ) ;
2020-06-30 00:25:38 -07:00
}
catch ( SQLException e )
{
2020-09-11 22:27:26 -05:00
FLog . severe ( " Failed to get Master Builders: " + e ) ;
2020-06-30 00:25:38 -07: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 )
{
FLog . severe ( " Failed to get player by ip: " + e . getMessage ( ) ) ;
}
return null ;
}
2020-08-15 17:42:46 -05:00
public void removeStaffMember ( StaffMember staffMember )
2020-05-29 03:14:21 -07:00
{
try
{
2020-08-15 17:42:46 -05:00
connection . createStatement ( ) . executeUpdate ( MessageFormat . format ( " DELETE FROM staff where name=''{0}'' " , staffMember . getName ( ) ) ) ;
2020-05-29 03:14:21 -07:00
}
catch ( SQLException e )
{
2020-08-15 17:42:46 -05:00
FLog . severe ( " Failed to remove staff member: " + e . getMessage ( ) ) ;
2020-05-29 03:14:21 -07:00
}
}
public void addBan ( Ban ban )
{
try
{
2020-08-09 22:25:04 -07:00
PreparedStatement statement = connection . prepareStatement ( " INSERT INTO bans VALUES (?, ?, ?, ?, ?, ?, ?) " ) ;
2020-05-29 03:14:21 -07:00
statement . setString ( 1 , ban . getUsername ( ) ) ;
2020-08-09 22:25:04 -07: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 03:14:21 -07:00
statement . executeUpdate ( ) ;
}
catch ( SQLException e )
{
FLog . severe ( " Failed to add ban: " + e . getMessage ( ) ) ;
}
}
public void removeBan ( Ban ban )
{
try
{
2020-06-30 00:25:38 -07: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 03:14:21 -07:00
}
catch ( SQLException e )
{
FLog . severe ( " Failed to remove ban: " + e . getMessage ( ) ) ;
}
}
public boolean tableExists ( DatabaseMetaData meta , String name ) throws SQLException
{
return meta . getTables ( null , null , name , null ) . next ( ) ;
}
}