From 8a58220a661b8b5eafb26aaac5e56833c48735cc Mon Sep 17 00:00:00 2001 From: Athanasius Date: Sun, 27 Nov 2022 12:47:19 +0000 Subject: [PATCH] inara: Send only Live galaxy data after Update 14 * Adds `monitor.is_live_galaxy()` for general use. * Assumes Update 14 starts after 2022-11-29T09:00:00+00:00. That's the currently schedule day, and recently the servers have been down by the time. Likelihood of them coming back *up* quickly seems slim to none. * If we couldn't parse the `gameversion` from Journal using `semantic_version.Version.coerce()` this will fail, and assume we're on the Legacy galaxy. --- monitor.py | 29 +++++++++++++++++++++++++++++ plugins/inara.py | 26 ++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/monitor.py b/monitor.py index 859b2a50..f2a68b95 100644 --- a/monitor.py +++ b/monitor.py @@ -21,6 +21,8 @@ from typing import Tuple if TYPE_CHECKING: import tkinter +import semantic_version + import util_ships from config import config from edmc_data import edmc_suit_shortnames, edmc_suit_symbol_localised @@ -111,6 +113,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below # Context for journal handling self.version: Optional[str] = None + self.version_semantic: Optional[semantic_version.Version] = None self.is_beta = False self.mode: Optional[str] = None self.group: Optional[str] = None @@ -131,6 +134,11 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below self._fcmaterials_retries_remaining = 0 self._last_fcmaterials_journal_timestamp: Optional[float] = None + # For determining Live versus Legacy galaxy. + # The assumption is gameversion will parse via `coerce()` and always + # be >= for Live, and < for Legacy. + self.live_galaxy_base_version = semantic_version.Version('4.0.0') + self.__init_state() def __init_state(self) -> None: @@ -293,6 +301,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below self.currentdir = None self.version = None + self.version_semantic = None self.mode = None self.group = None self.cmdr = None @@ -1677,6 +1686,7 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below self.state['GameVersion'] = entry['gameversion'] self.state['GameBuild'] = entry['build'] self.version = self.state['GameVersion'] + self.version_semantic = semantic_version.Version.coerce(self.state['GameVersion']) self.is_beta = any(v in self.version.lower() for v in ('alpha', 'beta')) # type: ignore except KeyError: if not suppress: @@ -2348,6 +2358,25 @@ class EDLogs(FileSystemEventHandler): # type: ignore # See below self._last_fcmaterials_journal_timestamp = None return file + def is_live_galaxy(self) -> bool: + """ + Indicate if current tracking indicates Live galaxy. + + We assume: + 1) `gameversion` remains something that semantic_verison.Version.coerce() can parse. + 2) Any Live galaxy client reports a version >= the defined base version. + 3) Any Legacy client will always report a version < that base version. + :return: True for Live, False for Legacy or unknown. + """ + # If we don't yet know the version we can't tell, so assume the worst + if self.version_semantic is None: + return False + + if self.version_semantic >= self.live_galaxy_base_version: + return True + + return False + # singleton monitor = EDLogs() diff --git a/plugins/inara.py b/plugins/inara.py index 5c09ec27..1a7cf1f6 100644 --- a/plugins/inara.py +++ b/plugins/inara.py @@ -28,6 +28,7 @@ import time import tkinter as tk from collections import OrderedDict, defaultdict, deque from dataclasses import dataclass +from datetime import datetime, timedelta, timezone from operator import itemgetter from threading import Lock, Thread from typing import TYPE_CHECKING, Any, Callable, Deque, Dict, List, Mapping, NamedTuple, Optional @@ -44,6 +45,7 @@ import timeout_session from companion import CAPIData from config import applongname, appversion, config, debug_senders from EDMCLogging import get_main_logger +from monitor import monitor from ttkHyperlinkLabel import HyperlinkLabel logger = get_main_logger() @@ -88,6 +90,11 @@ class This: def __init__(self): self.session = timeout_session.new_session() self.thread: Thread + self.parent: tk.Tk + + # Handle only sending Live galaxy data + self.legacy_galaxy_last_notified: Optional[datetime] = None + self.lastlocation = None # eventData from the last Commander's Flight Log event self.lastship = None # eventData from the last addCommanderShip or setCommanderShip event @@ -210,6 +217,7 @@ def plugin_start3(plugin_dir: str) -> str: def plugin_app(parent: tk.Tk) -> None: """Plugin UI setup Hook.""" + this.parent = parent this.system_link = parent.children['system'] # system label in main window this.station_link = parent.children['station'] # station label in main window this.system_link.bind_all('<>', update_location) @@ -361,6 +369,24 @@ def journal_entry( # noqa: C901, CCR001 :return: str - empty if no error, else error string. """ + if not monitor.is_live_galaxy(): + # This only applies after Update 14, which as of 2022-11-27 is scheduled + # for 2022-11-29, with the game servers presumably being down around + # 09:00 + if datetime.now(timezone.utc) >= datetime.fromisoformat("2022-11-27T09:00:00+00:00"): + # Update 14 ETA has passed, so perform the check + if ( + this.legacy_galaxy_last_notified is None + or (datetime.now(timezone.utc) - this.legacy_galaxy_last_notified) > timedelta(seconds=300) + ): + # LANG: The Inara API only accepts Live galaxy data, not Legacy galaxy data + logger.info(_("Inara only accepts Live galaxy data")) + # this.parent.children['status']['text'] = + this.legacy_galaxy_last_notified = datetime.now(timezone.utc) + return _("Inara only accepts Live galaxy data") + + return '' + should_return, new_entry = killswitch.check_killswitch('plugins.inara.journal', entry, logger) if should_return: plug.show_error(_('Inara disabled. See Log.')) # LANG: INARA support disabled via killswitch