Skip to content

Commit

Permalink
添加延迟刷新排名列表
Browse files Browse the repository at this point in the history
- 添加延迟刷新排名列表
- 移动 graphql 相关类文件
  • Loading branch information
Taskeren committed Sep 9, 2023
1 parent ceecc67 commit 1001e78
Show file tree
Hide file tree
Showing 56 changed files with 302 additions and 117 deletions.
8 changes: 6 additions & 2 deletions booster/src/main/kotlin/explode2/booster/MainLogics.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package explode2.booster

import com.expediagroup.graphql.generator.extensions.print
import explode2.booster.graphql.MazeProvider
import explode2.booster.graphql.graphQLServer
import explode2.booster.resource.ByteArrayResourceProvider
import explode2.booster.resource.RedirectResourceProvider
import explode2.booster.resource.ResourceReceiver
import explode2.labyrinth.SongSetRepository
import explode2.logging.Colors
import graphql.MazeProvider
import graphql.graphQLServer
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.request.*
Expand All @@ -33,6 +33,10 @@ object MainLogics : KoinComponent {

val welcome = listOf("", "", "\uD83D\uDCE2", "\uD83D\uDCE3")
val playground = Application::class.java.classLoader.getResource("graphql-playground/index.html")?.readText()
?.replace(
"\$BACKEND_URL\$",
"//127.0.0.1:10443/graphql"
)
?: "<p>Resource Not Found!</p>"

app.routing {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,37 +1,35 @@
package graphql
package explode2.booster.graphql

import com.google.common.cache.CacheBuilder
import explode2.booster.Explode
import explode2.booster.Explode.dispatchEvent
import explode2.booster.ExplodeConfig
import explode2.booster.graphql.GraphqlDataSource.assInfoRepo
import explode2.booster.graphql.GraphqlDataSource.assRecRepo
import explode2.booster.graphql.GraphqlDataSource.chartRepo
import explode2.booster.graphql.GraphqlDataSource.recRepo
import explode2.booster.graphql.GraphqlDataSource.songRepo
import explode2.booster.graphql.GraphqlDataSource.userRepo
import explode2.booster.graphql.NonNegativeInt.Companion.int
import explode2.booster.graphql.definition.*
import explode2.booster.graphql.event.*
import explode2.gateau.AssessmentRecord
import explode2.gateau.GameRecord
import explode2.gateau.GameUser
import explode2.labyrinth.*
import explode2.labyrinth.SearchCategory
import explode2.labyrinth.SearchSort
import goodbird.GoodBirdOracle
import graphql.NonNegativeInt.Companion.int
import graphql.definition.*
import graphql.event.*
import graphql.schema.DataFetchingEnvironment
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import java.time.OffsetDateTime
import java.util.*
import kotlin.time.Duration.Companion.minutes
import kotlin.time.toJavaDuration

object BasicMaze : ExplodeQuery, ExplodeMutation, MazeProvider, KoinComponent {
object BasicMaze : ExplodeQuery, ExplodeMutation, MazeProvider {

override val query: ExplodeQuery = this
override val mutation: ExplodeMutation = this

private val userRepo by inject<GameUserRepository>()
private val assInfoRepo by inject<AssessmentInfoRepository>()
private val assRecRepo by inject<AssessmentRecordRepository>()
private val songRepo by inject<SongSetRepository>()
private val chartRepo by inject<SongChartRepository>()
private val recRepo by inject<GameRecordRepository>()

override suspend fun loginUser(env: DataFetchingEnvironment, username: String?, password: String?): UserModel {
val event = UserLoginEvent(username.baah(), password.baah())
if(event.isRejected()) {
Expand Down Expand Up @@ -278,16 +276,29 @@ object BasicMaze : ExplodeQuery, ExplodeMutation, MazeProvider, KoinComponent {
?.let(GameUser::tunerize)
}

internal val refreshRankingListInHour: Int
get() = config.getInt(
"refresh-ranking-list-in-hours",
"general",
12,
0,
Int.MAX_VALUE,
"The hours to expire a ranking list. Non-positive to disable refreshing list."
)

override suspend fun playRank(
env: DataFetchingEnvironment, chartId: String?, skip: NonNegativeInt?, limit: NonNegativeInt?
): List<PlayRecordWithRankModel> {
return recRepo
.getChartRecords(
chartId.baah("invalid chart id"),
limit.int.baah("invalid limit"),
skip.int.baah("invalid skip")
)
.map(GameRecord::tunerize)
val cid = chartId.baah("invalid chart id")
val s = skip.int.baah("invalid skip")
val l = limit.int.baah("invalid limit")
return if(refreshRankingListInHour > 0) {
RefreshingRankingList.getOrCreate(cid, refreshRankingListInHour, recRepo).get(l, s)
} else {
recRepo
.getChartRecords(cid, l, s)
.map(GameRecord::tunerize)
}
}

override suspend fun refreshSet(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package graphql
package explode2.booster.graphql

import org.jetbrains.annotations.Contract

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package graphql
package explode2.booster.graphql

import explode2.booster.graphql.definition.*
import explode2.gateau.*
import explode2.gateau.AssessmentRecord.AssessmentRecordEntry
import graphql.definition.*

@Suppress("DEPRECATION")
fun GameUser.tunerize() = UserModel(this.id, this.username, this.coin, this.diamond, this.ppTime, this.id, this.calculateR(), UserAccessModel(this.isReviewer))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,25 @@
@file:Suppress("DEPRECATION")

package graphql
package explode2.booster.graphql

import com.expediagroup.graphql.dataloader.KotlinDataLoaderRegistryFactory
import com.expediagroup.graphql.generator.*
import com.expediagroup.graphql.generator.SchemaGeneratorConfig
import com.expediagroup.graphql.generator.TopLevelObject
import com.expediagroup.graphql.generator.execution.GraphQLContext
import com.expediagroup.graphql.generator.hooks.SchemaGeneratorHooks
import com.expediagroup.graphql.generator.scalars.IDValueUnboxer
import com.expediagroup.graphql.server.execution.*
import com.expediagroup.graphql.generator.toSchema
import com.expediagroup.graphql.server.execution.GraphQLContextFactory
import com.expediagroup.graphql.server.execution.GraphQLRequestHandler
import com.expediagroup.graphql.server.execution.GraphQLRequestParser
import com.expediagroup.graphql.server.execution.GraphQLServer
import com.expediagroup.graphql.server.types.GraphQLServerRequest
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import graphql.MazeProvider.Companion
import graphql.definition.ExplodeMutation
import graphql.definition.ExplodeQuery
import explode2.booster.graphql.MazeProvider.Companion
import explode2.booster.graphql.definition.ExplodeMutation
import explode2.booster.graphql.definition.ExplodeQuery
import graphql.ExceptionWhileDataFetching
import graphql.GraphQL
import graphql.execution.*
import graphql.language.SourceLocation
import graphql.scalars.ExtendedScalars
Expand All @@ -22,7 +29,8 @@ import io.ktor.server.request.*
import org.slf4j.LoggerFactory
import org.slf4j.MarkerFactory
import java.io.IOException
import java.time.*
import java.time.OffsetDateTime
import java.time.OffsetTime
import java.util.*
import kotlin.reflect.KClass
import kotlin.reflect.KType
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package explode2.booster.graphql

import explode2.labyrinth.*
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject

object GraphqlDataSource : KoinComponent {

internal val assInfoRepo by inject<AssessmentInfoRepository>()
internal val assRecRepo by inject<AssessmentRecordRepository>()
internal val recRepo by inject<GameRecordRepository>()
internal val songRepo by inject<SongSetRepository>()
internal val userRepo by inject<GameUserRepository>()
internal val chartRepo by inject<SongChartRepository>()

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package graphql
package explode2.booster.graphql

import explode2.booster.ExplodeService
import graphql.definition.ExplodeMutation
import graphql.definition.ExplodeQuery
import explode2.booster.graphql.definition.ExplodeMutation
import explode2.booster.graphql.definition.ExplodeQuery

interface MazeProvider {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package graphql
package explode2.booster.graphql

@JvmInline
value class NonNegativeInt(val value: Int) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package explode2.booster.graphql

import explode2.booster.graphql.definition.PlayRecordWithRankModel
import explode2.gateau.GameRecord
import explode2.labyrinth.GameRecordRepository
import java.time.LocalDateTime
import kotlin.time.Duration.Companion.hours
import kotlin.time.toJavaDuration

data class RefreshingRankingList(
val chartId: String,
val expireHours: Int,
val repo: GameRecordRepository
) {

private var cache: List<PlayRecordWithRankModel>? = null
private var lastUpdateTime: LocalDateTime? = null

fun clear() {
cache = null
lastUpdateTime = null
}

private fun update() {
cache = repo.getChartRecords(chartId, 100, 0).map(GameRecord::tunerize)
lastUpdateTime = LocalDateTime.now()
}

fun get(): List<PlayRecordWithRankModel> {
val lastUpdateTime = lastUpdateTime
if(
lastUpdateTime == null ||
lastUpdateTime + 24.hours.toJavaDuration() <= LocalDateTime.now() ||
cache == null
) {
update()
}

return cache!!
}

fun get(limit: Int, skip: Int): List<PlayRecordWithRankModel> {
require(limit > 0)
require(skip >= 0)
return get().drop(skip).take(limit)
}

fun get(playerId: String): PlayRecordWithRankModel? {
val lastUpdateTime = lastUpdateTime
if(
lastUpdateTime == null ||
lastUpdateTime + 24.hours.toJavaDuration() <= LocalDateTime.now() ||
cache == null
) {
update()
}

return cache!!.firstOrNull { it.player._id == playerId }
}

companion object {

private val instances = mutableMapOf<String, RefreshingRankingList>()

fun getOrCreate(chartId: String, expireHours: Int, repo: GameRecordRepository): RefreshingRankingList {
return instances.getOrPut(chartId) { RefreshingRankingList(chartId, expireHours, repo) }
}
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package graphql.definition
package explode2.booster.graphql.definition

data class AfterAssessmentModel(
val result: Int,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package graphql.definition
package explode2.booster.graphql.definition

data class AfterPlaySubmitModel(
val ranking: RankingModel,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package graphql.definition
package explode2.booster.graphql.definition

data class AssessmentChartModel(
val _id: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package graphql.definition
package explode2.booster.graphql.definition

data class AssessmentGroupModel(
val _id: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package graphql.definition
package explode2.booster.graphql.definition

data class AssessmentModel(
val _id: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package graphql.definition
package explode2.booster.graphql.definition

data class AssessmentPlayRecordModel(
val perfect: Int,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package graphql.definition
package explode2.booster.graphql.definition

import java.time.OffsetDateTime

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package graphql.definition
package explode2.booster.graphql.definition

data class AssessmentRecordsModel(
val achievementRate: Double, // Round in [0, 200]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
package graphql.definition
package explode2.booster.graphql.definition

import explode2.booster.graphql.BasicMaze.getUser
import explode2.booster.graphql.GraphqlDataSource.songRepo
import explode2.booster.graphql.baah
import explode2.booster.graphql.tunerize
import explode2.labyrinth.SearchCategory
import explode2.labyrinth.SearchSort
import explode2.labyrinth.SongSetRepository
import graphql.BasicMaze.getUser
import graphql.baah
import graphql.schema.DataFetchingEnvironment
import graphql.tunerize
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject

object BasicReviewerImpl : Reviewer, KoinComponent {

private val songRepo by inject<SongSetRepository>()
object BasicReviewerImpl : Reviewer {

override suspend fun reviewRequest(
env: DataFetchingEnvironment,
Expand Down
Loading

0 comments on commit 1001e78

Please sign in to comment.