-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlevels.py
More file actions
72 lines (54 loc) · 2.13 KB
/
levels.py
File metadata and controls
72 lines (54 loc) · 2.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import random
import math
import time
from dmoj import fetch_points
from user_data import UserData, get_user_data
# only messages and commands sent in this server count towards points
BOT_SERVER_ID = 1151610487159672982
def handle_message_sent(ctx, is_slash_command=True) -> None:
"""
Updates the experience and level of the user who sent a message or used a slash command.
"""
if ctx.guild.id != BOT_SERVER_ID:
return
user_data = get_user_data(ctx.author.id)
if user_data is not None:
_handle_message_sent_user_data(ctx, user_data, is_slash_command)
user_data.save_to_db()
def _handle_message_sent_user_data(ctx, user_data: UserData, is_slash_command: bool) -> None:
user_data.messages += 1
time_now = int(time.time())
if time_now < user_data.next_experience_gain_time:
return
user_data.next_experience_gain_time = time_now + 30
# Increase experience
gained_experience = random.randint(5, 10)
if is_slash_command:
gained_experience *= 5
elif len(ctx.content) > 0:
gained_experience *= 1 + math.log(len(ctx.content))
else:
gained_experience *= 3
user_data.experience += round(gained_experience)
if user_data.experience >= get_next_level_experience(user_data.level):
user_data.level += 1
print(gained_experience, "experience earned")
def get_next_level_experience(level: int) -> int:
"""
Returns the total amount of experience required to reach level `level + 1`.
"""
levels_sum = level * (level + 1) // 2
return 150 + levels_sum * 500
def get_next_level_percentage(user_data: UserData) -> float:
"""
Returns how close the user is to attaining the next level.
"""
level = user_data.level
if level == 0:
previous_level_experience = 0
else:
previous_level_experience = get_next_level_experience(level - 1)
next_level_experience = get_next_level_experience(level)
delta_experience = next_level_experience - previous_level_experience
current_level_experience = user_data.experience - previous_level_experience
return current_level_experience / delta_experience