updated discord.js

This commit is contained in:
Ashley Rosch
2021-08-19 23:54:15 -05:00
parent bb4c2e1ce4
commit c7c0d9faab
6 changed files with 626 additions and 315 deletions

View File

@@ -1,5 +1,4 @@
import { MessageActionRow, MessageButton, MessageComponent, MessageMenu, MessageMenuOption } from "discord-buttons";
import { Message } from "discord.js";
import { ButtonInteraction, CommandInteractionOptionResolver, GuildMember, Interaction, Message, MessageActionRow, MessageActionRowComponent, MessageButton, MessageSelectMenu, MessageSelectOptionData, SelectMenuInteraction } from "discord.js";
import { TextChannel } from "discord.js";
import * as Opt from "../types/Opt";
@@ -7,12 +6,11 @@ import InteractionRoles from "./data";
//initialize discord
const Discord = require('discord.js'),
client = new Discord.Client({ ws: { intents: Discord.Intents.ALL } }),
disbut = require('discord-buttons');
disbut(client); //configure discord-buttons with client
client = new Discord.Client({ intents: [
'GUILD_MEMBERS'
] });
//on read
client.on('ready', () => console.log('ready'));
/**
* send message containing menu
@@ -21,34 +19,45 @@ client.on('ready', () => console.log('ready'));
*/
function sendMenu(c: TextChannel, menuOpts: Opt.Menu) {
let select = new MessageMenu()
.setID(menuOpts.id)
let row = new MessageActionRow()
let select = new MessageSelectMenu()
.setCustomId(menuOpts.id)
.setPlaceholder(menuOpts.palceholder)
.setMaxValues(menuOpts.max === 'all' ? menuOpts.options.length : menuOpts.max)
.setMinValues(0);
let options: MessageSelectOptionData[] = [];
for (let i = 0; i < menuOpts.options.length; i++) {
let opts: Opt.MenuOptions = menuOpts.options[i];
let option = new MessageMenuOption()
.setLabel(opts.label)
.setValue(opts.val);
let option: MessageSelectOptionData = {
label: opts.label,
value: opts.value
};
if (opts.emoji && opts.emoji.length)
option.setEmoji(opts.emoji);
option.emoji = opts.emoji;
if (opts.desc && opts.desc.length)
option.setDescription(opts.desc);
if (opts.description && opts.description.length)
option.description = opts.description;
if (opts.default)
option.setDefault();
option.default = true;
select.addOption(option);
options.push(option);
}
c.send(menuOpts.message, select);
select.addOptions(options);
row.addComponents(select)
c.send({
content: menuOpts.message,
components: [row]
});
}
/**
@@ -60,6 +69,8 @@ function sendRow(c: TextChannel, rowOpts: Opt.Row) {
let row = new MessageActionRow();
let options: MessageButton[] = [];
for (let i = 0; i < rowOpts.buttons.length; i++) {
let opts: Opt.RowButton = rowOpts.buttons[i];
@@ -67,17 +78,21 @@ function sendRow(c: TextChannel, rowOpts: Opt.Row) {
let option = new MessageButton()
.setStyle(opts.style)
.setLabel(opts.label)
.setID(opts.id);
.setCustomId(opts.id);
row.addComponent(option);
options.push(option);
}
c.send(rowOpts.message, row);
row.addComponents(options);
c.send({
content: rowOpts.message,
components: [row]
});
}
//uncomment if you want to create a message, will change to slash command
client.on('message', (m: Message) => {
if (m.author.id === '167336999844315137' && m.content === '.') {
@@ -97,122 +112,157 @@ client.on('message', (m: Message) => {
});
//on interaction event
client.on('interactionCreate', (interaction: Interaction) => {
if (interaction.isSelectMenu())
handleSelect(interaction as SelectMenuInteraction);
else if (interaction.isButton())
handleButton(interaction as ButtonInteraction);
});
//on menu click
client.on('clickMenu', (menu: MessageComponent) => {
menu.reply.think(true).then(async () => {
async function handleSelect(interaction: SelectMenuInteraction) {
//list of menus from data with matching id
let menus = InteractionRoles.filter(opt => opt.type === 'menu' && opt.id === menu.id);
//start typing
await interaction.deferReply({ ephemeral: true });
if (menus.length) {
//get custom id
let customId: string;
if (interaction.component instanceof MessageSelectMenu)
customId = interaction.component.customId;
else if ('custom_id' in interaction.component)
customId = interaction.component.custom_id;
//list of menus from data with matching id
let menus = InteractionRoles.filter(opt => opt.type === 'menu' && opt.id === customId);
if (menus.length) {
//use first menu with matching id
let m = menus[0] as Opt.Menu,
vals = interaction.values || [];
//list of changes
let changed: {
add: string[],
rem: string[]
} = {
add: [],
rem: []
};
//loop through all the options in the menu
for (let i = 0; i < m.options.length; i++) {
let opt: Opt.MenuOptions = m.options[i],
{roleid} = opt;
//use first menu with matching id
let m = menus[0] as Opt.Menu,
vals = menu.values || [];
//if there's no role id, then nothing can be done
if (roleid && interaction.member instanceof GuildMember) {
//list of changes
let changed: {
add: string[],
rem: string[]
} = {
add: [],
rem: []
};
//since it is a GuildMember, let's force typescript to rememeber it
let member = interaction.member as GuildMember;
//loop through all the options in the menu
for (let i = 0; i < m.options.length; i++) {
//get corresponding role
let role = await interaction.guild.roles.fetch(roleid);
let opt = m.options[i],
{roleid} = opt;
//if there's no role id, then nothing can be done
if (roleid) {
//if enabled
if (vals && vals.includes(opt.value)) {
//get corresponding role
let role = await menu.guild.roles.fetch(roleid);
//if member doesn't have the role
if (!member.roles.cache.some(r => r.id === role.id)) {
//if enabled
if (vals && vals.includes(opt.val)) {
//if clicker (member) doesn't have the role
if (!menu.clicker.member.roles.cache.some(r => r.id === role.id)) {
//give role
await menu.clicker.member.roles.add(role);
changed.add.push(role.name);
}
//else if clicker (member) does have the role
} else if (menu.clicker.member.roles.cache.some(r => r.id === role.id)) {
//remove role
await menu.clicker.member.roles.remove(role);
changed.rem.push(role.name);
//give role
await member.roles.add(role);
changed.add.push(role.name);
}
//else if member does have the role
} else if (member.roles.cache.some(r => r.id === role.id)) {
//remove role
await member.roles.remove(role);
changed.rem.push(role.name);
}
}
//convert changes to a message
let message = [];
}
if (changed.add.length)
message.push(`Added \`${changed.add.join(', ')}\``);
//convert changes to a message
let message = [];
if (changed.rem.length)
message.push(`Removed \`${changed.rem.join(', ')}\``);
menu.reply.edit(message.length ? message.join('\n') : 'No Changes');
if (changed.add.length)
message.push(`Added \`${changed.add.join(', ')}\``);
if (changed.rem.length)
message.push(`Removed \`${changed.rem.join(', ')}\``);
} else
menu.reply.edit('Error: Unknown menu');
interaction.editReply(message.length ? message.join('\n') : 'No Changes');
} else
interaction.editReply('Error: Unknown menu');
});
});
};
client.on('clickButton', (button: MessageComponent) => {
button.reply.think(true).then(async () => {
async function handleButton(interaction: ButtonInteraction) {
//start typing
await interaction.deferReply({ ephemeral: true });
//get custom id
let customId: string;
if (interaction.component instanceof MessageButton)
customId = interaction.component.customId;
else if ('custom_id' in interaction.component)
customId = interaction.component.custom_id;
//list of button rows from data
let rows = InteractionRoles.filter(opt => opt.type === 'row');
//list of button rows from data
let rows = InteractionRoles.filter(opt => opt.type === 'row');
//loop through each the buttons rows
for (let i = 0; i < rows.length; i++) {
//loop through each the buttons rows
for (let i = 0; i < rows.length; i++) {
let row = rows[i] as Opt.Row;
let row = rows[i] as Opt.Row;
//filter to just buttons with matching id
let matchingButtons = row.buttons.filter(opt => opt.id === button.id);
//filter to just buttons with matching id
let matchingButtons = row.buttons.filter(opt => opt.id === customId);
if (matchingButtons.length) {
if (matchingButtons.length) {
//if there's no role id, then nothing can be done
if (matchingButtons[0].roleid && interaction.member instanceof GuildMember) {
//since it is a GuildMember, let's force typescript to rememeber it
let member = interaction.member as GuildMember;
//get corresponding role
let role = await button.guild.roles.fetch(matchingButtons[0].roleid);
let role = await interaction.guild.roles.fetch(matchingButtons[0].roleid);
//if clicker (member) does have the role
if (button.clicker.member.roles.cache.some(r => r.id === role.id)) {
if (member.roles.cache.some(r => r.id === role.id)) {
//remove role
await button.clicker.member.roles.remove(role.id);
button.reply.edit(`Removed \`${role.name}\``);
await member.roles.remove(role.id);
interaction.editReply(`Removed \`${role.name}\``);
} else {
//add role
await button.clicker.member.roles.add(role.id);
button.reply.edit(`Added \`${role.name}\``);
await member.roles.add(role.id);
interaction.editReply(`Added \`${role.name}\``);
}
break;
}
}
}
});
});
};
//login with token
client.login(require('fs').readFileSync('../token').toString());