diff --git a/src/main/kotlin/de/arindy/dicetower/DiceResource.kt b/src/main/kotlin/de/arindy/dicetower/DiceResource.kt index bd69959..f0b2dea 100644 --- a/src/main/kotlin/de/arindy/dicetower/DiceResource.kt +++ b/src/main/kotlin/de/arindy/dicetower/DiceResource.kt @@ -26,9 +26,6 @@ final class DiceResource(@Context val sse: Sse) { @POST @Consumes(MediaType.APPLICATION_JSON) fun parseCommand(@PathParam("id") id: String, data: RollPayload) { - if (!sseBroadcasters.containsKey(id)) { - sseBroadcasters[id] = sse.newBroadcaster() - } data.roll = data.command.split(" ", "&", "and").filter { it.isNotEmpty() }.map { it.trim() }.toTypedArray() data.room = id.split(":")[0] data.user = id.split(":")[1] @@ -41,6 +38,17 @@ final class DiceResource(@Context val sse: Sse) { } } + @POST + @Path("/register") + @Consumes(MediaType.APPLICATION_JSON) + fun register(@PathParam("id") id: String, data: Any) { + println("id = [${id}], data = [${data}]") + sseBroadcasters["register:$id"]?.broadcast( + eventBuilder.id((UUID.randomUUID()).toString()) + .mediaType(MediaType.APPLICATION_JSON_TYPE).data(data).build()) + + } + @POST @Path("/results") @Consumes(MediaType.APPLICATION_JSON) @@ -71,6 +79,16 @@ final class DiceResource(@Context val sse: Sse) { sseBroadcasters[id]?.register(sseEventSink) } + @GET + @Path("/users") + @Produces(MediaType.SERVER_SENT_EVENTS) + fun users(@PathParam("id") id: String, @Context sseEventSink: SseEventSink) { + if (!sseBroadcasters.containsKey("register:$id")) { + sseBroadcasters["register:$id"] = sse.newBroadcaster() + } + sseBroadcasters["register:$id"]?.register(sseEventSink) + } + @RegisterForReflection data class Result(val name: String, val user: String, val themeColor: String) {} diff --git a/src/main/resources/templates/pub/index.html b/src/main/resources/templates/pub/index.html index 34f4b94..b269b95 100644 --- a/src/main/resources/templates/pub/index.html +++ b/src/main/resources/templates/pub/index.html @@ -140,6 +140,70 @@ height: 100%; margin: 20px } + + .checkbox { + position: relative; + padding-left: 100px; + margin-bottom: 12px; + margin-left: 10px; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + .checkbox input { + position: absolute; + opacity: 0; + cursor: pointer; + height: 0; + width: 0; + } + + .checkmark { + margin-left: 75px; + position: absolute; + top: 0; + left: 0; + height: 15px; + width: 15px; + background-color: #eee; + } + + .checkbox:hover input ~ .checkmark { + background-color: #ccc; + } + + /* When the checkbox is checked, add a blue background */ + .checkbox input:checked ~ .checkmark { + background-color: #333333; + } + + /* Create the checkmark/indicator (hidden when not checked) */ + .checkmark:after { + content: ""; + position: absolute; + display: none; + } + + /* Show the checkmark when checked */ + .checkbox input:checked ~ .checkmark:after { + display: block; + } + + /* Style the checkmark/indicator */ + .checkbox .checkmark:after { + left: 5px; + top: 2px; + width: 5px; + height: 10px; + border: solid white; + border-width: 0 3px 3px 0; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + } @@ -148,18 +212,26 @@


- +
+ + +