Achivement System
This commit is contained in:
110
scripts/daily_achievements.js
Normal file
110
scripts/daily_achievements.js
Normal file
@@ -0,0 +1,110 @@
|
||||
const { Pool } = require('pg');
|
||||
require('dotenv').config();
|
||||
|
||||
const pool = new Pool({
|
||||
connectionString: process.env.DATABASE_URL,
|
||||
ssl: process.env.NODE_ENV === 'production' ? { rejectUnauthorized: false } : false
|
||||
});
|
||||
|
||||
async function runDailyAchievements() {
|
||||
const client = await pool.connect();
|
||||
|
||||
try {
|
||||
console.log('🎯 Starting daily achievement check...');
|
||||
|
||||
// Get all players who have played today
|
||||
const playersResult = await client.query(`
|
||||
SELECT DISTINCT p.id, p.firstname, p.lastname
|
||||
FROM players p
|
||||
INNER JOIN times t ON p.id = t.player_id
|
||||
WHERE DATE(t.created_at AT TIME ZONE 'Europe/Berlin') = CURRENT_DATE
|
||||
`);
|
||||
|
||||
console.log(`Found ${playersResult.rows.length} players who played today`);
|
||||
|
||||
let totalAchievements = 0;
|
||||
|
||||
// Check achievements for each player
|
||||
for (const player of playersResult.rows) {
|
||||
console.log(`Checking achievements for ${player.firstname} ${player.lastname}...`);
|
||||
|
||||
// Run achievement check function
|
||||
await client.query('SELECT check_all_achievements($1)', [player.id]);
|
||||
|
||||
// Count new achievements earned today
|
||||
const newAchievementsResult = await client.query(`
|
||||
SELECT COUNT(*) as count
|
||||
FROM player_achievements pa
|
||||
INNER JOIN achievements a ON pa.achievement_id = a.id
|
||||
WHERE pa.player_id = $1
|
||||
AND pa.is_completed = true
|
||||
AND DATE(pa.earned_at AT TIME ZONE 'Europe/Berlin') = CURRENT_DATE
|
||||
`, [player.id]);
|
||||
|
||||
const newAchievements = parseInt(newAchievementsResult.rows[0].count);
|
||||
totalAchievements += newAchievements;
|
||||
|
||||
if (newAchievements > 0) {
|
||||
console.log(` ✅ ${newAchievements} new achievements earned!`);
|
||||
|
||||
// Get details of new achievements
|
||||
const achievementsResult = await client.query(`
|
||||
SELECT a.name, a.description, a.icon, a.points
|
||||
FROM player_achievements pa
|
||||
INNER JOIN achievements a ON pa.achievement_id = a.id
|
||||
WHERE pa.player_id = $1
|
||||
AND pa.is_completed = true
|
||||
AND DATE(pa.earned_at AT TIME ZONE 'Europe/Berlin') = CURRENT_DATE
|
||||
ORDER BY pa.earned_at DESC
|
||||
`, [player.id]);
|
||||
|
||||
achievementsResult.rows.forEach(achievement => {
|
||||
console.log(` ${achievement.icon} ${achievement.name} (+${achievement.points} points)`);
|
||||
});
|
||||
} else {
|
||||
console.log(` ℹ️ No new achievements`);
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`\n🎉 Daily achievement check completed!`);
|
||||
console.log(`Total new achievements earned: ${totalAchievements}`);
|
||||
|
||||
// Log summary statistics
|
||||
const statsResult = await client.query(`
|
||||
SELECT
|
||||
COUNT(DISTINCT pa.player_id) as players_with_achievements,
|
||||
COUNT(pa.id) as total_achievements_earned,
|
||||
SUM(a.points) as total_points_earned
|
||||
FROM player_achievements pa
|
||||
INNER JOIN achievements a ON pa.achievement_id = a.id
|
||||
WHERE pa.is_completed = true
|
||||
`);
|
||||
|
||||
const stats = statsResult.rows[0];
|
||||
console.log(`\n📊 Overall Statistics:`);
|
||||
console.log(`Players with achievements: ${stats.players_with_achievements}`);
|
||||
console.log(`Total achievements earned: ${stats.total_achievements_earned}`);
|
||||
console.log(`Total points earned: ${stats.total_points_earned || 0}`);
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ Error running daily achievements:', error);
|
||||
throw error;
|
||||
} finally {
|
||||
client.release();
|
||||
}
|
||||
}
|
||||
|
||||
// Run if called directly
|
||||
if (require.main === module) {
|
||||
runDailyAchievements()
|
||||
.then(() => {
|
||||
console.log('✅ Daily achievements script completed successfully');
|
||||
process.exit(0);
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error('❌ Daily achievements script failed:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = { runDailyAchievements };
|
||||
86
scripts/setup_cron.js
Normal file
86
scripts/setup_cron.js
Normal file
@@ -0,0 +1,86 @@
|
||||
const { exec } = require('child_process');
|
||||
const path = require('path');
|
||||
|
||||
// Cron job setup for daily achievements
|
||||
const cronJob = {
|
||||
// Run daily at 23:59 (end of day)
|
||||
schedule: '59 23 * * *',
|
||||
command: `cd ${__dirname} && node daily_achievements.js >> /var/log/ninjaserver_achievements.log 2>&1`,
|
||||
description: 'Daily achievement check for Ninja Cross Parkour'
|
||||
};
|
||||
|
||||
function setupCronJob() {
|
||||
console.log('🕐 Setting up daily achievement cron job...');
|
||||
|
||||
// Create cron job entry
|
||||
const cronEntry = `${cronJob.schedule} ${cronJob.command}`;
|
||||
|
||||
// Add to crontab
|
||||
exec(`(crontab -l 2>/dev/null; echo "${cronEntry}") | crontab -`, (error, stdout, stderr) => {
|
||||
if (error) {
|
||||
console.error('❌ Error setting up cron job:', error);
|
||||
return;
|
||||
}
|
||||
|
||||
if (stderr) {
|
||||
console.error('⚠️ Cron job warning:', stderr);
|
||||
}
|
||||
|
||||
console.log('✅ Cron job setup successfully!');
|
||||
console.log(`📅 Schedule: ${cronJob.schedule}`);
|
||||
console.log(`🔧 Command: ${cronJob.command}`);
|
||||
console.log('📝 Logs will be written to: /var/log/ninjaserver_achievements.log');
|
||||
|
||||
// Show current crontab
|
||||
exec('crontab -l', (error, stdout, stderr) => {
|
||||
if (!error) {
|
||||
console.log('\n📋 Current crontab:');
|
||||
console.log(stdout);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function removeCronJob() {
|
||||
console.log('🗑️ Removing daily achievement cron job...');
|
||||
|
||||
exec('crontab -l | grep -v "daily_achievements.js" | crontab -', (error, stdout, stderr) => {
|
||||
if (error) {
|
||||
console.error('❌ Error removing cron job:', error);
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('✅ Cron job removed successfully!');
|
||||
});
|
||||
}
|
||||
|
||||
// Command line interface
|
||||
if (require.main === module) {
|
||||
const command = process.argv[2];
|
||||
|
||||
switch (command) {
|
||||
case 'setup':
|
||||
setupCronJob();
|
||||
break;
|
||||
case 'remove':
|
||||
removeCronJob();
|
||||
break;
|
||||
case 'status':
|
||||
exec('crontab -l | grep daily_achievements', (error, stdout, stderr) => {
|
||||
if (stdout) {
|
||||
console.log('✅ Cron job is active:');
|
||||
console.log(stdout);
|
||||
} else {
|
||||
console.log('❌ No cron job found');
|
||||
}
|
||||
});
|
||||
break;
|
||||
default:
|
||||
console.log('Usage: node setup_cron.js [setup|remove|status]');
|
||||
console.log(' setup - Add daily achievement cron job');
|
||||
console.log(' remove - Remove daily achievement cron job');
|
||||
console.log(' status - Check if cron job is active');
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { setupCronJob, removeCronJob };
|
||||
Reference in New Issue
Block a user