From 6d990d1fb4e3756f0e30d59a821c8b7efb764ba3 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Tue, 26 Feb 2019 11:44:45 +0300 Subject: [PATCH] Hello, MyBatis! --- pom.xml | 27 +++ .../java/ru/prisonlife/api/PrisonAPI.java | 52 +----- .../api/store/AbstractCachedDao.java | 90 ---------- .../prisonlife/api/store/CachedDaoTask.java | 17 -- .../api/store/DailyRespectTaskDao.java | 43 ----- .../api/store/DailyRespectTaskEntity.java | 13 +- .../prisonlife/api/store/PlayerStatsDao.java | 72 -------- .../api/store/PlayerStatsEntity.java | 15 +- .../ru/prisonlife/api/store/SQLStore.java | 33 ++-- .../api/template/AbstractApiData.java | 14 +- .../ru/prisonlife/api/template/Faction.java | 20 ++- .../ru/prisonlife/api/template/Policeman.java | 139 +++++++-------- .../ru/prisonlife/api/template/Prisoner.java | 159 ++++++++++-------- .../api/store/DailyRespectTaskMapper.xml | 20 +++ .../api/store/PlayerStatsMapper.xml | 42 +++++ .../ru/prisonlife/api/store/config.xml | 22 +++ 16 files changed, 323 insertions(+), 455 deletions(-) delete mode 100644 src/main/java/ru/prisonlife/api/store/AbstractCachedDao.java delete mode 100644 src/main/java/ru/prisonlife/api/store/CachedDaoTask.java delete mode 100644 src/main/java/ru/prisonlife/api/store/DailyRespectTaskDao.java delete mode 100644 src/main/java/ru/prisonlife/api/store/PlayerStatsDao.java create mode 100644 src/main/resources/ru/prisonlife/api/store/DailyRespectTaskMapper.xml create mode 100644 src/main/resources/ru/prisonlife/api/store/PlayerStatsMapper.xml create mode 100644 src/main/resources/ru/prisonlife/api/store/config.xml diff --git a/pom.xml b/pom.xml index da4efa2..652858e 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,9 @@ UTF-8 1.8 + ${java.encoding} + ${java.encoding} + 1.12-R0.1 @@ -22,15 +25,25 @@ + org.spigotmc spigot-api ${bukkit.version}-SNAPSHOT provided + + + + org.mybatis + mybatis + 3.5.0 + + ${project.artifactId}-${project.version} + src/main/resources @@ -57,6 +70,20 @@ -Dfile.encoding=${java.encoding} + + + + + maven-assembly-plugin + 2.2-beta-5 + + ${project.artifactId}-${project.version}-fat + false + + jar-with-dependencies + + + \ No newline at end of file diff --git a/src/main/java/ru/prisonlife/api/PrisonAPI.java b/src/main/java/ru/prisonlife/api/PrisonAPI.java index 0214aa8..f5dc00c 100644 --- a/src/main/java/ru/prisonlife/api/PrisonAPI.java +++ b/src/main/java/ru/prisonlife/api/PrisonAPI.java @@ -3,24 +3,14 @@ package ru.prisonlife.api; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scheduler.BukkitTask; -import ru.prisonlife.api.store.CachedDaoTask; -import ru.prisonlife.api.store.DailyRespectTaskDao; -import ru.prisonlife.api.store.PlayerStatsDao; import ru.prisonlife.api.store.SQLStore; -import java.sql.SQLException; - public class PrisonAPI extends JavaPlugin { public static final String PLUGIN_PATH = "plugins/PrisonManager"; public static final Plugin plugin = Bukkit.getPluginManager().getPlugin("PrisonAPI"); private static SQLStore sqlStore; - private static PlayerStatsDao playerStatsDao; - private static DailyRespectTaskDao dailyRespectTaskDao; - private BukkitTask playeryStatsDaoTask; - private BukkitTask dailyRespectTaskDaoTask; public enum Factions { NONE(0), ASIANS(1), LATINOS(2), NIGGAZ(3), POLICE(4); @@ -50,14 +40,6 @@ public class PrisonAPI extends JavaPlugin { return sqlStore; } - public static PlayerStatsDao getPlayerStatsDao() { - return playerStatsDao; - } - - public static DailyRespectTaskDao getDailyRespectTaskDao() { - return dailyRespectTaskDao; - } - @Override public void onEnable() { saveDefaultConfig(); @@ -66,38 +48,6 @@ public class PrisonAPI extends JavaPlugin { final String dbUser = getConfig().getString("database.user"); final String dbPasswd = getConfig().getString("database.password"); - try { - sqlStore = new SQLStore(dbUrl, dbUser, dbPasswd); - playerStatsDao = new PlayerStatsDao(sqlStore); - dailyRespectTaskDao = new DailyRespectTaskDao(sqlStore); - - playeryStatsDaoTask = new CachedDaoTask(playerStatsDao) - .runTaskLaterAsynchronously(this, 20 * (60 * 1000)); - dailyRespectTaskDaoTask = new CachedDaoTask(dailyRespectTaskDao) - .runTaskLaterAsynchronously(this, 20 * (60 * 1000)); - } catch (SQLException e) { - e.printStackTrace(); - } - } - - @Override - public void onDisable() { - playeryStatsDaoTask.cancel(); - dailyRespectTaskDaoTask.cancel(); - - try { - if (!sqlStore.getConnection().isClosed()) { - sqlStore.close(); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - sqlStore = null; - playerStatsDao = null; - dailyRespectTaskDao = null; - } - - playeryStatsDaoTask = null; - dailyRespectTaskDaoTask = null; + sqlStore = new SQLStore(dbUrl, dbUser, dbPasswd); } } diff --git a/src/main/java/ru/prisonlife/api/store/AbstractCachedDao.java b/src/main/java/ru/prisonlife/api/store/AbstractCachedDao.java deleted file mode 100644 index 349083b..0000000 --- a/src/main/java/ru/prisonlife/api/store/AbstractCachedDao.java +++ /dev/null @@ -1,90 +0,0 @@ -package ru.prisonlife.api.store; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.*; -import java.util.concurrent.ConcurrentSkipListMap; - -public abstract class AbstractCachedDao implements AutoCloseable { - - private SQLStore store; - private Map cache = new ConcurrentSkipListMap<>(); - - public AbstractCachedDao(SQLStore store) { - this.store = store; - } - - public Optional findByUuid(UUID uuid) { - E entity; - if ((entity = cache.get(uuid)) != null) { - return Optional.of(entity); - } - - final Connection connection = store.getConnection(); - - try (final PreparedStatement statement = connection.prepareStatement(getSelectSQL())) { - statement.setString(1, uuid.toString()); - - try (ResultSet resultSet = statement.executeQuery()) { - if (resultSet.next()) { - entity = mappingResultEntity(resultSet); - - cache.put(uuid, entity); - return Optional.of(entity); - } else { - //FIXME need log - return Optional.empty(); - } - } - } catch (SQLException e) { - e.printStackTrace(); //FIXME need log - return Optional.empty(); - } - } - - /** - * Запись кэша в БД и последующий его сброс - */ - public void flush() { - if (cache.isEmpty()) { - return; - } - - //TODO думаю лучше будет разделить на порции по N обновлений за один раз - final String updateSql = generateUpdateSQL(); - final StringJoiner sj = new StringJoiner(";"); - for (int i = 0; i < cache.size(); i++) { - sj.add(updateSql); - } - - final Connection connection = store.getConnection(); - - try (final PreparedStatement statement = connection.prepareStatement(sj.toString())) { - Iterator iterator = cache.values().iterator(); - for (int i = 1; i < cache.size(); i += countFields()) { - final E entity = iterator.next(); - mappingUpdateEntity(statement, entity, i); - } - - statement.executeLargeUpdate(); - } catch (SQLException e) { - e.printStackTrace(); //FIXME need log - } - - cache.clear(); - } - - @Override - public void close() throws Exception { - store.close(); - } - - abstract String getSelectSQL(); - abstract E mappingResultEntity(ResultSet resultSet)throws SQLException; - - abstract String generateUpdateSQL(); - abstract int countFields(); - abstract void mappingUpdateEntity(final PreparedStatement statement, E entity, int index) throws SQLException; -} diff --git a/src/main/java/ru/prisonlife/api/store/CachedDaoTask.java b/src/main/java/ru/prisonlife/api/store/CachedDaoTask.java deleted file mode 100644 index 0098321..0000000 --- a/src/main/java/ru/prisonlife/api/store/CachedDaoTask.java +++ /dev/null @@ -1,17 +0,0 @@ -package ru.prisonlife.api.store; - -import org.bukkit.scheduler.BukkitRunnable; - -public class CachedDaoTask extends BukkitRunnable { - - private AbstractCachedDao abstractCachedDao; - - public CachedDaoTask(AbstractCachedDao abstractCachedDao) { - this.abstractCachedDao = abstractCachedDao; - } - - @Override - public void run() { - abstractCachedDao.flush(); - } -} diff --git a/src/main/java/ru/prisonlife/api/store/DailyRespectTaskDao.java b/src/main/java/ru/prisonlife/api/store/DailyRespectTaskDao.java deleted file mode 100644 index ba9cf43..0000000 --- a/src/main/java/ru/prisonlife/api/store/DailyRespectTaskDao.java +++ /dev/null @@ -1,43 +0,0 @@ -package ru.prisonlife.api.store; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; - -public class DailyRespectTaskDao extends AbstractCachedDao { - - public DailyRespectTaskDao(SQLStore store) { - super(store); - } - - @Override - String getSelectSQL() { - return "SELECT COOLDOWN FROM daily_respect_task WHERE UUID = ?"; - } - - @Override - DailyRespectTaskEntity mappingResultEntity(ResultSet resultSet) throws SQLException { - DailyRespectTaskEntity entity = new DailyRespectTaskEntity(); - entity.setCooldownRespect(resultSet.getInt("COOLDOWN")); - - return entity; - } - - @Override - String generateUpdateSQL() { - return "UPDATE daily_respect_task " + - "SET COOLDOWN = ? " + - "WHERE UUID = ?"; - } - - @Override - int countFields() { - return 1; - } - - @Override - void mappingUpdateEntity(PreparedStatement statement, DailyRespectTaskEntity entity, int index) throws SQLException { - statement.setInt(index, entity.getCooldownRespect()); - statement.setString(index + 1, entity.getUuid().toString()); - } -} diff --git a/src/main/java/ru/prisonlife/api/store/DailyRespectTaskEntity.java b/src/main/java/ru/prisonlife/api/store/DailyRespectTaskEntity.java index a52d8fc..d598a58 100644 --- a/src/main/java/ru/prisonlife/api/store/DailyRespectTaskEntity.java +++ b/src/main/java/ru/prisonlife/api/store/DailyRespectTaskEntity.java @@ -1,26 +1,25 @@ package ru.prisonlife.api.store; import java.util.Objects; -import java.util.UUID; public class DailyRespectTaskEntity { - private UUID uuid; - private int cooldownRespect; + private String uuid; + private Integer cooldownRespect; - public UUID getUuid() { + public String getUuid() { return uuid; } - public void setUuid(UUID uuid) { + public void setUuid(String uuid) { this.uuid = uuid; } - public int getCooldownRespect() { + public Integer getCooldownRespect() { return cooldownRespect; } - public void setCooldownRespect(int cooldownRespect) { + public void setCooldownRespect(Integer cooldownRespect) { this.cooldownRespect = cooldownRespect; } diff --git a/src/main/java/ru/prisonlife/api/store/PlayerStatsDao.java b/src/main/java/ru/prisonlife/api/store/PlayerStatsDao.java deleted file mode 100644 index a10be2c..0000000 --- a/src/main/java/ru/prisonlife/api/store/PlayerStatsDao.java +++ /dev/null @@ -1,72 +0,0 @@ -package ru.prisonlife.api.store; - - -import ru.prisonlife.api.PrisonAPI.Factions; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.UUID; - -public class PlayerStatsDao extends AbstractCachedDao { - - public PlayerStatsDao(SQLStore store) { - super(store); - } - - @Override - String getSelectSQL() { - return "SELECT * FROM player_stats WHERE UUID = ?"; - } - - @Override - PlayerStatsEntity mappingResultEntity(ResultSet resultSet) throws SQLException { - PlayerStatsEntity entity = new PlayerStatsEntity(); - entity.setUuid(UUID.fromString(resultSet.getString("UUID"))); - entity.setWallet(resultSet.getInt("WALLET")); - entity.setFaction(Factions.valueOf(resultSet.getString("FACTION"))); - entity.setRang(resultSet.getInt("F_RANG")); - entity.setRespect(resultSet.getInt("RESPECT")); - entity.setCooldownRespect(resultSet.getInt("COOLDOWN")); - entity.setPoints(resultSet.getDouble("POINTS")); - entity.setLevel(resultSet.getDouble("LEVEL")); - entity.setServerTime(resultSet.getInt("G_TIME")); - entity.setBlocks(resultSet.getInt("D_BLOCKS")); - entity.setPlayers(resultSet.getInt("K_PLAYERS")); - entity.setMobs(resultSet.getInt("K_MOBS")); - entity.setDeaths(resultSet.getInt("DEATHS")); - - return entity; - } - - @Override - String generateUpdateSQL() { - return "UPDATE player_stats " + - "SET WALLET = ?, FACTION = ?, F_RANG = ?, RESPECT = ?, " + - "COOLDOWN = ?, POINTS = ?, LEVEL = ?, G_TIME = ?, D_BLOCKS = ?, " + - "K_PLAYERS = ?, K_MOBS = ?, DEATHS = ? " + - "WHERE UUID = ?"; - } - - @Override - int countFields() { - return 13; - } - - @Override - void mappingUpdateEntity(PreparedStatement statement, PlayerStatsEntity entity, int index) throws SQLException { - statement.setInt(index, entity.getWallet()); - statement.setString(index + 1, entity.getFaction().name()); - statement.setInt(index + 2, entity.getRang()); - statement.setInt(index + 3, entity.getRespect()); - statement.setInt(index + 4, entity.getCooldownRespect()); - statement.setDouble(index + 5, entity.getPoints()); - statement.setDouble(index + 6, entity.getLevel()); - statement.setInt(index + 7, entity.getServerTime()); - statement.setInt(index + 8, entity.getBlocks()); - statement.setInt(index + 9, entity.getPlayers()); - statement.setInt(index + 10, entity.getMobs()); - statement.setInt(index + 11, entity.getDeaths()); - statement.setString(index + 12, entity.getUuid().toString()); - } -} diff --git a/src/main/java/ru/prisonlife/api/store/PlayerStatsEntity.java b/src/main/java/ru/prisonlife/api/store/PlayerStatsEntity.java index daf7fcd..6e49730 100644 --- a/src/main/java/ru/prisonlife/api/store/PlayerStatsEntity.java +++ b/src/main/java/ru/prisonlife/api/store/PlayerStatsEntity.java @@ -1,15 +1,12 @@ package ru.prisonlife.api.store; -import ru.prisonlife.api.PrisonAPI.Factions; - import java.util.Objects; -import java.util.UUID; public class PlayerStatsEntity { - private UUID uuid; + private String uuid; private Integer wallet; - private Factions faction; + private Integer faction; private Integer rang; private Integer respect; private Integer cooldownRespect; @@ -21,11 +18,11 @@ public class PlayerStatsEntity { private Integer mobs; private Integer deaths; - public UUID getUuid() { + public String getUuid() { return uuid; } - public void setUuid(UUID uuid) { + public void setUuid(String uuid) { this.uuid = uuid; } @@ -37,11 +34,11 @@ public class PlayerStatsEntity { this.wallet = wallet; } - public Factions getFaction() { + public Integer getFaction() { return faction; } - public void setFaction(Factions faction) { + public void setFaction(Integer faction) { this.faction = faction; } diff --git a/src/main/java/ru/prisonlife/api/store/SQLStore.java b/src/main/java/ru/prisonlife/api/store/SQLStore.java index 51d7a27..be2c810 100644 --- a/src/main/java/ru/prisonlife/api/store/SQLStore.java +++ b/src/main/java/ru/prisonlife/api/store/SQLStore.java @@ -1,23 +1,28 @@ package ru.prisonlife.api.store; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; -public class SQLStore implements AutoCloseable { +import java.util.Properties; - private Connection connection; +public class SQLStore { - public SQLStore(String url, String user, String password) throws SQLException { - this.connection = DriverManager.getConnection(url, user, password); + private SqlSessionFactory sqlSessionFactory; + + public SQLStore(String url, String user, String password) { + Properties properties = new Properties(); + properties.put("url", url); + properties.put("user", user); + properties.put("password", password); + + sqlSessionFactory = new SqlSessionFactoryBuilder().build( + SQLStore.class.getResourceAsStream("config.xml"), + properties + ); } - public Connection getConnection() { - return connection; - } - - @Override - public void close() throws Exception { - connection.close(); + public SqlSession openSession() { + return sqlSessionFactory.openSession(); } } diff --git a/src/main/java/ru/prisonlife/api/template/AbstractApiData.java b/src/main/java/ru/prisonlife/api/template/AbstractApiData.java index dfaba9d..05890d3 100644 --- a/src/main/java/ru/prisonlife/api/template/AbstractApiData.java +++ b/src/main/java/ru/prisonlife/api/template/AbstractApiData.java @@ -1,7 +1,7 @@ package ru.prisonlife.api.template; +import org.apache.ibatis.session.SqlSession; import ru.prisonlife.api.PrisonAPI; -import ru.prisonlife.api.store.PlayerStatsDao; import ru.prisonlife.api.store.PlayerStatsEntity; import java.lang.ref.WeakReference; @@ -20,10 +20,14 @@ public abstract class AbstractApiData { if (refPlayerStatsEntity != null && (entity = refPlayerStatsEntity.get()) != null) { return entity; } else { - final PlayerStatsDao playerStatsDao = PrisonAPI.getPlayerStatsDao(); - entity = playerStatsDao.findByUuid(me.getPlayer().getUniqueId()) - .orElseThrow(() -> new RuntimeException( - "no data in db by '" + me.getPlayer().getUniqueId().toString() + "'")); + final SqlSession session = PrisonAPI.getSqlStore().openSession(); + entity = session.selectOne("PlayerStats.selectOne", me.getPlayer().getUniqueId().toString()); + session.close(); + + if (entity == null) { + throw new RuntimeException("no data in db by '" + me.getPlayer().getUniqueId().toString() + "'"); + } + refPlayerStatsEntity = new WeakReference<>(entity); return entity; } diff --git a/src/main/java/ru/prisonlife/api/template/Faction.java b/src/main/java/ru/prisonlife/api/template/Faction.java index 95163d1..c1c8c4b 100644 --- a/src/main/java/ru/prisonlife/api/template/Faction.java +++ b/src/main/java/ru/prisonlife/api/template/Faction.java @@ -1,9 +1,9 @@ package ru.prisonlife.api.template; +import org.apache.ibatis.session.SqlSession; import org.bukkit.Bukkit; import ru.prisonlife.api.PrisonAPI; import ru.prisonlife.api.PrisonAPI.Factions; -import ru.prisonlife.api.store.AbstractCachedDao; import ru.prisonlife.api.store.DailyRespectTaskEntity; import java.lang.ref.WeakReference; @@ -28,21 +28,25 @@ public class Faction extends AbstractApiData { if (refDailyRespectTaskEntity != null && (entity = refDailyRespectTaskEntity.get()) != null) { return entity; } else { - final AbstractCachedDao cachedDao = PrisonAPI.getDailyRespectTaskDao(); - entity = cachedDao.findByUuid(me.getPlayer().getUniqueId()) - .orElseThrow(() -> new RuntimeException( - "no data in db by '" + me.getPlayer().getUniqueId().toString() + "'")); + final SqlSession session = PrisonAPI.getSqlStore().openSession(); + entity = session.selectOne("DailyRespectTask.selectOne", me.getPlayer().getUniqueId().toString()); + session.close(); + + if (entity == null) { + throw new RuntimeException("no data in db by '" + me.getPlayer().getUniqueId().toString() + "'"); + } + refDailyRespectTaskEntity = new WeakReference<>(entity); return entity; } } public String getType() { - return getPlayerStatsEntity().getFaction().name(); + return Factions.valueOf(getPlayerStatsEntity().getFaction()).name(); } public int getId() { - return getPlayerStatsEntity().getFaction().getId(); + return getPlayerStatsEntity().getFaction(); } public int getRangId() { @@ -62,7 +66,7 @@ public class Faction extends AbstractApiData { } public void setFaction(int id) { - getPlayerStatsEntity().setFaction(Factions.valueOf(id)); + getPlayerStatsEntity().setFaction(id); } public int getRespect() { diff --git a/src/main/java/ru/prisonlife/api/template/Policeman.java b/src/main/java/ru/prisonlife/api/template/Policeman.java index 46277e3..6f3146f 100644 --- a/src/main/java/ru/prisonlife/api/template/Policeman.java +++ b/src/main/java/ru/prisonlife/api/template/Policeman.java @@ -2,6 +2,7 @@ package ru.prisonlife.api.template; import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.TextComponent; +import org.apache.ibatis.session.SqlSession; import org.bukkit.ChatColor; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; @@ -19,6 +20,8 @@ import java.util.List; import java.util.Map; import java.util.Random; +import static ru.prisonlife.api.PrisonAPI.getSqlStore; + public class Policeman extends Prisoner { private Map timeInCage = new HashMap<>(); @@ -28,77 +31,79 @@ public class Policeman extends Prisoner { } public void arrestPrisoner(Prisoner prs) throws SQLException { - final Connection connection = PrisonAPI.getSqlStore().getConnection(); + try (SqlSession session = getSqlStore().openSession()) { + final Connection connection = session.getConnection(); - if(prs.getPlayer().isOnline()) { - Manager mng = new Manager(super.getPrison()); - List all_cages = mng.getCages(); - PreparedStatement st = connection.prepareStatement("SELECT UUID FROM player_stats WHERE UUID = ?"); - st.setString(1, me.getUniqueId().toString()); - try(ResultSet resultSet = st.executeQuery()) { - if(!resultSet.next()) { - int su = prs.getSuspect(); - st.close(); - st = connection.prepareStatement( - "INSERT INTO players_in_cages(NAME, UUID, TIME_IN_CAGE, BLOCKS_LEFT) " + - "VALUES (?, ?, ?, ?)"); - st.setString(1, getPlayer().getName()); - st.setString(2, me.getUniqueId().toString()); - st.setInt(3, (su * 6)); - st.setInt(4, (su * 100)); - st.executeUpdate(); - } - } - st.close(); - prs.setSuspect(0); - mng.teleportInToCage(prs, all_cages.get(new Random().nextInt(all_cages.size()))); - FileConfiguration configurationSuspect = YamlConfiguration.loadConfiguration(new File("plugins/PrisonSuspect/", "parameters.yml")); - String actionMessage = ChatColor.translateAlternateColorCodes('&', - configurationSuspect.getString("MESSAGES.ACTION_BAR_PROGRESS")); - BukkitRunnable actionBar = new BukkitRunnable() {//"MESSAGES.WHEN_PRISONER_CAN_EXIT_FROM_CAGE" - @Override - public void run() { - prs.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(actionMessage)); - } - }; - timeInCage.put(prs, new BukkitRunnable() { - @Override - public void run() { // Future = Пометить, что когда in Cage и вышел, то удалить поток, а если зашёл и in Cage - запустить ~ Optimize - try { - int time = 0; - String uuid = prs.getPlayer().getUniqueId().toString(); - PreparedStatement st = connection.prepareStatement( - "SELECT TIME_IN_CAGE FROM players_in_cages WHERE UUID = ?"); - st.setString(1, uuid); - try(ResultSet resultSet = st.executeQuery()) { - if(resultSet.next()) - time = resultSet.getInt(1); - } - if(time == 0) { - prs.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', - configurationSuspect.getString("MESSAGES.WHEN_PRISONER_CAN_EXIT_FROM_CAGE"))); - actionBar.cancel(); - cancel(); - timeInCage.remove(prs); - st = connection.prepareStatement("DELETE FROM players_in_cages WHERE UUID = ?"); - st.setString(1, uuid); - st.execute(); - } else { - if(prs.getPlayer().isOnline()) { - st = connection.prepareStatement("UPDATE players_in_cages SET TIME_IN_CAGE = " + (time - 1) + " WHERE UUID = ?"); - st.setString(1, uuid); - st.execute(); - } - } + if (prs.getPlayer().isOnline()) { + Manager mng = new Manager(super.getPrison()); + List all_cages = mng.getCages(); + PreparedStatement st = connection.prepareStatement("SELECT UUID FROM player_stats WHERE UUID = ?"); + st.setString(1, me.getUniqueId().toString()); + try (ResultSet resultSet = st.executeQuery()) { + if (!resultSet.next()) { + int su = prs.getSuspect(); st.close(); - } catch(SQLException e) { - e.printStackTrace(); + st = connection.prepareStatement( + "INSERT INTO players_in_cages(NAME, UUID, TIME_IN_CAGE, BLOCKS_LEFT) " + + "VALUES (?, ?, ?, ?)"); + st.setString(1, getPlayer().getName()); + st.setString(2, me.getUniqueId().toString()); + st.setInt(3, (su * 6)); + st.setInt(4, (su * 100)); + st.executeUpdate(); } } - }); - int m = 20 * 60; - actionBar.runTaskTimer(PrisonAPI.plugin, 5, 5); - timeInCage.get(prs).runTaskTimer(PrisonAPI.plugin, m, m); + st.close(); + prs.setSuspect(0); + mng.teleportInToCage(prs, all_cages.get(new Random().nextInt(all_cages.size()))); + FileConfiguration configurationSuspect = YamlConfiguration.loadConfiguration(new File("plugins/PrisonSuspect/", "parameters.yml")); + String actionMessage = ChatColor.translateAlternateColorCodes('&', + configurationSuspect.getString("MESSAGES.ACTION_BAR_PROGRESS")); + BukkitRunnable actionBar = new BukkitRunnable() {//"MESSAGES.WHEN_PRISONER_CAN_EXIT_FROM_CAGE" + @Override + public void run() { + prs.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(actionMessage)); + } + }; + timeInCage.put(prs, new BukkitRunnable() { + @Override + public void run() { // Future = Пометить, что когда in Cage и вышел, то удалить поток, а если зашёл и in Cage - запустить ~ Optimize + try { + int time = 0; + String uuid = prs.getPlayer().getUniqueId().toString(); + PreparedStatement st = connection.prepareStatement( + "SELECT TIME_IN_CAGE FROM players_in_cages WHERE UUID = ?"); + st.setString(1, uuid); + try (ResultSet resultSet = st.executeQuery()) { + if (resultSet.next()) + time = resultSet.getInt(1); + } + if (time == 0) { + prs.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', + configurationSuspect.getString("MESSAGES.WHEN_PRISONER_CAN_EXIT_FROM_CAGE"))); + actionBar.cancel(); + cancel(); + timeInCage.remove(prs); + st = connection.prepareStatement("DELETE FROM players_in_cages WHERE UUID = ?"); + st.setString(1, uuid); + st.execute(); + } else { + if (prs.getPlayer().isOnline()) { + st = connection.prepareStatement("UPDATE players_in_cages SET TIME_IN_CAGE = " + (time - 1) + " WHERE UUID = ?"); + st.setString(1, uuid); + st.execute(); + } + } + st.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + }); + int m = 20 * 60; + actionBar.runTaskTimer(PrisonAPI.plugin, 5, 5); + timeInCage.get(prs).runTaskTimer(PrisonAPI.plugin, m, m); + } } } } diff --git a/src/main/java/ru/prisonlife/api/template/Prisoner.java b/src/main/java/ru/prisonlife/api/template/Prisoner.java index dbb9395..0f8e0e1 100644 --- a/src/main/java/ru/prisonlife/api/template/Prisoner.java +++ b/src/main/java/ru/prisonlife/api/template/Prisoner.java @@ -1,5 +1,6 @@ package ru.prisonlife.api.template; +import org.apache.ibatis.session.SqlSession; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.configuration.file.FileConfiguration; @@ -119,28 +120,32 @@ public class Prisoner { } public int getSuspect() { - try(PreparedStatement statement = getSqlStore().getConnection().prepareStatement("SELECT SUSPECT FROM player_stats WHERE UUID = ?")) { - statement.setString(1, me.getPlayer().getUniqueId().toString()); + try (SqlSession session = getSqlStore().openSession()) { + try (PreparedStatement statement = session.getConnection().prepareStatement("SELECT SUSPECT FROM player_stats WHERE UUID = ?")) { + statement.setString(1, me.getPlayer().getUniqueId().toString()); - try(ResultSet resultSet = statement.executeQuery()) { - if(resultSet.next()) { - return resultSet.getInt(1); + try (ResultSet resultSet = statement.executeQuery()) { + if (resultSet.next()) { + return resultSet.getInt(1); + } } + } catch (SQLException z) { + z.printStackTrace(); } - } catch(SQLException z) { - z.printStackTrace(); } return 0; } public void setSuspect(int value) { - try(PreparedStatement statement = getSqlStore().getConnection().prepareStatement("UPDATE player_stats SET SUSPECT = ? WHERE UUID = ?")) { - statement.setInt(1, value); - statement.setString(2, me.getPlayer().getUniqueId().toString()); + try (SqlSession session = getSqlStore().openSession()) { + try (PreparedStatement statement = session.getConnection().prepareStatement("UPDATE player_stats SET SUSPECT = ? WHERE UUID = ?")) { + statement.setInt(1, value); + statement.setString(2, me.getPlayer().getUniqueId().toString()); - statement.executeUpdate(); - } catch(SQLException z) { - z.printStackTrace(); + statement.executeUpdate(); + } catch (SQLException z) { + z.printStackTrace(); + } } } @@ -153,67 +158,75 @@ public class Prisoner { } public int getTimeLeftInCage() { - try (PreparedStatement statement = getSqlStore().getConnection().prepareStatement("SELECT TIME_IN_CAGE FROM players_in_cages WHERE UUID = ?")) { - statement.setString(1, me.getUniqueId().toString()); + try (SqlSession session = getSqlStore().openSession()) { + try (PreparedStatement statement = session.getConnection().prepareStatement("SELECT TIME_IN_CAGE FROM players_in_cages WHERE UUID = ?")) { + statement.setString(1, me.getUniqueId().toString()); - try(ResultSet resultSet = statement.executeQuery()) { - if(resultSet.next()) { - return resultSet.getInt(1); + try (ResultSet resultSet = statement.executeQuery()) { + if (resultSet.next()) { + return resultSet.getInt(1); + } } + } catch (SQLException e) { + e.printStackTrace(); } - } catch (SQLException e) { - e.printStackTrace(); } return 0; } public void setTimeLeftInCage(int value) { - try { - PreparedStatement statement = getSqlStore().getConnection().prepareStatement("SELECT TIME_IN_CAGE FROM players_in_cages WHERE UUID = ?"); - statement.setString(1, me.getUniqueId().toString()); - try(ResultSet resultSet = statement.executeQuery()) { - if(resultSet.next()) { - statement.close(); + try (SqlSession session = getSqlStore().openSession()) { + try { + PreparedStatement statement = session.getConnection().prepareStatement("SELECT TIME_IN_CAGE FROM players_in_cages WHERE UUID = ?"); + statement.setString(1, me.getUniqueId().toString()); + try (ResultSet resultSet = statement.executeQuery()) { + if (resultSet.next()) { + statement.close(); - statement = getSqlStore().getConnection().prepareStatement("UPDATE players_in_cages SET TIME_IN_CAGE = ? WHERE UUID = ?"); - statement.setInt(1, value); - statement.setString(2, me.getUniqueId().toString()); - statement.execute(); + statement = session.getConnection().prepareStatement("UPDATE players_in_cages SET TIME_IN_CAGE = ? WHERE UUID = ?"); + statement.setInt(1, value); + statement.setString(2, me.getUniqueId().toString()); + statement.execute(); - statement.close(); + statement.close(); + } } + } catch (SQLException z) { + z.printStackTrace(); } - } catch(SQLException z) { - z.printStackTrace(); } } public int getBlocksLeftToBreak() { - try (PreparedStatement statement = getSqlStore().getConnection().prepareStatement("SELECT BLOCKS_LEFT FROM players_in_cages WHERE UUID = ?")) { - statement.setString(1, me.getUniqueId().toString()); + try (SqlSession session = getSqlStore().openSession()) { + try (PreparedStatement statement = session.getConnection().prepareStatement("SELECT BLOCKS_LEFT FROM players_in_cages WHERE UUID = ?")) { + statement.setString(1, me.getUniqueId().toString()); - try(ResultSet resultSet = statement.executeQuery()) { - if(resultSet.next()) { - return resultSet.getInt(1); + try (ResultSet resultSet = statement.executeQuery()) { + if (resultSet.next()) { + return resultSet.getInt(1); + } } + } catch (SQLException e) { + e.printStackTrace(); } - } catch (SQLException e) { - e.printStackTrace(); } return 0; } public boolean isLocateInCage() { - try (PreparedStatement statement = getSqlStore().getConnection().prepareStatement("SELECT UUID FROM players_in_cages WHERE UUID = ?")) { - statement.setString(1, me.getUniqueId().toString()); + try (SqlSession session = getSqlStore().openSession()) { + try (PreparedStatement statement = session.getConnection().prepareStatement("SELECT UUID FROM players_in_cages WHERE UUID = ?")) { + statement.setString(1, me.getUniqueId().toString()); - try(ResultSet resultSet = statement.executeQuery()) { - if(resultSet.next()) { - return true; + try (ResultSet resultSet = statement.executeQuery()) { + if (resultSet.next()) { + return true; + } } + } catch (SQLException e) { + e.printStackTrace(); } - } catch (SQLException e) { - e.printStackTrace(); } return false; } @@ -231,37 +244,39 @@ public class Prisoner { } public void register() throws SQLException { - final Connection connection = getSqlStore().getConnection(); + try (SqlSession session = getSqlStore().openSession()) { + final Connection connection = session.getConnection(); - PreparedStatement statement = connection.prepareStatement("SELECT UUID FROM player_stats WHERE UUID = ?"); - statement.setString(1, me.getUniqueId().toString()); + PreparedStatement statement = connection.prepareStatement("SELECT UUID FROM player_stats WHERE UUID = ?"); + statement.setString(1, me.getUniqueId().toString()); - try(ResultSet resultSet = statement.executeQuery()) { - if(!resultSet.next()) { - statement.close(); + try (ResultSet resultSet = statement.executeQuery()) { + if (!resultSet.next()) { + statement.close(); - statement = connection.prepareStatement( - "INSERT INTO player_stats(NAME, UUID, LEVEL, POINTS, FACTION, RESPECT, F_RANG, SUSPECT, WALLET, " + - "G_TIME, D_BLOCKS, K_PLAYERS, K_MOBS, DEATHS) " - + "VALUES (?, ?, 1, 0, 'NONE', 0, 0, 0, 0, 0, 0, 0, 0, 0)"); - statement.setString(1, getPlayer().getName()); - statement.setString(2, me.getUniqueId().toString()); - statement.executeUpdate(); - statement.close(); + statement = connection.prepareStatement( + "INSERT INTO player_stats(NAME, UUID, LEVEL, POINTS, FACTION, RESPECT, F_RANG, SUSPECT, WALLET, " + + "G_TIME, D_BLOCKS, K_PLAYERS, K_MOBS, DEATHS) " + + "VALUES (?, ?, 1, 0, 'NONE', 0, 0, 0, 0, 0, 0, 0, 0, 0)"); + statement.setString(1, getPlayer().getName()); + statement.setString(2, me.getUniqueId().toString()); + statement.executeUpdate(); + statement.close(); - statement = connection.prepareStatement( - "INSERT INTO daily_respect_task(NAME, UUID, COOLDOWN) " + - "VALUES (?, ?, ?)"); - statement.setString(1, getPlayer().getName()); - statement.setString(2, me.getUniqueId().toString()); - statement.setInt(3, (3600 * 24)); - statement.executeUpdate(); + statement = connection.prepareStatement( + "INSERT INTO daily_respect_task(NAME, UUID, COOLDOWN) " + + "VALUES (?, ?, ?)"); + statement.setString(1, getPlayer().getName()); + statement.setString(2, me.getUniqueId().toString()); + statement.setInt(3, (3600 * 24)); + statement.executeUpdate(); - level = new Level(this); - stats = new Stats(this); - wallet = new Wallet(this); + level = new Level(this); + stats = new Stats(this); + wallet = new Wallet(this); + } } + statement.close(); } - statement.close(); } } \ No newline at end of file diff --git a/src/main/resources/ru/prisonlife/api/store/DailyRespectTaskMapper.xml b/src/main/resources/ru/prisonlife/api/store/DailyRespectTaskMapper.xml new file mode 100644 index 0000000..2d2e0d2 --- /dev/null +++ b/src/main/resources/ru/prisonlife/api/store/DailyRespectTaskMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + UPDATE daily_respect_task + SET COOLDOWN = #{cooldownRespect} + WHERE UUID = #{uuid}; + + + \ No newline at end of file diff --git a/src/main/resources/ru/prisonlife/api/store/PlayerStatsMapper.xml b/src/main/resources/ru/prisonlife/api/store/PlayerStatsMapper.xml new file mode 100644 index 0000000..02c0a4e --- /dev/null +++ b/src/main/resources/ru/prisonlife/api/store/PlayerStatsMapper.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + UPDATE player_stats + SET WALLET = #{wallet}, + FACTION = #{faction}, + F_RANG = #{rang}, + RESPECT = #{respect}, + COOLDOWN = #{cooldownRespect}, + POINTS = #{points}, + LEVEL = #{level}, + G_TIME = #{serverTime}, + D_BLOCKS = #{blocks}, + K_PLAYERS = #{players}, + K_MOBS = #{mobs}, + DEATHS = #{deaths} + WHERE UUID = #{uuid}; + + + \ No newline at end of file diff --git a/src/main/resources/ru/prisonlife/api/store/config.xml b/src/main/resources/ru/prisonlife/api/store/config.xml new file mode 100644 index 0000000..1661d9c --- /dev/null +++ b/src/main/resources/ru/prisonlife/api/store/config.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file