diff --git a/src/main/kotlin/de/arindy/dicetower/DiceResource.kt b/src/main/kotlin/de/arindy/dicetower/DiceResource.kt index 2cf1fff..e33aec4 100644 --- a/src/main/kotlin/de/arindy/dicetower/DiceResource.kt +++ b/src/main/kotlin/de/arindy/dicetower/DiceResource.kt @@ -35,27 +35,31 @@ final class DiceResource(@Context val sse: Sse) { fun parseCommand(@PathParam("id") id: String, data: RollPayload) { data.room = id.split(":")[0] data.user = id.split(":")[1] - val results = ArrayList() - var numberOfDice = 0 - data.command.split(" ", "&", "and").filter { it.isNotEmpty() }.map { it.trim() }.toTypedArray().forEach { command -> - val dice = command.split("d") - var amount = dice[0].toInt() - val limit = diceLimit.orElse(LIMIT) - if (limit < numberOfDice + amount) { - amount = limit - numberOfDice - } - numberOfDice += amount - if (amount > 0) { - val result = IntArray(amount) - val sides = dice[1].split("+", "-") - val modifier = if (dice[1].contains("+")) sides[1].toInt() else if (dice[1].contains("+")) -1 * sides[1].toInt() else 0 - repeat(amount) { index -> - result[index] = (Math.random() * sides[0].toInt() + 1).toInt() + if (data.results == null) { + var numberOfDice = 0 + data.command.split(" ", "&", "and").filter { it.isNotEmpty() }.map { it.trim() }.toTypedArray().forEach { command -> + val dice = command.split("d") + var amount = dice[0].toInt() + val limit = diceLimit.orElse(LIMIT) + if (limit < numberOfDice + amount) { + amount = limit - numberOfDice + } + numberOfDice += amount + if (amount > 0) { + val result = IntArray(amount) + val sides = dice[1].split("+", "-") + val modifier = if (dice[1].contains("+")) sides[1].toInt() else if (dice[1].contains("+")) -1 * sides[1].toInt() else 0 + repeat(amount) { index -> + result[index] = (Math.random() * sides[0].toInt() + 1).toInt() + } + results.add(Results(sides[0].toInt(), modifier, result.sum() + modifier, result.map { Roll(it) }.toTypedArray())) } - results.add(Results(sides[0].toInt(), modifier, result.sum() + modifier, result.map { Roll(it) }.toTypedArray())) } + } else { + results.addAll(data.results) } + val map = results.map { r -> "${r.rolls.size}d${r.sides}@${ if (r.sides == 100) r.rolls.map { roll -> Roll(roll.value / 10 * 10) } @@ -64,13 +68,13 @@ final class DiceResource(@Context val sse: Sse) { }.toTypedArray() data.roll = map + results.filter { it.sides == 100 }.map { r -> "${r.rolls.size}d10@${r.rolls.map { roll -> Roll(roll.value % 10) }.joinToString(",")}"}.toTypedArray() + if (data.roll.all { it.trim().isNotEmpty() }) { + results(data.room!!, Result(data.name, data.user!!, data.faceColor, null)) + } sseBroadcasters[id]?.broadcast( eventBuilder.id((UUID.randomUUID()).toString()) .mediaType(MediaType.APPLICATION_JSON_TYPE).data(data).build() ) - if (data.roll.all { it.trim().isNotEmpty() }) { - results(data.room!!, Result(data.name, data.user!!, data.faceColor, null)) - } Thread.sleep(1000) results(data.room!!, Result(data.name, data.user!!, data.faceColor, results.toTypedArray())) } diff --git a/src/main/kotlin/de/arindy/dicetower/OverlayResource.kt b/src/main/kotlin/de/arindy/dicetower/OverlayResource.kt index 85214ca..0438e58 100644 --- a/src/main/kotlin/de/arindy/dicetower/OverlayResource.kt +++ b/src/main/kotlin/de/arindy/dicetower/OverlayResource.kt @@ -20,7 +20,7 @@ class OverlayResource { @GET @Path("/results") @Produces(MediaType.TEXT_HTML) - fun results(@PathParam("diceid") room: String, @QueryParam("name") name: String?, @QueryParam("user") user: String?): TemplateInstance { - return Templates.results(room, name ?: "all", user ?: "all") + fun results(@PathParam("diceid") room: String, @QueryParam("name") name: String?): TemplateInstance { + return Templates.results(room, name ?: "all") } } diff --git a/src/main/kotlin/de/arindy/dicetower/RollPayload.kt b/src/main/kotlin/de/arindy/dicetower/RollPayload.kt index ebab08f..bb21562 100644 --- a/src/main/kotlin/de/arindy/dicetower/RollPayload.kt +++ b/src/main/kotlin/de/arindy/dicetower/RollPayload.kt @@ -6,7 +6,7 @@ import io.quarkus.runtime.annotations.RegisterForReflection data class RollPayload( val name: String, var command: String, - var predetermined: Boolean? = false, + val results: Array?, val faceColor: String = "white", val numberColor: String = "white", val theme: String = "default", diff --git a/src/main/kotlin/de/arindy/dicetower/Templates.kt b/src/main/kotlin/de/arindy/dicetower/Templates.kt index 072978f..1de4962 100644 --- a/src/main/kotlin/de/arindy/dicetower/Templates.kt +++ b/src/main/kotlin/de/arindy/dicetower/Templates.kt @@ -9,7 +9,7 @@ object Templates { external fun overlay(diceid: String, scale: Int?, clearAfter: Long?): TemplateInstance @JvmStatic - external fun results(room: String, name: String?, user: String?): TemplateInstance + external fun results(room: String, name: String?): TemplateInstance @JvmStatic external fun index(version: String): TemplateInstance diff --git a/src/main/resources/templates/results.html b/src/main/resources/templates/results.html index 5c2fb89..1f47002 100644 --- a/src/main/resources/templates/results.html +++ b/src/main/resources/templates/results.html @@ -17,9 +17,9 @@ const evtSource = new EventSource(url() + '/dice/{room}/results'); evtSource.addEventListener('message', function (event) { let data = JSON.parse(event.data); - if ("{name}" === "all" && "{user}" === "all" || "{name}" === data.name && "{user}" === data.user || "{name}" === "all" && "{user}" === data.user || "{name}" === data.name && "{user}" === "all") { - let name = document.getElementById(data.user + '-' + data.name) ?? document.createElement('div'); - name.id = data.user + '-' + data.name; + if ("{name}" === "all" || "{name}" === data.name) { + let name = document.getElementById(data.name) ?? document.createElement('div'); + name.id = data.name; name.replaceChildren(...[]); let node = document.createElement('p'); let resultText = ''