diff --git a/src/de/steamwar/bungeecore/BungeeCore.java b/src/de/steamwar/bungeecore/BungeeCore.java index d07ce131..6d3a3d7c 100644 --- a/src/de/steamwar/bungeecore/BungeeCore.java +++ b/src/de/steamwar/bungeecore/BungeeCore.java @@ -34,6 +34,7 @@ import de.steamwar.command.SWCommandUtils; import de.steamwar.command.SWTypeMapperCreator; import de.steamwar.command.TabCompletionCache; import de.steamwar.command.TypeMapper; +import de.steamwar.sql.internal.Statement; import net.md_5.bungee.BungeeCord; import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.CommandSender; diff --git a/src/de/steamwar/bungeecore/commands/GDPRQuery.java b/src/de/steamwar/bungeecore/commands/GDPRQuery.java index 671d5a2d..25e37fa1 100644 --- a/src/de/steamwar/bungeecore/commands/GDPRQuery.java +++ b/src/de/steamwar/bungeecore/commands/GDPRQuery.java @@ -2,11 +2,10 @@ package de.steamwar.bungeecore.commands; import de.steamwar.bungeecore.BungeeCore; import de.steamwar.bungeecore.Message; -import de.steamwar.bungeecore.sql.Statement; +import de.steamwar.sql.internal.Statement; import de.steamwar.bungeecore.sql.SteamwarUser; import de.steamwar.command.SWCommand; import net.md_5.bungee.BungeeCord; -import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.connection.ProxiedPlayer; import java.io.*; diff --git a/src/de/steamwar/bungeecore/sql/BannedUserIPs.java b/src/de/steamwar/bungeecore/sql/BannedUserIPs.java index 4a754845..3d779190 100644 --- a/src/de/steamwar/bungeecore/sql/BannedUserIPs.java +++ b/src/de/steamwar/bungeecore/sql/BannedUserIPs.java @@ -19,6 +19,8 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; + import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; diff --git a/src/de/steamwar/bungeecore/sql/BauweltMember.java b/src/de/steamwar/bungeecore/sql/BauweltMember.java index f89650e2..66222bf6 100644 --- a/src/de/steamwar/bungeecore/sql/BauweltMember.java +++ b/src/de/steamwar/bungeecore/sql/BauweltMember.java @@ -19,6 +19,8 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; + import java.util.ArrayList; import java.util.List; import java.util.UUID; diff --git a/src/de/steamwar/bungeecore/sql/CheckedSchematic.java b/src/de/steamwar/bungeecore/sql/CheckedSchematic.java index baae8933..77815c49 100644 --- a/src/de/steamwar/bungeecore/sql/CheckedSchematic.java +++ b/src/de/steamwar/bungeecore/sql/CheckedSchematic.java @@ -19,6 +19,8 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; + import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; diff --git a/src/de/steamwar/bungeecore/sql/Event.java b/src/de/steamwar/bungeecore/sql/Event.java index ab4cedef..c2ad2adf 100644 --- a/src/de/steamwar/bungeecore/sql/Event.java +++ b/src/de/steamwar/bungeecore/sql/Event.java @@ -19,6 +19,8 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; + import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; diff --git a/src/de/steamwar/bungeecore/sql/EventFight.java b/src/de/steamwar/bungeecore/sql/EventFight.java index 4135b61f..0a7072e1 100644 --- a/src/de/steamwar/bungeecore/sql/EventFight.java +++ b/src/de/steamwar/bungeecore/sql/EventFight.java @@ -19,6 +19,7 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; import de.steamwar.bungeecore.ArenaMode; import java.sql.ResultSet; diff --git a/src/de/steamwar/bungeecore/sql/Fight.java b/src/de/steamwar/bungeecore/sql/Fight.java index e13b7872..6cde50c8 100644 --- a/src/de/steamwar/bungeecore/sql/Fight.java +++ b/src/de/steamwar/bungeecore/sql/Fight.java @@ -1,5 +1,6 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; import de.steamwar.bungeecore.ArenaMode; import java.sql.ResultSet; diff --git a/src/de/steamwar/bungeecore/sql/FightPlayer.java b/src/de/steamwar/bungeecore/sql/FightPlayer.java index a4e11926..8416cb0f 100644 --- a/src/de/steamwar/bungeecore/sql/FightPlayer.java +++ b/src/de/steamwar/bungeecore/sql/FightPlayer.java @@ -1,5 +1,7 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; + import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; diff --git a/src/de/steamwar/bungeecore/sql/IgnoreSystem.java b/src/de/steamwar/bungeecore/sql/IgnoreSystem.java index 7309f8ab..b152805e 100644 --- a/src/de/steamwar/bungeecore/sql/IgnoreSystem.java +++ b/src/de/steamwar/bungeecore/sql/IgnoreSystem.java @@ -19,6 +19,7 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; import net.md_5.bungee.api.connection.ProxiedPlayer; import java.sql.ResultSet; diff --git a/src/de/steamwar/bungeecore/sql/Mod.java b/src/de/steamwar/bungeecore/sql/Mod.java index 6825565f..a8b89b70 100644 --- a/src/de/steamwar/bungeecore/sql/Mod.java +++ b/src/de/steamwar/bungeecore/sql/Mod.java @@ -19,6 +19,8 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; + public class Mod { private static final Statement get = new Statement("SELECT * FROM Mods WHERE ModName = ? AND Platform = ?"); diff --git a/src/de/steamwar/bungeecore/sql/NodeMember.java b/src/de/steamwar/bungeecore/sql/NodeMember.java index 063dd487..878982c8 100644 --- a/src/de/steamwar/bungeecore/sql/NodeMember.java +++ b/src/de/steamwar/bungeecore/sql/NodeMember.java @@ -19,6 +19,8 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; + import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashSet; diff --git a/src/de/steamwar/bungeecore/sql/PollAnswer.java b/src/de/steamwar/bungeecore/sql/PollAnswer.java index 7a34476e..8f9a64e5 100644 --- a/src/de/steamwar/bungeecore/sql/PollAnswer.java +++ b/src/de/steamwar/bungeecore/sql/PollAnswer.java @@ -19,6 +19,7 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; import de.steamwar.bungeecore.listeners.PollSystem; import java.sql.ResultSet; diff --git a/src/de/steamwar/bungeecore/sql/Punishment.java b/src/de/steamwar/bungeecore/sql/Punishment.java index a2a10853..8bc3b4a3 100644 --- a/src/de/steamwar/bungeecore/sql/Punishment.java +++ b/src/de/steamwar/bungeecore/sql/Punishment.java @@ -19,6 +19,7 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/src/de/steamwar/bungeecore/sql/SWException.java b/src/de/steamwar/bungeecore/sql/SWException.java index 8a2c2e1f..29e127af 100644 --- a/src/de/steamwar/bungeecore/sql/SWException.java +++ b/src/de/steamwar/bungeecore/sql/SWException.java @@ -19,6 +19,8 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; + public class SWException { private SWException(){} diff --git a/src/de/steamwar/bungeecore/sql/SchemElo.java b/src/de/steamwar/bungeecore/sql/SchemElo.java index 55df604e..c5f0a344 100644 --- a/src/de/steamwar/bungeecore/sql/SchemElo.java +++ b/src/de/steamwar/bungeecore/sql/SchemElo.java @@ -19,6 +19,7 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; import static de.steamwar.bungeecore.sql.UserElo.ELO_DEFAULT; public class SchemElo { diff --git a/src/de/steamwar/bungeecore/sql/SchematicNode.java b/src/de/steamwar/bungeecore/sql/SchematicNode.java index d3b7a666..66a91832 100644 --- a/src/de/steamwar/bungeecore/sql/SchematicNode.java +++ b/src/de/steamwar/bungeecore/sql/SchematicNode.java @@ -19,19 +19,16 @@ package de.steamwar.bungeecore.sql; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import java.io.ByteArrayInputStream; -import java.io.IOException; +import de.steamwar.sql.internal.Statement; + import java.io.InputStream; -import java.sql.Blob; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.time.Instant; import java.util.*; import java.util.function.Predicate; -import java.util.zip.GZIPInputStream; public class SchematicNode { private static final Statement createNode = new Statement("INSERT INTO SchematicNode (NodeName, NodeOwner, ParentNode, NodeType, NodeItem) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE NodeName = VALUES(NodeName), ParentNode = VALUES(ParentNode), NodeItem = VALUES(NodeItem), NodeType = VALUES(NodeType), NodeItem = VALUES(NodeItem)"); diff --git a/src/de/steamwar/bungeecore/sql/Session.java b/src/de/steamwar/bungeecore/sql/Session.java index 9793c353..f5eae0df 100644 --- a/src/de/steamwar/bungeecore/sql/Session.java +++ b/src/de/steamwar/bungeecore/sql/Session.java @@ -19,6 +19,8 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; + import java.sql.Timestamp; public class Session { diff --git a/src/de/steamwar/bungeecore/sql/Statement.java b/src/de/steamwar/bungeecore/sql/Statement.java deleted file mode 100644 index 06b705a4..00000000 --- a/src/de/steamwar/bungeecore/sql/Statement.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - This file is a part of the SteamWar software. - - Copyright (C) 2020 SteamWar.de-Serverteam - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - */ - -package de.steamwar.bungeecore.sql; - -import de.steamwar.bungeecore.BungeeCore; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.config.Configuration; -import net.md_5.bungee.config.ConfigurationProvider; -import net.md_5.bungee.config.YamlConfiguration; - -import java.io.File; -import java.io.IOException; -import java.sql.*; -import java.util.*; -import java.util.logging.Level; -import java.util.logging.Logger; - -public class Statement implements AutoCloseable { - - private static final Logger logger = BungeeCore.get().getLogger(); - - private static final List statements = new ArrayList<>(); - private static final Deque connections = new ArrayDeque<>(); - - private static final String URL; - private static final String USER; - private static final String PASSWORD; - - static { - File file = new File(System.getProperty("user.home"), "MySQL.yml"); - Configuration config; - try { - config = ConfigurationProvider.getProvider(YamlConfiguration.class).load(file); - } catch (IOException e) { - ProxyServer.getInstance().stop(); - throw new SecurityException("Could not load SQL connection", e); - } - - URL = "jdbc:mysql://" + config.getString("HOST") + ":" + config.getString("PORT") + "/" + config.getString("DATABASE"); - USER = config.getString("USER"); - PASSWORD = config.getString("PASSWORD"); - } - - public static void closeAll() { - synchronized (connections) { - for(Connection connection : connections) { - try { - synchronized (statements) { - statements.forEach(statement -> statement.close(connection)); - } - connection.close(); - } catch (SQLException e) { - logger.log(Level.INFO, "Could not close SQL connection", e); - } - } - connections.clear(); - } - } - - private final String sql; - private final Map cachedStatements = new HashMap<>(); - - public Statement(String sql) { - this.sql = sql; - synchronized (statements) { - statements.add(this); - } - } - - public T select(ResultSetUser user, Object... objects) { - return withConnection(st -> { - ResultSet rs = st.executeQuery(); - T result = user.use(rs); - rs.close(); - return result; - }, objects); - } - - public void update(Object... objects) { - withConnection(PreparedStatement::executeUpdate, objects); - } - - private T withConnection(SQLRunnable runnable, Object... objects) { - Connection connection = aquireConnection(); - - T result; - try { - result = tryWithConnection(connection, runnable, objects); - } catch (SQLException e) { - closeConnection(connection); - connection = aquireConnection(); - try { - result = tryWithConnection(connection, runnable, objects); - } catch (SQLException ex) { - closeConnection(connection); - throw new SecurityException("Could not execute statement", ex); - } - } - - synchronized (connections) { - connections.addLast(connection); - } - - return result; - } - - private T tryWithConnection(Connection connection, SQLRunnable runnable, Object... objects) throws SQLException { - PreparedStatement st = cachedStatements.get(connection); - if(st == null) { - st = connection.prepareStatement(sql); - cachedStatements.put(connection, st); - } - - for (int i = 0; i < objects.length; i++) { - st.setObject(i + 1, objects[i]); - } - - return runnable.run(st); - } - - @Override - public void close() { - cachedStatements.values().forEach(st -> closeStatement(st, false)); - cachedStatements.clear(); - synchronized (statements) { - statements.remove(this); - } - } - - private void close(Connection connection) { - PreparedStatement st = cachedStatements.remove(connection); - if(st != null) - closeStatement(st, true); - } - - private static Connection aquireConnection() { - synchronized (connections) { - if(!connections.isEmpty()) - return connections.pop(); - } - try { - return DriverManager.getConnection(URL + "?autoReconnect=true&useServerPrepStmts=true", USER, PASSWORD); - } catch (SQLException e) { - throw new SecurityException("Could not open connection", e); - } - } - - private static void closeConnection(Connection connection) { - synchronized (statements) { - for (Statement statement : statements) { - statement.close(connection); - } - } - try { - connection.close(); - } catch (SQLException e) { - logger.log(Level.INFO, "Could not close connection", e); - } - } - - private static void closeStatement(PreparedStatement st, boolean silent) { - try { - st.close(); - } catch (SQLException e) { - if(!silent) - logger.log(Level.INFO, "Could not close statement", e); - } - } - - public interface ResultSetUser { - T use(ResultSet rs) throws SQLException; - } - - private interface SQLRunnable { - T run(PreparedStatement st) throws SQLException; - } -} diff --git a/src/de/steamwar/bungeecore/sql/SteamwarUser.java b/src/de/steamwar/bungeecore/sql/SteamwarUser.java index 150ccf45..3fad94e0 100644 --- a/src/de/steamwar/bungeecore/sql/SteamwarUser.java +++ b/src/de/steamwar/bungeecore/sql/SteamwarUser.java @@ -19,6 +19,7 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; import com.google.gson.JsonParser; import de.steamwar.bungeecore.BungeeCore; import de.steamwar.bungeecore.Message; diff --git a/src/de/steamwar/bungeecore/sql/Team.java b/src/de/steamwar/bungeecore/sql/Team.java index b00a64f4..83e8e0af 100644 --- a/src/de/steamwar/bungeecore/sql/Team.java +++ b/src/de/steamwar/bungeecore/sql/Team.java @@ -19,6 +19,8 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; + import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; diff --git a/src/de/steamwar/bungeecore/sql/TeamTeilnahme.java b/src/de/steamwar/bungeecore/sql/TeamTeilnahme.java index 1688cefb..a77f33dd 100644 --- a/src/de/steamwar/bungeecore/sql/TeamTeilnahme.java +++ b/src/de/steamwar/bungeecore/sql/TeamTeilnahme.java @@ -19,6 +19,8 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; + import java.sql.ResultSet; import java.util.HashSet; import java.util.Set; diff --git a/src/de/steamwar/bungeecore/sql/Tutorial.java b/src/de/steamwar/bungeecore/sql/Tutorial.java index 7c82f066..6196ad61 100644 --- a/src/de/steamwar/bungeecore/sql/Tutorial.java +++ b/src/de/steamwar/bungeecore/sql/Tutorial.java @@ -19,6 +19,8 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; + import de.steamwar.bungeecore.BungeeCore; import de.steamwar.bungeecore.ServerStarter; import de.steamwar.bungeecore.SubserverSystem; diff --git a/src/de/steamwar/bungeecore/sql/UserConfig.java b/src/de/steamwar/bungeecore/sql/UserConfig.java index 10f4dda3..b2c79bd2 100644 --- a/src/de/steamwar/bungeecore/sql/UserConfig.java +++ b/src/de/steamwar/bungeecore/sql/UserConfig.java @@ -20,6 +20,8 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; + public class UserConfig { private UserConfig() {} diff --git a/src/de/steamwar/bungeecore/sql/UserElo.java b/src/de/steamwar/bungeecore/sql/UserElo.java index efa00782..ed5df184 100644 --- a/src/de/steamwar/bungeecore/sql/UserElo.java +++ b/src/de/steamwar/bungeecore/sql/UserElo.java @@ -19,6 +19,7 @@ package de.steamwar.bungeecore.sql; +import de.steamwar.sql.internal.Statement; import de.steamwar.bungeecore.ArenaMode; import de.steamwar.bungeecore.Message; import net.md_5.bungee.api.connection.ProxiedPlayer; diff --git a/src/de/steamwar/sql/SQLConfigImpl.java b/src/de/steamwar/sql/SQLConfigImpl.java new file mode 100644 index 00000000..d1e17013 --- /dev/null +++ b/src/de/steamwar/sql/SQLConfigImpl.java @@ -0,0 +1,37 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2023 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.sql; + +import de.steamwar.bungeecore.BungeeCore; +import de.steamwar.sql.internal.SQLConfig; + +import java.util.logging.Logger; + +public class SQLConfigImpl implements SQLConfig { + @Override + public Logger getLogger() { + return BungeeCore.get().getLogger(); + } + + @Override + public int maxConnections() { + return 4; + } +} diff --git a/src/de/steamwar/sql/SQLWrapperImpl.java b/src/de/steamwar/sql/SQLWrapperImpl.java new file mode 100644 index 00000000..f564ff25 --- /dev/null +++ b/src/de/steamwar/sql/SQLWrapperImpl.java @@ -0,0 +1,86 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2023 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.sql; + +import de.steamwar.bungeecore.BungeeCore; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.config.ServerInfo; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.config.Configuration; +import net.md_5.bungee.config.ConfigurationProvider; +import net.md_5.bungee.config.YamlConfiguration; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class SQLWrapperImpl implements SQLWrapper { + @Override + public void loadSchemTypes(List tmpTypes, Map tmpFromDB) { + File folder = new File(BungeeCore.get().getDataFolder().getParentFile(), "FightSystem"); + if(folder.exists()) { + for(File configFile : Arrays.stream(folder.listFiles((file, name) -> name.endsWith(".yml") && !name.endsWith(".kits.yml"))).sorted().collect(Collectors.toList())) { + Configuration config; + try { + config = ConfigurationProvider.getProvider(YamlConfiguration.class).load(configFile); + } catch (IOException e) { + throw new SecurityException("Could not load SchematicTypes", e); + } + + if(!config.contains("Schematic")) + continue; + + String type = config.getString("Schematic.Type"); + assert type != null; + String shortcut = config.getString("Schematic.Shortcut"); + if(tmpFromDB.containsKey(type.toLowerCase())) + continue; + + SchematicType checktype = null; + String material = config.getString("Schematic.Material"); + + if(!config.getStringList("CheckQuestions").isEmpty()) { + checktype = new SchematicType("C" + type, "C" + shortcut, SchematicType.Type.CHECK_TYPE, null, material); + tmpTypes.add(checktype); + tmpFromDB.put(checktype.toDB(), checktype); + } + + SchematicType current = new SchematicType(type, shortcut, !config.contains("Server") ? SchematicType.Type.FIGHT_TYPE : SchematicType.Type.NORMAL, checktype, material); + tmpTypes.add(current); + tmpFromDB.put(type.toLowerCase(), current); + } + } + } + + @Override + public void additionalExceptionMetadata(StringBuilder builder) { + builder.append("\nServers: "); + for(Map.Entry server : ProxyServer.getInstance().getServers().entrySet()) { + builder.append(server.getKey()).append("("); + for(ProxiedPlayer player : server.getValue().getPlayers()) { + builder.append(player.getName()).append(" "); + } + builder.append(")"); + } + } +}