From e568814a11b6470a0913afa897273a18f9046ba2 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sun, 1 Mar 2026 00:16:43 +0900 Subject: [PATCH] feat: add/connect by record or str --- dzgui/api/servers.py | 25 +++++++++++++++++++----- dzgui/controllers/mc.py | 26 ++++++++++++------------- dzgui/managers/connection.py | 13 ++++++++++--- dzgui/managers/contextmenu.py | 13 ++++++------- dzgui/model/servers.py | 14 +++++++++++-- dzgui/views/components/connect_panel.py | 4 ++-- 6 files changed, 63 insertions(+), 32 deletions(-) diff --git a/dzgui/api/servers.py b/dzgui/api/servers.py index 568ae75..1181312 100644 --- a/dzgui/api/servers.py +++ b/dzgui/api/servers.py @@ -471,12 +471,27 @@ def query_by_id(addr: str, key: str) -> Optional[dict]: def query_by_ip(addr: str) -> Optional[dict]: + record = short_ip_to_record(addr) + return query_by_record(record) + + +def query_by_record(record: Record) -> Optional[dict]: try: - record = addr.split(":") - # TODO: create a Record object - ip, qport = record[0], record[1] - res = query_direct(ip, int(qport)) + return query_direct(record.ip, record.qport) except Exception as e: logger.critical(e) return None - return res + + +def short_ip_to_record(addr: str) -> Optional[Record]: + r = addr.split(":") + if len(r) != 2: + return None + return Record(r[0], 0, int(r[1])) + + +def fqip_to_record(addr: str) -> Optional[Record]: + r = addr.split(":") + if len(r) != 3: + return None + return Record(r[0], int(r[1]), int(r[2])) diff --git a/dzgui/controllers/mc.py b/dzgui/controllers/mc.py index 3453abc..28aa54b 100644 --- a/dzgui/controllers/mc.py +++ b/dzgui/controllers/mc.py @@ -2,11 +2,10 @@ import inspect import logging import shutil import threading -import traceback from functools import wraps from pathlib import Path -from typing import Any, Callable, TYPE_CHECKING +from typing import Any, Callable, Union, TYPE_CHECKING from warnings import deprecated import dzgui.api.pefile as PeFile @@ -25,8 +24,6 @@ from dzgui.const.constants import ( APPID_DAYZ, APPID_DAYZ_EXP, HEX_RED, - WINDOW_DEFAULT_X, - WINDOW_DEFAULT_Y, ) from dzgui.const.enum import ( FilterMode, @@ -36,7 +33,6 @@ from dzgui.const.enum import ( ContextMenu, ) -from dzgui.config import update from dzgui.config.query import lookup from dzgui.config.userprefs import UserPrefs from dzgui.controllers.emitter import Emitter @@ -47,7 +43,6 @@ from dzgui.model.proxy_model import ProxyModelManager from dzgui.model.servers import ServerModelManager from dzgui.model.model_factory import ModelFactory from dzgui.util import strings -from dzgui.util._json import read_json, write_json from dzgui.util.diag import write_diagnostic from dzgui.util.format import format_mods, format_player_count from dzgui.util.localize import number @@ -63,6 +58,7 @@ from gi.repository import Gtk, Gdk, GLib, GObject # noqa E402 logger = logging.getLogger(__name__) if TYPE_CHECKING: + from dzgui.api.servers import Record from dzgui.const.enum import ServerTab from dzgui.managers.filter_man import FilterManager from dzgui.util.dist import Haversine @@ -590,7 +586,7 @@ class Controller(GObject.GObject): return treeview.get_model() is not None def _on_check_toggled(self, emitter: Emitter, label: str, state: bool) -> None: - print('check toggled, refiltering') + print("check toggled, refiltering") filter_man = self.get_filter_man() filter_man.set_filter(label, state) @@ -620,17 +616,21 @@ class Controller(GObject.GObject): def get_config_man(self) -> ConfigManager: return self.config_man - def add_server(self, addr: str) -> None: + def add_by_str(self, addr: str) -> None: saved_tree = self.get_servers().get_saved() - if addr.isdigit(): - ServerModelManager(self, saved).add_by_id(addr) - else: - ServerModelManager(self, saved).add_by_ip(addr) + ServerModelManager(self, saved_tree).add_by_str(addr) - def connect_server(self, addr: str) -> None: + def add_by_record(self, record: "Record") -> None: + saved_tree = self.get_servers().get_saved() + ServerModelManager(self, saved_tree).add_by_record(record) + + def connect_by_str(self, addr: str) -> None: if addr.isdigit(): config_man = self.get_config_man() key = config_man.lookup(Preferences.BM) ConnectionManager(self).connect_by_id(addr, key) else: ConnectionManager(self).connect_by_ip(addr) + + def connect_by_record(self, record: "Record") -> None: + ConnectionManager(self).connect_by_record(record) diff --git a/dzgui/managers/connection.py b/dzgui/managers/connection.py index b66ee8e..a855f4d 100644 --- a/dzgui/managers/connection.py +++ b/dzgui/managers/connection.py @@ -26,8 +26,7 @@ class ConnectionManager: res = Servers.query_by_id(addr, key) if res is None: self.thread_man.set_cleanup_func(StoredFunc(self._connection_failure)) - # TODO: add to history if successful - print("CONNECT") + print(res) @call_on_thread(dialog.querying) @@ -35,8 +34,16 @@ class ConnectionManager: res = Servers.query_by_ip(addr) if res is None: self.thread_man.set_cleanup_func(StoredFunc(self._connection_failure)) + + print(res) + + @call_on_thread(dialog.querying) + def connect_by_record(self, record: Servers.Record) -> None: + res = Servers.query_by_record(record) + if res is None: + self.thread_man.set_cleanup_func(StoredFunc(self._connection_failure)) + # TODO: add to history if successful - print("CONNECT") print(res) def _connection_failure(self) -> None: diff --git a/dzgui/managers/contextmenu.py b/dzgui/managers/contextmenu.py index 1171b01..d79c25a 100644 --- a/dzgui/managers/contextmenu.py +++ b/dzgui/managers/contextmenu.py @@ -1,9 +1,8 @@ import gi import logging -from typing import Union, TYPE_CHECKING +from typing import TYPE_CHECKING from dzgui.const.enum import ContextMenu, Preferences -from dzgui.managers.connection import ConnectionManager from dzgui.managers.thread_man import ThreadingManager from dzgui.model.servers import ServerModelManager from dzgui.util import strings @@ -60,12 +59,12 @@ class ContextMenuManager: # THREADED case ContextMenu.ADD_SERVER: - record = self.treeview.get_record_string() - ServerModelManager(self.controller, self.treeview).add_by_ip(record) - # TODO: update tab with ! + record = self.treeview.get_record() + self.controller.add_by_record(record) case ContextMenu.CONNECT: - record = self.treeview.get_record_string() - ConnectionManager(self.controller).connect_by_ip(record) + record = self.treeview.get_record() + self.controller.connect_by_record(record) + case ContextMenu.REFRESH_PLAYERS: # get record # call a2s on thread diff --git a/dzgui/model/servers.py b/dzgui/model/servers.py index 0df89f0..14876c3 100644 --- a/dzgui/model/servers.py +++ b/dzgui/model/servers.py @@ -2,7 +2,7 @@ import logging import threading from concurrent.futures import as_completed from concurrent.futures import ThreadPoolExecutor -from typing import Optional, TYPE_CHECKING +from typing import Union, TYPE_CHECKING import dzgui.api.servers as Servers from dzgui.const.enum import FilterMode, Preferences, ServerTab @@ -192,13 +192,23 @@ class ServerModelManager: config_man = self.controller.get_config_man() key = config_man.lookup(Preferences.BM) res = Servers.query_by_id(addr, key) - self.parse_single_record(res) + self._parse_single_record(res) @call_on_thread(dialog.querying) def add_by_ip(self, addr: str) -> None: res = Servers.query_by_ip(addr) self._parse_single_record(res) + def add_by_record(self, record: Servers.Record) -> None: + res = Servers.query_by_record(record) + self._parse_single_record(res) + + def add_by_str(self, addr: str) -> None: + if addr.isdigit(): + self.add_by_id(addr) + else: + self.add_by_ip(addr) + def _parse_single_record(self, response: dict) -> None: if response is None: self.thread_man.set_cleanup_func(StoredFunc(self._cleanup_on_failure)) diff --git a/dzgui/views/components/connect_panel.py b/dzgui/views/components/connect_panel.py index 391e938..a5c06b3 100644 --- a/dzgui/views/components/connect_panel.py +++ b/dzgui/views/components/connect_panel.py @@ -204,11 +204,11 @@ class AddPanel(Gtk.Frame): def _on_connect_clicked(self, button: Gtk.Button) -> None: addr = self.entry.get_text() - self.controller.connect_server(addr) + self.controller.connect_by_str(addr) def _add_server(self) -> None: addr = self.entry.get_text() - self.controller.add_server(addr) + self.controller.add_by_str(addr) def _on_activate(self, entry: Gtk.Entry) -> None: # NOTE: default action is to add a record, not connect