/
login.py
115 lines (91 loc) · 3.92 KB
/
login.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
import json
import os
import tkinter as tk
from tkinter import ttk
import codeforces_wrapper
def format_key(key: str):
"""Makes string lowercase and replaces spaces with underscores
>>> format_key("Username")
'username'
>>> format_key("Api key")
'api_key'
"""
return key.lower().replace(' ', "_")
class Login:
def __init__(self, shared_browser):
self.user_data = None
self.is_logged_in = False
self.root = tk.Tk()
self.robo_browser = shared_browser
self.root.title('CodeForces Login')
self.root.resizable(False, False)
style = ttk.Style()
style.configure("TLabel", background="white", padding=3)
style.configure("TLabelframe", background="white", padding=3)
style.configure("TLabelframe.Label", background="white")
style.configure("TEntry", padding=3)
style.configure("TButton", background="white")
main_frame = ttk.LabelFrame(self.root, text="Login")
current_file_path = os.path.dirname(os.path.realpath(__file__))
codeforces_image = tk.PhotoImage(
file=current_file_path + '/codeforces-logo.png')
image_label = ttk.Label(main_frame)
image_label.config(image=codeforces_image)
main_frame.pack()
image_label.pack()
self.username_entry = ttk.Entry(main_frame)
self.password_entry = ttk.Entry(main_frame, show="*")
self.api_key_entry = ttk.Entry(main_frame)
self.api_secret_entry = ttk.Entry(main_frame)
self.login_button = ttk.Button(
main_frame, text="Login", command=self.codeforces_login)
self.labels = ["Username", "Password", "API Key", "API Secret"]
self.entries = [self.username_entry, self.password_entry,
self.api_key_entry, self.api_secret_entry]
for i in range(len(self.labels)):
ttk.Label(main_frame, text=self.labels[i]).pack()
self.entries[i].pack()
self.entries[i].bind("<Return>", self.codeforces_login)
self.should_remember_me = tk.BooleanVar()
ttk.Checkbutton(main_frame, text="Remember Me",
variable=self.should_remember_me).pack(pady=15)
self.login_button.pack(pady=15)
self.username_entry.focus()
ttk.Label(
main_frame, text="by: Kerolloz", relief=tk.SUNKEN).pack(expand=1, fill="both")
self.load_user_data_from_file()
self.root.mainloop()
def user_data_to_dictionary(self):
d = {}
for i in range(len(self.labels)):
key = format_key(self.labels[i])
d[key] = self.entries[i].get()
return d
def save_user_data_to_file(self):
with open('.user_data.json', 'w') as f:
json.dump(self.user_data, f)
def load_user_data_to_ui(self):
for i in range(len(self.labels)):
key = format_key(self.labels[i])
self.entries[i].insert(0, self.user_data[key])
def load_user_data_from_file(self):
if os.path.exists(".user_data.json"):
try:
with open('.user_data.json') as f:
self.user_data = json.load(f)
self.load_user_data_to_ui()
self.codeforces_login()
except FileNotFoundError:
print("No previous saved login user data")
def codeforces_login(self, _=None):
self.login_button.config(text="Please wait..", state=tk.DISABLED)
self.root.update()
self.user_data = self.user_data_to_dictionary()
if self.should_remember_me.get():
self.save_user_data_to_file()
if codeforces_wrapper.login(self.robo_browser, self.user_data):
self.root.destroy() # destroy the login window
self.is_logged_in = True
else:
self.login_button.config(text="Login", state=tk.NORMAL)
tk.messagebox.showerror("Error", "Something went wrong")