12 Commits
1.2.2 ... 1.2.5

Author SHA1 Message Date
gitea
0a3beb2d74 [no ci] release 1.2.5 2025-02-22 13:56:29 +00:00
67cffae431 Merge pull request 'removes d2 from quickroll and overlay' (#40) from remove-d2 into main
All checks were successful
CI / deploy (push) Successful in 5m48s
Reviewed-on: #40
2025-02-22 14:50:48 +01:00
19ff90284a removes d2 from quickroll and overlay
All checks were successful
CI / deploy (push) Successful in 5m40s
CI / deploy (pull_request) Successful in 5m32s
2025-02-22 14:37:39 +01:00
gitea
6bf306dcc7 [no ci] prepare new Version 2025-02-22 13:15:24 +00:00
gitea
a215647947 [no ci] release 1.2.4 2025-02-22 13:15:16 +00:00
741276e477 Merge pull request 'caps the number of allowed dice' (#39) from limit-number-of-diece into main
All checks were successful
CI / deploy (push) Successful in 6m6s
Reviewed-on: #39
2025-02-22 14:09:17 +01:00
4da0d7b1f0 caps the number of allowed dice
All checks were successful
CI / deploy (push) Successful in 5m39s
CI / deploy (pull_request) Successful in 5m38s
2025-02-22 13:53:49 +01:00
gitea
2ca9ad6f5a [no ci] prepare new Version 2025-02-22 11:44:33 +00:00
gitea
ab51fdc281 [no ci] release 1.2.3 2025-02-22 11:44:25 +00:00
c04b4f67d2 Merge pull request 'reregister users on roll' (#38) from register-user-on-roll into main
All checks were successful
CI / deploy (push) Successful in 6m6s
Reviewed-on: #38
2025-02-22 12:38:27 +01:00
d030eda0e9 reregister users on roll
All checks were successful
CI / deploy (push) Successful in 5m48s
CI / deploy (pull_request) Successful in 6m0s
2025-02-22 12:16:22 +01:00
gitea
8a4032756e [no ci] prepare new Version 2025-02-16 19:05:25 +00:00
6 changed files with 57 additions and 38 deletions

View File

@@ -42,6 +42,8 @@ services:
restart: always
ports:
- "8080:8080"
environment:
DICE_LIMIT: 30 # OPTIONAL: amount of dice allowed to roll (default: 30)
```
Run the container with:
```bash

View File

@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>de.arindy</groupId>
<artifactId>dice-tower</artifactId>
<version>1.2.2</version>
<version>1.2.5</version>
<properties>
<compiler-plugin.version>3.13.0</compiler-plugin.version>

View File

@@ -14,12 +14,19 @@ import jakarta.ws.rs.sse.OutboundSseEvent
import jakarta.ws.rs.sse.Sse
import jakarta.ws.rs.sse.SseBroadcaster
import jakarta.ws.rs.sse.SseEventSink
import org.eclipse.microprofile.config.inject.ConfigProperty
import java.util.Optional
import java.util.UUID
private const val LIMIT = 30
@Path("/dice/{id}")
@ApplicationScoped
final class DiceResource(@Context val sse: Sse) {
@ConfigProperty(name = "dice.limit")
private lateinit var diceLimit: Optional<Int>
private var eventBuilder: OutboundSseEvent.Builder = sse.newEventBuilder()
private var sseBroadcasters: MutableMap<String, SseBroadcaster> = HashMap()
@@ -30,15 +37,24 @@ final class DiceResource(@Context val sse: Sse) {
data.user = id.split(":")[1]
val results = ArrayList<Results>()
var numberOfDice = 0
data.command.split(" ", "&", "and").filter { it.isNotEmpty() }.map { it.trim() }.toTypedArray<String>().forEach { command ->
val dice = command.split("d")
val result = IntArray(dice[0].toInt())
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(dice[0].toInt()) { index ->
result[index] = (Math.random() * sides[0].toInt() + 1).toInt()
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()))
}
val map = results.map { r ->
"${r.rolls.size}d${r.sides}@${

View File

@@ -14,6 +14,17 @@ function url() {
return window.location.protocol + '//' + window.location.hostname + (window.location.port?.length > 0 ? ':' + window.location.port : '');
}
function register() {
let httpRequest = new XMLHttpRequest();
httpRequest.open('POST', url() + '/dice/' + document.getElementById('room').value + '/register')
httpRequest.setRequestHeader('Content-Type', 'application/json')
httpRequest.send(JSON.stringify({
name: document.getElementById('name').value,
overlay: document.getElementById('overlayId').value,
id: document.getElementById('room').value + ':' + localStorage.getItem('userId')
}))
}
function start(event = undefined) {
if ((!event || event.keyCode === 13) && document.getElementById('name').value.length > 0 && document.getElementById('room').value.length > 0) {
document.getElementById('overlayId').value = url() + '/overlay/' + document.getElementById('room').value + ':' + localStorage.getItem('userId') + '?scale=10&clearAfter=30';
@@ -61,14 +72,7 @@ function start(event = undefined) {
localStorage.setItem(document.getElementById('name').value + '-started', "true")
let httpRequest = new XMLHttpRequest();
httpRequest.open('POST', url() + '/dice/' + document.getElementById('room').value + '/register')
httpRequest.setRequestHeader('Content-Type', 'application/json')
httpRequest.send(JSON.stringify({
name: document.getElementById('name').value,
overlay: document.getElementById('overlayId').value,
id: document.getElementById('room').value + ':' + localStorage.getItem('userId')
}))
register();
if (document.getElementById('gm').checked) {
document.getElementById('resultSwitch').checked = true;
document.getElementById('resultFrame').src = document.getElementById('resultsId').value;
@@ -98,18 +102,21 @@ function start(event = undefined) {
newOverlay.appendChild(newInput);
overlays.appendChild(newOverlay);
let dice = document.createElement('iframe');
dice.id = data.id + '-diceFrame'
dice.style.width = "50%";
dice.style.height = "100%";
dice.style.overflow = "hidden";
dice.style.border = "0";
dice.style.zIndex = "4";
dice.style.position = "absolute";
dice.style.top = "0";
dice.style.left = "50%";
dice.src = data.overlay;
document.getElementById('results-dice').appendChild(dice)
if (!document.getElementById(data.id + '-diceFrame')) {
let dice = document.createElement('iframe');
dice.id = data.id + '-diceFrame'
dice.style.width = "50%";
dice.style.height = "100%";
dice.style.overflow = "hidden";
dice.style.border = "0";
dice.style.zIndex = "4";
dice.style.position = "absolute";
dice.style.top = "0";
dice.style.left = "50%";
dice.src = data.overlay;
document.getElementById('results-dice').appendChild(dice)
}
}
configurePopover();
@@ -125,6 +132,7 @@ function rollEasy(dice) {
function roll(event) {
if ((!event || event.keyCode === 13) && document.getElementById('command').value?.length > 0) {
register()
let httpRequest = new XMLHttpRequest();
httpRequest.open('POST', url() + '/dice/' + document.getElementById('room').value + ':' + localStorage.getItem(`userId`))
httpRequest.setRequestHeader('Content-Type', 'application/json')
@@ -207,11 +215,7 @@ document.addEventListener("DOMContentLoaded", async () => {
})
document.getElementById('resultDiceSwitch').addEventListener('change', function () {
if (!this.checked) {
document.getElementById('results-dice').hidden = true
} else {
document.getElementById('results-dice').hidden = false
}
document.getElementById('results-dice').hidden = !this.checked;
})
document.getElementById('chatOverlayLink').href = url() + '/chatoverlay'

View File

@@ -89,7 +89,7 @@
<button style="border: transparent; border-radius: 100%; font-size: large; font-weight: bold; height: 50px; width: 50px"
onclick="addDice()">+
</button>
<button style="font-size: large; font-weight: bold;" onclick="rollEasy('d2')">D2</button>
<!--<button style="font-size: large; font-weight: bold;" onclick="rollEasy('d2')">D2</button><-->
<button style="font-size: large; font-weight: bold;" onclick="rollEasy('d4')">D4</button>
<button style="font-size: large; font-weight: bold;" onclick="rollEasy('d6')">D6</button>
<button style="font-size: large; font-weight: bold;" onclick="rollEasy('d8')">D8</button>
@@ -202,11 +202,8 @@
<h2 style="text-align: center">How-To</h2>
<ul>
<li>
Join a room by entering your character name and the name of the room.<br/>
<strong>If you are a GM, make sure to join the room first or let all other players rejoin to get all
Overlay-URLs.</strong>
Join a room by entering your character name and the name of the room
</li>
<li>Open your Dice-Overlay either in a new Tab or as a browser source in OBS</li>
<ul>
<li>You can configure your Overlay with query parameters (for more information hover over the link)

View File

@@ -40,7 +40,7 @@
foreground: data.numberColor
}
}).then(() => {
diceBox.roll(data.roll.join('&'));
diceBox.roll(data.roll.filter(it => it.split('@')[0].split('d')[1] !== "2").join('&'));
})
})
</script>