updated discord.js
This commit is contained in:
@@ -12,32 +12,32 @@ const InteractionRoles: (Opt.Row|Opt.Menu)[] = [
|
||||
options: [
|
||||
{
|
||||
label: 'They/Them',
|
||||
val: 'they',
|
||||
value: 'they',
|
||||
roleid: '861453442387279872'
|
||||
},
|
||||
{
|
||||
label: 'He/Him',
|
||||
val: 'he',
|
||||
value: 'he',
|
||||
roleid: '861453443188129872'
|
||||
},
|
||||
{
|
||||
label: 'She/Her',
|
||||
val: 'she',
|
||||
value: 'she',
|
||||
roleid: '861453442777219112'
|
||||
},
|
||||
{
|
||||
label: 'It/Its',
|
||||
val: 'it',
|
||||
value: 'it',
|
||||
roleid: '862687464543223809'
|
||||
},
|
||||
{
|
||||
label: 'Fae/Faer',
|
||||
val: 'fae',
|
||||
value: 'fae',
|
||||
roleid: '862687559464386601'
|
||||
},
|
||||
{
|
||||
label: 'Any',
|
||||
val: 'any',
|
||||
value: 'any',
|
||||
roleid: '861453441422983169'
|
||||
}
|
||||
]
|
||||
@@ -51,52 +51,52 @@ const InteractionRoles: (Opt.Row|Opt.Menu)[] = [
|
||||
options: [
|
||||
{
|
||||
label: 'red',
|
||||
val: 'red',
|
||||
value: 'red',
|
||||
roleid: '863621755774959626'
|
||||
},
|
||||
{
|
||||
label: 'pink',
|
||||
val: 'pink',
|
||||
value: 'pink',
|
||||
roleid: '863621801191931904'
|
||||
},
|
||||
{
|
||||
label: 'orange',
|
||||
val: 'orange',
|
||||
value: 'orange',
|
||||
roleid: '863621849153273876'
|
||||
},
|
||||
{
|
||||
label: 'green',
|
||||
val: 'green',
|
||||
value: 'green',
|
||||
roleid: '863621885366894592'
|
||||
},
|
||||
{
|
||||
label: 'mint green',
|
||||
val: 'mint green',
|
||||
value: 'mint green',
|
||||
roleid: '863622000512860190'
|
||||
},
|
||||
{
|
||||
label: 'blue',
|
||||
val: 'blue',
|
||||
value: 'blue',
|
||||
roleid: '863622336573079603'
|
||||
},
|
||||
{
|
||||
label: 'light blue',
|
||||
val: 'light blue',
|
||||
value: 'light blue',
|
||||
roleid: '863622365316513793'
|
||||
},
|
||||
{
|
||||
label: 'periwinkle',
|
||||
val: 'periwinkle',
|
||||
value: 'periwinkle',
|
||||
roleid: '863622403775266816'
|
||||
},
|
||||
{
|
||||
label: 'purple',
|
||||
val: 'purple',
|
||||
value: 'purple',
|
||||
roleid: '863622442790682674'
|
||||
},
|
||||
{
|
||||
label: 'blank',
|
||||
val: 'blank',
|
||||
value: 'blank',
|
||||
roleid: '',
|
||||
default: true
|
||||
}
|
||||
@@ -111,12 +111,12 @@ const InteractionRoles: (Opt.Row|Opt.Menu)[] = [
|
||||
options: [
|
||||
{
|
||||
label: 'Movie Night',
|
||||
val: 'movie',
|
||||
value: 'movie',
|
||||
roleid: '862883242436591617'
|
||||
},
|
||||
{
|
||||
label: 'Dungeons and Dragons',
|
||||
val: 'dnd',
|
||||
value: 'dnd',
|
||||
roleid: '872684620666265602'
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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());
|
||||
@@ -3,6 +3,7 @@
|
||||
"main": "index.ts",
|
||||
"scripts": {
|
||||
"start": "ts-node .",
|
||||
"debug": "ts-node .",
|
||||
"watchdog": "./run.sh",
|
||||
"tmux": "tmux new-session -d -s $npm_package_name \"./run.sh\"",
|
||||
"resume": "tmux a -t $npm_package_name",
|
||||
|
||||
Reference in New Issue
Block a user