Merge pull request 'Refactor schematic checks to handle unseen notifications' (#33) from add-offline-notify into main

Reviewed-on: SteamWar/SteamWar#33
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
This commit is contained in:
2025-06-10 20:57:33 +02:00
4 changed files with 47 additions and 20 deletions
@@ -37,15 +37,14 @@ public class CheckedSchematic {
private static final SelectStatement<CheckedSchematic> nodeHistory = new SelectStatement<>(table, "SELECT * FROM CheckedSchematic WHERE NodeId = ? AND DeclineReason != '' AND DeclineReason != 'Prüfvorgang abgebrochen' ORDER BY EndTime DESC"); private static final SelectStatement<CheckedSchematic> 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(); 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){ private static final SelectStatement<CheckedSchematic> getUnseen = new SelectStatement<>(table, "SELECT * FROM CheckedSchematic WHERE Seen = 0 AND NodeOwner = ? ORDER BY StartTime DESC");
insert.update(nodeId, owner, name, validator, startTime, endTime, reason); 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){ public static List<CheckedSchematic> getLastDeclinedOfNode(int node) {
create(node.getId(), node.getName(), node.getOwner(), validator, startTime, endTime, reason);
}
public static List<CheckedSchematic> getLastDeclinedOfNode(int node){
return statusOfNode.listSelect(node); return statusOfNode.listSelect(node);
} }
@@ -53,6 +52,10 @@ public class CheckedSchematic {
return nodeHistory.listSelect(node.getId()); return nodeHistory.listSelect(node.getId());
} }
public static List<CheckedSchematic> getUnseen(SteamwarUser owner) {
return getUnseen.listSelect(owner);
}
@Field(nullable = true) @Field(nullable = true)
private final Integer nodeId; private final Integer nodeId;
@Field @Field
@@ -71,6 +74,10 @@ public class CheckedSchematic {
@Getter @Getter
@Field @Field
private final String declineReason; private final String declineReason;
@Getter
private boolean seen;
@Getter
private final String nodeType;
public int getNode() { public int getNode() {
return nodeId; return nodeId;
@@ -83,4 +90,9 @@ public class CheckedSchematic {
public int getSchemOwner() { public int getSchemOwner() {
return nodeOwner; return nodeOwner;
} }
public void setSeen(boolean seen) {
this.seen = seen;
updateSeen.update(seen, startTime, endTime, nodeName);
}
} }
@@ -87,10 +87,11 @@ public interface Chatter {
} }
default void withPlayerOrOffline(Consumer<Player> withPlayer, Runnable withOffline) { default void withPlayerOrOffline(Consumer<Player> withPlayer, Runnable withOffline) {
Player player = getPlayer(); Player player = getPlayer();
if(player == null) if(player == null) {
withOffline.run(); withOffline.run();
else } else {
withPlayer.accept(player); withPlayer.accept(player);
}
} }
default void withPlayer(Consumer<Player> function) { default void withPlayer(Consumer<Player> function) {
withPlayerOrOffline(function, () -> {}); withPlayerOrOffline(function, () -> {});
@@ -41,6 +41,7 @@ import java.time.Instant;
import java.util.List; import java.util.List;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.BooleanSupplier;
import java.util.logging.Level; import java.util.logging.Level;
public class CheckCommand extends SWCommand { public class CheckCommand extends SWCommand {
@@ -271,25 +272,29 @@ public class CheckCommand extends SWCommand {
} }
private void accept(){ 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()); Chatter owner = Chatter.of(SteamwarUser.get(schematic.getOwner()).getUUID());
owner.withPlayerOrOffline( owner.withPlayerOrOffline(
player -> owner.system("CHECK_ACCEPTED", schematic.getSchemtype().name(), schematic.getName()), 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) () -> 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())); notifyTeam(new Message("CHECK_ACCEPTED_TEAM", schematic.getName(), owner.user().getUserName()));
}
return owner.getPlayer() != null;
});
} }
private void decline(String reason){ private void decline(String reason){
if(concludeCheckSession(reason, SchematicType.Normal)) { concludeCheckSession(reason, SchematicType.Normal, () -> {
Chatter owner = Chatter.of(SteamwarUser.get(schematic.getOwner()).getUUID()); Chatter owner = Chatter.of(SteamwarUser.get(schematic.getOwner()).getUUID());
owner.withPlayerOrOffline( owner.withPlayerOrOffline(
player -> owner.system("CHECK_DECLINED", schematic.getSchemtype().name(), schematic.getName(), reason), 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) () -> 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)); notifyTeam(new Message("CHECK_DECLINED_TEAM", schematic.getName(), owner.user().getUserName(), reason));
}
return owner.getPlayer() != null;
});
} }
private void notifyTeam(Message message) { private void notifyTeam(Message message) {
@@ -298,14 +303,12 @@ public class CheckCommand extends SWCommand {
} }
private void abort(){ private void abort(){
concludeCheckSession("Prüfvorgang abgebrochen", null); concludeCheckSession("Prüfvorgang abgebrochen", null, () -> true);
} }
private boolean concludeCheckSession(String reason, SchematicType type) { private void concludeCheckSession(String reason, SchematicType type, BooleanSupplier sendMessageIsOnline) {
boolean exists = SchematicNode.getSchematicNode(schematic.getId()) != null; if(SchematicNode.getSchematicNode(schematic.getId()) != null) {
CheckedSchematic.create(schematic, checker.user().getId(), startTime, Timestamp.from(Instant.now()), reason, sendMessageIsOnline.getAsBoolean());
if(exists) {
CheckedSchematic.create(schematic, checker.user().getId(), startTime, Timestamp.from(Instant.now()), reason);
if(type != null) if(type != null)
schematic.setSchemtype(type); schematic.setSchemtype(type);
} }
@@ -316,7 +319,6 @@ public class CheckCommand extends SWCommand {
if(subserver != null) if(subserver != null)
subserver.stop(); subserver.stop();
}).schedule(); }).schedule();
return exists;
} }
private void remove() { private void remove() {
@@ -29,6 +29,8 @@ import com.velocitypowered.api.proxy.Player;
import de.steamwar.messages.Chatter; import de.steamwar.messages.Chatter;
import de.steamwar.messages.Message; import de.steamwar.messages.Message;
import de.steamwar.persistent.Subserver; import de.steamwar.persistent.Subserver;
import de.steamwar.sql.CheckedSchematic;
import de.steamwar.sql.SchematicType;
import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.UserPerm; import de.steamwar.sql.UserPerm;
import de.steamwar.velocitycore.EventStarter; 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())){ if(newPlayers.contains(player.getUniqueId())){
Chatter.broadcast().system("JOIN_FIRST", player); Chatter.broadcast().system("JOIN_FIRST", player);
newPlayers.remove(player.getUniqueId()); newPlayers.remove(player.getUniqueId());