Dieser Commit ist enthalten in:
Ursprung
5f1fb5595e
Commit
877aaea1df
@ -31,6 +31,7 @@ import org.bukkit.Bukkit;
|
|||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
@ -66,6 +67,8 @@ public class Core extends JavaPlugin{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private ErrorHandler errorHandler;
|
private ErrorHandler errorHandler;
|
||||||
|
private File sqlConfig;
|
||||||
|
private boolean standalone;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onLoad() {
|
public void onLoad() {
|
||||||
@ -74,6 +77,8 @@ public class Core extends JavaPlugin{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
|
sqlConfig = new File(Core.getInstance().getDataFolder(), "MySQL.yml");
|
||||||
|
standalone = !sqlConfig.exists();
|
||||||
errorHandler = new ErrorHandler();
|
errorHandler = new ErrorHandler();
|
||||||
|
|
||||||
Bukkit.getPluginManager().registerEvents(new PlayerJoinedEvent(), this);
|
Bukkit.getPluginManager().registerEvents(new PlayerJoinedEvent(), this);
|
||||||
@ -84,7 +89,7 @@ public class Core extends JavaPlugin{
|
|||||||
AuthlibInjector.inject();
|
AuthlibInjector.inject();
|
||||||
TinyProtocol.init();
|
TinyProtocol.init();
|
||||||
try {
|
try {
|
||||||
Bukkit.getLogger().log(Level.INFO, "Running on: " + new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("hostname").getInputStream())).readLine());
|
getLogger().log(Level.INFO, "Running on: " + new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("hostname").getInputStream())).readLine());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new SecurityException("Could not load Hostname", e);
|
throw new SecurityException("Could not load Hostname", e);
|
||||||
}
|
}
|
||||||
@ -97,6 +102,14 @@ public class Core extends JavaPlugin{
|
|||||||
Statement.close();
|
Statement.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static File sqlConfig() {
|
||||||
|
return instance.sqlConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean standalone() {
|
||||||
|
return instance.standalone;
|
||||||
|
}
|
||||||
|
|
||||||
public static Core getInstance() {
|
public static Core getInstance() {
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
@ -23,28 +23,11 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class BauweltMember{
|
public class BauweltMember {
|
||||||
|
private static final List<BauweltMember> memberCache = new ArrayList<>();
|
||||||
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 final boolean worldEdit;
|
|
||||||
private final boolean world;
|
|
||||||
|
|
||||||
private static final List<BauweltMember> members = new ArrayList<>();
|
|
||||||
|
|
||||||
public static void clear() {
|
public static void clear() {
|
||||||
members.clear();
|
memberCache.clear();
|
||||||
}
|
|
||||||
|
|
||||||
private BauweltMember(int ownerID, int memberID, boolean worldEdit, boolean world) {
|
|
||||||
bauweltID = ownerID;
|
|
||||||
this.memberID = memberID;
|
|
||||||
this.worldEdit = worldEdit;
|
|
||||||
this.world = world;
|
|
||||||
members.add(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BauweltMember getBauMember(UUID ownerID, UUID memberID){
|
public static BauweltMember getBauMember(UUID ownerID, UUID memberID){
|
||||||
@ -52,14 +35,10 @@ public class BauweltMember{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static BauweltMember getBauMember(int ownerID, int memberID){
|
public static BauweltMember getBauMember(int ownerID, int memberID){
|
||||||
for(BauweltMember member : members)
|
for(BauweltMember member : memberCache)
|
||||||
if(member.memberID == memberID)
|
if(member.getMemberID() == memberID)
|
||||||
return member;
|
return member;
|
||||||
return getMember.select(rs -> {
|
return Provider.impl.getBauMember(ownerID, memberID);
|
||||||
if(!rs.next())
|
|
||||||
return null;
|
|
||||||
return new BauweltMember(ownerID, memberID, rs.getBoolean("WorldEdit"), rs.getBoolean("World"));
|
|
||||||
}, ownerID, memberID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<BauweltMember> getMembers(UUID bauweltID){
|
public static List<BauweltMember> getMembers(UUID bauweltID){
|
||||||
@ -67,12 +46,20 @@ public class BauweltMember{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static List<BauweltMember> getMembers(int bauweltID){
|
public static List<BauweltMember> getMembers(int bauweltID){
|
||||||
return getMembers.select(rs -> {
|
return Provider.impl.getMembers(bauweltID);
|
||||||
List<BauweltMember> members = new ArrayList<>();
|
}
|
||||||
while(rs.next())
|
|
||||||
members.add(new BauweltMember(bauweltID, rs.getInt("MemberID"), rs.getBoolean("WorldEdit"), rs.getBoolean("World")));
|
private final int bauweltID;
|
||||||
return members;
|
private final int memberID;
|
||||||
}, bauweltID);
|
private final boolean worldEdit;
|
||||||
|
private final boolean world;
|
||||||
|
|
||||||
|
public BauweltMember(int bauweltID, int memberID, boolean worldEdit, boolean world) {
|
||||||
|
this.bauweltID = bauweltID;
|
||||||
|
this.memberID = memberID;
|
||||||
|
this.worldEdit = worldEdit;
|
||||||
|
this.world = world;
|
||||||
|
memberCache.add(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getBauweltID() {
|
public int getBauweltID() {
|
||||||
|
@ -20,45 +20,17 @@
|
|||||||
package de.steamwar.sql;
|
package de.steamwar.sql;
|
||||||
|
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class CheckedSchematic {
|
public class CheckedSchematic {
|
||||||
|
|
||||||
private static final Statement checkHistory = new Statement("SELECT * FROM CheckedSchematic WHERE NodeId IN (SELECT NodeId FROM SchematicNode WHERE NodeOwner = ?) AND DeclineReason != '' AND DeclineReason != 'Prüfvorgang abgebrochen' AND NodeId is not NULL ORDER BY EndTime DESC");
|
|
||||||
private static final Statement nodeHistory = new Statement("SELECT * FROM CheckedSchematic WHERE NodeId = ? AND DeclineReason != '' AND DeclineReason != 'Prüfvorgang abgebrochen' ORDER BY EndTime DESC");
|
|
||||||
|
|
||||||
private final Integer node;
|
|
||||||
private final int validator;
|
|
||||||
private final Timestamp startTime;
|
|
||||||
private final Timestamp endTime;
|
|
||||||
private final String declineReason;
|
|
||||||
|
|
||||||
private CheckedSchematic(int node, int validator, Timestamp startTime, Timestamp endTime, String declineReason){
|
|
||||||
this.node = node;
|
|
||||||
this.validator = validator;
|
|
||||||
this.startTime = startTime;
|
|
||||||
this.endTime = endTime;
|
|
||||||
this.declineReason = declineReason;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static List<CheckedSchematic> getLastDeclinedOfNode(SchematicNode node){
|
public static List<CheckedSchematic> getLastDeclinedOfNode(SchematicNode node){
|
||||||
return getLastDeclinedOfNode(node.getId());
|
return getLastDeclinedOfNode(node.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<CheckedSchematic> getLastDeclinedOfNode(int node){
|
public static List<CheckedSchematic> getLastDeclinedOfNode(int node){
|
||||||
return nodeHistory.select(rs -> {
|
return Provider.impl.getLastDeclinedOfNode(node);
|
||||||
List<CheckedSchematic> lastDeclined = new ArrayList<>();
|
|
||||||
while(rs.next()){
|
|
||||||
int validator = rs.getInt("Validator");
|
|
||||||
Timestamp startTime = rs.getTimestamp("StartTime");
|
|
||||||
Timestamp endTime = rs.getTimestamp("EndTime");
|
|
||||||
String declineReason = rs.getString("DeclineReason");
|
|
||||||
lastDeclined.add(new CheckedSchematic(node, validator, startTime, endTime, declineReason));
|
|
||||||
}
|
|
||||||
return lastDeclined;
|
|
||||||
}, node);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<CheckedSchematic> getLastDeclined(UUID uuid){
|
public static List<CheckedSchematic> getLastDeclined(UUID uuid){
|
||||||
@ -66,12 +38,21 @@ public class CheckedSchematic {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static List<CheckedSchematic> getLastDelined(int schemOwner){
|
public static List<CheckedSchematic> getLastDelined(int schemOwner){
|
||||||
return checkHistory.select(rs -> {
|
return Provider.impl.getLastDelined(schemOwner);
|
||||||
List<CheckedSchematic> history = new ArrayList<>();
|
}
|
||||||
while(rs.next())
|
|
||||||
history.add(new CheckedSchematic(rs.getInt("NodeId"), rs.getInt("Validator"), rs.getTimestamp("StartTime"), rs.getTimestamp("EndTime"), rs.getString("DeclineReason")));
|
private final Integer node;
|
||||||
return history;
|
private final int validator;
|
||||||
}, schemOwner);
|
private final Timestamp startTime;
|
||||||
|
private final Timestamp endTime;
|
||||||
|
private final String declineReason;
|
||||||
|
|
||||||
|
public CheckedSchematic(Integer node, int validator, Timestamp startTime, Timestamp endTime, String declineReason) {
|
||||||
|
this.node = node;
|
||||||
|
this.validator = validator;
|
||||||
|
this.startTime = startTime;
|
||||||
|
this.endTime = endTime;
|
||||||
|
this.declineReason = declineReason;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getValidator() {
|
public int getValidator() {
|
||||||
|
@ -22,18 +22,11 @@ package de.steamwar.sql;
|
|||||||
public class Elo {
|
public class Elo {
|
||||||
private Elo(){}
|
private Elo(){}
|
||||||
|
|
||||||
private static final Statement get = new Statement("SELECT Elo FROM Elo WHERE UserID = ? AND GameMode = ?");
|
|
||||||
private static final Statement set = new Statement("INSERT INTO Elo (UserID, GameMode, Elo) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE Elo = VALUES(Elo)");
|
|
||||||
|
|
||||||
public static int getElo(int userId, String gameMode){
|
public static int getElo(int userId, String gameMode){
|
||||||
return get.select(rs -> {
|
return Provider.impl.getElo(userId, gameMode);
|
||||||
if(rs.next())
|
|
||||||
return rs.getInt("Elo");
|
|
||||||
return 1000;
|
|
||||||
}, userId, gameMode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setElo(int userId, String gameMode, int elo){
|
public static void setElo(int userId, String gameMode, int elo){
|
||||||
set.update(userId, gameMode, elo);
|
Provider.impl.setElo(userId, gameMode, elo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,13 +19,13 @@
|
|||||||
|
|
||||||
package de.steamwar.sql;
|
package de.steamwar.sql;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
|
|
||||||
public class Event {
|
public class Event {
|
||||||
|
|
||||||
private static final Statement get = new Statement("SELECT * FROM Event WHERE EventID = ?");
|
public static Event get(int eventID){
|
||||||
|
return Provider.impl.getEvent(eventID);
|
||||||
|
}
|
||||||
|
|
||||||
private final int eventID;
|
private final int eventID;
|
||||||
private final String eventName;
|
private final String eventName;
|
||||||
@ -35,21 +35,14 @@ public class Event {
|
|||||||
private final boolean publicSchemsOnly;
|
private final boolean publicSchemsOnly;
|
||||||
private final boolean spectateSystem;
|
private final boolean spectateSystem;
|
||||||
|
|
||||||
private Event(ResultSet rs) throws SQLException{
|
public Event(int eventID, String eventName, Timestamp start, Timestamp end, int maximumTeamMembers, boolean publicSchemsOnly, boolean spectateSystem) {
|
||||||
this.eventID = rs.getInt("EventID");
|
this.eventID = eventID;
|
||||||
this.eventName = rs.getString("EventName");
|
this.eventName = eventName;
|
||||||
this.start = rs.getTimestamp("Start");
|
this.start = start;
|
||||||
this.end = rs.getTimestamp("End");
|
this.end = end;
|
||||||
this.maximumTeamMembers = rs.getInt("MaximumTeamMembers");
|
this.maximumTeamMembers = maximumTeamMembers;
|
||||||
this.publicSchemsOnly = rs.getBoolean("PublicSchemsOnly");
|
this.publicSchemsOnly = publicSchemsOnly;
|
||||||
this.spectateSystem = rs.getBoolean("SpectateSystem");
|
this.spectateSystem = spectateSystem;
|
||||||
}
|
|
||||||
|
|
||||||
public static Event get(int eventID){
|
|
||||||
return get.select(rs -> {
|
|
||||||
rs.next();
|
|
||||||
return new Event(rs);
|
|
||||||
}, eventID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getEventID() {
|
public int getEventID() {
|
||||||
|
@ -19,14 +19,13 @@
|
|||||||
|
|
||||||
package de.steamwar.sql;
|
package de.steamwar.sql;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
import java.util.function.BiConsumer;
|
||||||
import java.sql.SQLException;
|
|
||||||
|
|
||||||
public class EventFight {
|
public class EventFight {
|
||||||
|
|
||||||
private static final Statement get = new Statement("SELECT * FROM EventFight WHERE FightID = ?");
|
public static EventFight get(int fightID) {
|
||||||
private static final Statement setResult = new Statement("UPDATE EventFight SET Ergebnis = ? WHERE FightID = ?");
|
return Provider.impl.getEventFight(fightID);
|
||||||
private static final Statement setFight = new Statement("UPDATE EventFight SET Fight = ? WHERE FightID = ?");
|
}
|
||||||
|
|
||||||
private final int eventID;
|
private final int eventID;
|
||||||
private final int fightID;
|
private final int fightID;
|
||||||
@ -34,30 +33,27 @@ public class EventFight {
|
|||||||
private final int teamRed;
|
private final int teamRed;
|
||||||
private final int kampfleiter;
|
private final int kampfleiter;
|
||||||
private final int ergebnis;
|
private final int ergebnis;
|
||||||
|
private final BiConsumer<EventFight, Integer> setErgebnis;
|
||||||
|
private final BiConsumer<EventFight, Integer> setFight;
|
||||||
|
|
||||||
private EventFight(ResultSet rs) throws SQLException{
|
public EventFight(int eventID, int fightID, int teamBlue, int teamRed, int kampfleiter, int ergebnis, BiConsumer<EventFight, Integer> setErgebnis, BiConsumer<EventFight, Integer> setFight) {
|
||||||
this.eventID = rs.getInt("EventID");
|
this.eventID = eventID;
|
||||||
this.fightID = rs.getInt("FightID");
|
this.fightID = fightID;
|
||||||
this.teamBlue = rs.getInt("TeamBlue");
|
this.teamBlue = teamBlue;
|
||||||
this.teamRed = rs.getInt("TeamRed");
|
this.teamRed = teamRed;
|
||||||
this.kampfleiter = rs.getInt("Kampfleiter");
|
this.kampfleiter = kampfleiter;
|
||||||
this.ergebnis = rs.getInt("Ergebnis");
|
this.ergebnis = ergebnis;
|
||||||
}
|
this.setErgebnis = setErgebnis;
|
||||||
|
this.setFight = setFight;
|
||||||
public static EventFight get(int fightID){
|
|
||||||
return get.select(rs -> {
|
|
||||||
rs.next();
|
|
||||||
return new EventFight(rs);
|
|
||||||
}, fightID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setErgebnis(int winner){
|
public void setErgebnis(int winner){
|
||||||
setResult.update(winner, fightID);
|
setErgebnis.accept(this, winner);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFight(int fight){
|
public void setFight(int fight){
|
||||||
//Fight.FightID, not EventFight.FightID
|
//Fight.FightID, not EventFight.FightID
|
||||||
setFight.update(fight, fightID);
|
setFight.accept(this, fight);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getTeamBlue() {
|
public int getTeamBlue() {
|
||||||
|
@ -27,32 +27,19 @@ import java.util.function.Consumer;
|
|||||||
public class Fight {
|
public class Fight {
|
||||||
private Fight(){}
|
private Fight(){}
|
||||||
|
|
||||||
private static final Statement create = new Statement("INSERT INTO Fight (GameMode, Server, StartTime, Duration, BlueLeader, RedLeader, BlueSchem, RedSchem, Win, WinCondition, ReplayLock) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
|
||||||
private static final Statement lastId = new Statement("SELECT LAST_INSERT_ID() AS FightID");
|
|
||||||
private static final Statement getReplay = new Statement("SELECT Replay FROM Fight WHERE FightID = ?");
|
|
||||||
private static final Statement setReplay = new Statement("UPDATE Fight SET Replay = ? WHERE FightID = ?");
|
|
||||||
|
|
||||||
public static int create(String gamemode, String server, Timestamp starttime, int duration, int blueleader, int redleader, Integer blueschem, Integer redschem, int win, String wincondition){
|
public static int create(String gamemode, String server, Timestamp starttime, int duration, int blueleader, int redleader, Integer blueschem, Integer redschem, int win, String wincondition){
|
||||||
return create(gamemode, server, starttime, duration, blueleader, redleader, blueschem, redschem, win, wincondition, Timestamp.from(Instant.now()));
|
return create(gamemode, server, starttime, duration, blueleader, redleader, blueschem, redschem, win, wincondition, Timestamp.from(Instant.now()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int create(String gamemode, String server, Timestamp starttime, int duration, int blueleader, int redleader, Integer blueschem, Integer redschem, int win, String wincondition, Timestamp replayLock){
|
public static int create(String gamemode, String server, Timestamp starttime, int duration, int blueleader, int redleader, Integer blueschem, Integer redschem, int win, String wincondition, Timestamp replayLock){
|
||||||
create.update(gamemode, server, starttime, duration, blueleader, redleader, blueschem, redschem, win, wincondition, replayLock);
|
return Provider.impl.createFight(gamemode, server, starttime, duration, blueleader, redleader, blueschem, redschem, win, wincondition, replayLock);
|
||||||
return lastId.select(rs -> {
|
|
||||||
rs.next();
|
|
||||||
return rs.getInt("FightID");
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void getReplay(int fightID, Consumer<InputStream> reader) {
|
public static void getReplay(int fightID, Consumer<InputStream> reader) {
|
||||||
getReplay.select(rs -> {
|
Provider.impl.getReplay(fightID, reader);
|
||||||
rs.next();
|
|
||||||
reader.accept(rs.getBinaryStream("Replay"));
|
|
||||||
return null;
|
|
||||||
}, fightID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setReplay(int fightID, InputStream data) {
|
public static void setReplay(int fightID, InputStream data) {
|
||||||
setReplay.update(data, fightID);
|
Provider.impl.setReplay(fightID, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,9 +22,7 @@ package de.steamwar.sql;
|
|||||||
public class FightPlayer {
|
public class FightPlayer {
|
||||||
private FightPlayer(){}
|
private FightPlayer(){}
|
||||||
|
|
||||||
private static final Statement create = new Statement("INSERT INTO FightPlayer (FightID, UserID, Team, Kit, Kills, IsOut) VALUES (?, ?, ?, ?, ?, ?)");
|
|
||||||
|
|
||||||
public static void create(int fightID, int userID, boolean blue, String kit, int kills, boolean isOut){
|
public static void create(int fightID, int userID, boolean blue, String kit, int kills, boolean isOut){
|
||||||
create.update(fightID, userID, blue ? 1 : 2, kit, kills, isOut);
|
Provider.impl.createFightPlayer(fightID, userID, blue, kit, kills, isOut);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,8 +26,7 @@ import java.security.NoSuchAlgorithmException;
|
|||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
|
||||||
public class NodeDownload {
|
public class NodeDownload {
|
||||||
|
private NodeDownload() {}
|
||||||
private static final Statement createLink = new Statement("INSERT INTO NodeDownload (NodeId, Link) VALUES (?, ?) ON DUPLICATE KEY UPDATE Link = VALUES(Link)");
|
|
||||||
|
|
||||||
private static final String BASE = "https://steamwar.de/download.php?schem=";
|
private static final String BASE = "https://steamwar.de/download.php?schem=";
|
||||||
|
|
||||||
@ -43,7 +42,7 @@ public class NodeDownload {
|
|||||||
digest.reset();
|
digest.reset();
|
||||||
digest.update((Instant.now().toString() + schem.getOwner() + schem.getId()).getBytes());
|
digest.update((Instant.now().toString() + schem.getOwner() + schem.getId()).getBytes());
|
||||||
String hash = BaseEncoding.base16().encode(digest.digest());
|
String hash = BaseEncoding.base16().encode(digest.digest());
|
||||||
createLink.update(schem.getId(), hash);
|
Provider.impl.createDownloadLink(schem.getId(), hash);
|
||||||
return BASE + hash;
|
return BASE + hash;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
51
SpigotCore_Main/src/de/steamwar/sql/Provider.java
Normale Datei
51
SpigotCore_Main/src/de/steamwar/sql/Provider.java
Normale Datei
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2022 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.sql;
|
||||||
|
|
||||||
|
import de.steamwar.core.Core;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public interface Provider {
|
||||||
|
Provider impl = Core.standalone() ? new StandaloneProvider() : new SQLProvider();
|
||||||
|
|
||||||
|
BauweltMember getBauMember(int ownerID, int memberID);
|
||||||
|
List<BauweltMember> getMembers(int bauweltID);
|
||||||
|
|
||||||
|
List<CheckedSchematic> getLastDeclinedOfNode(int node);
|
||||||
|
List<CheckedSchematic> getLastDelined(int schemOwner);
|
||||||
|
|
||||||
|
int getElo(int userId, String gameMode);
|
||||||
|
void setElo(int userId, String gameMode, int elo);
|
||||||
|
|
||||||
|
Event getEvent(int eventID);
|
||||||
|
EventFight getEventFight(int fightID);
|
||||||
|
|
||||||
|
int createFight(String gamemode, String server, Timestamp starttime, int duration, int blueleader, int redleader, Integer blueschem, Integer redschem, int win, String wincondition, Timestamp replayLock);
|
||||||
|
void getReplay(int fightID, Consumer<InputStream> reader);
|
||||||
|
void setReplay(int fightID, InputStream data);
|
||||||
|
|
||||||
|
void createFightPlayer(int fightID, int userID, boolean blue, String kit, int kills, boolean isOut);
|
||||||
|
|
||||||
|
void createDownloadLink(int nodeId, String hash);
|
||||||
|
}
|
157
SpigotCore_Main/src/de/steamwar/sql/SQLProvider.java
Normale Datei
157
SpigotCore_Main/src/de/steamwar/sql/SQLProvider.java
Normale Datei
@ -0,0 +1,157 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2022 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.sql;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public class SQLProvider implements Provider {
|
||||||
|
|
||||||
|
private static final Statement getMember = new Statement("SELECT * FROM BauweltMember WHERE BauweltID = ? AND MemberID = ?");
|
||||||
|
@Override
|
||||||
|
public BauweltMember getBauMember(int ownerID, int memberID) {
|
||||||
|
return getMember.select(rs -> rs.next() ? newBauweltMember(rs) : null, ownerID, memberID);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Statement getMembers = new Statement("SELECT * FROM BauweltMember WHERE BauweltID = ?");
|
||||||
|
@Override
|
||||||
|
public List<BauweltMember> getMembers(int bauweltID) {
|
||||||
|
return getMembers.select(rs -> {
|
||||||
|
List<BauweltMember> members = new ArrayList<>();
|
||||||
|
while(rs.next())
|
||||||
|
members.add(newBauweltMember(rs));
|
||||||
|
return members;
|
||||||
|
}, bauweltID);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BauweltMember newBauweltMember(ResultSet rs) throws SQLException {
|
||||||
|
return new BauweltMember(rs.getInt("BauweltID"), rs.getInt("MemberID"), rs.getBoolean("WorldEdit"), rs.getBoolean("World"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Statement nodeHistory = new Statement("SELECT * FROM CheckedSchematic WHERE NodeId = ? AND DeclineReason != '' AND DeclineReason != 'Prüfvorgang abgebrochen' ORDER BY EndTime DESC");
|
||||||
|
@Override
|
||||||
|
public List<CheckedSchematic> getLastDeclinedOfNode(int node) {
|
||||||
|
return nodeHistory.select(rs -> {
|
||||||
|
List<CheckedSchematic> lastDeclined = new ArrayList<>();
|
||||||
|
while(rs.next())
|
||||||
|
lastDeclined.add(newCheckedSchematic(rs));
|
||||||
|
return lastDeclined;
|
||||||
|
}, node);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Statement checkHistory = new Statement("SELECT * FROM CheckedSchematic WHERE NodeId IN (SELECT NodeId FROM SchematicNode WHERE NodeOwner = ?) AND DeclineReason != '' AND DeclineReason != 'Prüfvorgang abgebrochen' AND NodeId is not NULL ORDER BY EndTime DESC");
|
||||||
|
@Override
|
||||||
|
public List<CheckedSchematic> getLastDelined(int schemOwner) {
|
||||||
|
return checkHistory.select(rs -> {
|
||||||
|
List<CheckedSchematic> history = new ArrayList<>();
|
||||||
|
while(rs.next())
|
||||||
|
history.add(newCheckedSchematic(rs));
|
||||||
|
return history;
|
||||||
|
}, schemOwner);
|
||||||
|
}
|
||||||
|
|
||||||
|
private CheckedSchematic newCheckedSchematic(ResultSet rs) throws SQLException {
|
||||||
|
return new CheckedSchematic(rs.getInt("NodeId"), rs.getInt("Validator"), rs.getTimestamp("StartTime"), rs.getTimestamp("EndTime"), rs.getString("DeclineReason"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Statement getElo = new Statement("SELECT Elo FROM Elo WHERE UserID = ? AND GameMode = ?");
|
||||||
|
@Override
|
||||||
|
public int getElo(int userId, String gameMode) {
|
||||||
|
return getElo.select(rs -> {
|
||||||
|
if(rs.next())
|
||||||
|
return rs.getInt("Elo");
|
||||||
|
return 1000;
|
||||||
|
}, userId, gameMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Statement setElo = new Statement("INSERT INTO Elo (UserID, GameMode, Elo) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE Elo = VALUES(Elo)");
|
||||||
|
@Override
|
||||||
|
public void setElo(int userId, String gameMode, int elo) {
|
||||||
|
setElo.update(userId, gameMode, elo);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Statement getEvent = new Statement("SELECT * FROM Event WHERE EventID = ?");
|
||||||
|
@Override
|
||||||
|
public Event getEvent(int eventID) {
|
||||||
|
return getEvent.select(rs -> {
|
||||||
|
rs.next();
|
||||||
|
return new Event(rs.getInt("EventID"), rs.getString("EventName"), rs.getTimestamp("Start"), rs.getTimestamp("End"), rs.getInt("MaximumTeamMembers"), rs.getBoolean("PublicSchemsOnly"), rs.getBoolean("SpectateSystem"));
|
||||||
|
}, eventID);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Statement getEventFight = new Statement("SELECT * FROM EventFight WHERE FightID = ?");
|
||||||
|
private static final Statement setEventFightResult = new Statement("UPDATE EventFight SET Ergebnis = ? WHERE FightID = ?");
|
||||||
|
private static final Statement setEventFightFightID = new Statement("UPDATE EventFight SET Fight = ? WHERE FightID = ?");
|
||||||
|
@Override
|
||||||
|
public EventFight getEventFight(int fightID) {
|
||||||
|
return getEventFight.select(rs -> {
|
||||||
|
rs.next();
|
||||||
|
return new EventFight(
|
||||||
|
rs.getInt("EventID"), rs.getInt("FightID"), rs.getInt("TeamBlue"), rs.getInt("TeamRed"), rs.getInt("Kampfleiter"), rs.getInt("Ergebnis"),
|
||||||
|
(eventFight, winner) -> setEventFightResult.update(winner, eventFight.getFightID()),
|
||||||
|
(eventFight, fight) -> setEventFightFightID.update(fight, eventFight.getFightID())
|
||||||
|
);
|
||||||
|
}, fightID);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Statement createFight = new Statement("INSERT INTO Fight (GameMode, Server, StartTime, Duration, BlueLeader, RedLeader, BlueSchem, RedSchem, Win, WinCondition, ReplayLock) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||||
|
private static final Statement getLastFightID = new Statement("SELECT LAST_INSERT_ID() AS FightID");
|
||||||
|
@Override
|
||||||
|
public int createFight(String gamemode, String server, Timestamp starttime, int duration, int blueleader, int redleader, Integer blueschem, Integer redschem, int win, String wincondition, Timestamp replayLock) {
|
||||||
|
createFight.update(gamemode, server, starttime, duration, blueleader, redleader, blueschem, redschem, win, wincondition, replayLock);
|
||||||
|
return getLastFightID.select(rs -> {
|
||||||
|
rs.next();
|
||||||
|
return rs.getInt("FightID");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Statement getReplay = new Statement("SELECT Replay FROM Fight WHERE FightID = ?");
|
||||||
|
@Override
|
||||||
|
public void getReplay(int fightID, Consumer<InputStream> reader) {
|
||||||
|
getReplay.select(rs -> {
|
||||||
|
rs.next();
|
||||||
|
reader.accept(rs.getBinaryStream("Replay"));
|
||||||
|
return null;
|
||||||
|
}, fightID);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Statement setReplay = new Statement("UPDATE Fight SET Replay = ? WHERE FightID = ?");
|
||||||
|
@Override
|
||||||
|
public void setReplay(int fightID, InputStream data) {
|
||||||
|
setReplay.update(data, fightID);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Statement create = new Statement("INSERT INTO FightPlayer (FightID, UserID, Team, Kit, Kills, IsOut) VALUES (?, ?, ?, ?, ?, ?)");
|
||||||
|
@Override
|
||||||
|
public void createFightPlayer(int fightID, int userID, boolean blue, String kit, int kills, boolean isOut) {
|
||||||
|
create.update(fightID, userID, blue ? 1 : 2, kit, kills, isOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Statement createLink = new Statement("INSERT INTO NodeDownload (NodeId, Link) VALUES (?, ?) ON DUPLICATE KEY UPDATE Link = VALUES(Link)");
|
||||||
|
@Override
|
||||||
|
public void createDownloadLink(int nodeId, String hash) {
|
||||||
|
createLink.update(nodeId, hash);
|
||||||
|
}
|
||||||
|
}
|
91
SpigotCore_Main/src/de/steamwar/sql/StandaloneProvider.java
Normale Datei
91
SpigotCore_Main/src/de/steamwar/sql/StandaloneProvider.java
Normale Datei
@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2022 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.sql;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.OfflinePlayer;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class StandaloneProvider implements Provider {
|
||||||
|
@Override
|
||||||
|
public BauweltMember getBauMember(int ownerID, int memberID) {
|
||||||
|
OfflinePlayer player = Bukkit.getOfflinePlayer(SteamwarUser.get(memberID).getUUID());
|
||||||
|
return new BauweltMember(ownerID, memberID, player.isOp(), player.isOp());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<BauweltMember> getMembers(int bauweltID) {
|
||||||
|
return Bukkit.getOnlinePlayers().stream().map(player -> getBauMember(bauweltID, SteamwarUser.get(player.getUniqueId()).getId())).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<CheckedSchematic> getLastDeclinedOfNode(int node) {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<CheckedSchematic> getLastDelined(int schemOwner) {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getElo(int userId, String gameMode) {
|
||||||
|
return 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setElo(int userId, String gameMode, int elo) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Event getEvent(int eventID) {
|
||||||
|
return new Event(eventID, "DummyEvent", Timestamp.from(Instant.now()), Timestamp.from(Instant.now()), 6, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EventFight getEventFight(int fightID) {
|
||||||
|
return new EventFight(0, fightID, 0, 0, 0, 0, (eventFight, winner) -> {}, (eventFight, fightId) -> {});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int createFight(String gamemode, String server, Timestamp starttime, int duration, int blueleader, int redleader, Integer blueschem, Integer redschem, int win, String wincondition, Timestamp replayLock) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void getReplay(int fightID, Consumer<InputStream> reader) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setReplay(int fightID, InputStream data) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createFightPlayer(int fightID, int userID, boolean blue, String kit, int kills, boolean isOut) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createDownloadLink(int nodeId, String hash) {}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -40,7 +40,7 @@ public class Statement {
|
|||||||
private static final List<Statement> statements = new ArrayList<>();
|
private static final List<Statement> statements = new ArrayList<>();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
File file = new File(Core.getInstance().getDataFolder(), "MySQL.yml");
|
File file = Core.sqlConfig();
|
||||||
YamlConfiguration config = YamlConfiguration.loadConfiguration(file);
|
YamlConfiguration config = YamlConfiguration.loadConfiguration(file);
|
||||||
|
|
||||||
if(!file.exists())
|
if(!file.exists())
|
||||||
@ -63,10 +63,12 @@ public class Statement {
|
|||||||
|
|
||||||
public static void close() {
|
public static void close() {
|
||||||
for (Statement statement : statements) {
|
for (Statement statement : statements) {
|
||||||
try {
|
if (statement.st != null) {
|
||||||
statement.st.close();
|
try {
|
||||||
} catch (SQLException e) {
|
statement.st.close();
|
||||||
Core.getInstance().getLogger().log(Level.INFO, "Could not close statement", e);
|
} catch (SQLException e) {
|
||||||
|
Core.getInstance().getLogger().log(Level.INFO, "Could not close statement", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,14 +82,6 @@ public class Statement {
|
|||||||
private static void reset() {
|
private static void reset() {
|
||||||
close();
|
close();
|
||||||
connect();
|
connect();
|
||||||
|
|
||||||
try {
|
|
||||||
for (Statement statement : statements) {
|
|
||||||
statement.init();
|
|
||||||
}
|
|
||||||
} catch (SQLException ex) {
|
|
||||||
throw new SecurityException("Could not reprepare SQL Statements", ex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean connectionStable() {
|
public static boolean connectionStable() {
|
||||||
@ -101,31 +95,22 @@ public class Statement {
|
|||||||
private final String sql;
|
private final String sql;
|
||||||
private PreparedStatement st;
|
private PreparedStatement st;
|
||||||
|
|
||||||
Statement(String sql) {
|
public Statement(String sql) {
|
||||||
this.sql = sql;
|
this.sql = sql;
|
||||||
try {
|
|
||||||
init();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
throw new SecurityException("Could not init statement", e);
|
|
||||||
}
|
|
||||||
statements.add(this);
|
statements.add(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void init() throws SQLException {
|
public <T> T select(ResultSetUser<T> user, Object... objects) {
|
||||||
st = con.prepareStatement(sql);
|
|
||||||
}
|
|
||||||
|
|
||||||
<T> T select(ResultSetUser<T> user, Object... objects) {
|
|
||||||
return prepare(() -> {
|
return prepare(() -> {
|
||||||
ResultSet rs = st.executeQuery();
|
ResultSet rs = getSt().executeQuery();
|
||||||
T result = user.use(rs);
|
T result = user.use(rs);
|
||||||
rs.close();
|
rs.close();
|
||||||
return result;
|
return result;
|
||||||
}, objects);
|
}, objects);
|
||||||
}
|
}
|
||||||
|
|
||||||
void update(Object... objects) {
|
public void update(Object... objects) {
|
||||||
prepare(st::executeUpdate, objects);
|
prepare(getSt()::executeUpdate, objects);
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized <T> T prepare(SQLRunnable<T> runnable, Object... objects) {
|
private synchronized <T> T prepare(SQLRunnable<T> runnable, Object... objects) {
|
||||||
@ -143,13 +128,24 @@ public class Statement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private PreparedStatement getSt() {
|
||||||
|
if(st == null) {
|
||||||
|
try {
|
||||||
|
st = con.prepareStatement(sql);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new SecurityException("Could not prepare statement", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return st;
|
||||||
|
}
|
||||||
|
|
||||||
private void setObjects(Object... objects) throws SQLException {
|
private void setObjects(Object... objects) throws SQLException {
|
||||||
for (int i = 0; i < objects.length; i++) {
|
for (int i = 0; i < objects.length; i++) {
|
||||||
st.setObject(i + 1, objects[i]);
|
getSt().setObject(i + 1, objects[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ResultSetUser<T> {
|
public interface ResultSetUser<T> {
|
||||||
T use(ResultSet rs) throws SQLException;
|
T use(ResultSet rs) throws SQLException;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren