diff --git a/config.example.json b/config.example.json index 3e4c590..e793d9f 100644 --- a/config.example.json +++ b/config.example.json @@ -14,6 +14,7 @@ }, "verifiedRoleId": "xxxxxxxxxx", "jailRoleId": "xxxxxxxxxx", + "OFFICER_ROLE": "xxxxxxxxxx", "WELCOME": { "NEW_MEMBER_CHANNEL_ID": "xxxxxxxxxxx" }, diff --git a/src/handlers/MessageHandler.js b/src/handlers/MessageHandler.js index 55a9e4d..6223a64 100644 --- a/src/handlers/MessageHandler.js +++ b/src/handlers/MessageHandler.js @@ -52,7 +52,7 @@ class MessageHandler { } // Check for scam messages first - if (this.scamDetector.isScamMessage(message.content)) { + if (this.scamDetector.isScamMessage(message)) { await this.scamDetector.handleScamMessage( message, config.jailRoleId, config.SCAM_LOG_CHANNEL_ID ); diff --git a/src/util/ParkingScraper.js b/src/util/ParkingScraper.js index 7a17334..70b0f3d 100644 --- a/src/util/ParkingScraper.js +++ b/src/util/ParkingScraper.js @@ -266,30 +266,66 @@ class ParkingScraper { const { data, websiteTimestamp } = this.cache; const embed = this.createParkingEmbed(data, websiteTimestamp); - // Delete any existing messages to keep only one message + // Try to edit existing message first + if (this.embedMessage) { + try { + await this.embedMessage.edit({ embeds: [embed] }); + logger.info( + 'Parking embed updated successfully (edited existing message)' + ); + return; + } catch (error) { + logger.warn( + 'Failed to edit existing message, will find or create new one:', + error.message + ); + this.embedMessage = null; + } + } + + // Check for existing bot messages in the channel try { - // Fetch recent messages from the channel const messages = await channel.messages.fetch({ limit: 10 }); - const botMessages = messages.filter( + const botMessage = messages.find( msg => msg.author.id === this.client.user.id ); - if (botMessages.size > 0) { - // Delete all previous bot messages - await Promise.all(botMessages.map( - msg => msg.delete().catch(() => { }) - )); - logger.info(`Deleted ${botMessages.size} previous parking messages`); + if (botMessage) { + // Edit the found message + this.embedMessage = await botMessage.edit({ embeds: [embed] }); + logger.info( + 'Parking embed updated successfully (edited found message)' + ); + } else { + // No existing messages found - delete any old ones and create fresh + const allBotMessages = messages.filter( + msg => msg.author.id === this.client.user.id + ); + + if (allBotMessages.size > 0) { + await Promise.all(allBotMessages.map( + msg => msg.delete().catch(() => {}) + )); + logger.info(`Deleted ${allBotMessages.size} old parking messages`); + } + + // Create new message + this.embedMessage = await channel.send({ embeds: [embed] }); + logger.info( + 'Parking embed updated successfully (created new message)' + ); } } catch (error) { - logger.warn('Error deleting previous messages:', error.message); + logger.warn( + 'Error finding/editing message, creating new one:', + error.message + ); + this.embedMessage = await channel.send({ embeds: [embed] }); + logger.info( + 'Parking embed updated successfully (fallback new message)' + ); } - // Always create a new message - this.embedMessage = await channel.send({ embeds: [embed] }); - - logger.info('Parking embed updated successfully'); - } catch (error) { logger.error('Error updating parking embed:', error); } diff --git a/src/util/ScamDetector.js b/src/util/ScamDetector.js index c92eef5..3870138 100644 --- a/src/util/ScamDetector.js +++ b/src/util/ScamDetector.js @@ -1,6 +1,7 @@ const logger = require('./logger'); const { EmbedBuilder } = require('discord.js'); const { ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js'); +const config = require('../../config.json'); class ScamDetector { constructor() { @@ -27,9 +28,15 @@ class ScamDetector { ]; } - isScamMessage(messageContent) { + isScamMessage(message) { try { - const content = messageContent.toLowerCase(); + // Check if user has officer role - bypass scam detection + if (message.member && message.member.roles.cache.has( + config.OFFICER_ROLE)) { + return false; + } + + const content = message.content.toLowerCase(); let keywordCount = 0; for (const keyword of this.scamKeywords) {