Fix scheduled events not executing due to property name mismatch
The scheduler was correctly scheduling events but they weren't executing because the code was checking for camelCase property names (channelId, pingRoleId) while the database returns snake_case names (channel_id, ping_role_id). This caused channel and role validation to be skipped, resulting in silent failures. Also added sqlite3 CLI to Docker container for debugging database issues. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
# Use Node 20 LTS with full Debian for better compatibility
|
||||
FROM node:20
|
||||
|
||||
RUN apt update && apt install -y sqlite3
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Copy package files (npm will work better for native modules in Docker)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
const schedule = require('node-schedule');
|
||||
const schedule = require("node-schedule");
|
||||
|
||||
class SchedulerService {
|
||||
constructor() {
|
||||
@@ -11,7 +11,7 @@ class SchedulerService {
|
||||
* @param {ConfigManager} configManager
|
||||
*/
|
||||
async initialize(client, configManager) {
|
||||
console.log('Initializing scheduled events...');
|
||||
console.log("Initializing scheduled events...");
|
||||
|
||||
const guildConfigs = configManager.getAllGuildConfigs();
|
||||
|
||||
@@ -27,17 +27,22 @@ class SchedulerService {
|
||||
const databaseService = configManager.databaseService;
|
||||
if (!databaseService) continue;
|
||||
|
||||
const scheduledEvents = databaseService.getScheduledEvents(guildConfig.id);
|
||||
const scheduledEvents = databaseService.getScheduledEvents(
|
||||
guildConfig.id
|
||||
);
|
||||
|
||||
if (!scheduledEvents || scheduledEvents.length === 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (const event of scheduledEvents) {
|
||||
await this.scheduleEvent(guild, event, guildConfig);
|
||||
await this.scheduleEvent(guild, event);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`Error setting up scheduled events for guild ${guildConfig.id}:`, error);
|
||||
console.error(
|
||||
`Error setting up scheduled events for guild ${guildConfig.id}:`,
|
||||
error
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -46,26 +51,29 @@ class SchedulerService {
|
||||
* Schedule a single event
|
||||
* @param {Guild} guild
|
||||
* @param {Object} event
|
||||
* @param {Object} guildConfig
|
||||
*/
|
||||
async scheduleEvent(guild, event, guildConfig) {
|
||||
async scheduleEvent(guild, event) {
|
||||
try {
|
||||
// Validate channel
|
||||
let channel = null;
|
||||
if (event.channelId) {
|
||||
channel = await guild.channels.fetch(event.channelId);
|
||||
if (event.channel_id) {
|
||||
channel = await guild.channels.fetch(event.channel_id);
|
||||
if (!channel) {
|
||||
console.error(`Invalid channel ${event.channelId} for event ${event.id} in guild ${guild.name}`);
|
||||
console.error(
|
||||
`Invalid channel ${event.channel_id} for event ${event.id} in guild ${guild.name}`
|
||||
);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Validate role
|
||||
let pingRole = null;
|
||||
if (event.pingRoleId) {
|
||||
pingRole = await guild.roles.fetch(event.pingRoleId);
|
||||
if (event.ping_role_id) {
|
||||
pingRole = await guild.roles.fetch(event.ping_role_id);
|
||||
if (!pingRole) {
|
||||
console.warn(`Invalid role ${event.pingRoleId} for event ${event.id} in guild ${guild.name}`);
|
||||
console.warn(
|
||||
`Invalid role ${event.ping_role_id} for event ${event.id} in guild ${guild.name}`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,9 +89,15 @@ class SchedulerService {
|
||||
const jobKey = `${guild.id}-${event.id}`;
|
||||
this.jobs.set(jobKey, job);
|
||||
|
||||
console.log(`Event ${event.id} scheduled. Next invocation: ${job.nextInvocation()}`);
|
||||
console.log(
|
||||
`Event ${
|
||||
event.id
|
||||
} scheduled. Next invocation: ${job.nextInvocation()}`
|
||||
);
|
||||
} else {
|
||||
console.error(`Failed to schedule event ${event.id} - invalid cron expression: ${event.schedule}`);
|
||||
console.error(
|
||||
`Failed to schedule event ${event.id} with schedule: ${event.schedule}`
|
||||
);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`Error scheduling event ${event.id}:`, error);
|
||||
@@ -112,7 +126,7 @@ class SchedulerService {
|
||||
|
||||
// Send the message
|
||||
if (content.length > 0 && channel) {
|
||||
await channel.send(content.join(' '));
|
||||
await channel.send(content.join(" "));
|
||||
console.log(`Executed scheduled event ${event.id}`);
|
||||
}
|
||||
} catch (error) {
|
||||
@@ -158,7 +172,7 @@ class SchedulerService {
|
||||
job.cancel();
|
||||
}
|
||||
this.jobs.clear();
|
||||
console.log('Cancelled all scheduled events');
|
||||
console.log("Cancelled all scheduled events");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user