From 51c32747b40b2853b56c1c9c80c4ec67b07e196a Mon Sep 17 00:00:00 2001 From: Vasyl Horbachenko Date: Wed, 13 Jun 2018 00:34:28 +0300 Subject: [PATCH] debriefing polling & parsing WIP --- game/operation.py | 2 +- ui/eventresultsmenu.py | 8 +++--- userdata/debriefing.py | 52 +++++++++++++++++++++++++++++++++++ userdata/debriefing_parser.py | 19 ------------- 4 files changed, 57 insertions(+), 24 deletions(-) create mode 100644 userdata/debriefing.py delete mode 100644 userdata/debriefing_parser.py diff --git a/game/operation.py b/game/operation.py index 123534ae..10626c43 100644 --- a/game/operation.py +++ b/game/operation.py @@ -1,4 +1,4 @@ -from userdata.debriefing_parser import * +from userdata.debriefing import * from theater.conflicttheater import * from theater.base import * diff --git a/ui/eventresultsmenu.py b/ui/eventresultsmenu.py index 41ded3a4..7951fa94 100644 --- a/ui/eventresultsmenu.py +++ b/ui/eventresultsmenu.py @@ -15,7 +15,7 @@ class EventResultsMenu(Menu): self.event = event self.finished = False - wait_for_debriefing(lambda: self.process_debriefing) + wait_for_debriefing(callback=self.process_debriefing) def display(self): self.window.clear_right_pane() @@ -55,12 +55,12 @@ class EventResultsMenu(Menu): Button(self.frame, text="Okay", command=self.dismiss).grid(columnspan=1, row=row); row += 1 def process_debriefing(self, debriefing: Debriefing): - self.game.finish_event(debriefing) + self.game.finish_event(event=self.event, debriefing=debriefing) self.game.pass_turn() self.finished = True - self.player_losses = debriefing.destroyed_units[self.game.player] - self.enemy_losses = debriefing.destroyed_units[self.game.enemy] + self.player_losses = debriefing.destroyed_units.get(self.game.player, {}) + self.enemy_losses = debriefing.destroyed_units.get(self.game.enemy, {}) self.display() def simulate_result(self, player_factor: float, enemy_factor: float, result: bool): diff --git a/userdata/debriefing.py b/userdata/debriefing.py new file mode 100644 index 00000000..069c4d5c --- /dev/null +++ b/userdata/debriefing.py @@ -0,0 +1,52 @@ +import typing + +import json +import threading +import time +import os + +from datetime import datetime + +DEBRIEFING_LOG_EXTENSION = "log" + + +class Debriefing: + def __init__(self): + self.destroyed_units = {} # type: typing.Dict[str, typing.Dict[str, int]] + + @classmethod + def parse(cls, path: str): + with open(path, "r") as f: + events = json.load(f) + + return Debriefing() + + +def debriefing_directory_location() -> str: + return "build/debriefing" + + +def _logfiles_snapshot() -> typing.Dict[str, float]: + result = {} + for file in os.listdir(debriefing_directory_location()): + fullpath = os.path.join(debriefing_directory_location(), file) + result[file] = os.path.getmtime(fullpath) + + return result + + +def _poll_new_debriefing_log(snapshot: typing.Dict[str, float], callback: typing.Callable): + should_run = True + while should_run: + for file, timestamp in _logfiles_snapshot().items(): + if file not in snapshot or timestamp != snapshot[file]: + callback(Debriefing.parse(os.path.join(debriefing_directory_location(), file))) + should_run = False + break + + time.sleep(1) + + +def wait_for_debriefing(callback: typing.Callable): + threading.Thread(target=_poll_new_debriefing_log, args=(_logfiles_snapshot(), callback)).start() + diff --git a/userdata/debriefing_parser.py b/userdata/debriefing_parser.py deleted file mode 100644 index 095cb639..00000000 --- a/userdata/debriefing_parser.py +++ /dev/null @@ -1,19 +0,0 @@ -import typing -import json - - -class Debriefing: - def __init__(self): - self.destroyed_units = {} # type: typing.Dict[str, typing.Dict[str, int]] - - def parse(self, path: str): - with open(path, "r") as f: - events = json.load(f) - - -def debriefing_directory_location() -> str: - return "build/debrfiefing" - - -def wait_for_debriefing(callback: typing.Callable): - pass