mirror of
https://github.com/aclist/dztui.git
synced 2026-10-31 07:02:50 +01:00
feat: concatenate launch parameters
This commit is contained in:
1 parent
1268c388b0
commit
ed8e79455b
12 files changed
+52
-32
No files matched your search
@@ -462,7 +462,7 @@ def query_playercount(record: Record) -> tuple[int, int] | None:
|
|||||||
|
|
||||||
def query_by_ip(addr: str) -> A2SInfo:
|
def query_by_ip(addr: str) -> A2SInfo:
|
||||||
record = short_ip_to_record(addr)
|
record = short_ip_to_record(addr)
|
||||||
return query_by_record(record)
|
return query_by_record(record, update_gameport=True)
|
||||||
|
|
||||||
def query_by_id(server_id: int, key: str) -> dict[Any] | None:
|
def query_by_id(server_id: int, key: str) -> dict[Any] | None:
|
||||||
"""
|
"""
|
||||||
@@ -472,9 +472,11 @@ def query_by_id(server_id: int, key: str) -> dict[Any] | None:
|
|||||||
return query_by_record(record)
|
return query_by_record(record)
|
||||||
|
|
||||||
|
|
||||||
def query_by_record(record: Record) -> A2SInfo:
|
def query_by_record(record: Record, update_gameport: bool = False) -> A2SInfo:
|
||||||
try:
|
try:
|
||||||
info = a2s.info((record.ip, record.qport), 3.0)
|
info = a2s.info((record.ip, record.qport), 3.0)
|
||||||
|
if update_gameport:
|
||||||
|
record = Record(record.ip, info.port, record.qport)
|
||||||
return A2SInfo(record, info)
|
return A2SInfo(record, info)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning(e)
|
logger.warning(e)
|
||||||
|
|||||||
+6
-2
@@ -14,9 +14,13 @@ logger = logging.getLogger(APP_NAME)
|
|||||||
|
|
||||||
|
|
||||||
def concat_mods(mods: list[str]) -> str:
|
def concat_mods(mods: list[str]) -> str:
|
||||||
|
from dzgui.util.symlink import _hash
|
||||||
|
|
||||||
|
hashes = []
|
||||||
for mod in mods:
|
for mod in mods:
|
||||||
mods[mod] = f"@{mod}"
|
md5sum = _hash(mod)
|
||||||
return ";".join(mods)
|
hashes.append(md5sum)
|
||||||
|
return ";".join(hashes)
|
||||||
|
|
||||||
|
|
||||||
def get_local_signatures(version_file: Path) -> dict[str, int]:
|
def get_local_signatures(version_file: Path) -> dict[str, int]:
|
||||||
|
|||||||
@@ -30,9 +30,10 @@ from dzgui.const.constants import (
|
|||||||
APPID_DAYZ_EXP,
|
APPID_DAYZ_EXP,
|
||||||
APPNAME_DAYZ,
|
APPNAME_DAYZ,
|
||||||
APPNAME_DAYZ_EXP,
|
APPNAME_DAYZ_EXP,
|
||||||
|
DAYZ_BINARY,
|
||||||
)
|
)
|
||||||
from dzgui.const.enum import Preferences
|
from dzgui.const.enum import Preferences
|
||||||
from dzgui.init.proc import foreground, is_dayz_running, is_steam_running
|
from dzgui.init.proc import foreground, is_dayz_running, is_steam_running, is_running
|
||||||
from dzgui.managers.threading import call_on_thread, StoredFunc, ThreadingManager
|
from dzgui.managers.threading import call_on_thread, StoredFunc, ThreadingManager
|
||||||
from dzgui.strings.server_mods import checkmark, resync
|
from dzgui.strings.server_mods import checkmark, resync
|
||||||
from dzgui.util.format import format_mib
|
from dzgui.util.format import format_mib
|
||||||
@@ -241,26 +242,29 @@ class ConnectionManager:
|
|||||||
dialog = ExceptionDialog(self.controller, server_timeout)
|
dialog = ExceptionDialog(self.controller, server_timeout)
|
||||||
dialog.run()
|
dialog.run()
|
||||||
|
|
||||||
|
# TODO: threading
|
||||||
def _connect_steam(self) -> None:
|
def _connect_steam(self) -> None:
|
||||||
print(self.record.ip)
|
|
||||||
print(self.record.gameport)
|
|
||||||
print(self.appid)
|
|
||||||
|
|
||||||
addr = f"{self.record.ip}:{self.record.gameport}"
|
addr = f"{self.record.ip}:{self.record.gameport}"
|
||||||
playername = "test"
|
playername = self.controller.query_config(Preferences.NAME)
|
||||||
proc = connect(addr, self.appid, playername, self.remote_mod_ids)
|
proc = connect(addr, self.appid, playername, self.remote_mod_ids)
|
||||||
# TODO: test returncode
|
# TODO: test returncode
|
||||||
# proc.returncode
|
|
||||||
# TODO: wait for DAYZ_BINARY to load
|
|
||||||
# TODO: add to history file and list store
|
|
||||||
|
|
||||||
@call_on_thread("Waiting for Steam to update mods")
|
# self.thread_man.update_dialog("Waiting for DayZ to launch")
|
||||||
|
# while not is_running(DAYZ_BINARY):
|
||||||
|
# time.sleep(1)
|
||||||
|
# TODO: wait for DAYZ_BINARY to load
|
||||||
|
# on cleanup:
|
||||||
|
# TODO: add to history file and list store
|
||||||
|
# proxy_model.append_to_history()
|
||||||
|
|
||||||
def _update_mods(self, raise_window: bool) -> None:
|
def _update_mods(self, raise_window: bool) -> None:
|
||||||
# NOTE: fast enqueue all mods in auto mode
|
# NOTE: fast enqueue all mods in auto mode
|
||||||
prefs = self.controller.get_prefs()
|
prefs = self.controller.get_prefs()
|
||||||
|
|
||||||
|
# TODO: increment dialog progress message
|
||||||
for title, mod, stamp, size in self.missing_mods:
|
for title, mod, stamp, size in self.missing_mods:
|
||||||
# TODO: boolean cancel button on threadman dialog sets event inside threadman
|
# TODO: boolean cancel button on threadman dialog sets event inside threadman
|
||||||
# TODO: check for early cancel event via sigint
|
# check for early cancel event via sigint
|
||||||
enqueue_mod(mod, self.appid)
|
enqueue_mod(mod, self.appid)
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
|
|
||||||
@@ -282,18 +286,15 @@ class ConnectionManager:
|
|||||||
break
|
break
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
# TODO: update version file
|
|
||||||
update_signatures(self.missing_mods, prefs.paths.version)
|
update_signatures(self.missing_mods, prefs.paths.version)
|
||||||
|
|
||||||
# TODO: get config path or just push steam path directly
|
# TODO: get config path or just push steam path directly
|
||||||
rebuild_symlinks(prefs.paths.config)
|
rebuild_symlinks(prefs.paths.config)
|
||||||
# TODO: update tree checkmarks when finished
|
|
||||||
# TODO: make this internal to preconnect page
|
|
||||||
func = StoredFunc(self.controller.update_status)
|
|
||||||
self.thread_man.set_cleanup_func(func)
|
|
||||||
|
|
||||||
|
@call_on_thread("Waiting for Steam to update mods")
|
||||||
def update_and_connect(self, raise_window: bool) -> None:
|
def update_and_connect(self, raise_window: bool) -> None:
|
||||||
if len(self.missing_mods) > 0:
|
if len(self.missing_mods) > 0:
|
||||||
self._update_mods(raise_window)
|
self._update_mods(raise_window)
|
||||||
else:
|
else:
|
||||||
self._connect_steam()
|
self._connect_steam()
|
||||||
|
func = StoredFunc(self.controller.update_status)
|
||||||
|
self.thread_man.set_cleanup_func(func)
|
||||||
@@ -72,6 +72,9 @@ class ThreadingManager:
|
|||||||
def set_job_count(self, jobs: int) -> None:
|
def set_job_count(self, jobs: int) -> None:
|
||||||
self.jobs = jobs
|
self.jobs = jobs
|
||||||
|
|
||||||
|
def update_dialog(self, msg: str) -> None:
|
||||||
|
GLib.idle_add(lambda: self.wait_dialog.update_text(msg))
|
||||||
|
|
||||||
def increment_dialog(self) -> None:
|
def increment_dialog(self) -> None:
|
||||||
GLib.idle_add(self.wait_dialog.increment)
|
GLib.idle_add(self.wait_dialog.increment)
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ class NewPlayerCount:
|
|||||||
queue: int
|
queue: int
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ServerModelManager:
|
class ServerModelManager:
|
||||||
def __init__(self, controller: "Controller", tv: "ServerTreeView") -> None:
|
def __init__(self, controller: "Controller", tv: "ServerTreeView") -> None:
|
||||||
|
|
||||||
@@ -174,9 +173,11 @@ class ServerModelManager:
|
|||||||
]
|
]
|
||||||
for future in as_completed(futures):
|
for future in as_completed(futures):
|
||||||
res = future.result(timeout=API_TIMEOUT)
|
res = future.result(timeout=API_TIMEOUT)
|
||||||
|
|
||||||
self.thread_man.increment_dialog()
|
self.thread_man.increment_dialog()
|
||||||
# NOTE: failing entries are culled
|
# NOTE: failing entries are culled
|
||||||
if res is None:
|
if res is None:
|
||||||
|
# TODO: log which servers failed
|
||||||
continue
|
continue
|
||||||
servers.append(res)
|
servers.append(res)
|
||||||
if len(servers) == 0:
|
if len(servers) == 0:
|
||||||
@@ -257,9 +258,7 @@ class ServerModelManager:
|
|||||||
proxy_man = self._get_proxy_man()
|
proxy_man = self._get_proxy_man()
|
||||||
proxy_man.update_playercount(self.playercount)
|
proxy_man.update_playercount(self.playercount)
|
||||||
|
|
||||||
def _parse_single_record(
|
def _parse_single_record(self, response: "A2SInfo", delete: bool = False) -> None:
|
||||||
self, response: "A2SInfo", delete: bool = False
|
|
||||||
) -> None:
|
|
||||||
self.preserve_on_fail = True
|
self.preserve_on_fail = True
|
||||||
row = response.as_row()
|
row = response.as_row()
|
||||||
if row is None:
|
if row is None:
|
||||||
@@ -275,7 +274,7 @@ class ServerModelManager:
|
|||||||
proxy_man = self._get_proxy_man()
|
proxy_man = self._get_proxy_man()
|
||||||
config_man = self.controller.get_config_man()
|
config_man = self.controller.get_config_man()
|
||||||
fqip = Servers.response_to_fqip(row)
|
fqip = Servers.response_to_fqip(row)
|
||||||
record = response.get_record() #Servers.response_to_record(row)
|
record = response.get_record() # Servers.response_to_record(row)
|
||||||
|
|
||||||
# TODO: less convoluted
|
# TODO: less convoluted
|
||||||
if delete:
|
if delete:
|
||||||
|
|||||||
+2
-1
@@ -9,6 +9,7 @@ from dzgui.const.enum import NotebookPage
|
|||||||
from dzgui.controllers.emitter import Emitter
|
from dzgui.controllers.emitter import Emitter
|
||||||
from dzgui.controllers.mc import Controller
|
from dzgui.controllers.mc import Controller
|
||||||
from dzgui.util import css, strings
|
from dzgui.util import css, strings
|
||||||
|
from dzgui.util.keys import is_ctrl_mask
|
||||||
from dzgui.views.components.connect_panel import ConnectPanel
|
from dzgui.views.components.connect_panel import ConnectPanel
|
||||||
from dzgui.views.components.crumbs import Breadcrumbs
|
from dzgui.views.components.crumbs import Breadcrumbs
|
||||||
from dzgui.views.components.right_panel import RightPanel
|
from dzgui.views.components.right_panel import RightPanel
|
||||||
@@ -164,7 +165,7 @@ class Notebook(ScrollableMixin, Gtk.Notebook): # type: ignore
|
|||||||
def _on_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> bool:
|
def _on_keypress(self, widget: Gtk.Widget, event: Gdk.EventKey) -> bool:
|
||||||
match event.keyval:
|
match event.keyval:
|
||||||
case Gdk.KEY_Right | Gdk.KEY_l:
|
case Gdk.KEY_Right | Gdk.KEY_l:
|
||||||
if event.state is Gdk.ModifierType.CONTROL_MASK:
|
if is_ctrl_mask(event):
|
||||||
return False
|
return False
|
||||||
MainController.get_emitter().emit("request_button_box_focus")
|
MainController.get_emitter().emit("request_button_box_focus")
|
||||||
return True
|
return True
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ from typing import TYPE_CHECKING
|
|||||||
from dzgui.const.constants import UDP_PORT
|
from dzgui.const.constants import UDP_PORT
|
||||||
from dzgui.model.servers import ServerModelManager
|
from dzgui.model.servers import ServerModelManager
|
||||||
from dzgui.strings import connect_panel
|
from dzgui.strings import connect_panel
|
||||||
|
from dzgui.util.keys import is_ctrl_mask
|
||||||
from dzgui.views.components.buttons import (
|
from dzgui.views.components.buttons import (
|
||||||
AddButton,
|
AddButton,
|
||||||
ClipboardButton,
|
ClipboardButton,
|
||||||
@@ -78,7 +79,7 @@ class LanPanel(Gtk.Frame):
|
|||||||
self.entry.set_sensitive(False)
|
self.entry.set_sensitive(False)
|
||||||
|
|
||||||
def _on_lan_keypress(self, widget: Gtk.Entry, event: Gdk.EventKey) -> bool:
|
def _on_lan_keypress(self, widget: Gtk.Entry, event: Gdk.EventKey) -> bool:
|
||||||
if event.state & Gdk.ModifierType.CONTROL_MASK:
|
if is_ctrl_mask(event):
|
||||||
if event.keyval == Gdk.KEY_d:
|
if event.keyval == Gdk.KEY_d:
|
||||||
self.default_radio.set_active(True)
|
self.default_radio.set_active(True)
|
||||||
self.controller.grab_active_treeview()
|
self.controller.grab_active_treeview()
|
||||||
|
|||||||
@@ -109,6 +109,9 @@ class WaitDialog(GenericDialog):
|
|||||||
else:
|
else:
|
||||||
spinner.start()
|
spinner.start()
|
||||||
|
|
||||||
|
def update_text(self, msg: str) -> None:
|
||||||
|
self.format_secondary_text(msg)
|
||||||
|
|
||||||
def increment(self, msg: str = "") -> None:
|
def increment(self, msg: str = "") -> None:
|
||||||
if msg != "":
|
if msg != "":
|
||||||
self.format_secondary_text(msg)
|
self.format_secondary_text(msg)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import logging
|
|||||||
|
|
||||||
from dzgui.const.constants import APP_NAME
|
from dzgui.const.constants import APP_NAME
|
||||||
from dzgui.const.enum import ContextMenu
|
from dzgui.const.enum import ContextMenu
|
||||||
from dzgui.util.keys import is_navkey
|
from dzgui.util.keys import is_ctrl_mask, is_navkey
|
||||||
from dzgui.util.strings import edit_note
|
from dzgui.util.strings import edit_note
|
||||||
from dzgui.views.trees.tree_base import TreeView
|
from dzgui.views.trees.tree_base import TreeView
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ class ContextMixin(TreeView):
|
|||||||
return False
|
return False
|
||||||
self._process_button_event(event)
|
self._process_button_event(event)
|
||||||
case Gdk.EventType.KEY_PRESS:
|
case Gdk.EventType.KEY_PRESS:
|
||||||
if event.state is not Gdk.ModifierType.CONTROL_MASK:
|
if not is_ctrl_mask(event):
|
||||||
return False
|
return False
|
||||||
if event.keyval is not Gdk.KEY_l:
|
if event.keyval is not Gdk.KEY_l:
|
||||||
return False
|
return False
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
from dzgui.const.enum import CursorPosition
|
from dzgui.const.enum import CursorPosition
|
||||||
from dzgui.const.constants import SEPARATOR
|
from dzgui.const.constants import SEPARATOR
|
||||||
|
from dzgui.util.keys import is_ctrl_mask
|
||||||
|
|
||||||
import gi
|
import gi
|
||||||
|
|
||||||
@@ -19,7 +20,7 @@ class CursorMixin:
|
|||||||
case Gdk.KEY_k:
|
case Gdk.KEY_k:
|
||||||
self._move_cursor(CursorPosition.UP)
|
self._move_cursor(CursorPosition.UP)
|
||||||
case Gdk.KEY_l | Gdk.KEY_Right:
|
case Gdk.KEY_l | Gdk.KEY_Right:
|
||||||
if event.state is Gdk.ModifierType.CONTROL_MASK:
|
if is_ctrl_mask(event):
|
||||||
return
|
return
|
||||||
self.emitter.emit("request_button_box_focus") # type: ignore
|
self.emitter.emit("request_button_box_focus") # type: ignore
|
||||||
case _:
|
case _:
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ from dzgui.const.constants import (
|
|||||||
)
|
)
|
||||||
from dzgui.const.enum import NotebookPage
|
from dzgui.const.enum import NotebookPage
|
||||||
from dzgui.util.css import add_class
|
from dzgui.util.css import add_class
|
||||||
|
from dzgui.util.keys import is_ctrl_mask
|
||||||
from dzgui.util.localize import number
|
from dzgui.util.localize import number
|
||||||
from dzgui.strings.server_mods import checkmark
|
from dzgui.strings.server_mods import checkmark
|
||||||
from dzgui.strings import preconnect
|
from dzgui.strings import preconnect
|
||||||
@@ -211,6 +212,9 @@ class PreConnectionAssistant(Gtk.ScrolledWindow):
|
|||||||
def _on_keypress(self, widget: Self, event: Gdk.EventKey) -> None:
|
def _on_keypress(self, widget: Self, event: Gdk.EventKey) -> None:
|
||||||
if event.keyval == Gdk.KEY_Escape:
|
if event.keyval == Gdk.KEY_Escape:
|
||||||
self.back.emit("clicked")
|
self.back.emit("clicked")
|
||||||
|
if is_ctrl_mask(event):
|
||||||
|
if event.keyval == Gdk.KEY_u:
|
||||||
|
self.ok.emit("clicked")
|
||||||
|
|
||||||
def _on_ok_clicked(self, button: Gtk.Button) -> None:
|
def _on_ok_clicked(self, button: Gtk.Button) -> None:
|
||||||
# TODO: cancel mod downloads
|
# TODO: cancel mod downloads
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ from dzgui.managers.filter import FilterManager
|
|||||||
from dzgui.model.proxy_model import ProxyModelManager
|
from dzgui.model.proxy_model import ProxyModelManager
|
||||||
from dzgui.util import strings
|
from dzgui.util import strings
|
||||||
from dzgui.util.dist import CalcDist
|
from dzgui.util.dist import CalcDist
|
||||||
|
from dzgui.util.keys import is_ctrl_mask
|
||||||
from dzgui.views.mixins.context_mixin import ContextMixin
|
from dzgui.views.mixins.context_mixin import ContextMixin
|
||||||
from typing import Literal, TYPE_CHECKING
|
from typing import Literal, TYPE_CHECKING
|
||||||
|
|
||||||
@@ -229,7 +230,7 @@ class ServerTreeView(ContextMixin, TreeView): # type: ignore
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def _on_server_keypress(self, treeview: Gtk.TreeView, event: Gdk.EventKey) -> None:
|
def _on_server_keypress(self, treeview: Gtk.TreeView, event: Gdk.EventKey) -> None:
|
||||||
if event.state is Gdk.ModifierType.CONTROL_MASK:
|
if is_ctrl_mask(event):
|
||||||
match event.keyval:
|
match event.keyval:
|
||||||
case Gdk.KEY_f:
|
case Gdk.KEY_f:
|
||||||
self.emitter.emit("request_keyword_focus")
|
self.emitter.emit("request_keyword_focus")
|
||||||
|
|||||||
Reference in new issue
Block a user