mirror of
https://github.com/EDCD/EDMarketConnector.git
synced 2025-05-03 00:41:32 +03:00
191 lines
6.2 KiB
Python
191 lines
6.2 KiB
Python
"""
|
||
common_coreutils.py - Common Plugin Functions.
|
||
|
||
Copyright (c) EDCD, All Rights Reserved
|
||
Licensed under the GNU General Public License.
|
||
See LICENSE file.
|
||
|
||
This is an EDMC 'core' plugin.
|
||
|
||
All EDMC plugins are *dynamically* loaded at run-time.
|
||
|
||
We build for Windows using `py2exe`.
|
||
`py2exe` can't possibly know about anything in the dynamically loaded core plugins.
|
||
|
||
Thus, you **MUST** check if any imports you add in this file are only
|
||
referenced in this file (or only in any other core plugin), and if so...
|
||
|
||
YOU MUST ENSURE THAT PERTINENT ADJUSTMENTS ARE MADE IN
|
||
`build.py` TO ENSURE THE FILES ARE ACTUALLY PRESENT
|
||
IN AN END-USER INSTALLATION ON WINDOWS.
|
||
"""
|
||
# pylint: disable=import-error
|
||
from __future__ import annotations
|
||
|
||
from typing import Any, Mapping, cast
|
||
import tkinter as tk
|
||
import base64
|
||
import gzip
|
||
import io
|
||
import json
|
||
import os
|
||
import myNotebook as nb # noqa: N813
|
||
from EDMCLogging import get_main_logger
|
||
from companion import CAPIData
|
||
from l10n import translations as tr
|
||
|
||
logger = get_main_logger()
|
||
if not os.getenv('EDMC_NO_UI'): # Functions using show_password_var MUST have TK set up
|
||
show_password_var = tk.BooleanVar()
|
||
|
||
# Global Padding Preferences
|
||
PADX = 10
|
||
BUTTONX = 12 # indent Checkbuttons and Radiobuttons
|
||
PADY = 1 # close spacing
|
||
BOXY = 2 # box spacing
|
||
SEPY = 10 # seperator line spacing
|
||
STATION_UNDOCKED = '×' # "Station" name to display when not docked = U+00D7
|
||
|
||
|
||
def plugin_start3(plugin_dir: str) -> str:
|
||
"""
|
||
Start the plugin.
|
||
|
||
:param plugin_dir: NAme of directory this was loaded from.
|
||
:return: Identifier string for this plugin.
|
||
"""
|
||
return 'CommonCoreUtils'
|
||
|
||
|
||
def api_keys_label_common(this, cur_row: int, frame: nb.Frame):
|
||
"""
|
||
Prepare the box for API Key Loading. This is an EDMC Common Function.
|
||
|
||
:param this: The module global from the calling module.
|
||
:param cur_row: The current row in the calling module's config page.
|
||
:param frame: The current frame in the calling module's config page.
|
||
:return: The updated module global from the calling module.
|
||
"""
|
||
# LANG: EDSM API key label
|
||
this.apikey_label = nb.Label(frame, text=tr.tl('API Key'))
|
||
this.apikey_label.grid(row=cur_row, padx=PADX, pady=PADY, sticky=tk.W)
|
||
this.apikey = nb.EntryMenu(frame, show="*", width=50)
|
||
this.apikey.grid(row=cur_row, column=1, padx=PADX, pady=BOXY, sticky=tk.EW)
|
||
return this
|
||
|
||
|
||
def show_pwd_var_common(frame: nb.Frame, cur_row: int, this):
|
||
"""
|
||
Allow unmasking of the API Key. This is an EDMC Common Function.
|
||
|
||
:param cur_row: The current row in the calling module's config page.
|
||
:param frame: The current frame in the calling module's config page.
|
||
"""
|
||
show_password_var.set(False) # Password is initially masked
|
||
|
||
show_password_checkbox = nb.Checkbutton(
|
||
frame,
|
||
text=tr.tl('Show API Key'), # LANG: Text EDSM Show API Key
|
||
variable=show_password_var,
|
||
command=lambda: toggle_password_visibility_common(this)
|
||
)
|
||
show_password_checkbox.grid(row=cur_row, columnspan=2, padx=BUTTONX, pady=PADY, sticky=tk.W)
|
||
|
||
|
||
# Return a URL for the current ship
|
||
def shipyard_url_common(loadout: Mapping[str, Any]) -> str:
|
||
"""
|
||
Construct a URL for ship loadout. This is an EDMC Common Function.
|
||
|
||
:param loadout: The ship loadout data.
|
||
:return: The constructed URL for the ship loadout.
|
||
"""
|
||
# Convert loadout to JSON and gzip compress it
|
||
string = json.dumps(loadout, ensure_ascii=False, sort_keys=True, separators=(',', ':')).encode('utf-8')
|
||
if not string:
|
||
return ''
|
||
|
||
out = io.BytesIO()
|
||
with gzip.GzipFile(fileobj=out, mode='w') as f:
|
||
f.write(string)
|
||
|
||
encoded_data = base64.urlsafe_b64encode(out.getvalue()).decode().replace('=', '%3D')
|
||
return encoded_data
|
||
|
||
|
||
def station_link_common(data: CAPIData, this):
|
||
"""
|
||
Set the Staion Name. This is an EDMC Common Function.
|
||
|
||
:param data: A CAPI Data Entry.
|
||
:param this: The module global from the calling module.
|
||
"""
|
||
if data['commander']['docked'] or this.on_foot and this.station_name:
|
||
this.station_link['text'] = this.station_name
|
||
elif data['lastStarport']['name'] and data['lastStarport']['name'] != "":
|
||
this.station_link['text'] = STATION_UNDOCKED
|
||
else:
|
||
this.station_link['text'] = ''
|
||
|
||
|
||
def this_format_common(this, state: Mapping[str, Any]):
|
||
"""
|
||
Gather Common 'This' Elements. This is an EDMC Common Function.
|
||
|
||
:param this: The module global from the calling module.
|
||
:param state: `monitor.state`.
|
||
"""
|
||
this.system_address = state['SystemAddress']
|
||
this.system_name = state['SystemName']
|
||
this.system_population = state['SystemPopulation']
|
||
this.station_name = state['StationName']
|
||
this.station_marketid = state['MarketID']
|
||
this.station_type = state['StationType']
|
||
this.on_foot = state['OnFoot']
|
||
|
||
|
||
def toggle_password_visibility_common(this):
|
||
"""
|
||
Toggle if the API Key is visible or not. This is an EDMC Common Function.
|
||
|
||
:param this: The module global from the calling module.
|
||
"""
|
||
if show_password_var.get():
|
||
this.apikey.config(show="") # type: ignore
|
||
else:
|
||
this.apikey.config(show="*") # type: ignore
|
||
|
||
|
||
def station_name_setter_common(this):
|
||
"""
|
||
Set the Station Name. This is an EDMC Common Function.
|
||
|
||
:param this: The module global from the calling module.
|
||
"""
|
||
to_set: str = cast(str, this.station_name)
|
||
if not to_set:
|
||
if this.system_population is not None and this.system_population > 0:
|
||
to_set = STATION_UNDOCKED
|
||
else:
|
||
to_set = ''
|
||
|
||
this.station_link['text'] = to_set
|
||
|
||
|
||
def cmdr_data_initial_common(this, data: CAPIData):
|
||
"""
|
||
Set the common CMDR Data. This is an EDMC Common Function.
|
||
|
||
:param this: The module global from the calling module.
|
||
:param data: The latest merged CAPI data.
|
||
"""
|
||
# Always store initially, even if we're not the *current* system provider.
|
||
if not this.station_marketid and data['commander']['docked']:
|
||
this.station_marketid = data['lastStarport']['id']
|
||
|
||
# Only trust CAPI if these aren't yet set
|
||
if not this.system_name:
|
||
this.system_name = data['lastSystem']['name']
|
||
if not this.station_name and data['commander']['docked']:
|
||
this.station_name = data['lastStarport']['name']
|