summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Lee <andrew@alee14.me>2025-02-25 23:13:39 -0500
committerAndrew Lee <andrew@alee14.me>2025-02-25 23:13:39 -0500
commit5777f96394444dab18a81d6f085ac81df3e62008 (patch)
tree47dc895e50fa95b52a894bf0806e1a6c1edc8818
parentde5ee661cad7b1fef0f319cbaccd888cb75a1dd4 (diff)
downloadAleeBot-2.13.0.tar.gz
AleeBot-2.13.0.tar.bz2
AleeBot-2.13.0.zip
2.13 Release (finally); Added more API entries; Proper loggingv2.13.0
-rw-r--r--api/server.js51
-rw-r--r--bot_discord.js108
-rw-r--r--commands/addquote.js4
-rw-r--r--commands/quote.js3
-rw-r--r--commands/setlogchannel.js25
-rw-r--r--models/guild-settings.js25
-rw-r--r--package.json2
-rw-r--r--storage/settings.json2
-rw-r--r--sync-database.js4
-rw-r--r--web/astro.config.mjs10
-rw-r--r--web/src/components/Quotes.jsx7
-rw-r--r--web/src/pages/index.astro3
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}`;