Stonks/app/src/main/kotlin/xyz/etztech/stonks/App.kt

99 lines
3.1 KiB
Kotlin

package xyz.etztech.stonks
import kotlinx.coroutines.*
import org.h2.tools.Server
import org.jetbrains.exposed.exceptions.ExposedSQLException
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.transactions.TransactionManager
import org.jetbrains.exposed.sql.transactions.transaction
import xyz.etztech.stonks.api.initApiServer
import xyz.etztech.stonks.dsl.Statistics
import xyz.etztech.stonks.statisticsimporter.StatisticsImporter
fun main() =
runBlocking {
println("Starting Stonks...")
val databaseBaseDir = "./databases"
val databaseName = "statistics"
val h2StartWebServer = true
val h2tWebServerPort = 8082
val h2TcpServerPort = 9092
val database =
initH2Server(
databaseBaseDir,
databaseName,
h2TcpServerPort,
h2StartWebServer,
h2tWebServerPort)
val apiServerPort = 7000
initApiServer(apiServerPort, database)
val periodicFetchingInterval = 15 * 60 * 1000L
val minecraftStatsFolder = "../test_data"
initPeriodicFetching(periodicFetchingInterval, minecraftStatsFolder, database)
delay(60 * 1000L)
println("END")
}
fun initH2Server(
databaseBaseDir: String,
databaseName: String,
h2TcpServerPort: Int,
h2StartWebServer: Boolean,
h2WebServerPort: Int
): Database {
val webServer =
Server.createWebServer(
"-trace", "-baseDir", databaseBaseDir, "-webPort", h2WebServerPort.toString())
val tcpServer =
Server.createTcpServer(
"-trace", "-baseDir", databaseBaseDir, "-webPort", h2TcpServerPort.toString())
if (h2StartWebServer) {
webServer.start()
println("H2 web interface started: ${webServer.getURL()}")
}
tcpServer.start()
println("H2 TCP endpoint started: ${tcpServer.getURL()}")
val database = Database.connect("jdbc:h2:$databaseBaseDir/$databaseName", "org.h2.Driver")
transaction {
addLogger(StdOutSqlLogger)
SchemaUtils.create(Statistics)
// Create indexes with explicit SQL because I can't figure out how to do it with exposed
// Wrap it in a try block because it throws an exception if index already exists
try {
TransactionManager.current()
.exec("CREATE INDEX idx_playerid ON Statistics (\"PlayerId\")")
} catch (e: ExposedSQLException) {}
try {
TransactionManager.current()
.exec("CREATE INDEX idx_type_name ON Statistics (\"Type\", \"Name\")")
} catch (e: ExposedSQLException) {}
}
return database
}
suspend fun initPeriodicFetching(interval: Long, folder: String, db: Database) =
coroutineScope {
launch {
while (true) {
StatisticsImporter.importStatistics(folder, db)
delay(interval)
}
}
}