From 690a06256c5ec162e1dbd77f2045a149d2a632a5 Mon Sep 17 00:00:00 2001 From: Legonzaur Date: Fri, 16 Jun 2023 20:13:47 +0200 Subject: [PATCH] deletion done --- src/commands/checkperms.ts | 13 ++++++----- src/commands/checkroles.ts | 13 ++++++----- src/commands/forceload.ts | 45 ++++++++++++++++++++++++++++++++++++++ src/commands/goob.ts | 31 +++++++++++++++++++------- src/commands/load.ts | 34 ++++------------------------ src/commands/setrole.ts | 2 +- src/db/index.ts | 43 +++++++++++++++++++++++++++++++++++- 7 files changed, 129 insertions(+), 52 deletions(-) create mode 100644 src/commands/forceload.ts diff --git a/src/commands/checkperms.ts b/src/commands/checkperms.ts index 0e9653f..0136870 100644 --- a/src/commands/checkperms.ts +++ b/src/commands/checkperms.ts @@ -1,6 +1,6 @@ import { type CommandInteraction, - SlashCommandBuilder, EmbedBuilder, type GuildMember + SlashCommandBuilder, EmbedBuilder, type GuildMember, PermissionsBitField } from 'discord.js' import { getMemberPermissionsRaw } from '../db' @@ -10,16 +10,16 @@ module.exports = { .addUserOption((option) => option .setName('user') - .setDescription('The user to check the roles of') + .setDescription('The user to check the permissions of') .setRequired(false)) - .setDescription('Check permission of an user for goobot'), + .setDescription('Check permission of an user'), async execute (interaction: CommandInteraction) { if (interaction.guild === null) { - void interaction.reply({ content: 'I am sorry dave, I cannot do that\nCommand not available outside of guilds', ephemeral: true }) + void interaction.reply({ content: 'I am sorry dave, I\'m afraid I cannot do that\nCommand not available outside of guilds', ephemeral: true }) return } let member = interaction.member as GuildMember | null - if (interaction.options.get('user') !== undefined) member = interaction.options.getMember('user') as GuildMember | null + if (interaction.options.get('user') !== null) member = interaction.options.getMember('user') as GuildMember | null if (member === null) { void interaction.reply({ content: 'Can`t find member', ephemeral: true }) @@ -35,7 +35,8 @@ module.exports = { { name: 'User', value: `<@${member.id}>` }, { name: 'Can add goobs', value: `${permissions.create > 0 ? '🟩' : '🟥'} (${permissions.create})`, inline: true }, { name: 'Can delete goobs', value: `${permissions.delete > 0 ? '🟩' : '🟥'} (${permissions.delete})`, inline: true }, - { name: 'Can read goobs', value: `${permissions.read > 0 ? '🟩' : '🟥'} (${permissions.read})`, inline: true } + { name: 'Can read goobs', value: `${permissions.read > 0 ? '🟩' : '🟥'} (${permissions.read})`, inline: true }, + { name: 'Can edit settings', value: `${(member.permissions?.has(PermissionsBitField.Flags.ManageRoles, true)) ? '🟩' : '🟥'}`, inline: true } ) await interaction.reply({ embeds: [statusUpdate], ephemeral: true }) diff --git a/src/commands/checkroles.ts b/src/commands/checkroles.ts index db9f5cb..0076ee3 100644 --- a/src/commands/checkroles.ts +++ b/src/commands/checkroles.ts @@ -7,15 +7,15 @@ import { execute, type PermsNumbers } from '../db' module.exports = { data: new SlashCommandBuilder() .setName('checkroles') - .setDescription('Prints all roles permissions'), + .setDescription('Prints all roles in the database'), async execute (interaction: CommandInteraction) { if (interaction.guild === null) { - void interaction.reply({ content: 'I am sorry dave, I cannot do that\nCommand not available outside of guilds', ephemeral: true }) + void interaction.reply({ content: 'I am sorry dave, I\'m afraid I cannot do that\nCommand not available outside of guilds', ephemeral: true }) return } if ((interaction.memberPermissions?.has(PermissionsBitField.Flags.ManageRoles, true)) !== true) { - await interaction.reply({ content: 'I am sorry dave, I cannot do that\nYou don\'t have the permission to manage roles on this server', ephemeral: true }) + await interaction.reply({ content: 'I am sorry dave, I\'m afraid I cannot do that\nYou don\'t have the permission to manage roles on this server', ephemeral: true }) return } @@ -26,14 +26,15 @@ module.exports = { .setTitle('List of roles') .setTimestamp() - permissionList.forEach(e => { + await Promise.all(permissionList.map(async e => { statusUpdate.addFields( { name: 'Role', value: `<@&${e.role.toString()}>` }, { name: 'Can add goobs', value: `${e.create > 0 ? '🟩' : '🟥'} (${e.create})`, inline: true }, { name: 'Can delete goobs', value: `${e.delete > 0 ? '🟩' : '🟥'} (${e.delete})`, inline: true }, - { name: 'Can read goobs', value: `${e.read > 0 ? '🟩' : '🟥'} (${e.read})`, inline: true } + { name: 'Can read goobs', value: `${e.read > 0 ? '🟩' : '🟥'} (${e.read})`, inline: true }, + { name: 'Can edit settings', value: `${((await ((await interaction.client.guilds.fetch(e.guild)).roles.fetch(e.role)))?.permissions.has(PermissionsBitField.Flags.ManageRoles, true) ?? false) ? '🟩' : '🟥'}`, inline: true } ) - }) + })) await interaction.reply({ embeds: [statusUpdate], ephemeral: true }) } } diff --git a/src/commands/forceload.ts b/src/commands/forceload.ts new file mode 100644 index 0000000..ef586f9 --- /dev/null +++ b/src/commands/forceload.ts @@ -0,0 +1,45 @@ +import { + type CommandInteraction, + SlashCommandBuilder, + type GuildMember +} from 'discord.js' +import { checkMemberPermissions, insertGoob } from '../db' + +module.exports = { + data: new SlashCommandBuilder() + .setName('forceload') + .setDescription('Add a message in and its attachements to the database') + .addStringOption((option) => + option + .setName('messageid') + .setDescription('The id of the message in the current channel to add the goobs from') + .setRequired(true) + ), + async execute (interaction: CommandInteraction) { + if (interaction.guild === null) { + void interaction.reply({ content: 'I am sorry dave, I cannot do that\nCommand not available outside of guilds', ephemeral: true }) + return + } + const member = interaction.member + if (member === null) { + void interaction.reply({ content: 'Something went wrong : cannot find member', ephemeral: true }) + return + } + + if (!(await checkMemberPermissions(member as GuildMember)).delete) { + await interaction.reply({ content: "I am sorry dave, I cannot do that\nYou don't have the permission to manage roles on this server. You muse have the **delete** permission", ephemeral: true }) + return + } + const messageId = interaction.options.get('messageid')?.value + if (messageId === undefined) { + void interaction.reply({ content: 'Something went wrong : messageid null', ephemeral: true }) + return + } + const message = await interaction.channel?.messages.fetch(messageId.toString()) + if (message === undefined) { + return + } + insertGoob(message) + await interaction.reply({ content: 'Goober inserted', ephemeral: true }) + } +} diff --git a/src/commands/goob.ts b/src/commands/goob.ts index 64f2a88..dd902c6 100644 --- a/src/commands/goob.ts +++ b/src/commands/goob.ts @@ -1,8 +1,8 @@ import { type CommandInteraction, - SlashCommandBuilder, EmbedBuilder, type Message, ButtonStyle, ButtonBuilder, ActionRowBuilder, ComponentType + SlashCommandBuilder, EmbedBuilder, type Message, ButtonStyle, ButtonBuilder, ActionRowBuilder, ComponentType, type GuildMember } from 'discord.js' -import { execute } from '../db' +import { checkMemberPermissions, deleteGoob, execute } from '../db' module.exports = { data: new SlashCommandBuilder() @@ -10,13 +10,22 @@ module.exports = { .setDescription('meow').addIntegerOption(option => option .setName('gooberid') - .setDescription('The goob to see') + .setDescription('The ID of the goob to see') .setRequired(false)), async execute (interaction: CommandInteraction) { // Pick the right goober + const member = interaction.member + if (member === null) { + void interaction.reply({ content: 'Something went wrong : cannot find member', ephemeral: true }) + return + } + if (!(await checkMemberPermissions(member as GuildMember)).read) { + void interaction.reply({ content: 'I am sorry dave, I\'m afraid I cannot do that\nYou do not have access to that command', ephemeral: true }) + return + } const amountOfGoobs = (await execute('SELECT COUNT(*) as totalweight from goob'))[0].totalweight let number = Number(interaction.options.get('gooberid')?.value) - let targetImage + let targetImage: { guild: string, channel: string, messageid: string, url: string, id: number } if (!Number.isNaN(number)) { targetImage = (await execute('SELECT * from goob WHERE id = $messageid', { $messageid: number }))[0] } else { @@ -40,7 +49,7 @@ module.exports = { let exampleEmbed = new EmbedBuilder() .setColor(0x0099FF) - .setTitle(`Goob #${targetImage.id as number}`) + .setTitle(`Goob #${targetImage.id}`) .setURL(message?.url ?? targetImage.url) .setTimestamp(message?.createdTimestamp ?? undefined) .setAuthor({ name: message?.author.username ?? 'deleted message', iconURL: message?.author.avatarURL() ?? undefined, url: message?.url }) @@ -65,9 +74,15 @@ module.exports = { const collector = response.createMessageComponentCollector({ componentType: ComponentType.Button, time: 3_600_00 }) collector.on('collect', async i => { - const roles = (await execute('SELECT * from permissions WHERE guild = $guild', { $guild: i.guild?.id })) - console.log(roles) - console.log(i.member?.roles) + if (i.member === null) { + void i.reply({ content: 'Something went wrong : cannot find member', ephemeral: true }) + return + } + if (!(await checkMemberPermissions(i.member as GuildMember)).delete) { + return + } + void deleteGoob(targetImage, interaction.client) + void interaction.deleteReply() }) } } diff --git a/src/commands/load.ts b/src/commands/load.ts index 619dba2..a133efa 100644 --- a/src/commands/load.ts +++ b/src/commands/load.ts @@ -4,45 +4,19 @@ import { type Message } from 'discord.js' import { owner_id } from '../config.json' -import db, { checkMemberPermissions } from '../db' - -function insertGoob (message: Message): number { - const attachments = message.attachments.filter( - (e) => - e.contentType !== null && - (e.contentType?.startsWith('image') || e.contentType?.startsWith('video')) - ) - - const embeds = message.embeds.filter((e) => e.image !== undefined || e.video !== undefined) - - attachments.forEach(a => db.run('INSERT INTO goob (messageid, guild, channel, url) VALUES ($messageid, $guild, $channel, $url)', { - $messageid: message.id, - $guild: message.guildId, - $channel: message.channelId, - $url: a.url - })) - - embeds.forEach(e => db.run('INSERT INTO goob (messageid, guild, channel, url) VALUES ($messageid, $guild, $channel, $url)', { - $messageid: message.id, - $guild: message.guildId, - $channel: message.channelId, - $url: e.video !== undefined ? e.video?.url : e.image?.url - })) - - if (attachments.size > 0 || embeds.length > 0) void message.react('📥') - return attachments.size + embeds.length -} +import db, { checkMemberPermissions, insertGoob } from '../db' module.exports = { data: new SlashCommandBuilder() .setName('load') - .setDescription('Sync data for '), + .setDescription('Synchronise all past and future goobers from this channel'), async execute (interaction: CommandInteraction) { if (interaction.user.id !== owner_id) { await interaction.reply({ content: 'You do not have access to this command!', ephemeral: true }) + return } if ( interaction.channel?.isDMBased() === true || @@ -79,7 +53,7 @@ module.exports = { while (messages !== undefined && messages.size > 0) { const permissionFilter = await Promise.all((messages as unknown as Message[]).map(async e => { if (e.member === null) throw new Error('member is null') - return (await checkMemberPermissions(e.member)).create + return (await checkMemberPermissions(e.member)).create && e.reactions.resolve('🚫') === null })) const filteredMessages = (messages as unknown as Message[]).map(e => e).filter((e, i) => permissionFilter[i] && !e.author.bot) diff --git a/src/commands/setrole.ts b/src/commands/setrole.ts index 3685c92..5cc0362 100644 --- a/src/commands/setrole.ts +++ b/src/commands/setrole.ts @@ -38,7 +38,7 @@ module.exports = { return } if ((interaction.memberPermissions?.has(PermissionsBitField.Flags.ManageRoles, true)) !== true) { - void interaction.reply({ content: 'I am sorry dave, I cannot do that\nYou don\'t have the permission to manage roles on this server', ephemeral: true }) + void interaction.reply({ content: 'I am sorry dave, I\'m afraid I cannot do that\nYou don\'t have the permission to manage roles on this server', ephemeral: true }) return } // Set Role diff --git a/src/db/index.ts b/src/db/index.ts index 1d9e942..7b5fea2 100644 --- a/src/db/index.ts +++ b/src/db/index.ts @@ -1,4 +1,4 @@ -import { Guild, type GuildMember } from 'discord.js' +import { type Message, type Client, type GuildMember } from 'discord.js' import { verbose } from 'sqlite3' const sqlite = verbose() const db = new sqlite.Database('goobers.db') @@ -46,4 +46,45 @@ export async function checkMemberPermissions (member: GuildMember): Promise 0 } } + +export function insertGoob (message: Message): number { + const attachments = message.attachments.filter( + (e) => + e.contentType !== null && + (e.contentType?.startsWith('image') || e.contentType?.startsWith('video')) + ) + + const embeds = message.embeds.filter((e) => e.image !== undefined || e.video !== undefined) + + attachments.forEach(a => db.run('INSERT INTO goob (messageid, guild, channel, url) VALUES ($messageid, $guild, $channel, $url)', { + $messageid: message.id, + $guild: message.guildId, + $channel: message.channelId, + $url: a.url + })) + + embeds.forEach(e => db.run('INSERT INTO goob (messageid, guild, channel, url) VALUES ($messageid, $guild, $channel, $url)', { + $messageid: message.id, + $guild: message.guildId, + $channel: message.channelId, + $url: e.video !== undefined ? e.video?.url : e.image?.url + })) + + if (attachments.size > 0 || embeds.length > 0) void message.react('📥') + return attachments.size + embeds.length +} + +export async function deleteGoob (targetimage: { guild: string, channel: string, messageid: string, url: string, id: number }, client: Client): Promise { + await execute('DELETE FROM goob WHERE id=$id', { $id: targetimage.id }) + const messageGuild = await client.guilds.fetch(targetimage.guild) + const messageChannel = await messageGuild.channels.fetch(targetimage.channel) + let message = undefined as Message | undefined + + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions + if (messageChannel?.isTextBased()) { + message = await messageChannel.messages.fetch(targetimage.messageid).catch(() => undefined) + } + if (message === undefined) return + await message.react('🚫') +} export default db