feat: add/connect by record or str

This commit is contained in:
aclist 2026-03-01 00:16:43 +09:00
parent 2fa51c80f4
commit e568814a11
6 changed files with 63 additions and 32 deletions

View File

@ -471,12 +471,27 @@ def query_by_id(addr: str, key: str) -> Optional[dict]:
def query_by_ip(addr: 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: try:
record = addr.split(":") return query_direct(record.ip, record.qport)
# TODO: create a Record object
ip, qport = record[0], record[1]
res = query_direct(ip, int(qport))
except Exception as e: except Exception as e:
logger.critical(e) logger.critical(e)
return None 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]))

View File

@ -2,11 +2,10 @@ import inspect
import logging import logging
import shutil import shutil
import threading import threading
import traceback
from functools import wraps from functools import wraps
from pathlib import Path from pathlib import Path
from typing import Any, Callable, TYPE_CHECKING from typing import Any, Callable, Union, TYPE_CHECKING
from warnings import deprecated from warnings import deprecated
import dzgui.api.pefile as PeFile import dzgui.api.pefile as PeFile
@ -25,8 +24,6 @@ from dzgui.const.constants import (
APPID_DAYZ, APPID_DAYZ,
APPID_DAYZ_EXP, APPID_DAYZ_EXP,
HEX_RED, HEX_RED,
WINDOW_DEFAULT_X,
WINDOW_DEFAULT_Y,
) )
from dzgui.const.enum import ( from dzgui.const.enum import (
FilterMode, FilterMode,
@ -36,7 +33,6 @@ from dzgui.const.enum import (
ContextMenu, ContextMenu,
) )
from dzgui.config import update
from dzgui.config.query import lookup from dzgui.config.query import lookup
from dzgui.config.userprefs import UserPrefs from dzgui.config.userprefs import UserPrefs
from dzgui.controllers.emitter import Emitter 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.servers import ServerModelManager
from dzgui.model.model_factory import ModelFactory from dzgui.model.model_factory import ModelFactory
from dzgui.util import strings from dzgui.util import strings
from dzgui.util._json import read_json, write_json
from dzgui.util.diag import write_diagnostic from dzgui.util.diag import write_diagnostic
from dzgui.util.format import format_mods, format_player_count from dzgui.util.format import format_mods, format_player_count
from dzgui.util.localize import number from dzgui.util.localize import number
@ -63,6 +58,7 @@ from gi.repository import Gtk, Gdk, GLib, GObject # noqa E402
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
if TYPE_CHECKING: if TYPE_CHECKING:
from dzgui.api.servers import Record
from dzgui.const.enum import ServerTab from dzgui.const.enum import ServerTab
from dzgui.managers.filter_man import FilterManager from dzgui.managers.filter_man import FilterManager
from dzgui.util.dist import Haversine from dzgui.util.dist import Haversine
@ -590,7 +586,7 @@ class Controller(GObject.GObject):
return treeview.get_model() is not None return treeview.get_model() is not None
def _on_check_toggled(self, emitter: Emitter, label: str, state: bool) -> 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 = self.get_filter_man()
filter_man.set_filter(label, state) filter_man.set_filter(label, state)
@ -620,17 +616,21 @@ class Controller(GObject.GObject):
def get_config_man(self) -> ConfigManager: def get_config_man(self) -> ConfigManager:
return self.config_man 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() saved_tree = self.get_servers().get_saved()
if addr.isdigit(): ServerModelManager(self, saved_tree).add_by_str(addr)
ServerModelManager(self, saved).add_by_id(addr)
else:
ServerModelManager(self, saved).add_by_ip(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(): if addr.isdigit():
config_man = self.get_config_man() config_man = self.get_config_man()
key = config_man.lookup(Preferences.BM) key = config_man.lookup(Preferences.BM)
ConnectionManager(self).connect_by_id(addr, key) ConnectionManager(self).connect_by_id(addr, key)
else: else:
ConnectionManager(self).connect_by_ip(addr) ConnectionManager(self).connect_by_ip(addr)
def connect_by_record(self, record: "Record") -> None:
ConnectionManager(self).connect_by_record(record)

View File

@ -26,8 +26,7 @@ class ConnectionManager:
res = Servers.query_by_id(addr, key) res = Servers.query_by_id(addr, key)
if res is None: if res is None:
self.thread_man.set_cleanup_func(StoredFunc(self._connection_failure)) self.thread_man.set_cleanup_func(StoredFunc(self._connection_failure))
# TODO: add to history if successful
print("CONNECT")
print(res) print(res)
@call_on_thread(dialog.querying) @call_on_thread(dialog.querying)
@ -35,8 +34,16 @@ class ConnectionManager:
res = Servers.query_by_ip(addr) res = Servers.query_by_ip(addr)
if res is None: if res is None:
self.thread_man.set_cleanup_func(StoredFunc(self._connection_failure)) 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 # TODO: add to history if successful
print("CONNECT")
print(res) print(res)
def _connection_failure(self) -> None: def _connection_failure(self) -> None:

View File

@ -1,9 +1,8 @@
import gi import gi
import logging import logging
from typing import Union, TYPE_CHECKING from typing import TYPE_CHECKING
from dzgui.const.enum import ContextMenu, Preferences from dzgui.const.enum import ContextMenu, Preferences
from dzgui.managers.connection import ConnectionManager
from dzgui.managers.thread_man import ThreadingManager from dzgui.managers.thread_man import ThreadingManager
from dzgui.model.servers import ServerModelManager from dzgui.model.servers import ServerModelManager
from dzgui.util import strings from dzgui.util import strings
@ -60,12 +59,12 @@ class ContextMenuManager:
# THREADED # THREADED
case ContextMenu.ADD_SERVER: case ContextMenu.ADD_SERVER:
record = self.treeview.get_record_string() record = self.treeview.get_record()
ServerModelManager(self.controller, self.treeview).add_by_ip(record) self.controller.add_by_record(record)
# TODO: update tab with !
case ContextMenu.CONNECT: case ContextMenu.CONNECT:
record = self.treeview.get_record_string() record = self.treeview.get_record()
ConnectionManager(self.controller).connect_by_ip(record) self.controller.connect_by_record(record)
case ContextMenu.REFRESH_PLAYERS: case ContextMenu.REFRESH_PLAYERS:
# get record # get record
# call a2s on thread # call a2s on thread

View File

@ -2,7 +2,7 @@ import logging
import threading import threading
from concurrent.futures import as_completed from concurrent.futures import as_completed
from concurrent.futures import ThreadPoolExecutor from concurrent.futures import ThreadPoolExecutor
from typing import Optional, TYPE_CHECKING from typing import Union, TYPE_CHECKING
import dzgui.api.servers as Servers import dzgui.api.servers as Servers
from dzgui.const.enum import FilterMode, Preferences, ServerTab from dzgui.const.enum import FilterMode, Preferences, ServerTab
@ -192,13 +192,23 @@ class ServerModelManager:
config_man = self.controller.get_config_man() config_man = self.controller.get_config_man()
key = config_man.lookup(Preferences.BM) key = config_man.lookup(Preferences.BM)
res = Servers.query_by_id(addr, key) res = Servers.query_by_id(addr, key)
self.parse_single_record(res) self._parse_single_record(res)
@call_on_thread(dialog.querying) @call_on_thread(dialog.querying)
def add_by_ip(self, addr: str) -> None: def add_by_ip(self, addr: str) -> None:
res = Servers.query_by_ip(addr) res = Servers.query_by_ip(addr)
self._parse_single_record(res) 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: def _parse_single_record(self, response: dict) -> None:
if response is None: if response is None:
self.thread_man.set_cleanup_func(StoredFunc(self._cleanup_on_failure)) self.thread_man.set_cleanup_func(StoredFunc(self._cleanup_on_failure))

View File

@ -204,11 +204,11 @@ class AddPanel(Gtk.Frame):
def _on_connect_clicked(self, button: Gtk.Button) -> None: def _on_connect_clicked(self, button: Gtk.Button) -> None:
addr = self.entry.get_text() addr = self.entry.get_text()
self.controller.connect_server(addr) self.controller.connect_by_str(addr)
def _add_server(self) -> None: def _add_server(self) -> None:
addr = self.entry.get_text() addr = self.entry.get_text()
self.controller.add_server(addr) self.controller.add_by_str(addr)
def _on_activate(self, entry: Gtk.Entry) -> None: def _on_activate(self, entry: Gtk.Entry) -> None:
# NOTE: default action is to add a record, not connect # NOTE: default action is to add a record, not connect