Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8942988228 | ||
|
|
6fbedd92c7 | ||
| f4ec070f8f | |||
| b41d423837 | |||
|
|
18bb994a0f | ||
|
|
0e0406fa39 | ||
| 37ce450f2c | |||
| 152511b203 | |||
|
|
9e7bb02832 | ||
|
|
0a3beb2d74 | ||
| 67cffae431 | |||
| 19ff90284a | |||
|
|
6bf306dcc7 |
2
pom.xml
2
pom.xml
@@ -4,7 +4,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>de.arindy</groupId>
|
<groupId>de.arindy</groupId>
|
||||||
<artifactId>dice-tower</artifactId>
|
<artifactId>dice-tower</artifactId>
|
||||||
<version>1.2.4</version>
|
<version>1.2.8-SNAPSHOT</version>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<compiler-plugin.version>3.13.0</compiler-plugin.version>
|
<compiler-plugin.version>3.13.0</compiler-plugin.version>
|
||||||
|
|||||||
@@ -21,14 +21,16 @@ class ChatOverlayResource {
|
|||||||
@QueryParam("modsAllowed") modsAllowed: Boolean = false,
|
@QueryParam("modsAllowed") modsAllowed: Boolean = false,
|
||||||
@QueryParam("vipAllowed") vipAllowed: Boolean = false,
|
@QueryParam("vipAllowed") vipAllowed: Boolean = false,
|
||||||
@QueryParam("subsAllowed") subsAllowed: Boolean = false,
|
@QueryParam("subsAllowed") subsAllowed: Boolean = false,
|
||||||
|
@QueryParam("allAllowed") allAllowed: Boolean = false,
|
||||||
@QueryParam("cmd") cmd: String? = "roll",
|
@QueryParam("cmd") cmd: String? = "roll",
|
||||||
@QueryParam("theme") theme: String? = "default",
|
@QueryParam("theme") theme: String? = "default",
|
||||||
@QueryParam("faceColor") faceColor: String? = "#ff0202",
|
@QueryParam("faceColor") faceColor: String? = "#ff0202",
|
||||||
@QueryParam("numberColor") numberColor: String? = "#ffffff",
|
@QueryParam("numberColor") numberColor: String? = "#ffffff",
|
||||||
@QueryParam("clearAfter") clearAfter: Long? = -1,
|
@QueryParam("clearAfter") clearAfter: Long? = -1,
|
||||||
@QueryParam("timeout") timeout: Long? = -1
|
@QueryParam("timeout") timeout: Long? = -1,
|
||||||
|
@QueryParam("showResults") showResults: Boolean = true
|
||||||
): TemplateInstance {
|
): TemplateInstance {
|
||||||
return Templates.chatoverlay(channel, scale ?: 7, maxDice ?: 20, modsAllowed, vipAllowed, subsAllowed, cmd ?: "roll", theme ?: "default", faceColor ?: "#ff0202", numberColor ?: "#ffffff", clearAfter ?: 10, timeout ?: 60)
|
return Templates.chatoverlay(channel, scale ?: 7, maxDice ?: 20, modsAllowed, vipAllowed, subsAllowed, allAllowed, cmd ?: "roll", theme ?: "default", faceColor ?: "#ff0202", numberColor ?: "#ffffff", clearAfter ?: 10, timeout ?: 60, showResults)
|
||||||
}
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
|
|||||||
@@ -35,8 +35,8 @@ final class DiceResource(@Context val sse: Sse) {
|
|||||||
fun parseCommand(@PathParam("id") id: String, data: RollPayload) {
|
fun parseCommand(@PathParam("id") id: String, data: RollPayload) {
|
||||||
data.room = id.split(":")[0]
|
data.room = id.split(":")[0]
|
||||||
data.user = id.split(":")[1]
|
data.user = id.split(":")[1]
|
||||||
|
|
||||||
val results = ArrayList<Results>()
|
val results = ArrayList<Results>()
|
||||||
|
if (data.results == null) {
|
||||||
var numberOfDice = 0
|
var numberOfDice = 0
|
||||||
data.command.split(" ", "&", "and").filter { it.isNotEmpty() }.map { it.trim() }.toTypedArray<String>().forEach { command ->
|
data.command.split(" ", "&", "and").filter { it.isNotEmpty() }.map { it.trim() }.toTypedArray<String>().forEach { command ->
|
||||||
val dice = command.split("d")
|
val dice = command.split("d")
|
||||||
@@ -56,6 +56,10 @@ final class DiceResource(@Context val sse: Sse) {
|
|||||||
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 ->
|
val map = results.map { r ->
|
||||||
"${r.rolls.size}d${r.sides}@${
|
"${r.rolls.size}d${r.sides}@${
|
||||||
if (r.sides == 100) r.rolls.map { roll -> Roll(roll.value / 10 * 10) }
|
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()
|
}.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()
|
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(
|
sseBroadcasters[id]?.broadcast(
|
||||||
eventBuilder.id((UUID.randomUUID()).toString())
|
eventBuilder.id((UUID.randomUUID()).toString())
|
||||||
.mediaType(MediaType.APPLICATION_JSON_TYPE).data(data).build()
|
.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)
|
Thread.sleep(1000)
|
||||||
results(data.room!!, Result(data.name, data.user!!, data.faceColor, results.toTypedArray()))
|
results(data.room!!, Result(data.name, data.user!!, data.faceColor, results.toTypedArray()))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class OverlayResource {
|
|||||||
@GET
|
@GET
|
||||||
@Path("/results")
|
@Path("/results")
|
||||||
@Produces(MediaType.TEXT_HTML)
|
@Produces(MediaType.TEXT_HTML)
|
||||||
fun results(@PathParam("diceid") room: String, @QueryParam("name") name: String?, @QueryParam("user") user: String?): TemplateInstance {
|
fun results(@PathParam("diceid") room: String, @QueryParam("name") name: String?): TemplateInstance {
|
||||||
return Templates.results(room, name ?: "all", user ?: "all")
|
return Templates.results(room, name ?: "all")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import io.quarkus.runtime.annotations.RegisterForReflection
|
|||||||
data class RollPayload(
|
data class RollPayload(
|
||||||
val name: String,
|
val name: String,
|
||||||
var command: String,
|
var command: String,
|
||||||
var predetermined: Boolean? = false,
|
val results: Array<DiceResource.Results>?,
|
||||||
val faceColor: String = "white",
|
val faceColor: String = "white",
|
||||||
val numberColor: String = "white",
|
val numberColor: String = "white",
|
||||||
val theme: String = "default",
|
val theme: String = "default",
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ object Templates {
|
|||||||
external fun overlay(diceid: String, scale: Int?, clearAfter: Long?): TemplateInstance
|
external fun overlay(diceid: String, scale: Int?, clearAfter: Long?): TemplateInstance
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
external fun results(room: String, name: String?, user: String?): TemplateInstance
|
external fun results(room: String, name: String?): TemplateInstance
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
external fun index(version: String): TemplateInstance
|
external fun index(version: String): TemplateInstance
|
||||||
@@ -25,11 +25,13 @@ object Templates {
|
|||||||
modsAllowed: Boolean,
|
modsAllowed: Boolean,
|
||||||
vipAllowed: Boolean,
|
vipAllowed: Boolean,
|
||||||
subsAllowed: Boolean,
|
subsAllowed: Boolean,
|
||||||
|
allAllowed: Boolean,
|
||||||
cmd: String?,
|
cmd: String?,
|
||||||
theme: String?,
|
theme: String?,
|
||||||
faceColor: String?,
|
faceColor: String?,
|
||||||
numberColor: String?,
|
numberColor: String?,
|
||||||
clearAfter: Long?,
|
clearAfter: Long?,
|
||||||
timeout: Long?
|
timeout: Long?,
|
||||||
|
showResults: Boolean?
|
||||||
): TemplateInstance
|
): TemplateInstance
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,15 +123,15 @@ class ColorPicker extends HTMLElement {
|
|||||||
<div class="bg-cover" id="controls">
|
<div class="bg-cover" id="controls">
|
||||||
<label for="hue">
|
<label for="hue">
|
||||||
<abbr title="Hue: The color tint.">H</abbr>
|
<abbr title="Hue: The color tint.">H</abbr>
|
||||||
<input type="range" id="hue" min="0" max="360" value="0">
|
<input type="range" id="hue" min="0" max="360" value="0" step="0.01">
|
||||||
</label>
|
</label>
|
||||||
<label for="saturation">
|
<label for="saturation">
|
||||||
<abbr title="Saturation: The amount of gray in the color.">S</abbr>
|
<abbr title="Saturation: The amount of gray in the color.">S</abbr>
|
||||||
<input type="range" id="saturation" min="0" max="100" value="0">
|
<input type="range" id="saturation" min="0" max="100" value="0" step="0.01">
|
||||||
</label>
|
</label>
|
||||||
<label for="lightness">
|
<label for="lightness">
|
||||||
<abbr title="Lightness: How light or dark the color is.">L</abbr>
|
<abbr title="Lightness: How light or dark the color is.">L</abbr>
|
||||||
<input type="range" id="lightness" min="0" max="100" value="0">
|
<input type="range" id="lightness" min="0" max="100" value="0" step="0.01">
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>`;
|
</div>`;
|
||||||
@@ -251,9 +251,9 @@ class ColorPicker extends HTMLElement {
|
|||||||
*/
|
*/
|
||||||
updateColor() {
|
updateColor() {
|
||||||
|
|
||||||
const hue = Math.round( this.hueInput.value );
|
const hue = parseFloat( this.hueInput.value );
|
||||||
const saturation = Math.round( this.saturationInput.value );
|
const saturation = parseFloat( this.saturationInput.value );
|
||||||
const lightness = Math.round( this.lightnessInput.value );
|
const lightness = parseFloat( this.lightnessInput.value );
|
||||||
const hsla = [ hue, saturation, lightness ];
|
const hsla = [ hue, saturation, lightness ];
|
||||||
|
|
||||||
const rgba = this.HSLAToRGBA( hsla );
|
const rgba = this.HSLAToRGBA( hsla );
|
||||||
@@ -324,6 +324,10 @@ class ColorPicker extends HTMLElement {
|
|||||||
*/
|
*/
|
||||||
setColor( color = 'hsla(60, 100%, 50%, 0.5)' ) {
|
setColor( color = 'hsla(60, 100%, 50%, 0.5)' ) {
|
||||||
|
|
||||||
|
if ( /^[0-9A-F]{3,6}$/i.test( color ) ) {
|
||||||
|
color = '#' + color;
|
||||||
|
}
|
||||||
|
|
||||||
const rgba = this.colorToRGBA( color );
|
const rgba = this.colorToRGBA( color );
|
||||||
const hsla = this.rgbToHSLA( rgba );
|
const hsla = this.rgbToHSLA( rgba );
|
||||||
|
|
||||||
@@ -484,7 +488,8 @@ class ColorPicker extends HTMLElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Calculate hue
|
// Calculate hue
|
||||||
let hue;
|
let hue = 0;
|
||||||
|
if ( max !== min ) {
|
||||||
if ( max === normalizedR ) {
|
if ( max === normalizedR ) {
|
||||||
hue = ( ( normalizedG - normalizedB ) / ( max - min ) ) % 6;
|
hue = ( ( normalizedG - normalizedB ) / ( max - min ) ) % 6;
|
||||||
} else if ( max === normalizedG ) {
|
} else if ( max === normalizedG ) {
|
||||||
@@ -492,6 +497,7 @@ class ColorPicker extends HTMLElement {
|
|||||||
} else {
|
} else {
|
||||||
hue = ( ( normalizedR - normalizedG ) / ( max - min ) + 4 );
|
hue = ( ( normalizedR - normalizedG ) / ( max - min ) + 4 );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Convert hue to degrees
|
// Convert hue to degrees
|
||||||
hue *= 60;
|
hue *= 60;
|
||||||
@@ -500,7 +506,7 @@ class ColorPicker extends HTMLElement {
|
|||||||
hue += 360;
|
hue += 360;
|
||||||
}
|
}
|
||||||
|
|
||||||
return [ Math.round( hue ), Math.round( saturation * 100 ), Math.round( lightness * 100 ), a ];
|
return [ parseFloat(hue.toFixed(2)), parseFloat((saturation * 100).toFixed(2)), parseFloat((lightness * 100).toFixed(2)), a ];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,9 +31,7 @@
|
|||||||
//maxDice
|
//maxDice
|
||||||
|
|
||||||
ComfyJS.onCommand = async (user, command, message, flags) => {
|
ComfyJS.onCommand = async (user, command, message, flags) => {
|
||||||
if ((
|
if ((flags.broadcaster || {allAllowed} || ({modsAllowed} && flags.mod) || ({vipAllowed} && flags.vip) || ({subsAllowed} && flags.subscriber)) && '{cmd}' === command && !shouldWait() && message.match(/^\d+d(4|6|8|10|12|20|100)$/) && (+message.split('d')[0] <= {maxDice})
|
||||||
flags.broadcaster || ({modsAllowed} && flags.mod) || ({vipAllowed} && flags.vip) || ({subsAllowed} && flags.subscriber
|
|
||||||
)) && '{cmd}' === command && !shouldWait() && message.match(/^\d+d(4|6|8|10|12|20|100)$/) && (+message.split('d')[0] <= {maxDice})
|
|
||||||
) {
|
) {
|
||||||
toggleWait(true);
|
toggleWait(true);
|
||||||
|
|
||||||
@@ -45,7 +43,9 @@
|
|||||||
})
|
})
|
||||||
document.getElementById('results').innerHTML = '<strong>' + user + '</strong> rolls <strong>' + message + '</strong>:<br/> [' + values.map(value => value === 1 ? '<strong style="text-shadow: 2px 2px 10px red">' + value + '</strong>' : value === result.sides ? '<strong style="text-shadow: 2px 2px 10px green">' + value + '</strong>' : value).join(' + ') + '] = <strong>' + result.total + '</strong> '
|
document.getElementById('results').innerHTML = '<strong>' + user + '</strong> rolls <strong>' + message + '</strong>:<br/> [' + values.map(value => value === 1 ? '<strong style="text-shadow: 2px 2px 10px red">' + value + '</strong>' : value === result.sides ? '<strong style="text-shadow: 2px 2px 10px green">' + value + '</strong>' : value).join(' + ') + '] = <strong>' + result.total + '</strong> '
|
||||||
})
|
})
|
||||||
|
if({showResults}) {
|
||||||
document.getElementById('results').showPopover()
|
document.getElementById('results').showPopover()
|
||||||
|
}
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
diceBox.clearDice();
|
diceBox.clearDice();
|
||||||
document.getElementById('results').hidePopover()
|
document.getElementById('results').hidePopover()
|
||||||
|
|||||||
@@ -52,6 +52,10 @@
|
|||||||
<input type="checkbox" id="subsAllowed">
|
<input type="checkbox" id="subsAllowed">
|
||||||
<span class="checkmark"></span>
|
<span class="checkmark"></span>
|
||||||
</label>
|
</label>
|
||||||
|
<label class="checkbox" id="allAllowed-container">Allow everyone to roll (yes, everyone!!)
|
||||||
|
<input type="checkbox" id="allAllowed">
|
||||||
|
<span class="checkmark"></span>
|
||||||
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label for="scale">Dice-Scale </label>
|
<label for="scale">Dice-Scale </label>
|
||||||
@@ -64,6 +68,10 @@
|
|||||||
<input type="number" id="clearAfter" style="width: 50px; margin-top: 20px" value="10"/>
|
<input type="number" id="clearAfter" style="width: 50px; margin-top: 20px" value="10"/>
|
||||||
<label for="timeout">Command-timeout (in seconds)</label>
|
<label for="timeout">Command-timeout (in seconds)</label>
|
||||||
<input type="number" id="timeout" style="width: 50px; margin-top: 20px" value="60"/>
|
<input type="number" id="timeout" style="width: 50px; margin-top: 20px" value="60"/>
|
||||||
|
<label class="checkbox" id="showResults-container">Show Results Overlay
|
||||||
|
<input type="checkbox" id="showResults" checked>
|
||||||
|
<span class="checkmark"></span>
|
||||||
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="dice-box" style="width: 850px; height: 400px">
|
<div id="dice-box" style="width: 850px; height: 400px">
|
||||||
@@ -244,7 +252,9 @@
|
|||||||
"&timeout=" + document.getElementById('timeout').value +
|
"&timeout=" + document.getElementById('timeout').value +
|
||||||
"&modsAllowed=" + document.getElementById('modsAllowed').checked +
|
"&modsAllowed=" + document.getElementById('modsAllowed').checked +
|
||||||
"&vipAllowed=" + document.getElementById('vipAllowed').checked +
|
"&vipAllowed=" + document.getElementById('vipAllowed').checked +
|
||||||
"&subsAllowed=" + document.getElementById('subsAllowed').checked
|
"&subsAllowed=" + document.getElementById('subsAllowed').checked +
|
||||||
|
"&allAllowed=" + document.getElementById('allAllowed').checked +
|
||||||
|
"&showResults=" + document.getElementById('showResults').checked
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -89,7 +89,7 @@
|
|||||||
<button style="border: transparent; border-radius: 100%; font-size: large; font-weight: bold; height: 50px; width: 50px"
|
<button style="border: transparent; border-radius: 100%; font-size: large; font-weight: bold; height: 50px; width: 50px"
|
||||||
onclick="addDice()">+
|
onclick="addDice()">+
|
||||||
</button>
|
</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('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('d6')">D6</button>
|
||||||
<button style="font-size: large; font-weight: bold;" onclick="rollEasy('d8')">D8</button>
|
<button style="font-size: large; font-weight: bold;" onclick="rollEasy('d8')">D8</button>
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
foreground: data.numberColor
|
foreground: data.numberColor
|
||||||
}
|
}
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
diceBox.roll(data.roll.join('&'));
|
diceBox.roll(data.roll.filter(it => it.split('@')[0].split('d')[1] !== "2").join('&'));
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
const evtSource = new EventSource(url() + '/dice/{room}/results');
|
const evtSource = new EventSource(url() + '/dice/{room}/results');
|
||||||
evtSource.addEventListener('message', function (event) {
|
evtSource.addEventListener('message', function (event) {
|
||||||
let data = JSON.parse(event.data);
|
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") {
|
if ("{name}" === "all" || "{name}" === data.name) {
|
||||||
let name = document.getElementById(data.user + '-' + data.name) ?? document.createElement('div');
|
let name = document.getElementById(data.name) ?? document.createElement('div');
|
||||||
name.id = data.user + '-' + data.name;
|
name.id = data.name;
|
||||||
name.replaceChildren(...[]);
|
name.replaceChildren(...[]);
|
||||||
let node = document.createElement('p');
|
let node = document.createElement('p');
|
||||||
let resultText = ''
|
let resultText = ''
|
||||||
|
|||||||
Reference in New Issue
Block a user