From e560f071ad2ef55f5197026a51d22a5b9ac16d81 Mon Sep 17 00:00:00 2001 From: wzp Date: Mon, 23 Dec 2024 12:53:00 +0800 Subject: [PATCH] feat: add 10 min close room --- .../mmga/clubs/controller/ChessController.java | 9 +++++++++ .../java/org/mmga/clubs/entities/chess/Room.java | 16 ++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/mmga/clubs/controller/ChessController.java b/src/main/java/org/mmga/clubs/controller/ChessController.java index 26a5c1b..e40a813 100644 --- a/src/main/java/org/mmga/clubs/controller/ChessController.java +++ b/src/main/java/org/mmga/clubs/controller/ChessController.java @@ -26,6 +26,8 @@ import org.springframework.stereotype.Component; import java.lang.reflect.Field; import java.nio.ByteBuffer; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; @@ -254,5 +256,12 @@ public class ChessController { log.info("send ping to session {}", value.getId()); value.getAsyncRemote().sendPing(Unpooled.buffer().writeLong(System.currentTimeMillis()).nioBuffer()); } + Instant instant = new Date().toInstant(); + Instant before10Min = instant.plus(-10, ChronoUnit.MINUTES); + rooms.entrySet().stream() + .filter(e -> e.getValue().getState().equals(Room.RoomState.CREATED)) + .filter(e -> e.getValue().getLastStateChange().toInstant().isBefore(before10Min)) + .map(Map.Entry::getKey) + .forEach(rooms::remove); } } diff --git a/src/main/java/org/mmga/clubs/entities/chess/Room.java b/src/main/java/org/mmga/clubs/entities/chess/Room.java index 7cb260a..205b261 100644 --- a/src/main/java/org/mmga/clubs/entities/chess/Room.java +++ b/src/main/java/org/mmga/clubs/entities/chess/Room.java @@ -3,8 +3,10 @@ package org.mmga.clubs.entities.chess; import com.alibaba.fastjson2.annotation.JSONField; import jakarta.websocket.Session; +import lombok.AccessLevel; import lombok.Data; import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.mmga.clubs.entities.chess.packet.PlayerJoinRoomPacket; import org.mmga.clubs.entities.chess.packet.PlayerLeavePacket; import org.mmga.clubs.entities.chess.packet.PlayerSideAllocationPacket; @@ -12,10 +14,7 @@ import org.mmga.clubs.entities.chess.packet.RoomInfoPacket; import org.mmga.clubs.entities.user.User; import org.mmga.clubs.utils.WebSocketUtils; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; +import java.util.*; @Data public class Room { @@ -30,13 +29,22 @@ public class Room { private boolean isWhiteAcceptRestart; private boolean isBlackAcceptRestart; private boolean canWhiteDown; + @Setter(value = AccessLevel.PRIVATE) + private Date lastStateChange; public Room() { this.id = UUID.randomUUID(); this.state = RoomState.CREATED; + this.lastStateChange = new Date(); resetPieces(); } + public void setState(RoomState state) { + if (state == this.state) return; + this.state = state; + this.lastStateChange = new Date(); + } + public void resetPieces() { this.canWhiteDown = false; this.pieces = new byte[16][16];