mirror of
https://github.com/rr-/pq-cli.git
synced 2026-09-29 06:44:00 -06:00
ui: save periodically in every frontend
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
|
import logging
|
||||||
import pickle
|
import pickle
|
||||||
import typing as T
|
import typing as T
|
||||||
|
from datetime import datetime
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from pqcli.mechanic import Player
|
from pqcli.mechanic import Player
|
||||||
@@ -9,6 +11,7 @@ class Roster:
|
|||||||
def __init__(self, path: Path, players: T.List[Player]) -> None:
|
def __init__(self, path: Path, players: T.List[Player]) -> None:
|
||||||
self.path = path
|
self.path = path
|
||||||
self.players = players
|
self.players = players
|
||||||
|
self._last_save = datetime.now()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def load(path: T.Union[str, Path]) -> "Roster":
|
def load(path: T.Union[str, Path]) -> "Roster":
|
||||||
@@ -20,6 +23,7 @@ class Roster:
|
|||||||
return Roster(real_path, players=[])
|
return Roster(real_path, players=[])
|
||||||
|
|
||||||
def save(self) -> None:
|
def save(self) -> None:
|
||||||
|
self._last_save = datetime.now()
|
||||||
old_path = self.path.with_name(self.path.name + ".old")
|
old_path = self.path.with_name(self.path.name + ".old")
|
||||||
tmp_path = self.path.with_name(self.path.name + ".new")
|
tmp_path = self.path.with_name(self.path.name + ".new")
|
||||||
tmp_path.parent.mkdir(parents=True, exist_ok=True)
|
tmp_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
@@ -27,3 +31,8 @@ class Roster:
|
|||||||
if self.path.exists():
|
if self.path.exists():
|
||||||
self.path.rename(old_path)
|
self.path.rename(old_path)
|
||||||
tmp_path.rename(self.path)
|
tmp_path.rename(self.path)
|
||||||
|
|
||||||
|
def save_periodically(self):
|
||||||
|
if (datetime.now() - self._last_save).total_seconds() >= 300:
|
||||||
|
logging.info("Saving...")
|
||||||
|
self.save()
|
||||||
|
|||||||
@@ -136,13 +136,8 @@ class BasicUserInterface(BaseUserInterface):
|
|||||||
if player.level != last_level:
|
if player.level != last_level:
|
||||||
last_level = player.level
|
last_level = player.level
|
||||||
self.print_player_info(player)
|
self.print_player_info(player)
|
||||||
if (
|
if self.args.use_saves:
|
||||||
self.args.use_saves
|
self.roster.save_periodically()
|
||||||
and (last_tick - last_save).total_seconds() >= 300
|
|
||||||
):
|
|
||||||
logging.info("Saving...")
|
|
||||||
last_save = last_tick
|
|
||||||
self.roster.save()
|
|
||||||
|
|
||||||
def print_player_info(self, player: Player) -> None:
|
def print_player_info(self, player: Player) -> None:
|
||||||
print("--- Character Sheet ---")
|
print("--- Character Sheet ---")
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import argparse
|
import argparse
|
||||||
import signal
|
|
||||||
import curses
|
import curses
|
||||||
import os
|
import os
|
||||||
|
import signal
|
||||||
import time
|
import time
|
||||||
import typing as T
|
import typing as T
|
||||||
|
|
||||||
@@ -107,7 +107,7 @@ class CursesUserInterface(BaseUserInterface):
|
|||||||
self.switch_view(view)
|
self.switch_view(view)
|
||||||
|
|
||||||
def switch_to_game_view(self, player: Player) -> None:
|
def switch_to_game_view(self, player: Player) -> None:
|
||||||
view = GameView(self.screen, player)
|
view = GameView(self.screen, self.roster, player, self.args)
|
||||||
view.on_exit += self.switch_to_roster_view
|
view.on_exit += self.switch_to_roster_view
|
||||||
self.switch_view(view)
|
self.switch_view(view)
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
|
import argparse
|
||||||
import curses
|
import curses
|
||||||
import datetime
|
import datetime
|
||||||
import typing as T
|
import typing as T
|
||||||
|
|
||||||
from pqcli.mechanic import Player, Simulation
|
from pqcli.mechanic import Player, Simulation
|
||||||
|
from pqcli.roster import Roster
|
||||||
from pqcli.ui.curses.event_handler import EventHandler
|
from pqcli.ui.curses.event_handler import EventHandler
|
||||||
|
|
||||||
from ..base_view import BaseView
|
from ..base_view import BaseView
|
||||||
@@ -16,11 +18,20 @@ from .task_progress_window import TaskProgressWindow
|
|||||||
|
|
||||||
|
|
||||||
class GameView(BaseView):
|
class GameView(BaseView):
|
||||||
def __init__(self, screen: T.Any, player: Player) -> None:
|
def __init__(
|
||||||
|
self,
|
||||||
|
screen: T.Any,
|
||||||
|
roster: Roster,
|
||||||
|
player: Player,
|
||||||
|
args: argparse.Namespace,
|
||||||
|
) -> None:
|
||||||
super().__init__(screen)
|
super().__init__(screen)
|
||||||
self.on_exit = EventHandler()
|
self.on_exit = EventHandler()
|
||||||
|
|
||||||
|
self._roster = roster
|
||||||
self._player = player
|
self._player = player
|
||||||
|
self._args = args
|
||||||
|
|
||||||
self._simulation = Simulation(player)
|
self._simulation = Simulation(player)
|
||||||
self._last_tick = datetime.datetime.now()
|
self._last_tick = datetime.datetime.now()
|
||||||
|
|
||||||
@@ -141,3 +152,5 @@ class GameView(BaseView):
|
|||||||
elapsed = datetime.datetime.now() - self._last_tick
|
elapsed = datetime.datetime.now() - self._last_tick
|
||||||
self._simulation.tick(elapsed.total_seconds() * 1000)
|
self._simulation.tick(elapsed.total_seconds() * 1000)
|
||||||
self._last_tick = datetime.datetime.now()
|
self._last_tick = datetime.datetime.now()
|
||||||
|
if self._args.use_saves:
|
||||||
|
self._roster.save_periodically()
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ class UrwidUserInterface(BaseUserInterface):
|
|||||||
|
|
||||||
def switch_to_game_view(self, player_idx: int) -> None:
|
def switch_to_game_view(self, player_idx: int) -> None:
|
||||||
player = self.roster.players[player_idx]
|
player = self.roster.players[player_idx]
|
||||||
self.loop.widget = GameView(self.loop, player, self.args)
|
self.loop.widget = GameView(self.loop, self.roster, player, self.args)
|
||||||
self._connect("cancel", self.switch_to_roster_view)
|
self._connect("cancel", self.switch_to_roster_view)
|
||||||
|
|
||||||
def switch_to_delete_player_view(self, player_idx: int) -> None:
|
def switch_to_delete_player_view(self, player_idx: int) -> None:
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ from pqcli.mechanic import (
|
|||||||
Simulation,
|
Simulation,
|
||||||
Spell,
|
Spell,
|
||||||
)
|
)
|
||||||
|
from pqcli.roster import Roster
|
||||||
from pqcli.ui.urwid.custom_line_box import CustomLineBox
|
from pqcli.ui.urwid.custom_line_box import CustomLineBox
|
||||||
from pqcli.ui.urwid.custom_progress_bar import CustomProgressBar
|
from pqcli.ui.urwid.custom_progress_bar import CustomProgressBar
|
||||||
from pqcli.ui.urwid.data_table import DataTable
|
from pqcli.ui.urwid.data_table import DataTable
|
||||||
@@ -337,11 +338,17 @@ class GameView(NPile):
|
|||||||
signals = ["cancel"]
|
signals = ["cancel"]
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self, loop: urwid.MainLoop, player: Player, args: argparse.Namespace
|
self,
|
||||||
|
loop: urwid.MainLoop,
|
||||||
|
roster: Roster,
|
||||||
|
player: Player,
|
||||||
|
args: argparse.Namespace,
|
||||||
) -> None:
|
) -> None:
|
||||||
self.loop = loop
|
self.loop = loop
|
||||||
|
self.roster = roster
|
||||||
self.player = player
|
self.player = player
|
||||||
self.args = args
|
self.args = args
|
||||||
|
|
||||||
self.simulation = Simulation(player)
|
self.simulation = Simulation(player)
|
||||||
self.last_tick = datetime.datetime.now()
|
self.last_tick = datetime.datetime.now()
|
||||||
|
|
||||||
@@ -387,6 +394,8 @@ class GameView(NPile):
|
|||||||
elapsed = (now - self.last_tick).total_seconds()
|
elapsed = (now - self.last_tick).total_seconds()
|
||||||
self.simulation.tick(elapsed * 1000)
|
self.simulation.tick(elapsed * 1000)
|
||||||
self.last_tick = datetime.datetime.now()
|
self.last_tick = datetime.datetime.now()
|
||||||
|
if self.args.use_saves:
|
||||||
|
self.roster.save_periodically()
|
||||||
|
|
||||||
def keypress(self, size: T.Tuple[int, int], key: str) -> bool:
|
def keypress(self, size: T.Tuple[int, int], key: str) -> bool:
|
||||||
if key == "esc":
|
if key == "esc":
|
||||||
|
|||||||
Reference in New Issue
Block a user