Validation error
What can cause this error on button click?
It's this specific button (
Button handler:
dailyneko-modal
), nothing else causes this.
dailyneko-cancel
works.
Components creator:
const components = [
new ActionRowBuilder<ButtonBuilder>()
.addComponents(
new ButtonBuilder()
.setCustomId("dailyneko-modal")
.setLabel("Open Modal")
.setStyle(ButtonStyle.Primary),
new ButtonBuilder()
.setCustomId("dailyneko-done")
.setLabel("Done")
.setStyle(allDone ? ButtonStyle.Success : ButtonStyle.Secondary)
.setDisabled(!allDone),
new ButtonBuilder()
.setCustomId("dailyneko-cancel")
.setLabel("Cancel")
.setStyle(ButtonStyle.Danger)
)
]
const components = [
new ActionRowBuilder<ButtonBuilder>()
.addComponents(
new ButtonBuilder()
.setCustomId("dailyneko-modal")
.setLabel("Open Modal")
.setStyle(ButtonStyle.Primary),
new ButtonBuilder()
.setCustomId("dailyneko-done")
.setLabel("Done")
.setStyle(allDone ? ButtonStyle.Success : ButtonStyle.Secondary)
.setDisabled(!allDone),
new ButtonBuilder()
.setCustomId("dailyneko-cancel")
.setLabel("Cancel")
.setStyle(ButtonStyle.Danger)
)
]
@ApplyOptions<InteractionHandler.Options>({
interactionHandlerType: InteractionHandlerTypes.Button
})
export class DailyNekoButtonsHandler extends InteractionHandler {
public parse(interaction: ButtonInteraction): Option<void> {
return interaction.customId.startsWith("dailyneko") ? this.some() : this.none();
}
public async run(interaction: ButtonInteraction) {
const task = interaction.customId.split("-").at(1)!;
const data = interaction.message.embeds[0].data;
let artist_name = data.fields![0].value!;
artist_name = artist_name === "N/A" ? "" : artist_name;
let artist_url = data.fields![1].value!;
artist_url = artist_url === "N/A" ? "" : artist_url;
let source_url = data.fields![2].value!;
source_url = source_url === "N/A" ? "" : source_url;
let neko_url = data.fields![3].value!;
neko_url = neko_url === "N/A" ? "" : neko_url;
switch (task) {
case "modal":
interaction.showModal(dailyNekoModal(artist_name, artist_url, source_url, neko_url));
break
case "done":
await interaction.deferReply();
const channel = interaction.guild?.channels.cache.get(this.container.config.config.channels.daily_neko) as TextBasedChannel;
await sendDailyneko(webhook, channel, artist_name, artist_url, source_url, neko_url);
interaction.message.edit({
components: [],
content: "Sent daily neko."
});
break;
case "cancel":
interaction.update({
components: [],
content: "Cancelled."
})
break;
}
}
}
@ApplyOptions<InteractionHandler.Options>({
interactionHandlerType: InteractionHandlerTypes.Button
})
export class DailyNekoButtonsHandler extends InteractionHandler {
public parse(interaction: ButtonInteraction): Option<void> {
return interaction.customId.startsWith("dailyneko") ? this.some() : this.none();
}
public async run(interaction: ButtonInteraction) {
const task = interaction.customId.split("-").at(1)!;
const data = interaction.message.embeds[0].data;
let artist_name = data.fields![0].value!;
artist_name = artist_name === "N/A" ? "" : artist_name;
let artist_url = data.fields![1].value!;
artist_url = artist_url === "N/A" ? "" : artist_url;
let source_url = data.fields![2].value!;
source_url = source_url === "N/A" ? "" : source_url;
let neko_url = data.fields![3].value!;
neko_url = neko_url === "N/A" ? "" : neko_url;
switch (task) {
case "modal":
interaction.showModal(dailyNekoModal(artist_name, artist_url, source_url, neko_url));
break
case "done":
await interaction.deferReply();
const channel = interaction.guild?.channels.cache.get(this.container.config.config.channels.daily_neko) as TextBasedChannel;
await sendDailyneko(webhook, channel, artist_name, artist_url, source_url, neko_url);
interaction.message.edit({
components: [],
content: "Sent daily neko."
});
break;
case "cancel":
interaction.update({
components: [],
content: "Cancelled."
})
break;
}
}
}
2 Replies
This is the modal function:
Did a quick check, all parameters are strings (empty strings, but still typeof string)
Yeah ok, forgot setStyle so it exploded
Please, add better errors for this thing...
export function dailyNekoModal(artist_name: string, artist_url: string, source_url: string, neko_url: string) {
return new ModalBuilder()
.setCustomId("dailyneko-modal")
.setTitle("Daily Neko")
.addComponents(
new ActionRowBuilder<TextInputBuilder>()
.addComponents(
new TextInputBuilder()
.setCustomId("artist_name")
.setValue(artist_name || "")
.setLabel("Artist Name")
),
new ActionRowBuilder<TextInputBuilder>()
.addComponents(
new TextInputBuilder()
.setCustomId("artist_url")
.setValue(artist_url || "")
.setLabel("Artist URL")
),
new ActionRowBuilder<TextInputBuilder>()
.addComponents(
new TextInputBuilder()
.setCustomId("source_url")
.setValue(source_url || "")
.setLabel("Source URL")
),
new ActionRowBuilder<TextInputBuilder>()
.addComponents(
new TextInputBuilder()
.setCustomId("neko_url")
.setValue(neko_url || "")
.setLabel("Neko URL")
)
)
}
export function dailyNekoModal(artist_name: string, artist_url: string, source_url: string, neko_url: string) {
return new ModalBuilder()
.setCustomId("dailyneko-modal")
.setTitle("Daily Neko")
.addComponents(
new ActionRowBuilder<TextInputBuilder>()
.addComponents(
new TextInputBuilder()
.setCustomId("artist_name")
.setValue(artist_name || "")
.setLabel("Artist Name")
),
new ActionRowBuilder<TextInputBuilder>()
.addComponents(
new TextInputBuilder()
.setCustomId("artist_url")
.setValue(artist_url || "")
.setLabel("Artist URL")
),
new ActionRowBuilder<TextInputBuilder>()
.addComponents(
new TextInputBuilder()
.setCustomId("source_url")
.setValue(source_url || "")
.setLabel("Source URL")
),
new ActionRowBuilder<TextInputBuilder>()
.addComponents(
new TextInputBuilder()
.setCustomId("neko_url")
.setValue(neko_url || "")
.setLabel("Neko URL")
)
)
}
That's on @discordjs/builders, not on sapphire code. That said, currently @sapphire/shapeshift doesn't support custom error messages but I'm literally just now merging the PR so once it's merged it's a matter of DiscordJS contributors updating builders code (could be you!)