214 lines
6.6 KiB
Python
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') |