311 lines
8.3 KiB
TypeScript
311 lines
8.3 KiB
TypeScript
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({ ws: { intents: Discord.Intents.ALL } }),
|
|
disbut = require('discord-buttons');
|
|
disbut(client);
|
|
|
|
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)[] = [
|
|
{
|
|
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)) {
|
|
if (!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);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
let message = [];
|
|
|
|
if (changed.add.length)
|
|
message.push(`Added \`${changed.add.join(', ')}\``);
|
|
|
|
if (changed.rem.length)
|
|
message.push(`Removed \`${changed.rem.join(', ')}\``);
|
|
|
|
menu.reply.edit(message.length ? message.join('\n') : 'No Changes');
|
|
|
|
} else
|
|
menu.reply.edit('Error: Unknown menu');
|
|
|
|
});
|
|
});
|
|
|
|
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) {
|
|
|
|
let role = await button.guild.roles.fetch(matchingButtons[0].roleid);
|
|
|
|
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 {
|
|
await button.clicker.member.roles.remove(role.id);
|
|
button.reply.edit(`Removed \`${role.name}\``);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
});
|
|
});
|
|
|
|
client.login(require('fs').readFileSync('../token').toString()); |