-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmatch_manager.py
More file actions
253 lines (201 loc) · 8.06 KB
/
Copy pathmatch_manager.py
File metadata and controls
253 lines (201 loc) · 8.06 KB
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
import math
import json
import uuid
import time
import os
from typing import Callable
class MatchManager:
blue_alliance_goals: int = 0
blue_alliance_fouls: int = 0
red_alliance_goals: int = 0
red_alliance_fouls: int = 0
blue_alliance_team_1: int = 99
blue_alliance_team_2: int = 99
blue_alliance_team_3: int = 99
red_alliance_team_1: int = 99
red_alliance_team_2: int = 99
red_alliance_team_3: int = 99
FOULS_PER_GOAL: int = 3
match_active: bool = False
locked: bool = True
update_callback: Callable = None
save_directory: str
match_number: int = 0
def __init__(self, save_directory: str):
self.save_directory = save_directory
# * Blue Alliance
def set_blue_alliance_teams(self, team_1: int, team_2: int, team_3: int):
self.blue_alliance_team_1 = team_1
self.blue_alliance_team_2 = team_2
self.blue_alliance_team_3 = team_3
if self.update_callback is not None:
self.update_callback()
def set_blue_alliance_team_1(self, team_1: int):
self.blue_alliance_team_1 = team_1
if self.update_callback is not None:
self.update_callback()
def set_blue_alliance_team_2(self, team_2: int):
self.blue_alliance_team_2 = team_2
if self.update_callback is not None:
self.update_callback()
def set_blue_alliance_team_3(self, team_3: int):
self.blue_alliance_team_3 = team_3
if self.update_callback is not None:
self.update_callback()
def blue_alliance_goal_add(self):
if (self.match_active or not self.locked):
self.blue_alliance_goals += 1
if self.update_callback is not None:
self.update_callback()
def blue_alliance_goal_sub(self):
if (self.match_active or not self.locked) and self.blue_alliance_goals > 0:
self.blue_alliance_goals -= 1
if self.update_callback is not None:
self.update_callback()
def blue_alliance_foul_add(self):
if (self.match_active or not self.locked):
self.blue_alliance_fouls += 1
if self.update_callback is not None:
self.update_callback()
def blue_alliance_foul_sub(self):
if (self.match_active or not self.locked) and self.blue_alliance_fouls > 0:
self.blue_alliance_fouls -= 1
if self.update_callback is not None:
self.update_callback()
def blue_alliance_reset(self):
self.blue_alliance_goals = 0
self.blue_alliance_fouls = 0
if self.update_callback is not None:
self.update_callback()
def blue_alliance_get_total_score(self):
return self.blue_alliance_goals + math.floor(self.blue_alliance_get_added_fouls() / self.FOULS_PER_GOAL)
def blue_alliance_get_goals(self):
return self.blue_alliance_goals
def blue_alliance_get_added_fouls(self):
return self.red_alliance_fouls
def blue_alliance_get_own_fouls(self):
return self.blue_alliance_fouls
# * Red Alliance
def set_red_alliance_teams(self, team_1: int, team_2: int, team_3: int):
self.red_alliance_team_1 = team_1
self.red_alliance_team_2 = team_2
self.red_alliance_team_3 = team_3
if self.update_callback is not None:
self.update_callback()
def set_red_alliance_team_1(self, team_1: int):
self.red_alliance_team_1 = team_1
if self.update_callback is not None:
self.update_callback()
def set_red_alliance_team_2(self, team_2: int):
self.red_alliance_team_2 = team_2
if self.update_callback is not None:
self.update_callback()
def set_red_alliance_team_3(self, team_3: int):
self.red_alliance_team_3 = team_3
if self.update_callback is not None:
self.update_callback()
def red_alliance_goal_add(self):
if (self.match_active or not self.locked):
self.red_alliance_goals += 1
if self.update_callback is not None:
self.update_callback()
def red_alliance_goal_sub(self):
if (self.match_active or not self.locked) and self.red_alliance_goals > 0:
self.red_alliance_goals -= 1
if self.update_callback is not None:
self.update_callback()
def red_alliance_foul_add(self):
if (self.match_active or not self.locked):
self.red_alliance_fouls += 1
if self.update_callback is not None:
self.update_callback()
def red_alliance_foul_sub(self):
if (self.match_active or not self.locked) and self.red_alliance_fouls > 0:
self.red_alliance_fouls -= 1
if self.update_callback is not None:
self.update_callback()
def red_alliance_reset(self):
self.red_alliance_goals = 0
self.red_alliance_fouls = 0
if self.update_callback is not None:
self.update_callback()
def red_alliance_get_total_score(self):
return self.red_alliance_goals + math.floor(self.red_alliance_get_added_fouls() / self.FOULS_PER_GOAL)
def red_alliance_get_goals(self):
return self.red_alliance_goals
def red_alliance_get_added_fouls(self):
return self.blue_alliance_fouls
def red_alliance_get_own_fouls(self):
return self.red_alliance_fouls
# * Housekeeping
def reset_all(self):
self.blue_alliance_reset()
self.red_alliance_reset()
def start_match(self):
self.match_active = True
self.reset_all()
if self.update_callback is not None:
self.update_callback()
def start_match_with_match_number(self, match_number: int):
self.match_number = match_number
self.start_match()
if self.update_callback is not None:
self.update_callback()
def resume_match(self):
if self.update_callback is not None:
self.update_callback()
self.match_active = True
def end_match(self):
if self.update_callback is not None:
self.update_callback()
self.match_active = False
def set_match_active(self, active: bool):
if self.update_callback is not None:
self.update_callback()
self.match_active = active
def is_match_active(self):
return self.match_active
def set_locked(self, locked: bool):
if self.update_callback is not None:
self.update_callback()
self.locked = locked
def is_locked(self):
return self.locked
def lock(self):
self.locked = True
if self.update_callback is not None:
self.update_callback()
def unlock(self):
self.locked = False
if self.update_callback is not None:
self.update_callback()
def set_update_callback(self, callback: Callable):
self.update_callback = callback
def set_match_number(self, match_number: int):
self.match_number = match_number
if self.update_callback is not None:
self.update_callback()
def save_match(self):
match_data = {
"blue_alliance": {
"team_1": self.blue_alliance_team_1,
"team_2": self.blue_alliance_team_2,
"team_3": self.blue_alliance_team_3,
"goals": self.blue_alliance_goals,
"fouls": self.blue_alliance_fouls
},
"red_alliance": {
"team_1": self.red_alliance_team_1,
"team_2": self.red_alliance_team_2,
"team_3": self.red_alliance_team_3,
"goals": self.red_alliance_goals,
"fouls": self.red_alliance_fouls
}
}
if not os.path.exists(self.save_directory):
os.makedirs(self.save_directory, exist_ok=True)
date_str = time.strftime("%Y%m%d-%H%M%S")
id = uuid.uuid4().hex
match_file = open(f"{self.save_directory}/MATCH_{str(self.match_number)}_RESULTS_{date_str}_{id}.json", "w")
match_file.write(json.dumps(match_data))
match_file.close()