Root commit
This commit is contained in:
commit
8fd89a3d5d
9 changed files with 1268 additions and 0 deletions
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
log.txt
|
||||
maze.zip
|
||||
PlayerBase_func.pybak
|
||||
__pycache__
|
||||
maze/__pycache__
|
||||
maze/modules/__pycache__
|
BIN
credentials.pickle
Normal file
BIN
credentials.pickle
Normal file
Binary file not shown.
713
maze/modules/PlayerBase_func.py
Normal file
713
maze/modules/PlayerBase_func.py
Normal file
|
@ -0,0 +1,713 @@
|
|||
import mysql.connector
|
||||
import os
|
||||
import re
|
||||
import curses
|
||||
import maze.modules.maze
|
||||
from .password_forget import sender
|
||||
import random
|
||||
import string
|
||||
from time import sleep
|
||||
from base64 import b64decode, b64encode
|
||||
|
||||
loggedin = False
|
||||
U = gamerid = None
|
||||
quitting = False
|
||||
|
||||
sql = con = None
|
||||
|
||||
|
||||
def get(
|
||||
query,
|
||||
): # Simplifed function to fetch records from mysql instead of typing fetchall over nd over
|
||||
con.execute(query)
|
||||
r = con.fetchall()
|
||||
return r
|
||||
|
||||
|
||||
def post(
|
||||
query,
|
||||
): # Simplifed function to commit queries to mysql instead of typing this again and again
|
||||
con.execute(query)
|
||||
try:
|
||||
sql.commit()
|
||||
except:
|
||||
print("ERROR OCCURED COMMITTING CHANGES")
|
||||
|
||||
|
||||
def databaseinit(): # Creates database if it doesn't exist
|
||||
try:
|
||||
tempsql = mysql.connector.connect(host="localhost", user="root", passwd="root")
|
||||
tempcon = tempsql.cursor()
|
||||
tempcon.execute("CREATE DATABASE IF NOT EXISTS labyrinth")
|
||||
tempsql.commit()
|
||||
|
||||
global sql, con
|
||||
sql = mysql.connector.connect(
|
||||
host="localhost", user="root", passwd="root", database="labyrinth"
|
||||
)
|
||||
con = sql.cursor()
|
||||
return True
|
||||
except (
|
||||
mysql.connector.errors.ProgrammingError,
|
||||
mysql.connector.errors.DatabaseError,
|
||||
):
|
||||
print("Invalid password/username.")
|
||||
return False
|
||||
|
||||
|
||||
def tableinit():
|
||||
try:
|
||||
post(
|
||||
"CREATE TABLE IF NOT EXISTS player_details\
|
||||
(\
|
||||
gamerid CHAR(4) PRIMARY KEY,\
|
||||
username VARCHAR(32) NOT NULL,\
|
||||
email VARCHAR(32) NOT NULL,\
|
||||
password VARCHAR(32) NOT NULL\
|
||||
) "
|
||||
)
|
||||
|
||||
post(
|
||||
"CREATE TABLE IF NOT EXISTS scores\
|
||||
(\
|
||||
gamerid CHAR(4) PRIMARY KEY,\
|
||||
highscore INT,\
|
||||
lastplayed DATE,\
|
||||
timesplayed INT\
|
||||
) "
|
||||
)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
print("ERROR: Creating Table(s)")
|
||||
|
||||
|
||||
def screenhandler(screen): # MAIN MENU
|
||||
h, w = screen.getmaxyx()
|
||||
global loggedin, U, gamerid
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
screen.addstr(1, w // 2 - 8, "ACCOUNT SETTINGS")
|
||||
if loggedin:
|
||||
screen.addstr(2, w // 2 - 8, f"Logged in as: {U}")
|
||||
screen.addstr(h // 2 - 3, w // 2 - 4, "1. Login")
|
||||
screen.addstr(h // 2 - 2, w // 2 - 8, "2. Create Account")
|
||||
screen.addstr(h // 2 - 1, w // 2 - 12, "3. Modify account details")
|
||||
screen.addstr(h // 2 - 0, w // 2 - 12, "4. View account details")
|
||||
screen.addstr(h // 2 + 1, w // 2 - 8, "5. Delete Account")
|
||||
screen.addstr(h // 2 + 2, w // 2 - 9, "6. Forgot Password?")
|
||||
screen.addstr(h // 2 + 3, w // 2 - 3, "esc. Quit")
|
||||
screen.refresh()
|
||||
while True:
|
||||
key = screen.getch()
|
||||
if key == ord("1"):
|
||||
login(screen)
|
||||
elif key == ord("2"):
|
||||
new_add(screen)
|
||||
elif key == ord("3"):
|
||||
Mod_account(screen)
|
||||
elif key == ord("4"):
|
||||
view_account(screen)
|
||||
elif key == ord("5"):
|
||||
Delete(screen)
|
||||
elif key == ord("6"):
|
||||
forgotpassword(screen)
|
||||
elif key == 27:
|
||||
maze.modules.maze.menu(screen)
|
||||
break
|
||||
screen.refresh()
|
||||
|
||||
|
||||
def screenwipe(screen, sx, sy): # Failed password and stuff reset from screen
|
||||
y, x = screen.getmaxyx()
|
||||
for i in range(sx, x):
|
||||
screen.addstr(sy, i, " ")
|
||||
for i in range(sy + 1, y - 1):
|
||||
for j in range(0, x - 1):
|
||||
if screen.instr(i, j, 1) != " ":
|
||||
screen.addstr(i, j, " ")
|
||||
screen.refresh()
|
||||
|
||||
|
||||
def Input(
|
||||
y, x, screen, ispassword=False
|
||||
): # Function to get type-able inputs, with delete, esc and other keys
|
||||
inputted = ""
|
||||
orig_y, orig_x = y, x
|
||||
while True:
|
||||
key = screen.getch()
|
||||
if key == 10:
|
||||
break
|
||||
elif key == 8:
|
||||
if x > orig_x:
|
||||
x -= 1
|
||||
screen.addstr(y, x, " ")
|
||||
inputted = inputted[: len(inputted) - 1]
|
||||
elif key == 27:
|
||||
global quitting
|
||||
quitting = True
|
||||
break
|
||||
else:
|
||||
inputted += chr(key)
|
||||
if ispassword:
|
||||
screen.addstr(y, x, "*")
|
||||
else:
|
||||
screen.addstr(y, x, chr(key))
|
||||
x += 1
|
||||
|
||||
return inputted
|
||||
|
||||
|
||||
def list_getter(field): # Feed in the field name you want, get all records of it
|
||||
index = {"username": 1, "email": 2, "password": 3}
|
||||
return_list = []
|
||||
res = get("SELECT * FROM player_details")
|
||||
for i in res:
|
||||
return_list.append(i[index[field]])
|
||||
return return_list
|
||||
|
||||
|
||||
def login(screen, calledby=False): # Function to log in
|
||||
global quitting, U, gamerid, loggedin
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
y, x = screen.getmaxyx()
|
||||
usernamelist = list_getter("username")
|
||||
screen.addstr(1, x // 2 - 3, "LOGIN")
|
||||
screen.addstr(y // 2 - 2, x // 2 - 7, "Username: ")
|
||||
while True:
|
||||
inputU = Input(y // 2 - 2, x // 2 + 3, screen)
|
||||
if quitting:
|
||||
screen.addstr("Going back to account settings...")
|
||||
sleep(3)
|
||||
quitting = False
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
screenhandler(screen)
|
||||
if inputU not in usernamelist:
|
||||
screen.addstr(
|
||||
y // 2, 0, "Username does not exist. Do you want to create one? (y/n)"
|
||||
)
|
||||
while True:
|
||||
key = screen.getch()
|
||||
if key == ord("y"):
|
||||
if calledby:
|
||||
new_add(screen, calledby=calledby)
|
||||
else:
|
||||
new_add(screen)
|
||||
return
|
||||
elif key == ord("n"):
|
||||
screenwipe(screen, x // 2 + 3, y // 2 - 2)
|
||||
break
|
||||
else:
|
||||
break
|
||||
|
||||
res = get(
|
||||
f"SELECT password,\
|
||||
gamerid\
|
||||
FROM player_details\
|
||||
WHERE username = '{inputU}' "
|
||||
)
|
||||
actualpass = (b64decode(res[0][0].encode("ascii"))).decode("ascii")
|
||||
screen.addstr(y // 2, x // 2 - 7, "Password: ")
|
||||
while True:
|
||||
inputP = Input(y // 2, x // 2 + 3, screen, ispassword=True)
|
||||
if quitting:
|
||||
screen.addstr("Going back to account settings...")
|
||||
sleep(3)
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
screenhandler(screen)
|
||||
if inputP == actualpass:
|
||||
loggedin = True
|
||||
gamerid = res[0][1]
|
||||
U = inputU
|
||||
screen.addstr(y // 2 + 2, x // 2 - 4, "Login Successful!")
|
||||
if calledby:
|
||||
screen.addstr(y // 2 + 3, x // 2 - 4, "Updating score...")
|
||||
screen.refresh()
|
||||
sleep(3)
|
||||
Update_score(calledby)
|
||||
return
|
||||
else:
|
||||
screen.addstr(y // 2 + 3, x // 2 - 4, "Returning to menu screen...")
|
||||
screen.refresh()
|
||||
sleep(3)
|
||||
screenhandler(screen)
|
||||
return
|
||||
else:
|
||||
screen.addstr(y // 2 + 2, x // 2 - 4, "Wrong password. Try again.")
|
||||
while True:
|
||||
key = screen.getch()
|
||||
if key == 10:
|
||||
screenwipe(screen, sx=x // 2 + 3, sy=y // 2)
|
||||
screen.refresh()
|
||||
break
|
||||
continue
|
||||
|
||||
|
||||
def user(
|
||||
screen, sy, sx, optionaltxt="Enter username: "
|
||||
): # Function to get new username for account creation
|
||||
if quitting:
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
return
|
||||
screen.refresh()
|
||||
userlist = list_getter("username")
|
||||
screen.addstr(sy, sx, optionaltxt)
|
||||
while True:
|
||||
Name = Input(sy, sx + len(optionaltxt), screen)
|
||||
if quitting:
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
return
|
||||
if Name in userlist:
|
||||
screen.addstr(
|
||||
sy + 1, 0, "Username already exists, please choose a different one"
|
||||
)
|
||||
while True:
|
||||
key = screen.getch()
|
||||
if key == 10:
|
||||
screenwipe(screen, sx=sx + len(optionaltxt), sy=sy)
|
||||
screen.refresh()
|
||||
break
|
||||
continue
|
||||
else:
|
||||
break
|
||||
|
||||
return Name
|
||||
|
||||
|
||||
def password(screen, sy, sx, optionaltxt="Enter Password: "):
|
||||
if quitting:
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
return
|
||||
sl, su, p = 0, 0, 0
|
||||
screen.refresh()
|
||||
while True:
|
||||
screen.addstr(sy, sx, optionaltxt)
|
||||
Password = Input(sy, sx + len(optionaltxt), screen, ispassword=True)
|
||||
if quitting:
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
return
|
||||
for i in Password:
|
||||
if i.islower():
|
||||
sl += 1
|
||||
elif i.isupper():
|
||||
su += 1
|
||||
elif i.isdigit():
|
||||
p += 1
|
||||
if sl >= 1 and su >= 1 and p >= 1 and len(Password) <= 10:
|
||||
break
|
||||
else:
|
||||
screen.addstr(sy + 1, sx + 2, "Invalid Password")
|
||||
screen.addstr(sy + 2, 5, "Password must contain uppercase, lowercase and")
|
||||
screen.addstr(sy + 3, 5, "digits and should be lesser than 10 characters")
|
||||
while True:
|
||||
key = screen.getch()
|
||||
if key == 10:
|
||||
screenwipe(screen, sx=sx + len(optionaltxt), sy=sy)
|
||||
screen.refresh()
|
||||
break
|
||||
continue
|
||||
|
||||
encoded_pass = (b64encode(Password.encode("ascii"))).decode("ascii")
|
||||
return encoded_pass
|
||||
|
||||
|
||||
def Email(screen, sy, sx, optionaltxt="Enter Email: "): # Function to accept email id
|
||||
if quitting:
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
return
|
||||
ev = re.compile(r"[a-z0-9]+@[a-z]+\.[a-z]{2,3}")
|
||||
emailist = list_getter("email")
|
||||
y, x = screen.getmaxyx()
|
||||
screen.refresh()
|
||||
while True:
|
||||
screen.addstr(sy, sx, optionaltxt)
|
||||
email = Input(sy, sx + len(optionaltxt), screen)
|
||||
if quitting:
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
return
|
||||
if email in emailist:
|
||||
screen.addstr(
|
||||
sy + 1, sx, "Given email already exists. Enter a different email."
|
||||
)
|
||||
while True:
|
||||
key = screen.getch()
|
||||
if key == 10:
|
||||
screenwipe(screen, sx=sx + len(optionaltxt), sy=sy)
|
||||
screen.refresh()
|
||||
break
|
||||
continue
|
||||
else:
|
||||
if ev.match(email):
|
||||
break
|
||||
else:
|
||||
screen.addstr(y // 2 + 1, x // 2 - 5, "Invalid Email")
|
||||
while True:
|
||||
key = screen.getch()
|
||||
if key == 10:
|
||||
screenwipe(screen, sx=x // 2 + 3, sy=y // 2)
|
||||
screen.refresh()
|
||||
break
|
||||
continue
|
||||
return email
|
||||
|
||||
|
||||
def new_add(screen, calledby=False):
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
y, x = screen.getmaxyx()
|
||||
global quitting
|
||||
screen.addstr(1, x // 2 - 8, "ACCOUNT CREATION")
|
||||
add_name = user(
|
||||
screen, y // 2 - 4, x // 2 - 10
|
||||
) # calling fn user for username, password and email
|
||||
add_password = password(screen, y // 2 - 2, x // 2 - 10)
|
||||
add_email = Email(screen, y // 2, x // 2 - 10)
|
||||
add_gamerid = "".join(
|
||||
random.choices(string.ascii_uppercase + string.digits, k=4)
|
||||
) # Generates random 4 character alphanumeric
|
||||
|
||||
if add_name == None or add_password == None or add_email == None:
|
||||
screen.refresh()
|
||||
screen.addstr(
|
||||
y // 2 + 2, 0, "Cancelling account creation. Returning to account menu..."
|
||||
)
|
||||
sleep(3)
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
quitting = False
|
||||
screenhandler(screen)
|
||||
else:
|
||||
post(
|
||||
f"INSERT INTO player_details\
|
||||
(gamerid,\
|
||||
username,\
|
||||
email,\
|
||||
password)\
|
||||
VALUES ('{add_gamerid}',\
|
||||
'{add_name}',\
|
||||
'{add_email}',\
|
||||
'{add_password}')"
|
||||
)
|
||||
screen.refresh()
|
||||
if calledby:
|
||||
screen.addstr(
|
||||
y // 2 + 2, 0, "Account has been created. Returning to login..."
|
||||
)
|
||||
screen.refresh()
|
||||
sleep(3)
|
||||
login(screen, calledby=calledby)
|
||||
else:
|
||||
screen.addstr(
|
||||
y // 2 + 2, 0, "Account has been created. Returning to account menu..."
|
||||
)
|
||||
screen.refresh()
|
||||
sleep(3)
|
||||
screenhandler(screen)
|
||||
|
||||
|
||||
def Mod_account(screen):
|
||||
Userlist = list_getter("username")
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
y, x = screen.getmaxyx()
|
||||
global loggedin, quitting
|
||||
screen.addstr(1, x // 2 - 8, "MODIFY ACCOUNT SETTINGS")
|
||||
if loggedin == False:
|
||||
screen.addstr(
|
||||
y // 2,
|
||||
0,
|
||||
"Please log in to you account... Redirecting you to the login menu",
|
||||
)
|
||||
screen.refresh()
|
||||
sleep(3)
|
||||
login(screen)
|
||||
return
|
||||
screen.addstr(3, x // 2 - 8, "What do you want to modify?")
|
||||
screen.addstr(y // 2 - 3, x // 2 - 4, "1. Username")
|
||||
screen.addstr(y // 2 - 1, x // 2 - 4, "2. Email")
|
||||
screen.addstr(y // 2 + 1, x // 2 - 4, "esc. Quit")
|
||||
|
||||
while True:
|
||||
key = screen.getch()
|
||||
if key == 27:
|
||||
break
|
||||
|
||||
elif key == ord("1"):
|
||||
screenwipe(screen, 0, 2)
|
||||
screen.refresh()
|
||||
newuser = user(
|
||||
screen,
|
||||
y // 2,
|
||||
x // 2 - 10,
|
||||
optionaltxt="Enter new username: ",
|
||||
)
|
||||
post(
|
||||
f"UPDATE player_details\
|
||||
SET username = '{newuser}'\
|
||||
WHERE gamerid = '{gamerid}' "
|
||||
)
|
||||
|
||||
elif key == ord("2"):
|
||||
screenwipe(screen, 0, 2)
|
||||
screen.refresh()
|
||||
newemail = Email(
|
||||
screen, y // 2, x // 2 - 10, optionaltxt="Enter new email: "
|
||||
)
|
||||
post(
|
||||
f"UPDATE player_details\
|
||||
SET email = '{newemail}'\
|
||||
WHERE gamerid = '{gamerid}' "
|
||||
)
|
||||
|
||||
screenwipe(screen, 0, 2)
|
||||
screen.refresh()
|
||||
screen.addstr(
|
||||
y // 2, 5, "Details successfully updated. Returning to account menu..."
|
||||
)
|
||||
screen.refresh()
|
||||
sleep(3)
|
||||
screenhandler(screen)
|
||||
|
||||
|
||||
def view_account(screen):
|
||||
global loggedin, U, gamerid
|
||||
y, x = screen.getmaxyx()
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
screen.addstr(1, x // 2 - 6, "VIEW ACCOUNT DETAILS")
|
||||
if not loggedin:
|
||||
screen.addstr(
|
||||
y // 2,
|
||||
0,
|
||||
"Please log in to you account... Redirecting you to the login menu",
|
||||
)
|
||||
screen.refresh()
|
||||
sleep(3)
|
||||
login(screen)
|
||||
return
|
||||
player_details = get(
|
||||
f"SELECT *\
|
||||
FROM player_details\
|
||||
WHERE gamerid = '{gamerid}' "
|
||||
)
|
||||
score_details = get(f"SELECT * FROM scores WHERE gamerid = '{gamerid}'")
|
||||
screen.addstr(y // 2 - 4, x // 2 - 5, "Gamer ID: " + player_details[0][0])
|
||||
screen.addstr(y // 2 - 2, x // 2 - 5, "Username: " + player_details[0][1])
|
||||
screen.addstr(y // 2, x // 2 - 5, "Email: " + player_details[0][2])
|
||||
if not score_details:
|
||||
score_details.append(("Bruh",) + ("Not yet available.",) * 3)
|
||||
screen.addstr(y // 2 + 2, x // 2 - 5, "High Score: " + str(score_details[0][1]))
|
||||
screen.addstr(y // 2 + 4, x // 2 - 5, "Last Played: " + str(score_details[0][2]))
|
||||
screen.addstr(y // 2 + 6, x // 2 - 5, "Times Played: " + str(score_details[0][3]))
|
||||
|
||||
screen.addstr(y - 1, 0, "Press esc to return to main menu.")
|
||||
while True:
|
||||
key = screen.getch()
|
||||
if key == 27:
|
||||
break
|
||||
screen.refresh()
|
||||
screenhandler(screen)
|
||||
return
|
||||
|
||||
|
||||
def Delete(screen):
|
||||
y, x = screen.getmaxyx()
|
||||
global loggedin, gamerid, U
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
if loggedin == False:
|
||||
screen.addstr(
|
||||
y // 2,
|
||||
0,
|
||||
"Please log in to you account... Redirecting you to the login menu",
|
||||
)
|
||||
screen.refresh()
|
||||
sleep(3)
|
||||
login(screen)
|
||||
return
|
||||
post(
|
||||
f"DELETE FROM player_details\
|
||||
WHERE gamerid = '{gamerid}'"
|
||||
)
|
||||
loggedin = False
|
||||
gamerid = U = None
|
||||
|
||||
|
||||
def Update_score(Score):
|
||||
global U, gamerid, loggedin
|
||||
if not loggedin:
|
||||
return "guest"
|
||||
res = get(f"SELECT * FROM scores WHERE gamerid = '{gamerid}'")
|
||||
if not res:
|
||||
post(f"INSERT INTO scores (gamerid, timesplayed) VALUES ('{gamerid}', 0)")
|
||||
# implement to ask whether to update
|
||||
post(
|
||||
f"UPDATE scores\
|
||||
SET highscore = '{Score}'\
|
||||
WHERE gamerid = '{gamerid}'"
|
||||
)
|
||||
Update_lp_tp()
|
||||
|
||||
|
||||
def Update_lp_tp():
|
||||
global U, gamerid, loggedin
|
||||
if not loggedin:
|
||||
return "guest"
|
||||
post(
|
||||
f"UPDATE scores\
|
||||
SET lastplayed = Now(),\
|
||||
timesplayed = timesplayed + 1\
|
||||
WHERE gamerid = '{gamerid}'"
|
||||
)
|
||||
|
||||
|
||||
def forgotpassword(screen):
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
y, x = screen.getmaxyx()
|
||||
screen.addstr(1, x // 2 - 7, "FORGOT PASSWORD")
|
||||
screen.refresh()
|
||||
global quitting
|
||||
usernamelist = list_getter("username")
|
||||
tries = 0
|
||||
screen.addstr(y // 2 - 2, x // 2 - 7, "Username: ")
|
||||
while True:
|
||||
input_u = Input(y // 2 - 2, x // 2 + 3, screen)
|
||||
if quitting:
|
||||
screen.addstr("Going back to account settings...")
|
||||
sleep(3)
|
||||
quitting = False
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
screenhandler(screen)
|
||||
return
|
||||
|
||||
if input_u not in usernamelist:
|
||||
screen.addstr(
|
||||
y // 2 - 1, 0, "Username does not exist. Press Enter/Space to continue..."
|
||||
)
|
||||
while True:
|
||||
key = screen.getch()
|
||||
if key == ord(" ") or key == 10:
|
||||
screenwipe(screen, sy = y // 2 - 2, sx = x // 2 + 3)
|
||||
screen.refresh()
|
||||
break
|
||||
else:
|
||||
break
|
||||
|
||||
res = get(f"SELECT email FROM player_details\
|
||||
WHERE username = '{input_u}'")
|
||||
email = res[0][0]
|
||||
otp = sender(input_u, email)
|
||||
screen.addstr(y // 2 + 1, 0, "Enter OTP recieved in registered mail address:")
|
||||
while True:
|
||||
screen.refresh()
|
||||
enter_otp = Input(y // 2 + 1, 47, screen)
|
||||
if quitting:
|
||||
screen.addstr("Going back to account settings...")
|
||||
sleep(3)
|
||||
quitting = False
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
screenhandler(screen)
|
||||
return
|
||||
if str(otp) == enter_otp:
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
screen.addstr(1, x // 2 - 7, "FORGOT PASSWORD")
|
||||
while True:
|
||||
enter_pass = password(screen, y // 2 - 2, x // 2 - 7, optionaltxt="Enter new password: ")
|
||||
confirm_pass = password(screen, y // 2 + 1, x // 2 - 7, optionaltxt="Confirm password: ")
|
||||
if enter_pass == confirm_pass:
|
||||
break
|
||||
else:
|
||||
screen.addstr(y // 2 + 3, 0, "Passwords do not match. Press Enter to try again.")
|
||||
while True:
|
||||
key = screen.getch()
|
||||
if key == 10:
|
||||
screenwipe(screen, sy= y // 2 - 2, sx = x // 2 - 7)
|
||||
break
|
||||
else:
|
||||
if tries < 10:
|
||||
screen.addstr(y // 2 + 3, 0, "Entered OTP is wrong. Press esc to exit or Enter to try again.")
|
||||
while True:
|
||||
key = screen.getch()
|
||||
if key == 10:
|
||||
screenwipe(screen, sy=y // 2 + 1, sx=47)
|
||||
tries += 1
|
||||
screen.refresh()
|
||||
break
|
||||
elif key == 27:
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
screenhandler(screen)
|
||||
return
|
||||
continue
|
||||
|
||||
else:
|
||||
screen.addstr(y // 2 + 3, 0, "Entered OTP is wrong. Maximum tries exceeded. Returning to account menu...")
|
||||
sleep(5)
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
screenhandler(screen)
|
||||
return
|
||||
break
|
||||
|
||||
post(f"UPDATE player_details\
|
||||
SET password = '{enter_pass}'\
|
||||
WHERE username = '{input_u}'")
|
||||
screen.addstr(y // 2 + 3, x // 2 - 10, "Password has been changed successfully.")
|
||||
screen.addstr(y // 2 + 4, x // 2 - 8, "Returning to account menu...")
|
||||
sleep(3)
|
||||
screenhandler(screen)
|
||||
return
|
||||
|
||||
|
||||
|
||||
def leaderboard(screen):
|
||||
y, x = screen.getmaxyx()
|
||||
screen.clear()
|
||||
screen.addstr(1, y // 2 - 5, "Leaderboard")
|
||||
screen.refresh()
|
||||
res = get(
|
||||
"SELECT p.gamerid,\
|
||||
p.username,\
|
||||
s.highscore,\
|
||||
s.lastplayed\
|
||||
FROM player_details p,\
|
||||
scores s\
|
||||
WHERE p.gamerid = s.gamerid "
|
||||
)
|
||||
|
||||
for i in range(len(res) - 1):
|
||||
for j in range(len(res) - 1 - i):
|
||||
if res[j][2] < res[j + 1][2]:
|
||||
res[j], res[j + 1] = res[j + 1], res[j]
|
||||
|
||||
screen.addstr(3, 13, "GamerID")
|
||||
screen.addstr(3, 30, "Username")
|
||||
screen.addstr(3, 50, "High Score")
|
||||
screen.addstr(3, 70, "Last Played")
|
||||
sy = 5
|
||||
for i in res:
|
||||
screen.addstr(sy, 13, str(i[0]))
|
||||
screen.addstr(sy, 30, str(i[1]))
|
||||
screen.addstr(sy, 50, str(i[2]))
|
||||
screen.addstr(sy, 70, str(i[3]))
|
||||
sy += 1
|
||||
screen.addstr(y - 1, 0, "Press esc to return to main menu.")
|
||||
while True:
|
||||
key = screen.getch()
|
||||
if key == 27:
|
||||
break
|
||||
screen.refresh()
|
||||
maze.modules.maze.menu(screen)
|
||||
return
|
5
maze/modules/__init__.py
Normal file
5
maze/modules/__init__.py
Normal file
|
@ -0,0 +1,5 @@
|
|||
from maze.modules.maze import main
|
||||
import curses
|
||||
|
||||
def bruh():
|
||||
curses.wrapper(main)
|
1
maze/modules/__main__.py
Normal file
1
maze/modules/__main__.py
Normal file
|
@ -0,0 +1 @@
|
|||
#bruh
|
489
maze/modules/maze.py
Normal file
489
maze/modules/maze.py
Normal file
|
@ -0,0 +1,489 @@
|
|||
import curses
|
||||
import time
|
||||
from math import exp, pi, cos, fabs
|
||||
import random
|
||||
from collections import defaultdict
|
||||
from itertools import tee
|
||||
import maze.modules.PlayerBase_func as database
|
||||
|
||||
WON = 0
|
||||
CONNECTED = {"N": 1, "S": 2, "E": 4, "W": 8}
|
||||
DIRECTIONS = {"N": (-1, 0), "S": (1, 0), "E": (0, 1), "W": (0, -1)}
|
||||
ANTIPODES = {"N": "S", "S": "N", "W": "E", "E": "W"}
|
||||
WALL = {
|
||||
12: "═",
|
||||
3: "║",
|
||||
10: "╗",
|
||||
5: "╚",
|
||||
9: "╝",
|
||||
6: "╔",
|
||||
7: "╠",
|
||||
11: "╣",
|
||||
14: "╦",
|
||||
13: "╩",
|
||||
15: "╬",
|
||||
0: " ",
|
||||
4: "═",
|
||||
8: "═",
|
||||
1: "║",
|
||||
2: "║",
|
||||
}
|
||||
VISITED = 16
|
||||
|
||||
|
||||
class Maze:
|
||||
def __init__(self, height, width, start=(0, 0)):
|
||||
self.height = height
|
||||
self.width = width
|
||||
self.stack = []
|
||||
self.cells = {(y, x): 0 for y in range(height) for x in range(width)}
|
||||
self.build(start)
|
||||
|
||||
def eligible_neighbours(self, y, x):
|
||||
return [
|
||||
((y + i, x + j), d)
|
||||
for d, (i, j) in DIRECTIONS.items()
|
||||
if (y + i, x + j) in self.cells.keys()
|
||||
and not self.cells[(y + i, x + j)] & VISITED
|
||||
]
|
||||
|
||||
def connected_cells(self, y, x):
|
||||
cell_directions = [d for (d, v) in CONNECTED.items() if v & self.cells[(y, x)]]
|
||||
return {
|
||||
(y + i, x + j): d
|
||||
for d, (i, j) in DIRECTIONS.items()
|
||||
if d in cell_directions
|
||||
}
|
||||
|
||||
def build(self, start):
|
||||
current_cell = start
|
||||
while [c for c in self.cells.values() if not c & VISITED]:
|
||||
self.cells[current_cell] |= VISITED
|
||||
eligible_neighbours = self.eligible_neighbours(*current_cell)
|
||||
if not eligible_neighbours:
|
||||
next_cell = self.stack.pop()
|
||||
else:
|
||||
self.stack.append(current_cell)
|
||||
next_cell, direction = random.choice(eligible_neighbours)
|
||||
self.cells[current_cell] |= CONNECTED[direction]
|
||||
self.cells[next_cell] |= CONNECTED[ANTIPODES[direction]]
|
||||
current_cell = next_cell
|
||||
|
||||
def track(self, start=(0, 0)):
|
||||
yield start
|
||||
current_cell = start
|
||||
self.stack = []
|
||||
for coord in self.cells.keys():
|
||||
self.cells[coord] &= ~VISITED
|
||||
while [c for c in self.cells.values() if not c & VISITED]:
|
||||
self.cells[current_cell] |= VISITED
|
||||
eligible_neighbours = [
|
||||
(c, d)
|
||||
for (c, d) in self.connected_cells(*current_cell).items()
|
||||
if not self.cells[c] & VISITED
|
||||
]
|
||||
if not eligible_neighbours:
|
||||
next_cell = self.stack.pop()
|
||||
else:
|
||||
self.stack.append(current_cell)
|
||||
next_cell, direction = random.choice(eligible_neighbours)
|
||||
yield next_cell
|
||||
current_cell = next_cell
|
||||
|
||||
def __repr__(self):
|
||||
log = open("log.txt", "w")
|
||||
log.write(
|
||||
str(self.cells)
|
||||
+ "\n"
|
||||
+ str(self.stack)
|
||||
+ "\n\n\n\n\n"
|
||||
+ "Height: "
|
||||
+ str(self.height)
|
||||
+ "Width: "
|
||||
+ str(self.width)
|
||||
+ "\n\n\n\n\n\n"
|
||||
)
|
||||
buffer = [
|
||||
[0 for _ in range(2 * self.width + 1)] for _ in range(2 * self.height + 1)
|
||||
]
|
||||
for row in range(self.height): # 0 -> 3
|
||||
for col in range(self.width): # 0 -> 21
|
||||
if row != 0:
|
||||
buffer[2 * row][2 * col + 1] = (
|
||||
~self.cells[row, col] & CONNECTED["N"]
|
||||
) << 3
|
||||
if col != 0:
|
||||
buffer[2 * row + 1][2 * col] = (
|
||||
~self.cells[row, col] & CONNECTED["W"]
|
||||
) >> 3
|
||||
if (row and col) != 0:
|
||||
buffer[2 * row][2 * col] = (
|
||||
buffer[2 * row][2 * col - 1]
|
||||
| (buffer[2 * row][2 * col + 1] >> 1)
|
||||
| buffer[2 * row - 1][2 * col]
|
||||
| (buffer[2 * row + 1][2 * col] << 1)
|
||||
)
|
||||
|
||||
log.write("FIRST ITERATION GIVES: " + str(buffer) + "\n\n\n\n\n")
|
||||
|
||||
for row in range(1, 2 * self.height):
|
||||
buffer[row][0] = CONNECTED["N"] | CONNECTED["S"] | (buffer[row][1] >> 1)
|
||||
buffer[row][2 * self.width] = (
|
||||
CONNECTED["N"] | CONNECTED["S"] | buffer[row][2 * self.width - 1]
|
||||
)
|
||||
for col in range(1, 2 * self.width):
|
||||
buffer[0][col] = CONNECTED["E"] | CONNECTED["W"] | (buffer[1][col] << 1)
|
||||
buffer[2 * self.height][col] = (
|
||||
CONNECTED["E"] | CONNECTED["W"] | buffer[2 * self.height - 1][col]
|
||||
)
|
||||
buffer[0][0] = CONNECTED["S"] | CONNECTED["E"]
|
||||
buffer[0][2 * self.width] = CONNECTED["S"] | CONNECTED["W"]
|
||||
buffer[2 * self.height][0] = CONNECTED["N"] | CONNECTED["E"]
|
||||
buffer[2 * self.height][2 * self.width] = CONNECTED["N"] | CONNECTED["W"]
|
||||
finalstr = "\n".join(["".join(WALL[cell] for cell in row) for row in buffer])
|
||||
# log.write("\n\n"+str(finalstr))
|
||||
log.write(str(buffer))
|
||||
log.close()
|
||||
return finalstr
|
||||
|
||||
|
||||
def path(maze, start, finish):
|
||||
heuristic = lambda node: abs(node[0] - finish[0]) + abs(node[1] - finish[1])
|
||||
nodes_to_explore = [start]
|
||||
explored_nodes = set()
|
||||
parent = {}
|
||||
global_score = defaultdict(lambda: float("inf"))
|
||||
global_score[start] = 0
|
||||
local_score = defaultdict(lambda: float("inf"))
|
||||
local_score[start] = heuristic(start)
|
||||
|
||||
def retrace_path(current):
|
||||
total_path = [current]
|
||||
while current in parent.keys():
|
||||
current = parent[current]
|
||||
total_path.append(current)
|
||||
return reversed(total_path)
|
||||
|
||||
while nodes_to_explore:
|
||||
nodes_to_explore.sort(key=lambda n: local_score[n])
|
||||
current = nodes_to_explore.pop()
|
||||
if current == finish:
|
||||
return retrace_path(current)
|
||||
explored_nodes.add(current)
|
||||
for neighbour in maze.connected_cells(*current).keys():
|
||||
tentative_global_score = global_score[current] + 1
|
||||
if tentative_global_score < global_score[neighbour]:
|
||||
parent[neighbour] = current
|
||||
global_score[neighbour] = tentative_global_score
|
||||
local_score[neighbour] = global_score[neighbour] + heuristic(neighbour)
|
||||
if neighbour not in explored_nodes:
|
||||
nodes_to_explore.append(neighbour)
|
||||
|
||||
|
||||
def draw_path(path, screen, delay=0.15, head=None, trail=None, skip_first=True):
|
||||
if not head:
|
||||
head = ("█", curses.color_pair(1))
|
||||
if not trail:
|
||||
trail = ("█", curses.color_pair(1))
|
||||
current_cell = next(path)
|
||||
old_cell = current_cell
|
||||
for idx, next_cell in enumerate(path):
|
||||
first = (not idx) and skip_first
|
||||
if screen.getch() == ord("q"):
|
||||
break
|
||||
screen.refresh()
|
||||
for last, cell in enumerate(
|
||||
[
|
||||
(
|
||||
current_cell[0] + t * (next_cell[0] - current_cell[0]),
|
||||
current_cell[1] + t * (next_cell[1] - current_cell[1]),
|
||||
)
|
||||
for t in [0, 1 / 2]
|
||||
]
|
||||
):
|
||||
time.sleep(delay)
|
||||
if not first:
|
||||
screen.addstr(*coords(cell), *head)
|
||||
if last:
|
||||
if not first:
|
||||
screen.addstr(*coords(current_cell), *trail)
|
||||
old_cell = cell
|
||||
elif not first:
|
||||
screen.addstr(*coords(old_cell), *trail)
|
||||
screen.refresh()
|
||||
current_cell = next_cell
|
||||
|
||||
|
||||
def coords(node):
|
||||
return (int(2 * node[0]) + 1, int(2 * node[1]) + 1)
|
||||
|
||||
|
||||
def construction_demo(maze, screen):
|
||||
head = (".", curses.color_pair(2))
|
||||
trail = (".", curses.color_pair(1))
|
||||
draw_path(
|
||||
maze.track(), screen, delay=0.01, head=head, trail=trail, skip_first=False
|
||||
)
|
||||
screen.nodelay(False)
|
||||
screen.getch()
|
||||
|
||||
|
||||
def pathfinding_demo(maze, screen):
|
||||
start = []
|
||||
finish = []
|
||||
solution = None
|
||||
old_solution = None
|
||||
""" def reset(start_or_finish, cell, colour):
|
||||
nonlocal solution, old_solution
|
||||
if start_or_finish:
|
||||
screen.addstr(*coords(start_or_finish.pop()), " ")
|
||||
screen.addstr(*coords(cell), "█", colour)
|
||||
screen.refresh()
|
||||
if old_solution:
|
||||
draw_path(old_solution, screen, head=" ", trail=" ")
|
||||
start_or_finish.append(cell)
|
||||
if start and finish:
|
||||
solution, old_solution = tee(path(maze, start[0], finish[0]))
|
||||
draw_path(solution, screen) """
|
||||
maxy, maxx = screen.getmaxyx()
|
||||
current_coords = [maxy - 5, maxx - 5]
|
||||
screen.addstr(current_coords[0], current_coords[1], "█", curses.color_pair(2))
|
||||
WALL = ["═", "║", "╗", "╚", "╝", "╔", "╠", "╣", "╦", "╩", "╬", "═", "═", "║", "║"]
|
||||
while True:
|
||||
key = screen.getch()
|
||||
# print("Max=",maxy, maxx, "Current=", current_coords[0], current_coords[1])
|
||||
if key == ord("q"):
|
||||
break
|
||||
elif current_coords[0] == maxy - 3 and current_coords[1] == maxx - 3:
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
screen.addstr(
|
||||
0,
|
||||
0,
|
||||
"""
|
||||
|
||||
██ ██ ██████ ██ ██ ██ ██ ██████ ███ ██ ██
|
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██
|
||||
████ ██ ██ ██ ██ ██ █ ██ ██ ██ ██ ██ ██ ██
|
||||
██ ██ ██ ██ ██ ██ ███ ██ ██ ██ ██ ██ ██
|
||||
██ ██████ ██████ ███ ███ ██████ ██ ████ ██
|
||||
|
||||
|
||||
|
||||
""",
|
||||
)
|
||||
screen.refresh()
|
||||
global WON
|
||||
WON = WON + 1
|
||||
time.sleep(3)
|
||||
break
|
||||
# Dota stuff not to be used now
|
||||
# elif key == curses.KEY_MOUSE:
|
||||
# _, x, y, _, state = curses.getmouse()
|
||||
# cell = (int(y / 2), int(x / 2))
|
||||
# if state & curses.BUTTON3_PRESSED:
|
||||
# reset(finish, cell, curses.color_pair(2))
|
||||
# elif state & curses.BUTTON1_PRESSED:
|
||||
# reset(start, cell, curses.color_pair(3))
|
||||
|
||||
elif key == curses.KEY_UP:
|
||||
if (
|
||||
screen.instr(current_coords[0] - 1, current_coords[1], 1).decode(
|
||||
"utf-8"
|
||||
)
|
||||
== "█"
|
||||
):
|
||||
screen.addstr(current_coords[0], current_coords[1], " ")
|
||||
screen.refresh()
|
||||
current_coords = [current_coords[0] - 1, current_coords[1]]
|
||||
elif (
|
||||
screen.instr(current_coords[0] - 1, current_coords[1], 1).decode(
|
||||
"utf-8"
|
||||
)
|
||||
not in WALL
|
||||
):
|
||||
# if current_coords[0]-1 != 0:
|
||||
current_coords = [current_coords[0] - 1, current_coords[1]]
|
||||
screen.addstr(
|
||||
current_coords[0], current_coords[1], "█", curses.color_pair(2)
|
||||
)
|
||||
# else:
|
||||
# print(screen.instr(current_coords[0]-1,current_coords[1],1).decode("utf-8"), "UP PRESS")
|
||||
elif key == curses.KEY_DOWN:
|
||||
if (
|
||||
screen.instr(current_coords[0] + 1, current_coords[1], 1).decode(
|
||||
"utf-8"
|
||||
)
|
||||
== "█"
|
||||
):
|
||||
screen.addstr(current_coords[0], current_coords[1], " ")
|
||||
screen.refresh()
|
||||
current_coords = [current_coords[0] + 1, current_coords[1]]
|
||||
elif (
|
||||
screen.instr(current_coords[0] + 1, current_coords[1], 1).decode(
|
||||
"utf-8"
|
||||
)
|
||||
not in WALL
|
||||
):
|
||||
current_coords = [current_coords[0] + 1, current_coords[1]]
|
||||
screen.addstr(
|
||||
current_coords[0], current_coords[1], "█", curses.color_pair(2)
|
||||
)
|
||||
# else:
|
||||
# print(screen.instr(current_coords[0]+1,current_coords[1],1).decode("utf-8"), "DOWN PRESS")
|
||||
elif key == curses.KEY_LEFT:
|
||||
if (
|
||||
screen.instr(current_coords[0], current_coords[1] - 1, 1).decode(
|
||||
"utf-8"
|
||||
)
|
||||
== "█"
|
||||
):
|
||||
screen.addstr(current_coords[0], current_coords[1], " ")
|
||||
screen.refresh()
|
||||
current_coords = [current_coords[0], current_coords[1] - 1]
|
||||
elif (
|
||||
screen.instr(current_coords[0], current_coords[1] - 1, 1).decode(
|
||||
"utf-8"
|
||||
)
|
||||
not in WALL
|
||||
):
|
||||
current_coords = [current_coords[0], current_coords[1] - 1]
|
||||
screen.addstr(
|
||||
current_coords[0], current_coords[1], "█", curses.color_pair(2)
|
||||
)
|
||||
# else:
|
||||
# print(screen.instr(current_coords[0],current_coords[1]-1,1).decode("utf-8"), "SIDE PRESS")
|
||||
elif key == curses.KEY_RIGHT:
|
||||
if (
|
||||
screen.instr(current_coords[0], current_coords[1] + 1, 1).decode(
|
||||
"utf-8"
|
||||
)
|
||||
== "█"
|
||||
):
|
||||
screen.addstr(current_coords[0], current_coords[1], " ")
|
||||
screen.refresh()
|
||||
current_coords = [current_coords[0], current_coords[1] + 1]
|
||||
elif (
|
||||
screen.instr(current_coords[0], current_coords[1] + 1, 1).decode(
|
||||
"utf-8"
|
||||
)
|
||||
not in WALL
|
||||
):
|
||||
current_coords = [current_coords[0], current_coords[1] + 1]
|
||||
screen.addstr(
|
||||
current_coords[0], current_coords[1], "█", curses.color_pair(2)
|
||||
)
|
||||
# else:
|
||||
# print(screen.instr(current_coords[0],current_coords[1]+1,1).decode("utf-8"), "RSIDE PRESS")
|
||||
|
||||
|
||||
def menu(screen):
|
||||
y, x = screen.getmaxyx()
|
||||
screen.clear()
|
||||
text = """
|
||||
|
||||
██ █████ ██████ ██ ██ ██████ ██ ███ ██ ████████ ██ ██
|
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██
|
||||
██ ███████ ██████ ████ ██████ ██ ██ ██ ██ ██ ███████
|
||||
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
|
||||
███████ ██ ██ ██████ ██ ██ ██ ██ ██ ████ ██ ██ ██
|
||||
|
||||
"""
|
||||
screen.addstr(1, 3, str(text))
|
||||
screen.refresh()
|
||||
screen.addstr(5, x // 2 - 2, "MENU")
|
||||
screen.addstr(10, 0, "space - Play")
|
||||
screen.addstr(11, 0, "a - Account Settings")
|
||||
screen.addstr(12, 0, "l - Leaderboard")
|
||||
screen.addstr(13, 0, "esc - Quit")
|
||||
while True:
|
||||
key = screen.getch()
|
||||
if key == ord(" "):
|
||||
play(screen)
|
||||
elif key == 27:
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
break
|
||||
elif key == ord("a"):
|
||||
database.screenhandler(screen)
|
||||
elif key == ord("l"):
|
||||
database.leaderboard(screen)
|
||||
|
||||
|
||||
def play(screen):
|
||||
came_out = 0
|
||||
start_ts = 0
|
||||
end_ts = 0
|
||||
height, width = screen.getmaxyx()
|
||||
height, width = int((height - 2) / 2), int((width - 2) / 2)
|
||||
screen.clear()
|
||||
maze = Maze(height, width)
|
||||
screen.addstr(0, 0, str(maze))
|
||||
screen.refresh()
|
||||
start_ts = time.time()
|
||||
pathfinding_demo(maze, screen)
|
||||
end_ts = time.time()
|
||||
came_out = 1
|
||||
while True:
|
||||
key = screen.getch()
|
||||
if key == ord("q"):
|
||||
break
|
||||
|
||||
if came_out != 0:
|
||||
screen.clear()
|
||||
screen.refresh()
|
||||
global WON
|
||||
if WON != 0:
|
||||
tt = (start_ts - end_ts) / 300
|
||||
score = fabs(cos(tt * pi))
|
||||
score *= 90237
|
||||
WON = 0
|
||||
else:
|
||||
score = 0
|
||||
screen.addstr(
|
||||
height - 3, width - 4, str("Your score is: " + str(int(score)))
|
||||
)
|
||||
res = database.Update_score(int(score))
|
||||
if res == "guest":
|
||||
screen.addstr(
|
||||
height - 1,
|
||||
5,
|
||||
"You are not signed in. You will lose your score if you proceed.",
|
||||
)
|
||||
screen.addstr(
|
||||
height, 5, "Do you want to login and save your progress? (y/n)"
|
||||
)
|
||||
while True:
|
||||
key = screen.getch()
|
||||
if key == ord("y"):
|
||||
database.login(screen, calledby=int(score))
|
||||
break
|
||||
elif key == ord("n"):
|
||||
break
|
||||
screen.refresh()
|
||||
time.sleep(3)
|
||||
screen.clear()
|
||||
menu(screen)
|
||||
came_out = 0
|
||||
|
||||
|
||||
def main(screen):
|
||||
curses.curs_set(False)
|
||||
curses.mousemask(curses.ALL_MOUSE_EVENTS)
|
||||
screen.nodelay(True)
|
||||
curses.init_pair(1, curses.COLOR_BLUE, curses.COLOR_BLACK)
|
||||
curses.init_pair(2, curses.COLOR_GREEN, curses.COLOR_BLACK)
|
||||
curses.init_pair(3, curses.COLOR_RED, curses.COLOR_BLACK)
|
||||
screen.clear()
|
||||
height, width = screen.getmaxyx()
|
||||
height, width = int((height - 2) / 2), int((width - 2) / 2)
|
||||
database.databaseinit()
|
||||
database.tableinit()
|
||||
maze = Maze(height, width)
|
||||
screen.addstr(0, 0, str(maze))
|
||||
screen.refresh()
|
||||
construction_demo(maze, screen)
|
||||
screen.clear()
|
||||
screen.refresh() # 70x 15y
|
||||
menu(screen)
|
||||
exit()
|
50
maze/modules/password_forget.py
Normal file
50
maze/modules/password_forget.py
Normal file
|
@ -0,0 +1,50 @@
|
|||
import smtplib
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
from email.mime.text import MIMEText
|
||||
import pickle
|
||||
from random import choice
|
||||
|
||||
|
||||
def sender(userid, receiver_address):
|
||||
try:
|
||||
with open("credentials.pickle", "rb") as f:
|
||||
d = pickle.load(f)
|
||||
sender_address = d["email"]
|
||||
sender_pass = d["pass"]
|
||||
except FileNotFoundError:
|
||||
print("Credentials for email missing. Terminating...")
|
||||
exit()
|
||||
# Random 6 digit number but looks cool
|
||||
l = [i for i in range(0, 10)]
|
||||
s = ""
|
||||
for _ in range(6):
|
||||
s += str(choice(l))
|
||||
otp = int(s)
|
||||
|
||||
mail_content = f"""Hello {userid}, </br>
|
||||
This is an automatically generated email.</br>\
|
||||
The password for resetting your password in the Labyrinth CSC Project is: </br>\
|
||||
<h3><b>{otp}</b></h3></br>\
|
||||
<p>
|
||||
Do not share this OTP with anyone. If you have not requested for a password reset, please ignore.</p>\
|
||||
<p></p>\
|
||||
<p>Yours,</br>\
|
||||
The Labyrinth Team"""
|
||||
# The mail addresses and password
|
||||
# Setup the MIME
|
||||
message = MIMEMultipart()
|
||||
message["From"] = sender_address
|
||||
message["To"] = receiver_address
|
||||
message[
|
||||
"Subject"
|
||||
] = "Reset your Labyrinth account password"
|
||||
message.attach(MIMEText(mail_content, "html"))
|
||||
|
||||
# Create SMTP session for sending the mail
|
||||
session = smtplib.SMTP("smtp.gmail.com", 587) # use gmail with port
|
||||
session.starttls() # enable security
|
||||
session.login(sender_address, sender_pass) # login with mail_id and password
|
||||
text = message.as_string()
|
||||
session.sendmail(sender_address, receiver_address, text)
|
||||
session.quit()
|
||||
return otp
|
1
requirements.txt
Normal file
1
requirements.txt
Normal file
|
@ -0,0 +1 @@
|
|||
windows-curses
|
3
starter.py
Normal file
3
starter.py
Normal file
|
@ -0,0 +1,3 @@
|
|||
from maze.modules import bruh
|
||||
|
||||
bruh()
|
Loading…
Reference in a new issue