commit 3c58a97de843b11889e4aa7578e802089f977ab7 Author: zomo Date: Sat Jul 10 23:10:23 2021 -0500 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d7ce76c --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +token \ No newline at end of file diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..c04c929 --- /dev/null +++ b/index.ts @@ -0,0 +1,290 @@ +import { MessageActionRow, MessageButton, MessageButtonStyleResolvable, MessageComponent, MessageMenu, MessageMenuOption } from 'discord-buttons'; +import { Message, TextChannel } from 'discord.js'; +const Discord = require('discord.js'), + client = new Discord.Client(), + disbut = require('discord-buttons'); +disbut(client); + +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)[] = [ + { + type: 'menu', + message: 'Pronouns', + palceholder: '', + id: 'rolemenu', + max: 'all', + options: [ + { + label: 'They/Them', + val: 'they', + roleid: '861453442387279872' + }, + { + label: 'He/Him', + val: 'he', + roleid: '861453443188129872' + }, + { + label: 'She/Her', + val: 'she', + roleid: '861453442777219112' + }, + { + label: 'It/Its', + val: 'it', + roleid: '862687464543223809' + }, + { + label: 'Fae/Faer', + val: 'fae', + roleid: '862687559464386601' + }, + { + label: 'Any', + val: 'any', + roleid: '861453441422983169' + } + ] + }, + { + type: 'menu', + message: 'Role Color', + palceholder: '', + id: 'colormenu', + max: 1, + options: [ + { + label: 'red', + val: 'red', + roleid: '863621755774959626' + }, + { + label: 'pink', + val: 'pink', + roleid: '863621801191931904' + }, + { + label: 'orange', + val: 'orange', + roleid: '863621849153273876' + }, + { + label: 'green', + val: 'green', + roleid: '863621885366894592' + }, + { + label: 'mint green', + val: 'mint green', + roleid: '863622000512860190' + }, + { + label: 'blue', + val: 'blue', + roleid: '863622336573079603' + }, + { + label: 'light blue', + val: 'light blue', + roleid: '863622365316513793' + }, + { + label: 'periwinkle', + val: 'periwinkle', + roleid: '863622403775266816' + }, + { + label: 'purple', + val: 'purple', + roleid: '863622442790682674' + }, + { + label: 'blank', + val: 'blank', + roleid: '', + default: true + } + ] + }, + { + type: 'menu', + message: 'Other Roles', + palceholder: '', + id: 'otherrolesmenu', + max: 'all', + options: [ + { + label: 'Movie Night', + val: 'movie', + roleid: '862883242436591617' + } + ] + } +]; + +function sendMenu(c: TextChannel, menuOpts: OptMenu) { + + let select = new MessageMenu() + .setID(menuOpts.id) + .setPlaceholder(menuOpts.palceholder) + .setMaxValues(menuOpts.max === 'all' ? menuOpts.options.length : menuOpts.max) + .setMinValues(0); + + for (let i = 0; i < menuOpts.options.length; i++) { + + let opts: OptMenuOptions = menuOpts.options[i]; + + let option = new MessageMenuOption() + .setLabel(opts.label) + .setValue(opts.val); + + if (opts.emoji && opts.emoji.length) + option.setEmoji(opts.emoji); + + if (opts.desc && opts.desc.length) + option.setDescription(opts.desc); + + if (opts.default) + option.setDefault(); + + select.addOption(option); + + } + + c.send(menuOpts.message, select); +} + +function sendRow(c: TextChannel, rowOpts: OptRow) { + + let row = new MessageActionRow(); + + for (let i = 0; i < rowOpts.buttons.length; i++) { + + let opts: OptRowButton = rowOpts.buttons[i]; + + let option = new MessageButton() + .setStyle(opts.style) + .setLabel(opts.label) + .setID(opts.id); + + row.addComponent(option); + + } + + c.send(rowOpts.message, row); +} + +client.on('message', (m: Message) => { + + if (m.author.id === '167336999844315137' && m.content === '.') { + + for (let i = 0; i < InteractionRoles.length; i++) { + switch (InteractionRoles[i].type) { + case 'menu': + sendMenu(m.channel as TextChannel, InteractionRoles[i] as OptMenu); + break; + case 'row': + sendRow(m.channel as TextChannel, InteractionRoles[i] as OptRow); + break; + } + } + + } + +}); + +client.on('clickMenu', (menu: MessageComponent) => { + menu.reply.think(true).then(async () => { + + let menus = InteractionRoles.filter(opt => opt.type === 'menu' && opt.id === menu.id); + + if (menus.length) { + let m = menus[0] as OptMenu, + vals = menu.values || []; + + let changed: { + add: string[], + rem: string[] + } = { + add: [], + rem: [] + } + + for (let i = 0; i < m.options.length; i++) { + + let opt = m.options[i], + {roleid} = opt; + + if (roleid) { + + let role = await menu.guild.roles.fetch(roleid); + + if (vals && vals.includes(opt.val) && !menu.clicker.member.roles.cache.some(r => r.id === role.id)) { + await menu.clicker.member.roles.add(role); + changed.add.push(role.name); + } else if (menu.clicker.member.roles.cache.some(r => r.id === role.id)) { + await menu.clicker.member.roles.remove(role); + changed.rem.push(role.name); + } + + } + + } + } + + menu.reply.edit('Updated Roles'); + + }); +}); + +client.on('clickButton', (button: MessageComponent) => { + button.reply.think(true).then(async () => { + + let rows = InteractionRoles.filter(opt => opt.type === 'row'); + + for (let i = 0; i < rows.length; i++) { + let row = rows[i] as OptRow; + let matchingButtons = row.buttons.filter(opt => opt.id === button.id); + + if (matchingButtons.length) { + await button.clicker.member.roles.add(matchingButtons[0].roleid); + break; + } + } + + button.reply.edit('Updated Roles'); + + }); +}); + +client.login(require('fs').readFileSync('./token').toString()); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5a069ba --- /dev/null +++ b/package-lock.json @@ -0,0 +1,324 @@ +{ + "name": "interactionstest", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "discord-buttons": "^4.0.0", + "discord.js": "^12.5.3", + "git": "github:ZomoXYZ/discord-buttons" + }, + "devDependencies": { + "@types/node": "^16.3.1" + } + }, + "node_modules/@discordjs/collection": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", + "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" + }, + "node_modules/@discordjs/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/node": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.3.1.tgz", + "integrity": "sha512-N87VuQi7HEeRJkhzovao/JviiqKjDKMVKxKMfUvSKw+MbkbW8R0nA3fi/MQhhlxV2fQ+2ReM+/Nt4efdrJx3zA==", + "dev": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/discord-buttons": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/discord-buttons/-/discord-buttons-4.0.0.tgz", + "integrity": "sha512-E/eQX4Ktj7nKwNDsTfCezBNCu73FtPWJfQcpKohfl0jct/ucMUO+7uhL2MhGsZr4SCfojk7OzccAznuntB564w==", + "funding": { + "type": "individual", + "url": "https://ko-fi.com/angelocore" + } + }, + "node_modules/discord.js": { + "version": "12.5.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.3.tgz", + "integrity": "sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw==", + "dependencies": { + "@discordjs/collection": "^0.1.6", + "@discordjs/form-data": "^3.0.1", + "abort-controller": "^3.0.0", + "node-fetch": "^2.6.1", + "prism-media": "^1.2.9", + "setimmediate": "^1.0.5", + "tweetnacl": "^1.0.3", + "ws": "^7.4.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/git": { + "name": "discord-buttons", + "version": "4.0.0", + "resolved": "git+ssh://git@github.com/ZomoXYZ/discord-buttons.git#a61689454f33b5fd456057546d7cd83bbb48b1cd", + "license": "Apache-2.0", + "funding": { + "type": "individual", + "url": "https://ko-fi.com/angelocore" + } + }, + "node_modules/mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dependencies": { + "mime-db": "1.48.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/prism-media": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.1.tgz", + "integrity": "sha512-nyYAa3KB4qteJIqdguKmwxTJgy55xxUtkJ3uRnOvO5jO+frci+9zpRXw6QZVcfDeva3S654fU9+26P2OSTzjHw==", + "peerDependencies": { + "@discordjs/opus": "^0.5.0", + "ffmpeg-static": "^4.2.7 || ^3.0.0 || ^2.4.0", + "node-opus": "^0.3.3", + "opusscript": "^0.0.8" + }, + "peerDependenciesMeta": { + "@discordjs/opus": { + "optional": true + }, + "ffmpeg-static": { + "optional": true + }, + "node-opus": { + "optional": true + }, + "opusscript": { + "optional": true + } + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "node_modules/ws": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.2.tgz", + "integrity": "sha512-lkF7AWRicoB9mAgjeKbGqVUekLnSNO4VjKVnuPHpQeOxZOErX6BPXwJk70nFslRCEEA8EVW7ZjKwXaP9N+1sKQ==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + }, + "dependencies": { + "@discordjs/collection": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", + "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" + }, + "@discordjs/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "@types/node": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.3.1.tgz", + "integrity": "sha512-N87VuQi7HEeRJkhzovao/JviiqKjDKMVKxKMfUvSKw+MbkbW8R0nA3fi/MQhhlxV2fQ+2ReM+/Nt4efdrJx3zA==", + "dev": true + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "discord-buttons": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/discord-buttons/-/discord-buttons-4.0.0.tgz", + "integrity": "sha512-E/eQX4Ktj7nKwNDsTfCezBNCu73FtPWJfQcpKohfl0jct/ucMUO+7uhL2MhGsZr4SCfojk7OzccAznuntB564w==" + }, + "discord.js": { + "version": "12.5.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.3.tgz", + "integrity": "sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw==", + "requires": { + "@discordjs/collection": "^0.1.6", + "@discordjs/form-data": "^3.0.1", + "abort-controller": "^3.0.0", + "node-fetch": "^2.6.1", + "prism-media": "^1.2.9", + "setimmediate": "^1.0.5", + "tweetnacl": "^1.0.3", + "ws": "^7.4.4" + } + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "git": { + "version": "git+ssh://git@github.com/ZomoXYZ/discord-buttons.git#a61689454f33b5fd456057546d7cd83bbb48b1cd", + "from": "git@github:ZomoXYZ/discord-buttons" + }, + "mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" + }, + "mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "requires": { + "mime-db": "1.48.0" + } + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "prism-media": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.1.tgz", + "integrity": "sha512-nyYAa3KB4qteJIqdguKmwxTJgy55xxUtkJ3uRnOvO5jO+frci+9zpRXw6QZVcfDeva3S654fU9+26P2OSTzjHw==", + "requires": {} + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "ws": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.2.tgz", + "integrity": "sha512-lkF7AWRicoB9mAgjeKbGqVUekLnSNO4VjKVnuPHpQeOxZOErX6BPXwJk70nFslRCEEA8EVW7ZjKwXaP9N+1sKQ==", + "requires": {} + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f1f3c18 --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "interactionstest", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "discord-buttons": "^4.0.0", + "discord.js": "^12.5.3", + "git": "github:ZomoXYZ/discord-buttons" + }, + "devDependencies": { + "@types/node": "^16.3.1" + } +}