From f8618a7a82c0f5344b6cfaf4442ba2c36e902abd Mon Sep 17 00:00:00 2001 From: Lixfel Date: Sat, 29 May 2021 17:39:06 +0200 Subject: [PATCH 01/15] Remove bau passthrough Signed-off-by: Lixfel --- src/de/steamwar/bungeecore/BungeeCore.java | 1 + .../bungeecore/commands/BauCommand.java | 106 +++++++++--------- .../bungeecore/comms/PacketIdManager.java | 1 + .../comms/packets/BaumemberUpdatePacket.java | 36 ++++++ .../bungeecore/listeners/ChatListener.java | 6 - 5 files changed, 93 insertions(+), 57 deletions(-) create mode 100644 src/de/steamwar/bungeecore/comms/packets/BaumemberUpdatePacket.java diff --git a/src/de/steamwar/bungeecore/BungeeCore.java b/src/de/steamwar/bungeecore/BungeeCore.java index 2344d56..e3a11b0 100644 --- a/src/de/steamwar/bungeecore/BungeeCore.java +++ b/src/de/steamwar/bungeecore/BungeeCore.java @@ -123,6 +123,7 @@ public class BungeeCore extends Plugin { new ResourcereloadCommand(); if(!EVENT_MODE){ + new BauCommand(); new WebregisterCommand(); new FightCommand(); new ChallengeCommand(); diff --git a/src/de/steamwar/bungeecore/commands/BauCommand.java b/src/de/steamwar/bungeecore/commands/BauCommand.java index 43944d7..d50f7a7 100644 --- a/src/de/steamwar/bungeecore/commands/BauCommand.java +++ b/src/de/steamwar/bungeecore/commands/BauCommand.java @@ -20,38 +20,38 @@ package de.steamwar.bungeecore.commands; import de.steamwar.bungeecore.*; +import de.steamwar.bungeecore.comms.packets.BaumemberUpdatePacket; import de.steamwar.bungeecore.inventory.SWInventory; import de.steamwar.bungeecore.inventory.SWItem; import de.steamwar.bungeecore.sql.BauweltMember; import de.steamwar.bungeecore.sql.SteamwarUser; +import net.md_5.bungee.api.CommandSender; 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.api.event.ChatEvent; -public class BauCommand { +public class BauCommand extends BasicCommand { - private BauCommand(){} + public BauCommand(){ + super("bau", null, "b", "gs"); + } - public static void onBau(ChatEvent e, String[] command){ - if(BungeeCore.EVENT_MODE) + @Override + public void execute(CommandSender sender, String[] args) { + if(!(sender instanceof ProxiedPlayer)) return; - ProxiedPlayer p = (ProxiedPlayer) e.getSender(); - Subserver server = Subserver.getSubserver(p); - Bauserver bau = (server != null && server.getType() == Servertype.BAUSERVER) ? (Bauserver)server : null; - boolean ownBau = bau != null && bau.getOwner().equals(p.getUniqueId()); - e.setCancelled(true); - BungeeCore.log(p, e.getMessage()); + ProxiedPlayer p = (ProxiedPlayer) sender; - if(command.length == 1){ - if(bau15(p, command, 1)) + if(args.length == 0){ + if(bau15(p, args, 0)) SubserverSystem.sendToBau15(p, p.getUniqueId()); else SubserverSystem.sendToBauServer(p, p.getUniqueId()); return; } - switch(command[1].toLowerCase()){ + switch(args[0].toLowerCase()){ case "ws": case "warship": case "12": @@ -72,52 +72,44 @@ public class BauCommand { SubserverSystem.sendToBau15paper(p, p.getUniqueId()); break; case "addmember": - addmember(p, command); + addmember(p, args); break; case "tp": case "teleport": - teleport(p, command); + teleport(p, args); break; case "info": - if (bau != null) { - e.setCancelled(false); - } + p.chat("/bauinfo"); break; case "togglewe": - if(ownBau && command.length > 2) - e.setCancelled(false); - else - togglewe(p, command); + togglewe(p, args); break; case "toggleworld": - if(ownBau && command.length > 2) - e.setCancelled(false); - else - toggleworld(p, command); + toggleworld(p, args); break; case "delmember": - delmember(p, command); + delmember(p, args); break; case "resetall": case "delete": - delete(p, command); + delete(p, args); break; case "testarena": case "test": - testarena(p, command); + testarena(p, args); break; default: HelpCommand.sendBauHelp(p); } } - private static void addmember(ProxiedPlayer p, String[] command){ - if (command.length == 2) { + private static void addmember(ProxiedPlayer p, String[] args){ + if (args.length == 1) { Message.send("BAU_ADDMEMBER_USAGE", p); return; } - SteamwarUser target = SteamwarUser.get(command[2]); + SteamwarUser target = SteamwarUser.get(args[1]); if (target == null) { Message.send("UNKNOWN_PLAYER", p); return; @@ -137,13 +129,13 @@ public class BauCommand { Message.send("BAU_ADDMEMBER_ADDED_TARGET", z, p.getName()); } - private static void teleport(ProxiedPlayer p, String[] command){ - if (command.length == 2) { + private static void teleport(ProxiedPlayer p, String[] args){ + if (args.length == 1) { Message.send("BAU_TP_USAGE", p); return; } - SteamwarUser worldOwner = SteamwarUser.get(command[2]); + SteamwarUser worldOwner = SteamwarUser.get(args[1]); if (worldOwner == null) { Message.send("UNKNOWN_PLAYER", p); return; @@ -153,7 +145,7 @@ public class BauCommand { return; } - if(bau15(p, command, 3)) + if(bau15(p, args, 2)) SubserverSystem.sendToBau15(p, worldOwner.getUuid()); else SubserverSystem.sendToBauServer(p, worldOwner.getUuid()); @@ -183,31 +175,43 @@ public class BauCommand { } } - private static void togglewe(ProxiedPlayer p, String[] command){ - BauweltMember target = toggle(p, command, "togglewe"); + private static void togglewe(ProxiedPlayer p, String[] args){ + BauweltMember target = toggle(p, args, "togglewe"); if(target == null) return; target.setWorldEdit(!target.isWorldEdit()); + clearMembercache(p); isAllowedTo(target.isWorldEdit(), p, target, "WorldEdit verwenden"); } - private static void toggleworld(ProxiedPlayer p, String[] command){ - BauweltMember target = toggle(p, command, "toggleworld"); + private static void toggleworld(ProxiedPlayer p, String[] args){ + BauweltMember target = toggle(p, args, "toggleworld"); if(target == null) return; target.setWorld(!target.isWorld()); + clearMembercache(p); isAllowedTo(target.isWorld(), p, target, "Einstellungen vornehmen"); } - private static void delmember(ProxiedPlayer p, String[] command){ - if (command.length == 2) { + private static void clearMembercache(ProxiedPlayer p){ + for(ServerInfo info : ProxyServer.getInstance().getServers().values()){ + Subserver server = Subserver.getSubserver(info); + if(server != null && server.getType() == Servertype.BAUSERVER && ((Bauserver)server).getOwner().equals(p.getUniqueId())){ + info.getPlayers().stream().findAny().ifPresent(player -> new BaumemberUpdatePacket().send(player)); + break; + } + } + } + + private static void delmember(ProxiedPlayer p, String[] args){ + if (args.length == 1) { Message.send("BAU_DELMEMBER_USAGE", p); return; } - BauweltMember target = member(p, SteamwarUser.get(command[2])); + BauweltMember target = member(p, SteamwarUser.get(args[1])); if(target == null) return; @@ -228,13 +232,13 @@ public class BauCommand { Message.send("BAU_DELMEMBER_DELETED", p); } - private static void delete(ProxiedPlayer p, String[] command){ + private static void delete(ProxiedPlayer p, String[] args){ SWInventory inventory = new SWInventory(p, 9, Message.parse("BAU_DELETE_GUI_NAME", p)); inventory.addItem(8, new SWItem(Message.parse("BAU_DELETE_GUI_CANCEL", p), 1), click -> inventory.close() ); inventory.addItem(0, new SWItem(Message.parse("BAU_DELETE_GUI_DELETE", p), 10), click -> { - if(bau15(p, command, 2)){ + if(bau15(p, args, 1)){ SteamwarUser user = SteamwarUser.get(p.getUniqueId()); deleteWorld(p, BungeeCore.USERWORLDS15 + user.getId()); }else{ @@ -275,8 +279,8 @@ public class BauCommand { } } - private static void testarena(ProxiedPlayer p, String[] command){ - FightCommand.createArena(p, "/bau testarena ", command, 2, false, (player, mode, map) -> ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { + private static void testarena(ProxiedPlayer p, String[] args){ + FightCommand.createArena(p, "/bau testarena ", args, 1, false, (player, mode, map) -> ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { stopBauserver(p); SubserverSystem.startTestServer(p, mode, map, 0, 0); })); @@ -296,13 +300,13 @@ public class BauCommand { return target; } - private static BauweltMember toggle(ProxiedPlayer p, String[] command, String subcommand){ - if (command.length == 2) { + private static BauweltMember toggle(ProxiedPlayer p, String[] args, String subcommand){ + if (args.length == 1) { Message.send("BAU_MEMBER_TOGGLE_USAGE", p, subcommand); return null; } - SteamwarUser member = SteamwarUser.get(command[2]); + SteamwarUser member = SteamwarUser.get(args[1]); return member(p, member); } diff --git a/src/de/steamwar/bungeecore/comms/PacketIdManager.java b/src/de/steamwar/bungeecore/comms/PacketIdManager.java index 8376d59..1d48745 100644 --- a/src/de/steamwar/bungeecore/comms/PacketIdManager.java +++ b/src/de/steamwar/bungeecore/comms/PacketIdManager.java @@ -25,6 +25,7 @@ public class PacketIdManager { public static final byte PING_PACKET = 0x01; public static final byte TABLIST_NAME = 0x02; public static final byte PREPARE_SCHEM = 0x03; + public static final byte BAUMEMBER_UPDATE = 0x04; //0x1(X) Bungee Inventory public static final byte INVENTORY_PACKET = 0x10; diff --git a/src/de/steamwar/bungeecore/comms/packets/BaumemberUpdatePacket.java b/src/de/steamwar/bungeecore/comms/packets/BaumemberUpdatePacket.java new file mode 100644 index 0000000..ddb4021 --- /dev/null +++ b/src/de/steamwar/bungeecore/comms/packets/BaumemberUpdatePacket.java @@ -0,0 +1,36 @@ +/* + 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.comms.packets; + +import com.google.common.io.ByteArrayDataOutput; +import de.steamwar.bungeecore.comms.BungeePacket; +import de.steamwar.bungeecore.comms.PacketIdManager; + +public class BaumemberUpdatePacket extends BungeePacket { + @Override + public int getId() { + return PacketIdManager.BAUMEMBER_UPDATE; + } + + @Override + public void writeVars(ByteArrayDataOutput byteArrayDataOutput) { + // empty + } +} diff --git a/src/de/steamwar/bungeecore/listeners/ChatListener.java b/src/de/steamwar/bungeecore/listeners/ChatListener.java index b41ea78..774747b 100644 --- a/src/de/steamwar/bungeecore/listeners/ChatListener.java +++ b/src/de/steamwar/bungeecore/listeners/ChatListener.java @@ -23,7 +23,6 @@ import de.steamwar.bungeecore.BungeeCore; import de.steamwar.bungeecore.Message; import de.steamwar.bungeecore.Servertype; import de.steamwar.bungeecore.Subserver; -import de.steamwar.bungeecore.commands.BauCommand; import de.steamwar.bungeecore.commands.TpCommand; import de.steamwar.bungeecore.comms.packets.PingPacket; import de.steamwar.bungeecore.sql.SteamwarUser; @@ -77,11 +76,6 @@ public class ChatListener extends BasicListener { } switch(command[0].toLowerCase()){ - case "/bau": - case "/b": - case "/gs": - BauCommand.onBau(e, command); - break; case "/bc": case "/bauchat": case "/local": From 5186526d0a15d0d987e79ce16ffad92b4d948045 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Fri, 3 Sep 2021 12:20:24 +0200 Subject: [PATCH 02/15] Remove JDBC RAM leak Signed-off-by: Lixfel --- src/de/steamwar/bungeecore/BungeeCore.java | 11 +- .../commands/PollresultCommand.java | 2 +- .../bungeecore/commands/TeamCommand.java | 2 +- .../bungeecore/sql/BannedUserIPs.java | 46 +++--- .../bungeecore/sql/BauweltMember.java | 46 +++--- .../bungeecore/sql/CheckedSchematic.java | 17 +-- src/de/steamwar/bungeecore/sql/Elo.java | 33 ++--- src/de/steamwar/bungeecore/sql/Event.java | 55 +++---- .../steamwar/bungeecore/sql/EventFight.java | 32 ++-- .../steamwar/bungeecore/sql/IgnoreSystem.java | 20 +-- src/de/steamwar/bungeecore/sql/Mod.java | 23 ++- .../steamwar/bungeecore/sql/PollAnswer.java | 43 ++---- .../steamwar/bungeecore/sql/Punishment.java | 49 +++---- src/de/steamwar/bungeecore/sql/SQL.java | 95 ------------ .../steamwar/bungeecore/sql/SWException.java | 4 +- src/de/steamwar/bungeecore/sql/Schematic.java | 80 +++++----- .../bungeecore/sql/SchematicMember.java | 85 ++--------- src/de/steamwar/bungeecore/sql/Session.java | 5 +- src/de/steamwar/bungeecore/sql/Statement.java | 137 ++++++++++++++++++ .../steamwar/bungeecore/sql/SteamwarUser.java | 132 +++++++++-------- src/de/steamwar/bungeecore/sql/Team.java | 88 +++++------ .../bungeecore/sql/TeamTeilnahme.java | 43 +++--- 22 files changed, 466 insertions(+), 582 deletions(-) delete mode 100644 src/de/steamwar/bungeecore/sql/SQL.java create mode 100644 src/de/steamwar/bungeecore/sql/Statement.java diff --git a/src/de/steamwar/bungeecore/BungeeCore.java b/src/de/steamwar/bungeecore/BungeeCore.java index f2bd01f..9d5ffd9 100644 --- a/src/de/steamwar/bungeecore/BungeeCore.java +++ b/src/de/steamwar/bungeecore/BungeeCore.java @@ -24,11 +24,11 @@ import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig; import de.steamwar.bungeecore.commands.*; import de.steamwar.bungeecore.comms.SpigotReceiver; import de.steamwar.bungeecore.listeners.*; -import de.steamwar.bungeecore.listeners.mods.ModLoaderBlocker; import de.steamwar.bungeecore.listeners.mods.Forge; import de.steamwar.bungeecore.listeners.mods.LabyMod; +import de.steamwar.bungeecore.listeners.mods.ModLoaderBlocker; import de.steamwar.bungeecore.listeners.mods.WorldDownloader; -import de.steamwar.bungeecore.sql.SQL; +import de.steamwar.bungeecore.sql.Statement; import de.steamwar.bungeecore.sql.SteamwarUser; import de.steamwar.bungeecore.sql.Team; import net.dv8tion.jda.api.JDA; @@ -145,19 +145,20 @@ public class BungeeCore extends Plugin { new EventStarter(); new SessionManager(); new SpigotReceiver(); - new SteamwarDiscordBot(); new TablistManager(); getProxy().getScheduler().schedule(this, () -> { SteamwarUser.clearCache(); Team.clearCache(); }, 1, 1, TimeUnit.HOURS); + + new SteamwarDiscordBot(); } @Override public void onDisable(){ ErrorLogger.stop(); - SQL.close(); + Statement.close(); try { SteamwarDiscordBot.instance().getJda().shutdownNow(); SteamwarDiscordBot.instance().getJda().awaitStatus(JDA.Status.SHUTDOWN); @@ -258,7 +259,7 @@ public class BungeeCore extends Plugin { Persistent.setChatPrefix(CHAT_PREFIX); Persistent.setLobbyServer(LOBBY_SERVER); - SQL.connect( + Statement.connect( config.getString("db.url"), config.getString("db.username"), config.getString("db.password") diff --git a/src/de/steamwar/bungeecore/commands/PollresultCommand.java b/src/de/steamwar/bungeecore/commands/PollresultCommand.java index 1d39e9e..cfebd66 100644 --- a/src/de/steamwar/bungeecore/commands/PollresultCommand.java +++ b/src/de/steamwar/bungeecore/commands/PollresultCommand.java @@ -46,7 +46,7 @@ public class PollresultCommand extends BasicCommand { ProxiedPlayer player = (ProxiedPlayer) sender; Map voted = PollAnswer.getCurrentResults(); - Message.send("POLLRESULT_HEADER", player, PollAnswer.getAllAnswered(), PollSystem.getQuestion()); + Message.send("POLLRESULT_HEADER", player, voted.values().stream().reduce(Integer::sum), PollSystem.getQuestion()); for (Map.Entry e: voted.entrySet()) { Message.send("POLLRESULT_LIST", sender, e.getKey(), e.getValue()); } diff --git a/src/de/steamwar/bungeecore/commands/TeamCommand.java b/src/de/steamwar/bungeecore/commands/TeamCommand.java index af3a84b..3889da2 100644 --- a/src/de/steamwar/bungeecore/commands/TeamCommand.java +++ b/src/de/steamwar/bungeecore/commands/TeamCommand.java @@ -177,7 +177,7 @@ public class TeamCommand extends BasicCommand { if(checkTeamName(player, team, args[2])) return; - Team.create(args[1], args[2], user); + Team.create(args[1], args[2]); user.setTeam(Team.get(args[1]).getTeamId()); user.setLeader(true); Message.send("TEAM_CREATE_CREATED", player, args[2]); diff --git a/src/de/steamwar/bungeecore/sql/BannedUserIPs.java b/src/de/steamwar/bungeecore/sql/BannedUserIPs.java index 6b371cc..4a75484 100644 --- a/src/de/steamwar/bungeecore/sql/BannedUserIPs.java +++ b/src/de/steamwar/bungeecore/sql/BannedUserIPs.java @@ -19,18 +19,18 @@ package de.steamwar.bungeecore.sql; -import de.steamwar.bungeecore.BungeeCore; - -import java.sql.ResultSet; -import java.sql.SQLException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; public class BannedUserIPs { - private int userID; - private Timestamp timestamp; + private static final Statement getByID = new Statement("SELECT * FROM BannedUserIPs WHERE UserID = ? ORDER BY Timestamp ASC"); + private static final Statement getByIP = new Statement("SELECT * FROM BannedUserIPs WHERE IP = ? ORDER BY Timestamp DESC"); + private static final Statement banIP = new Statement("INSERT INTO BannedUserIPs (UserID, Timestamp, IP) VALUES (?, NOW(), ?) ON DUPLICATE KEY UPDATE Timestamp=NOW()"); + + private final int userID; + private final Timestamp timestamp; private BannedUserIPs(int userID, Timestamp timestamp){ this.userID = userID; @@ -38,37 +38,31 @@ public class BannedUserIPs { } public static List get(int userID){ - List userIPs = new ArrayList<>(); - ResultSet dbentry = SQL.select("SELECT * FROM BannedUserIPs WHERE UserID = ? ORDER BY Timestamp ASC", userID); - try { - while(dbentry.next()){ + return getByID.select(rs -> { + List userIPs = new ArrayList<>(); + while(rs.next()) { userIPs.add(new BannedUserIPs( userID, - dbentry.getTimestamp("Timestamp"))); + rs.getTimestamp("Timestamp"))); } - } catch (SQLException e) { - BungeeCore.log("Get BannedUserIPs failed", e); - } - return userIPs; + return userIPs; + }, userID); } public static List get(String ip){ - List userIDs = new ArrayList<>(); - ResultSet dbentry = SQL.select("SELECT * FROM BannedUserIPs WHERE IP = ? ORDER BY Timestamp DESC", ip); - try { - while(dbentry.next()){ + return getByIP.select(rs -> { + List userIDs = new ArrayList<>(); + while(rs.next()) { userIDs.add(new BannedUserIPs( - dbentry.getInt("UserID"), - dbentry.getTimestamp("Timestamp"))); + rs.getInt("UserID"), + rs.getTimestamp("Timestamp"))); } - } catch (SQLException e) { - BungeeCore.log("Get BannedUserIPs failed", e); - } - return userIDs; + return userIDs; + }, ip); } static void banIP(SteamwarUser user, String ip){ - SQL.update("INSERT INTO BannedUserIPs (UserID, Timestamp, IP) VALUES (?, NOW(), ?) ON DUPLICATE KEY UPDATE Timestamp=NOW()", user.getId(), ip); + banIP.update(user.getId(), ip); } public int getUserID() { diff --git a/src/de/steamwar/bungeecore/sql/BauweltMember.java b/src/de/steamwar/bungeecore/sql/BauweltMember.java index f05cab2..f89650e 100644 --- a/src/de/steamwar/bungeecore/sql/BauweltMember.java +++ b/src/de/steamwar/bungeecore/sql/BauweltMember.java @@ -19,15 +19,17 @@ package de.steamwar.bungeecore.sql; -import de.steamwar.bungeecore.BungeeCore; - -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.UUID; public class BauweltMember{ + + private static final Statement delete = new Statement("DELETE FROM BauweltMember WHERE BauweltID = ? AND MemberID = ?"); + private static final Statement update = new Statement("INSERT INTO BauweltMember (BauweltID, MemberID, WorldEdit, World) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE WorldEdit = VALUES(WorldEdit), World = VALUES(World)"); + private static final Statement getMember = new Statement("SELECT * FROM BauweltMember WHERE BauweltID = ? AND MemberID = ?"); + private static final Statement getMembers = new Statement("SELECT * FROM BauweltMember WHERE BauweltID = ?"); + private final int bauweltID; private final int memberID; private boolean worldEdit; @@ -52,12 +54,11 @@ public class BauweltMember{ } public void remove(){ - SQL.update("DELETE FROM BauweltMember WHERE BauweltID = " + bauweltID + " AND MemberID = " + memberID); + delete.update(bauweltID, memberID); } private void updateDB(){ - SQL.update("INSERT INTO BauweltMember (BauweltID, MemberID, WorldEdit, World) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE WorldEdit = VALUES(WorldEdit), World = VALUES(World)", - bauweltID, memberID, worldEdit, world); + update.update(bauweltID, memberID, worldEdit, world); } public static BauweltMember getBauMember(UUID ownerID, UUID memberID){ @@ -65,18 +66,12 @@ public class BauweltMember{ } public static BauweltMember getBauMember(int ownerID, int memberID){ - ResultSet member = SQL.select("SELECT * FROM BauweltMember WHERE BauweltID = ? AND MemberID = ?", ownerID, memberID); - try { - if(member == null || !member.next()){ + return getMember.select(rs -> { + if(!rs.next()) return null; - } - boolean worldEdit = member.getBoolean("WorldEdit"); - boolean world = member.getBoolean("World"); - return new BauweltMember(ownerID, memberID, worldEdit, world, false); - } catch (SQLException e) { - BungeeCore.log("Could not load BauweltMember", e); - } - return null; + + return new BauweltMember(ownerID, memberID, rs.getBoolean("WorldEdit"), rs.getBoolean("World"), false); + }, ownerID, memberID); } public static List getMembers(UUID bauweltID){ @@ -84,20 +79,13 @@ public class BauweltMember{ } public static List getMembers(int bauweltID){ - try{ - ResultSet memberlist = SQL.select("SELECT * FROM BauweltMember WHERE BauweltID = ?", bauweltID); + return getMembers.select(rs -> { List members = new ArrayList<>(); - while(memberlist.next()){ - int memberID = memberlist.getInt("MemberID"); - boolean worldEdit = memberlist.getBoolean("WorldEdit"); - boolean world = memberlist.getBoolean("World"); - members.add(new BauweltMember(bauweltID, memberID, worldEdit, world, false)); + while(rs.next()){ + members.add(new BauweltMember(bauweltID, rs.getInt("MemberID"), rs.getBoolean("WorldEdit"), rs.getBoolean("World"), false)); } return members; - }catch(SQLException e){ - BungeeCore.log("Could not load BauweltMembers", e); - } - return new ArrayList<>(); + }, bauweltID); } public int getBauweltID() { diff --git a/src/de/steamwar/bungeecore/sql/CheckedSchematic.java b/src/de/steamwar/bungeecore/sql/CheckedSchematic.java index 0424e4a..436d5ab 100644 --- a/src/de/steamwar/bungeecore/sql/CheckedSchematic.java +++ b/src/de/steamwar/bungeecore/sql/CheckedSchematic.java @@ -27,6 +27,9 @@ import java.util.List; public class CheckedSchematic { + private static final Statement create = new Statement("INSERT INTO CheckedSchematic (SchemName, SchemOwner, Validator, StartTime, EndTime, DeclineReason) VALUES (?, ?, ?, ?, ?, ?)"); + private static final Statement previous = new Statement("SELECT * FROM CheckedSchematic WHERE SchemName = ? AND SchemOwner = ? ORDER BY EndTime ASC"); + private final String schemName; private final int schemOwner; @@ -45,20 +48,16 @@ public class CheckedSchematic { } public static void create(String schemName, int schemOwner, int validator, Timestamp startTime, Timestamp endTime, String reason){ - SQL.update("INSERT INTO CheckedSchematic (SchemName, SchemOwner, Validator, StartTime, EndTime, DeclineReason) VALUES (?, ?, ?, ?, ?, ?)", - schemName, schemOwner, validator, startTime, endTime, reason); + create.update(schemName, schemOwner, validator, startTime, endTime, reason); } public static List previousChecks(String schemName, int schemOwner){ - ResultSet rs = SQL.select("SELECT * FROM CheckedSchematic WHERE SchemName = ? AND SchemOwner = ? ORDER BY EndTime ASC", schemName, schemOwner); - List schematics = new ArrayList<>(); - try { + return previous.select(rs -> { + List schematics = new ArrayList<>(); while(rs.next()) schematics.add(new CheckedSchematic(rs)); - } catch (SQLException e) { - throw new SecurityException("Could not load previous checks", e); - } - return schematics; + return schematics; + }, schemName, schemOwner); } public int getValidator() { diff --git a/src/de/steamwar/bungeecore/sql/Elo.java b/src/de/steamwar/bungeecore/sql/Elo.java index 07a95c2..b61c8a3 100644 --- a/src/de/steamwar/bungeecore/sql/Elo.java +++ b/src/de/steamwar/bungeecore/sql/Elo.java @@ -19,33 +19,26 @@ package de.steamwar.bungeecore.sql; -import java.sql.ResultSet; -import java.sql.SQLException; - public class Elo { + + private static final Statement elo = new Statement("SELECT Elo FROM Elo WHERE UserID = ? AND GameMode = ?"); + private static final Statement place = new Statement("SELECT COUNT(*) AS Place FROM Elo WHERE GameMode = ? AND Elo > ?"); + private Elo(){} public static int getElo(int userID, String gameMode){ - ResultSet rs = SQL.select("SELECT Elo FROM Elo WHERE UserID = ? AND GameMode = ?", userID, gameMode); - int elo = 1000; - try { + return elo.select(rs -> { if(rs.next()) - elo = rs.getInt("Elo"); - } catch (SQLException e) { - throw new SecurityException("Could not get Elo", e); - } - return elo; + return rs.getInt("Elo"); + return 1000; + }, userID, gameMode); } public static int getPlacement(int elo, String gameMode){ - ResultSet rs = SQL.select("SELECT COUNT(*) AS Place FROM Elo WHERE GameMode = ? AND Elo > ?", gameMode, elo); - try{ - if(!rs.next()) - return -1; - - return rs.getInt("Place"); - }catch(SQLException e){ - throw new SecurityException("Could not get place", e); - } + return place.select(rs -> { + if(rs.next()) + return rs.getInt("Place"); + return -1; + }, gameMode, elo); } } diff --git a/src/de/steamwar/bungeecore/sql/Event.java b/src/de/steamwar/bungeecore/sql/Event.java index 72db065..93fd211 100644 --- a/src/de/steamwar/bungeecore/sql/Event.java +++ b/src/de/steamwar/bungeecore/sql/Event.java @@ -19,17 +19,20 @@ package de.steamwar.bungeecore.sql; -import de.steamwar.bungeecore.BungeeCore; - import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.time.Instant; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; public class Event { + private static final Statement byCurrent = new Statement("SELECT * FROM Event WHERE Start < now() AND End > now()"); + private static final Statement byId = new Statement("SELECT * FROM Event WHERE EventID = ?"); + private static final Statement byName = new Statement("SELECT * FROM Event WHERE lower(EventName) = ?"); + private static final Statement byComing = new Statement("SELECT * FROM Event WHERE Start > now()"); + private final int eventID; private final String eventName; private final Timestamp start; @@ -56,57 +59,39 @@ public class Event { if(current != null && current.now()) return current; - ResultSet rs = SQL.select("SELECT * FROM Event WHERE Start < now() AND End > now()"); - try{ - if(!rs.next()){ + return byCurrent.select(rs -> { + if(rs.next()) + current = new Event(rs); + else current = null; - return null; - } - - current = new Event(rs); return current; - }catch (SQLException e){ - BungeeCore.log("Failed to load current Event", e); - throw new SecurityException(); - } + }); } public static Event get(int eventID){ - ResultSet rs = SQL.select("SELECT * FROM Event WHERE EventID = " + eventID); - try{ + return byId.select(rs -> { if(!rs.next()) - throw new IllegalArgumentException(); - + throw new SQLException("Couldn't find event " + eventID); return new Event(rs); - }catch (SQLException e){ - BungeeCore.log("Failed to load Event", e); - throw new SecurityException(); - } + }, eventID); } public static Event get(String eventName){ - ResultSet rs = SQL.select("SELECT * FROM Event WHERE lower(EventName) = ?", eventName.toLowerCase()); - try{ + return byName.select(rs -> { if(!rs.next()) return null; return new Event(rs); - }catch (SQLException e){ - BungeeCore.log("Failed to load Event by name", e); - throw new SecurityException(); - } + }, eventName.toLowerCase()); } public static List getComing(){ - List events = new LinkedList<>(); - ResultSet rs = SQL.select("SELECT * FROM Event WHERE Start > now()"); - try{ + return byComing.select(rs -> { + List events = new ArrayList<>(); while(rs.next()) events.add(new Event(rs)); - }catch (SQLException e){ - BungeeCore.log("Failed to load Events", e); - } - return events; + return events; + }); } private boolean now(){ diff --git a/src/de/steamwar/bungeecore/sql/EventFight.java b/src/de/steamwar/bungeecore/sql/EventFight.java index c86b145..ffcbe6f 100644 --- a/src/de/steamwar/bungeecore/sql/EventFight.java +++ b/src/de/steamwar/bungeecore/sql/EventFight.java @@ -20,7 +20,6 @@ package de.steamwar.bungeecore.sql; import de.steamwar.bungeecore.ArenaMode; -import de.steamwar.bungeecore.BungeeCore; import java.sql.ResultSet; import java.sql.SQLException; @@ -31,7 +30,11 @@ import static java.time.temporal.ChronoUnit.SECONDS; public class EventFight implements Comparable { - private static Queue fights = new PriorityQueue<>(); + private static final Statement reschedule = new Statement("UPDATE EventFight SET StartTime = ? WHERE EventID = ? AND FightID = ?"); + private static final Statement allComing = new Statement("SELECT * FROM EventFight WHERE StartTime > now() ORDER BY `StartTime` ASC"); + private static final Statement event = new Statement("SELECT * FROM EventFight WHERE EventID = ? ORDER BY `StartTime` ASC"); + + private static final Queue fights = new PriorityQueue<>(); private final int eventID; private final int fightID; @@ -57,31 +60,26 @@ public class EventFight implements Comparable { public void reschedule(){ startTime = Timestamp.from(new Date().toInstant().plus(30, SECONDS)); - SQL.update("UPDATE EventFight SET StartTime = ? WHERE EventID = ? AND FightID = ?", startTime, eventID, fightID); + reschedule.update(startTime, eventID, fightID); } public static void loadAllComingFights(){ - ResultSet rs = SQL.select("SELECT * FROM EventFight WHERE StartTime > now() ORDER BY `StartTime` ASC"); - fights.clear(); - try{ + allComing.select(rs -> { + fights.clear(); while(rs.next()){ - fights.add(new EventFight(rs)); + fights.add(new EventFight(rs)); } - }catch (SQLException e){ - BungeeCore.log("Failed to load EventFights", e); - } + return null; + }); } public static List getEvent(int eventID){ - ResultSet rs = SQL.select("SELECT * FROM EventFight WHERE EventID = ? ORDER BY `StartTime` ASC", eventID); - List fights = new LinkedList<>(); - try{ + return event.select(rs -> { + List fights = new LinkedList<>(); while(rs.next()) fights.add(new EventFight(rs)); - }catch (SQLException e){ - BungeeCore.log("Failed to load EventFights", e); - } - return fights; + return fights; + }, eventID); } public static Queue getFights() { diff --git a/src/de/steamwar/bungeecore/sql/IgnoreSystem.java b/src/de/steamwar/bungeecore/sql/IgnoreSystem.java index 73c1500..185fb08 100644 --- a/src/de/steamwar/bungeecore/sql/IgnoreSystem.java +++ b/src/de/steamwar/bungeecore/sql/IgnoreSystem.java @@ -22,9 +22,13 @@ package de.steamwar.bungeecore.sql; import net.md_5.bungee.api.connection.ProxiedPlayer; import java.sql.ResultSet; -import java.sql.SQLException; public class IgnoreSystem{ + + private static final Statement select = new Statement("SELECT COUNT(*) AS blocked FROM IgnoredPlayers WHERE Ignorer = ? AND Ignored = ?"); + private static final Statement insert = new Statement("INSERT INTO IgnoredPlayers (Ignorer, Ignored) VALUES (?, ?)"); + private static final Statement delete = new Statement("DELETE FROM IgnoredPlayers WHERE Ignorer = ? AND Ignored = ?"); + private IgnoreSystem(){} public static boolean isIgnored(ProxiedPlayer ignorer, ProxiedPlayer ignored){ @@ -34,22 +38,14 @@ public class IgnoreSystem{ } public static boolean isIgnored(SteamwarUser ignorer, SteamwarUser ignored) { - try { - ResultSet rs = SQL.select("SELECT COUNT(*) AS blocked FROM IgnoredPlayers WHERE Ignorer = ? AND Ignored = ?", ignorer.getId(), ignored.getId()); - if(!rs.next()) - return false; - - return rs.getInt("blocked") > 0; - } catch (SQLException e) { - throw new SecurityException("Could not check if ignored", e); - } + return select.select(ResultSet::next, ignorer.getId(), ignored.getId()); } public static void ignore(SteamwarUser ignorer, SteamwarUser ignored) { - SQL.update("INSERT INTO IgnoredPlayers (Ignorer, Ignored) VALUES (?, ?)", ignorer.getId(), ignored.getId()); + insert.update(ignorer.getId(), ignored.getId()); } public static void unIgnore(SteamwarUser ignorer, SteamwarUser ignored) { - SQL.update("DELETE FROM IgnoredPlayers WHERE Ignorer = ? AND Ignored = ?", ignorer.getId(), ignored.getId()); + delete.update(ignorer.getId(), ignored.getId()); } } diff --git a/src/de/steamwar/bungeecore/sql/Mod.java b/src/de/steamwar/bungeecore/sql/Mod.java index 98034bb..9aad08b 100644 --- a/src/de/steamwar/bungeecore/sql/Mod.java +++ b/src/de/steamwar/bungeecore/sql/Mod.java @@ -19,12 +19,11 @@ package de.steamwar.bungeecore.sql; -import de.steamwar.bungeecore.BungeeCore; - -import java.sql.ResultSet; -import java.sql.SQLException; - public class Mod { + + private static final Statement get = new Statement("SELECT * FROM Mods WHERE ModName = ? AND Platform = ?"); + private static final Statement insert = new Statement("INSERT INTO Mods (ModName, Platform) VALUES (?, ?)"); + private final String modName; private final Platform platform; private final ModType modType; @@ -36,15 +35,15 @@ public class Mod { } public static Mod get(String modName, Platform platform){ - ResultSet rs = SQL.select("SELECT * FROM Mods WHERE ModName = ? AND Platform = ?", modName, platform.value); - try{ + Mod mod = get.select(rs -> { if(rs.next()) return new Mod(modName, platform, ModType.valueOf(rs.getInt("ModType"))); - }catch (SQLException e){ - BungeeCore.log("Failed to load Mod", e); - throw new SecurityException(); - } - SQL.update("INSERT INTO Mods (ModName, Platform) VALUES (?, ?)", modName, platform.value); + return null; + }, modName, platform.value); + if(mod != null) + return mod; + + insert.update(modName, platform.value); return new Mod(modName, platform, ModType.UNKLASSIFIED); } diff --git a/src/de/steamwar/bungeecore/sql/PollAnswer.java b/src/de/steamwar/bungeecore/sql/PollAnswer.java index 62fcee0..7d23c38 100644 --- a/src/de/steamwar/bungeecore/sql/PollAnswer.java +++ b/src/de/steamwar/bungeecore/sql/PollAnswer.java @@ -19,7 +19,6 @@ package de.steamwar.bungeecore.sql; -import de.steamwar.bungeecore.BungeeCore; import de.steamwar.bungeecore.listeners.PollSystem; import java.sql.ResultSet; @@ -29,6 +28,10 @@ import java.util.Map; public class PollAnswer { + private static final Statement get = new Statement("SELECT * FROM PollAnswer WHERE UserID = ? AND Question = ?"); + private static final Statement getResults = new Statement("SELECT Count(UserID) AS Times, Answer FROM PollAnswer WHERE Question = ? GROUP BY Answer ORDER BY `Times` ASC"); + private static final Statement insert = new Statement("INSERT INTO PollAnswer (UserID, Question, Answer) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE Answer = VALUES(Answer)"); + private final int userID; private final String question; private int answer; @@ -44,38 +47,20 @@ public class PollAnswer { } public static PollAnswer get(int userID){ - ResultSet rs = SQL.select("SELECT * FROM PollAnswer WHERE UserID = ? AND Question = ?", userID, PollSystem.getQuestion()); - try { - if(!rs.next()) - return new PollAnswer(userID, PollSystem.getQuestion()); - return new PollAnswer(rs); - } catch (SQLException e) { - throw new SecurityException("Unable to get PollAnswer", e); - } + return get.select(rs -> { + if(rs.next()) + return new PollAnswer(rs); + return new PollAnswer(userID, PollSystem.getQuestion()); + }, userID, PollSystem.getQuestion()); } public static Map getCurrentResults() { - ResultSet set = SQL.select("SELECT Count(UserID) AS Times, Answer FROM PollAnswer WHERE Question = ? GROUP BY Answer ORDER BY `Times` ASC", PollSystem.getQuestion()); - try { + return getResults.select(rs -> { Map retMap = new HashMap<>(); - while (set.next()) { - retMap.put(PollSystem.getAnswer(set.getInt("Answer")), set.getInt("Times")); - } + while (rs.next()) + retMap.put(PollSystem.getAnswer(rs.getInt("Answer")), rs.getInt("Times")); return retMap; - }catch (SQLException e) { - throw new SecurityException("Unable to get PollAnswer", e); - } - } - - public static Integer getAllAnswered() { - ResultSet set = SQL.select("SELECT Count(UserID) AS Times FROM PollAnswer WHERE Question = ?", PollSystem.getQuestion()); - try { - if(!set.next()) - throw new SecurityException("Could not get PollAnswers"); - return set.getInt("Times"); - }catch (SQLException e) { - throw new SecurityException("Unable to get PollAnswer", e); - } + }, PollSystem.getQuestion()); } public boolean hasAnswered(){ @@ -84,6 +69,6 @@ public class PollAnswer { public void setAnswer(int answer){ this.answer = answer; - SQL.update("INSERT INTO PollAnswer (UserID, Question, Answer) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE Answer = VALUES(Answer)", userID, question, answer); + insert.update(userID, question, answer); } } diff --git a/src/de/steamwar/bungeecore/sql/Punishment.java b/src/de/steamwar/bungeecore/sql/Punishment.java index e4d9034..914e6b8 100644 --- a/src/de/steamwar/bungeecore/sql/Punishment.java +++ b/src/de/steamwar/bungeecore/sql/Punishment.java @@ -31,45 +31,40 @@ import java.util.*; public class Punishment { + private static final Statement getPunishment = new Statement("SELECT * FROM Punishments WHERE UserId = ? AND Type = ? ORDER BY PunishmentId DESC LIMIT 1"); + private static final Statement getPunishments = new Statement("SELECT * FROM Punishments WHERE PunishmentId IN (SELECT MAX(PunishmentId) FROM Punishments WHERE UserId = ? GROUP BY Type)"); + private static final Statement getAllPunishments = new Statement("SELECT * FROM Punishments WHERE UserId = ? ORDER BY `PunishmentId` DESC"); + private static final Statement insert = new Statement("INSERT INTO Punishments (UserId, Punisher, Type, Reason, EndTime, Perma) VALUES (?, ?, ?, ?, ?, ?)"); + private static final Statement update = new Statement("UPDATE Punishments SET EndTime = ?, Reason = ?, Perma = ? WHERE PunishmentId = ?"); + public static Punishment getPunishmentOfPlayer(int user, PunishmentType type) { - ResultSet set = SQL.select("SELECT * FROM Punishments WHERE UserId = ? AND Type = ? ORDER BY PunishmentId DESC LIMIT 1", user, type.name()); - try { - if(!set.next()) - return null; - return new Punishment(set); - } catch (SQLException e) { - throw new SecurityException("Could not Load Punishments", e); - } + return getPunishment.select(rs -> { + if(rs.next()) + return new Punishment(rs); + return null; + }, user, type.name()); } public static Map getPunishmentsOfPlayer(int user) { - ResultSet set = SQL.select("SELECT * FROM Punishments WHERE PunishmentId IN (SELECT MAX(PunishmentId) FROM Punishments WHERE UserId = ? GROUP BY Type)", user); - try { + return getPunishments.select(rs -> { Map punishments = new HashMap<>(); - while (set.next()) - punishments.put(PunishmentType.valueOf(set.getString("Type")), new Punishment(set)); + while (rs.next()) + punishments.put(PunishmentType.valueOf(rs.getString("Type")), new Punishment(rs)); return punishments; - } catch (SQLException e) { - throw new SecurityException("Could not Load Punishments", e); - } + }, user); } public static List getAllPunishmentsOfPlayer(int user) { - ResultSet set = SQL.select("SELECT * FROM Punishments WHERE UserId = ? ORDER BY `PunishmentId` DESC", user); - try { + return getAllPunishments.select(rs -> { List punishments = new ArrayList<>(); - while (set.next()) { - punishments.add(new Punishment(set)); - } + while (rs.next()) + punishments.add(new Punishment(rs)); return punishments; - } catch (SQLException e) { - throw new SecurityException("Could not Load all Punishments", e); - } + }, user); } public static Punishment createPunishment(int user, int executor, PunishmentType type, String reason, Timestamp endTime, boolean perma) { - SQL.update("INSERT INTO Punishments (UserId, Punisher, Type, Reason, EndTime, Perma) VALUES (?, ?, ?, ?, ?, ?)", - user, executor, type.name(), reason, endTime, perma); + insert.update(user, executor, type.name(), reason, endTime, perma); return getPunishmentOfPlayer(user, type); } @@ -122,7 +117,7 @@ public class Punishment { } public void updateEndTime(int from, String newreason, Timestamp newUpdate, boolean perma) { - if(newreason.equals(reason) && newUpdate.equals(endTime) && perma == perma) + if(newreason.equals(reason) && newUpdate.equals(endTime) && this.perma == perma) return; ProxiedPlayer player = BungeeCore.get().getProxy().getPlayer(SteamwarUser.get(from).getUuid()); String newReason = Message.parse("BAN_CHANGED", player, reason, @@ -131,7 +126,7 @@ public class Punishment { getBantime(newUpdate, perma), newreason); - SQL.update("UPDATE Punishments SET EndTime = ?, Reason = ?, Perma = ? WHERE PunishmentId = ?", newUpdate, newReason, perma, id); + update.update(newUpdate, newReason, perma, id); this.reason = newReason; this.perma = perma; this.endTime = newUpdate; diff --git a/src/de/steamwar/bungeecore/sql/SQL.java b/src/de/steamwar/bungeecore/sql/SQL.java deleted file mode 100644 index 947e2b6..0000000 --- a/src/de/steamwar/bungeecore/sql/SQL.java +++ /dev/null @@ -1,95 +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 java.sql.*; - - -public class SQL { - private SQL(){} - - private static Connection con; - private static String url; - private static String user; - private static String password; - - public static void connect(String url, String user, String password) { - SQL.url = url; - SQL.user = user; - SQL.password = password; - try { - con = DriverManager.getConnection(url + "?autoreconnect=true", user, password); - }catch (SQLException e) { - ProxyServer.getInstance().stop(); - throw new SecurityException("Could not start SQL-Exception", e); - } - } - - public static void close() { - try { - if(con != null) - con.close(); - }catch (SQLException e) { - BungeeCore.log("Could not close SQL-Connection", e); - } - } - - static void update(String qry, Object... objects) { - try { - prepare(con, qry, objects).executeUpdate(); - } catch (SQLException e) { - sqlException(); - try (PreparedStatement st = con.prepareStatement(qry)) { - st.executeUpdate(); - } catch (SQLException ex) { - throw new SecurityException("Could not execute update statement", ex); - } - } - } - - static ResultSet select(String qry, Object... objects){ - try{ - return prepare(con, qry, objects).executeQuery(); - } catch (SQLException e) { - sqlException(); - try { - return prepare(con, qry, objects).executeQuery(); - } catch (SQLException ex) { - throw new SecurityException("Could not run Select-Statement", ex); - } - } - } - - private static PreparedStatement prepare(Connection connection, String qry, Object... objects) throws SQLException{ - PreparedStatement st = connection.prepareStatement(qry); - for(int i = 0; i < objects.length; i++){ - st.setObject(i+1, objects[i]); - } - return st; - } - - private static void sqlException(){ - close(); - connect(url, user, password); - } -} diff --git a/src/de/steamwar/bungeecore/sql/SWException.java b/src/de/steamwar/bungeecore/sql/SWException.java index 44a43ca..8a2c2e1 100644 --- a/src/de/steamwar/bungeecore/sql/SWException.java +++ b/src/de/steamwar/bungeecore/sql/SWException.java @@ -22,7 +22,9 @@ package de.steamwar.bungeecore.sql; public class SWException { private SWException(){} + private static final Statement insert = new Statement("INSERT INTO Exception (server, message, stacktrace) VALUES (?, ?, ?)"); + public static void log(String server, String message, String stacktrace){ - SQL.update("INSERT INTO Exception (server, message, stacktrace) VALUES (?, ?, ?)", server, message, stacktrace); + insert.update(server, message, stacktrace); } } diff --git a/src/de/steamwar/bungeecore/sql/Schematic.java b/src/de/steamwar/bungeecore/sql/Schematic.java index 9d25a38..b715510 100644 --- a/src/de/steamwar/bungeecore/sql/Schematic.java +++ b/src/de/steamwar/bungeecore/sql/Schematic.java @@ -23,14 +23,22 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import java.util.UUID; public class Schematic { + + private static final Statement schemByName = new Statement("SELECT SchemID, SchemName, SchemOwner, SchemType, Item FROM Schematic WHERE SchemName = ? AND SchemOwner = ?"); + private static final Statement schemById = new Statement("SELECT SchemID, SchemName, SchemOwner, SchemType, Item FROM Schematic WHERE SchemID = ?"); + private static final Statement schemsByType = new Statement("SELECT SchemID, SchemName, SchemOwner, SchemType, Item FROM Schematic WHERE SchemType = ?"); + private static final Statement schemsByUserType = new Statement("SELECT SchemID, SchemName, SchemOwner, SchemType, Item FROM Schematic WHERE SchemType = ? AND SchemOwner = ?"); + private static final Statement schemsOfUser = new Statement("SELECT SchemID, SchemName, SchemOwner, Item, SchemType, Rank, SchemFormat, Item FROM Schematic WHERE SchemOwner = ? ORDER BY SchemName"); + private static final Statement updateType = new Statement("UPDATE Schematic SET SchemType = ? WHERE SchemID = ?"); + private static final Statement updateRank = new Statement("UPDATE Schematic SET Rank = ? WHERE SchemID = ?"); + private final int schemID; private final String schemName; private final int schemOwner; private SchematicType schemType; - private String schemItem; + private final String schemItem; private Schematic(ResultSet rs) throws SQLException { this.schemID = rs.getInt("SchemID"); @@ -40,74 +48,52 @@ public class Schematic { this.schemItem = rs.getString("Item"); } - public static Schematic getSchemFromDB(String schemName, UUID schemOwner){ - return getSchemFromDB(schemName, SteamwarUser.get(schemOwner).getId()); - } - public static Schematic getSchemFromDB(String schemName, int schemOwner){ - ResultSet schematic = SQL.select("SELECT SchemID, SchemName, SchemOwner, SchemType, Item FROM Schematic WHERE SchemName = ? AND SchemOwner = ?", schemName, schemOwner); - try { - if(schematic == null || !schematic.next()){ - return null; - } - return new Schematic(schematic); - } catch (SQLException e) { - throw new SecurityException("Failed loading schematic", e); - } + return schemByName.select(rs -> { + if(!rs.next()) + return new Schematic(rs); + return null; + }, schemName, schemOwner); } public static Schematic getSchemFromDB(int schemID){ - ResultSet schematic = SQL.select("SELECT SchemID, SchemName, SchemOwner, SchemType, Item FROM Schematic WHERE SchemID = ?", schemID); - try { - if(!schematic.next()) + return schemById.select(rs -> { + if(!rs.next()) throw new SecurityException("Failed loading schematic " + schemID); - return new Schematic(schematic); - } catch (SQLException e) { - throw new SecurityException("Failed loading schematic", e); - } + return new Schematic(rs); + }, schemID); } public static List getAllSchemsOfType(SchematicType schemType){ - try{ - ResultSet schematic = SQL.select("SELECT SchemID, SchemName, SchemOwner, SchemType, Item FROM Schematic WHERE SchemType = ?", schemType.toDB()); + return schemsByType.select(rs -> { List schematics = new ArrayList<>(); - while(schematic.next()){ - schematics.add(new Schematic(schematic)); - } + while(rs.next()) + schematics.add(new Schematic(rs)); return schematics; - }catch(SQLException e){ - throw new SecurityException("Failed loading all schems of type", e); - } + }, schemType.toDB()); } public static List getSchemsOfType(int userId, SchematicType schemType){ - try{ - ResultSet schematic = SQL.select("SELECT SchemID, SchemName, SchemOwner, SchemType, Item FROM Schematic WHERE SchemType = ? AND SchemOwner = ?", schemType.toDB(), userId); + return schemsByUserType.select(rs -> { List schematics = new ArrayList<>(); - while(schematic.next()){ - schematics.add(new Schematic(schematic)); - } + while(rs.next()) + schematics.add(new Schematic(rs)); return schematics; - }catch(SQLException e){ - throw new SecurityException("Failed loading schems of type", e); - } + }, schemType.toDB(), userId); } public static List getSchemsAccessibleByUser(int schemOwner){ - try{ - ResultSet schematic = SQL.select("SELECT SchemID, SchemName, SchemOwner, Item, SchemType, Rank, SchemFormat, Item FROM Schematic WHERE SchemOwner = ? ORDER BY SchemName", schemOwner); + return schemsOfUser.select(rs -> { List schematics = new ArrayList<>(); - while(schematic.next()){ - schematics.add(new Schematic(schematic)); + while(rs.next()){ + schematics.add(new Schematic(rs)); } List addedSchems = SchematicMember.getAccessibleSchems(schemOwner); for(SchematicMember schem : addedSchems){ schematics.add(getSchemFromDB(schem.getSchemName(), schem.getSchemOwner())); } return schematics; - }catch(SQLException e){ - throw new SecurityException("Failed listing schematics", e); - } + }, schemOwner); } public int getSchemID() { @@ -132,10 +118,10 @@ public class Schematic { public void setSchemType(SchematicType schemType) { this.schemType = schemType; - SQL.update("UPDATE Schematic SET SchemType = ? WHERE SchemID = ?", schemType.toDB(), schemID); + updateType.update(schemType.toDB(), schemID); } public void setRank(int rank) { - SQL.update("UPDATE Schematic SET Rank = ? WHERE SchemID = ?", rank, schemID); + updateRank.update(rank, schemID); } } diff --git a/src/de/steamwar/bungeecore/sql/SchematicMember.java b/src/de/steamwar/bungeecore/sql/SchematicMember.java index 85b8485..c4ac21a 100644 --- a/src/de/steamwar/bungeecore/sql/SchematicMember.java +++ b/src/de/steamwar/bungeecore/sql/SchematicMember.java @@ -19,13 +19,15 @@ package de.steamwar.bungeecore.sql; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import java.util.UUID; public class SchematicMember { + + private static final Statement insert = new Statement("INSERT INTO SchemMember (SchemName, SchemOwner, Member) VALUES (?, ?, ?)"); + private static final Statement selectSchems = new Statement("SELECT * FROM SchemMember WHERE Member = ?"); + private static final Statement delete = new Statement("DELETE FROM SchemMember WHERE SchemOwner = ? AND SchemName = ? AND Member = ?"); + private final int schemOwner; private final String schemName; private final int member; @@ -38,82 +40,17 @@ public class SchematicMember { updateDB(); } - public SchematicMember(String schemName, int schemOwner, int schemMember){ - this(schemName, schemOwner, schemMember, true); - } - - public SchematicMember(String schemName, UUID schemOwner, UUID schemMember){ - this(schemName, SteamwarUser.get(schemOwner).getId(), SteamwarUser.get(schemMember).getId(), true); - } - private void updateDB(){ - SQL.update("INSERT INTO SchemMember (SchemName, SchemOwner, Member) VALUES (?, ?, ?)", schemName, schemOwner, member); - } - - public static SchematicMember getSchemMemberFromDB(String schemName, UUID schemOwner, UUID schemMember){ - return getSchemMemberFromDB(schemName, SteamwarUser.get(schemOwner).getId(), SteamwarUser.get(schemMember).getId()); - } - - public static SchematicMember getSchemMemberFromDB(String schemName, int schemOwner, int schemMember){ - ResultSet schematicMember = SQL.select("SELECT * FROM SchemMember WHERE SchemName = ? AND SchemOwner = ? AND Member = ?", schemName, schemOwner, schemMember); - try { - if(schematicMember == null || !schematicMember.next()){ - return null; - } - return new SchematicMember(schemName, schemOwner, schemMember, false); - } catch (SQLException e) { - throw new SecurityException("Could not get schemmember", e); - } - } - - public static SchematicMember getMemberBySchematic(String schemName, int schemMember){ - ResultSet schematicMember = SQL.select("SELECT * FROM SchemMember WHERE SchemName = ? AND Member = ?", schemName, schemMember); - try { - if(schematicMember == null || !schematicMember.next()){ - return null; - } - int schemOwner = schematicMember.getInt("SchemOwner"); - return new SchematicMember(schemName, schemOwner, schemMember, false); - } catch (SQLException e) { - throw new SecurityException("Could not get member", e); - } - } - - public static List getSchemMembers(String schemName, UUID schemOwner){ - return getSchemMembers(schemName, SteamwarUser.get(schemOwner).getId()); - } - - public static List getSchemMembers(String schemName, int schemOwner){ - ResultSet schematicMember = SQL.select("SELECT * FROM SchemMember WHERE SchemName = ? AND SchemOwner = ?", schemName, schemOwner); - try { - List schematicMembers = new ArrayList<>(); - while(schematicMember.next()){ - int schemMember = schematicMember.getInt("Member"); - schematicMembers.add(new SchematicMember(schemName, schemOwner, schemMember, false)); - } - return schematicMembers; - } catch (SQLException e) { - throw new SecurityException("Could not get schemmembers", e); - } - } - - public static List getAccessibleSchems(UUID schemMember){ - return getAccessibleSchems(SteamwarUser.get(schemMember).getId()); + insert.update(schemName, schemOwner, member); } public static List getAccessibleSchems(int schemMember){ - ResultSet schematicMember = SQL.select("SELECT * FROM SchemMember WHERE Member = ?", schemMember); - try { + return selectSchems.select(rs -> { List schematicMembers = new ArrayList<>(); - while(schematicMember.next()){ - String schemName = schematicMember.getString("SchemName"); - int schemOwner = schematicMember.getInt("SchemOwner"); - schematicMembers.add(new SchematicMember(schemName, schemOwner, schemMember, false)); - } + while(rs.next()) + schematicMembers.add(new SchematicMember(rs.getString("SchemName"), rs.getInt("SchemOwner"), schemMember, false)); return schematicMembers; - } catch (SQLException e) { - throw new SecurityException("Could not get accessible schems", e); - } + }, schemMember); } public int getSchemOwner() { @@ -129,6 +66,6 @@ public class SchematicMember { } public void remove(){ - SQL.update("DELETE FROM SchemMember WHERE SchemOwner = ? AND SchemName = ? AND Member = ?", schemOwner, schemName, member); + delete.update(schemOwner, schemName, member); } } diff --git a/src/de/steamwar/bungeecore/sql/Session.java b/src/de/steamwar/bungeecore/sql/Session.java index 7f48659..9793c35 100644 --- a/src/de/steamwar/bungeecore/sql/Session.java +++ b/src/de/steamwar/bungeecore/sql/Session.java @@ -22,9 +22,12 @@ package de.steamwar.bungeecore.sql; import java.sql.Timestamp; public class Session { + + private static final Statement insert = new Statement("INSERT INTO Session (UserID, StartTime, EndTime) VALUES (?, ?, NOW())"); + private Session(){} public static void insertSession(int userID, Timestamp startTime){ - SQL.update("INSERT INTO Session (UserID, StartTime, EndTime) VALUES (?, ?, NOW())", userID, startTime); + insert.update(userID, startTime); } } diff --git a/src/de/steamwar/bungeecore/sql/Statement.java b/src/de/steamwar/bungeecore/sql/Statement.java new file mode 100644 index 0000000..eac7650 --- /dev/null +++ b/src/de/steamwar/bungeecore/sql/Statement.java @@ -0,0 +1,137 @@ +/* + 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 java.sql.*; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; + +public class Statement { + private static final List statements = new ArrayList<>(); + + private static Connection con; + private static String url; + private static String user; + private static String password; + + public static void connect(String url, String user, String password) { + Statement.url = url; + Statement.user = user; + Statement.password = password; + try { + con = DriverManager.getConnection(url + "?autoreconnect=true", user, password); + } catch (SQLException e) { + ProxyServer.getInstance().stop(); + throw new SecurityException("Could not start SQL-Connection", e); + } + } + + private static void reset(SQLException e) { + BungeeCore.get().getLogger().log(Level.WARNING, "SQL Exception thrown", e); + close(); + connect(url, user, password); + try { + for (Statement statement : statements) { + statement.init(); + } + } catch (SQLException ex) { + throw new SecurityException("Could not reprepare SQL Statements", ex); + } + } + + public static void close() { + for (Statement statement : statements) { + try { + statement.st.close(); + } catch (SQLException e) { + BungeeCore.get().getLogger().log(Level.INFO, "Could not close statement", e); + } + } + + try { + con.close(); + } catch (SQLException e) { + BungeeCore.log("Could not close SQL-Connection", e); + } + } + + private final String sql; + private PreparedStatement st; + + Statement(String sql) { + this.sql = sql; + statements.add(this); + try { + init(); + } catch (SQLException e) { + reset(e); + } + } + + private synchronized void init() throws SQLException { + st = con.prepareStatement(sql); + } + + T select(ResultSetUser user, Object... objects) { + return prepare(() -> { + ResultSet rs = st.executeQuery(); + T result = user.use(rs); + rs.close(); + return result; + }, objects); + } + + void update(Object... objects) { + prepare(st::executeUpdate, objects); + } + + private synchronized T prepare(SQLRunnable runnable, Object... objects) { + try { + setObjects(objects); + return runnable.run(); + } catch (SQLException e) { + reset(e); + try { + setObjects(objects); + return runnable.run(); + } catch (SQLException ex) { + throw new SecurityException("Could not execute SQL statement", ex); + } + } + } + + private void setObjects(Object... objects) throws SQLException { + for (int i = 0; i < objects.length; i++) { + st.setObject(i + 1, objects[i]); + } + } + + interface ResultSetUser { + T use(ResultSet rs) throws SQLException; + } + + private interface SQLRunnable { + T run() throws SQLException; + } +} diff --git a/src/de/steamwar/bungeecore/sql/SteamwarUser.java b/src/de/steamwar/bungeecore/sql/SteamwarUser.java index 00fd221..0956d67 100644 --- a/src/de/steamwar/bungeecore/sql/SteamwarUser.java +++ b/src/de/steamwar/bungeecore/sql/SteamwarUser.java @@ -24,16 +24,14 @@ import de.steamwar.bungeecore.BungeeCore; import de.steamwar.bungeecore.Message; import de.steamwar.bungeecore.commands.WebregisterCommand; import de.steamwar.bungeecore.listeners.ConnectionListener; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Scanner; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.PendingConnection; import net.md_5.bungee.api.connection.ProxiedPlayer; +import java.io.IOException; import java.net.InetAddress; +import java.net.URL; import java.net.UnknownHostException; import java.sql.ResultSet; import java.sql.SQLException; @@ -41,18 +39,26 @@ import java.sql.Timestamp; import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.Map; +import java.util.Scanner; import java.util.UUID; +import java.util.logging.Level; public class SteamwarUser { - private final int id; - private final UUID uuid; - private String userName; - private UserGroup userGroup; - private int team; - private boolean leader; - private Map punishments; - private String discordId; + + private static final Statement updateName = new Statement("UPDATE UserData SET UserName = ? WHERE id = ?"); + private static final Statement updateBedrock = new Statement("UPDATE UserData SET Bedrock = ? WHERE id = ?"); + private static final Statement insert = new Statement("INSERT INTO UserData (UUID, UserName, UserGroup) VALUES (?, ?, 'Member')"); + private static final Statement byUUID = new Statement("SELECT * FROM UserData WHERE UUID = ?"); + private static final Statement byName = new Statement("SELECT * FROM UserData WHERE lower(UserName) = ?"); + private static final Statement byID = new Statement("SELECT * FROM UserData WHERE id = ?"); + private static final Statement byDiscord = new Statement("SELECT * FROM UserData WHERE DiscordId = ?"); + private static final Statement updateTeam = new Statement("Update UserData SET Team = ? WHERE id = ?"); + private static final Statement updateDiscord = new Statement("Update UserData SET DiscordId = ? WHERE id = ?"); + private static final Statement deleteIPs = new Statement("DELETE FROM BannedUserIPs WHERE UserID = ?"); + private static final Statement updateLeader = new Statement("Update UserData SET Leader = ? WHERE id = ?"); + private static final Statement getPlaytime = new Statement("SELECT SUM(UNIX_TIMESTAMP(EndTime) - UNIX_TIMESTAMP(StartTime)) as Playtime FROM Session WHERE UserID = ?"); + private static final Statement getFirstjoin = new Statement("SELECT MIN(StartTime) AS FirstJoin FROM Session WHERE UserID = ?"); private static final Map usersByName = new HashMap<>(); private static final Map usersByUUID = new HashMap<>(); @@ -62,6 +68,15 @@ public class SteamwarUser { private static final String API_URL = "https://api.mojang.com/users/profiles/minecraft/"; private static final JsonParser jsonParser = new JsonParser(); + private final int id; + private final UUID uuid; + private String userName; + private final UserGroup userGroup; + private int team; + private boolean leader; + private final Map punishments; + private String discordId; + static { try { LIXFEL_DE = InetAddress.getByAddress(new byte[]{(byte) 195, (byte) 201, (byte) 242, 43}); @@ -93,7 +108,7 @@ public class SteamwarUser { if(user != null){ String userName = connection.getName(); if(!user.userName.equals(userName)){ - SQL.update("UPDATE UserData SET UserName = ? WHERE id = ?", userName, user.id); + updateName.update(userName, user.id); WebregisterCommand.changeUsername(user.userName, userName); user.userName = userName; } @@ -105,7 +120,7 @@ public class SteamwarUser { } boolean bedrock = connection.getAddress().getAddress().equals(LIXFEL_DE); - SQL.update("UPDATE UserData SET Bedrock = ? WHERE id = ?", bedrock, user.id); + updateBedrock.update(bedrock, user.id); return user; } @@ -115,7 +130,7 @@ public class SteamwarUser { return user; } - UUID uuid = SteamwarUser.loadUUID(name); + UUID uuid = SteamwarUser.getUUIDofOfflinePlayer(name); if (uuid == null) { return null; } @@ -124,21 +139,28 @@ public class SteamwarUser { } private static SteamwarUser createUserInDatabase(UUID uuid, String name) { - SQL.update("INSERT INTO UserData (UUID, UserName, UserGroup) VALUES (?, ?, 'Member')", uuid.toString(), name); - return dbInit(SQL.select("SELECT * FROM UserData WHERE UUID = ?", uuid.toString())); + insert.update(uuid.toString(), name); + return get(uuid); } public static SteamwarUser get(String userName){ userName = userName.toLowerCase(); if(usersByName.containsKey(userName)) return usersByName.get(userName); - return dbInit(SQL.select("SELECT * FROM UserData WHERE lower(UserName) = ?", userName)); + return byName.select(rs -> { + if(rs.next()) + return new SteamwarUser(rs); + return null; + }, userName); } public static SteamwarUser get(UUID uuid){ if(usersByUUID.containsKey(uuid)) return usersByUUID.get(uuid); - return dbInit(SQL.select("SELECT * FROM UserData WHERE UUID = ?", uuid.toString())); + return byUUID.select(rs -> { + rs.next(); + return new SteamwarUser(rs); + }, uuid.toString()); } public static SteamwarUser get(ProxiedPlayer player){ @@ -148,13 +170,20 @@ public class SteamwarUser { public static SteamwarUser get(int id){ if(usersById.containsKey(id)) return usersById.get(id); - return dbInit(SQL.select("SELECT * FROM UserData WHERE id = ?", id)); + return byID.select(rs -> { + rs.next(); + return new SteamwarUser(rs); + }, id); } public static SteamwarUser get(Long discordId) { if(usersByDiscord.containsKey(discordId.toString())) return usersByDiscord.get(discordId.toString()); - return dbInit(SQL.select("SELECT * FROM UserData WHERE DiscordId = ?", discordId)); + return byDiscord.select(rs -> { + if(rs.next()) + return new SteamwarUser(rs); + return null; + }, discordId); } public static void clearCache(){ @@ -164,25 +193,20 @@ public class SteamwarUser { usersByDiscord.clear(); } - public static UUID loadUUID(String playerName) { + private static UUID getUUIDofOfflinePlayer(String playerName) { try { final URL url = new URL(API_URL + playerName); - return getUniqueIdFromString(jsonParser.parse(new Scanner(url.openConnection().getInputStream()).nextLine()).getAsJsonObject().get("id").getAsString()); - } catch (MalformedURLException e) { - e.printStackTrace(); + String uuid = jsonParser.parse(new Scanner(url.openConnection().getInputStream()).nextLine()).getAsJsonObject().get("id").getAsString(); + return UUID.fromString(uuid.replaceFirst("(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})", "$1-$2-$3-$4-$5")); } catch (IOException e) { - e.printStackTrace(); + BungeeCore.get().getLogger().log(Level.SEVERE, "Could not get offline player UUID", e); + return null; } - return null; - } - - private static UUID getUniqueIdFromString(String uuid) { - return UUID.fromString(uuid.replaceFirst("(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})", "$1-$2-$3-$4-$5")); } public void setTeam(int team){ this.team = team; - SQL.update("Update UserData SET Team = ? WHERE id = ?", team, id); + updateTeam.update(team, id); setLeader(false); } @@ -217,7 +241,7 @@ public class SteamwarUser { public void setDiscordId(String discordId) { usersByDiscord.remove(this.discordId); this.discordId = discordId; - SQL.update("Update UserData SET DiscordId = ? WHERE id = ?", discordId, id); + updateDiscord.update(discordId, id); if(discordId != null) { usersByDiscord.put(discordId, this); } @@ -227,7 +251,7 @@ public class SteamwarUser { if(!punishments.containsKey(Punishment.PunishmentType.Ban)) return false; if(!punishments.get(Punishment.PunishmentType.Ban).isCurrent()) { - SQL.update("DELETE FROM BannedUserIPs WHERE UserID = ?", id); + deleteIPs.update(id); punishments.remove(Punishment.PunishmentType.Ban); return false; } @@ -298,38 +322,20 @@ public class SteamwarUser { punishments.put(Punishment.PunishmentType.Mute, Punishment.createPunishment(id, from, Punishment.PunishmentType.Mute, muteReason, time, perma)); } - private static SteamwarUser dbInit(ResultSet rs){ - try { - if(!rs.next()) - return null; - return new SteamwarUser(rs); - } catch (SQLException e) { - throw new SecurityException(e); - } - } - public double getOnlinetime() { - ResultSet set = SQL.select("SELECT SUM(UNIX_TIMESTAMP(EndTime) - UNIX_TIMESTAMP(StartTime)) as Playtime FROM Session WHERE UserID = ?", id); - try { - if(!set.next()) - return 0; - return set.getBigDecimal("Playtime").doubleValue(); - } catch (SQLException throwables) { - throw new SecurityException("Could not load Online Time", throwables); - } catch (NullPointerException e) { //When no Sessions are recorded - return 0; - } + return getPlaytime.select(rs -> { + if(rs.next()) + return rs.getBigDecimal("Playtime").doubleValue(); + return 0.0; + }, id); } public Timestamp getFirstjoin() { - ResultSet set = SQL.select("SELECT MIN(StartTime) AS FirstJoin FROM Session WHERE UserID = ?", id); - try { - if(!set.next()) - return null; - return set.getTimestamp("FirstJoin"); - } catch (SQLException throwables) { - throw new SecurityException("Could not load First Join"); - } + return getFirstjoin.select(rs -> { + if(rs.next()) + return rs.getTimestamp("FirstJoin"); + return null; + }, id); } public boolean isLeader() { @@ -338,6 +344,6 @@ public class SteamwarUser { public void setLeader(boolean leader) { this.leader = leader; - SQL.update("Update UserData SET Leader = ? WHERE id = ?", leader, id); + updateLeader.update(leader, id); } } diff --git a/src/de/steamwar/bungeecore/sql/Team.java b/src/de/steamwar/bungeecore/sql/Team.java index b5c083b..f721fa5 100644 --- a/src/de/steamwar/bungeecore/sql/Team.java +++ b/src/de/steamwar/bungeecore/sql/Team.java @@ -19,25 +19,31 @@ package de.steamwar.bungeecore.sql; -import de.steamwar.bungeecore.BungeeCore; - import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; -import static de.steamwar.bungeecore.sql.SQL.select; - public class Team { + + private static final Statement insert = new Statement("INSERT INTO Team (TeamKuerzel, TeamName) VALUES (?, ?)"); + private static final Statement delete = new Statement("UPDATE Team SET TeamDeleted = 1 WHERE TeamID = ?"); + private static final Statement update = new Statement("INSERT INTO Team (TeamID, TeamKuerzel, TeamName, TeamColor) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE TeamName = VALUES(TeamName), TeamKuerzel = VALUES(TeamKuerzel), TeamColor = VALUES(TeamColor)"); + private static final Statement getSize = new Statement("SELECT COUNT(id) FROM UserData WHERE Team = ?"); + private static final Statement getMembers = new Statement("SELECT id FROM UserData WHERE Team = ?"); + private static final Statement byId = new Statement("SELECT * FROM Team WHERE TeamID = ?"); + private static final Statement byName = new Statement("SELECT * FROM Team WHERE (lower(TeamName) = ? OR lower(TeamKuerzel) = ?) AND NOT TeamDeleted"); + private static final Statement all = new Statement("SELECT * FROM Team WHERE NOT TeamDeleted"); + + private static final List teamCache = new LinkedList<>(); + private static final Team pub = new Team(0, "PUB", "Öffentlich", "8"); + private final int teamId; private String teamKuerzel; private String teamName; private String teamColor; - private static final List teamCache = new LinkedList<>(); - private static final Team pub = new Team(0, "PUB", "Öffentlich", "8"); - private Team(int id, String kuerzel, String name, String color){ teamId = id; teamKuerzel = kuerzel; @@ -52,8 +58,8 @@ public class Team { this(rs.getInt("TeamID"), rs.getString("TeamKuerzel"), rs.getString("TeamName"), rs.getString("TeamColor")); } - public static void create(String kuerzel, String name, SteamwarUser user){ - SQL.update("INSERT INTO Team (TeamKuerzel, TeamName) VALUES (?, ?)", kuerzel, name); + public static void create(String kuerzel, String name){ + insert.update(kuerzel, name); } public static Team get(int id){ @@ -64,51 +70,38 @@ public class Team { for(Team team : teamCache) if(team.teamId == id) return team; - return load(select("SELECT * FROM Team WHERE TeamID = ?", id)); + return byId.select(rs -> { + rs.next(); + return new Team(rs); + }, id); } public static Team get(String name){ for(Team team : teamCache) - if(team.teamName.equalsIgnoreCase(name)) + if(team.teamName.equalsIgnoreCase(name) || team.teamKuerzel.equalsIgnoreCase(name)) return team; - for(Team team : teamCache) - if(team.teamKuerzel.equalsIgnoreCase(name)) - return team; - return load(select("SELECT * FROM Team WHERE (lower(TeamName) = ? OR lower(TeamKuerzel) = ?) AND NOT TeamDeleted", name.toLowerCase(), name.toLowerCase())); + return byName.select(rs -> { + if(rs.next()) + return new Team(rs); + return null; + }, name.toLowerCase(), name.toLowerCase()); } public static List getAll(){ clearCache(); - try{ - ResultSet rs = select("SELECT * FROM Team WHERE NOT TeamDeleted"); - if(rs == null) - return teamCache; - + return all.select(rs -> { while(rs.next()) new Team(rs); - } catch (SQLException e) { - BungeeCore.log("Could not get all Teams", e); - } - return teamCache; + return teamCache; + }); } public static void clearCache(){ teamCache.clear(); } - private static Team load(ResultSet dbteam){ - try { - if(!dbteam.next()) - return null; - return new Team(dbteam); - } catch (SQLException e) { - BungeeCore.log("Could not load Team", e); - return null; - } - } - private void updateDB(){ - SQL.update("INSERT INTO Team (TeamID, TeamKuerzel, TeamName, TeamColor) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE TeamName = VALUES(TeamName), TeamKuerzel = VALUES(TeamKuerzel), TeamColor = VALUES(TeamColor)", teamId, teamKuerzel, teamName, teamColor); + update.update(teamId, teamKuerzel, teamName, teamColor); } public int getTeamId() { @@ -143,33 +136,24 @@ public class Team { } public int size(){ - ResultSet rs = select("SELECT COUNT(id) FROM UserData WHERE Team = ?", teamId); - try { + return getSize.select(rs -> { rs.next(); return rs.getInt("COUNT(id)"); - }catch (SQLException e) { - BungeeCore.log("Could not get Teamsize", e); - return 1000; - } + }, teamId); } public void disband(SteamwarUser user){ user.setLeader(false); - SQL.update("UPDATE Team SET TeamDeleted = 1 WHERE TeamID = ?", teamId); + delete.update(teamId); teamCache.remove(this); } public List getMembers(){ - try{ - ResultSet memberlist = select("SELECT id FROM UserData WHERE Team = ?", teamId); + return getMembers.select(rs -> { List members = new ArrayList<>(); - while(memberlist.next()){ - members.add(memberlist.getInt("id")); - } + while(rs.next()) + members.add(rs.getInt("id")); return members; - }catch(SQLException e){ - BungeeCore.log("Could not get Teammembers", e); - } - return new ArrayList<>(); + }, teamId); } } diff --git a/src/de/steamwar/bungeecore/sql/TeamTeilnahme.java b/src/de/steamwar/bungeecore/sql/TeamTeilnahme.java index 2da396b..68b1192 100644 --- a/src/de/steamwar/bungeecore/sql/TeamTeilnahme.java +++ b/src/de/steamwar/bungeecore/sql/TeamTeilnahme.java @@ -19,55 +19,46 @@ package de.steamwar.bungeecore.sql; -import de.steamwar.bungeecore.BungeeCore; - import java.sql.ResultSet; -import java.sql.SQLException; import java.util.HashSet; import java.util.Set; public class TeamTeilnahme { private TeamTeilnahme(){} + private static final Statement insert = new Statement("INSERT INTO TeamTeilnahme (TeamID, EventID) VALUES (?, ?)"); + private static final Statement delete = new Statement("DELETE FROM TeamTeilnahme WHERE TeamID = ? AND EventID = ?"); + private static final Statement byEventTeam = new Statement("SELECT * FROM TeamTeilnahme WHERE TeamID = ? AND EventID = ?"); + private static final Statement byEvent = new Statement("SELECT * FROM TeamTeilnahme WHERE EventID = ?"); + private static final Statement byTeam = new Statement("SELECT * FROM TeamTeilnahme WHERE TeamID = ?"); + public static void teilnehmen(int teamID, int eventID){ - SQL.update("INSERT INTO TeamTeilnahme (TeamID, EventID) VALUES (?, ?)", teamID, eventID); + insert.update(teamID, eventID); } public static void notTeilnehmen(int teamID, int eventID){ - SQL.update("DELETE FROM TeamTeilnahme WHERE TeamID = ? AND EventID = ?", teamID, eventID); + delete.update(teamID, eventID); } public static boolean nimmtTeil(int teamID, int eventID){ - ResultSet rs = SQL.select("SELECT * FROM TeamTeilnahme WHERE TeamID = ? AND EventID = ?", teamID, eventID); - try{ - return rs.next(); - }catch (SQLException e){ - BungeeCore.log("Failed to load TeamTeilnahme", e); - throw new SecurityException(); - } + return byEventTeam.select(ResultSet::next, teamID, eventID); } public static Set getTeams(int eventID){ - Set teams = new HashSet<>(); - ResultSet rs = SQL.select("SELECT * FROM TeamTeilnahme WHERE EventID = ?", eventID); - try{ + return byEvent.select(rs -> { + Set teams = new HashSet<>(); while(rs.next()) teams.add(Team.get(rs.getInt("TeamID"))); - }catch (SQLException e){ - BungeeCore.log("Failed to load TeamTeilnahmen", e); - } - return teams; + return teams; + }, eventID); } public static Set getEvents(int teamID){ - Set events = new HashSet<>(); - ResultSet rs = SQL.select("SELECT * FROM TeamTeilnahme WHERE TeamID = ?", teamID); - try{ + return byTeam.select(rs -> { + Set events = new HashSet<>(); while(rs.next()) events.add(Event.get(rs.getInt("EventID"))); - }catch (SQLException e){ - BungeeCore.log("Failed to load TeamTeilnahmen", e); - } - return events; + return events; + }, teamID); } } From 49105c4f738825ba5f78d75c999713b37c3aa316 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Sat, 4 Sep 2021 10:51:11 +0200 Subject: [PATCH 03/15] Hotfix Ignoresystem Signed-off-by: Lixfel --- src/de/steamwar/bungeecore/sql/IgnoreSystem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/de/steamwar/bungeecore/sql/IgnoreSystem.java b/src/de/steamwar/bungeecore/sql/IgnoreSystem.java index 185fb08..7309f8a 100644 --- a/src/de/steamwar/bungeecore/sql/IgnoreSystem.java +++ b/src/de/steamwar/bungeecore/sql/IgnoreSystem.java @@ -25,7 +25,7 @@ import java.sql.ResultSet; public class IgnoreSystem{ - private static final Statement select = new Statement("SELECT COUNT(*) AS blocked FROM IgnoredPlayers WHERE Ignorer = ? AND Ignored = ?"); + private static final Statement select = new Statement("SELECT * FROM IgnoredPlayers WHERE Ignorer = ? AND Ignored = ?"); private static final Statement insert = new Statement("INSERT INTO IgnoredPlayers (Ignorer, Ignored) VALUES (?, ?)"); private static final Statement delete = new Statement("DELETE FROM IgnoredPlayers WHERE Ignorer = ? AND Ignored = ?"); From 05c37c0df07ecda1905569c04f4809b6e9e39a80 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Sat, 4 Sep 2021 21:15:30 +0200 Subject: [PATCH 04/15] Hotfix SteamwarUser Signed-off-by: Lixfel --- src/de/steamwar/bungeecore/sql/SteamwarUser.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/de/steamwar/bungeecore/sql/SteamwarUser.java b/src/de/steamwar/bungeecore/sql/SteamwarUser.java index 0956d67..67c3596 100644 --- a/src/de/steamwar/bungeecore/sql/SteamwarUser.java +++ b/src/de/steamwar/bungeecore/sql/SteamwarUser.java @@ -158,8 +158,9 @@ public class SteamwarUser { if(usersByUUID.containsKey(uuid)) return usersByUUID.get(uuid); return byUUID.select(rs -> { - rs.next(); - return new SteamwarUser(rs); + if(rs.next()) + return new SteamwarUser(rs); + return null; }, uuid.toString()); } From f0e7f52fd65a8975ba50c9898d7ca3ecd3467d66 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Sat, 4 Sep 2021 22:18:38 +0200 Subject: [PATCH 05/15] -21s Start time. Signed-off-by: Lixfel --- .../bungeecore/bot/SteamwarDiscordBot.java | 6 +++--- .../bot/util/DiscordRolesMessage.java | 17 ++++++++++------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java b/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java index 7c5f1db..57d67f5 100644 --- a/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java +++ b/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java @@ -103,10 +103,10 @@ public class SteamwarDiscordBot { serverTeamChatListener = new ServerTeamChatListener(); new SlashCommandListener(); - jda.retrieveCommands().complete().forEach(command -> jda.deleteCommandById(command.getId()).complete()); + jda.retrieveCommands().complete().forEach(command -> jda.deleteCommandById(command.getId()).queue()); Guild guild = jda.getGuildById(SteamwarDiscordBotConfig.GUILD); - guild.retrieveCommands().complete().forEach(command -> guild.deleteCommandById(command.getId()).complete()); + guild.retrieveCommands().complete().forEach(command -> guild.deleteCommandById(command.getId()).queue()); CommandListUpdateAction commands = jda.getGuildById(SteamwarDiscordBotConfig.GUILD).updateCommands(); addCommand(commands, new MuteCommand()); addCommand(commands, new BanCommand()); @@ -114,7 +114,7 @@ public class SteamwarDiscordBot { addCommand(commands, new TeamCommand()); addCommand(commands, new ListCommand()); addCommand(commands, new UnbanCommand()); - commands.complete(); + commands.queue(); } private void addCommand(CommandListUpdateAction commands, BasicDiscordCommand basicDiscordCommand) { diff --git a/src/de/steamwar/bungeecore/bot/util/DiscordRolesMessage.java b/src/de/steamwar/bungeecore/bot/util/DiscordRolesMessage.java index baa8801..1486deb 100644 --- a/src/de/steamwar/bungeecore/bot/util/DiscordRolesMessage.java +++ b/src/de/steamwar/bungeecore/bot/util/DiscordRolesMessage.java @@ -38,10 +38,6 @@ public class DiscordRolesMessage { public void sendMessage() { TextChannel channel = SteamwarDiscordBot.instance().getJda().getGuildById(SteamwarDiscordBotConfig.GUILD).getTextChannelById(SteamwarDiscordBotConfig.ROLES_CHANNEL); assert channel != null; - Message message = null; - if(channel.hasLatestMessage()) { - message = channel.getIterableHistory().complete().stream().filter(m -> m.getAuthor().isBot()).findFirst().orElse(null); - } MessageBuilder builder = new MessageBuilder(); builder.setContent(SteamwarDiscordBotConfig.ROLES_BASE_MESSAGE); @@ -49,10 +45,17 @@ public class DiscordRolesMessage { SteamwarDiscordBotConfig.ROLES.forEach(discordRole -> buttons.add(discordRole.toButton())); builder.setActionRows(ActionRow.of(buttons)); - if (message != null) { - message.editMessage(builder.build()).complete(); + if(channel.hasLatestMessage()) { + channel.getIterableHistory().queue(messages -> { + Message message = messages.stream().filter(m -> m.getAuthor().isBot()).findFirst().orElse(null); + if (message != null) { + message.editMessage(builder.build()).queue(); + } else { + channel.sendMessage(builder.build()).queue(); + } + }); } else { - channel.sendMessage(builder.build()).complete(); + channel.sendMessage(builder.build()).queue(); } } } From a0ac0a0be25d56d7ec6dfe96ce61c96720ca4d20 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Sat, 4 Sep 2021 23:15:08 +0200 Subject: [PATCH 06/15] Async (TM) Signed-off-by: Chaoscaot --- .../steamwar/bungeecore/bot/AuthManager.java | 10 +-- .../bungeecore/bot/SteamwarDiscordBot.java | 64 ++++++++++--------- .../bungeecore/bot/commands/BanCommand.java | 6 +- .../bot/commands/BasicDiscordCommand.java | 2 +- .../bungeecore/bot/commands/ListCommand.java | 2 +- .../bungeecore/bot/commands/MuteCommand.java | 2 +- .../bungeecore/bot/commands/TeamCommand.java | 10 +-- .../bungeecore/bot/commands/UnbanCommand.java | 7 +- .../bungeecore/bot/commands/WhoisCommand.java | 2 +- .../bungeecore/bot/events/EventManager.java | 2 +- .../bot/events/SchematicsManager.java | 2 +- .../bot/listeners/AnnouncementListener.java | 2 +- .../bot/listeners/DiscordAuthListener.java | 10 +-- .../bot/listeners/DiscordTicketListener.java | 16 ++--- .../bot/listeners/IngameChatListener.java | 6 +- .../RolesInteractionButtonListener.java | 4 +- .../bot/listeners/ServerTeamChatListener.java | 1 - .../bungeecore/bot/util/DiscordRanks.java | 48 +++++++------- .../bot/util/DiscordRulesMessage.java | 4 +- .../bot/util/DiscordTicketMessage.java | 4 +- 20 files changed, 101 insertions(+), 103 deletions(-) diff --git a/src/de/steamwar/bungeecore/bot/AuthManager.java b/src/de/steamwar/bungeecore/bot/AuthManager.java index 1502b68..7d8b005 100644 --- a/src/de/steamwar/bungeecore/bot/AuthManager.java +++ b/src/de/steamwar/bungeecore/bot/AuthManager.java @@ -48,11 +48,7 @@ public class AuthManager { TOKENS.put(code, member.getIdLong()); BungeeCore.log("Created Discord Auth-Token: " + code + " for: " + member.getUser().getAsTag()); - ScheduledTask[] task = new ScheduledTask[1]; - task[0] = BungeeCore.get().getProxy().getScheduler().schedule(BungeeCore.get(), () -> { - TOKENS.remove(code); - task[0].cancel(); - }, 10, 10, TimeUnit.MINUTES); + BungeeCore.get().getProxy().getScheduler().schedule(BungeeCore.get(), () -> TOKENS.remove(code), 10, TimeUnit.MINUTES); return code; } @@ -66,10 +62,10 @@ public class AuthManager { builder.setActionRows(ActionRow.of(Button.success("tada", Emoji.fromUnicode("U+1F389")), Button.danger("invalid", "Ich war das nicht"))); try { - member.getUser().openPrivateChannel().complete().sendMessage(builder.build()).complete(); + member.getUser().openPrivateChannel().queue(privateChannel -> privateChannel.sendMessage(builder.build()).queue()); if (member.getNickname() == null) { try { - member.getGuild().modifyNickname(member, user.getUserName()).complete(); + member.getGuild().modifyNickname(member, user.getUserName()).queue(); } catch (Exception e) { // Ignored } diff --git a/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java b/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java index 57d67f5..381720e 100644 --- a/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java +++ b/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java @@ -78,43 +78,45 @@ public class SteamwarDiscordBot { } catch (LoginException e) { throw new SecurityException("Could not Login: " + SteamwarDiscordBotConfig.TOKEN, e); } - try { - jda.awaitReady(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - activity(); - EventManager.update(); - SchematicsManager.update(); - ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), () -> { + ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { + try { + jda.awaitReady(); + } catch (InterruptedException e) { + e.printStackTrace(); + } activity(); EventManager.update(); SchematicsManager.update(); - }, 30, 30, TimeUnit.SECONDS); - DiscordRolesMessage.sendMessage(); - DiscordRulesMessage.sendMessage(); - DiscordTicketMessage.sendMessage(); + ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), () -> { + activity(); + EventManager.update(); + SchematicsManager.update(); + }, 30, 30, TimeUnit.SECONDS); + DiscordRolesMessage.sendMessage(); + DiscordRulesMessage.sendMessage(); + DiscordTicketMessage.sendMessage(); - new RolesInteractionButtonListener(); - new DiscordTicketListener(); - new DiscordAuthListener(); - announcementListener = new AnnouncementListener(); - ingameChatListener = new IngameChatListener(); - serverTeamChatListener = new ServerTeamChatListener(); - new SlashCommandListener(); + new RolesInteractionButtonListener(); + new DiscordTicketListener(); + new DiscordAuthListener(); + announcementListener = new AnnouncementListener(); + ingameChatListener = new IngameChatListener(); + serverTeamChatListener = new ServerTeamChatListener(); + new SlashCommandListener(); - jda.retrieveCommands().complete().forEach(command -> jda.deleteCommandById(command.getId()).queue()); + jda.retrieveCommands().complete().forEach(command -> jda.deleteCommandById(command.getId()).queue()); - Guild guild = jda.getGuildById(SteamwarDiscordBotConfig.GUILD); - guild.retrieveCommands().complete().forEach(command -> guild.deleteCommandById(command.getId()).queue()); - CommandListUpdateAction commands = jda.getGuildById(SteamwarDiscordBotConfig.GUILD).updateCommands(); - addCommand(commands, new MuteCommand()); - addCommand(commands, new BanCommand()); - addCommand(commands, new WhoisCommand()); - addCommand(commands, new TeamCommand()); - addCommand(commands, new ListCommand()); - addCommand(commands, new UnbanCommand()); - commands.queue(); + Guild guild = jda.getGuildById(SteamwarDiscordBotConfig.GUILD); + guild.retrieveCommands().queue(commands -> commands.forEach(command -> guild.deleteCommandById(command.getId()).queue())); + CommandListUpdateAction commands = jda.getGuildById(SteamwarDiscordBotConfig.GUILD).updateCommands(); + addCommand(commands, new MuteCommand()); + addCommand(commands, new BanCommand()); + addCommand(commands, new WhoisCommand()); + addCommand(commands, new TeamCommand()); + addCommand(commands, new ListCommand()); + addCommand(commands, new UnbanCommand()); + commands.queue(); + }); } private void addCommand(CommandListUpdateAction commands, BasicDiscordCommand basicDiscordCommand) { diff --git a/src/de/steamwar/bungeecore/bot/commands/BanCommand.java b/src/de/steamwar/bungeecore/bot/commands/BanCommand.java index 7d3772f..e55b97e 100644 --- a/src/de/steamwar/bungeecore/bot/commands/BanCommand.java +++ b/src/de/steamwar/bungeecore/bot/commands/BanCommand.java @@ -45,13 +45,13 @@ public class BanCommand extends BasicDiscordCommand { SteamwarUser sender = SteamwarUser.get(event.getMember().getIdLong()); SteamwarUser target = SteamwarUser.getOrCreateOfflinePlayer(event.getOption("user").getAsString()); if (target == null) { - event.reply("Angegebener User invalide").setEphemeral(true).complete(); + event.reply("Angegebener User invalide").setEphemeral(true).queue(); return; } Timestamp time = de.steamwar.bungeecore.commands.BanCommand.parseTime(null, event.getOption("time").getAsString()); if (time == null) { - event.reply("Angegebene Zeit invalide").setEphemeral(true).complete(); + event.reply("Angegebene Zeit invalide").setEphemeral(true).queue(); return; } @@ -60,6 +60,6 @@ public class BanCommand extends BasicDiscordCommand { target.ban(time, msg, sender.getId(), isPerma); Message.team("BAN_TEAM_BANNED", new Message("PREFIX"), target.getUserName(), sender.getUserName(), new Message((isPerma ? "BAN_PERMA" : "BAN_UNTIL"), time), msg); - event.reply("Erfolgreich " + target.getUserName() + (isPerma ? " permanent" : " bis " + time) + " gebannt").setEphemeral(true).complete(); + event.reply("Erfolgreich " + target.getUserName() + (isPerma ? " permanent" : " bis " + time) + " gebannt").setEphemeral(true).queue(); } } diff --git a/src/de/steamwar/bungeecore/bot/commands/BasicDiscordCommand.java b/src/de/steamwar/bungeecore/bot/commands/BasicDiscordCommand.java index a767eba..29bbe85 100644 --- a/src/de/steamwar/bungeecore/bot/commands/BasicDiscordCommand.java +++ b/src/de/steamwar/bungeecore/bot/commands/BasicDiscordCommand.java @@ -46,7 +46,7 @@ public abstract class BasicDiscordCommand extends CommandData { Member member = event.getMember(); SteamwarUser steamwarUser = SteamwarUser.get(member.getIdLong()); if (steamwarUser == null || (!steamwarUser.getUserGroup().isTeamGroup() && steamwarUser.getUserGroup() != UserGroup.Builder)) { - event.reply("Du hast für " + event.getName() + " keine Rechte oder es existiert keine Verknüpfung für dich.").setEphemeral(true).complete(); + event.reply("Du hast für " + event.getName() + " keine Rechte oder es existiert keine Verknüpfung für dich.").setEphemeral(true).queue(); return false; } return true; diff --git a/src/de/steamwar/bungeecore/bot/commands/ListCommand.java b/src/de/steamwar/bungeecore/bot/commands/ListCommand.java index 2050180..3b014f9 100644 --- a/src/de/steamwar/bungeecore/bot/commands/ListCommand.java +++ b/src/de/steamwar/bungeecore/bot/commands/ListCommand.java @@ -38,6 +38,6 @@ public class ListCommand extends BasicDiscordCommand { de.steamwar.bungeecore.commands.ListCommand.getPlayerMap().forEach((s, proxiedPlayers) -> { embedBuilder.addField(s, proxiedPlayers.stream().map(player -> "`" + player.getName() + "`").collect(Collectors.joining(", ")), true); }); - event.replyEmbeds(embedBuilder.build()).setEphemeral(true).complete(); + event.replyEmbeds(embedBuilder.build()).setEphemeral(true).queue(); } } diff --git a/src/de/steamwar/bungeecore/bot/commands/MuteCommand.java b/src/de/steamwar/bungeecore/bot/commands/MuteCommand.java index 700baac..1c0bc96 100644 --- a/src/de/steamwar/bungeecore/bot/commands/MuteCommand.java +++ b/src/de/steamwar/bungeecore/bot/commands/MuteCommand.java @@ -61,6 +61,6 @@ public class MuteCommand extends BasicDiscordCommand { target.mute(time, msg, sender.getId(), isPerma); Message.team("MUTE_TEAM_MUTED", new Message("PREFIX"), target.getUserName(), sender.getUserName(), new Message((isPerma ? "BAN_PERMA" : "BAN_UNTIL"), time), msg); - event.reply("Erfolgreich " + target.getUserName() + (isPerma ? " permanent" : " bis " + time) + " gemutet").setEphemeral(true).complete(); + event.reply("Erfolgreich " + target.getUserName() + (isPerma ? " permanent" : " bis " + time) + " gemutet").setEphemeral(true).queue(); } } diff --git a/src/de/steamwar/bungeecore/bot/commands/TeamCommand.java b/src/de/steamwar/bungeecore/bot/commands/TeamCommand.java index 53d7039..e0b3545 100644 --- a/src/de/steamwar/bungeecore/bot/commands/TeamCommand.java +++ b/src/de/steamwar/bungeecore/bot/commands/TeamCommand.java @@ -58,11 +58,11 @@ public class TeamCommand extends BasicDiscordCommand { Team team; if (optionMapping == null) { if (steamwarUser == null) { - event.reply("Dein Discord ist nicht verknüpft").setEphemeral(true).complete(); + event.reply("Dein Discord ist nicht verknüpft").setEphemeral(true).queue(); return; } if (steamwarUser.getTeam() == 0) { - event.reply("Du bist in keinem Team").setEphemeral(true).complete(); + event.reply("Du bist in keinem Team").setEphemeral(true).queue(); return; } team = Team.get(steamwarUser.getTeam()); @@ -70,7 +70,7 @@ public class TeamCommand extends BasicDiscordCommand { team = Team.get(optionMapping.getAsString()); } if (team == null) { - event.reply("Unbekanntes Team").setEphemeral(true).complete(); + event.reply("Unbekanntes Team").setEphemeral(true).queue(); return; } EmbedBuilder embedBuilder = new EmbedBuilder(); @@ -81,10 +81,10 @@ public class TeamCommand extends BasicDiscordCommand { embedBuilder.addField("Leader", members.stream().filter(SteamwarUser::isLeader).map(user -> "`" + (isOnline(user) ? emoji.getAsMention() : "") + user.getUserName() + "`").collect(Collectors.joining(" ")), false); embedBuilder.addField("Member", members.stream().filter(user -> !user.isLeader()).map(user -> "`" + (isOnline(user) ? emoji.getAsMention() : "") + user.getUserName() + "`").collect(Collectors.joining(" ")), false); embedBuilder.addField("Events", "`" + TeamTeilnahme.getEvents(team.getTeamId()).stream().map(Event::getEventName).collect(Collectors.joining("` `")) + "`", false); - event.replyEmbeds(embedBuilder.build()).setEphemeral(true).complete(); + event.replyEmbeds(embedBuilder.build()).setEphemeral(true).queue(); return; default: - event.reply("Unbekannter Befehl").setEphemeral(true).complete(); + event.reply("Unbekannter Befehl").setEphemeral(true).queue(); return; } } diff --git a/src/de/steamwar/bungeecore/bot/commands/UnbanCommand.java b/src/de/steamwar/bungeecore/bot/commands/UnbanCommand.java index 7147108..925423f 100644 --- a/src/de/steamwar/bungeecore/bot/commands/UnbanCommand.java +++ b/src/de/steamwar/bungeecore/bot/commands/UnbanCommand.java @@ -19,7 +19,6 @@ package de.steamwar.bungeecore.bot.commands; -import de.steamwar.bungeecore.Message; import de.steamwar.bungeecore.sql.SteamwarUser; import net.dv8tion.jda.api.events.interaction.SlashCommandEvent; import net.dv8tion.jda.api.interactions.commands.OptionType; @@ -44,16 +43,16 @@ public class UnbanCommand extends BasicDiscordCommand { SteamwarUser sender = SteamwarUser.get(event.getMember().getIdLong()); SteamwarUser target = SteamwarUser.getOrCreateOfflinePlayer(event.getOption("user").getAsString()); if (target == null) { - event.reply("Angegebener User invalide").setEphemeral(true).complete(); + event.reply("Angegebener User invalide").setEphemeral(true).queue(); return; } if (!target.isBanned()) { - event.reply("Angegebener User ist nicht gebannt").setEphemeral(true).complete(); + event.reply("Angegebener User ist nicht gebannt").setEphemeral(true).queue(); return; } target.ban(Timestamp.from(new Date().toInstant()), "Unban", sender.getId(), false); - event.reply("Erfolgreich " + target.getUserName() + " entbannt").setEphemeral(true).complete(); + event.reply("Erfolgreich " + target.getUserName() + " entbannt").setEphemeral(true).queue(); } } diff --git a/src/de/steamwar/bungeecore/bot/commands/WhoisCommand.java b/src/de/steamwar/bungeecore/bot/commands/WhoisCommand.java index b40c049..8608047 100644 --- a/src/de/steamwar/bungeecore/bot/commands/WhoisCommand.java +++ b/src/de/steamwar/bungeecore/bot/commands/WhoisCommand.java @@ -89,6 +89,6 @@ public class WhoisCommand extends BasicDiscordCommand { embedBuilder.addField(punishment.getType().name() + " von " + SteamwarUser.get(punishment.getPunisher()).getUserName(), "Von: " + punishment.getBantime(punishment.getStartTime(), false) + "\nBis: " + punishment.getBantime(punishment.getEndTime(), punishment.isPerma()) + "\nGrund: " + punishment.getReason(), true); } - event.replyEmbeds(embedBuilder.build()).setEphemeral(true).complete(); + event.replyEmbeds(embedBuilder.build()).setEphemeral(true).queue(); } } diff --git a/src/de/steamwar/bungeecore/bot/events/EventManager.java b/src/de/steamwar/bungeecore/bot/events/EventManager.java index 56f982c..d40a80c 100644 --- a/src/de/steamwar/bungeecore/bot/events/EventManager.java +++ b/src/de/steamwar/bungeecore/bot/events/EventManager.java @@ -119,7 +119,7 @@ public class EventManager { MessageBuilder messageBuilder = new MessageBuilder(); messageBuilder.setEmbeds(embedBuilder.build()); if (message == null) { - message = textChannel.sendMessage(messageBuilder.build()).complete(); + textChannel.sendMessage(messageBuilder.build()).queue(message1 -> message = message1); } else { message.editMessage(messageBuilder.build()).complete(); } diff --git a/src/de/steamwar/bungeecore/bot/events/SchematicsManager.java b/src/de/steamwar/bungeecore/bot/events/SchematicsManager.java index 64809e1..82a8370 100644 --- a/src/de/steamwar/bungeecore/bot/events/SchematicsManager.java +++ b/src/de/steamwar/bungeecore/bot/events/SchematicsManager.java @@ -65,7 +65,7 @@ public class SchematicsManager { MessageBuilder messageBuilder = new MessageBuilder(); messageBuilder.setEmbeds(embedBuilder.build()); if (message == null) { - message = textChannel.sendMessage(messageBuilder.build()).complete(); + textChannel.sendMessage(messageBuilder.build()).queue(message1 -> message = message1); } else { message.editMessage(messageBuilder.build()).queue(); } diff --git a/src/de/steamwar/bungeecore/bot/listeners/AnnouncementListener.java b/src/de/steamwar/bungeecore/bot/listeners/AnnouncementListener.java index 2877fbd..ab4be19 100644 --- a/src/de/steamwar/bungeecore/bot/listeners/AnnouncementListener.java +++ b/src/de/steamwar/bungeecore/bot/listeners/AnnouncementListener.java @@ -45,6 +45,6 @@ public class AnnouncementListener extends BasicDiscordListener { assert textChannel != null; MessageBuilder messageBuilder = new MessageBuilder(); messageBuilder.append(message.replace("&", "")); - textChannel.sendMessage(messageBuilder.build()).complete(); + textChannel.sendMessage(messageBuilder.build()).queue(); } } diff --git a/src/de/steamwar/bungeecore/bot/listeners/DiscordAuthListener.java b/src/de/steamwar/bungeecore/bot/listeners/DiscordAuthListener.java index 514b193..8ad3428 100644 --- a/src/de/steamwar/bungeecore/bot/listeners/DiscordAuthListener.java +++ b/src/de/steamwar/bungeecore/bot/listeners/DiscordAuthListener.java @@ -35,23 +35,23 @@ public class DiscordAuthListener extends BasicDiscordListener { if(event.getChannel().getId().equals(SteamwarDiscordBotConfig.RULES_CHANNEL) && event.getComponentId().equals("auth")) { String authMessage = AuthManager.createDiscordAuthToken(event.getMember()); if(authMessage != null) { - event.reply("Gebe innerhalb der nächsten 10 Minuten ``/verify " + authMessage + "`` auf dem Minecraft Server ein").setEphemeral(true).complete(); + event.reply("Gebe innerhalb der nächsten 10 Minuten ``/verify " + authMessage + "`` auf dem Minecraft Server ein").setEphemeral(true).queue(); } else { - event.reply("Du hast bereits einen Code am laufen").setEphemeral(true).complete(); + event.reply("Du hast bereits einen Code am laufen").setEphemeral(true).queue(); } } if(event.getComponentId().equals("tada") && event.getChannelType() == ChannelType.PRIVATE) { - event.reply(":tada:").setEphemeral(false).complete(); + event.reply(":tada:").setEphemeral(false).queue(); } if(event.getComponentId().equals("invalid") && event.getChannelType() == ChannelType.PRIVATE) { SteamwarUser user = SteamwarUser.get(event.getUser().getIdLong()); if(user == null) { - event.reply(":question: Da ist keine verknüpfung?").setEphemeral(false).complete(); + event.reply(":question: Da ist keine verknüpfung?").setEphemeral(false).queue(); } else { user.setDiscordId(null); - event.reply(":x: Die Verknüpfung wurde beendet").setEphemeral(false).complete(); + event.reply(":x: Die Verknüpfung wurde beendet").setEphemeral(false).queue(); } } } diff --git a/src/de/steamwar/bungeecore/bot/listeners/DiscordTicketListener.java b/src/de/steamwar/bungeecore/bot/listeners/DiscordTicketListener.java index 1ac4920..fab5aaa 100644 --- a/src/de/steamwar/bungeecore/bot/listeners/DiscordTicketListener.java +++ b/src/de/steamwar/bungeecore/bot/listeners/DiscordTicketListener.java @@ -21,6 +21,7 @@ package de.steamwar.bungeecore.bot.listeners; import de.steamwar.bungeecore.BungeeCore; import de.steamwar.bungeecore.Message; +import de.steamwar.bungeecore.SpecialPermissions; import de.steamwar.bungeecore.bot.config.DiscordTicketType; import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig; import de.steamwar.bungeecore.sql.SteamwarUser; @@ -114,7 +115,7 @@ public class DiscordTicketListener extends BasicDiscordListener { logChannel.sendMessage(builder.build()).complete(); Message.team("DISCORD_TICKET_CLOSED", event.getTextChannel().getName()); - event.getTextChannel().delete().reason("Closed").complete(); + event.getTextChannel().delete().reason("Closed").queue(); } } } @@ -126,16 +127,15 @@ public class DiscordTicketListener extends BasicDiscordListener { BungeeCore.get().getProxy().getPlayers().forEach(player -> { if(event.getAuthor().isBot() || event.getAuthor().isSystem()) return; SteamwarUser user = SteamwarUser.get(player); + boolean sendMessage; if(user.getDiscordId() == null) { - if(user.getUserGroup().isTeamGroup()) { - Message.sendPrefixless("DISCORD_TICKET_MESSAGE", player, "Zur nachricht", new ClickEvent(ClickEvent.Action.OPEN_URL, event.getMessage().getJumpUrl()), event.getChannel().getName(), event.getAuthor().getName(), event.getMessage().getContentRaw()); - } + sendMessage = user.getUserGroup().isCheckSchematics(); } else { if(event.getAuthor().getId().equals(user.getDiscordId())) return; - Member member = event.getGuild().retrieveMemberById(user.getDiscordId()).complete(); - if(member.hasPermission(event.getChannel().getManager().getChannel(), Permission.MESSAGE_WRITE)) { - Message.sendPrefixless("DISCORD_TICKET_MESSAGE", player, "Zur nachricht", new ClickEvent(ClickEvent.Action.OPEN_URL, event.getMessage().getJumpUrl()), event.getChannel().getName(), event.getAuthor().getName(), event.getMessage().getContentRaw()); - } + sendMessage = user.getDiscordId().equals(event.getChannel().getTopic()) || user.getUserGroup().isCheckSchematics(); + } + if(sendMessage) { + Message.sendPrefixless("DISCORD_TICKET_MESSAGE", player, "Zur nachricht", new ClickEvent(ClickEvent.Action.OPEN_URL, event.getMessage().getJumpUrl()), event.getChannel().getName(), event.getAuthor().getName(), event.getMessage().getContentRaw()); } }); } diff --git a/src/de/steamwar/bungeecore/bot/listeners/IngameChatListener.java b/src/de/steamwar/bungeecore/bot/listeners/IngameChatListener.java index ce635f3..7163985 100644 --- a/src/de/steamwar/bungeecore/bot/listeners/IngameChatListener.java +++ b/src/de/steamwar/bungeecore/bot/listeners/IngameChatListener.java @@ -43,15 +43,15 @@ public class IngameChatListener extends BasicDiscordListener { Member member = event.getMember(); SteamwarUser steamwarUser = SteamwarUser.get(member.getIdLong()); if (steamwarUser == null || event.getMessage().getContentRaw().length() > 250) { - event.getMessage().delete().complete(); + event.getMessage().delete().queue(); } else { String s = event.getMessage().getContentDisplay(); if (steamwarUser.getUserGroup() == UserGroup.Member && (s.contains("http") || s.contains("www"))) { - event.getMessage().delete().complete(); + event.getMessage().delete().queue(); return; } if (steamwarUser.isMuted() || steamwarUser.isBanned()) { - event.getMessage().delete().complete(); + event.getMessage().delete().queue(); return; } ChatListener.discordChat(steamwarUser, event.getMessage().getContentDisplay().replaceAll("§[a-f0-9]", "").replace('\n', ' ')); diff --git a/src/de/steamwar/bungeecore/bot/listeners/RolesInteractionButtonListener.java b/src/de/steamwar/bungeecore/bot/listeners/RolesInteractionButtonListener.java index 035cd77..ae0e44d 100644 --- a/src/de/steamwar/bungeecore/bot/listeners/RolesInteractionButtonListener.java +++ b/src/de/steamwar/bungeecore/bot/listeners/RolesInteractionButtonListener.java @@ -32,10 +32,10 @@ public class RolesInteractionButtonListener extends BasicDiscordListener { if(event.getType() == InteractionType.COMPONENT && event.getChannelType() == ChannelType.TEXT && event.getTextChannel().getId().equals(SteamwarDiscordBotConfig.ROLES_CHANNEL) && SteamwarDiscordBotConfig.ROLES.stream().anyMatch(discordRole -> discordRole.getRoleId().equals(event.getComponentId()))) { if (event.getMember().getRoles().stream().anyMatch(role -> role.getId().equals(event.getComponentId()))) { event.getGuild().removeRoleFromMember(event.getMember(), event.getGuild().getRoleById(event.getComponentId())).complete(); - event.reply(SteamwarDiscordBotConfig.ROLES_REMOVED.replace("%role%", event.getGuild().getRoleById(event.getComponentId()).getAsMention())).setEphemeral(true).complete(); + event.reply(SteamwarDiscordBotConfig.ROLES_REMOVED.replace("%role%", event.getGuild().getRoleById(event.getComponentId()).getAsMention())).setEphemeral(true).queue(); } else { event.getGuild().addRoleToMember(event.getMember(), event.getGuild().getRoleById(event.getComponentId())).complete(); - event.reply(SteamwarDiscordBotConfig.ROLES_ADDED.replace("%role%", event.getGuild().getRoleById(event.getComponentId()).getAsMention())).setEphemeral(true).complete(); + event.reply(SteamwarDiscordBotConfig.ROLES_ADDED.replace("%role%", event.getGuild().getRoleById(event.getComponentId()).getAsMention())).setEphemeral(true).queue(); } } } diff --git a/src/de/steamwar/bungeecore/bot/listeners/ServerTeamChatListener.java b/src/de/steamwar/bungeecore/bot/listeners/ServerTeamChatListener.java index 0f82673..816da82 100644 --- a/src/de/steamwar/bungeecore/bot/listeners/ServerTeamChatListener.java +++ b/src/de/steamwar/bungeecore/bot/listeners/ServerTeamChatListener.java @@ -22,7 +22,6 @@ package de.steamwar.bungeecore.bot.listeners; import de.steamwar.bungeecore.bot.SteamwarDiscordBot; import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig; import de.steamwar.bungeecore.commands.ServerTeamchatCommand; -import de.steamwar.bungeecore.listeners.ChatListener; import de.steamwar.bungeecore.sql.SteamwarUser; import net.dv8tion.jda.api.MessageBuilder; import net.dv8tion.jda.api.entities.Member; diff --git a/src/de/steamwar/bungeecore/bot/util/DiscordRanks.java b/src/de/steamwar/bungeecore/bot/util/DiscordRanks.java index dedf0a5..7224576 100644 --- a/src/de/steamwar/bungeecore/bot/util/DiscordRanks.java +++ b/src/de/steamwar/bungeecore/bot/util/DiscordRanks.java @@ -22,13 +22,11 @@ package de.steamwar.bungeecore.bot.util; import de.steamwar.bungeecore.bot.SteamwarDiscordBot; import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig; import de.steamwar.bungeecore.sql.SteamwarUser; -import de.steamwar.bungeecore.sql.UserGroup; import lombok.experimental.UtilityClass; import net.dv8tion.jda.api.entities.Guild; -import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; +import net.dv8tion.jda.api.exceptions.ErrorResponseException; -import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -41,27 +39,31 @@ public class DiscordRanks { return; } Guild guild = SteamwarDiscordBot.instance().getJda().getGuildById(SteamwarDiscordBotConfig.GUILD); - Member member = guild.retrieveMemberById(steamwarUser.getDiscordId()).complete(); - if (member == null) { - return; - } - - List roleList = member.getRoles(); - Set strings = new HashSet<>(SteamwarDiscordBotConfig.RANKS.values()); - String needed = SteamwarDiscordBotConfig.RANKS.get(steamwarUser.getUserGroup()); - for (Role role : roleList) { - if (!strings.contains(role.getId())) { - continue; + guild.retrieveMemberById(steamwarUser.getDiscordId()).queue(member -> { + List roleList = member.getRoles(); + Set strings = new HashSet<>(SteamwarDiscordBotConfig.RANKS.values()); + String needed = SteamwarDiscordBotConfig.RANKS.get(steamwarUser.getUserGroup()); + for (Role role : roleList) { + if (!strings.contains(role.getId())) { + continue; + } + if (role.getId().equals(needed)) { + needed = ""; + continue; + } + guild.removeRoleFromMember(member, role).complete(); } - if (role.getId().equals(needed)) { - needed = ""; - continue; - } - guild.removeRoleFromMember(member, role).complete(); - } - if (needed != null && !needed.isEmpty()) { - guild.addRoleToMember(member, guild.getRoleById(needed)).complete(); - } + if (needed != null && !needed.isEmpty()) { + guild.addRoleToMember(member, guild.getRoleById(needed)).complete(); + } + }, throwable -> { + if(throwable instanceof ErrorResponseException) { + ErrorResponseException e = (ErrorResponseException) throwable; + if(e.getErrorCode() == 10007) { + steamwarUser.setDiscordId(null); + } + } + }); } } diff --git a/src/de/steamwar/bungeecore/bot/util/DiscordRulesMessage.java b/src/de/steamwar/bungeecore/bot/util/DiscordRulesMessage.java index a1cb6fb..a061d66 100644 --- a/src/de/steamwar/bungeecore/bot/util/DiscordRulesMessage.java +++ b/src/de/steamwar/bungeecore/bot/util/DiscordRulesMessage.java @@ -60,9 +60,9 @@ public class DiscordRulesMessage { messageBuilder.setEmbeds(builder.build()); messageBuilder.setActionRows(ActionRow.of(buttons), ActionRow.of(authButton)); if (message != null) { - message.editMessage(messageBuilder.build()).complete(); + message.editMessage(messageBuilder.build()).queue(); } else { - channel.sendMessage(messageBuilder.build()).complete(); + channel.sendMessage(messageBuilder.build()).queue(); } } } diff --git a/src/de/steamwar/bungeecore/bot/util/DiscordTicketMessage.java b/src/de/steamwar/bungeecore/bot/util/DiscordTicketMessage.java index ab93000..ea6cea3 100644 --- a/src/de/steamwar/bungeecore/bot/util/DiscordTicketMessage.java +++ b/src/de/steamwar/bungeecore/bot/util/DiscordTicketMessage.java @@ -56,9 +56,9 @@ public class DiscordTicketMessage { messageBuilder.setEmbeds(builder.build()); messageBuilder.setActionRows(ActionRow.of(buttons)); if (message != null) { - message.editMessage(messageBuilder.build()).complete(); + message.editMessage(messageBuilder.build()).queue(); } else { - channel.sendMessage(messageBuilder.build()).complete(); + channel.sendMessage(messageBuilder.build()).queue(); } } } From b60422245088aa26a52fc8a957592a4474078f65 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Sun, 5 Sep 2021 18:47:04 +0200 Subject: [PATCH 07/15] Deny launching multiple bauservers Signed-off-by: Lixfel --- src/de/steamwar/bungeecore/commands/BauCommand.java | 11 ++++++----- .../steamwar/bungeecore/commands/CheckCommand.java | 13 ++++++++++--- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/de/steamwar/bungeecore/commands/BauCommand.java b/src/de/steamwar/bungeecore/commands/BauCommand.java index d50f7a7..e827427 100644 --- a/src/de/steamwar/bungeecore/commands/BauCommand.java +++ b/src/de/steamwar/bungeecore/commands/BauCommand.java @@ -261,12 +261,12 @@ public class BauCommand extends BasicCommand { }); } - public static void stopBauserver(ProxiedPlayer p){ + public static boolean stopBauserver(ProxiedPlayer p){ for (Subserver subserver : Subserver.getServerList()) { if (subserver.getType() == Servertype.BAUSERVER && ((Bauserver) subserver).getOwner().equals(p.getUniqueId())) { - if(subserver.getServer().getPlayers().isEmpty()){ + if(!subserver.hasStarted()){ Message.send("BAU_START_ALREADY", p); - return; + return false; } subserver.stop(); try { @@ -277,12 +277,13 @@ public class BauCommand extends BasicCommand { break; } } + return true; } private static void testarena(ProxiedPlayer p, String[] args){ FightCommand.createArena(p, "/bau testarena ", args, 1, false, (player, mode, map) -> ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { - stopBauserver(p); - SubserverSystem.startTestServer(p, mode, map, 0, 0); + if(stopBauserver(p)) + SubserverSystem.startTestServer(p, mode, map, 0, 0); })); } diff --git a/src/de/steamwar/bungeecore/commands/CheckCommand.java b/src/de/steamwar/bungeecore/commands/CheckCommand.java index c110b3c..e61dd71 100644 --- a/src/de/steamwar/bungeecore/commands/CheckCommand.java +++ b/src/de/steamwar/bungeecore/commands/CheckCommand.java @@ -234,7 +234,10 @@ public class CheckCommand extends BasicCommand { this.checkList = checkQuestions.get(schematic.getSchemType()).listIterator(); ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { - BauCommand.stopBauserver(checker); + if(!BauCommand.stopBauserver(checker)){ + remove(); + return; + } ArenaMode mode = ArenaMode.getBySchemType(schematic.getSchemType().fightType()); SubserverSystem.startTestServer(checker, mode, FightCommand.getMap(checker, mode, "Random"), schematic.getSchemID(), 0); @@ -323,8 +326,7 @@ public class CheckCommand extends BasicCommand { } private void stop(){ - currentCheckers.remove(checker.getUniqueId()); - currentSchems.remove(schematic.getSchemID()); + remove(); ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { for (Subserver subserver : Subserver.getServerList()) { if (subserver.getType() == Servertype.BAUSERVER && ((Bauserver) subserver).getOwner().equals(checker.getUniqueId())) { @@ -334,5 +336,10 @@ public class CheckCommand extends BasicCommand { } }); } + + private void remove() { + currentCheckers.remove(checker.getUniqueId()); + currentSchems.remove(schematic.getSchemID()); + } } } From 12186e4f783477ebaeb0d1fc9a4e3fe0663e029c Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Tue, 7 Sep 2021 13:37:13 +0200 Subject: [PATCH 08/15] Fixing Signed-off-by: Chaoscaot --- .../steamwar/bungeecore/bot/listeners/DiscordTicketListener.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/de/steamwar/bungeecore/bot/listeners/DiscordTicketListener.java b/src/de/steamwar/bungeecore/bot/listeners/DiscordTicketListener.java index fab5aaa..8c8c4fa 100644 --- a/src/de/steamwar/bungeecore/bot/listeners/DiscordTicketListener.java +++ b/src/de/steamwar/bungeecore/bot/listeners/DiscordTicketListener.java @@ -21,7 +21,6 @@ package de.steamwar.bungeecore.bot.listeners; import de.steamwar.bungeecore.BungeeCore; import de.steamwar.bungeecore.Message; -import de.steamwar.bungeecore.SpecialPermissions; import de.steamwar.bungeecore.bot.config.DiscordTicketType; import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig; import de.steamwar.bungeecore.sql.SteamwarUser; From 27293fc051a2ab0bfc03c2290233476caff33579 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Tue, 7 Sep 2021 16:49:32 +0200 Subject: [PATCH 09/15] Add Message Spliting Signed-off-by: Chaoscaot --- .../bot/listeners/DiscordTicketListener.java | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/src/de/steamwar/bungeecore/bot/listeners/DiscordTicketListener.java b/src/de/steamwar/bungeecore/bot/listeners/DiscordTicketListener.java index 8c8c4fa..f7a2fa2 100644 --- a/src/de/steamwar/bungeecore/bot/listeners/DiscordTicketListener.java +++ b/src/de/steamwar/bungeecore/bot/listeners/DiscordTicketListener.java @@ -75,29 +75,40 @@ public class DiscordTicketListener extends BasicDiscordListener { } else if(event.getComponentId().startsWith("close-")) { TextChannel logChannel = event.getGuild().getTextChannelById(SteamwarDiscordBotConfig.TICKET_LOG); - MessageBuilder builder = new MessageBuilder(); - StringBuilder stringBuilder = new StringBuilder(); + LinkedList stringBuilders = new LinkedList<>(); + stringBuilders.add(new StringBuilder()); new LinkedList<>(event.getTextChannel().getIterableHistory().complete()).descendingIterator().forEachRemaining(message -> { if(message.getAuthor().isSystem() || message.getAuthor().isBot()) return; - stringBuilder.append(" ") + StringBuilder currentBuilder = new StringBuilder(); + currentBuilder.append(" ") .append("**") .append(message.getAuthor().getName()) .append("**: ") .append(message.getContentRaw()); if(!message.getAttachments().isEmpty()) { - stringBuilder.append("\n") + currentBuilder.append("\n") .append("Files: ").append("\n"); - message.getAttachments().forEach(attachment -> stringBuilder.append(attachment.getUrl()).append("\n")); + message.getAttachments().forEach(attachment -> currentBuilder.append(attachment.getUrl()).append("\n")); } - stringBuilder.append("\n"); + currentBuilder.append("\n"); + if(currentBuilder.length() >= 4096) { + stringBuilders.getLast().append(currentBuilder.substring(0, 4090)); + stringBuilders.add(new StringBuilder(currentBuilder.substring(4090, currentBuilder.length() - 1))); + } else if (currentBuilder.length() + stringBuilders.getLast().length() >= 4096) { + stringBuilders.add(new StringBuilder(currentBuilder.toString())); + } else { + stringBuilders.getLast().append(currentBuilder); + } }); - stringBuilder.append("\n"); - stringBuilder.append(" ") - .append("**").append(event.getUser().getName()).append("**: ") - .append("Ticket geschlossen"); + String footer = " **" + event.getUser().getName() + "**: Ticket geschlossen"; + if(stringBuilders.getLast().length() + footer.length() > 4090) { + stringBuilders.add(new StringBuilder(footer)); + } else { + stringBuilders.getLast().append(footer); + } EmbedBuilder embedBuilder = new EmbedBuilder(); embedBuilder.setColor(Color.GREEN); @@ -107,11 +118,13 @@ public class DiscordTicketListener extends BasicDiscordListener { embedBuilder.setAuthor(user.getName(), swuser==null?"https://steamwar.de/":("https://steamwar.de/users/" + swuser.getUserName().toLowerCase() + "/"), user.getAvatarUrl()); embedBuilder.setTimestamp(Instant.now()); embedBuilder.setTitle(event.getTextChannel().getName()); - embedBuilder.setDescription(stringBuilder); + stringBuilders.forEach(stringBuilder -> { + embedBuilder.setDescription(stringBuilder.toString()); + MessageBuilder builder = new MessageBuilder(); + builder.setEmbeds(embedBuilder.build()); - builder.setEmbeds(embedBuilder.build()); - - logChannel.sendMessage(builder.build()).complete(); + logChannel.sendMessage(builder.build()).queue(); + }); Message.team("DISCORD_TICKET_CLOSED", event.getTextChannel().getName()); event.getTextChannel().delete().reason("Closed").queue(); From e66990da294c0a7088f77128ad1c2ef161b0ce93 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Tue, 7 Sep 2021 23:55:07 +0200 Subject: [PATCH 10/15] Add Discord Event Teilnahme Signed-off-by: Chaoscaot --- .../bungeecore/bot/SteamwarDiscordBot.java | 1 + .../bungeecore/bot/events/EventManager.java | 22 ++++- .../bot/listeners/DiscordEventListener.java | 95 +++++++++++++++++++ 3 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 src/de/steamwar/bungeecore/bot/listeners/DiscordEventListener.java diff --git a/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java b/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java index 381720e..ba2ff10 100644 --- a/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java +++ b/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java @@ -99,6 +99,7 @@ public class SteamwarDiscordBot { new RolesInteractionButtonListener(); new DiscordTicketListener(); new DiscordAuthListener(); + new DiscordEventListener(); announcementListener = new AnnouncementListener(); ingameChatListener = new IngameChatListener(); serverTeamChatListener = new ServerTeamChatListener(); diff --git a/src/de/steamwar/bungeecore/bot/events/EventManager.java b/src/de/steamwar/bungeecore/bot/events/EventManager.java index d40a80c..506e8b7 100644 --- a/src/de/steamwar/bungeecore/bot/events/EventManager.java +++ b/src/de/steamwar/bungeecore/bot/events/EventManager.java @@ -28,13 +28,22 @@ import de.steamwar.bungeecore.sql.TeamTeilnahme; import lombok.experimental.UtilityClass; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.MessageBuilder; +import net.dv8tion.jda.api.entities.Emoji; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.TextChannel; +import net.dv8tion.jda.api.interactions.components.ActionRow; +import net.dv8tion.jda.api.interactions.components.Button; +import net.dv8tion.jda.api.interactions.components.ComponentLayout; +import net.dv8tion.jda.api.interactions.components.selections.SelectOption; +import net.dv8tion.jda.api.interactions.components.selections.SelectionMenu; import java.awt.*; import java.sql.Timestamp; import java.time.Instant; import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; import java.util.stream.Collectors; @UtilityClass @@ -66,7 +75,12 @@ public class EventManager { embedBuilder.setAuthor("SteamWar", "https://www.steamwar.de"); Timestamp now = Timestamp.from(Instant.now()); - Event.getComing().forEach(event -> { + SelectionMenu.Builder menuBuilder = SelectionMenu.create("eventName"); + menuBuilder.setPlaceholder("Wähle ein Event aus!") + .setMinValues(1) + .setMaxValues(1); + List events = Event.getComing(); + events.forEach(event -> { StringBuilder st = new StringBuilder(); if (event.getDeadline().after(now)) { st.append("Deadline: \n"); @@ -77,10 +91,16 @@ public class EventManager { st.append("\nAngemeldete Teams: ").append(teilname); } embedBuilder.addField(event.getEventName(), st.toString(), false); + if(event.getDeadline().after(Timestamp.from(Instant.now()))) { + menuBuilder.addOption(event.getEventName(), event.getEventID() + "", "An " + event.getEventName() + " teilnehmen", Emoji.fromUnicode("U+1F4DD")); + } }); MessageBuilder messageBuilder = new MessageBuilder(); messageBuilder.setEmbeds(embedBuilder.build()); + if(!events.isEmpty()) { + messageBuilder.setActionRows(ActionRow.of(menuBuilder.build())); + } if (message == null) { message = textChannel.sendMessage(messageBuilder.build()).complete(); } else { diff --git a/src/de/steamwar/bungeecore/bot/listeners/DiscordEventListener.java b/src/de/steamwar/bungeecore/bot/listeners/DiscordEventListener.java new file mode 100644 index 0000000..5c26293 --- /dev/null +++ b/src/de/steamwar/bungeecore/bot/listeners/DiscordEventListener.java @@ -0,0 +1,95 @@ +/* + 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.bot.listeners; + +import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig; +import de.steamwar.bungeecore.sql.Event; +import de.steamwar.bungeecore.sql.SteamwarUser; +import de.steamwar.bungeecore.sql.Team; +import de.steamwar.bungeecore.sql.TeamTeilnahme; +import net.dv8tion.jda.api.events.interaction.SelectionMenuEvent; +import net.dv8tion.jda.api.interactions.components.Component; +import org.jetbrains.annotations.NotNull; + +import java.time.Instant; + +public class DiscordEventListener extends BasicDiscordListener { + + + @Override + public void onSelectionMenu(@NotNull SelectionMenuEvent event) { + if(event.getChannel().getId().equals(SteamwarDiscordBotConfig.EVENTS_CHANNEL) && event.getComponentType() == Component.Type.SELECTION_MENU) { + if(event.getSelectedOptions().isEmpty()) { + event.deferReply(true).queue(); + return; + } + if(event.getSelectedOptions().get(0).getValue().matches("([0-9]+)")) { + SteamwarUser user = SteamwarUser.get(event.getUser().getIdLong()); + if(user == null) { + event.reply("Du hast dein Minecraft nicht verknüpft").setEphemeral(true).queue(); + return; + } + + if(user.getTeam() == 0) { + event.reply("Du bist in keinem Team").setEphemeral(true).queue(); + return; + } + + if(user.isLeader()) { + event.reply("Du bist kein Leader in deinem Team").setEphemeral(true).queue(); + return; + } + + if(Event.get() != null) { + event.reply("Du kannst dich nicht während einem Event an einem Event anmelden").setEphemeral(true).queue(); + return; + } + + Event swEvent = Event.get( + Integer.decode( + event.getSelectedOptions() + .get(0) + .getValue() + ).intValue()); + if(swEvent == null){ + event.reply("Das Event gibt es nicht").setEphemeral(true).queue(); + return; + } + + if(Instant.now().isAfter(swEvent.getDeadline().toInstant())){ + event.reply("Du kannst dich nicht mehr an diesen Event anmelden").setEphemeral(true).queue(); + return; + } + + Team team = Team.get(user.getTeam()); + + if(TeamTeilnahme.nimmtTeil(team.getTeamId(), swEvent.getEventID())){ + TeamTeilnahme.notTeilnehmen(team.getTeamId(), swEvent.getEventID()); + event.reply("Dein Team **" + team.getTeamName() + "** nimmt nun nicht mehr an **" + swEvent.getEventName() + "** teil!").setEphemeral(true).queue(); + }else{ + TeamTeilnahme.teilnehmen(team.getTeamId(), swEvent.getEventID()); + event.reply("Dein Team **" + team.getTeamName() + "** nimmt nun an **" + swEvent.getEventName() + "** teil!").setEphemeral(true).queue(); + } + } else { + event.reply("Lefuq?").setEphemeral(true).queue(); + } + } + } +} From 21dd3e3e0cb8475961a3cf1976d92bcc22919e17 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Wed, 8 Sep 2021 00:57:53 +0200 Subject: [PATCH 11/15] House Keeping Signed-off-by: Chaoscaot --- src/de/steamwar/bungeecore/bot/events/EventManager.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/de/steamwar/bungeecore/bot/events/EventManager.java b/src/de/steamwar/bungeecore/bot/events/EventManager.java index 506e8b7..398f05d 100644 --- a/src/de/steamwar/bungeecore/bot/events/EventManager.java +++ b/src/de/steamwar/bungeecore/bot/events/EventManager.java @@ -32,17 +32,12 @@ import net.dv8tion.jda.api.entities.Emoji; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.TextChannel; import net.dv8tion.jda.api.interactions.components.ActionRow; -import net.dv8tion.jda.api.interactions.components.Button; -import net.dv8tion.jda.api.interactions.components.ComponentLayout; -import net.dv8tion.jda.api.interactions.components.selections.SelectOption; import net.dv8tion.jda.api.interactions.components.selections.SelectionMenu; import java.awt.*; import java.sql.Timestamp; import java.time.Instant; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; From 96f54cf6df537cd99a912ca317a1c8597cc5351b Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Wed, 8 Sep 2021 19:40:59 +0200 Subject: [PATCH 12/15] Simplyfy Int Signed-off-by: Chaoscaot --- .../bungeecore/bot/listeners/DiscordEventListener.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/de/steamwar/bungeecore/bot/listeners/DiscordEventListener.java b/src/de/steamwar/bungeecore/bot/listeners/DiscordEventListener.java index 5c26293..a8a7cbe 100644 --- a/src/de/steamwar/bungeecore/bot/listeners/DiscordEventListener.java +++ b/src/de/steamwar/bungeecore/bot/listeners/DiscordEventListener.java @@ -62,12 +62,7 @@ public class DiscordEventListener extends BasicDiscordListener { return; } - Event swEvent = Event.get( - Integer.decode( - event.getSelectedOptions() - .get(0) - .getValue() - ).intValue()); + Event swEvent = Event.get(Integer.decode(event.getSelectedOptions().get(0).getValue())); if(swEvent == null){ event.reply("Das Event gibt es nicht").setEphemeral(true).queue(); return; From 613b78688aa6baf82d948d7acd1b1d2fe710380f Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Wed, 8 Sep 2021 19:44:40 +0200 Subject: [PATCH 13/15] Add EventManager Update Signed-off-by: Chaoscaot --- .../bungeecore/bot/listeners/DiscordEventListener.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/de/steamwar/bungeecore/bot/listeners/DiscordEventListener.java b/src/de/steamwar/bungeecore/bot/listeners/DiscordEventListener.java index a8a7cbe..da5ac0c 100644 --- a/src/de/steamwar/bungeecore/bot/listeners/DiscordEventListener.java +++ b/src/de/steamwar/bungeecore/bot/listeners/DiscordEventListener.java @@ -20,6 +20,7 @@ package de.steamwar.bungeecore.bot.listeners; import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig; +import de.steamwar.bungeecore.bot.events.EventManager; import de.steamwar.bungeecore.sql.Event; import de.steamwar.bungeecore.sql.SteamwarUser; import de.steamwar.bungeecore.sql.Team; @@ -82,6 +83,8 @@ public class DiscordEventListener extends BasicDiscordListener { TeamTeilnahme.teilnehmen(team.getTeamId(), swEvent.getEventID()); event.reply("Dein Team **" + team.getTeamName() + "** nimmt nun an **" + swEvent.getEventName() + "** teil!").setEphemeral(true).queue(); } + + EventManager.update(); } else { event.reply("Lefuq?").setEphemeral(true).queue(); } From 689538f6c5153b6967f707811d0ead4a316f4d98 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Thu, 9 Sep 2021 21:30:48 +0200 Subject: [PATCH 14/15] Hotfix DiscordBot command integration --- src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java b/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java index ba2ff10..8ff2dfc 100644 --- a/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java +++ b/src/de/steamwar/bungeecore/bot/SteamwarDiscordBot.java @@ -108,7 +108,7 @@ public class SteamwarDiscordBot { jda.retrieveCommands().complete().forEach(command -> jda.deleteCommandById(command.getId()).queue()); Guild guild = jda.getGuildById(SteamwarDiscordBotConfig.GUILD); - guild.retrieveCommands().queue(commands -> commands.forEach(command -> guild.deleteCommandById(command.getId()).queue())); + guild.retrieveCommands().complete().forEach(command -> guild.deleteCommandById(command.getId()).complete()); CommandListUpdateAction commands = jda.getGuildById(SteamwarDiscordBotConfig.GUILD).updateCommands(); addCommand(commands, new MuteCommand()); addCommand(commands, new BanCommand()); @@ -116,7 +116,7 @@ public class SteamwarDiscordBot { addCommand(commands, new TeamCommand()); addCommand(commands, new ListCommand()); addCommand(commands, new UnbanCommand()); - commands.queue(); + commands.complete(); }); } From 2d89d642886c5c47f92fac0bb51ac5ffd781dd36 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Fri, 10 Sep 2021 20:57:19 +0200 Subject: [PATCH 15/15] Hotfix DiscordEventListener --- .../steamwar/bungeecore/bot/listeners/DiscordEventListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/de/steamwar/bungeecore/bot/listeners/DiscordEventListener.java b/src/de/steamwar/bungeecore/bot/listeners/DiscordEventListener.java index da5ac0c..a08f74d 100644 --- a/src/de/steamwar/bungeecore/bot/listeners/DiscordEventListener.java +++ b/src/de/steamwar/bungeecore/bot/listeners/DiscordEventListener.java @@ -53,7 +53,7 @@ public class DiscordEventListener extends BasicDiscordListener { return; } - if(user.isLeader()) { + if(!user.isLeader()) { event.reply("Du bist kein Leader in deinem Team").setEphemeral(true).queue(); return; }