Use radios/checkboxes for poll voting modal

This commit is contained in:
Cadence Ember
2026-02-13 19:31:28 +13:00
parent 35e9c9e1ea
commit c971ca3e3d
2 changed files with 8 additions and 14 deletions
+7 -13
View File
@@ -43,7 +43,8 @@ async function* _interact({data, message, member, user}, {api}) {
default: alreadySelected.includes(option.matrix_option) default: alreadySelected.includes(option.matrix_option)
})) }))
const checkboxGroupExtras = maxSelections === 1 && options.length > 1 ? {} : { const checkboxGroupExtras = maxSelections === 1 && options.length > 1 ? {} : {
type: 22, // DiscordTypes.ComponentType.CheckboxGroup /** @type {DiscordTypes.ComponentType.CheckboxGroup} */
type: DiscordTypes.ComponentType.CheckboxGroup,
min_values: 0, min_values: 0,
max_values: maxSelections max_values: maxSelections
} }
@@ -58,20 +59,12 @@ async function* _interact({data, message, member, user}, {api}) {
}, { }, {
type: DiscordTypes.ComponentType.Label, type: DiscordTypes.ComponentType.Label,
label: pollRow.question_text, label: pollRow.question_text,
component: /* { component: {
type: 21, // DiscordTypes.ComponentType.RadioGroup type: DiscordTypes.ComponentType.RadioGroup,
custom_id: "POLL_MODAL_SELECTION", custom_id: "POLL_MODAL_SELECTION",
options, options,
required: false, required: false,
...checkboxGroupExtras ...checkboxGroupExtras
} */
{
type: DiscordTypes.ComponentType.StringSelect,
custom_id: "POLL_MODAL_SELECTION",
options,
required: false,
min_values: 0,
max_values: maxSelections,
} }
}] }]
} }
@@ -80,14 +73,15 @@ async function* _interact({data, message, member, user}, {api}) {
if (data.custom_id === "POLL_MODAL") { if (data.custom_id === "POLL_MODAL") {
// Clicked options via modal // Clicked options via modal
/** @type {DiscordTypes.APIMessageStringSelectInteractionData} */ // @ts-ignore - close enough to the real thing /** @type {DiscordTypes.APIModalSubmitRadioGroupComponent | DiscordTypes.APIModalSubmitCheckboxGroupComponent} */ // @ts-ignore - close enough to the real thing
const component = data.components[1].component const component = data.components[1].component
assert.equal(component.custom_id, "POLL_MODAL_SELECTION") assert.equal(component.custom_id, "POLL_MODAL_SELECTION")
const values = "values" in component ? component.values : [component.value]
// Replace votes with selection // Replace votes with selection
db.transaction(() => { db.transaction(() => {
db.prepare("DELETE FROM poll_vote WHERE message_id = ? AND discord_or_matrix_user_id = ?").run(message.id, userID) db.prepare("DELETE FROM poll_vote WHERE message_id = ? AND discord_or_matrix_user_id = ?").run(message.id, userID)
for (const option of component.values) { for (const option of values) {
db.prepare("INSERT OR IGNORE INTO poll_vote (discord_or_matrix_user_id, message_id, matrix_option) VALUES (?, ?, ?)").run(userID, message.id, option) db.prepare("INSERT OR IGNORE INTO poll_vote (discord_or_matrix_user_id, message_id, matrix_option) VALUES (?, ?, ?)").run(userID, message.id, option)
} }
})() })()
+1 -1
View File
@@ -113,7 +113,7 @@ async function dispatchInteraction(interaction) {
} else if (interactionId === "Responses") { } else if (interactionId === "Responses") {
/** @type {DiscordTypes.APIMessageApplicationCommandGuildInteraction} */ // @ts-ignore /** @type {DiscordTypes.APIMessageApplicationCommandGuildInteraction} */ // @ts-ignore
const messageInteraction = interaction const messageInteraction = interaction
if (messageInteraction.data.resolved.messages[messageInteraction.data.target_id]?.poll) { if (select("poll", "message_id", {message_id: messageInteraction.data.target_id}).get()) {
await pollResponses.interact(messageInteraction) await pollResponses.interact(messageInteraction)
} else { } else {
await reactions.interact(messageInteraction) await reactions.interact(messageInteraction)