Add config property for ratings date freeze

This commit is contained in:
Claude Brisson
2024-03-14 22:41:40 +01:00
parent 0510018230
commit 44ec1e5709
2 changed files with 27 additions and 9 deletions

View File

@@ -9,8 +9,6 @@ import org.slf4j.LoggerFactory
import java.io.File import java.io.File
import java.net.URL import java.net.URL
import java.nio.charset.StandardCharsets import java.nio.charset.StandardCharsets
import java.text.DateFormat
import java.text.SimpleDateFormat
import java.time.LocalDate import java.time.LocalDate
import java.time.format.DateTimeFormatter import java.time.format.DateTimeFormatter
import java.util.* import java.util.*
@@ -26,15 +24,15 @@ abstract class RatingsHandler(val origin: RatingsManager.Ratings) {
private val client = OkHttpClient() private val client = OkHttpClient()
abstract val defaultURL: URL abstract val defaultURL: URL
open val active = true open val active = true
// val cacheFile = RatingsManager.path.resolve("${origin.name}.json").toFile()
lateinit var players: Json.Array lateinit var players: Json.Array
lateinit var activeRatingsFile: File
private var updated = false private var updated = false
val url: URL by lazy { val url: URL by lazy {
WebappManager.properties.getProperty("ratings.${origin.name.lowercase(Locale.ROOT)}")?.let { URL(it) } ?: defaultURL WebappManager.properties.getProperty("ratings.${origin.name.lowercase(Locale.ROOT)}")?.let { URL(it) } ?: defaultURL
} }
private fun getRatingsFiles() = RatingsManager.path.useDirectoryEntries("${origin.name}-*.json") { entries -> public fun getRatingsFiles() = RatingsManager.path.useDirectoryEntries("${origin.name}-*.json") { entries ->
entries.sortedBy { it.fileName.name }.map { entries.sortedBy { it.fileName.name }.map {
it.toFile() it.toFile()
}.toList() }.toList()
@@ -44,11 +42,19 @@ abstract class RatingsHandler(val origin: RatingsManager.Ratings) {
private fun initIfNeeded(ratingsFile: File): Boolean { private fun initIfNeeded(ratingsFile: File): Boolean {
return if (!this::players.isInitialized) { return if (!this::players.isInitialized) {
players = Json.parse(ratingsFile.readText())?.asArray() ?: Json.Array() readPlayers(ratingsFile)
true true
} else false } else false
} }
@Synchronized
private fun readPlayers(ratingsFile: File) {
logger.info("Reading ${origin.name} players from ${ratingsFile.canonicalPath}")
players = Json.parse(ratingsFile.readText())?.asArray() ?: Json.Array()
activeRatingsFile = ratingsFile
}
@Synchronized
fun updateIfNeeded(): Boolean { fun updateIfNeeded(): Boolean {
val latestRatingsFile = getLatestRatingsFile() val latestRatingsFile = getLatestRatingsFile()
if (latestRatingsFile != null && Date().time - latestRatingsFile.lastModified() < delay) { if (latestRatingsFile != null && Date().time - latestRatingsFile.lastModified() < delay) {
@@ -56,12 +62,13 @@ abstract class RatingsHandler(val origin: RatingsManager.Ratings) {
} }
val payload = fetchPayload() val payload = fetchPayload()
val (lastUpdated, lastPlayers) = parsePayload(payload) val (lastUpdated, lastPlayers) = parsePayload(payload)
val targetRatingsFilename = "${origin.name}-${ymd.format(lastUpdated)}.json" val ratingsFilename = "${origin.name}-${ymd.format(lastUpdated)}.json"
if (latestRatingsFile != null && latestRatingsFile.name == targetRatingsFilename) { if (latestRatingsFile != null && latestRatingsFile.name == ratingsFilename) {
return initIfNeeded(latestRatingsFile) return initIfNeeded(latestRatingsFile)
} }
RatingsManager.logger.info("Updating $origin cache from $url") RatingsManager.logger.info("Updating $origin cache from $url")
RatingsManager.path.resolve(targetRatingsFilename).toFile().printWriter().use { out -> activeRatingsFile = RatingsManager.path.resolve(ratingsFilename).toFile()
activeRatingsFile.printWriter().use { out ->
out.println(lastPlayers.toString()) out.println(lastPlayers.toString())
} }
players = lastPlayers players = lastPlayers
@@ -73,6 +80,11 @@ abstract class RatingsHandler(val origin: RatingsManager.Ratings) {
return players return players
} }
fun fetchPlayers(ratingsFile: File): Json.Array {
initIfNeeded(ratingsFile)
return players
}
protected fun fetchPayload(): String { protected fun fetchPayload(): String {
val request = Request.Builder() val request = Request.Builder()
.url(url) .url(url)

View File

@@ -7,6 +7,7 @@ import org.slf4j.LoggerFactory
import java.io.BufferedReader import java.io.BufferedReader
import java.lang.Exception import java.lang.Exception
import java.nio.file.Path import java.nio.file.Path
import java.nio.file.Paths
import java.util.* import java.util.*
import java.util.concurrent.locks.ReadWriteLock import java.util.concurrent.locks.ReadWriteLock
import java.util.concurrent.locks.ReentrantReadWriteLock import java.util.concurrent.locks.ReentrantReadWriteLock
@@ -53,7 +54,12 @@ object RatingsManager: Runnable {
override fun run() { override fun run() {
try { try {
players = ratingsHandlers.values.filter { it.active }.flatMapTo(Json.MutableArray()) { ratings -> players = ratingsHandlers.values.filter { it.active }.flatMapTo(Json.MutableArray()) { ratings ->
ratings.fetchPlayers() val ratingsFile = WebappManager.properties.getProperty("ratings.${ratings.origin.name.lowercase()}") as String?
if (ratingsFile == null) {
ratings.fetchPlayers()
} else {
ratings.fetchPlayers(Paths.get("").resolve(ratingsFile).toFile())
}
} }
val updated = ratingsHandlers.values.filter { it.active }.map { it.updated() }.reduce { u1, u2 -> val updated = ratingsHandlers.values.filter { it.active }.map { it.updated() }.reduce { u1, u2 ->
u1 or u2 u1 or u2