Skip to content

Commit cfd576a

Browse files
committed
Sessions are now managed by file system to simulate mob timer as a singleton
1 parent 2eff4c4 commit cfd576a

File tree

10 files changed

+168
-13
lines changed

10 files changed

+168
-13
lines changed

Frames/MobTimerController.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
import uuid
12
from tkinter import *
3+
4+
import atexit
5+
26
from Infrastructure.CountdownManager import CountdownManager
37
from Infrastructure.MobberManager import MobberManager
8+
from Infrastructure.SessionManager import SessionManager
49
from Infrastructure.TimeOptionsManager import TimeOptionsManager
510
from Frames.ScreenBlockerFrame import ScreenBlockerFrame
611
from Frames.TransparentCountdownFrame import TransparentCountdownFrame
@@ -11,10 +16,19 @@ class MobTimerController(Tk):
1116
def __init__(self, *args, **kwargs):
1217
Tk.__init__(self, *args, **kwargs)
1318

14-
self.iconbitmap(default='C:\\Users\\Chris\\OneDrive\\Git\\Pycharm\\MobTimer\\time-bomb.ico')
19+
# self.iconbitmap(default='C:\\Users\\Chris\\OneDrive\\Git\\Pycharm\\MobTimer\\time-bomb.ico')
20+
#TODO: iconbitmap needs to load the ico file as a string because of py2exe =/
1521
self.time_options_manager = TimeOptionsManager()
1622
self.mobber_manager = MobberManager()
1723
self.countdown_manager = CountdownManager(self)
24+
self.session_manager = SessionManager(uuid)
25+
atexit.register(self.session_manager.clear_sessions)
26+
if self.session_manager.get_active_sessions().__len__() > 0:
27+
self.quit_and_destroy_session()
28+
29+
self.session_manager.create_session()
30+
31+
self.countdown_manager.subscribe_to_time_changes(self.show_screen_blocker_when_session_interupted)
1832

1933
monitors = get_monitors()
2034
num_monitors = monitors.__len__()
@@ -43,6 +57,16 @@ def __init__(self, *args, **kwargs):
4357
self.transparent_frame_position = 0
4458
self.title("Mob Timer")
4559

60+
def quit_and_destroy_session(self):
61+
self.session_manager.clear_sessions()
62+
self.quit()
63+
sys.exit()
64+
65+
def show_screen_blocker_when_session_interupted(self, days, minutes, seconds):
66+
if self.session_manager.get_active_sessions().__len__() == 0:
67+
self.show_screen_blocker_frame()
68+
self.session_manager.create_session()
69+
4670
def show_frame(self, frame_class):
4771
switched_frames = False
4872
if self.last_frame != frame_class:

Frames/ScreenBlockerFrame.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def build_window_content(self):
7070
row_index += 1
7171

7272
self.names_list = Listbox(center_frame, font="Helvetica 16 bold")
73-
self.names_list.grid(row=row_index, rowspan=4, columnspan=2, column=0, padx=10, pady=10, sticky=N + E + W)
73+
self.names_list.grid(row=row_index, rowspan=6, columnspan=2, column=0, padx=10, pady=10, sticky=N + E + W)
7474

7575
remove_mobber_button = Button(center_frame, text="Remove Mobber")
7676
remove_mobber_button.grid(row=row_index, column=2, sticky=N + E + W, padx=10, pady=10)
@@ -93,11 +93,26 @@ def build_window_content(self):
9393
clear_mobbers_button.bind("<Button-1>", lambda event: self.mobber_manager.clear())
9494
row_index += 1
9595

96+
clear_mobbers_button = Button(center_frame, text="Skip Driver")
97+
clear_mobbers_button.grid(row=row_index, column=2, sticky=N + E + W, padx=10, pady=10)
98+
clear_mobbers_button.bind("<Button-1>", lambda event: self.mobber_manager.switch_navigator_driver())
99+
row_index += 1
100+
101+
clear_mobbers_button = Button(center_frame, text="Rewind Driver")
102+
clear_mobbers_button.grid(row=row_index, column=2, sticky=N + E + W, padx=10, pady=10)
103+
clear_mobbers_button.bind("<Button-1>", lambda event: self.mobber_manager.rewind_driver())
104+
row_index += 1
105+
96106
start_button = Button(center_frame, text="Start Mobbing!", font="Helvetica 30 bold")
97107
start_button.grid(row=row_index, columnspan=3, sticky=N + E + W, padx=10, pady=10)
98108
start_button.bind("<Button-1>", self.launch_transparent_countdown)
99109
row_index += 1
100110

111+
start_button = Button(center_frame, text="Quit Mobbing!", font="Helvetica 10 bold")
112+
start_button.grid(row=row_index, columnspan=3, sticky=N + E + W, padx=50, pady=10)
113+
start_button.bind("<Button-1>", lambda event: self.controller.quit_and_destroy_session())
114+
row_index += 1
115+
101116
center_frame.grid(row=0, column=0, sticky="nsew")
102117

103118
def launch_transparent_countdown(self, event):

Infrastructure/FileUtilities.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import imp
2+
import os
3+
import sys
4+
5+
6+
class FileUtilities(object):
7+
@staticmethod
8+
def main_is_frozen():
9+
return (hasattr(sys, "frozen") or # new py2exe
10+
hasattr(sys, "importers") # old py2exe
11+
or imp.is_frozen("__main__")) # tools/freeze
12+
13+
@staticmethod
14+
def get_root_path():
15+
if FileUtilities.main_is_frozen():
16+
return os.path.dirname(sys.executable)
17+
return os.path.dirname(os.path.realpath(__file__))

Infrastructure/MobberManager.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,19 @@ def switch_navigator_driver(self):
5656
self.fire_time_change_callbacks()
5757

5858
def update_navigator_driver_index(self):
59-
if self.mobber_list.__len__() > 0:
60-
self.driver_index = self.driver_index % self.mobber_list.__len__()
61-
self.navigator_index =(self.driver_index + 1) % self.mobber_list.__len__()
59+
mobber_count = self.mobber_list.__len__()
60+
if mobber_count > 0:
61+
self.driver_index = self.driver_index % mobber_count
62+
self.navigator_index = (self.driver_index + 1) % mobber_count
6263
else:
6364
self.driver_index = 0
64-
self.navigator_index = 1
65+
self.navigator_index = 1
66+
67+
def rewind_driver(self):
68+
mobber_count = self.mobber_list.__len__()
69+
if mobber_count > 0:
70+
self.driver_index = (self.driver_index - 1)
71+
if self.driver_index < 0:
72+
self.driver_index = mobber_count - 1
73+
self.update_navigator_driver_index()
74+
self.fire_time_change_callbacks()

Infrastructure/SessionManager.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import os
2+
3+
from Infrastructure.FileUtilities import FileUtilities
4+
5+
6+
class SessionManager(object):
7+
def __init__(self, uuid_generator):
8+
self.uuid_generator = uuid_generator
9+
10+
def create_session(self):
11+
session_id = self.uuid_generator.uuid1()
12+
13+
directory = self.get_sessions_path()
14+
15+
file = open(directory + session_id.__str__(), 'w+')
16+
17+
def get_sessions_path(self):
18+
directory = FileUtilities.get_root_path() + "\\Sessions\\"
19+
if not os.path.exists(directory):
20+
os.makedirs(directory)
21+
return directory
22+
23+
def get_active_sessions(self):
24+
return os.listdir(self.get_sessions_path())
25+
26+
def clear_sessions(self):
27+
folder = self.get_sessions_path()
28+
for the_file in os.listdir(folder):
29+
file_path = os.path.join(folder, the_file)
30+
try:
31+
if os.path.isfile(file_path):
32+
os.unlink(file_path)
33+
except Exception:
34+
pass
35+
36+
37+

Infrastructure/Sessions/00010203-0405-0607-0809-0a0b0c0d0e0f

Whitespace-only changes.

tests/Infrastructure/MobberManager/TestsMobberManager.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,11 @@ def time_change_callback(mobber_list, driver_index, navigator_index):
134134
mobber_manager.remove_mobber(2)
135135
mobber_manager.remove_mobber(0)
136136
mobber_manager.switch_navigator_driver()
137+
mobber_manager.rewind_driver()
137138
mobber_manager.add_mobber("Seth")
139+
mobber_manager.rewind_driver()
140+
mobber_manager.rewind_driver()
141+
mobber_manager.rewind_driver()
138142
mobber_manager.move_mobber_down(0)
139143
mobber_manager.add_mobber("Fredrick")
140144
mobber_manager.move_mobber_up(2)

tests/Infrastructure/MobberManager/tests.Infrastructure.MobberManager.TestsMobberManager.test_subscribe_to_mobber_list_changes.approved.txt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@ Action 12:Joe, Chris (Driver), Sam (Navigator), John, Bill,
1414
Action 13:Joe, Chris (Driver), John (Navigator), Bill,
1515
Action 14:Chris, John (Driver), Bill (Navigator),
1616
Action 15:Chris (Navigator), John, Bill (Driver),
17-
Action 16:Chris, John, Bill (Driver), Seth (Navigator),
18-
Action 17:John, Chris, Bill (Driver), Seth (Navigator),
19-
Action 18:John, Chris, Bill (Driver), Seth (Navigator), Fredrick,
20-
Action 19:John, Bill, Chris (Driver), Seth (Navigator), Fredrick,
21-
Action 20:John, Chris, Seth (Driver), Fredrick (Navigator),
22-
Action 21:Chris (Navigator), Seth, Fredrick (Driver),
23-
Action 22:Seth (Driver), Fredrick (Navigator),
17+
Action 16:Chris, John (Driver), Bill (Navigator),
18+
Action 17:Chris, John (Driver), Bill (Navigator), Seth,
19+
Action 18:Chris (Driver), John (Navigator), Bill, Seth,
20+
Action 19:Chris (Navigator), John, Bill, Seth (Driver),
21+
Action 20:Chris, John, Bill (Driver), Seth (Navigator),
22+
Action 21:John, Chris, Bill (Driver), Seth (Navigator),
23+
Action 22:John, Chris, Bill (Driver), Seth (Navigator), Fredrick,
24+
Action 23:John, Bill, Chris (Driver), Seth (Navigator), Fredrick,
25+
Action 24:John, Chris, Seth (Driver), Fredrick (Navigator),
26+
Action 25:Chris (Navigator), Seth, Fredrick (Driver),
27+
Action 26:Seth (Driver), Fredrick (Navigator),
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import os
2+
import unittest
3+
import uuid
4+
from Infrastructure.SessionManager import SessionManager
5+
6+
os.environ["APPROVALS_TEXT_DIFF_TOOL"] = "C:\\Program Files\\TortoiseSVN\\bin\\TortoiseMerge.exe"
7+
8+
9+
class FakeUuidGenerator(object):
10+
def __init__(self, static_uuid):
11+
self.static_uuid = static_uuid
12+
13+
def uuid1(self):
14+
return uuid.UUID(self.static_uuid)
15+
16+
17+
class TestsSessionManager(unittest.TestCase):
18+
def test_creating_session(self):
19+
file_name = '00010203-0405-0607-0809-0a0b0c0d0e0f'
20+
try:
21+
os.remove(os.path.dirname(os.path.realpath(__file__)) + "\\Sessions\\" + file_name)
22+
except OSError:
23+
pass
24+
fake_uuid_generator = FakeUuidGenerator('{%s}' % file_name)
25+
session_manager = SessionManager(fake_uuid_generator)
26+
session_manager.create_session()
27+
self.assertEqual(session_manager.get_active_sessions(), [file_name])
28+
29+
def test_clear_sessions(self):
30+
31+
file_name = '00010203-0405-0607-0809-0a0b0c0d0e0f'
32+
try:
33+
os.remove(os.path.dirname(os.path.realpath(__file__)) + "\\Sessions\\" + file_name)
34+
except OSError:
35+
pass
36+
fake_uuid_generator = FakeUuidGenerator('{%s}' % file_name)
37+
session_manager = SessionManager(fake_uuid_generator)
38+
session_manager.create_session()
39+
session_manager.clear_sessions()
40+
self.assertEqual(session_manager.get_active_sessions(), [])
41+
42+
43+
if __name__ == '__main__':
44+
unittest.main()

tests/Infrastructure/SessionManager/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)