mirror of
https://github.com/ZeppelinBot/Zeppelin.git
synced 2025-05-10 12:25:02 +00:00
More fixes, waitForInteraction (replacement for waitForReaction)
This commit is contained in:
parent
edcfd2333f
commit
d0c6e6f411
13 changed files with 135 additions and 50 deletions
72
backend/src/utils/waitForInteraction.ts
Normal file
72
backend/src/utils/waitForInteraction.ts
Normal file
|
@ -0,0 +1,72 @@
|
|||
import {
|
||||
TextChannel,
|
||||
MessageActionRow,
|
||||
MessageOptions,
|
||||
MessageButton,
|
||||
Client,
|
||||
Interaction,
|
||||
MessageComponentInteraction,
|
||||
} from "discord.js";
|
||||
import { PluginError } from "knub";
|
||||
import { noop } from "knub/dist/utils";
|
||||
import moment from "moment";
|
||||
|
||||
export async function waitForComponent(
|
||||
channel: TextChannel,
|
||||
toPost: MessageOptions,
|
||||
components: MessageActionRow[],
|
||||
options?: WaitForOptions,
|
||||
) {
|
||||
throw new PluginError("Unimplemented method waitForComponent called.");
|
||||
}
|
||||
|
||||
export async function waitForButtonConfirm(
|
||||
channel: TextChannel,
|
||||
toPost: MessageOptions,
|
||||
options?: WaitForOptions,
|
||||
): Promise<boolean> {
|
||||
return new Promise(async resolve => {
|
||||
const idMod = `${channel.guild.id}-${moment.utc().valueOf()}`;
|
||||
const row = new MessageActionRow().addComponents([
|
||||
new MessageButton()
|
||||
.setStyle("SUCCESS")
|
||||
.setLabel(options?.confirmText || "Confirm")
|
||||
.setType("BUTTON")
|
||||
.setCustomID(`confirmButton:${idMod}`),
|
||||
|
||||
new MessageButton()
|
||||
.setStyle("DANGER")
|
||||
.setLabel(options?.cancelText || "Cancel")
|
||||
.setType("BUTTON")
|
||||
.setCustomID(`cancelButton:${idMod}`),
|
||||
]);
|
||||
const message = await channel.send({ ...toPost, components: [row], split: false });
|
||||
|
||||
const filter = (iac: MessageComponentInteraction) => iac.message.id === message.id;
|
||||
const collector = message.createMessageComponentInteractionCollector(filter, { time: 10000 });
|
||||
|
||||
collector.on("collect", (interaction: MessageComponentInteraction) => {
|
||||
if (options?.restrictToId && options.restrictToId !== interaction.user.id) {
|
||||
interaction.reply(`You are not permitted to use these buttons.`, { ephemeral: true });
|
||||
} else {
|
||||
if (interaction.customID === `confirmButton:${idMod}`) {
|
||||
message.delete();
|
||||
resolve(true);
|
||||
} else if (interaction.customID === `cancelButton:${idMod}`) {
|
||||
message.delete();
|
||||
resolve(false);
|
||||
}
|
||||
}
|
||||
});
|
||||
collector.on("end", () => {
|
||||
if (!message.deleted) message.delete().catch(noop);
|
||||
resolve(false);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export interface WaitForOptions {
|
||||
restrictToId?: string;
|
||||
confirmText?: string;
|
||||
cancelText?: string;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue