Magicyan Discord
Simple functions to facilitate discord bot development
Also exports all @magicyan/core functions
Install with
npm install @magicyan/discord
Components
Easily create action rows
import { createRow } from "@magicyan/discord";
const row = createRow(
new ButtonBuilder(),
new ButtonBuilder(),
new ButtonBuilder(),
);
const selectRow = createRow(
new StringSelectMenuBuilder()
);
interaction.reply({ components: [row, selectRow] });
Create a link button quickly
import { createRow, createLinkButton } from "@magicyan/discord";
const row = createRow(
createLinkButton({ label: "Github", url: "https://github.com/rinckodev" })
createLinkButton({ label: "Youtube", url: "https://youtube.com/@rinckodev" })
);
interaction.reply({ components: [row] });
Modals
A row only supports a single input, so use this function that already creates it within a row
import { createModalInput } from "@magicyan/discord";
const modal = new ModalBuilder({
customId: "my/modal",
title: "My modal",
components: [
createModalInput({
customId: "name",
label: "Name",
style: TextInputStyle.Short,
}),
createModalInput({
customId: "age",
label: "Age",
style: TextInputStyle.Short,
}),
]
});
interaction.showModal(modal);
Or if you prefer, you can create a record where the key is the customId
import { createModalFields } from "@magicyan/discord";
const modal = new ModalBuilder({
customId: "my/modal",
title: "My modal",
components: createModalFields({
name: {
label: "Name",
style: TextInputStyle.Short,
},
age:{
label: "Age",
style: TextInputStyle.Short,
},
})
});
Don't forget that you can define the custom id however you want
createModalFields({
["my-custom-input-name"]: {
label: "Name",
style: TextInputStyle.Short,
}
})
You can transform the fields received from the interaction into a record
import { modalFieldsToRecord } from "@magicyan/discord";
function run(interaction: ModalSubmitInteraction){
const fields = modalFieldsToRecord(interaction.fields);
console.log(fields["my-custom-input-name"]);
console.log(fields.age);
}
It is also possible to pass a union type in the function generic
type FormFields = "id" | "nickname" | "bio";
function run(interaction: ModalSubmitInteraction){
const fields = modalFieldsToRecord<FormFields>(interaction.fields);
console.log(fields.id);
console.log(fields.nickname);
console.log(fields.bio);
}
Embeds
Easily create embeds with this function
const embed = createEmbed({
title: "Welcome",
description: "Hello world",
color: "Random"
});
You can set the thumbnail and image in a simple way
const embed = createEmbed({
thumbnail: "https://github.com/rinckodev.png",
image: guild.iconURL()
});
const embed = createEmbed({
image: { url: "imageurl", width: 400, height: 100 }
});
const attachment = new AttachmentBuilder(buffer, { name: "myimage.png" });
const embed = createEmbed({
image: attachment
});
Channels
You can try to get information from a channel url
import { getChannelUrlInfo } from "@magicyan/discord";
const url = "https://discord.com/channels/537817462272557057/832829213651763210";
const { guildId, channelId } = getChannelUrlInfo(url);
console.log(guildId);
console.log(channelId);
If the url does not follow the pattern of a discord channel url, the return will be an empty object
const url = "https://github.com/rinckodev";
const { guildId, channelId } = getChannelUrlInfo(url);
console.log(guildId);
console.log(channelId);
Find a guild channel easily with the findChannel function
import { findChannel } from "@magicyan/discord";
function run(interaction: ChatInputCommandInteraction<"cached">){
const { guild } = interaction;
const channel = findChannel(guild).byId("832829213651763210");
channel
}
This function searches for channels in the guild cache, by default it tries to find channels of the GuildText type, but you can change it to any type of guild channel
const channel = findChannel(guild, ChannelType.GuildVoice).byId("832829213651763210");
You can find channels in other ways
const general = findChannel(guild).byName("general");
const updates = findChannel(guild, ChannelType.GuildAnnouncement).byName("updates");
const lounge = findChannel(guild, ChannelType.GuildVoice).byName("Lounge 01");
const popular = findChannel(guild, ChannelType.GuildStageVoice).byFilter(f => f.members.size >= 12);
const hotforum = findChannel(guild, ChannelType.GuildForum).byFilter(f => f.threads.cache.size >= 100);
general;
updates;
lounge;
popular;
hotforum;
Find a channel in a category easily
const ticket = findChannel(guild)
.inCategoryName("Tickets")
.byName(`ticket-${member.id}`);
ticket;
Roles
Find guild roles easily
import { findRole } from "@magicyan/discord";
function run(interaction: ChatInputCommandInteraction<"cached">){
const { guild } = interaction;
const memberRole = findRole(guild).byName("Member");
const adminRole = findRole(guild).byHexColor("#ff5454");
const leaderRole = findRole(guild).byId("537818031728885771");
memberRole
adminRole
leaderRole
}
Members
Find guild members easily
import { findMember } from "@magicyan/discord";
function run(interaction: ChatInputCommandInteraction<"cached">){
const { guild } = interaction;
const finder = findMember(guild);
const member = finder.byId("264620632644255745")
?? finder.byUsername("rincko")
?? finder.byGlobalName("Rincko")
?? finder.byNickname("RinckoZ_");
member;
}
Messages
You can try to get information from a channel url
import { getMessageUrlInfo } from "@magicyan/discord";
const url = "https://discord.com/channels/537817462272557057/1101949941712171078/1101950570035691530";
const { guildId, channelId, messageId } = getMessageUrlInfo(url);
console.log(guildId);
console.log(channelId);
console.log(messageId);
Commands
Find a command easily
import { findCommand } from "@magicyan/discord";
function run(interaction: ChatInputCommandInteraction<"cached">){
const { client } = interaction;
const command = findCommand(client).byName("register");
command;
}
Emojis
Find a emoji easily
import { findEmoji } from "@magicyan/discord";
function run(interaction: ChatInputCommandInteraction<"cached">){
const { client } = interaction;
const emoji = findEmoji(client).byName("discord");
emoji;
}
Regex
Extract the id of any mention
import { extractMentionId } from "@magicyan/discord";
const user = "<@264620632644255745>";
const channel = "<#1068689068256403457>";
const role = "<@&929925182796226632>";
extractMentionId(user)
extractMentionId(channel)
extractMentionId(role)