class AchievementEventMonitor {
constructor(contract) {
this.contract = contract;
this.userProgress = new Map();
this.claimHistory = [];
this.setupListeners();
}
setupListeners() {
// Monitor all achievement events
this.contract.on('AchievementCreated', (id, name, category, rarity, event) => {
this.handleAchievementCreated(id, name, category, rarity, event);
});
this.contract.on('AchievementClaimed', (user, achievementId, timestamp, event) => {
this.handleAchievementClaimed(user, achievementId, timestamp, event);
});
this.contract.on('ProgressUpdated', (user, achievementId, progress, event) => {
this.handleProgressUpdated(user, achievementId, progress, event);
});
this.contract.on('BadgeMinted', (user, achievementId, tokenId, event) => {
this.handleBadgeMinted(user, achievementId, tokenId, event);
});
}
handleAchievementCreated(id, name, category, rarity, event) {
console.log(`New Achievement: ${name} (ID: ${id.toString()})`);
// Trigger notification
this.notifyNewAchievement(id, name, category, rarity);
}
handleAchievementClaimed(user, achievementId, timestamp, event) {
const claim = {
user,
achievementId: achievementId.toString(),
timestamp: timestamp.toNumber(),
blockNumber: event.blockNumber,
transactionHash: event.transactionHash
};
this.claimHistory.push(claim);
console.log(`Achievement ${achievementId.toString()} claimed by ${user}`);
// Trigger celebration
this.celebrateClaim(user, achievementId);
}
handleProgressUpdated(user, achievementId, progress, event) {
const key = `${user}-${achievementId.toString()}`;
if (!this.userProgress.has(key)) {
this.userProgress.set(key, []);
}
this.userProgress.get(key).push({
progress: progress.toString(),
blockNumber: event.blockNumber
});
console.log(`Progress update: ${user} - Achievement ${achievementId.toString()}: ${progress.toString()}`);
}
handleBadgeMinted(user, achievementId, tokenId, event) {
console.log(`Badge #${tokenId.toString()} minted for ${user}`);
// Update UI with new badge
this.displayBadge(user, achievementId, tokenId);
}
getUserProgress(user, achievementId) {
const key = `${user}-${achievementId}`;
return this.userProgress.get(key) || [];
}
getRecentClaims(limit = 10) {
return this.claimHistory.slice(-limit);
}
notifyNewAchievement(id, name, category, rarity) {
// Implement notification logic
console.log(`📢 New achievement available: ${name}`);
}
celebrateClaim(user, achievementId) {
// Implement celebration logic
console.log(`🎉 Achievement unlocked!`);
}
displayBadge(user, achievementId, tokenId) {
// Implement badge display logic
console.log(`🏆 Badge earned: #${tokenId.toString()}`);
}
}
// Usage
const monitor = new AchievementEventMonitor(contract);