diff --git a/XiaoBot.js b/XiaoBot.js index 6162679f..ee57b037 100644 --- a/XiaoBot.js +++ b/XiaoBot.js @@ -10,6 +10,8 @@ const client = new CommandoClient({ disabledEvents: ['TYPING_START'] }); const activities = require('./assets/json/activity'); +const { MessageEmbed } = require('discord.js'); +const starred = new Map(); client.registry .registerDefaultTypes() @@ -26,6 +28,7 @@ client.registry ['number-edit', 'Number Manipulation'], ['search', 'Search'], ['games', 'Games'], + ['role-manage', 'Role Management'], ['other', 'Other'], ['roleplay', 'Roleplay'] ]) @@ -56,6 +59,53 @@ client.on('warn', err => console.warn('[WARNING]', err)); client.on('commandError', (command, err) => console.error('[COMMAND ERROR]', command.name, err)); +client.on('messageReactionAdd', async (reaction, user) => { + if (reaction.emoji.name !== '⭐') return; + const msg = reaction.message; + if (msg.author.id === user.id) { + if (msg.channel.permissionsFor(client.user).has('MANAGE_MESSAGES')) await reaction.remove(user); + await msg.reply('You cannot star your own messages, idiot.'); + return; + } + const starboard = msg.guild.channels.find('name', 'starboard'); + if (!starboard) return; + if (!starboard.permissionsFor(client.user).has(['SEND_MESSAGES', 'EMBED_LINKS'])) return; + const embed = new MessageEmbed() + .setAuthor(msg.author.tag, msg.author.displayAvatarURL()) + .setDescription(msg.content) + .setImage(msg.attachments.size ? msg.attachments.first().url : null) + .setColor(0xFFFF00) + .setTimestamp() + .setFooter(`⭐ ${reaction.count}`); + let starMsg; + if (starred.has(msg.id)) starMsg = await starred.get(msg.id).edit(`${reaction.count} ⭐ ${msg.channel}`, { embed }); + else starMsg = await starboard.send(`${reaction.count} ⭐ ${msg.channel}`, { embed }); + starred.set(msg.id, starMsg); +}); + +client.on('messageReactionRemove', async reaction => { + if (reaction.emoji.name !== '⭐') return; + const msg = reaction.message; + if (!starred.has(msg.id)) return; + const starboard = msg.guild.channels.find('name', 'starboard'); + if (!starboard) return; + if (!starboard.permissionsFor(client.user).has(['SEND_MESSAGES', 'EMBED_LINKS', 'MANAGE_MESSAGES'])) return; + const embed = new MessageEmbed() + .setAuthor(msg.author.tag, msg.author.displayAvatarURL()) + .setDescription(msg.content) + .setImage(msg.attachments.size ? msg.attachments.first().url : null) + .setColor(0xFFFF00) + .setTimestamp() + .setFooter(`⭐ ${reaction.count}`); + if (reaction.count > 0) { + const starMsg = await starred.get(msg.id).edit(`${reaction.count} ⭐ ${msg.channel}`, { embed }); + starred.set(msg.id, starMsg); + } else { + await starred.get(msg.id).delete(); + starred.delete(msg.id); + } +}); + client.login(XIAO_TOKEN); process.on('unhandledRejection', err => { diff --git a/assets/json/roles.json b/assets/json/roles.json new file mode 100644 index 00000000..b0212c56 --- /dev/null +++ b/assets/json/roles.json @@ -0,0 +1,13 @@ +{ + "252317073814978561": [ + "345655085486964748", + "345655164621029379", + "345655222888300555" + ], + "346450651326185475": [ + "346781913358401537", + "346782031017017348", + "346782170846593028", + "346782235304919040" + ] +} diff --git a/commands/role-manage/role-list.js b/commands/role-manage/role-list.js new file mode 100644 index 00000000..3050de90 --- /dev/null +++ b/commands/role-manage/role-list.js @@ -0,0 +1,24 @@ +const { Command } = require('discord.js-commando'); +const { stripIndents } = require('common-tags'); +const roles = require('../../assets/json/roles'); + +module.exports = class RolelistCommand extends Command { + constructor(client) { + super(client, { + name: 'role-list', + aliases: ['roles'], + group: 'role-manage', + memberName: 'role-list', + description: 'Responds with all available roles in this server.', + guildOnly: true + }); + } + + run(msg) { + if (!roles[msg.guild.id]) return msg.say('This server has no roles open...'); + return msg.say(stripIndents` + **Roles available in ${msg.guild.name}**: + ${msg.guild.roles.filter(role => roles[msg.guild.id].includes(role.id)).map(role => role.name).join('\n')} + `); + } +}; diff --git a/commands/role-manage/subscribe.js b/commands/role-manage/subscribe.js new file mode 100644 index 00000000..2e6d8faf --- /dev/null +++ b/commands/role-manage/subscribe.js @@ -0,0 +1,32 @@ +const { Command } = require('discord.js-commando'); +const roles = require('../../assets/json/roles'); + +module.exports = class SubscribeCommand extends Command { + constructor(client) { + super(client, { + name: 'subscribe', + aliases: ['join'], + group: 'role-manage', + memberName: 'subscribe', + description: 'Subscribes you to the specified role.', + guildOnly: true, + clientPermissions: ['MANAGE_ROLES'], + args: [ + { + key: 'role', + prompt: 'What role do you want to subscribe to?', + type: 'role' + } + ] + }); + } + + async run(msg, { role }) { + if (!roles[msg.guild.id]) return msg.say('This server has no roles open...'); + if (!roles[msg.guild.id].includes(role.id)) return msg.reply('This role is not open!'); + if (!role.editable) return msg.reply('I do not have permission to manage this role!'); + if (msg.member.roles.has(role.id)) return msg.reply('You are already a member of this role!'); + await msg.member.addRole(role); + return msg.say(`You were added to **${role.name}**!`); + } +}; diff --git a/commands/role-manage/unsubscribe.js b/commands/role-manage/unsubscribe.js new file mode 100644 index 00000000..0a2801bd --- /dev/null +++ b/commands/role-manage/unsubscribe.js @@ -0,0 +1,32 @@ +const { Command } = require('discord.js-commando'); +const roles = require('../../assets/json/roles'); + +module.exports = class UnsubscribeCommand extends Command { + constructor(client) { + super(client, { + name: 'unsubscribe', + aliases: ['leave'], + group: 'role-manage', + memberName: 'unsubscribe', + description: 'Unsubscribes you from the specified role.', + guildOnly: true, + clientPermissions: ['MANAGE_ROLES'], + args: [ + { + key: 'role', + prompt: 'What role do you want to unsubscribe from?', + type: 'role' + } + ] + }); + } + + async run(msg, { role }) { + if (!roles[msg.guild.id]) return msg.say('This server has no roles open...'); + if (!roles[msg.guild.id].includes(role.id)) return msg.reply('This role is not open!'); + if (!role.editable) return msg.reply('I do not have permission to manage this role!'); + if (!msg.member.roles.has(role.id)) return msg.reply('You are not a member of this role!'); + await msg.member.removeRole(role); + return msg.say(`You were removed from **${role.name}**...`); + } +}; diff --git a/commands/search/twitter.js b/commands/search/twitter.js index 2daf7200..fc2ba300 100644 --- a/commands/search/twitter.js +++ b/commands/search/twitter.js @@ -61,7 +61,7 @@ module.exports = class TwitterCommand extends Command { } async fetchToken() { - const auth = new Buffer(`${TWITTER_KEY}:${TWITTER_SECRET}`).toString('base64'); + const auth = Buffer.from(`${TWITTER_KEY}:${TWITTER_SECRET}`).toString('base64'); const { body } = await snekfetch .post('https://api.twitter.com/oauth2/token') .set({ diff --git a/package.json b/package.json index f4dcf70d..4e1dbc55 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "xiaobot", - "version": "56.2.0", + "version": "56.3.0", "description": "Your personal server companion.", "main": "XiaoBot.js", "scripts": {