change: consolidate query methods

This commit is contained in:
aclist committed 2026-05-04 04:52:07 +09:00
1 parent e3e507598b
commit 29082ea1c1
7 files changed
+75 -41

No files matched your search

+3 -3
View File
@@ -442,7 +442,7 @@ def get_rules(record: Record) -> list["DayzMod"]:
return [] return []
def query_by_id(addr: str, key: str) -> Optional[dict]: def query_by_id(addr: str, key: str) -> dict[Any] | None:
""" """
Used with numeric Battlemetrics IDs Used with numeric Battlemetrics IDs
""" """
@@ -469,12 +469,12 @@ def query_playercount(record: Record) -> tuple[int, int] | None:
return None return None
def query_by_ip(addr: str) -> Optional[dict]: def query_by_ip(addr: str) -> dict[Any] | None:
record = short_ip_to_record(addr) record = short_ip_to_record(addr)
return query_by_record(record) return query_by_record(record)
def query_by_record(record: Record) -> Optional[dict]: def query_by_record(record: Record) -> dict[Any] | None:
try: try:
return query_direct(record.ip, record.qport) return query_direct(record.ip, record.qport)
except Exception as e: except Exception as e:
+1
View File
@@ -179,6 +179,7 @@ class ContextMenuGroup(Enum):
Groupings of context menu items Groupings of context menu items
""" """
SERVER_MOD = (ContextMenu.OPEN_WORKSHOP,)
MOD = (ContextMenu.OPEN_WORKSHOP, ContextMenu.DELETE_MOD) MOD = (ContextMenu.OPEN_WORKSHOP, ContextMenu.DELETE_MOD)
LOG = (ContextMenu.COPY_LOG_CLIPBOARD,) LOG = (ContextMenu.COPY_LOG_CLIPBOARD,)
SERVER_BROWSER = ( SERVER_BROWSER = (
+9 -18
View File
@@ -1,4 +1,4 @@
from typing import TYPE_CHECKING from typing import Any, TYPE_CHECKING
import dzgui.api.servers as Servers import dzgui.api.servers as Servers
@@ -27,37 +27,28 @@ class ConnectionManager:
@call_on_thread(dialog.querying) @call_on_thread(dialog.querying)
def connect_by_id(self, addr: str, key: str) -> None: def connect_by_id(self, addr: str, key: str) -> None:
res = Servers.query_by_id(addr, key) res = Servers.query_by_id(addr, key)
if res is None: self.prepare_connection(res)
self.thread_man.set_cleanup_func(
StoredFunc(self._server_timeout), destroy_first=True
)
# TODO: resolve real ip
print("UNIMPLEMENTED: get rules")
print(res)
@call_on_thread(dialog.querying) @call_on_thread(dialog.querying)
def connect_by_ip(self, addr: str) -> None: def connect_by_ip(self, addr: str) -> None:
res = Servers.query_by_ip(addr) res = Servers.query_by_ip(addr)
if res is None: self.prepare_connection(res)
self.thread_man.set_cleanup_func(
StoredFunc(self._server_timeout), destroy_first=True
)
# TODO: resolve real ip
print("UNIMPLEMENTED: get rules")
print(res)
@call_on_thread(dialog.querying) @call_on_thread(dialog.querying)
def connect_by_record(self, record: Servers.Record) -> None: def connect_by_record(self, record: Servers.Record) -> None:
res = Servers.query_by_record(record) res = Servers.query_by_record(record)
self.prepare_connection(res)
def prepare_connection(self, res: dict[Any] | None) -> None:
if res is None: if res is None:
self.thread_man.set_cleanup_func( self.thread_man.set_cleanup_func(
StoredFunc(self._server_timeout), destroy_first=True StoredFunc(self._server_timeout), destroy_first=True
) )
return
# TODO: proper error handling (currently returns empty list) record = Servers.response_to_record(res)
try: try:
# TODO: proper error handling (currently returns empty list)
mods = self.query_modlist(record) mods = self.query_modlist(record)
except Exception: except Exception:
self.thread_man.set_cleanup_func( self.thread_man.set_cleanup_func(
+8 -2
View File
@@ -11,6 +11,7 @@ from dzgui.views.dialogs.note import NoteDialog
from dzgui.views.trees.tree_mods import ModTreeView from dzgui.views.trees.tree_mods import ModTreeView
from dzgui.views.trees.tree_log import LogTreeView from dzgui.views.trees.tree_log import LogTreeView
from dzgui.views.trees.tree_servers import ServerTreeView from dzgui.views.trees.tree_servers import ServerTreeView
from dzgui.views.trees.tree_server_mods import ServerModTreeView
gi.require_version("Gtk", "3.0") gi.require_version("Gtk", "3.0")
@@ -26,7 +27,7 @@ if TYPE_CHECKING:
class ContextMenuManager: class ContextMenuManager:
def __init__( def __init__(
self, self,
treeview: LogTreeView | ModTreeView | ServerTreeView, treeview: LogTreeView | ModTreeView | ServerTreeView | ServerModTreeView,
controller: "Controller", controller: "Controller",
) -> None: ) -> None:
self.controller = controller self.controller = controller
@@ -83,6 +84,11 @@ class ContextMenuManager:
case ContextMenu.COPY_LOG_CLIPBOARD: case ContextMenu.COPY_LOG_CLIPBOARD:
self.copy_log() self.copy_log()
if isinstance(self.treeview, ServerModTreeView):
match action:
case ContextMenu.OPEN_WORKSHOP:
self.open_mod_page()
def copy_server_ip(self) -> None: def copy_server_ip(self) -> None:
if not isinstance(self.treeview, ServerTreeView): if not isinstance(self.treeview, ServerTreeView):
return return
@@ -96,7 +102,7 @@ class ContextMenuManager:
copy_clipboard(name) copy_clipboard(name)
def open_mod_page(self) -> None: def open_mod_page(self) -> None:
if not isinstance(self.treeview, ModTreeView): if not hasattr(self.treeview, "get_selected_mod"):
return return
mod = self.treeview.get_selected_mod() mod = self.treeview.get_selected_mod()
cmd = self.controller.query_config(Preferences.CLIENT) cmd = self.controller.query_config(Preferences.CLIENT)
+5 -2
View File
@@ -288,6 +288,9 @@ class ServerModelManager:
self.emitter.emit("already_saved_server") self.emitter.emit("already_saved_server")
return return
config_man.add_saved_server(fqip) config_man.add_saved_server(fqip)
# 2026-05-04
# TODO: this is valid if saved servers tab is already open,
# but not if app was just booted
if proxy_man.has_control_model() is False: if proxy_man.has_control_model() is False:
self._get_proxy_man().push(records) self._get_proxy_man().push(records)
else: else:
@@ -373,8 +376,8 @@ class ServerModelManager:
if self.preserve_on_fail is False: if self.preserve_on_fail is False:
# CHORE: test if maps are cleared on failure # CHORE: test if maps are cleared on failure
self.tv.set_model(None) self.tv.set_model(None)
#filter_man = self.tv.get_filter_man() # filter_man = self.tv.get_filter_man()
#filter_man.set_unique_maps([]) # filter_man.set_unique_maps([])
# TODO: emit signal to not disable widget sensitivity # TODO: emit signal to not disable widget sensitivity
# TODO: distinguish signals, e.g. "servers_failed_to_load", "servers_loaded_empty" # TODO: distinguish signals, e.g. "servers_failed_to_load", "servers_loaded_empty"
+23 -5
View File
@@ -9,7 +9,7 @@ from dzgui.const.constants import (
) )
from dayzquery import DayzMod from dayzquery import DayzMod
from dzgui.views.components.frame import HeadingFrame from dzgui.views.components.frame import HeadingFrame
from dzgui.views.trees.tree_server_mods import ServerModTree from dzgui.views.trees.tree_server_mods import ServerModTreeView
import gi import gi
@@ -42,7 +42,6 @@ class PreConnectionAssistant(Gtk.Box):
self.controller.register_widget("preconnect", self) self.controller.register_widget("preconnect", self)
# TODO: strings # TODO: strings
self.back = Gtk.Button(label="Back") self.back = Gtk.Button(label="Back")
# TODO: dynamic button text if no mods needed # TODO: dynamic button text if no mods needed
@@ -58,13 +57,22 @@ class PreConnectionAssistant(Gtk.Box):
# set visibility if warnings > 1 # set visibility if warnings > 1
frame = HeadingFrame(Gtk.Label(label="ITEM ONE"), "Warnings") frame = HeadingFrame(Gtk.Label(label="ITEM ONE"), "Warnings")
self.tree = ServerModTree(self.controller) self.tree = ServerModTreeView(self.controller)
self.scrolled = Gtk.ScrolledWindow() self.scrolled = Gtk.ScrolledWindow()
self.scrolled.add(self.tree) self.scrolled.add(self.tree)
self.scrolled.set_size_request(600, 400) self.scrolled.set_size_request(600, 400)
self.add(self.scrolled) self.tree_frame = HeadingFrame(self.scrolled, "Mods")
# TODO: should form a part of tree_frame above
self.mod_count = Gtk.Label(label="")
self.title = Gtk.Label(label="")
self.add(self.title)
self.add(self.tree_frame)
self.add(self.mod_count)
self.add(frame) self.add(frame)
self.add(self.button_box) self.add(self.button_box)
@@ -78,8 +86,17 @@ class PreConnectionAssistant(Gtk.Box):
self.controller.open_page(page) self.controller.open_page(page)
def populate(self, res: dict[Any], mods: list["DayzMod"]) -> None: def populate(self, res: dict[Any], mods: list["DayzMod"]) -> None:
# TODO: embed tree from dialog, but not dialog itself
self.tree.populate(mods) self.tree.populate(mods)
total = len(mods)
self.title.set_text(f"Connecting to {res["name"]}")
if total < 1:
self.tree.set_visible(False)
self.mod_count.set_visible(False)
return
else:
self.tree.set_visible(True)
self.mod_count.set_visible(True)
self.mod_count.set_text(f"Total mods: {str(total)}")
# steam_path = self.controller.get_config_man().lookup(Preferences.DEFAULT) # steam_path = self.controller.get_config_man().lookup(Preferences.DEFAULT)
# dayz_version = PeFile.get_pretty_version(steam_path, APPID_DAYZ) # dayz_version = PeFile.get_pretty_version(steam_path, APPID_DAYZ)
# dayz_exp_version = PeFile.get_pretty_version(steam_path, APPID_DAYZ_EXP) # dayz_exp_version = PeFile.get_pretty_version(steam_path, APPID_DAYZ_EXP)
@@ -94,3 +111,4 @@ class PreConnectionAssistant(Gtk.Box):
# TODO: icon for mod signature issue # TODO: icon for mod signature issue
# or "Update mods and connect" # or "Update mods and connect"
# also handle servers with no mods; do not show tree
+26 -11
View File
@@ -1,5 +1,6 @@
from dzgui.const.enum import ContextMenuGroup
from dzgui.model.model_factory import ModelFactory from dzgui.model.model_factory import ModelFactory
from dzgui.views.mixins.cursor_mixin import CursorMixin from dzgui.views.mixins.context_mixin import ContextMixin
from dzgui.views.trees.tree_base import TreeView from dzgui.views.trees.tree_base import TreeView
from dzgui.util import strings from dzgui.util import strings
@@ -14,22 +15,19 @@ if TYPE_CHECKING:
from dzgui.controllers.mc import Controller from dzgui.controllers.mc import Controller
class ServerModTree(TreeView): # type: ignore class ServerModTreeView(ContextMixin, TreeView): # type: ignore
def __init__(self, controller: "Controller") -> None: def __init__(self, controller: "Controller") -> None:
super().__init__(controller) super().__init__(controller, menu=ContextMenuGroup.SERVER_MOD)
# self.view = TreeView(controller)
self.mod_store = ModelFactory().make_server_mod_store() self.mod_store = ModelFactory().make_server_mod_store()
self.set_fixed_height_mode(True) self.set_fixed_height_mode(True)
self.set_headers_visible(True) self.set_headers_visible(True)
self.set_model(self.mod_store) self.set_model(self.mod_store)
# self.scrollable_tree = Gtk.ScrolledWindow() self.connect("button-press-event", self.present_menu)
# self.scrollable_tree.add(self.view) self.connect("key-press-event", self.present_menu)
# self.scrollable_tree.set_size_request(700, 400) self.connect("row-activated", self._on_row_activated)
# self.view.connect("row-activated", self._on_row_activated)
for i, column_title in enumerate(strings.server_mod_cols): for i, column_title in enumerate(strings.server_mod_cols):
renderer = Gtk.CellRendererText(ellipsize=Pango.EllipsizeMode.END) renderer = Gtk.CellRendererText(ellipsize=Pango.EllipsizeMode.END)
@@ -46,9 +44,26 @@ class ServerModTree(TreeView): # type: ignore
case _: case _:
pass pass
# mod_count = len(mods) # TODO: could be problematic if user downloads mods out of band
# self._set_footer(mod_count) def _on_row_activated(
self,
treeview: Gtk.TreeView,
path: Gtk.TreePath,
col: Gtk.TreeViewColumn,
) -> None:
mod = self.get_value_at_index(1)
self.controller.open_workshop_page(mod)
def get_selected_mod(self) -> str:
path = self.get_focused_row_path()
model = self.get_model()
tree_iter = model.get_iter(path)
mod = model.get(tree_iter, 1)[0]
return str(mod)
def populate(self, mods: list[list[str]]) -> None: def populate(self, mods: list[list[str]]) -> None:
self.mod_store.clear()
for mod in mods: for mod in mods:
self.mod_store.append(mod) self.mod_store.append(mod)
path = Gtk.TreePath.new_from_indices([0])
self.set_cursor(path)