-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
200 lines (138 loc) · 6.87 KB
/
main.py
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
import discord
from discord.ext import commands
from dotenv import load_dotenv
import os
import json
bot = commands.Bot(".", intents=discord.Intents.all(), help_command=None)
# Change this value to 0 if you don't want a fixed rate.
fixedrate = 25
# How much exp is given to the user when they send a message
expgiven = 5
# Create a users folder if it doesn't exist
if not os.path.exists("users"):
os.makedirs("users")
helpembed = discord.Embed(title="Help Menu ❓", description="Shows information about commands.")
helpembed.add_field(name="level", value="Tells you how many levels you have.", inline=False)
helpembed.add_field(name="leaderboard {totalexp | level}", value="Displays the server level/total exp leaderboard", inline=False)
infoembed = discord.Embed(title="Info Menu :information_source:")
infoembed.add_field(name="Bot Creator", value="[Jugie](https://github.com/JugieNoob)", inline=False)
infoembed.add_field(name="Bot Source Code", value="[Github](https://github.com/JugieNoob/Discord-Levels-Bot)", inline=False)
async def expUp(message, expincrease):
global expneeded
userid = message.author.id
# Create a file for a user if they do not have one
if not os.path.isfile(f"users/{userid}.json"):
with open(f"users/{userid}.json", "w") as file:
data = {"totalexp": 0, "exp": 0, "level": 0}
json.dump(data, file)
print(f"Created JSON for user {userid}!")
# Get exp
with open(f"users/{userid}.json", "r") as file:
global userdata
userdata = json.load(file)
userdata["totalexp"] += expincrease
userdata["exp"] += expincrease
# How much exp it takes for the user to level up (the default value is 25 exp per level)
if fixedrate != 0:
expneeded = fixedrate - userdata["exp"]
if userdata["level"] != userdata["totalexp"] // fixedrate:
# Level up
userdata["level"] = (userdata["totalexp"] // fixedrate)
# Make the level up embed
levelembed = discord.Embed(title="**Level Up!**", description=f"**<@{userid}> has levelled up to level {userdata["level"]}\n\nExp needed for next level**: {fixedrate}")
levelembed.set_thumbnail(url=message.author.avatar)
levelembed.set_footer(text=bot.user.name, icon_url=bot.user.avatar)
userdata["exp"] = 0
await message.channel.send(embed=levelembed)
else: # Exp needed increases for every level
baserate = 30
expneeded = baserate * ((userdata["level"] + 1) * 2)
if userdata["level"] != userdata["totalexp"] // expneeded:
# Level up
userdata["level"] = userdata["totalexp"] // expneeded
# Make the level up embed
levelembed = discord.Embed(title="**Level Up!**", description=f"<@{userid}> has levelled up to level {userdata["level"]}\n\nExp needed for next level: {baserate * ((userdata["level"] + 1) * 2)}")
levelembed.set_thumbnail(url=message.author.avatar)
levelembed.set_footer(text=bot.user.name, icon_url=bot.user.avatar)
await message.channel.send(embed=levelembed)
userdata["exp"] = 0
# Write to the json file
with open(f"users/{userid}.json", "w") as file:
json.dump(userdata, file)
pass
def fetchLevelLeaderboard():
leaderboard = []
for files in os.listdir("users/"):
with open(f"users/{files}", "r") as file:
global userdata
userdata = json.load(file)
leaderboard.append({"level": int(userdata["level"]), "userid": int(file.name.replace("users/", "").replace(".json", ""))})
leaderboard.sort(reverse=True,key=lambda x: x["level"])
print(leaderboard)
leaderboardembed = discord.Embed(title="Level Leaderboard")
placement = 0
for value in leaderboard:
placement+=1
leaderboardembed.add_field(name=f"{placement}.", value=f"<@{int(value["userid"])}>: {value["level"]}", inline=False)
leaderboardembed.set_thumbnail(url=bot.user.avatar)
leaderboardembed.set_footer(text=bot.user.name, icon_url=bot.user.avatar)
return leaderboardembed
def fetchExpLeaderboard():
leaderboard = []
for files in os.listdir("users/"):
with open(f"users/{files}", "r") as file:
global userdata
userdata = json.load(file)
leaderboard.append({"totalexp": int(userdata["totalexp"]), "userid": int(file.name.replace("users/", "").replace(".json", ""))})
leaderboard.sort(reverse=True,key=lambda x: x["totalexp"])
print(leaderboard)
leaderboardembed = discord.Embed(title="EXP Leaderboard")
placement = 0
for value in leaderboard:
placement+=1
leaderboardembed.add_field(name=f"{placement}.", value=f"<@{int(value["userid"])}>: {value["totalexp"]}", inline=False)
leaderboardembed.set_thumbnail(url=bot.user.avatar)
leaderboardembed.set_footer(text=bot.user.name, icon_url=bot.user.avatar)
return leaderboardembed
@bot.event
async def on_ready():
print(f"Logged in as {bot.user}")
@bot.event
async def on_message(message):
if message.author.id != bot.user.id:
await expUp(message, expgiven)
await bot.process_commands(message)
@bot.command("level")
async def self(ctx):
userid = ctx.message.author.id
with open(f"users/{userid}.json", "r") as file:
userdata = json.load(file)
levelembed = discord.Embed(title="**Level Information**", description=f"Current Level: **{userdata["level"]}**\n\nCurrent EXP: **{userdata["exp"]}**\nEXP Needed: **{expneeded}**\n\nTotal EXP: **{userdata["totalexp"]}**")
levelembed.set_thumbnail(url=ctx.message.author.avatar)
levelembed.set_footer(text=bot.user.name, icon_url=bot.user.avatar)
await ctx.send(embed=levelembed)
@bot.command("giveexp")
async def self(ctx, member:discord.User, exp:int):
await expUp(ctx.message, exp)
await ctx.send(f"Gave <@{member.id}> {exp} EXP!")
@bot.command("leaderboard")
async def self(ctx, choice = ""):
if choice.lower() == "level":
await ctx.send(embed=fetchLevelLeaderboard())
elif choice.lower() == "totalexp":
await ctx.send(embed=fetchExpLeaderboard())
else:
await ctx.send("Invalid choice! Please enter 'level' or 'totalexp'!")
@bot.command("help")
async def self(ctx):
helpembed.set_thumbnail(url=bot.user.avatar)
helpembed.set_footer(text=bot.user.name, icon_url=bot.user.avatar)
await ctx.send(embed=helpembed)
@bot.command("info")
async def self(ctx):
infoembed.set_thumbnail(url=bot.user.avatar)
infoembed.set_footer(text=bot.user.name, icon_url=bot.user.avatar)
await ctx.send(embed=infoembed)
# Start the bot.
load_dotenv()
bot.run(os.getenv("TOKEN"))