This commit is contained in:
2021-07-11 19:20:33 -05:00
parent 61a23df056
commit 9b83148551
3 changed files with 111 additions and 49 deletions

View File

@@ -1,44 +1,20 @@
import { MessageActionRow, MessageButton, MessageButtonStyleResolvable, MessageComponent, MessageMenu, MessageMenuOption } from 'discord-buttons';
import { Message, TextChannel } from 'discord.js';
import { MessageActionRow, MessageButton, MessageComponent, MessageMenu, MessageMenuOption } from "discord-buttons";
import { Message } from "discord.js";
import { TextChannel } from "discord.js";
import * as Opt from "../types/Opt";
//initialize discord
const Discord = require('discord.js'),
client = new Discord.Client({ ws: { intents: Discord.Intents.ALL } }),
disbut = require('discord-buttons');
disbut(client);
disbut(client); //configure discord-buttons with client
//on read
client.on('ready', () => console.log('ready'));
declare interface OptMenuOptions {
label: string;
emoji?: string;
val: string;
desc?: string;
roleid: string;
default?: boolean;
}
declare interface OptMenu {
type: 'menu';
message: string;
palceholder: string;
id: string;
max: number|'all';
options: OptMenuOptions[];
}
declare interface OptRowButton {
style: MessageButtonStyleResolvable;
label: string;
id: string;
roleid: string;
}
declare interface OptRow {
type: 'row';
message: string;
buttons: [OptRowButton?, OptRowButton?, OptRowButton?, OptRowButton?, OptRowButton?];
}
const InteractionRoles: (OptRow|OptMenu)[] = [
//array of Opt.Row|Opt.Menu, each one is a message that will be sent/understood
// - types/Opt.d.ts
const InteractionRoles: (Opt.Row|Opt.Menu)[] = [
{
type: 'menu',
message: 'Pronouns',
@@ -154,7 +130,12 @@ const InteractionRoles: (OptRow|OptMenu)[] = [
}
];
function sendMenu(c: TextChannel, menuOpts: OptMenu) {
/**
* send message containing menu
* @param c text channel to send message
* @param menuOpts menu data object
*/
function sendMenu(c: TextChannel, menuOpts: Opt.Menu) {
let select = new MessageMenu()
.setID(menuOpts.id)
@@ -164,7 +145,7 @@ function sendMenu(c: TextChannel, menuOpts: OptMenu) {
for (let i = 0; i < menuOpts.options.length; i++) {
let opts: OptMenuOptions = menuOpts.options[i];
let opts: Opt.MenuOptions = menuOpts.options[i];
let option = new MessageMenuOption()
.setLabel(opts.label)
@@ -186,13 +167,18 @@ function sendMenu(c: TextChannel, menuOpts: OptMenu) {
c.send(menuOpts.message, select);
}
function sendRow(c: TextChannel, rowOpts: OptRow) {
/**
* send message containing row
* @param c text channel to send message
* @param rowOpts row data object
*/
function sendRow(c: TextChannel, rowOpts: Opt.Row) {
let row = new MessageActionRow();
for (let i = 0; i < rowOpts.buttons.length; i++) {
let opts: OptRowButton = rowOpts.buttons[i];
let opts: Opt.RowButton = rowOpts.buttons[i];
let option = new MessageButton()
.setStyle(opts.style)
@@ -206,6 +192,8 @@ function sendRow(c: TextChannel, rowOpts: OptRow) {
c.send(rowOpts.message, 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 === '.') {
@@ -213,10 +201,10 @@ client.on('message', (m: Message) => {
for (let i = 0; i < InteractionRoles.length; i++) {
switch (InteractionRoles[i].type) {
case 'menu':
sendMenu(m.channel as TextChannel, InteractionRoles[i] as OptMenu);
sendMenu(m.channel as TextChannel, InteractionRoles[i] as Opt.Menu);
break;
case 'row':
sendRow(m.channel as TextChannel, InteractionRoles[i] as OptRow);
sendRow(m.channel as TextChannel, InteractionRoles[i] as Opt.Row);
break;
}
}
@@ -224,16 +212,22 @@ client.on('message', (m: Message) => {
}
});
*/
//on menu click
client.on('clickMenu', (menu: MessageComponent) => {
menu.reply.think(true).then(async () => {
//list of menus from data with matching id
let menus = InteractionRoles.filter(opt => opt.type === 'menu' && opt.id === menu.id);
if (menus.length) {
let m = menus[0] as OptMenu,
//use first menu with matching id
let m = menus[0] as Opt.Menu,
vals = menu.values || [];
//list of changes
let changed: {
add: string[],
rem: string[]
@@ -242,29 +236,44 @@ client.on('clickMenu', (menu: MessageComponent) => {
rem: []
};
//loop through all the options in the menu
for (let i = 0; i < m.options.length; i++) {
let opt = m.options[i],
{roleid} = opt;
//if there's no role id, then nothing can be done
if (roleid) {
//get corresponding role
let role = await menu.guild.roles.fetch(roleid);
//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);
}
}
}
//convert changes to a message
let message = [];
if (changed.add.length)
@@ -284,22 +293,35 @@ client.on('clickMenu', (menu: MessageComponent) => {
client.on('clickButton', (button: MessageComponent) => {
button.reply.think(true).then(async () => {
//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++) {
let row = rows[i] as OptRow;
let row = rows[i] as Opt.Row;
//filter to just buttons with matching id
let matchingButtons = row.buttons.filter(opt => opt.id === button.id);
if (matchingButtons.length) {
//get corresponding role
let role = await button.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)) {
await button.clicker.member.roles.remove(role.id);
button.reply.edit(`Added \`${role.name}\``);
} else {
//remove role
await button.clicker.member.roles.remove(role.id);
button.reply.edit(`Removed \`${role.name}\``);
} else {
//add role
await button.clicker.member.roles.add(role.id);
button.reply.edit(`Added \`${role.name}\``);
}
break;
}
@@ -307,5 +329,6 @@ client.on('clickButton', (button: MessageComponent) => {
});
});
//login with token
client.login(require('fs').readFileSync('../token').toString());

View File

@@ -1,5 +1,8 @@
{
"compilerOptions": {
"strictNullChecks": false
},
"strictNullChecks": false,
"lib": [
"ESNext"
]
}
}

36
types/Opt.d.ts vendored Normal file
View File

@@ -0,0 +1,36 @@
import { MessageActionRow, MessageButton, MessageButtonStyleResolvable, MessageComponent, MessageMenu, MessageMenuOption } from 'discord-buttons';
import { Message, TextChannel } from 'discord.js';
//menu
export interface MenuOptions {
label: string;
emoji?: string;
val: string;
desc?: string;
roleid: string;
default?: boolean;
}
export interface Menu {
type: 'menu';
message: string;
palceholder: string;
id: string;
max: number|'all';
options: MenuOptions[];
}
//row
export interface RowButton {
style: MessageButtonStyleResolvable;
label: string;
id: string;
roleid: string;
}
export interface Row {
type: 'row';
message: string;
buttons: [RowButton?, RowButton?, RowButton?, RowButton?, RowButton?];
}