-
Notifications
You must be signed in to change notification settings - Fork 0
/
Main.py
139 lines (106 loc) · 4.56 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
import os
import sys
from threading import Timer
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit
from MainUI import Ui_MainWindow
from Interaction import InteractionWindow
from KeyrockAPI import KeyrockAPI
from User import LoggedInUser
os.environ["QT_IM_MODULE"] = "qtvirtualkeyboard"
class MainWindow:
def __init__(self):
# setting up keyrock
self.keyrockAPI = KeyrockAPI()
self.accessTimer = None
# setting up UI #
self.main_win = QMainWindow()
self.ui = Ui_MainWindow()
self.ui.setupUi(self.main_win)
self.ui.stackedLogin.setCurrentWidget(self.ui.loginPage) # setting the starting widget
self.ui.textPassword.setEchoMode(QLineEdit.Password)
self.ui.labelLoginError.hide()
# set up UI for interaction component
self.interactionui = InteractionWindow(self)
self.ui.stackedLogin.addWidget(self.interactionui.get_widget())
# connecting buttons
self.ui.buttonLogin.clicked.connect(self.login)
self.ui.buttonLogout.clicked.connect(self.logout)
self.ui.buttonSettings.clicked.connect(self.ai_settings)
self.ui.buttonDispense.clicked.connect(self.dispense_elements)
# connecting radiobuttons
self.ui.radioAI.toggled.connect(self.ai)
self.ui.radioManual.toggled.connect(self.manual)
self.ui.radioBoard.toggled.connect(self.leaderboard)
self.ui.radioInteraction.toggled.connect(self.start_interaction)
# logged in user info
self.current_user = LoggedInUser()
def new_access_timer(self):
self.accessTimer = Timer(3500, self.refresh_access_token)
self.accessTimer.start()
def refresh_access_token(self):
self.current_user = self.keyrockAPI.refresh_token(self.current_user)
print("new access token gotten")
self.new_access_timer()
def login(self):
username = self.ui.textUsername.text()
password = self.ui.textPassword.text()
# authenticate user using keyrock
result, self.current_user = self.keyrockAPI.authenticate_user(username, password, self.current_user)
if result: # success
self.ui.labelRole.setText(self.current_user.role)
self.ui.labelUsername_2.setText(self.current_user.username)
# change to mainPage
self.ui.stackedLogin.setCurrentWidget(self.ui.mainPage)
self.ui.stackedPages.setCurrentWidget(self.ui.pageAI)
self.ui.radioAI.toggle()
# clear the login page
self.ui.textPassword.clear()
self.ui.textUsername.clear()
self.ui.labelLoginError.hide()
self.new_access_timer()
else: # failure
# clear the login page
self.ui.labelLoginError.show()
self.ui.textPassword.clear()
self.ui.textUsername.clear()
self.current_user = LoggedInUser()
def logout(self):
self.ui.stackedLogin.setCurrentWidget(self.ui.loginPage)
self.current_user = LoggedInUser()
self.accessTimer.cancel()
def authorize(self, action, resource):
return self.keyrockAPI.authorize_user(self.current_user, action, resource)
def ai_settings(self):
if self.authorize("POST", "/ai"):
print("you may change the settings")
else:
print("you may not change the settings")
def ai(self):
self.ui.stackedPages.setCurrentWidget(self.ui.pageAI)
def manual(self):
self.ui.stackedPages.setCurrentWidget(self.ui.pageManual)
def dispense_elements(self):
print("elements dispensed")
def leaderboard(self):
self.ui.stackedPages.setCurrentWidget(self.ui.pageBoard)
def update_leaderboard(self, players):
if players:
name_labels = [getattr(self.ui, f"name{i}") for i in range(1, 11)]
pickup_labels = [getattr(self.ui, f"pickups{i}") for i in range(1, 11)]
for i, p in enumerate(players[:10]):
name_labels[i].setText(p['name'])
pickup_labels[i].setText(f"{p['score']} pickups")
def start_interaction(self):
self.ui.stackedLogin.setCurrentWidget(self.interactionui.get_widget())
self.interactionui.startup()
def end_interaction(self):
self.ui.radioBoard.toggle()
self.ui.stackedLogin.setCurrentWidget(self.ui.mainPage)
self.leaderboard()
def show(self):
self.main_win.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
main_win = MainWindow()
main_win.show()
sys.exit(app.exec_())