sparkytron3000/cogs/message_xp.py
2024-11-29 21:51:28 -08:00

169 lines
No EOL
4 KiB
Python

from discord.ext import commands
import discord
import json
import os
from cogs.base_cog.bot_base_cog import BotBaseCog
class MessageXP(BotBaseCog):
def __init__(self, bot):
super().__init__(bot)
self.setup(__class__.__name__)
@commands.command()
async def stats(self, ctx):
author_id = str(ctx.author.id)
try:
xp_data = read_xp_file(self)
if author_id in xp_data:
level = get_level_from_xp(xp_data[author_id])
await ctx.send(f"You are level {level} with {xp_data[author_id]} XP")
else:
await ctx.send("You have 0 XP")
except:
await ctx.send("Error getting XP")
@commands.command()
async def show_json(self, ctx):
with open(os.path.join(self.data_dir, "xp.json"), "r") as xp_file:
xp_data = json.load(xp_file)
await ctx.send(xp_data)
@commands.Cog.listener()
async def on_message(self, message: discord.Message):
try:
author_id = str(message.author.id)
if message.author.bot:
return
else:
xp_data = read_xp_file(self)
if author_id in xp_data:
xp_data[author_id] += 1
else:
xp_data[author_id] = 1
with open(os.path.join(self.data_dir, "xp.json"), "w") as xp_file:
json.dump(xp_data, xp_file)
except Exception as e:
self.logger.error(f"Error adding XP: {e}")
def read_xp_file(self):
try:
with open(os.path.join(self.data_dir, "xp.json"), "r") as xp_file:
xp_data = json.load(xp_file)
return xp_data
except Exception as e:
self.logger.error(f"No XP file found. Returning empty json object: {e}")
return {}
def get_level_from_xp(xp):
xp_dict = {
1: 0,
2: 83,
3: 174,
4: 276,
5: 388,
6: 512,
7: 650,
8: 801,
9: 801,
10: 1_154,
11: 1_358,
12: 1_584,
13: 1_833,
14: 2_107,
15: 2_411,
16: 2_746,
17: 3_115,
18: 3_523,
19: 3_973,
20: 4_470,
21: 5_018,
22: 5_624,
23: 6_291,
24: 7_028,
25: 7_842,
26: 8_740,
27: 9_730,
28: 10_824,
29: 12_031,
30: 13_363,
31: 14_833,
32: 16_456,
33: 18_247,
34: 20_224,
35: 22_406,
36: 24_815,
37: 27_473,
38: 30_408,
39: 33_648,
40: 37_224,
41: 41_171,
42: 45_529,
43: 50_339,
44: 55_649,
45: 61_512,
46: 67_983,
47: 75_127,
48: 83_014,
49: 91_721,
50: 101_333,
51: 111_945,
52: 123_660,
53: 136_594,
54: 150_872,
55: 166_636,
56: 184_040,
57: 203_254,
58: 224_466,
59: 247_886,
60: 273_742,
61: 302_288,
62: 333_804,
63: 368_599,
64: 407_015,
65: 449_428,
66: 496_254,
67: 547_953,
68: 605_032,
69: 668_051,
70: 737_627,
71: 814_445,
72: 899_257,
73: 992_895,
74: 1_096_278,
75: 1_210_421,
76: 1_336_443,
77: 1_475_581,
78: 1_629_200,
79: 1_798_808,
80: 1_986_068,
81: 2_192_818,
82: 2_421_087,
83: 2_673_114,
84: 2_951_373,
85: 3_258_594,
86: 3_597_792,
87: 3_972_294,
88: 4_385_776,
89: 4_842_295,
90: 5_346_332,
91: 5_902_831,
92: 6_517_253,
93: 7_195_629,
94: 7_944_614,
95: 8_771_558,
96: 9_684_577,
97: 10_692_629,
98: 11_805_606,
99: 13_034_431
}
for level, xp_threshold in xp_dict.items():
if xp < xp_threshold:
return level - 1
return 99
async def setup(bot):
await bot.add_cog(MessageXP(bot))