comments
This commit is contained in:
@@ -1,44 +1,20 @@
|
|||||||
import { MessageActionRow, MessageButton, MessageButtonStyleResolvable, MessageComponent, MessageMenu, MessageMenuOption } from 'discord-buttons';
|
import { MessageActionRow, MessageButton, MessageComponent, MessageMenu, MessageMenuOption } from "discord-buttons";
|
||||||
import { Message, TextChannel } from 'discord.js';
|
import { Message } from "discord.js";
|
||||||
|
import { TextChannel } from "discord.js";
|
||||||
|
import * as Opt from "../types/Opt";
|
||||||
|
|
||||||
|
//initialize discord
|
||||||
const Discord = require('discord.js'),
|
const Discord = require('discord.js'),
|
||||||
client = new Discord.Client({ ws: { intents: Discord.Intents.ALL } }),
|
client = new Discord.Client({ ws: { intents: Discord.Intents.ALL } }),
|
||||||
disbut = require('discord-buttons');
|
disbut = require('discord-buttons');
|
||||||
disbut(client);
|
disbut(client); //configure discord-buttons with client
|
||||||
|
|
||||||
|
//on read
|
||||||
client.on('ready', () => console.log('ready'));
|
client.on('ready', () => console.log('ready'));
|
||||||
|
|
||||||
declare interface OptMenuOptions {
|
//array of Opt.Row|Opt.Menu, each one is a message that will be sent/understood
|
||||||
label: string;
|
// - types/Opt.d.ts
|
||||||
emoji?: string;
|
const InteractionRoles: (Opt.Row|Opt.Menu)[] = [
|
||||||
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',
|
type: 'menu',
|
||||||
message: 'Pronouns',
|
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()
|
let select = new MessageMenu()
|
||||||
.setID(menuOpts.id)
|
.setID(menuOpts.id)
|
||||||
@@ -164,7 +145,7 @@ function sendMenu(c: TextChannel, menuOpts: OptMenu) {
|
|||||||
|
|
||||||
for (let i = 0; i < menuOpts.options.length; i++) {
|
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()
|
let option = new MessageMenuOption()
|
||||||
.setLabel(opts.label)
|
.setLabel(opts.label)
|
||||||
@@ -186,13 +167,18 @@ function sendMenu(c: TextChannel, menuOpts: OptMenu) {
|
|||||||
c.send(menuOpts.message, select);
|
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();
|
let row = new MessageActionRow();
|
||||||
|
|
||||||
for (let i = 0; i < rowOpts.buttons.length; i++) {
|
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()
|
let option = new MessageButton()
|
||||||
.setStyle(opts.style)
|
.setStyle(opts.style)
|
||||||
@@ -206,6 +192,8 @@ function sendRow(c: TextChannel, rowOpts: OptRow) {
|
|||||||
c.send(rowOpts.message, row);
|
c.send(rowOpts.message, row);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//uncomment if you want to create a message, will change to slash command
|
||||||
|
/*
|
||||||
client.on('message', (m: Message) => {
|
client.on('message', (m: Message) => {
|
||||||
|
|
||||||
if (m.author.id === '167336999844315137' && m.content === '.') {
|
if (m.author.id === '167336999844315137' && m.content === '.') {
|
||||||
@@ -213,10 +201,10 @@ client.on('message', (m: Message) => {
|
|||||||
for (let i = 0; i < InteractionRoles.length; i++) {
|
for (let i = 0; i < InteractionRoles.length; i++) {
|
||||||
switch (InteractionRoles[i].type) {
|
switch (InteractionRoles[i].type) {
|
||||||
case 'menu':
|
case 'menu':
|
||||||
sendMenu(m.channel as TextChannel, InteractionRoles[i] as OptMenu);
|
sendMenu(m.channel as TextChannel, InteractionRoles[i] as Opt.Menu);
|
||||||
break;
|
break;
|
||||||
case 'row':
|
case 'row':
|
||||||
sendRow(m.channel as TextChannel, InteractionRoles[i] as OptRow);
|
sendRow(m.channel as TextChannel, InteractionRoles[i] as Opt.Row);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -224,16 +212,22 @@ client.on('message', (m: Message) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
*/
|
||||||
|
|
||||||
|
//on menu click
|
||||||
client.on('clickMenu', (menu: MessageComponent) => {
|
client.on('clickMenu', (menu: MessageComponent) => {
|
||||||
menu.reply.think(true).then(async () => {
|
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);
|
let menus = InteractionRoles.filter(opt => opt.type === 'menu' && opt.id === menu.id);
|
||||||
|
|
||||||
if (menus.length) {
|
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 || [];
|
vals = menu.values || [];
|
||||||
|
|
||||||
|
//list of changes
|
||||||
let changed: {
|
let changed: {
|
||||||
add: string[],
|
add: string[],
|
||||||
rem: string[]
|
rem: string[]
|
||||||
@@ -242,29 +236,44 @@ client.on('clickMenu', (menu: MessageComponent) => {
|
|||||||
rem: []
|
rem: []
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//loop through all the options in the menu
|
||||||
for (let i = 0; i < m.options.length; i++) {
|
for (let i = 0; i < m.options.length; i++) {
|
||||||
|
|
||||||
let opt = m.options[i],
|
let opt = m.options[i],
|
||||||
{roleid} = opt;
|
{roleid} = opt;
|
||||||
|
|
||||||
|
//if there's no role id, then nothing can be done
|
||||||
if (roleid) {
|
if (roleid) {
|
||||||
|
|
||||||
|
//get corresponding role
|
||||||
let role = await menu.guild.roles.fetch(roleid);
|
let role = await menu.guild.roles.fetch(roleid);
|
||||||
|
|
||||||
|
//if enabled
|
||||||
if (vals && vals.includes(opt.val)) {
|
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)) {
|
if (!menu.clicker.member.roles.cache.some(r => r.id === role.id)) {
|
||||||
|
|
||||||
|
//give role
|
||||||
await menu.clicker.member.roles.add(role);
|
await menu.clicker.member.roles.add(role);
|
||||||
changed.add.push(role.name);
|
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)) {
|
} else if (menu.clicker.member.roles.cache.some(r => r.id === role.id)) {
|
||||||
|
|
||||||
|
//remove role
|
||||||
await menu.clicker.member.roles.remove(role);
|
await menu.clicker.member.roles.remove(role);
|
||||||
changed.rem.push(role.name);
|
changed.rem.push(role.name);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//convert changes to a message
|
||||||
let message = [];
|
let message = [];
|
||||||
|
|
||||||
if (changed.add.length)
|
if (changed.add.length)
|
||||||
@@ -284,22 +293,35 @@ client.on('clickMenu', (menu: MessageComponent) => {
|
|||||||
client.on('clickButton', (button: MessageComponent) => {
|
client.on('clickButton', (button: MessageComponent) => {
|
||||||
button.reply.think(true).then(async () => {
|
button.reply.think(true).then(async () => {
|
||||||
|
|
||||||
|
//list of button rows from data
|
||||||
let rows = InteractionRoles.filter(opt => opt.type === 'row');
|
let rows = InteractionRoles.filter(opt => opt.type === 'row');
|
||||||
|
|
||||||
|
//loop through each the buttons rows
|
||||||
for (let i = 0; i < rows.length; i++) {
|
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);
|
let matchingButtons = row.buttons.filter(opt => opt.id === button.id);
|
||||||
|
|
||||||
if (matchingButtons.length) {
|
if (matchingButtons.length) {
|
||||||
|
|
||||||
|
//get corresponding role
|
||||||
let role = await button.guild.roles.fetch(matchingButtons[0].roleid);
|
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)) {
|
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}\``);
|
//remove role
|
||||||
} else {
|
|
||||||
await button.clicker.member.roles.remove(role.id);
|
await button.clicker.member.roles.remove(role.id);
|
||||||
button.reply.edit(`Removed \`${role.name}\``);
|
button.reply.edit(`Removed \`${role.name}\``);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
//add role
|
||||||
|
await button.clicker.member.roles.add(role.id);
|
||||||
|
button.reply.edit(`Added \`${role.name}\``);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -308,4 +330,5 @@ client.on('clickButton', (button: MessageComponent) => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//login with token
|
||||||
client.login(require('fs').readFileSync('../token').toString());
|
client.login(require('fs').readFileSync('../token').toString());
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"strictNullChecks": false
|
"strictNullChecks": false,
|
||||||
},
|
"lib": [
|
||||||
|
"ESNext"
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
36
types/Opt.d.ts
vendored
Normal file
36
types/Opt.d.ts
vendored
Normal 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?];
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user