diff --git a/application/src/main/kotlin/tw/waterballsa/gaas/application/usecases/ChangePlayerReadinessUsecase.kt b/application/src/main/kotlin/tw/waterballsa/gaas/application/usecases/ChangePlayerReadinessUsecase.kt index 8a0c4777..60df4589 100644 --- a/application/src/main/kotlin/tw/waterballsa/gaas/application/usecases/ChangePlayerReadinessUsecase.kt +++ b/application/src/main/kotlin/tw/waterballsa/gaas/application/usecases/ChangePlayerReadinessUsecase.kt @@ -24,8 +24,8 @@ class ChangePlayerReadinessUsecase( room.changePlayerReadiness(player.id, readiness) roomRepository.update(room) - val playerReadinessChangedEvent = room.changePlayerReadiness(readiness, player.id!!.value, player.nickname) - eventBus.broadcast(playerReadinessChangedEvent) + room.changePlayerReadiness(readiness, player.id.value, player.nickname) + .also { eventBus.broadcast(it) } } } @@ -49,6 +49,6 @@ fun Room.changePlayerReadiness( ): PlayerReadinessChangedEvent { val type = if (readiness) USER_READY else USER_NOT_READY val user = User(playerId, nickname) - val data = Data(user, roomId!!.value) + val data = Data(user, roomId!!) return PlayerReadinessChangedEvent(type, data) } diff --git a/application/src/main/kotlin/tw/waterballsa/gaas/application/usecases/EndGameUseCase.kt b/application/src/main/kotlin/tw/waterballsa/gaas/application/usecases/EndGameUseCase.kt index 0a514125..5fbebf80 100644 --- a/application/src/main/kotlin/tw/waterballsa/gaas/application/usecases/EndGameUseCase.kt +++ b/application/src/main/kotlin/tw/waterballsa/gaas/application/usecases/EndGameUseCase.kt @@ -16,11 +16,12 @@ class EndGameUseCase( ) : AbstractRoomUseCase(roomRepository, userRepository) { fun execute(request: Request) { val room = findRoomById(request.roomId) - room.endGame() - roomRepository.update(room) - - val endedGameEvent = room.endGameByGameService() - eventBus.broadcast(endedGameEvent) + with(room) { + endGame() + roomRepository.update(this) + endGameByGameService() + .also { eventBus.broadcast(it) } + } } data class Request( @@ -29,7 +30,6 @@ class EndGameUseCase( } fun Room.endGameByGameService(): EndedGameEvent { - val type = GAME_ENDED - val data = EndedGameEvent.Data(roomId!!.value) - return EndedGameEvent(type, data) + val data = EndedGameEvent.Data(roomId!!) + return EndedGameEvent(GAME_ENDED, data) } diff --git a/application/src/main/kotlin/tw/waterballsa/gaas/application/usecases/JoinRoomUsecase.kt b/application/src/main/kotlin/tw/waterballsa/gaas/application/usecases/JoinRoomUsecase.kt index 931795b8..a1daef2d 100644 --- a/application/src/main/kotlin/tw/waterballsa/gaas/application/usecases/JoinRoomUsecase.kt +++ b/application/src/main/kotlin/tw/waterballsa/gaas/application/usecases/JoinRoomUsecase.kt @@ -32,8 +32,8 @@ class JoinRoomUsecase( ensureThatPlayerNotJoinFullRoom() joinPlayer(player) - val playerJoinedRoomEvent = room.joinRoomEvent(player.id.value, player.nickname) - eventBus.broadcast(playerJoinedRoomEvent) + joinRoomEvent(player.id.value, player.nickname) + .also { eventBus.broadcast(it) } } } @@ -69,7 +69,7 @@ class JoinRoomUsecase( nickname: String, ): PlayerJoinedRoomEvent { val user = Player(playerId, nickname) - val data = Data(user, roomId!!.value) + val data = Data(user, roomId!!) return PlayerJoinedRoomEvent(USER_JOINED, data) } diff --git a/application/src/main/kotlin/tw/waterballsa/gaas/application/usecases/LeaveRoomUsecase.kt b/application/src/main/kotlin/tw/waterballsa/gaas/application/usecases/LeaveRoomUsecase.kt index bc57f7fb..b95a5c39 100644 --- a/application/src/main/kotlin/tw/waterballsa/gaas/application/usecases/LeaveRoomUsecase.kt +++ b/application/src/main/kotlin/tw/waterballsa/gaas/application/usecases/LeaveRoomUsecase.kt @@ -27,8 +27,8 @@ class LeaveRoomUsecase( else -> roomRepository.leaveRoom(room) } - val playerLeavedRoomEvent = room.leaveRoomEvent(player.id.value, player.nickname) - eventBus.broadcast(playerLeavedRoomEvent) + room.leaveRoomEvent(player.id.value, player.nickname) + .also { eventBus.broadcast(it) } } } @@ -37,7 +37,7 @@ class LeaveRoomUsecase( nickname: String, ): PlayerLeavedRoomEvent { val user = Player(playerId, nickname) - val data = Data(user, roomId!!.value) + val data = Data(user, roomId!!) return PlayerLeavedRoomEvent(USER_LEFT, data) } diff --git a/domain/src/main/kotlin/tw/waterballsa/gaas/events/EndedGameEvent.kt b/domain/src/main/kotlin/tw/waterballsa/gaas/events/EndedGameEvent.kt index 11b645cc..7213c51c 100644 --- a/domain/src/main/kotlin/tw/waterballsa/gaas/events/EndedGameEvent.kt +++ b/domain/src/main/kotlin/tw/waterballsa/gaas/events/EndedGameEvent.kt @@ -1,15 +1,17 @@ package tw.waterballsa.gaas.events +import tw.waterballsa.gaas.domain.Room import tw.waterballsa.gaas.events.enums.EventMessageType class EndedGameEvent( type: EventMessageType, val data: Data -) : SocketIoResponseEvent(type) { +) : RoomEvent(type) { data class Data( - val roomId: String, + val roomId: Room.Id, ) - override fun getEventData(): Any = data + + override fun getRoomId(): Room.Id = data.roomId } diff --git a/domain/src/main/kotlin/tw/waterballsa/gaas/events/PlayerJoinedRoomEvent.kt b/domain/src/main/kotlin/tw/waterballsa/gaas/events/PlayerJoinedRoomEvent.kt index 4bf6c971..08535bc9 100644 --- a/domain/src/main/kotlin/tw/waterballsa/gaas/events/PlayerJoinedRoomEvent.kt +++ b/domain/src/main/kotlin/tw/waterballsa/gaas/events/PlayerJoinedRoomEvent.kt @@ -1,14 +1,15 @@ package tw.waterballsa.gaas.events +import tw.waterballsa.gaas.domain.Room import tw.waterballsa.gaas.events.enums.EventMessageType class PlayerJoinedRoomEvent( type: EventMessageType, val data: Data -) : SocketIoResponseEvent(type) { +) : RoomEvent(type) { data class Data( val user: Player, - val roomId: String, + val roomId: Room.Id, ) { data class Player( val id: String, @@ -16,7 +17,7 @@ class PlayerJoinedRoomEvent( ) } - override fun getEventData(): Any = data + override fun getRoomId(): Room.Id = data.roomId } diff --git a/domain/src/main/kotlin/tw/waterballsa/gaas/events/PlayerLeavedRoomEvent.kt b/domain/src/main/kotlin/tw/waterballsa/gaas/events/PlayerLeavedRoomEvent.kt index 6a2adbbf..66a1543f 100644 --- a/domain/src/main/kotlin/tw/waterballsa/gaas/events/PlayerLeavedRoomEvent.kt +++ b/domain/src/main/kotlin/tw/waterballsa/gaas/events/PlayerLeavedRoomEvent.kt @@ -1,14 +1,15 @@ package tw.waterballsa.gaas.events +import tw.waterballsa.gaas.domain.Room import tw.waterballsa.gaas.events.enums.EventMessageType class PlayerLeavedRoomEvent( type: EventMessageType, val data: Data -) : SocketIoResponseEvent(type) { +) : RoomEvent(type) { data class Data( val user: Player, - val roomId: String, + val roomId: Room.Id, ) { data class Player( val id: String, @@ -16,7 +17,7 @@ class PlayerLeavedRoomEvent( ) } - override fun getEventData(): Any = data + override fun getRoomId(): Room.Id = data.roomId } diff --git a/domain/src/main/kotlin/tw/waterballsa/gaas/events/PlayerReadinessChangedEvent.kt b/domain/src/main/kotlin/tw/waterballsa/gaas/events/PlayerReadinessChangedEvent.kt index d1ba4cad..2d3805f1 100644 --- a/domain/src/main/kotlin/tw/waterballsa/gaas/events/PlayerReadinessChangedEvent.kt +++ b/domain/src/main/kotlin/tw/waterballsa/gaas/events/PlayerReadinessChangedEvent.kt @@ -1,14 +1,15 @@ package tw.waterballsa.gaas.events +import tw.waterballsa.gaas.domain.Room import tw.waterballsa.gaas.events.enums.EventMessageType class PlayerReadinessChangedEvent( type: EventMessageType, val data: Data -) : SocketIoResponseEvent(type) { +) : RoomEvent(type) { data class Data( val user: User, - val roomId: String, + val roomId: Room.Id, ) { data class User( val id: String, @@ -17,4 +18,6 @@ class PlayerReadinessChangedEvent( } override fun getEventData(): Any = data + + override fun getRoomId(): Room.Id = data.roomId } diff --git a/domain/src/main/kotlin/tw/waterballsa/gaas/events/RoomEvent.kt b/domain/src/main/kotlin/tw/waterballsa/gaas/events/RoomEvent.kt new file mode 100644 index 00000000..45c69fa2 --- /dev/null +++ b/domain/src/main/kotlin/tw/waterballsa/gaas/events/RoomEvent.kt @@ -0,0 +1,8 @@ +package tw.waterballsa.gaas.events + +import tw.waterballsa.gaas.domain.Room +import tw.waterballsa.gaas.events.enums.EventMessageType + +abstract class RoomEvent(type: EventMessageType) : SocketIOResponseEvent(type) { + abstract fun getRoomId(): Room.Id +} diff --git a/domain/src/main/kotlin/tw/waterballsa/gaas/events/SocketIOResponseEvent.kt b/domain/src/main/kotlin/tw/waterballsa/gaas/events/SocketIOResponseEvent.kt new file mode 100644 index 00000000..e7806156 --- /dev/null +++ b/domain/src/main/kotlin/tw/waterballsa/gaas/events/SocketIOResponseEvent.kt @@ -0,0 +1,7 @@ +package tw.waterballsa.gaas.events + +import tw.waterballsa.gaas.events.enums.EventMessageType + +abstract class SocketIOResponseEvent(val type: EventMessageType) : DomainEvent() { + abstract fun getEventData(): Any +} diff --git a/domain/src/main/kotlin/tw/waterballsa/gaas/events/SocketIoResponseData.kt b/domain/src/main/kotlin/tw/waterballsa/gaas/events/SocketIoResponseData.kt deleted file mode 100644 index 7da185d1..00000000 --- a/domain/src/main/kotlin/tw/waterballsa/gaas/events/SocketIoResponseData.kt +++ /dev/null @@ -1,5 +0,0 @@ -package tw.waterballsa.gaas.events - -interface SocketIoResponseData { - fun getEventData(): Any -} diff --git a/domain/src/main/kotlin/tw/waterballsa/gaas/events/SocketIoResponseEvent.kt b/domain/src/main/kotlin/tw/waterballsa/gaas/events/SocketIoResponseEvent.kt deleted file mode 100644 index 99dbf6d1..00000000 --- a/domain/src/main/kotlin/tw/waterballsa/gaas/events/SocketIoResponseEvent.kt +++ /dev/null @@ -1,5 +0,0 @@ -package tw.waterballsa.gaas.events - -import tw.waterballsa.gaas.events.enums.EventMessageType - -abstract class SocketIoResponseEvent(val type: EventMessageType) : DomainEvent(), SocketIoResponseData diff --git a/domain/src/main/kotlin/tw/waterballsa/gaas/events/StartedGameEvent.kt b/domain/src/main/kotlin/tw/waterballsa/gaas/events/StartedGameEvent.kt index ebd45c75..2c9fae76 100644 --- a/domain/src/main/kotlin/tw/waterballsa/gaas/events/StartedGameEvent.kt +++ b/domain/src/main/kotlin/tw/waterballsa/gaas/events/StartedGameEvent.kt @@ -6,12 +6,13 @@ import tw.waterballsa.gaas.events.enums.EventMessageType class StartedGameEvent( type: EventMessageType, val data: Data -) : SocketIoResponseEvent(type) { +) : RoomEvent(type) { data class Data( val gameUrl: String, val roomId: Room.Id, ) - override fun getEventData(): Any = data + + override fun getRoomId(): Room.Id = data.roomId } diff --git a/spring/src/main/kotlin/tw/waterballsa/gaas/spring/configs/socketio/SocketIOEventHandler.kt b/spring/src/main/kotlin/tw/waterballsa/gaas/spring/configs/socketio/SocketIOEventHandler.kt index 3041e4db..5b85df46 100644 --- a/spring/src/main/kotlin/tw/waterballsa/gaas/spring/configs/socketio/SocketIOEventHandler.kt +++ b/spring/src/main/kotlin/tw/waterballsa/gaas/spring/configs/socketio/SocketIOEventHandler.kt @@ -2,24 +2,16 @@ package tw.waterballsa.gaas.spring.configs.socketio import com.corundumstudio.socketio.SocketIOClient import com.corundumstudio.socketio.SocketIOServer -import com.corundumstudio.socketio.listener.DisconnectListener -import com.nimbusds.jose.shaded.json.JSONObject import io.netty.handler.codec.http.HttpHeaderNames -import org.apache.catalina.manager.util.SessionUtils import org.slf4j.Logger import org.slf4j.LoggerFactory -import org.springframework.security.oauth2.jwt.Jwt import org.springframework.stereotype.Component -import org.springframework.web.context.request.RequestContextHolder import tw.waterballsa.gaas.application.eventbus.EventBus import tw.waterballsa.gaas.application.repositories.RoomRepository import tw.waterballsa.gaas.application.repositories.UserRepository -import tw.waterballsa.gaas.application.usecases.GetRoomUsecase -import tw.waterballsa.gaas.domain.Room import tw.waterballsa.gaas.events.ChatData import tw.waterballsa.gaas.events.SocketioEvent import tw.waterballsa.gaas.events.enums.EventMessageType -import javax.servlet.http.HttpServletRequest @Component @@ -38,14 +30,14 @@ class SocketIOEventHandler( } - fun configureEventHandlers() { + private final fun configureEventHandlers() { socketIOServer.addConnectListener { client -> val token = client.handshakeData.httpHeaders.get(HttpHeaderNames.COOKIE) val customHeader = client.handshakeData.getSingleUrlParam("Authorization") if (client != null ) { - logger.info("有新用戶連結 , SessionId: {}", client.getSessionId()) + logger.info("有新用戶連結 , SessionId: {}", client.sessionId) val board = socketIOServer.broadcastOperations logger.info("board clientId {}", board.clients) } @@ -96,15 +88,15 @@ class SocketIOEventHandler( socketIOServer.addEventListener(SocketIOEventName.DISCONNECT.eventName, SocketioEvent::class.java) { - client: SocketIOClient, socketioEvent: SocketioEvent, _ -> + client: SocketIOClient, _: SocketioEvent, _ -> client.disconnect() logger.info(" client is leaven room with key disconnect") } socketIOServer.addDisconnectListener { - client: SocketIOClient -> - logger.info("Server disconnected on the server side") + + logger.info("Server disconnected on the server side") } } -} \ No newline at end of file +} diff --git a/spring/src/main/kotlin/tw/waterballsa/gaas/spring/eventbus/WebSocketEventBus.kt b/spring/src/main/kotlin/tw/waterballsa/gaas/spring/eventbus/WebSocketEventBus.kt index 8d7cd509..736d2eb0 100644 --- a/spring/src/main/kotlin/tw/waterballsa/gaas/spring/eventbus/WebSocketEventBus.kt +++ b/spring/src/main/kotlin/tw/waterballsa/gaas/spring/eventbus/WebSocketEventBus.kt @@ -5,7 +5,8 @@ import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.stereotype.Component import tw.waterballsa.gaas.application.eventbus.EventBus -import tw.waterballsa.gaas.events.* +import tw.waterballsa.gaas.events.DomainEvent +import tw.waterballsa.gaas.events.RoomEvent import tw.waterballsa.gaas.spring.controllers.viewmodel.SocketioViewModel import kotlin.reflect.safeCast @@ -19,7 +20,10 @@ class WebSocketEventBus( lateinit var viewModel: SocketioViewModel override fun broadcast(events: Collection) { events.asSequence() - .mapNotNull { SocketIoResponseEvent::class.safeCast(it) } - .forEach { socketIOServer.broadcastOperations.sendEvent(it.type.toString(), it.getEventData()) } + .mapNotNull { RoomEvent::class.safeCast(it) } + .forEach { + socketIOServer.getRoomOperations(it.getRoomId().value) + .sendEvent(it.type.eventName, it.getEventData()) + } } }