MCPcopy Index your code
hub / github.com/codebymitch/TitanBot / addXp

Function addXp

src/services/xpSystem.js:9–90  ·  view source on GitHub ↗
(client, guild, member, xpToAdd)

Source from the content-addressed store, hash-verified

7import { Mutex } from '../utils/mutex.js';
8
9export async function addXp(client, guild, member, xpToAdd) {
10 const lockKey = `leveling:${guild.id}:${member.user.id}`;
11 return await Mutex.runExclusive(lockKey, async () => {
12 try {
13
14 if (!xpToAdd || xpToAdd <= 0) {
15 return { success: false, reason: 'Invalid XP amount' };
16 }
17
18 const config = await getLevelingConfig(client, guild.id);
19
20 if (!config.enabled) {
21 return { success: false, reason: 'Leveling is disabled in this server' };
22 }
23
24 const levelData = await getUserLevelData(client, guild.id, member.user.id);
25
26 levelData.xp += xpToAdd;
27 levelData.totalXp += xpToAdd;
28 levelData.lastMessage = Date.now();
29
30 let xpNeededForNextLevel = getXpForLevel(levelData.level);
31 let didLevelUp = false;
32 const initialLevel = levelData.level;
33
34 while (levelData.xp >= xpNeededForNextLevel && levelData.level < 1000) {
35 levelData.xp -= xpNeededForNextLevel;
36 levelData.level += 1;
37 didLevelUp = true;
38 xpNeededForNextLevel = getXpForLevel(levelData.level);
39
40 logger.info(`🎉 ${member.user.tag} leveled up to level ${levelData.level} in ${guild.name}`);
41
42 if (config.roleRewards && config.roleRewards[levelData.level]) {
43 await awardRoleReward(guild, member, config.roleRewards[levelData.level], levelData.level);
44 }
45 }
46
47 if (didLevelUp) {
48
49 if (config.announceLevelUp) {
50 await sendLevelUpAnnouncement(guild, member, levelData, config);
51 }
52
53 try {
54 await logEvent({
55 client,
56 guildId: guild.id,
57 eventType: EVENT_TYPES.LEVELING_LEVELUP,
58 data: {
59 title: 'Level Up',
60 lines: [
61 formatLogLine('Member', `${member.user.tag} (\`${member.user.id}\`)`),
62 formatLogLine('New Level', levelData.level.toString()),
63 formatLogLine('Levels Gained', (levelData.level - initialLevel).toString()),
64 formatLogLine('Total XP', levelData.totalXp.toString()),
65 ],
66 userId: member.user.id,

Callers 1

handleLevelingFunction · 0.90

Calls 8

getLevelingConfigFunction · 0.90
getUserLevelDataFunction · 0.90
getXpForLevelFunction · 0.90
logEventFunction · 0.90
formatLogLineFunction · 0.90
saveUserLevelDataFunction · 0.90
awardRoleRewardFunction · 0.85
sendLevelUpAnnouncementFunction · 0.85

Tested by

no test coverage detected