mirror of
https://github.com/EDCD/EDMarketConnector.git
synced 2025-05-05 18:01:03 +03:00
[2406] Refactor Non-Plugin Modules
This commit is contained in:
parent
e31de6a999
commit
08bfbe1582
23
EDMC.py
23
EDMC.py
@ -10,12 +10,12 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import json
|
import json
|
||||||
import locale
|
|
||||||
import os
|
import os
|
||||||
import queue
|
import queue
|
||||||
import sys
|
import sys
|
||||||
from time import sleep, time
|
from time import sleep, time
|
||||||
from typing import TYPE_CHECKING, Any
|
from typing import TYPE_CHECKING, Any
|
||||||
|
from common_utils import log_locale, SERVER_RETRY
|
||||||
|
|
||||||
# isort: off
|
# isort: off
|
||||||
os.environ["EDMC_NO_UI"] = "1"
|
os.environ["EDMC_NO_UI"] = "1"
|
||||||
@ -52,31 +52,12 @@ import eddn # noqa: E402
|
|||||||
|
|
||||||
|
|
||||||
# isort: on
|
# isort: on
|
||||||
|
|
||||||
|
|
||||||
def log_locale(prefix: str) -> None:
|
|
||||||
"""Log the current state of locale settings."""
|
|
||||||
logger.debug(f'''Locale: {prefix}
|
|
||||||
Locale LC_COLLATE: {locale.getlocale(locale.LC_COLLATE)}
|
|
||||||
Locale LC_CTYPE: {locale.getlocale(locale.LC_CTYPE)}
|
|
||||||
Locale LC_MONETARY: {locale.getlocale(locale.LC_MONETARY)}
|
|
||||||
Locale LC_NUMERIC: {locale.getlocale(locale.LC_NUMERIC)}
|
|
||||||
Locale LC_TIME: {locale.getlocale(locale.LC_TIME)}'''
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
tr.install_dummy()
|
tr.install_dummy()
|
||||||
|
|
||||||
SERVER_RETRY = 5 # retry pause for Companion servers [s]
|
|
||||||
EXIT_SUCCESS, EXIT_SERVER, EXIT_CREDENTIALS, EXIT_VERIFICATION, EXIT_LAGGING, EXIT_SYS_ERR, EXIT_ARGS, \
|
EXIT_SUCCESS, EXIT_SERVER, EXIT_CREDENTIALS, EXIT_VERIFICATION, EXIT_LAGGING, EXIT_SYS_ERR, EXIT_ARGS, \
|
||||||
EXIT_JOURNAL_READ_ERR, EXIT_COMMANDER_UNKNOWN = range(9)
|
EXIT_JOURNAL_READ_ERR, EXIT_COMMANDER_UNKNOWN = range(9)
|
||||||
|
|
||||||
|
|
||||||
def versioncmp(versionstring) -> list:
|
|
||||||
"""Quick and dirty version comparison assuming "strict" numeric only version numbers."""
|
|
||||||
return list(map(int, versionstring.split('.')))
|
|
||||||
|
|
||||||
|
|
||||||
def deep_get(target: dict | companion.CAPIData, *args: str, default=None) -> Any:
|
def deep_get(target: dict | companion.CAPIData, *args: str, default=None) -> Any:
|
||||||
"""
|
"""
|
||||||
Walk into a dict and return the specified deep value.
|
Walk into a dict and return the specified deep value.
|
||||||
@ -108,7 +89,7 @@ def deep_get(target: dict | companion.CAPIData, *args: str, default=None) -> Any
|
|||||||
return current
|
return current
|
||||||
|
|
||||||
|
|
||||||
def main(): # noqa: C901, CCR001
|
def main() -> None: # noqa: C901, CCR001
|
||||||
"""Run the main code of the program."""
|
"""Run the main code of the program."""
|
||||||
try:
|
try:
|
||||||
# arg parsing
|
# arg parsing
|
||||||
|
@ -68,6 +68,7 @@ from config import appversion, appversion_nobuild, config, copyright
|
|||||||
from EDMCLogging import edmclogger, logger, logging
|
from EDMCLogging import edmclogger, logger, logging
|
||||||
from journal_lock import JournalLock, JournalLockResult
|
from journal_lock import JournalLock, JournalLockResult
|
||||||
from update import check_for_fdev_updates
|
from update import check_for_fdev_updates
|
||||||
|
from common_utils import log_locale, SERVER_RETRY
|
||||||
|
|
||||||
if __name__ == '__main__': # noqa: C901
|
if __name__ == '__main__': # noqa: C901
|
||||||
# Command-line arguments
|
# Command-line arguments
|
||||||
@ -416,8 +417,6 @@ from monitor import monitor
|
|||||||
from theme import theme
|
from theme import theme
|
||||||
from ttkHyperlinkLabel import HyperlinkLabel, SHIPYARD_HTML_TEMPLATE
|
from ttkHyperlinkLabel import HyperlinkLabel, SHIPYARD_HTML_TEMPLATE
|
||||||
|
|
||||||
SERVER_RETRY = 5 # retry pause for Companion servers [s]
|
|
||||||
|
|
||||||
|
|
||||||
class AppWindow:
|
class AppWindow:
|
||||||
"""Define the main application window."""
|
"""Define the main application window."""
|
||||||
@ -1981,17 +1980,6 @@ def test_logging() -> None:
|
|||||||
logger.debug('Test from EDMarketConnector.py top-level test_logging()')
|
logger.debug('Test from EDMarketConnector.py top-level test_logging()')
|
||||||
|
|
||||||
|
|
||||||
def log_locale(prefix: str) -> None:
|
|
||||||
"""Log all of the current local settings."""
|
|
||||||
logger.debug(f'''Locale: {prefix}
|
|
||||||
Locale LC_COLLATE: {locale.getlocale(locale.LC_COLLATE)}
|
|
||||||
Locale LC_CTYPE: {locale.getlocale(locale.LC_CTYPE)}
|
|
||||||
Locale LC_MONETARY: {locale.getlocale(locale.LC_MONETARY)}
|
|
||||||
Locale LC_NUMERIC: {locale.getlocale(locale.LC_NUMERIC)}
|
|
||||||
Locale LC_TIME: {locale.getlocale(locale.LC_TIME)}'''
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def setup_killswitches(filename: str | None):
|
def setup_killswitches(filename: str | None):
|
||||||
"""Download and setup the main killswitch list."""
|
"""Download and setup the main killswitch list."""
|
||||||
logger.debug('fetching killswitches...')
|
logger.debug('fetching killswitches...')
|
||||||
|
61
common_utils.py
Normal file
61
common_utils.py
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
"""
|
||||||
|
common_utils.py - Common functions and modules.
|
||||||
|
|
||||||
|
Copyright (c) EDCD, All Rights Reserved
|
||||||
|
Licensed under the GNU General Public License.
|
||||||
|
See LICENSE file.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
import sys
|
||||||
|
import locale
|
||||||
|
from typing import TYPE_CHECKING
|
||||||
|
from EDMCLogging import get_main_logger
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
import tkinter as tk
|
||||||
|
logger = get_main_logger()
|
||||||
|
|
||||||
|
SERVER_RETRY = 5 # retry pause for Companion servers [s]
|
||||||
|
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
import ctypes
|
||||||
|
from ctypes.wintypes import POINT, RECT, SIZE, UINT, BOOL
|
||||||
|
import win32gui
|
||||||
|
try:
|
||||||
|
CalculatePopupWindowPosition = ctypes.windll.user32.CalculatePopupWindowPosition
|
||||||
|
CalculatePopupWindowPosition.argtypes = [
|
||||||
|
ctypes.POINTER(POINT), ctypes.POINTER(SIZE), UINT, ctypes.POINTER(RECT), ctypes.POINTER(RECT)
|
||||||
|
]
|
||||||
|
CalculatePopupWindowPosition.restype = BOOL
|
||||||
|
except Exception: # Not supported under Wine 4.0
|
||||||
|
CalculatePopupWindowPosition = None # type: ignore
|
||||||
|
|
||||||
|
|
||||||
|
def ensure_on_screen(self, parent: tk.Tk):
|
||||||
|
"""
|
||||||
|
Ensure a pop-up window is on the printable screen area.
|
||||||
|
|
||||||
|
:param self: The calling class instance of tk.TopLevel
|
||||||
|
:param parent: The parent window
|
||||||
|
"""
|
||||||
|
# Ensure fully on-screen
|
||||||
|
if sys.platform == 'win32' and CalculatePopupWindowPosition:
|
||||||
|
position = RECT()
|
||||||
|
win32gui.GetWindowRect(win32gui.GetParent(self.winfo_id()))
|
||||||
|
if CalculatePopupWindowPosition(
|
||||||
|
POINT(parent.winfo_rootx(), parent.winfo_rooty()),
|
||||||
|
SIZE(position.right - position.left, position.bottom - position.top), # type: ignore
|
||||||
|
0x10000, None, position
|
||||||
|
):
|
||||||
|
self.geometry(f"+{position.left}+{position.top}")
|
||||||
|
|
||||||
|
|
||||||
|
def log_locale(prefix: str) -> None:
|
||||||
|
"""Log all of the current local settings."""
|
||||||
|
logger.debug(f'''Locale: {prefix}
|
||||||
|
Locale LC_COLLATE: {locale.getlocale(locale.LC_COLLATE)}
|
||||||
|
Locale LC_CTYPE: {locale.getlocale(locale.LC_CTYPE)}
|
||||||
|
Locale LC_MONETARY: {locale.getlocale(locale.LC_MONETARY)}
|
||||||
|
Locale LC_NUMERIC: {locale.getlocale(locale.LC_NUMERIC)}
|
||||||
|
Locale LC_TIME: {locale.getlocale(locale.LC_TIME)}'''
|
||||||
|
)
|
12
prefs.py
12
prefs.py
@ -24,6 +24,7 @@ from l10n import translations as tr
|
|||||||
from monitor import monitor
|
from monitor import monitor
|
||||||
from theme import theme
|
from theme import theme
|
||||||
from ttkHyperlinkLabel import HyperlinkLabel
|
from ttkHyperlinkLabel import HyperlinkLabel
|
||||||
|
from common_utils import ensure_on_screen
|
||||||
logger = get_main_logger()
|
logger = get_main_logger()
|
||||||
|
|
||||||
|
|
||||||
@ -187,7 +188,6 @@ if sys.platform == 'win32':
|
|||||||
import ctypes
|
import ctypes
|
||||||
import winreg
|
import winreg
|
||||||
from ctypes.wintypes import LPCWSTR, LPWSTR, MAX_PATH, POINT, RECT, SIZE, UINT, BOOL
|
from ctypes.wintypes import LPCWSTR, LPWSTR, MAX_PATH, POINT, RECT, SIZE, UINT, BOOL
|
||||||
import win32gui
|
|
||||||
import win32api
|
import win32api
|
||||||
is_wine = False
|
is_wine = False
|
||||||
try:
|
try:
|
||||||
@ -307,15 +307,7 @@ class PreferencesDialog(tk.Toplevel):
|
|||||||
self.grab_set()
|
self.grab_set()
|
||||||
|
|
||||||
# Ensure fully on-screen
|
# Ensure fully on-screen
|
||||||
if sys.platform == 'win32' and CalculatePopupWindowPosition:
|
ensure_on_screen(self, parent)
|
||||||
position = RECT()
|
|
||||||
win32gui.GetWindowRect(win32gui.GetParent(self.winfo_id()))
|
|
||||||
if CalculatePopupWindowPosition(
|
|
||||||
POINT(parent.winfo_rootx(), parent.winfo_rooty()),
|
|
||||||
SIZE(position.right - position.left, position.bottom - position.top), # type: ignore
|
|
||||||
0x10000, None, position
|
|
||||||
):
|
|
||||||
self.geometry(f"+{position.left}+{position.top}")
|
|
||||||
|
|
||||||
# Set Log Directory
|
# Set Log Directory
|
||||||
self.logfile_loc = Path(config.app_dir_path / 'logs')
|
self.logfile_loc = Path(config.app_dir_path / 'logs')
|
||||||
|
@ -64,9 +64,19 @@ COMMENT_SAME_LINE_RE = re.compile(r"^.*?(#.*)$")
|
|||||||
COMMENT_OWN_LINE_RE = re.compile(r"^\s*?(#.*)$")
|
COMMENT_OWN_LINE_RE = re.compile(r"^\s*?(#.*)$")
|
||||||
|
|
||||||
|
|
||||||
def extract_comments( # noqa: CCR001
|
def _extract_lang_comment(line: str, pattern: re.Pattern, file: pathlib.Path,
|
||||||
call: ast.Call, lines: list[str], file: pathlib.Path
|
lineno: int) -> tuple[str | None, str | None]:
|
||||||
) -> str | None:
|
"""Attempt to extract a LANG comment from a line using a given regex pattern."""
|
||||||
|
match = pattern.match(line)
|
||||||
|
if match:
|
||||||
|
comment = match.group(1).strip()
|
||||||
|
if comment.startswith("# LANG:"):
|
||||||
|
return comment.replace("# LANG:", "").strip(), None
|
||||||
|
return None, f"Unknown comment for {file}:{lineno} {line}"
|
||||||
|
return None, None
|
||||||
|
|
||||||
|
|
||||||
|
def extract_comments(call: ast.Call, lines: list[str], file: pathlib.Path) -> str | None:
|
||||||
"""
|
"""
|
||||||
Extract comments from source code based on the given call.
|
Extract comments from source code based on the given call.
|
||||||
|
|
||||||
@ -86,29 +96,13 @@ def extract_comments( # noqa: CCR001
|
|||||||
above_comment: str | None = None
|
above_comment: str | None = None
|
||||||
current_line = lines[current].strip()
|
current_line = lines[current].strip()
|
||||||
current_comment: str | None = None
|
current_comment: str | None = None
|
||||||
|
|
||||||
bad_comment: str | None = None
|
bad_comment: str | None = None
|
||||||
if above_line is not None:
|
|
||||||
match = COMMENT_OWN_LINE_RE.match(above_line)
|
|
||||||
if match:
|
|
||||||
above_comment = match.group(1).strip()
|
|
||||||
if not above_comment.startswith("# LANG:"):
|
|
||||||
bad_comment = f"Unknown comment for {file}:{call.lineno} {above_line}"
|
|
||||||
above_comment = None
|
|
||||||
|
|
||||||
else:
|
if above_line:
|
||||||
above_comment = above_comment.replace("# LANG:", "").strip()
|
above_comment, bad_comment = _extract_lang_comment(above_line, COMMENT_OWN_LINE_RE, file, call.lineno)
|
||||||
|
|
||||||
if current_line is not None:
|
if current_line:
|
||||||
match = COMMENT_SAME_LINE_RE.match(current_line)
|
current_comment, bad_comment = _extract_lang_comment(current_line, COMMENT_SAME_LINE_RE, file, call.lineno)
|
||||||
if match:
|
|
||||||
current_comment = match.group(1).strip()
|
|
||||||
if not current_comment.startswith("# LANG:"):
|
|
||||||
bad_comment = f"Unknown comment for {file}:{call.lineno} {current_line}"
|
|
||||||
current_comment = None
|
|
||||||
|
|
||||||
else:
|
|
||||||
current_comment = current_comment.replace("# LANG:", "").strip()
|
|
||||||
|
|
||||||
if current_comment is not None:
|
if current_comment is not None:
|
||||||
out = current_comment
|
out = current_comment
|
||||||
|
28
stats.py
28
stats.py
@ -20,25 +20,10 @@ from edmc_data import ship_name_map
|
|||||||
from hotkey import hotkeymgr
|
from hotkey import hotkeymgr
|
||||||
from l10n import Locale, translations as tr
|
from l10n import Locale, translations as tr
|
||||||
from monitor import monitor
|
from monitor import monitor
|
||||||
|
from common_utils import ensure_on_screen
|
||||||
|
|
||||||
logger = EDMCLogging.get_main_logger()
|
logger = EDMCLogging.get_main_logger()
|
||||||
|
|
||||||
if sys.platform == 'win32':
|
|
||||||
import ctypes
|
|
||||||
from ctypes.wintypes import POINT, RECT, SIZE, UINT, BOOL
|
|
||||||
import win32gui
|
|
||||||
|
|
||||||
try:
|
|
||||||
CalculatePopupWindowPosition = ctypes.windll.user32.CalculatePopupWindowPosition
|
|
||||||
CalculatePopupWindowPosition.argtypes = [
|
|
||||||
ctypes.POINTER(POINT), ctypes.POINTER(SIZE), UINT, ctypes.POINTER(RECT), ctypes.POINTER(RECT)
|
|
||||||
]
|
|
||||||
CalculatePopupWindowPosition.restype = BOOL
|
|
||||||
|
|
||||||
except Exception: # Not supported under Wine 4.0
|
|
||||||
CalculatePopupWindowPosition = None # type: ignore
|
|
||||||
|
|
||||||
|
|
||||||
CR_LINES_START = 1
|
CR_LINES_START = 1
|
||||||
CR_LINES_END = 3
|
CR_LINES_END = 3
|
||||||
RANK_LINES_START = 3
|
RANK_LINES_START = 3
|
||||||
@ -418,16 +403,7 @@ class StatsResults(tk.Toplevel):
|
|||||||
self.grab_set()
|
self.grab_set()
|
||||||
|
|
||||||
# Ensure fully on-screen
|
# Ensure fully on-screen
|
||||||
if sys.platform == 'win32' and CalculatePopupWindowPosition:
|
ensure_on_screen(self, parent)
|
||||||
position = RECT()
|
|
||||||
win32gui.GetWindowRect(win32gui.GetParent(self.winfo_id()))
|
|
||||||
if CalculatePopupWindowPosition(
|
|
||||||
POINT(parent.winfo_rootx(), parent.winfo_rooty()),
|
|
||||||
# - is evidently supported on the C side
|
|
||||||
SIZE(position.right - position.left, position.bottom - position.top), # type: ignore
|
|
||||||
0x10000, None, position
|
|
||||||
):
|
|
||||||
self.geometry(f"+{position.left}+{position.top}")
|
|
||||||
|
|
||||||
def addpage(
|
def addpage(
|
||||||
self, parent, header: list[str] | None = None, align: str | None = None
|
self, parent, header: list[str] | None = None, align: str | None = None
|
||||||
|
Loading…
x
Reference in New Issue
Block a user