mazebot/main.py
2022-02-23 11:50:01 +01:00

403 lines
14 KiB
Python
Executable File

import json
import discord
from discord.ext import commands
import random
client = commands.Bot(command_prefix="go ")
icons = {"player": "", "goal": "", "blank": " "}
blanks = []
player = [0, 0]
end = [0, 0]
columns = 30
rows = 10
lvl = 0
walls = []
walls1 = []
generated = False
empty = list(range(1, rows - 1, 2))
async def justcheck(ctx):
role, to_delete = check_lvl(ctx)
try:
for roleX in ctx.guild.roles:
if roleX.name == role:
role = roleX
if role not in ctx.author.roles:
await ctx.author.add_roles(role)
await ctx.channel.send(f"Congratulations to <@{ctx.author.id}> for getting role {role.name}")
for r in ctx.guild.roles:
if r.name in to_delete:
try:
await ctx.author.remove_roles(r)
except Exception as e:
await ctx.send(e)
except Exception as e:
await ctx.send(e)
def check_lvl(ctx):
role = None
with open("data.json", "r") as f:
levels = json.load(f)
lvel = int(levels[str(ctx.guild.id)][str(ctx.author.id)])
role_names = ["|maze noob|",
"|maze novice|",
"|maze gamer|",
"|small maze progamer|",
"|medium maze progamer|",
"|big maze progamer|",
"|giant maze progamer|",
"|extreme maze progamer|",
"|ultra maze progamer|",
"|giant extreme maze progamer|",
"|giant extreme ultra maze progamer|"]
lower_roles = 10
if lvel >= 100000:
role = role_names[-1]
lower_roles -= 1
elif lvel >= 40000:
role = role_names[-2]
lower_roles -= 2
elif lvel >= 20000:
role = role_names[-3]
lower_roles -= 3
elif lvel >= 10000:
role = role_names[-4]
lower_roles -= 4
elif lvel >= 5000:
role = role_names[-5]
lower_roles -= 1
elif lvel >= 1000:
role = role_names[-6]
lower_roles -= 2
elif lvel >= 500:
role = role_names[-7]
lower_roles -= 3
elif lvel >= 250:
role = role_names[-8]
lower_roles -= 4
elif lvel >= 100:
role = role_names[-9]
lower_roles -= 5
elif lvel >= 50:
role = role_names[-10]
lower_roles -= 6
roles_to_remove = []
for r in range(lower_roles):
roles_to_remove.append(role_names[r])
return role, roles_to_remove
def generate_maze():
global player
global blanks
global walls1
global generated
for _ in range(rows):
walls1.append([])
counter2 = 0
for x in walls1:
for _ in range(columns):
if counter2 not in empty:
x.append("|")
else:
x.append(" ")
counter2 += 1
for x in walls1:
kde = random.randint(0, columns - 1)
blanks.append(kde)
x[kde] = icons["blank"]
player[0] = rows - 2
player[1] = blanks[rows - 2]
end[0] = 0
end[1] = blanks[0]
generated = True
def display_maze():
global generated
if not generated:
generate_maze()
global lvl
global player
global walls1
walls2 = []
for x in walls1:
walls2.append(x)
walls_display = []
counter1 = 0
for x in walls1:
kde = blanks[counter1]
x[kde] = icons["blank"]
counter1 += 1
walls2[player[0]][player[1]] = icons["player"]
walls2[end[0]][end[1]] = icons["goal"]
for x in range(0, rows - 1):
for i in range(0, columns - 1):
walls_display.append(" ")
walls_display.append(walls1[x][i])
walls_display.append("\n")
walls_s = f"LEVEL: {lvl}\n"
for x in walls_display:
walls_s += x
print(len(walls_s))
if len(walls_s) > 2000:
raise Exception("Too long")
return walls_s
async def go_left():
if not generated:
generate_maze()
where = [0, 0]
where[0] = player[0]
where[1] = player[1] - 1
if player[1] != 0:
if walls1[where[0]][where[1]] == icons["blank"]:
walls1[player[0]][player[1]] = icons["blank"]
player[0] = where[0]
player[1] = where[1]
async def go_right():
if not generated:
generate_maze()
where = [0, 0]
where[0] = player[0]
where[1] = player[1] + 1
if player[1] != columns - 2:
if walls1[where[0]][where[1]] == icons["blank"]:
walls1[player[0]][player[1]] = icons["blank"]
player[0] = where[0]
player[1] = where[1]
async def go_up(ctx):
global lvl
global generated
if not generated:
generate_maze()
f = open("data.json", "r")
js = json.load(f)
f.close()
if not str(ctx.guild.id) in js:
js[str(ctx.guild.id)] = {}
js[str(ctx.guild.id)]["LVL"] = 0
js[str(ctx.guild.id)][str(ctx.author.id)] = 0
if not str(ctx.author.id) in js[str(ctx.guild.id)]:
js[str(ctx.guild.id)][str(ctx.author.id)] = 0
where = [0, 0]
where[0] = player[0] - 1
where[1] = player[1]
if player[1] == end[1] and player[0] == end[0]:
js[str(ctx.guild.id)][str(ctx.author.id)] += 10
js[str(ctx.guild.id)]["LVL"] += 1
generated = False
lvl = js[str(ctx.guild.id)]["LVL"]
await ctx.send(display_maze())
if walls1[where[0]][where[1]] == icons["blank"] or walls1[where[0]][where[1]] == icons["goal"]:
walls1[player[0]][player[1]] = icons["blank"]
player[0] = where[0]
player[1] = where[1]
js[str(ctx.guild.id)][str(ctx.author.id)] += 1
f = open("data.json", "w")
json.dump(js, f, indent=4)
f.close()
await justcheck(ctx)
@client.command()
@commands.has_permissions(administrator=True)
async def regenerate(ctx):
"""Regenerates the maze. Only admins can use it."""
generated = False
await ctx.send(display_maze())
@client.command()
async def redraw(ctx):
"""Redraws the maze"""
await ctx.send(display_maze())
@client.command()
async def left(ctx, times=1):
"""Goes left. You can specify how much: 1-30 Default 1"""
if times > columns:
times = 30
for i in range(times):
await go_left()
await ctx.send(display_maze())
@client.command()
async def right(ctx, times=1):
"""Goes right. You can specify how much: 1-30 Default 1"""
if times > columns:
times = 30
for i in range(times):
await go_right()
await ctx.send(display_maze())
@client.command()
async def up(ctx, times=1):
"""Goes up. You can specify how much: 1-30 Default 1"""
if times > rows:
times = 30
for i in range(times):
await go_up(ctx)
await ctx.send(display_maze())
@client.command()
async def get_level(ctx, member: discord.Member):
"""Gets the level of a member"""
f = open("data.json", "r")
js = json.load(f)
f.close()
if str(member.id) in js[str(ctx.guild.id)]:
await ctx.send(js[str(ctx.guild.id)][str(member.id)])
else:
await ctx.send("Member not found.")
@client.command()
async def get_my_level(ctx):
"""Gets your own level"""
member = ctx.author
f = open("data.json", "r")
js = json.load(f)
f.close()
if str(member.id) in js[str(ctx.guild.id)]:
await ctx.send(js[str(ctx.guild.id)][str(member.id)])
else:
await ctx.send("Member not found.")
@client.command()
async def tell_about(ctx, member: discord.Member):
"""Tell your friend about mazebot! Type his name after the command."""
await ctx.send(f"Hello <@{member.id}>!\nGo ahead and play the maze game!\nIt is a little buggy but you can win it!\nTry typing 'go help' to see the commands and 'go info'.\n<@{ctx.author.id}>")
@client.command()
async def info(ctx):
"""Info how to play"""
await ctx.send(f"Hello <@{ctx.author.id}>!\n I see that you want help with this game.\nType redraw to draw the maze and use the commands to move.\nIf you cannot fit through a hole, I suggest to to 1-2 characters in each direction and trying again.\nGo ahead and play the maze game!\nIf you are stuck, your admin can regenerate the maze.\nIt is a little buggy but you can win it!\nTry typing 'go help' to see the commands.\n")
@client.command()
async def add_roles(ctx):
# adding level roles
role_names = ["|maze noob|",
"|maze novice|",
"|maze gamer|",
"|small maze progamer|",
"|medium maze progamer|",
"|big maze progamer|",
"|giant maze progamer|",
"|extreme maze progamer|",
"|ultra maze progamer|",
"|giant extreme maze progamer|",
"|giant extreme ultra maze progamer|"]
names = []
for role in ctx.guild.roles:
names.append(role.name)
do_not_do = False
for role in role_names:
await ctx.send(f"Adding {role}...")
if role in names:
do_not_do = True
await ctx.send(f"Exiting, role {role} exists.")
try:
if do_not_do is False:
await ctx.guild.create_role(name=role_names[9], colour=discord.Color.from_rgb(255, 255, 255))
await ctx.guild.create_role(name=role_names[8], colour=discord.Color.from_rgb(0, 255, 0))
await ctx.guild.create_role(name=role_names[7], colour=discord.Color.from_rgb(255, 255, 0))
await ctx.guild.create_role(name=role_names[6], colour=discord.Color.from_rgb(255, 0, 255))
await ctx.guild.create_role(name=role_names[5], colour=discord.Color.from_rgb(200, 209, 33))
await ctx.guild.create_role(name=role_names[4], colour=discord.Color.from_rgb(178, 186, 28))
await ctx.guild.create_role(name=role_names[3], colour=discord.Color.from_rgb(174, 219, 48))
await ctx.guild.create_role(name=role_names[2], colour=discord.Color.from_rgb(207, 118, 227))
await ctx.guild.create_role(name=role_names[1], colour=discord.Color.from_rgb(30, 179, 72))
await ctx.guild.create_role(name=role_names[0], colour=discord.Color.from_rgb(22, 97, 43))
await ctx.send(f"Exiting, finished.")
except Exception as e:
await ctx.send(e)
@client.command()
async def delete_roles(ctx):
role_names = ["|maze noob|",
"|maze novice|",
"|maze gamer|",
"|small maze progamer|",
"|medium maze progamer|",
"|big maze progamer|",
"|giant maze progamer|",
"|extreme maze progamer|",
"|ultra maze progamer|",
"|giant extreme maze progamer|",
"|giant extreme ultra maze progamer|"]
roles_to_remove = []
for role in ctx.guild.roles:
if role.name in role_names:
await ctx.send(f"Removing {role.name}...")
roles_to_remove.append(role)
for role in roles_to_remove:
try:
await ctx.guild.roles[ctx.guild.roles.index(role)].delete()
except Exception as e:
await ctx.send(e)
await ctx.send(f"Exiting, finished.")
@client.event
async def on_guild_join(guild):
role_names = ["|maze noob|",
"|maze novice|",
"|maze gamer|",
"|small maze progamer|",
"|medium maze progamer|",
"|big maze progamer|",
"|giant maze progamer|",
"|extreme maze progamer|",
"|ultra maze progamer|",
"|giant extreme maze progamer|",
"|giant extreme ultra maze progamer|"]
names = []
for role in guild.roles:
names.append(role.name)
do_not_do = False
for role in role_names:
print(f"Adding {role}...")
if role in names:
do_not_do = True
print(f"Exiting, role {role} exists.")
try:
if do_not_do is False:
await guild.create_role(name=role_names[9], colour=discord.Color.from_rgb(255, 255, 255))
await guild.create_role(name=role_names[8], colour=discord.Color.from_rgb(0, 255, 0))
await guild.create_role(name=role_names[7], colour=discord.Color.from_rgb(255, 255, 0))
await guild.create_role(name=role_names[6], colour=discord.Color.from_rgb(255, 0, 255))
await guild.create_role(name=role_names[5], colour=discord.Color.from_rgb(200, 209, 33))
await guild.create_role(name=role_names[4], colour=discord.Color.from_rgb(178, 186, 28))
await guild.create_role(name=role_names[3], colour=discord.Color.from_rgb(174, 219, 48))
await guild.create_role(name=role_names[2], colour=discord.Color.from_rgb(207, 118, 227))
await guild.create_role(name=role_names[1], colour=discord.Color.from_rgb(30, 179, 72))
await guild.create_role(name=role_names[0], colour=discord.Color.from_rgb(22, 97, 43))
print(f"Exiting, finished.")
except Exception as e:
await ctx.send(e)
client.run("ODAzNjY2NzA1NzgyOTMxNDU3.YBBG8g.zJGxEaFYnfOqEWtRAbC8m08hTT4")