Skip to content

Commit efdd613

Browse files
twobiersholzmaster
andauthored
Add likert preset for poll options (#577)
* Add likert preset for poll options * Add preface option * Apply suggestion from @holzmaster --------- Co-authored-by: holzmaster <15527285+holzmaster@users.noreply.github.com> Co-authored-by: holzmaster <holzmaster@outlook.com>
1 parent 6338744 commit efdd613

2 files changed

Lines changed: 47 additions & 1 deletion

File tree

src/commands/poll.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,20 @@ import * as legacyDelayedPoll from "#service/delayedPollLegacy.ts";
99
import * as pollEmbedService from "#service/pollEmbed.ts";
1010
import { defer } from "#utils/interactionUtils.ts";
1111

12+
const pollOptionsPresets = {
13+
likert: {
14+
preface: "Wie sehr stimmst du folgender Aussage zu?",
15+
permitsExtension: false,
16+
options: [
17+
"Stimme überhaupt nicht zu",
18+
"Stimme eher nicht zu",
19+
"Weder noch",
20+
"Stimme eher zu",
21+
"Stimme voll und ganz zu",
22+
],
23+
},
24+
} as const;
25+
1226
const argsConfig = {
1327
options: {
1428
channel: {
@@ -17,6 +31,11 @@ const argsConfig = {
1731
default: false,
1832
multiple: false,
1933
},
34+
preset: {
35+
type: "string",
36+
short: "p",
37+
multiple: false,
38+
},
2039
extendable: {
2140
type: "boolean",
2241
short: "e",
@@ -45,6 +64,9 @@ Usage: $COMMAND_PREFIX$poll [Optionen?] [Hier die Frage] ; [Antwort 1] ; [Antwor
4564
Optionen:
4665
\t-c, --channel
4766
\t\t\tSendet die Umfrage in den Umfragenchannel, um den Slowmode zu umgehen
67+
\t-p <preset>, --preset <preset>
68+
\t\t\tVerwendet ein vorgefertigtes Set an Antwortmöglichkeiten. Aktuelle Presets:
69+
\t\t\t- likert: Eine 5-Punkte Skala von "Stimme überhaupt nicht zu" bis "Stimme voll und ganz zu"
4870
\t-e, --extendable
4971
\t\t\tErlaubt die Erweiterung der Antwortmöglichkeiten durch jeden User mit .extend als Reply
5072
\t-s, --straw
@@ -82,10 +104,29 @@ Optionen:
82104
}
83105

84106
const [question, ...pollOptions] = pollService.parsePollOptionString(positionals.join(" "));
107+
85108
if (question.length > pollEmbedService.TEXT_LIMIT) {
86109
return "Bruder die Frage ist ja länger als mein Schwands :c";
87110
}
88111

112+
const preset = options.preset
113+
? pollOptionsPresets[options.preset as keyof typeof pollOptionsPresets]
114+
: null;
115+
if (options.preset && !preset) {
116+
return `Bruder das preset ${options.preset} gibt's nicht 🙄`;
117+
}
118+
if (preset && pollOptions.length > 0) {
119+
return "Bruder entweder preset oder eigene Antwortmöglichkeiten, aber nicht beides 🙄";
120+
}
121+
122+
if (preset) {
123+
pollOptions.push(...preset.options);
124+
// Check with estimated length, does not need to be perfect. Otherwise discord will just error out later
125+
if (preset.preface.length + question.length + 1 > pollEmbedService.TEXT_LIMIT) {
126+
return "Bruder die vorgegebene Frage ist zu lang in Kombination mit dem preset :c";
127+
}
128+
}
129+
89130
let pollOptionsTextLength = 0;
90131
for (const pollOption of pollOptions) {
91132
pollOptionsTextLength += pollOption.length;
@@ -115,6 +156,9 @@ Optionen:
115156
if (extendable && options.delayed) {
116157
return "Bruder du kannst -e nicht mit -d kombinieren. 🙄";
117158
}
159+
if (extendable && preset && !preset.permitsExtension) {
160+
return `Bruder du kannst -e nicht mit dem preset ${options.preset} kombinieren. 🙄`;
161+
}
118162

119163
let finishTime: Date | undefined;
120164
if (options.delayed) {
@@ -144,6 +188,7 @@ Optionen:
144188
channel,
145189
{
146190
question,
191+
preface: preset?.preface ?? undefined,
147192
anonymous: !!finishTime,
148193
author: message.author,
149194
extendable,

src/service/pollEmbed.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ export type AuthorSpec = { username: string; iconURL?: string };
6969
export type PollEmbedParameters = {
7070
author: AuthorSpec;
7171
question: string;
72+
preface?: string;
7273
multipleChoices: boolean;
7374
anonymous: boolean;
7475
extendable: boolean;
@@ -89,7 +90,7 @@ export function buildPollEmbed(
8990
options: readonly PollEmbedOptionParameters[],
9091
): APIEmbed {
9192
const embed = new EmbedBuilder({
92-
description: `**${cleanContent(poll.question, targetChannel)}**`,
93+
description: `${poll.preface ? cleanContent(poll.preface, targetChannel) + "\n" : ""}**${cleanContent(poll.question, targetChannel)}**`,
9394
fields: options.map(o =>
9495
createOptionField(
9596
o.option,

0 commit comments

Comments
 (0)