deletion done

This commit is contained in:
2023-06-16 20:13:47 +02:00
parent e9a25e67df
commit 690a06256c
7 changed files with 129 additions and 52 deletions
+7 -6
View File
@@ -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 })
+7 -6
View File
@@ -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 })
}
}
+45
View File
@@ -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 })
}
}
+23 -8
View File
@@ -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()
})
}
}
+4 -30
View File
@@ -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)
+1 -1
View File
@@ -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
+42 -1
View File
@@ -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<Perm
delete: userPerms.read > 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<void> {
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