1.0.32 • Published 9 days ago

@magicyan/discord v1.0.32

Weekly downloads
-
License
MIT
Repository
github
Last release
9 days ago

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(/* button data... */),
    new ButtonBuilder(/* button data... */),
    new ButtonBuilder(/* button data... */),
);
const selectRow = createRow(
    new StringSelectMenuBuilder(/* select data... */)
);
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()
});

// Or passing an options object
const embed = createEmbed({
    // ...
    image: { url: "imageurl", width: 400, height: 100 }
});

//Or passing an attachment
const attachment = new AttachmentBuilder(buffer, { name: "myimage.png" });
const embed = createEmbed({
    // ...
    image: attachment // attachment://myimage.png
});

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); // 537817462272557057
console.log(channelId); // 832829213651763210

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); // undefined
console.log(channelId); // undefined

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 // TextChannel | undefined
}

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");
// VoiceChannel | undefined

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; // TextChannel | undefined
updates; // NewsChannel | undefined
lounge; // VoiceChannel | undefined
popular; // StageChannel | undefined
hotforum; // ForumChannel | undefined

Find a channel in a category easily

const ticket = findChannel(guild)
    .inCategoryName("Tickets")
    .byName(`ticket-${member.id}`);

ticket; // TextChannel | undefined

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 // Role | undefined
    adminRole // Role | undefined
    leaderRole // Role | undefined
}

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; // GuildMember | undefined
}

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); // 537817462272557057
console.log(channelId); // 1101949941712171078
console.log(messageId); // 1101950570035691530

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; // ApplicationCommand | undefined
}

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; // GuildEmoji | undefined
}

Regex

Extract the id of any mention

import { extractMentionId } from "@magicyan/discord";

const user = "<@264620632644255745>";
const channel = "<#1068689068256403457>";
const role = "<@&929925182796226632>";

extractMentionId(user) // 264620632644255745
extractMentionId(channel) // 1068689068256403457
extractMentionId(role) // 929925182796226632
1.0.32

9 days ago

1.0.31

26 days ago

1.0.30

1 month ago

1.0.29

1 month ago

1.0.28

1 month ago

1.0.26

1 month ago

1.0.25

1 month ago

1.0.27

1 month ago

1.0.24

2 months ago

1.0.23

2 months ago

1.0.22

2 months ago

1.0.21

3 months ago

1.0.19

3 months ago

1.0.20

3 months ago

1.0.18

4 months ago

1.0.17

4 months ago

1.0.16

4 months ago

1.0.15

5 months ago

1.0.14

5 months ago

1.0.13

5 months ago

1.0.12

5 months ago

1.0.11

5 months ago

1.0.10

6 months ago

1.0.9

6 months ago

1.0.8

6 months ago

1.0.7

7 months ago

1.0.6

8 months ago

1.0.5

8 months ago

1.0.4

8 months ago

1.0.3

8 months ago

1.0.2

8 months ago

1.0.1

9 months ago

1.0.0

9 months ago