Add config property for ratings date freeze
This commit is contained in:
@@ -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)
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user