Web admin app loads list of players

This commit is contained in:
2026-08-25 10:10:47 -04:00
parent d62575df16
commit d1ef2956d8
12 changed files with 178 additions and 44 deletions
+4
View File
@@ -18,6 +18,10 @@ kotlin {
commonMain.dependencies {
implementation(libs.kotlinx.serialization)
implementation(libs.kotlinx.datetime)
implementation(libs.ktor.serialization.kotlinx.json)
implementation(libs.ktor.client.core)
implementation(libs.ktor.client.cio)
implementation(libs.ktor.client.content.negotiation)
}
wasmJsMain.dependencies {
@@ -0,0 +1,112 @@
package dev.geekback.dopewars.shared
import dev.geekback.dopewars.shared.api.PlayerNameUpdateRequest
import dev.geekback.dopewars.shared.api.TravelRequest
import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.engine.cio.CIO
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
import io.ktor.client.request.get
import io.ktor.client.request.post
import io.ktor.client.request.setBody
import io.ktor.http.ContentType
import io.ktor.http.HttpStatusCode
import io.ktor.http.contentType
import io.ktor.serialization.kotlinx.json.json
import kotlinx.serialization.json.Json
/**
* ApiClient
*
* Client for accessing the Dopewars API server
*/
class ApiClient() {
private var address: String = ""
private val client = HttpClient(CIO) {
install(ContentNegotiation) {
json(
Json {
allowSpecialFloatingPointValues = true
ignoreUnknownKeys = true
prettyPrint = true
isLenient = true
})
}
}
fun new(address: String) {
this.address = address
}
/**
* login
*
* Create a new game
*/
suspend fun login(baseUrl: String): Player {
println("URL = [${baseUrl}/players]")
val response = client.post(urlString = "$baseUrl/players") {
contentType(ContentType.Application.Json)
}
return if (response.status == HttpStatusCode.Created) {
response.body()
} else {
println("Login fail. -> ${response.status}")
Player(name = "Invalid Login Attempt", id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")
}
}
suspend fun market(forPlayer: Player): Market {
val result: Market = client.get("${this.address}/market/${forPlayer.id}") {
contentType(ContentType.Application.Json)
}.body()
return result
}
suspend fun rename(newName: String, player: Player): Player {
val response = client.post("${this.address}/players/${player.id}/rename") {
val newBody = PlayerNameUpdateRequest(newName)
setBody(newBody)
contentType(ContentType.Application.Json)
}
return if (response.status == HttpStatusCode.OK) {
val result: Player = response.body()
println("Rename Success -> $result")
result
} else {
println("Rename Fail -> ${response.status} / ${this.address}/players/${player.id}/rename")
player
}
}
suspend fun refreshPlayer(initialState: Player): Player {
val response = client.get("${this.address}/players/${initialState.id}") {
contentType(ContentType.Application.Json)
}
return if (response.status == HttpStatusCode.OK) {
val result: Player = response.body()
println("Refresh Success -> $result")
result
} else {
println("Refresh Failure")
initialState
}
}
suspend fun travel(baseUrl: String, playerId: String, destination: TravelRequest) {
val response = client.post("$baseUrl/players/${playerId}/travel") {
setBody(destination)
contentType(ContentType.Application.Json)
}
println("Travel result -> $response")
}
// suspend fun travel(destination: Location): TravelResult {
// val response = client.get("${this.address}/players/${this.player}")
// }
}