mirror of
https://github.com/aclist/dztui.git
synced 2026-10-31 23:22:44 +01:00
Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ac286f4a72 | ||
|
|
e254821105 | ||
|
|
32b8c5cbc5 | ||
|
|
76ed7f2451 | ||
|
|
f135f6a35d | ||
|
|
eb5d5d5181 | ||
|
|
fef8c69f38 |
No files matched your search
@@ -32,10 +32,10 @@ class FilterManager:
|
||||
# TODO: strings
|
||||
self.tooltips = {
|
||||
strings.filter_1pp: "First-person perspective",
|
||||
strings.filter_day: "In-game time between 0700 and 1659",
|
||||
strings.filter_day: "In-game time between 0600 and 1759",
|
||||
strings.filter_empty: "Servers with no players",
|
||||
strings.filter_3pp: "Third-person perspective",
|
||||
strings.filter_night: "In-game time between 1700 and 0659",
|
||||
strings.filter_night: "In-game time between 1800 and 0559",
|
||||
strings.filter_full: "Servers with no open slots",
|
||||
strings.filter_official: "Bohemia official servers",
|
||||
strings.filter_nonascii: "Server names using non-standard, complex glyphs",
|
||||
|
||||
@@ -12,8 +12,8 @@ if TYPE_CHECKING:
|
||||
from dzgui.api.servers import Record
|
||||
from dzgui.model.servers import NewPlayerCount
|
||||
|
||||
DAY_REG = r"([0][7-9]|[1][0-6])"
|
||||
NIGHT_REG = r"([0][0-6]|[1][7-9]|[2][0-3])"
|
||||
DAY_REG = r"([0][6-9]|[1][0-7])"
|
||||
NIGHT_REG = r"([0][0-5]|[1][8-9]|[2][0-3])"
|
||||
|
||||
|
||||
class ProxyModelManager:
|
||||
|
||||
+51
-28
@@ -59,7 +59,6 @@ class LocalClock:
|
||||
self.start_time = datetime.now()
|
||||
GLib.timeout_add(500, self.check_time)
|
||||
|
||||
# FIXME: sometimes skips 2s
|
||||
def get_time(self) -> str:
|
||||
return datetime.now().time().strftime(EXTENDED_TIME_FORMAT)
|
||||
|
||||
@@ -191,7 +190,6 @@ class ServerClock:
|
||||
delta = self.get_remaining_delta(picker_time, is_night)
|
||||
total = to_end + next_cycle + delta
|
||||
else:
|
||||
# TODO: fix calculation
|
||||
picker_date = datetime.combine(self.cur_time, picker_time)
|
||||
# NOTE: strip sub-minute values
|
||||
new = self.cur_time.replace(second=0, microsecond=0)
|
||||
@@ -210,36 +208,60 @@ class ServerClock:
|
||||
return td
|
||||
|
||||
|
||||
class GenericAdjustedClock:
|
||||
def __init__(self, emitter: Emitter, signal: str) -> None:
|
||||
self.signal = signal
|
||||
class RemainderClock:
|
||||
def __init__(self, emitter: Emitter) -> None:
|
||||
self.emitter = emitter
|
||||
self.emitter.connect("target_time_changed", self._on_target_time_changed)
|
||||
self.emitter.connect("local_time_incremented", self._on_local_time_incremented)
|
||||
self.reset_time(True)
|
||||
|
||||
self.previous = timedelta(0)
|
||||
|
||||
def reset_time(self, zero_out: bool = False) -> None:
|
||||
now = datetime.now()
|
||||
second, ms = (0, 0) if zero_out else (now.second, now.microsecond)
|
||||
self.time = datetime.combine(
|
||||
now, time(hour=0, minute=0, second=second, microsecond=ms)
|
||||
)
|
||||
|
||||
def _on_local_time_incremented(
|
||||
self, emitter: Emitter, time: datetime, elapsed: timedelta
|
||||
) -> None:
|
||||
if self.time == datetime.min.time():
|
||||
return
|
||||
|
||||
delta = elapsed - self.previous
|
||||
# NOTE: clamp to midnight
|
||||
self.time = max(
|
||||
self.time - delta, self.time.replace(hour=0, minute=0, second=0)
|
||||
)
|
||||
self.previous = elapsed
|
||||
self.emitter.emit("remaining_time_changed", self.time)
|
||||
|
||||
def _on_target_time_changed(self, emitter: Emitter, time: timedelta) -> None:
|
||||
if isinstance(self, AdjustedClock):
|
||||
self.start_time = datetime.now()
|
||||
self.reset_time()
|
||||
self.time += time
|
||||
self.emitter.emit("remaining_time_changed", self.time)
|
||||
|
||||
def get_time(self) -> str:
|
||||
return self.time.strftime(EXTENDED_TIME_FORMAT)
|
||||
|
||||
|
||||
class AdjustedClock:
|
||||
def __init__(self, emitter: Emitter) -> None:
|
||||
self.emitter = emitter
|
||||
self.emitter.connect("target_time_changed", self._on_target_time_changed)
|
||||
self.start_time = datetime.now()
|
||||
|
||||
def _on_target_time_changed(self, emitter: Emitter, time: timedelta) -> None:
|
||||
self.start_time = datetime.now()
|
||||
adjusted = self.start_time + time
|
||||
self.emitter.emit(self.signal, adjusted)
|
||||
self.emitter.emit("adjusted_local_time_changed", adjusted)
|
||||
|
||||
def get_time(self) -> str:
|
||||
return self.start_time.strftime(EXTENDED_TIME_FORMAT)
|
||||
|
||||
|
||||
class RemainderClock(GenericAdjustedClock):
|
||||
def __init__(self, emitter: Emitter) -> None:
|
||||
super().__init__(emitter, signal="remaining_time_changed")
|
||||
self.start_time = datetime.combine(
|
||||
datetime.now(), time(hour=0, minute=0, second=0)
|
||||
)
|
||||
|
||||
|
||||
class AdjustedClock(GenericAdjustedClock):
|
||||
def __init__(self, emitter: Emitter) -> None:
|
||||
super().__init__(emitter, signal="adjusted_local_time_changed")
|
||||
self.start_time = datetime.now()
|
||||
|
||||
|
||||
class VerticalSpinBox(Gtk.SpinButton):
|
||||
def __init__(self, value: int, upper: int) -> None:
|
||||
super().__init__(
|
||||
@@ -300,7 +322,13 @@ class TimePicker(Gtk.Box):
|
||||
return int(self.minute_spin.get_adjustment().get_value())
|
||||
|
||||
def get_time(self) -> time:
|
||||
return time(hour=self.get_hour(), minute=self.get_minute())
|
||||
d = datetime.now()
|
||||
return time(
|
||||
hour=self.get_hour(),
|
||||
minute=self.get_minute(),
|
||||
second=d.second,
|
||||
microsecond=d.microsecond,
|
||||
)
|
||||
|
||||
def set_time(self, hour: int, minute: int) -> None:
|
||||
self.hour_spin.get_adjustment().set_value(hour)
|
||||
@@ -447,8 +475,3 @@ class ServerTimeCalculator(Gtk.ScrolledWindow):
|
||||
for el in time_picker_frame, adjusted_time_frame, disclaimer:
|
||||
outerbox.add(el)
|
||||
self.add(outerbox)
|
||||
|
||||
|
||||
# TEST: write tests with/without live clock increment
|
||||
# FIXME: with accel of (1, 1), a 60min change converts to 55 mins instead of 59/60
|
||||
# FIXME: real time until target time is not zero padded
|
||||
@@ -91,7 +91,6 @@ class ServerDetailsDialog(ServerDialog):
|
||||
column.set_sort_column_id(i)
|
||||
column.set_expand(True)
|
||||
|
||||
|
||||
scrollable_message = Gtk.ScrolledWindow(vexpand=True)
|
||||
desc = Gtk.Label(label=dialogs.server_message, valign=Gtk.Align.START)
|
||||
css.add_class(desc, "server-subheading")
|
||||
@@ -119,14 +118,16 @@ class ServerDetailsDialog(ServerDialog):
|
||||
self.content.reorder_child(calc_button, 2)
|
||||
|
||||
self.scrollable_tree.set_size_request(700, 250)
|
||||
self.calc = ServerTimeCalculator(Time(details.gametime, details.day_accel, details.night_accel))
|
||||
self.calc = ServerTimeCalculator(
|
||||
Time(details.gametime, details.day_accel, details.night_accel)
|
||||
)
|
||||
self.stack.add_named(self.calc, "CALCULATOR")
|
||||
|
||||
self.connect("map", self._on_map)
|
||||
self.show_all()
|
||||
|
||||
def _on_map(self, dialog: Self) -> None:
|
||||
if (widget := self.get_widget_for_response(Gtk.ResponseType.OK)):
|
||||
if widget := self.get_widget_for_response(Gtk.ResponseType.OK):
|
||||
widget.grab_focus()
|
||||
|
||||
def _on_calc_pressed(self, button: Gtk.Button) -> None:
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
import pytest
|
||||
import re
|
||||
|
||||
from dzgui.api.servers import Details, Record, get_details
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def details() -> Details:
|
||||
"""
|
||||
Static official server, metadata is expected to be invariate
|
||||
"""
|
||||
r = Record("85.190.157.111", 10400, 10401)
|
||||
return get_details(r)
|
||||
|
||||
|
||||
def test_invalid_server() -> None:
|
||||
r = Record("127.0.0.1", 10400, 10401)
|
||||
assert get_details(r) is None
|
||||
|
||||
|
||||
@pytest.mark.parametrize("key, expect", [("day_accel", 2.3), ("night_accel", 6.8)])
|
||||
def test_time_accel(details, key, expect) -> None:
|
||||
assert getattr(details, key) == expect
|
||||
|
||||
|
||||
def test_gametime(details) -> None:
|
||||
time_reg = r"^(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9]$)"
|
||||
match = re.match(time_reg, details.gametime)
|
||||
assert match is not None
|
||||
|
||||
|
||||
def test_metadata(details) -> None:
|
||||
for row in details.data:
|
||||
label, value = row
|
||||
match label:
|
||||
case "Password":
|
||||
assert value == "Disabled"
|
||||
case "Platform":
|
||||
assert value == "Windows"
|
||||
case "Battleye":
|
||||
assert value == "Enabled"
|
||||
case "Valve Anti-Cheat":
|
||||
assert value == "Enabled"
|
||||
case _:
|
||||
pass
|
||||
+3
-1
@@ -1,7 +1,9 @@
|
||||
import re
|
||||
|
||||
from dzgui.model.proxy_model import DAY_REG, NIGHT_REG
|
||||
import pytest
|
||||
|
||||
pytestmark = pytest.mark.FOO
|
||||
|
||||
def iterate(h: str, r: str) -> None:
|
||||
for m in range(60):
|
||||
@@ -18,6 +20,6 @@ def test_day() -> None:
|
||||
|
||||
def test_night() -> None:
|
||||
for h in range(24):
|
||||
if 6 < h < 17:
|
||||
if 5 < h < 18:
|
||||
continue
|
||||
iterate(h, NIGHT_REG)
|
||||
Reference in new issue
Block a user