5
5
import math
6
6
from flask import Flask , render_template , redirect , url_for , request
7
7
from flask_sqlalchemy import SQLAlchemy
8
+ from werkzeug .wrappers import Response
8
9
9
10
app = Flask (__name__ )
10
11
app .config ["SQLALCHEMY_DATABASE_URI" ] = "sqlite:///users.db"
@@ -16,17 +17,20 @@ class User(db.Model): # user class
16
17
A user model to store the level and experience points (XP).
17
18
"""
18
19
19
- id = db .Column (db .Integer , primary_key = True ,
20
- unique = True , nullable = False ) # user id
21
- username = db .Column (db .String (80 ), unique = True ,
22
- nullable = False ) # username
23
- xp = db .Column (db .Float , default = 0 , nullable = False ) # user XP
24
- xp_required = db .Column (db .Float , default = 1 ,
25
- nullable = False ) # user XP required
26
- total_xp = db .Column (db .Float , default = 0 , nullable = False ) # user total XP
27
- level = db .Column (db .Integer , default = 1 , nullable = False ) # user level
28
-
29
- def add_xp (self , amount ): # add XP
20
+ id : int = db .Column (
21
+ db .Integer , primary_key = True , unique = True , nullable = False
22
+ ) # user id
23
+ username : str = db .Column (
24
+ db .String (80 ), unique = True , nullable = False ) # username
25
+ xp : float = db .Column (db .Float , default = 0 , nullable = False ) # user XP
26
+ xp_required : float = db .Column (
27
+ db .Float , default = 1 , nullable = False
28
+ ) # user XP required
29
+ total_xp : float = db .Column (
30
+ db .Float , default = 0 , nullable = False ) # user total XP
31
+ level : int = db .Column (db .Integer , default = 1 , nullable = False ) # user level
32
+
33
+ def add_xp (self , amount : float ) -> None : # add XP
30
34
"""
31
35
Add XP (experience points) to the user.
32
36
amount - the amount to add XP.
@@ -35,7 +39,7 @@ def add_xp(self, amount): # add XP
35
39
self .total_xp += amount # add total XP by amount
36
40
self .check_level_up () # check if user has leveled up
37
41
38
- def check_level_up (self ): # check if user has leveled up
42
+ def check_level_up (self ) -> None : # check if user has leveled up
39
43
"""
40
44
Check if the user has leveled up.
41
45
"""
@@ -52,27 +56,28 @@ def check_level_up(self): # check if user has leveled up
52
56
) # increase XP required exponentially with slower growth at higher levels
53
57
self .level += 1 # increase level
54
58
55
- def get_xp_required (self ): # get required XP to next level
59
+ def get_xp_required (self ) -> float : # get required XP to next level
56
60
"""
57
61
Get the required XP for the user to level up.
58
62
"""
59
63
return self .xp_required
60
64
61
- def get_level_progress (self ): # get level progress
65
+ def get_level_progress (self ) -> float : # get level progress
62
66
"""
63
67
Get the level progress as a percentage.
64
68
"""
65
69
return (self .xp / self .xp_required ) * 100
66
70
67
71
68
72
@app .template_filter ("short_numeric" ) # short numeric filter
69
- # get number in short numeric form with abbreviations
70
- def short_numeric_filter (value ):
73
+ def short_numeric_filter (
74
+ value : float ,
75
+ ) -> str : # get number in short numeric form with abbreviations
71
76
"""
72
77
Get the abbreviated numeric value.
73
78
value - the numeric value to convert.
74
79
"""
75
- units = [
80
+ units : list [ str ] = [
76
81
"" ,
77
82
"K" ,
78
83
"M" ,
@@ -97,7 +102,7 @@ def short_numeric_filter(value):
97
102
"V" ,
98
103
] # list of units with abbreviations
99
104
exponent = 0
100
- mantissa = value # mantissa value from 1 to 999
105
+ mantissa : float = value # mantissa value from 1 to 999
101
106
while mantissa >= 1000 : # repeat until mantissa is within 1 to 999
102
107
mantissa /= 1000
103
108
exponent += 1
@@ -111,27 +116,27 @@ def short_numeric_filter(value):
111
116
112
117
113
118
@app .route ("/" ) # index page
114
- def index (): # get index page template
119
+ def index () -> str : # get index page template
115
120
"""
116
121
Return the index page containing a user.
117
122
"""
118
- user = User .query .first () # get first user
123
+ user : User | None = User .query .first () # get first user
119
124
# redirect to index page template
120
125
return render_template ("index.html" , user = user )
121
126
122
127
123
128
@app .route ("/add_xp" , methods = ["POST" ]) # add XP from POST method
124
- def add_xp (): # add XP
129
+ def add_xp () -> Response : # add XP
125
130
"""
126
131
Add XP (experience points) based on entered amount.
127
132
"""
128
- user = User .query .first () # get first user
133
+ user : User | None = User .query .first () # get first user
129
134
user .add_xp (float (request .form ["amount" ])) # parse amount as float
130
135
db .session .commit () # commit database changes
131
136
return redirect (url_for ("index" )) # redirect to index page template
132
137
133
138
134
- def init_db (): # initialize database
139
+ def init_db () -> None : # initialize database
135
140
"""
136
141
Initialize the user database.
137
142
"""
0 commit comments