forked from SteamWar/SteamWar
Merge pull request 'Refactor leaderboard management' (#166) from Lobby/refactor-leaderboard into main
Reviewed-on: SteamWar/SteamWar#166
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2025 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.sql
|
||||
|
||||
import de.steamwar.sql.internal.useDb
|
||||
import org.jetbrains.exposed.v1.core.SortOrder
|
||||
import org.jetbrains.exposed.v1.core.and
|
||||
import org.jetbrains.exposed.v1.core.count
|
||||
import org.jetbrains.exposed.v1.core.dao.id.CompositeID
|
||||
import org.jetbrains.exposed.v1.core.dao.id.CompositeIdTable
|
||||
import org.jetbrains.exposed.v1.core.dao.id.EntityID
|
||||
import org.jetbrains.exposed.v1.core.eq
|
||||
import org.jetbrains.exposed.v1.core.lessSubQuery
|
||||
import org.jetbrains.exposed.v1.dao.CompositeEntity
|
||||
import org.jetbrains.exposed.v1.dao.CompositeEntityClass
|
||||
import org.jetbrains.exposed.v1.javatime.CurrentTimestamp
|
||||
import org.jetbrains.exposed.v1.javatime.timestamp
|
||||
import org.jetbrains.exposed.v1.jdbc.select
|
||||
|
||||
object LeaderboardTable : CompositeIdTable("Leaderboard") {
|
||||
val userId = reference("UserId", SteamwarUserTable)
|
||||
val name = varchar("Name", 64).entityId()
|
||||
val time = long("Time")
|
||||
val updatedAt = timestamp("UpdatedAt").defaultExpression(CurrentTimestamp)
|
||||
val bestTime = bool("BestTime")
|
||||
}
|
||||
|
||||
class Leaderboard(id: EntityID<CompositeID>) : CompositeEntity(id) {
|
||||
companion object : CompositeEntityClass<Leaderboard>(LeaderboardTable) {
|
||||
@JvmStatic
|
||||
fun getLeaderboard(name: String) = useDb {
|
||||
find { LeaderboardTable.name eq name }.orderBy(LeaderboardTable.time to SortOrder.ASC).limit(5).toList()
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun getPlayerTime(user: SteamwarUser, name: String) = useDb {
|
||||
findById(CompositeID {
|
||||
it[LeaderboardTable.userId] = user.id.value
|
||||
it[LeaderboardTable.name] = name
|
||||
})
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun getPlayerPlacement(user: SteamwarUser, name: String) = useDb {
|
||||
LeaderboardTable.select(LeaderboardTable.time.count())
|
||||
.where {
|
||||
(LeaderboardTable.name eq name) and (LeaderboardTable.time lessSubQuery LeaderboardTable.select(
|
||||
LeaderboardTable.time
|
||||
).where { (LeaderboardTable.userId eq user.id.value) and (LeaderboardTable.name eq name) })
|
||||
}
|
||||
.firstOrNull()?.get(LeaderboardTable.time.count())?.toInt() ?: Int.MAX_VALUE
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun upsert(userId: Int, name: String, time: Long, bestTime: Boolean) = useDb {
|
||||
findByIdAndUpdate(CompositeID {
|
||||
it[LeaderboardTable.userId] = userId
|
||||
it[LeaderboardTable.name] = name
|
||||
}) {
|
||||
it.time = time
|
||||
it.bestTime = bestTime
|
||||
} ?: new(
|
||||
CompositeID {
|
||||
it[LeaderboardTable.userId] = userId
|
||||
it[LeaderboardTable.name] = name
|
||||
}
|
||||
) {
|
||||
this.time = time
|
||||
this.bestTime = bestTime
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val user by LeaderboardTable.userId.transform({ EntityID(it, SteamwarUserTable) }, { it.value })
|
||||
val name by LeaderboardTable.name
|
||||
var time by LeaderboardTable.time
|
||||
var updatedAt by LeaderboardTable.updatedAt
|
||||
var bestTime by LeaderboardTable.bestTime
|
||||
}
|
||||
Reference in New Issue
Block a user