package fr.Alphart.BAT.Modules.Kick; import static fr.Alphart.BAT.I18n.I18n._; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; import java.util.UUID; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; import com.imaginarycode.minecraft.redisbungee.RedisBungee; import fr.Alphart.BAT.BAT; import fr.Alphart.BAT.Modules.BATCommand; import fr.Alphart.BAT.Modules.IModule; import fr.Alphart.BAT.Modules.ModuleConfiguration; import fr.Alphart.BAT.Modules.Core.Core; import fr.Alphart.BAT.database.DataSourceHandler; import fr.Alphart.BAT.database.SQLQueries; public class Kick implements IModule { private final String name = "kick"; private KickCommand commandHandler; private final KickConfig config; public Kick(){ config = new KickConfig(); } @Override public List<BATCommand> getCommands() { return commandHandler.getCmds(); } @Override public String getMainCommand() { return "kick"; } @Override public String getName() { return name; } @Override public ModuleConfiguration getConfig() { return config; } @Override public boolean load() { // Init table Statement statement = null; try (Connection conn = BAT.getConnection()) { statement = conn.createStatement(); if (DataSourceHandler.isSQLite()) { for (final String query : SQLQueries.Kick.SQLite.createTable) { statement.executeUpdate(query); } } else { statement.executeUpdate(SQLQueries.Kick.createTable); } statement.close(); } catch (final SQLException e) { DataSourceHandler.handleException(e); } finally { DataSourceHandler.close(statement); } // Register commands commandHandler = new KickCommand(this); commandHandler.loadCmds(); return true; } @Override public boolean unload() { return false; } public class KickConfig extends ModuleConfiguration { public KickConfig() { init(name); } } /** * Kick a player and tp him to the default server * * @param player * @param reason */ public String kick(final ProxiedPlayer player, final String staff, final String reason) { player.connect(ProxyServer.getInstance().getServerInfo( player.getPendingConnection().getListener().getDefaultServer())); player.sendMessage(TextComponent.fromLegacyText(_("wasKickedNotif", new String[] { reason }))); return kickSQL(player.getUniqueId(), player.getServer().getInfo().getName(), staff, reason); } public String kickSQL(final UUID pUUID, final String server, final String staff, final String reason) { PreparedStatement statement = null; try (Connection conn = BAT.getConnection()) { if (DataSourceHandler.isSQLite()) { statement = conn.prepareStatement(SQLQueries.Kick.SQLite.kickPlayer); } else { statement = conn.prepareStatement(SQLQueries.Kick.kickPlayer); } statement.setString(1, pUUID.toString().replace("-", "")); statement.setString(2, staff); statement.setString(3, reason); statement.setString(4, server); statement.executeUpdate(); statement.close(); return _("kickBroadcast", new String[] { Core.getPlayerName(pUUID.toString().replace("-", "")), staff, server, reason }); } catch (final SQLException e) { return DataSourceHandler.handleException(e); } finally { DataSourceHandler.close(statement); } } /** * Kick a player from the network * * @param player * @param reason */ public String gKick(final ProxiedPlayer player, final String staff, final String reason) { final String message = gKickSQL(player.getUniqueId(), staff, reason); player.disconnect(TextComponent.fromLegacyText(_("wasKickedNotif", new String[] { reason }))); return message; } public String gKickSQL(final UUID pUUID, final String staff, final String reason) { PreparedStatement statement = null; try (Connection conn = BAT.getConnection()) { if (DataSourceHandler.isSQLite()) { statement = conn.prepareStatement(fr.Alphart.BAT.database.SQLQueries.Kick.SQLite.kickPlayer); } else { statement = conn.prepareStatement(SQLQueries.Kick.kickPlayer); } statement.setString(1, pUUID.toString().replace("-", "")); statement.setString(2, staff); statement.setString(3, reason); statement.setString(4, GLOBAL_SERVER); statement.executeUpdate(); statement.close(); if (BAT.getInstance().getRedis().isRedisEnabled()) { return _("gKickBroadcast", new String[] { RedisBungee.getApi().getNameFromUuid(pUUID), staff, reason }); } else { return _("gKickBroadcast", new String[] { BAT.getInstance().getProxy().getPlayer(pUUID).getName(), staff, reason }); } } catch (final SQLException e) { return DataSourceHandler.handleException(e); } finally { DataSourceHandler.close(statement); } } /** * Get all kick data of a player <br> * <b>Should be runned async to optimize performance</b> * * @param player * 's name * @return List of KickEntry of the player */ public List<KickEntry> getKickData(final String pName) { final List<KickEntry> kickList = new ArrayList<KickEntry>(); PreparedStatement statement = null; ResultSet resultSet = null; try (Connection conn = BAT.getConnection()) { statement = conn.prepareStatement(DataSourceHandler.isSQLite() ? SQLQueries.Kick.SQLite.getKick : SQLQueries.Kick.getKick); statement.setString(1, Core.getUUID(pName)); resultSet = statement.executeQuery(); while (resultSet.next()) { final String server = resultSet.getString("kick_server"); String reason = resultSet.getString("kick_reason"); if(reason == null){ reason = NO_REASON; } final String staff = resultSet.getString("kick_staff"); final Timestamp date; if(DataSourceHandler.isSQLite()){ date = new Timestamp(resultSet.getLong("strftime('%s',kick_date)") * 1000); }else{ date = resultSet.getTimestamp("kick_date"); } kickList.add(new KickEntry(pName, server, reason, staff, date)); } } catch (final SQLException e) { DataSourceHandler.handleException(e); } finally { DataSourceHandler.close(statement, resultSet); } return kickList; } public List<KickEntry> getManagedKick(final String staff) { final List<KickEntry> kickList = new ArrayList<KickEntry>(); PreparedStatement statement = null; ResultSet resultSet = null; try (Connection conn = BAT.getConnection()) { statement = conn.prepareStatement(DataSourceHandler.isSQLite() ? SQLQueries.Kick.SQLite.getManagedKick : SQLQueries.Kick.getManagedKick); statement.setString(1, staff); resultSet = statement.executeQuery(); while (resultSet.next()) { final String server = resultSet.getString("kick_server"); String reason = resultSet.getString("kick_reason"); if(reason == null){ reason = NO_REASON; } String pName = Core.getPlayerName(resultSet.getString("UUID")); if(pName == null){ pName = "UUID:" + resultSet.getString("UUID"); } final Timestamp date; if(DataSourceHandler.isSQLite()){ date = new Timestamp(resultSet.getLong("strftime('%s',kick_date)") * 1000); }else{ date = resultSet.getTimestamp("kick_date"); } kickList.add(new KickEntry(pName, server, reason, staff, date)); } } catch (final SQLException e) { DataSourceHandler.handleException(e); } finally { DataSourceHandler.close(statement, resultSet); } return kickList; } }