SteamWar/BungeeCore
Archiviert
13
2
Dieser Commit ist enthalten in:
Chaoscaot 2021-07-18 19:40:53 +02:00
Ursprung 763a27e7ba
Commit 5576d1e3ca
2 geänderte Dateien mit 190 neuen und 117 gelöschten Zeilen

Datei anzeigen

@ -72,7 +72,7 @@ public class CheckCommand extends BasicCommand {
}, 10, 10, TimeUnit.MINUTES); }, 10, 10, TimeUnit.MINUTES);
} }
public static void sendReminder(ProxiedPlayer player) { public static void sendReminder(ProxiedPlayer player) {
List<Schematic> schematics = getSchemsToCheck(); List<SchematicNode> schematics = getSchemsToCheck();
if(schematics.size() != currentCheckers.size()) if(schematics.size() != currentCheckers.size())
Message.send("CHECK_REMINDER", player, "CHECK_REMINDER_HOVER", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/check list"), schematics.size() - currentCheckers.size()); Message.send("CHECK_REMINDER", player, "CHECK_REMINDER_HOVER", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/check list"), schematics.size() - currentCheckers.size());
} }
@ -230,8 +230,8 @@ public class CheckCommand extends BasicCommand {
ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> { ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> {
BauCommand.stopBauserver(checker); BauCommand.stopBauserver(checker);
ArenaMode mode = ArenaMode.getByCheckSchemType(schematic.getSchemType().toDB()); ArenaMode mode = ArenaMode.getBySchemType(schematic.getSchemtype());
SubserverSystem.startTestServer(checker, mode, FightCommand.getMap(checker, mode, "Random"), schematic.getSchemID()); SubserverSystem.startTestServer(checker, mode, FightCommand.getMap(checker, mode, "Random"), schematic.getId(), 0);
currentCheckers.put(checker.getUniqueId(), this); currentCheckers.put(checker.getUniqueId(), this);
currentSchems.put(schematic.getId(), this); currentSchems.put(schematic.getId(), this);
for(CheckedSchematic previous : CheckedSchematic.previousChecks(schematic.getId())) for(CheckedSchematic previous : CheckedSchematic.previousChecks(schematic.getId()))

Datei anzeigen

@ -1,27 +1,31 @@
/* /*
This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
*
Copyright (C) 2020 SteamWar.de-Serverteam * Copyright (C) 2020 SteamWar.de-Serverteam
*
This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. * (at your option) any later version.
*
This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
*
You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bungeecore.sql; package de.steamwar.bungeecore.sql;
import java.sql.Blob;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Timestamp;
import java.time.Instant;
import java.util.*; import java.util.*;
import java.util.function.Predicate;
public class SchematicNode { public class SchematicNode {
@ -34,59 +38,33 @@ public class SchematicNode {
} }
public static SchematicNode createSchematicNode(int owner, String name, Integer parent, String type, String item) { public static SchematicNode createSchematicNode(int owner, String name, Integer parent, String type, String item) {
if(parent == 0) if (parent == 0)
parent = null; parent = null;
SQL.update("INSERT INTO SchematicNode (NodeName, NodeOwner, ParentNode, NodeType, NodeItem) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE NodeName = VALUES(NodeName), ParentNode = VALUES(ParentNode), NodeItem = VALUES(NodeItem), NodeType = VALUES(NodeType), NodeItem = VALUES(NodeItem)", SQL.update("INSERT INTO SchematicNode (NodeName, NodeOwner, ParentNode, NodeType, NodeItem) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE NodeName = VALUES(NodeName), ParentNode = VALUES(ParentNode), NodeItem = VALUES(NodeItem), NodeType = VALUES(NodeType), NodeItem = VALUES(NodeItem)",
name, owner, parent, type, item); name, owner, parent, type, item);
return getSchematicNode(owner, name, parent); return getSchematicNode(owner, name, parent);
} }
public static SchematicNode getSchematicNode(int owner, String name, Integer parent) { private Timestamp lastUpdate;
if(parent != null && parent == 0)
parent = null;
ResultSet set;
if(parent == null) {
set = SQL.select("SELECT * FROM SchematicNode WHERE NodeOwner = ? AND NodeName = ? AND ParentNode is NULL", owner, name);
}else {
set = SQL.select("SELECT * FROM SchematicNode WHERE NodeOwner = ? AND NodeName = ? AND ParentNode = ?", owner, name, parent);
}
try {
while (set.next()) {
SchematicNode node = new SchematicNode(set);
if(!node.isDir())
return node;
}
List<SchematicNode> nodes = getSchematicNodeInNode(parent);
for (SchematicNode node:nodes) {
if(!node.isDir() && node.name.equals(name) && NodeMember.getNodeMember(node.getId(), owner) != null)
return node;
}
return null;
}catch (SQLException e) {
throw new SecurityException("Failed to load Schemnodes", e);
}
}
public static SchematicNode getSchematicNode(int owner, String name, SchematicNode parent) { public static SchematicNode getSchematicNode(int owner, String name, SchematicNode parent) {
return getSchematicNode(owner, name, parent.getId()); return getSchematicNode(owner, name, parent.getId());
} }
public static List<SchematicNode> getSchematicNodeInNode(Integer parent) { private SchematicNode(ResultSet set) throws SQLException {
if(parent != null && parent == 0) id = set.getInt("NodeId");
parent = null; owner = set.getInt("NodeOwner");
ResultSet set; name = set.getString("NodeName");
if(parent == null) { parent = set.getInt("ParentNode");
set = SQL.select("SELECT * FROM SchematicNode WHERE ParentNode is NULL"); item = set.getString("NodeItem");
}else { type = set.getString("NodeType");
set = SQL.select("SELECT * FROM SchematicNode WHERE ParentNode = ?", parent); lastUpdate = set.getTimestamp("LastUpdate");
} if (type != null) {
try { isDir = false;
List<SchematicNode> nodes = new ArrayList<>(); rank = set.getInt("NodeRank");
while (set.next()) schemFormat = set.getBoolean("NodeFormat");
nodes.add(new SchematicNode(set)); } else {
return nodes; isDir = true;
}catch (SQLException e) {
throw new SecurityException("Failed to load Schemnodes", e);
} }
} }
@ -98,14 +76,58 @@ public class SchematicNode {
return getSchematicDirectory(name, parent.getId()); return getSchematicDirectory(name, parent.getId());
} }
public static SchematicNode getSchematicNode(int owner, String name, Integer parent) {
if (parent != null && parent == 0)
parent = null;
ResultSet set;
if (parent == null) {
set = SQL.select("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeOwner = ? AND NodeName = ? AND ParentNode is NULL", owner, name);
} else {
set = SQL.select("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeOwner = ? AND NodeName = ? AND ParentNode = ?", owner, name, parent);
}
try {
while (set.next()) {
SchematicNode node = new SchematicNode(set);
return node;
}
List<SchematicNode> nodes = getSchematicNodeInNode(parent);
for (SchematicNode node:nodes) {
if (node.name.equals(name) && NodeMember.getNodeMember(node.getId(), owner) != null)
return node;
}
return null;
}catch (SQLException e) {
throw new SecurityException("Failed to load Schemnodes", e);
}
}
public static List<SchematicNode> getSchematicNodeInNode(Integer parent) {
if(parent != null && parent == 0)
parent = null;
ResultSet set;
if(parent == null) {
set = SQL.select("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE ParentNode is NULL");
}else {
set = SQL.select("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE ParentNode = ?", parent);
}
try {
List<SchematicNode> nodes = new ArrayList<>();
while (set.next())
nodes.add(new SchematicNode(set));
return nodes;
}catch (SQLException e) {
throw new SecurityException("Failed to load Schemnodes", e);
}
}
public static SchematicNode getSchematicDirectory(String name, Integer parent) { public static SchematicNode getSchematicDirectory(String name, Integer parent) {
if(parent != null && parent == 0) if(parent != null && parent == 0)
parent = null; parent = null;
ResultSet set; ResultSet set;
if(parent == null) { if(parent == null) {
set = SQL.select("SELECT * FROM SchematicNode WHERE NodeName = ? AND ParentNode is NULL", name, parent); set = SQL.select("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeName = ? AND ParentNode is NULL", name, parent);
}else { }else {
set = SQL.select("SELECT * FROM SchematicNode WHERE NodeName = ? AND ParentNode = ?", name, parent); set = SQL.select("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeName = ? AND ParentNode = ?", name, parent);
} }
try { try {
while (set.next()) { while (set.next()) {
@ -124,9 +146,9 @@ public class SchematicNode {
parent = null; parent = null;
ResultSet set; ResultSet set;
if(parent == null) { if(parent == null) {
set = SQL.select("SELECT * FROM SchematicNode WHERE NodeName = ? AND ParentNode is NULL", name, parent); set = SQL.select("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeName = ? AND ParentNode is NULL", name);
}else { }else {
set = SQL.select("SELECT * FROM SchematicNode WHERE NodeName = ? AND ParentNode = ?", name, parent); set = SQL.select("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeName = ? AND ParentNode = ?", name, parent);
} }
try { try {
while (set.next()) { while (set.next()) {
@ -141,44 +163,19 @@ public class SchematicNode {
} }
public static SchematicNode getSchematicNode(int id) { public static SchematicNode getSchematicNode(int id) {
ResultSet set = SQL.select("SELECT * FROM SchematicNode WHERE NodeId = ?", id); ResultSet set = SQL.select("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeId = ?", id);
try { try {
if(!set.next()) if (!set.next())
return null; return null;
return new SchematicNode(set); return new SchematicNode(set);
}catch (SQLException e) { } catch (SQLException e) {
throw new SecurityException("Failed to load Schemnodes", e);
}
}
public static List<SchematicNode> getAllSchematicsOfType(int owner, String schemType) {
ResultSet set = SQL.select("SELECT * FROM SchematicNode WHERE NodeOwner = ? AND NodeType = ?", owner, schemType);
try {
List<SchematicNode> nodes = new ArrayList<>();
while (set.next())
nodes.add(new SchematicNode(set));
return nodes;
}catch (SQLException e) {
throw new SecurityException("Failed to load Schemnodes", e);
}
}
public static List<SchematicNode> getAllSchematicsOfType(String schemType) {
ResultSet set = SQL.select("SELECT * FROM SchematicNode WHERE NodeType = ?", schemType);
try {
List<SchematicNode> nodes = new ArrayList<>();
while (set.next())
nodes.add(new SchematicNode(set));
return nodes;
}catch (SQLException e) {
throw new SecurityException("Failed to load Schemnodes", e); throw new SecurityException("Failed to load Schemnodes", e);
} }
} }
public static List<SchematicNode> getSchematicsOfType(int owner, String schemType, Integer parent) { public static List<SchematicNode> getSchematicsOfType(int owner, String schemType, Integer parent) {
if(parent != null && parent == 0) List<SchematicNode> schems = getAllSchematicsAccessibleByUser(owner);
parent = null; schems.removeIf(node -> !node.getType().equals(schemType));
List<SchematicNode> schems = getAllSchematicsOfType(owner, schemType);
Map<Integer, SchematicNode> nodesInParent = new LinkedHashMap<>(); Map<Integer, SchematicNode> nodesInParent = new LinkedHashMap<>();
for (SchematicNode schematicNode : schems) { for (SchematicNode schematicNode : schems) {
SchematicNode currentNode = schematicNode; SchematicNode currentNode = schematicNode;
@ -190,8 +187,46 @@ public class SchematicNode {
return new ArrayList<>(nodesInParent.values()); return new ArrayList<>(nodesInParent.values());
} }
public static List<SchematicNode> getAllSchematicsOfType(int owner, String schemType) {
ResultSet set = SQL.select("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeOwner = ? AND NodeType = ?", owner, schemType);
try {
List<SchematicNode> nodes = new ArrayList<>();
while (set.next())
nodes.add(new SchematicNode(set));
return nodes;
} catch (SQLException e) {
throw new SecurityException("Failed to load Schemnodes", e);
}
}
public static List<SchematicNode> getAllSchematicsOfType(String schemType) {
ResultSet set = SQL.select("SELECT NodeId, NodeName, NodeOwner, ParentNode, NodeType, NodeItem, NodeRank, NodeFormat, LastUpdate FROM SchematicNode WHERE NodeType = ?", schemType);
try {
List<SchematicNode> nodes = new ArrayList<>();
while (set.next())
nodes.add(new SchematicNode(set));
return nodes;
} catch (SQLException e) {
throw new SecurityException("Failed to load Schemnodes", e);
}
}
public static List<SchematicNode> deepGet(Integer parent, Predicate<SchematicNode> filter) {
List<SchematicNode> finalList = new ArrayList<>();
List<SchematicNode> nodes = SchematicNode.getSchematicNodeInNode(parent);
nodes.forEach(node -> {
if (node.isDir()) {
finalList.addAll(deepGet(node.getId(), filter));
} else {
if (filter.test(node))
finalList.add(node);
}
});
return finalList;
}
public static List<SchematicNode> getSchematicsAccessibleByUser(int user, Integer parent) { public static List<SchematicNode> getSchematicsAccessibleByUser(int user, Integer parent) {
if(parent != null && parent != 0) { if (parent != null && parent != 0) {
SchematicNode node = SchematicNode.getSchematicNode(parent); SchematicNode node = SchematicNode.getSchematicNode(parent);
boolean isAdded = false; boolean isAdded = false;
while (node.getId() != 0) { while (node.getId() != 0) {
@ -206,7 +241,7 @@ public class SchematicNode {
if(isAdded) if(isAdded)
return getSchematicNodeInNode(parent); return getSchematicNodeInNode(parent);
} else { } else {
ResultSet set = SQL.select("SELECT * FROM SchematicNode s LEFT JOIN NodeMember n ON s.NodeId = n.NodeId WHERE (s.NodeOwner = ? OR n.UserId = ?) AND s.ParentNode is NULL GROUP BY s.NodeId ORDER BY s.NodeName", user, user); ResultSet set = SQL.select("SELECT s.NodeId, s.NodeName, s.NodeOwner, s.NodeItem, s.NodeType, s.ParentNode, s.NodeRank, s.NodeFormat, s.LastUpdate FROM SchematicNode s LEFT JOIN NodeMember n ON s.NodeId = n.NodeId WHERE (s.NodeOwner = ? OR n.UserId = ?) AND s.ParentNode is NULL GROUP BY s.NodeId ORDER BY s.NodeName", user, user);
try{ try{
List<SchematicNode> nodes = new ArrayList<>(); List<SchematicNode> nodes = new ArrayList<>();
while(set.next()) while(set.next())
@ -216,11 +251,11 @@ public class SchematicNode {
throw new SecurityException("Failed listing schematics", e); throw new SecurityException("Failed listing schematics", e);
} }
} }
return null; return Collections.emptyList();
} }
public static List<SchematicNode> getAllSchematicsAccessibleByUser(int user) { public static List<SchematicNode> getAllSchematicsAccessibleByUser(int user) {
ResultSet set = SQL.select("SELECT s.NodeId, s.NodeName, s.NodeOwner, s.NodeItem, s.NodeType, s.ParentNode FROM SchematicNode s LEFT JOIN NodeMember nm ON nm.NodeId = s.NodeId WHERE s.NodeOwner = ? OR nm.UserId = ? GROUP BY s.NodeId ORDER BY s.NodeName", user, user); ResultSet set = SQL.select("SELECT s.NodeId, s.NodeName, s.NodeOwner, s.NodeItem, s.NodeType, s.ParentNode, s.NodeRank, s.NodeFormat, s.LastUpdate FROM SchematicNode s LEFT JOIN NodeMember nm ON nm.NodeId = s.NodeId WHERE s.NodeOwner = ? OR nm.UserId = ? GROUP BY s.NodeId ORDER BY s.NodeName", user, user);
try{ try{
List<SchematicNode> nodes = new ArrayList<>(); List<SchematicNode> nodes = new ArrayList<>();
while(set.next()) while(set.next())
@ -234,26 +269,35 @@ public class SchematicNode {
private final int id; private final int id;
private final int owner; private final int owner;
private String name; private String name;
private int parent; private Integer parent;
private String item; private String item;
private String type; private String type;
private boolean schemFormat; private boolean schemFormat;
private int rank; private int rank;
private boolean isDir; private final boolean isDir;
private SchematicNode(ResultSet set) throws SQLException { public static List<SchematicNode> filterSchems(int user, Predicate<SchematicNode> filter) {
id = set.getInt("NodeId"); List<SchematicNode> finalList = new ArrayList<>();
owner = set.getInt("NodeOwner"); List<SchematicNode> nodes = SchematicNode.getSchematicsAccessibleByUser(user, null);
name = set.getString("NodeName"); nodes.forEach(node -> {
parent = set.getInt("ParentNode"); if (node.isDir()) {
item = set.getString("NodeItem"); finalList.addAll(deepGet(node.getId(), filter));
type = set.getString("NodeType"); } else {
if(type != null) { if (filter.test(node))
isDir = false; finalList.add(node);
rank = set.getInt("NodeRank"); }
schemFormat = set.getBoolean("NodeFormat"); });
}else { return finalList;
isDir = true; }
public static Integer countNodes() {
ResultSet set = SQL.select("SELECT COUNT(NodeId) AS 'count' FROM SchematicNode");
try {
if (set.next())
return set.getInt("count");
return 0;
} catch (SQLException e) {
throw new SecurityException("Failed listing schematics", e);
} }
} }
@ -274,7 +318,7 @@ public class SchematicNode {
updateDB(); updateDB();
} }
public int getParent() { public Integer getParent() {
return parent; return parent;
} }
@ -345,15 +389,44 @@ public class SchematicNode {
return NodeMember.getNodeMembers(id); return NodeMember.getNodeMembers(id);
} }
public Timestamp getLastUpdate() {
return lastUpdate;
}
public String generateBreadcrumbs(SteamwarUser user) {
return generateBreadcrumbs("/", user);
}
public String generateBreadcrumbs(String split, SteamwarUser user) {
StringBuilder builder = new StringBuilder(getName());
SchematicNode currentNode = this;
if (currentNode.isDir()) builder.append("/");
while (currentNode.getParentNode() != null) {
currentNode = currentNode.getParentNode();
builder.insert(0, split)
.insert(0, currentNode.getName());
if (currentNode.getMembers().stream().anyMatch(member -> member.getMember() == user.getId())) {
break;
}
}
return builder.toString();
}
private void updateDB() { private void updateDB() {
SQL.update("UPDATE SchematicNode SET NodeName = ?, NodeOwner = ?, ParentNode = ?, NodeItem = ?, NodeType = ?, NodeRank = ? WHERE NodeId = ?", SQL.update("UPDATE SchematicNode SET NodeName = ?, NodeOwner = ?, ParentNode = ?, NodeItem = ?, NodeType = ?, NodeRank = ? WHERE NodeId = ?",
name, owner, parent, item, type, rank, id); name, owner, parent == 0 ? null : parent, item, type, rank, id);
this.lastUpdate = Timestamp.from(Instant.now());
} }
public void delete() { public void delete() {
if(isDir()) { if (isDir()) {
getSchematicNodeInNode(getId()).forEach(SchematicNode::delete); getSchematicNodeInNode(getId()).forEach(SchematicNode::delete);
} }
SQL.update("DELETE FROM SchematicNode WHERE NodeId = ?", id); SQL.update("DELETE FROM SchematicNode WHERE NodeId = ?", id);
} }
private void updateDatabase(Blob blob, boolean newFormat) {
SQL.update("UPDATE SchematicNode SET NodeData = ?, NodeFormat = ? WHERE NodeId = ?", blob, newFormat, id);
schemFormat = newFormat;
}
} }