diff --git a/CommonCore/SQL/src/de/steamwar/sql/CheckedSchematic.java b/CommonCore/SQL/src/de/steamwar/sql/CheckedSchematic.java index e173d413..0037d880 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/CheckedSchematic.java +++ b/CommonCore/SQL/src/de/steamwar/sql/CheckedSchematic.java @@ -37,15 +37,14 @@ public class CheckedSchematic { private static final SelectStatement nodeHistory = new SelectStatement<>(table, "SELECT * FROM CheckedSchematic WHERE NodeId = ? AND DeclineReason != '' AND DeclineReason != 'Prüfvorgang abgebrochen' ORDER BY EndTime DESC"); private static final Statement insert = table.insertAll(); - public static void create(int nodeId, String name, int owner, int validator, Timestamp startTime, Timestamp endTime, String reason){ - insert.update(nodeId, owner, name, validator, startTime, endTime, reason); + private static final SelectStatement getUnseen = new SelectStatement<>(table, "SELECT * FROM CheckedSchematic WHERE Seen = 0 AND NodeOwner = ? ORDER BY StartTime DESC"); + private static final Statement updateSeen = new Statement("UPDATE CheckedSchematic SET Seen = ? WHERE StartTime = ? AND EndTime = ? AND NodeName = ?"); + + public static void create(SchematicNode node, int validator, Timestamp startTime, Timestamp endTime, String reason, boolean seen) { + insert.update(node.getId(), node.getName(), node.getOwner(), validator, startTime, endTime, reason, seen, node.getSchemtype().toDB()); } - public static void create(SchematicNode node, int validator, Timestamp startTime, Timestamp endTime, String reason){ - create(node.getId(), node.getName(), node.getOwner(), validator, startTime, endTime, reason); - } - - public static List getLastDeclinedOfNode(int node){ + public static List getLastDeclinedOfNode(int node) { return statusOfNode.listSelect(node); } @@ -53,6 +52,10 @@ public class CheckedSchematic { return nodeHistory.listSelect(node.getId()); } + public static List getUnseen(SteamwarUser owner) { + return getUnseen.listSelect(owner); + } + @Field(nullable = true) private final Integer nodeId; @Field @@ -71,6 +74,10 @@ public class CheckedSchematic { @Getter @Field private final String declineReason; + @Getter + private boolean seen; + @Getter + private final String nodeType; public int getNode() { return nodeId; @@ -83,4 +90,9 @@ public class CheckedSchematic { public int getSchemOwner() { return nodeOwner; } + + public void setSeen(boolean seen) { + this.seen = seen; + updateSeen.update(seen, startTime, endTime, nodeName); + } } diff --git a/VelocityCore/src/de/steamwar/messages/Chatter.java b/VelocityCore/src/de/steamwar/messages/Chatter.java index 607b4fd2..5de34d0c 100644 --- a/VelocityCore/src/de/steamwar/messages/Chatter.java +++ b/VelocityCore/src/de/steamwar/messages/Chatter.java @@ -87,10 +87,11 @@ public interface Chatter { } default void withPlayerOrOffline(Consumer withPlayer, Runnable withOffline) { Player player = getPlayer(); - if(player == null) + if(player == null) { withOffline.run(); - else + } else { withPlayer.accept(player); + } } default void withPlayer(Consumer function) { withPlayerOrOffline(function, () -> {}); diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/CheckCommand.java b/VelocityCore/src/de/steamwar/velocitycore/commands/CheckCommand.java index 2bff28bb..a032eb92 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/CheckCommand.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/CheckCommand.java @@ -41,6 +41,7 @@ import java.time.Instant; import java.util.List; import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.function.BooleanSupplier; import java.util.logging.Level; public class CheckCommand extends SWCommand { @@ -271,25 +272,29 @@ public class CheckCommand extends SWCommand { } private void accept(){ - if(concludeCheckSession("freigegeben", fightTypes.get(schematic.getSchemtype()))) { + concludeCheckSession("freigegeben", fightTypes.get(schematic.getSchemtype()), () -> { Chatter owner = Chatter.of(SteamwarUser.get(schematic.getOwner()).getUUID()); owner.withPlayerOrOffline( player -> owner.system("CHECK_ACCEPTED", schematic.getSchemtype().name(), schematic.getName()), () -> DiscordAlert.send(owner, Color.GREEN, new Message("DC_TITLE_SCHEMINFO"), new Message("DC_SCHEM_ACCEPT", schematic.getName()), true) ); notifyTeam(new Message("CHECK_ACCEPTED_TEAM", schematic.getName(), owner.user().getUserName())); - } + + return owner.getPlayer() != null; + }); } private void decline(String reason){ - if(concludeCheckSession(reason, SchematicType.Normal)) { + concludeCheckSession(reason, SchematicType.Normal, () -> { Chatter owner = Chatter.of(SteamwarUser.get(schematic.getOwner()).getUUID()); owner.withPlayerOrOffline( player -> owner.system("CHECK_DECLINED", schematic.getSchemtype().name(), schematic.getName(), reason), () -> DiscordAlert.send(owner, Color.RED, new Message("DC_TITLE_SCHEMINFO"), new Message("DC_SCHEM_DECLINE", schematic.getName(), reason), false) ); notifyTeam(new Message("CHECK_DECLINED_TEAM", schematic.getName(), owner.user().getUserName(), reason)); - } + + return owner.getPlayer() != null; + }); } private void notifyTeam(Message message) { @@ -298,14 +303,12 @@ public class CheckCommand extends SWCommand { } private void abort(){ - concludeCheckSession("Prüfvorgang abgebrochen", null); + concludeCheckSession("Prüfvorgang abgebrochen", null, () -> true); } - private boolean concludeCheckSession(String reason, SchematicType type) { - boolean exists = SchematicNode.getSchematicNode(schematic.getId()) != null; - - if(exists) { - CheckedSchematic.create(schematic, checker.user().getId(), startTime, Timestamp.from(Instant.now()), reason); + private void concludeCheckSession(String reason, SchematicType type, BooleanSupplier sendMessageIsOnline) { + if(SchematicNode.getSchematicNode(schematic.getId()) != null) { + CheckedSchematic.create(schematic, checker.user().getId(), startTime, Timestamp.from(Instant.now()), reason, sendMessageIsOnline.getAsBoolean()); if(type != null) schematic.setSchemtype(type); } @@ -316,7 +319,6 @@ public class CheckCommand extends SWCommand { if(subserver != null) subserver.stop(); }).schedule(); - return exists; } private void remove() { diff --git a/VelocityCore/src/de/steamwar/velocitycore/listeners/ConnectionListener.java b/VelocityCore/src/de/steamwar/velocitycore/listeners/ConnectionListener.java index f18288f6..c0efc3a2 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/listeners/ConnectionListener.java +++ b/VelocityCore/src/de/steamwar/velocitycore/listeners/ConnectionListener.java @@ -29,6 +29,8 @@ import com.velocitypowered.api.proxy.Player; import de.steamwar.messages.Chatter; import de.steamwar.messages.Message; import de.steamwar.persistent.Subserver; +import de.steamwar.sql.CheckedSchematic; +import de.steamwar.sql.SchematicType; import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.UserPerm; import de.steamwar.velocitycore.EventStarter; @@ -84,6 +86,16 @@ public class ConnectionListener extends BasicListener { } } + for (CheckedSchematic checkedSchematic : CheckedSchematic.getUnseen(user)) { + SchematicType type = SchematicType.fromDB(checkedSchematic.getNodeType()); + if(type == null) continue; + if (checkedSchematic.getDeclineReason().equals("freigegeben")) { + chatter.system("CHECK_ACCEPTED", type.name(), checkedSchematic.getSchemName()); + } else { + chatter.system("CHECK_DECLINED", type.name(), checkedSchematic.getSchemName(), checkedSchematic.getDeclineReason()); + } + } + if(newPlayers.contains(player.getUniqueId())){ Chatter.broadcast().system("JOIN_FIRST", player); newPlayers.remove(player.getUniqueId());