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]:
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]))

View File

@ -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)

View File

@ -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:

View File

@ -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

View File

@ -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))

View File

@ -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