v1
This commit is contained in:
@@ -1,9 +1,10 @@
|
|||||||
import {
|
import {
|
||||||
type CommandInteraction,
|
type CommandInteraction,
|
||||||
SlashCommandBuilder,
|
SlashCommandBuilder,
|
||||||
type GuildMember
|
type GuildMember,
|
||||||
|
ActivityType
|
||||||
} from 'discord.js'
|
} from 'discord.js'
|
||||||
import { checkMemberPermissions, insertGoob } from '../db'
|
import { checkMemberPermissions, execute, insertGoob } from '../db'
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
data: new SlashCommandBuilder()
|
data: new SlashCommandBuilder()
|
||||||
@@ -41,5 +42,9 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
insertGoob(message)
|
insertGoob(message)
|
||||||
await interaction.reply({ content: 'Goober inserted', ephemeral: true })
|
await interaction.reply({ content: 'Goober inserted', ephemeral: true })
|
||||||
|
const length = await execute('SELECT count(*) as count from goob')
|
||||||
|
interaction.client.user?.setActivity(`${length[0].count as string} goobers`, {
|
||||||
|
type: ActivityType.Listening
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
import {
|
import {
|
||||||
type CommandInteraction,
|
type CommandInteraction,
|
||||||
SlashCommandBuilder,
|
SlashCommandBuilder,
|
||||||
type Message
|
type Message,
|
||||||
|
ActivityType
|
||||||
} from 'discord.js'
|
} from 'discord.js'
|
||||||
import { owner_id } from '../config.json'
|
import { owner_id } from '../config.json'
|
||||||
import db, { checkMemberPermissions, insertGoob } from '../db'
|
import db, { checkMemberPermissions, execute, insertGoob } from '../db'
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
data: new SlashCommandBuilder()
|
data: new SlashCommandBuilder()
|
||||||
@@ -58,7 +59,6 @@ module.exports = {
|
|||||||
|
|
||||||
const filteredMessages = (messages as unknown as Message[]).map(e => e).filter((e, i) => permissionFilter[i] && !e.author.bot)
|
const filteredMessages = (messages as unknown as Message[]).map(e => e).filter((e, i) => permissionFilter[i] && !e.author.bot)
|
||||||
|
|
||||||
console.log(filteredMessages)
|
|
||||||
// parses the messages
|
// parses the messages
|
||||||
// shenanigans to save goobs into the database
|
// shenanigans to save goobs into the database
|
||||||
loadedImages += filteredMessages.map(insertGoob).reduce<number>((acc, v) => v + acc, 0)
|
loadedImages += filteredMessages.map(insertGoob).reduce<number>((acc, v) => v + acc, 0)
|
||||||
@@ -98,5 +98,9 @@ module.exports = {
|
|||||||
$last_message: reply.id
|
$last_message: reply.id
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
const length = await execute('SELECT count(*) as count from goob')
|
||||||
|
interaction.client.user?.setActivity(`${length[0].count as string} goobers`, {
|
||||||
|
type: ActivityType.Listening
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+71
-13
@@ -1,4 +1,4 @@
|
|||||||
import { type Message, type Client, type GuildMember } from 'discord.js'
|
import { type Message, type Client, type GuildMember, ActivityType } from 'discord.js'
|
||||||
import { verbose } from 'sqlite3'
|
import { verbose } from 'sqlite3'
|
||||||
const sqlite = verbose()
|
const sqlite = verbose()
|
||||||
const db = new sqlite.Database('goobers.db')
|
const db = new sqlite.Database('goobers.db')
|
||||||
@@ -56,21 +56,26 @@ export function insertGoob (message: Message): number {
|
|||||||
|
|
||||||
const embeds = message.embeds.filter((e) => e.image !== undefined || e.video !== undefined)
|
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)', {
|
let promises = attachments.map(async a =>
|
||||||
$messageid: message.id,
|
await execute('INSERT INTO goob (messageid, guild, channel, url) VALUES ($messageid, $guild, $channel, $url)', {
|
||||||
$guild: message.guildId,
|
$messageid: message.id,
|
||||||
$channel: message.channelId,
|
$guild: message.guildId,
|
||||||
$url: a.url
|
$channel: message.channelId,
|
||||||
}))
|
$url: a.url
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
embeds.forEach(e => db.run('INSERT INTO goob (messageid, guild, channel, url) VALUES ($messageid, $guild, $channel, $url)', {
|
promises = [...promises, ...embeds.map(async e =>
|
||||||
$messageid: message.id,
|
await execute('INSERT INTO goob (messageid, guild, channel, url) VALUES ($messageid, $guild, $channel, $url)', {
|
||||||
$guild: message.guildId,
|
$messageid: message.id,
|
||||||
$channel: message.channelId,
|
$guild: message.guildId,
|
||||||
$url: e.video !== undefined ? e.video?.url : e.image?.url
|
$channel: message.channelId,
|
||||||
}))
|
$url: e.video !== undefined ? e.video?.url : e.image?.url
|
||||||
|
})
|
||||||
|
)]
|
||||||
|
|
||||||
if (attachments.size > 0 || embeds.length > 0) void message.react('📥')
|
if (attachments.size > 0 || embeds.length > 0) void message.react('📥')
|
||||||
|
void Promise.all(promises).catch(async () => await message.react('⁉️'))
|
||||||
return attachments.size + embeds.length
|
return attachments.size + embeds.length
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,4 +92,57 @@ export async function deleteGoob (targetimage: { guild: string, channel: string,
|
|||||||
if (message === undefined) return
|
if (message === undefined) return
|
||||||
await message.react('🚫')
|
await message.react('🚫')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function loadPreviousGoob (client: Client): Promise<void> {
|
||||||
|
const channels = await execute('SELECT * from tracked') as Array<{ guild: string, channel: string, last_message: string }>
|
||||||
|
|
||||||
|
await Promise.all(channels.map(async c => {
|
||||||
|
const guild = await client.guilds.fetch(c.guild)
|
||||||
|
const channel = await guild.channels.fetch(c.channel)
|
||||||
|
if (channel === null) return
|
||||||
|
if (!channel.isTextBased()) return
|
||||||
|
|
||||||
|
let messages = await channel?.messages
|
||||||
|
.fetch({ after: c.last_message })
|
||||||
|
.catch(console.error)
|
||||||
|
let loaded = 0
|
||||||
|
let loadedImages = 0
|
||||||
|
let lastmessage
|
||||||
|
while (messages !== undefined && messages.size > 0) {
|
||||||
|
loaded += messages.size
|
||||||
|
const permissionFilter = await Promise.all((messages as unknown as Message[]).map(async e => {
|
||||||
|
let member = e.member
|
||||||
|
if (member === null) {
|
||||||
|
const member2 = await e.guild?.members.fetch(e.author.id)
|
||||||
|
if (member2 === undefined) return
|
||||||
|
member = member2
|
||||||
|
}
|
||||||
|
return (await checkMemberPermissions(member)).create && e.reactions.resolve('🚫') === null
|
||||||
|
}))
|
||||||
|
|
||||||
|
const filteredMessages = (messages as unknown as Message[]).map(e => e).filter((e, i) => (permissionFilter[i] ?? false) && !e.author.bot)
|
||||||
|
|
||||||
|
// parses the messages
|
||||||
|
// shenanigans to save goobs into the database
|
||||||
|
loadedImages += filteredMessages.map(insertGoob).reduce<number>((acc, v) => v + acc, 0)
|
||||||
|
|
||||||
|
lastmessage = messages.first() as Message | undefined
|
||||||
|
if (lastmessage === undefined) {
|
||||||
|
console.error("Coudn't fetch message data")
|
||||||
|
break
|
||||||
|
}
|
||||||
|
client.user?.setActivity(`${loaded} messages with ${loadedImages} images`, {
|
||||||
|
type: ActivityType.Watching
|
||||||
|
})
|
||||||
|
|
||||||
|
messages = await channel?.messages
|
||||||
|
.fetch({ after: lastmessage.id })
|
||||||
|
.catch(console.error)
|
||||||
|
}
|
||||||
|
if (lastmessage === undefined) return
|
||||||
|
await execute('UPDATE tracked SET last_message=$last_message WHERE guild=$guild AND channel=$channel',
|
||||||
|
{ $channel: channel.id, $guild: channel.guildId, $last_message: lastmessage.id })
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
export default db
|
export default db
|
||||||
|
|||||||
+85
-19
@@ -1,36 +1,59 @@
|
|||||||
import { Client, Collection, Events, GatewayIntentBits } from 'discord.js'
|
import { ActivityType, Client, Collection, Events, GatewayIntentBits } from 'discord.js'
|
||||||
import { discord_token } from './config.json'
|
import { discord_token } from './config.json'
|
||||||
import path from 'path'
|
import path from 'path'
|
||||||
import fs from 'fs'
|
import fs from 'fs'
|
||||||
|
import { checkMemberPermissions, execute, insertGoob, loadPreviousGoob } from './db'
|
||||||
|
|
||||||
// Create a new client instance
|
// Create a new client instance
|
||||||
const client = new Client({ intents: [GatewayIntentBits.Guilds] })
|
const client = new Client({
|
||||||
|
intents: [
|
||||||
|
GatewayIntentBits.Guilds,
|
||||||
|
GatewayIntentBits.GuildMessages,
|
||||||
|
GatewayIntentBits.MessageContent,
|
||||||
|
GatewayIntentBits.GuildMembers
|
||||||
|
]
|
||||||
|
})
|
||||||
client.commands = new Collection()
|
client.commands = new Collection()
|
||||||
|
|
||||||
// When the client is ready, run this code (only once)
|
client.once(Events.ClientReady, async (c) => {
|
||||||
// We use 'c' for the event parameter to keep it separate from the already defined 'client'
|
|
||||||
client.once(Events.ClientReady, c => {
|
|
||||||
console.log(`Ready! Logged in as ${c.user.tag}`)
|
console.log(`Ready! Logged in as ${c.user.tag}`)
|
||||||
|
await loadPreviousGoob(c)
|
||||||
|
console.log('Loaded')
|
||||||
|
const length = await execute('SELECT count(*) as count from goob')
|
||||||
|
client.user?.setActivity(`${length[0].count as string} goobers`, {
|
||||||
|
type: ActivityType.Listening
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
const commandsPath = path.join(__dirname, 'commands')
|
const commandsPath = path.join(__dirname, 'commands')
|
||||||
const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith('.js'))
|
const commandFiles = fs
|
||||||
|
.readdirSync(commandsPath)
|
||||||
|
.filter((file) => file.endsWith('.js'))
|
||||||
|
|
||||||
const promises = [] as Array<Promise<void>>
|
const promises = [] as Array<Promise<void>>
|
||||||
|
|
||||||
|
// Load Slash commands
|
||||||
for (const file of commandFiles) {
|
for (const file of commandFiles) {
|
||||||
const filePath = path.join(commandsPath, file)
|
const filePath = path.join(commandsPath, file)
|
||||||
promises.push(import(filePath).then(({ default: command }) => {
|
promises.push(
|
||||||
if ('data' in command && 'execute' in command) {
|
import(filePath)
|
||||||
client.commands.set(command.data.name, command)
|
.then(({ default: command }) => {
|
||||||
} else {
|
if ('data' in command && 'execute' in command) {
|
||||||
console.log(`[WARNING] The command at ${filePath} is missing a required "data" or "execute" property.`)
|
client.commands.set(command.data.name, command)
|
||||||
}
|
} else {
|
||||||
}).catch(e => { console.log(e) }))
|
console.log(
|
||||||
// Set a new item in the Collection with the key as the command name and the value as the exported module
|
`[WARNING] The command at ${filePath} is missing a required "data" or "execute" property.`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((e) => {
|
||||||
|
console.log(e)
|
||||||
|
})
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
client.on(Events.InteractionCreate, async interaction => {
|
// Handle slash commands
|
||||||
|
client.on(Events.InteractionCreate, async (interaction) => {
|
||||||
if (!interaction.isChatInputCommand()) return
|
if (!interaction.isChatInputCommand()) return
|
||||||
|
|
||||||
const command = interaction.client.commands.get(interaction.commandName)
|
const command = interaction.client.commands.get(interaction.commandName)
|
||||||
@@ -45,13 +68,56 @@ client.on(Events.InteractionCreate, async interaction => {
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error)
|
console.error(error)
|
||||||
if (interaction.replied || interaction.deferred) {
|
if (interaction.replied || interaction.deferred) {
|
||||||
await interaction.followUp({ content: 'There was an error while executing this command!', ephemeral: true })
|
await interaction.followUp({
|
||||||
|
content: 'There was an error while executing this command!',
|
||||||
|
ephemeral: true
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
await interaction.reply({ content: 'There was an error while executing this command!', ephemeral: true })
|
await interaction.reply({
|
||||||
|
content: 'There was an error while executing this command!',
|
||||||
|
ephemeral: true
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// Log in to Discord with your client's token
|
// Handle message sent in goober channel
|
||||||
|
client.on('messageCreate', async (e) => {
|
||||||
|
if (e.guild === null) return
|
||||||
|
if (e.member === null) return
|
||||||
|
if (!e.channel.isTextBased()) return
|
||||||
|
const channel = await execute(
|
||||||
|
'SELECT * from tracked WHERE guild=$guild AND channel=$channel',
|
||||||
|
{ $channel: e.channelId, $guild: e.guildId }
|
||||||
|
)
|
||||||
|
if (!(await checkMemberPermissions(e.member)).create) return
|
||||||
|
if (channel.length === 0) return
|
||||||
|
|
||||||
void Promise.all(promises).then(async () => await client.login(discord_token)).catch(e => { console.log(e) })
|
insertGoob(e)
|
||||||
|
const length = await execute('SELECT count(*) as count from goob')
|
||||||
|
client.user?.setActivity(`${length[0].count as string} goobers`, {
|
||||||
|
type: ActivityType.Listening
|
||||||
|
})
|
||||||
|
await execute(
|
||||||
|
'UPDATE tracked SET last_message=$last_message WHERE guild=$guild AND channel=$channel',
|
||||||
|
{ $channel: e.channelId, $guild: e.guild, $last_message: e.id }
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
// remove deleted goobers from databaser
|
||||||
|
client.on('messageDelete', async (e) => {
|
||||||
|
void execute('DELETE FROM goob WHERE messageid=$messageid', {
|
||||||
|
$messageid: e.id
|
||||||
|
})
|
||||||
|
const length = await execute('SELECT count(*) as count from goob')
|
||||||
|
client.user?.setActivity(`${length[0].count as string} goobers`, {
|
||||||
|
type: ActivityType.Listening
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// Log in to Discord with your client's token
|
||||||
|
void Promise.all(promises)
|
||||||
|
.then(async () => await client.login(discord_token))
|
||||||
|
.catch((e) => {
|
||||||
|
console.log(e)
|
||||||
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user