2023-11-07 12:48:08 +01:00

214 lines
6.6 KiB
Python

import os
from classes.User import User
from classes.Transaction import Tx
from helpers import BlockHelper as blockHelper
from helpers import TaskHelper as taskHelper
from helpers import UtilityHelper as utilityHelper
class bcolors:
HEADER = '\033[95m'
OKBLUE = '\033[94m'
OKCYAN = '\033[96m'
OKGREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
class MenuHelper:
def __init__(self, db):
self.db = db
self.user = None
self.start_menu = {}
self.user_main_menu = {}
self.user_blockchain_menu = {}
self.user_settings_menu = {}
self.start_menu[0] = "Exit"
self.start_menu[1] = "Explore the Blockchain"
self.start_menu[2] = "Login"
self.start_menu[3] = "Sign up"
self.user_main_menu[0] = "Exit"
self.user_main_menu[1] = "User Settings"
self.user_main_menu[2] = "Blockchain"
self.user_main_menu[3] = "Log out"
self.user_blockchain_menu[0] = "Back"
self.user_blockchain_menu[1] = "Explore the Blockchain"
self.user_blockchain_menu[2] = "Transfer coins"
self.user_blockchain_menu[3] = "Cancel transaction"
self.user_blockchain_menu[4] = "Check balance"
self.user_blockchain_menu[5] = "Check the pool"
self.user_blockchain_menu[6] = "Mine a block"
self.user_settings_menu[0] = "Back"
self.user_settings_menu[1] = "View account info"
self.user_settings_menu[2] = "Change username"
self.user_settings_menu[3] = "Change password"
self.user_settings_menu[4] = "DELETE ACCOUNT"
self.opened_logs = False
def printMenu(self, items):
for key, value in items.items():
print(f'{key} -- {value}')
def runStartMenu(self):
while(True):
choice = self.getMenuInput(self.start_menu)
if choice == None:
continue
# check if choice is in menu
match self.start_menu[choice]:
case "Exit":
print('Exiting system')
exit()
case "Explore the Blockchain":
print("TODO")
case "Login":
self.user = User(self.db)
logged_in = self.user.login()
self.clearScreen()
if logged_in:
print(f'Welcome {self.user.username}')
return
print("Login failed")
self.user = None
case "Sign up":
self.user = User(self.db)
registered = self.user.register()
if registered:
print("Registration successful")
return
print("Registration failed")
self.user = None
case _:
print("Wrong input, try again")
def runUserMainMenu(self):
while(self.user):
choice = self.getMenuInput(self.user_main_menu)
if choice == None:
continue
# check if choice is in menu
match self.user_main_menu[choice]:
case "Exit":
print('Exiting system')
exit()
case "Log out":
self.user.logout()
self.user = None
case "User Settings":
self.runUserSettingsMenu()
case "Blockchain":
self.runUserBlockchainMenu()
case _:
print("Wrong input, try again")
def runUserBlockchainMenu(self):
while(self.user):
choice = self.getMenuInput(self.user_blockchain_menu)
if choice == None:
continue
# check if choice is in menu
match self.user_blockchain_menu[choice]:
case "Back":
return
case "Explore the Blockchain":
print("TODO")
block = blockHelper.loadBlock()
i = 0
for data in block.data:
print(f"---------------------------------- Block {str(i)} ----------------------------------")
print(f"Block hash: {data.Inputs[0][1]}")
print(f"----------------------------------------------------------------------------------")
i += 1
case "Transfer coins":
new_tx = taskHelper.transaction(self)
if new_tx.is_valid():
# TODO: add to pool
print("Transaction is valid")
utilityHelper.saveFile("../data/transaction_pool.dat", new_tx)
continue
print("Transaction is invalid")
case "Cancel transaction":
print("TODO")
case "Check balance":
print("TODO")
case "Check the pool":
print("TODO")
case "Mine a block":
print("TODO")
case _:
print("Wrong input, try again")
def runUserSettingsMenu(self):
while(self.user):
choice = self.getMenuInput(self.user_settings_menu)
if choice == None:
continue
# check if choice is in menu
match self.user_settings_menu[choice]:
case "Back":
return
case "View account info":
self.user.printAccountInfo()
case "Change username":
self.user.updateAccount()
case "Change password":
self.user.updatePassword()
case "DELETE ACCOUNT":
if self.user.deleteAccount():
self.user = None
case _:
print("Wrong input, try again")
def getMenuInput(self, menu):
self.printMenu(menu)
# make input an interger
try:
choice = int(input())
except:
self.clearScreen()
print("Wrong input, try again")
return None
self.clearScreen()
return choice
def clearScreen(self):
os.system('cls' if os.name == 'nt' else 'clear')