Komplettes AdivmentSystem überarbeitet!

This commit is contained in:
2025-09-11 17:07:43 +02:00
parent 28616b3b0c
commit 6d5dc9eb7a
9 changed files with 1087 additions and 16 deletions

View File

@@ -874,6 +874,23 @@ router.post('/v1/private/create-time', requireApiKey, async (req, res) => {
[rfiduid, location_id, recorded_time, new Date()]
);
// Achievement-Überprüfung nach Zeit-Eingabe (JavaScript)
try {
const AchievementSystem = require('../lib/achievementSystem');
const achievementSystem = new AchievementSystem();
const newAchievements = await achievementSystem.checkImmediateAchievements(result.rows[0].player_id);
if (newAchievements.length > 0) {
console.log(`🏆 ${newAchievements.length} neue Achievements für Spieler ${result.rows[0].player_id}:`);
newAchievements.forEach(achievement => {
console.log(` ${achievement.icon} ${achievement.name} (+${achievement.points} Punkte)`);
});
}
} catch (achievementError) {
console.error('Fehler bei Achievement-Check:', achievementError);
// Achievement-Fehler sollen die Zeit-Eingabe nicht blockieren
}
// WebSocket-Event senden für Live-Updates
const io = req.app.get('io');
if (io) {
@@ -2503,10 +2520,18 @@ router.post('/v1/admin/runs', requireAdminAuth, async (req, res) => {
[player_id, location_id, timeInterval]
);
// Achievement-Überprüfung nach Zeit-Eingabe
// Achievement-Überprüfung nach Zeit-Eingabe (JavaScript)
try {
await pool.query('SELECT check_immediate_achievements($1)', [player_id]);
console.log(`✅ Achievement-Check für Spieler ${player_id} ausgeführt`);
const AchievementSystem = require('../lib/achievementSystem');
const achievementSystem = new AchievementSystem();
const newAchievements = await achievementSystem.checkImmediateAchievements(player_id);
if (newAchievements.length > 0) {
console.log(`🏆 ${newAchievements.length} neue Achievements für Spieler ${player_id}:`);
newAchievements.forEach(achievement => {
console.log(` ${achievement.icon} ${achievement.name} (+${achievement.points} Punkte)`);
});
}
} catch (achievementError) {
console.error('Fehler bei Achievement-Check:', achievementError);
// Achievement-Fehler sollen die Zeit-Eingabe nicht blockieren
@@ -3048,14 +3073,16 @@ router.get('/achievements/player/:playerId', async (req, res) => {
a.category,
a.icon,
a.points,
COALESCE(pa.progress, 0) as progress,
COALESCE(pa.is_completed, false) as is_completed,
pa.earned_at
COALESCE(MAX(pa.progress), 0) as progress,
COALESCE(COUNT(pa.id) > 0, false) as is_completed,
MAX(pa.earned_at) as earned_at,
COUNT(pa.id) as completion_count
FROM achievements a
LEFT JOIN player_achievements pa ON a.id = pa.achievement_id AND pa.player_id = $1
LEFT JOIN player_achievements pa ON a.id = pa.achievement_id AND pa.player_id = $1 AND pa.is_completed = true
WHERE a.is_active = true
GROUP BY a.id, a.name, a.name_en, a.description, a.description_en, a.category, a.icon, a.points
ORDER BY
pa.is_completed DESC,
is_completed DESC,
a.category,
a.points DESC
`, [playerId]);
@@ -3092,10 +3119,10 @@ router.get('/achievements/player/:playerId/stats', async (req, res) => {
WHERE is_active = true
`);
// Get player's earned achievements
// Get player's earned achievements (count unique achievements, not total completions)
const playerResult = await pool.query(`
SELECT
COUNT(CASE WHEN pa.is_completed = true THEN 1 END) as completed_achievements,
COUNT(DISTINCT CASE WHEN pa.is_completed = true THEN pa.achievement_id END) as completed_achievements,
SUM(CASE WHEN pa.is_completed = true THEN a.points ELSE 0 END) as total_points,
COUNT(CASE WHEN pa.is_completed = true AND DATE(pa.earned_at AT TIME ZONE 'Europe/Berlin') = CURRENT_DATE THEN 1 END) as achievements_today
FROM achievements a