diff options
| author | Andrew Lee <andrew@alee14.me> | 2025-02-25 23:13:39 -0500 |
|---|---|---|
| committer | Andrew Lee <andrew@alee14.me> | 2025-02-25 23:13:39 -0500 |
| commit | 5777f96394444dab18a81d6f085ac81df3e62008 (patch) | |
| tree | 47dc895e50fa95b52a894bf0806e1a6c1edc8818 | |
| parent | de5ee661cad7b1fef0f319cbaccd888cb75a1dd4 (diff) | |
| download | AleeBot-5777f96394444dab18a81d6f085ac81df3e62008.tar.gz AleeBot-5777f96394444dab18a81d6f085ac81df3e62008.tar.bz2 AleeBot-5777f96394444dab18a81d6f085ac81df3e62008.zip | |
2.13 Release (finally); Added more API entries; Proper loggingv2.13.0
| -rw-r--r-- | api/server.js | 51 | ||||
| -rw-r--r-- | bot_discord.js | 108 | ||||
| -rw-r--r-- | commands/addquote.js | 4 | ||||
| -rw-r--r-- | commands/quote.js | 3 | ||||
| -rw-r--r-- | commands/setlogchannel.js | 25 | ||||
| -rw-r--r-- | models/guild-settings.js | 25 | ||||
| -rw-r--r-- | package.json | 2 | ||||
| -rw-r--r-- | storage/settings.json | 2 | ||||
| -rw-r--r-- | sync-database.js | 4 | ||||
| -rw-r--r-- | web/astro.config.mjs | 10 | ||||
| -rw-r--r-- | web/src/components/Quotes.jsx | 7 | ||||
| -rw-r--r-- | web/src/pages/index.astro | 3 |
12 files changed, 165 insertions, 79 deletions
diff --git a/api/server.js b/api/server.js index 2a2afad..acfe528 100644 --- a/api/server.js +++ b/api/server.js @@ -5,7 +5,7 @@ require('dotenv').config() const app = express(); -const createServer = () => { +const apiServer = (client) => { app.use(cors()); // Allow cross-origin requests app.use(express.json()); @@ -17,10 +17,57 @@ const createServer = () => { }); + app.get('/api/uptime', (req, res) => { + res.json(client.uptime); + }); + + app.get('/api/servers', (req, res) => { + const guildsInfo = []; + + if (client.guilds.cache.size === 0) { + res.json({ + message: 'No servers found' + }) + } else { + client.guilds.cache.forEach((guild) => { + const guildInfo = { + name: guild.name, + members: guild.memberCount, + id: guild.id + }; + guildsInfo.push(guildInfo); + }); + } + + res.json(guildsInfo); + + }); + + app.post('/api/leave', (req, res) => { + const { id } = req.body; + let guild = client.guilds.cache.get(id); + + try { + guild.leave().then(guild => { + res.json({ + guild: guild.name, + left: true + }) + }); + + } catch (error) { + console.error('Error leaving server:', error); + res.status(500).res.json({ + guild: guild.name, + left: false + }) + } + }); + // Start the server app.listen(process.env.port, () => { console.log(`Server is running on http://localhost:${process.env.port}`); }); }; -module.exports = createServer; +module.exports = apiServer; diff --git a/bot_discord.js b/bot_discord.js index 5a38940..1a87074 100644 --- a/bot_discord.js +++ b/bot_discord.js @@ -33,12 +33,15 @@ const colors = require('colors'); //const i18next = require('i18next'); const settings = require('./storage/settings.json'); const { activity } = require('./storage/activities'); -const createServer = require("./api/server"); +const apiServer = require("./api/server"); const active = new Map(); let autoRole = true; let readyEmbedMessage = true; + +const { guildSettings } = require('./models/guild-settings'); + const ownerID = '242775871059001344'; -let logChannel = '318874545593384970'; +//let logChannel = '318874545593384970'; let statusChannelID = '606602551634296968'; let serverWhitelist = "243022206437687296"; let roleWhitelist = "657426918416580614"; @@ -218,7 +221,7 @@ client.on('ready', async () => { botPresence(); - createServer(); + apiServer(client); setInterval(function() { botPresence(); @@ -238,8 +241,10 @@ client.on('ready', async () => { rl.prompt(); }); -client.on('guildMemberAdd', (member) => { - if (member.guild.id !== serverWhitelist) return; +client.on('guildMemberAdd', async (member) => { + const guildSetting = await guildSettings.findOne({ where: { guildID: member.guild.id } }); + if (!guildSetting || !guildSetting.logChannelID) return; + const logEmbed = new Discord.MessageEmbed() .setAuthor('AleeBot Logging', client.user.avatarURL()) .setDescription(`A user has joined this server!`) @@ -249,7 +254,7 @@ client.on('guildMemberAdd', (member) => { .setColor('#4bff31') .setTimestamp(); - let guildMember = client.channels.cache.get(logChannel); + let guildMember = client.channels.cache.get(guildSetting.logChannelID); if (!guildMember) return; guildMember.send({ embeds: [logEmbed]}); @@ -261,8 +266,10 @@ client.on('guildMemberAdd', (member) => { } }); -client.on('guildMemberRemove', (member) => { - if (member.guild.id !== serverWhitelist) return; +client.on('guildMemberRemove', async (member) => { + const guildSetting = await guildSettings.findOne({ where: { guildID: member.guild.id } }); + if (!guildSetting || !guildSetting.logChannelID) return; + const logEmbed = new Discord.MessageEmbed() .setAuthor('AleeBot Logging', client.user.avatarURL()) .setDescription(`A user has left this server!`) @@ -271,7 +278,7 @@ client.on('guildMemberRemove', (member) => { .setColor('#ec2727') .setTimestamp(); - let guildMember = client.channels.cache.get(logChannel); + let guildMember = client.channels.cache.get(guildSetting.logChannelID); if (!guildMember) return; guildMember.send({ embeds: [logEmbed]}); @@ -279,7 +286,10 @@ client.on('guildMemberRemove', (member) => { client.on('messageUpdate', async (oldMessage, newMessage) => { - if (!oldMessage.guild || oldMessage.guild.id !== serverWhitelist) return; + const guildSetting = await guildSettings.findOne({ where: { guildID: oldMessage.guild.id } }); + if (!oldMessage.guild || !guildSetting || !guildSetting.logChannelID) return; + + //if (!oldMessage.guild || oldMessage.guild.id !== serverWhitelist) return; if (oldMessage.content === newMessage.content) { return; } @@ -292,14 +302,18 @@ client.on('messageUpdate', async (oldMessage, newMessage) => { .setTimestamp() .setFooter(`Author ID: ${oldMessage.author.id}`); - let editMessage = client.channels.cache.get(logChannel); + let editMessage = client.channels.cache.get(guildSetting.logChannelID); if (!editMessage) return; editMessage.send({ embeds: [logEmbed]}); }); -client.on('messageDelete', (message) => { - if (message.guild.id !== serverWhitelist) return; +client.on('messageDelete', async (message) => { + if (!message.content) return; + + const guildSetting = await guildSettings.findOne({ where: { guildID: message.guild.id } }); + if (!guildSetting || !guildSetting.logChannelID) return; + const logEmbed = new Discord.MessageEmbed() .setAuthor('AleeBot Logging', client.user.avatarURL()) .setDescription(`A message from ${message.author.username} was deleted in <#${message.channel.id}>`) @@ -308,43 +322,47 @@ client.on('messageDelete', (message) => { .setTimestamp() .setFooter(`Author ID: ${message.author.id}`); - let deleteMessage = client.channels.cache.get(logChannel); + let deleteMessage = client.channels.cache.get(guildSetting.logChannelID); if (!deleteMessage) return; deleteMessage.send({ embeds: [logEmbed]}); }); -client.on('guildBanAdd', (guild, user) => { - if (guild.id !== serverWhitelist) return; - const logEmbed = new Discord.MessageEmbed() - .setAuthor('AleeBot Logging', client.user.avatarURL()) - .setDescription(`This user got banned from ${guild.name}`) - .addField('User:', `${user.tag}`) - .addField('User ID:', `${user.id}`) - .setColor('#ff021b') - .setTimestamp(); - - let banMessage = client.channels.cache.get(logChannel); - if (!banMessage) return; - - banMessage.send({ embeds: [logEmbed]}); -}); - -client.on('guildBanRemove', (guild, user) => { - if (guild.id !== serverWhitelist) return; - const logEmbed = new Discord.MessageEmbed() - .setAuthor('AleeBot Logging', client.user.avatarURL()) - .setDescription(`This user got unbanned from ${guild.name}`) - .addField('User:', `${user.tag}`) - .addField('User ID:', `${user.id}`) - .setColor('#ff021b') - .setTimestamp(); - - let banMessage = client.channels.cache.get(logChannel); - if (!banMessage) return; - - banMessage.send({ embeds: [logEmbed]}); -}); +// client.on('guildBanAdd', async (guild, user) => { +// const guildSetting = await guildSettings.findOne({ where: { guildID: guild.id } }); +// if (!guildSetting || !guildSetting.logChannelID) return; +// +// const logEmbed = new Discord.MessageEmbed() +// .setAuthor('AleeBot Logging', client.user.avatarURL()) +// .setDescription(`This user got banned from ${guild.name}`) +// .addField('User:', `${user.tag}`) +// .addField('User ID:', `${user.id}`) +// .setColor('#ff021b') +// .setTimestamp(); +// +// let banMessage = client.channels.cache.get(guildSetting.logChannelID); +// if (!banMessage) return; +// +// banMessage.send({ embeds: [logEmbed]}); +// }); +// +// client.on('guildBanRemove', async (guild, user) => { +// const guildSetting = await guildSettings.findOne({ where: { guildID: guild.id } }); +// if (!guildSetting || !guildSetting.logChannelID) return; +// +// const logEmbed = new Discord.MessageEmbed() +// .setAuthor('AleeBot Logging', client.user.avatarURL()) +// .setDescription(`This user got unbanned from ${guild.name}`) +// .addField('User:', `${user.tag}`) +// .addField('User ID:', `${user.id}`) +// .setColor('#ff021b') +// .setTimestamp(); +// +// let banMessage = client.channels.cache.get(guildSetting.logChannelID); +// if (!banMessage) return; +// +// banMessage.send({ embeds: [logEmbed]}); +// }); client.on('guildCreate', (guild) => { log(`[i] New guild joined: ${guild.name} (${guild.id}). This guild has ${guild.memberCount} members!`.blue); diff --git a/commands/addquote.js b/commands/addquote.js index cedee4d..6eae015 100644 --- a/commands/addquote.js +++ b/commands/addquote.js @@ -85,7 +85,7 @@ module.exports.run = async (client, message) => { return; } } else if (msg.content.startsWith('http') && (msg.content.endsWith('.jpg') || msg.content.endsWith('.jpeg') || msg.content.endsWith('.png'))) { - newAuthorImage = message.content; + newAuthorImage = msg.content; } else { await dmChannel.send('Invalid input. Please provide an image URL or attach an image file.'); collector.stop(); @@ -157,7 +157,7 @@ module.exports.run = async (client, message) => { await dmChannel.send('Invalid file type. Please attach a .jpg or .png image.'); } } else if (imageResponse.first().content.startsWith('http') && (imageResponse.first().content.endsWith('.jpg') || imageResponse.first().content.endsWith('.jpeg') || imageResponse.first().content.endsWith('.png'))) { - newAuthorImage = message.content; + newAuthorImage = imageResponse.first().content; } else { await dmChannel.send('Invalid input. Please provide an image URL or attach an image file.'); } diff --git a/commands/quote.js b/commands/quote.js index 02699cd..f19675f 100644 --- a/commands/quote.js +++ b/commands/quote.js @@ -30,13 +30,12 @@ module.exports.run = async (client, message, args) => { const quote = await quoteDB.findOne({ where: { id: quoteID } }) - if (quote) { const quoteEmbed = new MessageEmbed() .setAuthor({ name: quote.author, iconURL: quote.authorImage }) .setDescription(quote.quote) .setColor('#1fd619') - .setFooter('- ' + quote.year); + .setFooter(`- ${quote.year}\nSubmitted by ${quote.submitter}`); await message.reply({ embeds: [quoteEmbed] }) } else { diff --git a/commands/setlogchannel.js b/commands/setlogchannel.js index c04e926..d989f8b 100644 --- a/commands/setlogchannel.js +++ b/commands/setlogchannel.js @@ -17,21 +17,30 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * * *************************************/ -const guildDB = require ('../models/guild-settings') -module.exports.run = async (client, message) => { +const { guildSettings } = require ('../models/guild-settings') +module.exports.run = async (client, message, args) => { //This will be replaced in the future possibly if (!message.member.permissions.has('MANAGE_GUILD')) return message.reply('It looks like that you can\'t manage this server.'); - const channel = await message.mentions.channels.first().id; - const [ guild ] = await guildDB.findOrCreate({ where: { id: message.guild.id } } ) + + let channel; + + if (message.mentions.channels.first()) { + channel = message.mentions.channels.first().id; + } else if (args[0] && message.guild.channels.cache.has(args[0])) { + channel = args[0]; + } else { + return await message.reply('Please enter a valid channel ID.') + } + + const [ guild ] = await guildSettings.findOrCreate({ where: { guildID: message.guild.id } } ) if (!channel) { message.reply('No channel has been set, disabling the logging channel feature...'); - await guild.update({ channelId: null } ); + await guild.update({ logChannelID: null } ); } else { - await guild.update({ channelId: message.guild.id } ) ; + await guild.update({ logChannelID: channel } ); + await message.reply(`Logging channel has been set to <#${channel}>`); } - - await message.reply(`Logging channel has been set to <#${channel}>`); }; exports.conf = { diff --git a/models/guild-settings.js b/models/guild-settings.js index 2e4f8ef..8cc7478 100644 --- a/models/guild-settings.js +++ b/models/guild-settings.js @@ -3,22 +3,27 @@ const sequelize = require('../utils/sequelize'); const guildSettings = sequelize.define('guild-settings', { id: { - type: Sequelize.STRING, - primaryKey: true + type: Sequelize.INTEGER, + primaryKey: true, + autoIncrement: true, }, - logChannelID: { + guildID: { type: Sequelize.STRING, - allowNull: true + allowNull: false }, - autoRoleToggle: { - type: Sequelize.BOOLEAN, - allowNull: true - }, - autoRoleID: { + logChannelID: { type: Sequelize.STRING, allowNull: true } + // qotdChannelID: { + // type: Sequelize.STRING, + // allowNull: true + // }, + // qotdToggle: { + // type: Sequelize.BOOLEAN, + // allowNull: true + // } }) -module.exports = guildSettings +module.exports = { guildSettings } diff --git a/package.json b/package.json index b300082..404b4a5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aleebot", - "version": "2.13.0b", + "version": "2.13.0", "description": "A chat bot for discord written in discord.js.", "main": "bot_discord.js", "scripts": { diff --git a/storage/settings.json b/storage/settings.json index b53fd84..4a6911c 100644 --- a/storage/settings.json +++ b/storage/settings.json @@ -1,4 +1,4 @@ { - "abVersion": "2.13.0 Beta", + "abVersion": "2.13.0", "prefix": "ab:" } diff --git a/sync-database.js b/sync-database.js index f7b9211..7a9271c 100644 --- a/sync-database.js +++ b/sync-database.js @@ -1,5 +1,5 @@ const { quote, pendingQuote } = require("./models/quote"); -const guildDB = require ('./models/guild-settings'); +const { guildSettings } = require ('./models/guild-settings'); quote.sync({alter: true}).then(() => { console.log('Quote database synced!') }); @@ -8,6 +8,6 @@ pendingQuote.sync({alter: true}).then(() => { console.log('Pending Quote database synced!') }); -guildDB.sync({alter: true}).then(() => { +guildSettings.sync({alter: true}).then(() => { console.log('Guild database synced!') }); diff --git a/web/astro.config.mjs b/web/astro.config.mjs index c0fd9ad..d32e23b 100644 --- a/web/astro.config.mjs +++ b/web/astro.config.mjs @@ -1,5 +1,5 @@ // @ts-check -import { defineConfig } from 'astro/config'; +import { defineConfig, envField } from 'astro/config'; import react from '@astrojs/react'; @@ -11,5 +11,11 @@ export default defineConfig({ adapter: node({ mode: 'standalone' - }) + }), + + env: { + schema: { + API_URL: envField.string({ context: 'client', access: 'public' }), + } + } }); diff --git a/web/src/components/Quotes.jsx b/web/src/components/Quotes.jsx index 831408d..1eb258a 100644 --- a/web/src/components/Quotes.jsx +++ b/web/src/components/Quotes.jsx @@ -1,12 +1,13 @@ import { useState, useEffect } from 'react'; import '../styles/Quote.css' +import { API_URL } from "astro:env/client"; export function PendingQuotes() { const [quotes, setQuotes] = useState([]); const fetchQuotes = async () => { try { - const response = await fetch('http://localhost:3000/api/pending-quotes'); + const response = await fetch(`${API_URL}/api/pending-quotes`); const data = await response.json(); setQuotes(data); } catch (error) { @@ -20,7 +21,7 @@ export function PendingQuotes() { const approveQuote = async (id) => { try { - const response = await fetch('http://localhost:3000/api/approve-quote', { + const response = await fetch(`${API_URL}/api/approve-quote`, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -40,7 +41,7 @@ export function PendingQuotes() { const rejectQuote = async (id) => { try { - const response = await fetch('http://localhost:3000/api/reject-quote', { + const response = await fetch(`${API_URL}/api/reject-quote`, { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/web/src/pages/index.astro b/web/src/pages/index.astro index 8136402..f1dc6e7 100644 --- a/web/src/pages/index.astro +++ b/web/src/pages/index.astro @@ -28,9 +28,10 @@ import { PendingQuotes } from '../components/Quotes'; </style> <script> + import { API_URL } from "astro:env/client" document.addEventListener('DOMContentLoaded', async () => { try { - const version = await fetch('http://localhost:3000/api/version').then((res) => res.json()); + const version = await fetch(`${API_URL}/api/version`).then((res) => res.json()); const versionElement = document.getElementById('version'); if (versionElement) { versionElement.textContent = `AleeBot ${version}`; |
