From 2a50bc342d71b2b23ebdf5396051874c115447c6 Mon Sep 17 00:00:00 2001 From: hwanvely <990706leo@gmail.com> Date: Tue, 2 Sep 2025 16:09:46 +0900 Subject: [PATCH 1/4] =?UTF-8?q?fix:=20=EC=A0=90=EC=88=98=20=EC=A6=9D?= =?UTF-8?q?=EA=B0=80=20=EB=A1=9C=EC=A7=81=20=EC=98=A4=EB=A5=98=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../game/snackgame/core/domain/Snackgame.kt | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/snackgame/server/game/snackgame/core/domain/Snackgame.kt b/src/main/java/com/snackgame/server/game/snackgame/core/domain/Snackgame.kt index f786cbe..612ab3c 100644 --- a/src/main/java/com/snackgame/server/game/snackgame/core/domain/Snackgame.kt +++ b/src/main/java/com/snackgame/server/game/snackgame/core/domain/Snackgame.kt @@ -45,13 +45,9 @@ open class Snackgame( fun remove(streakWithFever: StreakWithFever) { val streak = streakWithFever.streak - val removedSnacks = board.removeSnacksIn(streak) + val removedSnacks = board.removeSnacksIn(streakWithFever.streak) - val serverIsFever = feverTime?.isActive(streakWithFever.occurredAt) == true - val isValid = streakWithFever.clientIsFever && serverIsFever - - val multiplier = if (isValid) FEVER_MULTIPLIER else NORMAL_MULTIPLIER - increaseScore(streak.length * multiplier) + increaseScore(streak.length * isFever(streakWithFever)) if (removedSnacks.any(Snack::isGolden)) { this.board = board.reset() @@ -67,13 +63,19 @@ open class Snackgame( } } - fun startFeverTime() { - this.feverTime = FeverTime.start() + private fun isFever(streakWithFever: StreakWithFever): Int { + val serverIsFever = feverTime?.isActive(streakWithFever.occurredAt) == true + val isValid = streakWithFever.clientIsFever && serverIsFever + val multiplier = if (isValid) FEVER_MULTIPLIER else NORMAL_MULTIPLIER + return multiplier } private fun increaseScore(earn: Int) { - val multiplier = if (feverTime?.isActive() == true) FEVER_MULTIPLIER else NORMAL_MULTIPLIER - this.score += earn * multiplier + this.score += earn + } + + fun startFeverTime() { + this.feverTime = FeverTime.start() } override val metadata = SNACK_GAME From 4be689d11e61e6967484e746def90c54bc4a517b Mon Sep 17 00:00:00 2001 From: hwanvely <990706leo@gmail.com> Date: Tue, 2 Sep 2025 17:27:28 +0900 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20=EC=8A=A4=ED=8A=B8=EB=A6=AD=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=20=EC=8B=9C=EA=B0=81=EC=9D=84=20=EB=B0=9B?= =?UTF-8?q?=EB=8A=94=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/service/dto/StreaksRequest.kt | 20 +++++++++++++++---- .../exception/InvalidStreakTimeException.kt | 4 ++++ 2 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/snackgame/server/game/snackgame/exception/InvalidStreakTimeException.kt diff --git a/src/main/java/com/snackgame/server/game/snackgame/core/service/dto/StreaksRequest.kt b/src/main/java/com/snackgame/server/game/snackgame/core/service/dto/StreaksRequest.kt index f9ff013..26eed98 100644 --- a/src/main/java/com/snackgame/server/game/snackgame/core/service/dto/StreaksRequest.kt +++ b/src/main/java/com/snackgame/server/game/snackgame/core/service/dto/StreaksRequest.kt @@ -3,6 +3,8 @@ package com.snackgame.server.game.snackgame.core.service.dto import com.fasterxml.jackson.annotation.JsonCreator import com.snackgame.server.game.snackgame.core.domain.Coordinate import com.snackgame.server.game.snackgame.core.domain.Streak +import com.snackgame.server.game.snackgame.exception.InvalidStreakTimeException +import java.time.Duration import java.time.LocalDateTime data class StreaksRequest @JsonCreator constructor( @@ -14,14 +16,24 @@ data class StreaksRequest @JsonCreator constructor( data class StreakWithMeta( val coordinates: List, - val isFever: Boolean + val isFever: Boolean, + val occurredAt: LocalDateTime, ) { - fun toDomain(now: LocalDateTime): StreakWithFever = - StreakWithFever( + fun toDomain(now: LocalDateTime): StreakWithFever { + if (Duration.between(occurredAt, now).abs() > REQUEST_TIME_TOLERANCE) { + throw InvalidStreakTimeException() + } + + return StreakWithFever( streak = Streak.of(coordinates.map { Coordinate(it.y, it.x) }), clientIsFever = isFever, - occurredAt = now + occurredAt = occurredAt ) + } + + companion object { + private val REQUEST_TIME_TOLERANCE: Duration = Duration.ofSeconds(2) + } } data class StreakWithFever( diff --git a/src/main/java/com/snackgame/server/game/snackgame/exception/InvalidStreakTimeException.kt b/src/main/java/com/snackgame/server/game/snackgame/exception/InvalidStreakTimeException.kt new file mode 100644 index 0000000..df23b33 --- /dev/null +++ b/src/main/java/com/snackgame/server/game/snackgame/exception/InvalidStreakTimeException.kt @@ -0,0 +1,4 @@ +package com.snackgame.server.game.snackgame.exception + +class InvalidStreakTimeException : SnackgameException("허용된 시간차를 초과하였습니다.") { +} \ No newline at end of file From 9ef7525fd6fd9ca66238093c82b9b8829fd25276 Mon Sep 17 00:00:00 2001 From: hwanvely <990706leo@gmail.com> Date: Tue, 2 Sep 2025 17:28:55 +0900 Subject: [PATCH 3/4] =?UTF-8?q?refactor:=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/game/snackgame/core/domain/item/FeverTime.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/snackgame/server/game/snackgame/core/domain/item/FeverTime.kt b/src/main/java/com/snackgame/server/game/snackgame/core/domain/item/FeverTime.kt index ead7eaf..fabd527 100644 --- a/src/main/java/com/snackgame/server/game/snackgame/core/domain/item/FeverTime.kt +++ b/src/main/java/com/snackgame/server/game/snackgame/core/domain/item/FeverTime.kt @@ -12,7 +12,7 @@ class FeverTime( fun isActive(now: LocalDateTime = LocalDateTime.now()): Boolean { if (feverStartedAt == null) return false val effectiveStart = feverPausedAt?.let { feverStartedAt!!.plus(Duration.between(it, now)) } ?: feverStartedAt - return Duration.between(effectiveStart, now) < DURATION + return Duration.between(effectiveStart, now) < FEVER_TIME_PERIOD } fun pause() { @@ -31,7 +31,7 @@ class FeverTime( } companion object { - private val DURATION: Duration = Duration.ofSeconds(30) + private val FEVER_TIME_PERIOD: Duration = Duration.ofSeconds(30) fun start(now: LocalDateTime = LocalDateTime.now()): FeverTime { return FeverTime(now) From 84774ba097b6b7058d394e86059b8456694754b4 Mon Sep 17 00:00:00 2001 From: hwanvely <990706leo@gmail.com> Date: Tue, 2 Sep 2025 19:16:56 +0900 Subject: [PATCH 4/4] =?UTF-8?q?fix(test):=20=EC=8A=A4=ED=8A=B8=EB=A6=AD=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=20=EC=8B=9C=EA=B0=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../game/snackgame/core/service/SnackgameServiceTest.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/snackgame/server/game/snackgame/core/service/SnackgameServiceTest.kt b/src/test/java/com/snackgame/server/game/snackgame/core/service/SnackgameServiceTest.kt index 0384d49..4f73191 100644 --- a/src/test/java/com/snackgame/server/game/snackgame/core/service/SnackgameServiceTest.kt +++ b/src/test/java/com/snackgame/server/game/snackgame/core/service/SnackgameServiceTest.kt @@ -48,7 +48,8 @@ class SnackgameServiceTest { listOf( StreakWithMeta( coordinates = coordinates, - isFever = false + isFever = false, + LocalDateTime.now() ) ) ) @@ -85,7 +86,8 @@ class SnackgameServiceTest { listOf( StreakWithMeta( coordinates = coordinates, - isFever = false + isFever = true, + LocalDateTime.now() ) ) )