From 9b8314855171901ca48c6bb24d7447396f67f14d Mon Sep 17 00:00:00 2001 From: zomo Date: Sun, 11 Jul 2021 19:20:33 -0500 Subject: [PATCH] comments --- rolemanager/index.ts | 117 ++++++++++++++++++++++++++----------------- tsconfig.json | 7 ++- types/Opt.d.ts | 36 +++++++++++++ 3 files changed, 111 insertions(+), 49 deletions(-) create mode 100644 types/Opt.d.ts diff --git a/rolemanager/index.ts b/rolemanager/index.ts index d538304..e86adaa 100644 --- a/rolemanager/index.ts +++ b/rolemanager/index.ts @@ -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()); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index f58e236..e71f118 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,8 @@ { "compilerOptions": { - "strictNullChecks": false - }, + "strictNullChecks": false, + "lib": [ + "ESNext" + ] + } } \ No newline at end of file diff --git a/types/Opt.d.ts b/types/Opt.d.ts new file mode 100644 index 0000000..b675f96 --- /dev/null +++ b/types/Opt.d.ts @@ -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?]; +}