feat: initial Papo bot scaffold

This commit is contained in:
Pascal.P
2025-11-30 11:04:41 +01:00
commit 000481a3b0
12168 changed files with 1584750 additions and 0 deletions

View File

@@ -0,0 +1,39 @@
import { Collection, Message } from 'discord.js';
import { logger } from '../utils/logger.js';
import { settings } from '../config/state.js';
interface LevelData {
xp: number;
level: number;
}
export class LevelService {
private data = new Collection<string, LevelData>();
private cooldown = new Set<string>();
handleMessage(message: Message) {
if (!message.guild || message.author.bot) return;
const guildConfig = settings.get(message.guild.id);
if (!guildConfig?.levelingEnabled) return;
const key = `${message.guild.id}:${message.author.id}`;
if (this.cooldown.has(key)) return;
this.cooldown.add(key);
setTimeout(() => this.cooldown.delete(key), 60_000);
const entry = this.data.get(key) ?? { xp: 0, level: 0 };
entry.xp += 10;
const nextLevel = Math.floor(0.2 * Math.sqrt(entry.xp));
if (nextLevel > entry.level) {
entry.level = nextLevel;
message.channel.send({ content: `${message.author} hat Level ${entry.level} erreicht!` }).catch(() => undefined);
logger.info(`Level up: ${message.author.tag} -> ${entry.level}`);
}
this.data.set(key, entry);
}
getLevel(userId: string, guildId: string) {
const key = `${guildId}:${userId}`;
return this.data.get(key) ?? { xp: 0, level: 0 };
}
}