diff --git a/nise-backend/src/main/kotlin/com/nisemoe/generated/indexes/Indexes.kt b/nise-backend/src/main/kotlin/com/nisemoe/generated/indexes/Indexes.kt index 251361b..f72e2f0 100644 --- a/nise-backend/src/main/kotlin/com/nisemoe/generated/indexes/Indexes.kt +++ b/nise-backend/src/main/kotlin/com/nisemoe/generated/indexes/Indexes.kt @@ -26,8 +26,12 @@ val IDX_REPLAY_IDS_PAIRS: Index = Internal.createIndex(DSL.name("idx_replay_ids_ val IDX_SCORES_BEATMAP_ID: Index = Internal.createIndex(DSL.name("idx_scores_beatmap_id"), Scores.SCORES, arrayOf(Scores.SCORES.BEATMAP_ID), false) val IDX_SCORES_BEATMAP_ID_REPLAY_ID: Index = Internal.createIndex(DSL.name("idx_scores_beatmap_id_replay_id"), Scores.SCORES, arrayOf(Scores.SCORES.BEATMAP_ID, Scores.SCORES.REPLAY_ID), false) val IDX_SCORES_BEATMAP_ID_REPLAY_ID_UR: Index = Internal.createIndex(DSL.name("idx_scores_beatmap_id_replay_id_ur"), Scores.SCORES, arrayOf(Scores.SCORES.BEATMAP_ID, Scores.SCORES.REPLAY_ID, Scores.SCORES.UR), false) +val IDX_SCORES_IS_BANNED: Index = Internal.createIndex(DSL.name("idx_scores_is_banned"), Scores.SCORES, arrayOf(Scores.SCORES.IS_BANNED), false) val IDX_SCORES_JUDGEMENTS_SCORE_ID: Index = Internal.createIndex(DSL.name("idx_scores_judgements_score_id"), ScoresJudgements.SCORES_JUDGEMENTS, arrayOf(ScoresJudgements.SCORES_JUDGEMENTS.SCORE_ID), false) +val IDX_SCORES_KEYPRESSES_STANDARD_DEVIATION_ADJUSTED: Index = Internal.createIndex(DSL.name("idx_scores_keypresses_standard_deviation_adjusted"), Scores.SCORES, arrayOf(Scores.SCORES.KEYPRESSES_STANDARD_DEVIATION_ADJUSTED), false) +val IDX_SCORES_PP: Index = Internal.createIndex(DSL.name("idx_scores_pp"), Scores.SCORES, arrayOf(Scores.SCORES.PP), false) val IDX_SCORES_REPLAY_ID: Index = Internal.createIndex(DSL.name("idx_scores_replay_id"), Scores.SCORES, arrayOf(Scores.SCORES.REPLAY_ID), false) +val IDX_SCORES_SLIDEREND_RELEASE_STANDARD_DEVIATION_ADJUSTED: Index = Internal.createIndex(DSL.name("idx_scores_sliderend_release_standard_deviation_adjusted"), Scores.SCORES, arrayOf(Scores.SCORES.SLIDEREND_RELEASE_STANDARD_DEVIATION_ADJUSTED), false) val IDX_SCORES_UR: Index = Internal.createIndex(DSL.name("idx_scores_ur"), Scores.SCORES, arrayOf(Scores.SCORES.UR), false) val IDX_SCORES_USER_ID: Index = Internal.createIndex(DSL.name("idx_scores_user_id"), Scores.SCORES, arrayOf(Scores.SCORES.USER_ID), false) val IDX_USERS_IS_BANNED_FALSE: Index = Internal.createIndex(DSL.name("idx_users_is_banned_false"), Users.USERS, arrayOf(Users.USERS.IS_BANNED), false) diff --git a/nise-backend/src/main/kotlin/com/nisemoe/generated/tables/Scores.kt b/nise-backend/src/main/kotlin/com/nisemoe/generated/tables/Scores.kt index ee82dfe..4f19d71 100644 --- a/nise-backend/src/main/kotlin/com/nisemoe/generated/tables/Scores.kt +++ b/nise-backend/src/main/kotlin/com/nisemoe/generated/tables/Scores.kt @@ -8,7 +8,11 @@ import com.nisemoe.generated.Public import com.nisemoe.generated.indexes.IDX_SCORES_BEATMAP_ID import com.nisemoe.generated.indexes.IDX_SCORES_BEATMAP_ID_REPLAY_ID import com.nisemoe.generated.indexes.IDX_SCORES_BEATMAP_ID_REPLAY_ID_UR +import com.nisemoe.generated.indexes.IDX_SCORES_IS_BANNED +import com.nisemoe.generated.indexes.IDX_SCORES_KEYPRESSES_STANDARD_DEVIATION_ADJUSTED +import com.nisemoe.generated.indexes.IDX_SCORES_PP import com.nisemoe.generated.indexes.IDX_SCORES_REPLAY_ID +import com.nisemoe.generated.indexes.IDX_SCORES_SLIDEREND_RELEASE_STANDARD_DEVIATION_ADJUSTED import com.nisemoe.generated.indexes.IDX_SCORES_UR import com.nisemoe.generated.indexes.IDX_SCORES_USER_ID import com.nisemoe.generated.keys.REPLAY_ID_UNIQUE @@ -317,6 +321,11 @@ open class Scores( */ val JUDGEMENTS: TableField = createField(DSL.name("judgements"), SQLDataType.BLOB, this, "") + /** + * The column public.scores.leaderboard_rank. + */ + val LEADERBOARD_RANK: TableField = createField(DSL.name("leaderboard_rank"), SQLDataType.BIGINT, this, "") + private constructor(alias: Name, aliased: Table?): this(alias, null, null, null, aliased, null, null) private constructor(alias: Name, aliased: Table?, parameters: Array?>?): this(alias, null, null, null, aliased, parameters, null) private constructor(alias: Name, aliased: Table?, where: Condition?): this(alias, null, null, null, aliased, null, where) @@ -349,7 +358,7 @@ open class Scores( override fun `as`(alias: Table<*>): ScoresPath = ScoresPath(alias.qualifiedName, this) } override fun getSchema(): Schema? = if (aliased()) null else Public.PUBLIC - override fun getIndexes(): List = listOf(IDX_SCORES_BEATMAP_ID, IDX_SCORES_BEATMAP_ID_REPLAY_ID, IDX_SCORES_BEATMAP_ID_REPLAY_ID_UR, IDX_SCORES_REPLAY_ID, IDX_SCORES_UR, IDX_SCORES_USER_ID) + override fun getIndexes(): List = listOf(IDX_SCORES_BEATMAP_ID, IDX_SCORES_BEATMAP_ID_REPLAY_ID, IDX_SCORES_BEATMAP_ID_REPLAY_ID_UR, IDX_SCORES_IS_BANNED, IDX_SCORES_KEYPRESSES_STANDARD_DEVIATION_ADJUSTED, IDX_SCORES_PP, IDX_SCORES_REPLAY_ID, IDX_SCORES_SLIDEREND_RELEASE_STANDARD_DEVIATION_ADJUSTED, IDX_SCORES_UR, IDX_SCORES_USER_ID) override fun getPrimaryKey(): UniqueKey = SCORES_PKEY override fun getUniqueKeys(): List> = listOf(REPLAY_ID_UNIQUE) diff --git a/nise-backend/src/main/kotlin/com/nisemoe/generated/tables/records/ScoresRecord.kt b/nise-backend/src/main/kotlin/com/nisemoe/generated/tables/records/ScoresRecord.kt index 3b66a2b..4e99db1 100644 --- a/nise-backend/src/main/kotlin/com/nisemoe/generated/tables/records/ScoresRecord.kt +++ b/nise-backend/src/main/kotlin/com/nisemoe/generated/tables/records/ScoresRecord.kt @@ -205,6 +205,10 @@ open class ScoresRecord private constructor() : UpdatableRecordImpl? = null, keypressesMedian: Double? = null, keypressesStandardDeviation: Double? = null, sliderendReleaseTimes: Array? = null, sliderendReleaseMedian: Double? = null, sliderendReleaseStandardDeviation: Double? = null, keypressesMedianAdjusted: Double? = null, keypressesStandardDeviationAdjusted: Double? = null, sliderendReleaseMedianAdjusted: Double? = null, sliderendReleaseStandardDeviationAdjusted: Double? = null, judgements: ByteArray? = null): this() { + constructor(id: Int? = null, beatmapId: Int? = null, count_100: Int? = null, count_300: Int? = null, count_50: Int? = null, countMiss: Int? = null, date: LocalDateTime? = null, maxCombo: Int? = null, mods: Int? = null, perfect: Boolean? = null, pp: Double? = null, rank: String? = null, replayAvailable: Boolean? = null, replayId: Long? = null, score: Long? = null, userId: Long? = null, replay: ByteArray? = null, ur: Double? = null, frametime: Double? = null, edgeHits: Int? = null, snaps: Int? = null, isBanned: Boolean? = null, adjustedUr: Double? = null, meanError: Double? = null, errorVariance: Double? = null, errorStandardDeviation: Double? = null, minimumError: Double? = null, maximumError: Double? = null, errorRange: Double? = null, errorCoefficientOfVariation: Double? = null, errorKurtosis: Double? = null, errorSkewness: Double? = null, sentDiscordNotification: Boolean? = null, addedAt: OffsetDateTime? = null, version: Int? = null, keypressesTimes: Array? = null, keypressesMedian: Double? = null, keypressesStandardDeviation: Double? = null, sliderendReleaseTimes: Array? = null, sliderendReleaseMedian: Double? = null, sliderendReleaseStandardDeviation: Double? = null, keypressesMedianAdjusted: Double? = null, keypressesStandardDeviationAdjusted: Double? = null, sliderendReleaseMedianAdjusted: Double? = null, sliderendReleaseStandardDeviationAdjusted: Double? = null, judgements: ByteArray? = null, leaderboardRank: Long? = null): this() { this.id = id this.beatmapId = beatmapId this.count_100 = count_100 @@ -261,6 +265,7 @@ open class ScoresRecord private constructor() : UpdatableRecordImpl serializer.decodeFromString(response.body()) + else -> null + } + + return if (scoreId == null || score?.score?.id == scoreId) score else null + } + fun searchBeatmapsets(cursor: OsuApiModels.BeatmapsetSearchResultCursor?): OsuApiModels.BeatmapsetSearchResult? { val queryParams = mutableMapOf( "s" to "ranked", // Status [only ranked] diff --git a/nise-backend/src/main/kotlin/com/nisemoe/nise/osu/OsuApiModels.kt b/nise-backend/src/main/kotlin/com/nisemoe/nise/osu/OsuApiModels.kt index cd4a613..4ef1988 100644 --- a/nise-backend/src/main/kotlin/com/nisemoe/nise/osu/OsuApiModels.kt +++ b/nise-backend/src/main/kotlin/com/nisemoe/nise/osu/OsuApiModels.kt @@ -140,6 +140,12 @@ class OsuApiModels { val scores: List ) + @Serializable + data class UserScore( + val score: Score, + val position: Long, + ) + @Serializable enum class Grade { @SerialName("XH") diff --git a/nise-backend/src/main/kotlin/com/nisemoe/nise/scheduler/ImportScores.kt b/nise-backend/src/main/kotlin/com/nisemoe/nise/scheduler/ImportScores.kt index f25e799..0927a6e 100644 --- a/nise-backend/src/main/kotlin/com/nisemoe/nise/scheduler/ImportScores.kt +++ b/nise-backend/src/main/kotlin/com/nisemoe/nise/scheduler/ImportScores.kt @@ -727,6 +727,8 @@ class ImportScores( return } + val topScore = osuApi.getUserBeatmapScore(score.user_id, beatmapId, score.best_id) + dslContext.insertInto(SCORES) .set(SCORES.BEATMAP_ID, beatmapId) .set(SCORES.COUNT_300, score.statistics.count_300) @@ -745,6 +747,7 @@ class ImportScores( .set(SCORES.REPLAY_ID, score.best_id) .set(SCORES.USER_ID, score.user_id) .set(SCORES.VERSION, CURRENT_VERSION) + .set(SCORES.LEADERBOARD_RANK, topScore?.position) .execute() this.statistics.scoresAddedToDatabase++ diff --git a/nise-backend/src/main/resources/db/migration/V0.0.1.035__create_score_leaderboard_rank.sql b/nise-backend/src/main/resources/db/migration/V0.0.1.035__create_score_leaderboard_rank.sql new file mode 100644 index 0000000..96c192e --- /dev/null +++ b/nise-backend/src/main/resources/db/migration/V0.0.1.035__create_score_leaderboard_rank.sql @@ -0,0 +1 @@ +ALTER TABLE public.scores ADD COLUMN leaderboard_rank BIGINT; \ No newline at end of file