From b6425001f22f8af4635d6bc05fb4cf170972dfcb Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 5 Jan 2021 16:14:12 +0000 Subject: [PATCH 001/425] Add killswitches.json to releases branch --- killswitches.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 killswitches.json diff --git a/killswitches.json b/killswitches.json new file mode 100644 index 00000000..c1c3f5a2 --- /dev/null +++ b/killswitches.json @@ -0,0 +1,6 @@ +{ + "__COMMENT_READ_ME": "Do *NOT* commit this file to any branch other than `releases` !!! See docs/Killswitches.md", + "version": 1, + "last_updated": "2021-01-05", + "kill_switches": [] +} From da04a9e301db039aa2889412bdc3c94e9352785d Mon Sep 17 00:00:00 2001 From: Athanasius Date: Tue, 12 Jan 2021 16:32:59 +0000 Subject: [PATCH 002/425] appcast: 4.1.6 --- edmarketconnector.xml | 58 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/edmarketconnector.xml b/edmarketconnector.xml index a696a1e4..50cb38b0 100644 --- a/edmarketconnector.xml +++ b/edmarketconnector.xml @@ -168,11 +168,63 @@ - Release 4.1.5 + Release 4.1.6 body { font-family:"Segoe UI","Tahoma"; font-size: 75%; } h2 { font-family:"Segoe UI","Tahoma"; font-size: 105%; } +

Release 4.1.6

+

We might have finally found the cause of the application hangs during shutdown. +Note that this became easier to track down due to the downtime +for migration of www.edsm.net around 2021-01-11. Before these fixes EDSM's +API not being available would cause an EDMC hang on shutdown.

+
    +
  • +

    We've applied extra paranoia to some of the application shutdown code to +ensure we're not still trying to handle journal events during this sequence.

    +

    We also re-ordered the shutdown sequence, which might help avoid the shutdown +hang.

    +

    If you encounter a shutdown hang then please add a comment and log files to +Application can leave a zombie process on shutdown #678 +to help us track down the cause and fix it.

    +
  • +
  • +

    We now avoid making Tk event_generate() calls whilst the appliction is +shutting down.

    +
  • +
  • +

    Plugins should actively avoid making any sort of Tk event_generate() call +during application shutdown.

    +

    This means using if not config.shutting_down: to gate any code in worker +threads that might attempt this. Also, be sure you're not attempting such +in your plugin_stop() function.

    +

    See plugins/edsm.py and plugins/inara.py for example of the usage.

    +
  • +
  • +

    Any use of plug.show_error() won't actually change the UI status line +during shutdown, but the text you tried to show will be logged instead.

    +
  • +
  • +

    Cargo tracking will now correctly count all instances of the same type of +cargo for different missions. Previously it only counted the cargo for +the last mission requiring that cargo type, as found in Cargo.json.

    +
  • +
  • +

    The loaded contents of Cargo.json can now be found in monitor.state['CargoJSON']. +monitor.state is what is passed to plugins as state in the +journal_entry() call.

    +
  • +
  • +

    Our logging code should now cope with logging from a property.

    +
  • +
  • +

    Logging from any name-mangled method should now work properly.

    +
  • +
  • +

    Miscellaneous updates to PLUGINS.md - mostly to clarify some things.

    +
  • +
+

Release 4.1.5

This is a minor maintenance release, mostly addressing behaviour around process shutdown and startup, along with a couple of small enhancements that @@ -886,10 +938,10 @@ If any of your plugins are listed in that section then they will need updating, ]]> From 01fa174ca324a6ae33a1d6ba2b8df80007142661 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Sat, 30 Jan 2021 10:25:03 +0000 Subject: [PATCH 003/425] appcast: Reduce changelogs to bare minimum. This is to see if 3.4.3.0 will then offer the update without crashing. --- edmarketconnector.xml | 842 ------------------------------------------ 1 file changed, 842 deletions(-) diff --git a/edmarketconnector.xml b/edmarketconnector.xml index 50cb38b0..3d524be9 100644 --- a/edmarketconnector.xml +++ b/edmarketconnector.xml @@ -21,138 +21,6 @@

  • Version increased to 3.4.4.0 / 3.44.
  • URL the application checks for updates changed to point to github,
  • -
-

Release 3.44

-

Release 3.43

-
    -
  • New commodity and modules from “September Update”.
  • -
  • Misc fixes.
  • -
  • More control over plugin widget colors.
  • -
-

The first time that you run the app while playing the game you are redirected to Frontier's authentication website and prompted for your username and password.

-

Release 3.42

-
    -
  • Use EDSY.org address for EDShipyard.
  • -
  • Add advanced multi-cannon from “Bridging the Gap”.
  • -
-

Release 3.41

-
    -
  • Transparent theme window size reduced.
  • -
-

Release 3.40

-
    -
  • Add new modules in 3.4.
  • -
  • Improved authentication when app started with game already running.
  • -
-

Release 3.38

-
    -
  • More authentication fixes.
  • -
  • Send influence and reputation gain to Inara on mission completion.
  • -
-

Release 3.37

-
    -
  • More authentication fixes.
  • -
  • More robust/graceful handling of Frontier Auth and/or cAPI server outages.
  • -
-

Release 3.36

-
    -
  • Fix for forthcoming Frontier authentication changes.
  • -
-

Release 3.35

-
    -
  • Display feedback on successful authentication.
  • -
  • Outfitting and Shipyard data also sent to EDDN on visiting outfitting or shipyard in-game, and tagged with a “Horizons” flag.
  • -
  • Sends your local faction reputation to Inara.
  • -
  • Fix for preferences window appearance on macOS Mojave.
  • -
-

Release 3.33

-
    -
  • More authentication fixes.
  • -
-

Release 3.32

-
    -
  • Fix for token expiry during a session (“Frontier server is down” error).
  • -
  • Force re-authentication if credentials entered for wrong Cmdr.
  • -
  • More logging of OAuth failures.
  • -
-

Release 3.31

-
    -
  • Support for OAuth2-based access to station commodity market, outfitting and shipyard data.
  • -
  • Fix for command-line program.
  • -
  • Improved handling of authentication errors.
  • -
  • Commodity market data also sent to EDDN on visiting the in-game commodity market.
  • -
  • Misc fixes.
  • -
-

Release 3.30

-
    -
  • Support for OAuth2-based access to station commodity market, outfitting and shipyard data.
  • -
  • Commodity market data also sent to EDDN on visiting the in-game commodity market.
  • -
  • Misc fixes.
  • -
-

Release 3.20

-
    -
  • Preliminary support for E:D 3.3.
  • -
  • Support accessing Journal on macOS remotely over SMB.
  • -
  • Misc fixes.
  • -
-

Release 3.12

- -

Release 3.11

-
    -
  • Misc fixes.
  • -
-

Release 3.10

-
    -
  • Support for new ships and modules in E:D 3.1.
  • -
  • Fix for sending ship loadouts with engineered modules with certain secondary effects to Inara.
  • -
  • Add separators between plugins in main window.
  • -
  • Chinese (Simplified) translation courtesy of Cmdr Zhixian Wu.
  • -
  • Portuguese (Portugal) translation courtesy of Carlos Oliveira.
  • -
-

Release 3.06

-
    -
  • Extend localisation support to plugins.
  • -
  • Hungarian translation courtesy of Cmdr Wormhole.
  • -
  • Misc fixes.
  • -
-

Release 3.05

-
    -
  • Fix for “Frontier server is down” error on systems with primary language other than English.
  • -
  • Fix for TD prices file format.
  • -
-

Release 3.04

-
    -
  • Export ship loadout to Coriolis in Journal “Loadout” format.
  • -
  • Fix for “This app requires accurate timestamps” error - get timestamps for cAPI-derived data from cAPI server.
  • -
  • Fix for TCE integration.
  • -
  • Support for “package plugins”.
  • -
-

Release 3.03

-
    -
  • Fixes for stats and plugin display.
  • -
-

Release 3.02

-
    -
  • Choose between eddb, EDSM and Inara for station and shipyard links.
  • -
  • Don't display “Solo” mode in main window.
  • -
  • Fix for saving ship loadout to file when ship name contains punctuation.
  • -
-

Release 3.01

-
    -
  • Various fixes for EDSM, Inara and TCE integrations.
  • -
  • Fix for failure to terminate cleanly.
  • -
  • Switch ship loadout file to journal format.
  • -
-

Release 3.00

-
    -
  • Support for E:D 3.0.
  • -
  • Updates your entire fleet on EDSM and/or Inara whenever you visit the shipyard in game.
  • -
  • Updates your current ship's loadout on EDSM and/or Inara whenever it changes.
  • -
  • Plugin access to your dashboard status.
]]>
@@ -225,716 +93,6 @@ the last mission requiring that cargo type, as found in Cargo.json.

-

Release 4.1.5

-

This is a minor maintenance release, mostly addressing behaviour around -process shutdown and startup, along with a couple of small enhancements that -most users won't notice.

-
    -
  • -

    If there is already an EDMarketConnector.exe process running when trying -to run another instance then that new process will no longer exit silently. -Instead you'll get a pop-up telling you it's detected another process, and -you need to close that pop-up in order for this additional process to then -exit.

    -

    This hopefully makes it obvious when you've got a hung EDMarketConnect.exe -process that you need to kill in order to re-run the program.

    -
  • -
  • -

    In order to gather more information about how and why EDMarketConnector.exe -sometimes doesn't shutdown properly we've added some extra debug logging to -the sequence of clean-up calls performed during shutdown.

    -

    Also, to make it more obvious if the process has hung during shutdown the -UI window is no longer hidden at the start of this shutdown sequence. It -will instead linger, with "Shutting down..." showing in the status line -(translation for this small phrase will be added in a later release).

    -

    If you encounter this shutdown hang then please add a comment to -Application can leave a zombie process on shutdown #678 -to help us track down the cause and fix it.

    -
  • -
  • -

    Cater for 'mangled name' class functions in our logging code. e.g. where -you name a class member with a __ prefix in order to 'hide' it from -out-of-class code.

    -
  • -
  • -

    To help track down the cause of Crashing On Startup #798 -we've added some exception catching in our logging code. If this is -triggered you will see ??:?? in logging output, instead of class and/or -function names.

    -

    If you encounter this then please comment on that bug report to aid us in -tracking down the root cause!

    -
  • -
  • -

    Fixed logging from EDMC.exe so that the -debug log goes into EDMC-debug.log -not EDMarketConnector-debug.log.

    -
  • -
  • -

    Fix EDMC.exe -j handling of file encodings. NB: This command-line -argument isn't listed on EDMC.exe -h as it's intended for developer use -only.

    -
  • -
  • -

    Fix the name of 'Void Opal(s)' so that output of market data to files is -correct.

    -
  • -
  • -

    Fix URL in PLUGINS.md to refer to main, not master branch.

    -
  • -
  • -

    We're able to pull py2exe from PyPi now, so docs/Releasing.md has been -update to reflect this.

    -
  • -
- - -

Release 4.1.4

-

The only change from 4.1.3 is to insert some Windows version checks before -even attempting to set a UTF-8 encoding. We'll now only attempt this if the -user is not on Windows, or is on at least Windows 10 1903.

-

For unknown reasons no exception was being thrown under some circumstances (in -this case running under an earlier Windows 10, but with EDMarketConnector.exe -set to run in Windows 7 compatibility mode for some unknown reason).

- -

Release 4.1.3

-
    -
  • -

    Revert to not setting gdiScaling in the application manifest. This should -fix #734 -and #739.

    -

    A side effect will be that the radio buttons in Preferences > Appearance -for the Theme selection will once more be improperly sized under any UI -scaling. This is a Tcl/Tk bug which they have fixed in their code, but not -yet made a new release containing that fix. We'll have it fixed when Tcl/Tk -release a fixed version and Python releases a fixed version, that we use, -that includes the fixed libraries.

    -
  • -
  • -

    Wraps some ctypes code in a try/except in order to fix -#737. This should -benefit anyone running EDMC under any Wine version that doesn't set the -registry key we check for.

    -

    Note, however, that we recommend running EDMarketConnector natively from -source if using Linux.

    -
  • -
- -

Release 4.1.2

-
    -
  • Minor fix to EDMC.py to revert broken logic trying to detect when there is -neither commodities nor outfitting data for a station.
  • -
- -

Release 4.1.1

-

This release should get the program running again for everyone who had issues -with 4.1.0.

-
    -
  • -

    Catch any exception when we try to set UTF-8 encoding. We'll log where this -fails but the program should continue running.

    -
  • -
  • -

    The use of the tkinter.filedialog code is now contingent on a UTF-8 -encoding being set. If it isn't then we'll revert to the previous -non-tkinter file dialog code. The older OSes that can't handle a UTF-8 -encoding will get that slightly worse file dialog (that was previously -always the case before 4.1.0). Everyone else gets to enjoy the more up to -date file dialog with all the shortcuts etc.

    -
  • -
- -

Release 4.1.0

-

This release contains the result of a lot of code cleanup on several files -and the addition of a proper logging paradigm, which should aid us in tracking -down bugs.

-

None of the code cleanups should change actual program behaviour, but as we -don't yet have the code in a state to have proper tests it's possible we've -broken something.

-
    -
  • -

    The error 'list' object has no attribute 'values' should now be fixed.

    -
  • -
  • -

    This version will attempt to send empty market commodity lists over EDDN. -The benefit of this is it will show when a Fleet Carrier no longer has any -buy or sell orders active.

    -

    At this time the EDDN Gateway will reject these messages. We're catching -and suppressing that (but log a message at TRACE level). If/when the EDDN -schema is updated and the Gateway starts using that this will mean, -e.g. EDDB, can start better tracking Fleet Carrier markets.

    -
  • -
  • -

    We are now explicitly a Unicode application:

    -
      -
    1. -

      A manifest setting in both EDMarketConnector.exe and EDMC.exe now -specifies they're Unicode applications so that they default to using the -UTF-8 codepage.

      -
    2. -
    3. -

      We are now explicitly setting a UTF8 encoding at startup. NB: This is -still necessary so that users running from source code are also using the -UTF-8 encoding, there's no manifest in that scenario.

      -

      This shouldn't have any side effects and has allowed us to switch to -the native tkinter file dialogs rather than some custom code.

      -
    4. -
    -

    If you do encounter errors that might be related to this then it would be -useful to see the logging output that details the Locale settings at -various points during startup. Examples might include incorrect text being -rendered for your language when you have it set, or issues with filenames -and their content, but any of these are unlikely.

    -
  • -
  • -

    EDMarketConnector.exe now has gdiScaling set to true in its manifest. This -results in better Windows OS scaling of the UI (radio buttons scale correctly -now). This might negate the need for our own UI Scaling (see below), but -we're leaving the functionality in for anyone who finds it useful.

    -
  • -
  • -

    New UI Scaling option! Find the setting on the 'Appearance' tab of Settings.

    -
      -
    1. This will only actually take effect after restarting the application.
    2. -
    3. The 'Default' theme's menu names won't be resized due to using the -default font. The other two themes work properly though as they use -a custom font for those texts.
    4. -
    5. As per the note next to the settings bar, "100" means "default", so set -it to that if you decide you don't need the UI scaling.
    6. -
    7. If you select 0 it will become 100 on the next startup.
    8. -
    -

    Plugin Authors: If you are doing per-pixel things in your UI then you'll -want to check config.get('ui_scale') and adjust accordingly. 100 -means default scaling with other values being a percentage relative to -that (so 150 means you need to scale everything x1.5).

    -
  • -
  • -

    Code dealing with Frontier's CAPI was cleaned up, so please report any -issues related to that (mostly when just docked or when you press the Update -button).

    -
  • -
  • -

    We now have proper logging available, using the python module of that name. -Plugin Authors, please change your code to using proper logging, as per the -new 'Logging' section of PLUGINS.md, rather than simple print(...) -statements.

    -
      -
    1. -

      We have a TRACE level of log output. By default this is turned off. -Run either EDMarketConnector or EDMC with --trace flag to enable. This is -intended for use where we need finer-grained tracing to track down a bug, -but the output would be too spammy in normal use.

      -

      To make it easy for users to run with TRACE logging there's a new file -EDMarketConnector - TRACE.bat. Running this should result in the program -running with tracing. Recommended use is to navigate a Windows File -Explorer window to where EDMarketConnector.exe is installed then -double-click this .bat file.

      -
    2. -
    3. -

      EDMC.py has a new --loglevel command-line argument. See EDMC.py -h -for the possible values. It defaults to 'INFO', which, unless there's an -error, should yield the same output as before.

      -
    4. -
    5. -

      EDMC.exe will now log useful startup state information if run with the ---loglevel DEBUG arguments.

      -
    6. -
    7. -

      EDMarketConnector has a new 'Loglevel' setting on the 'Configuration' tab -to change the loglevel. Default is 'INFO' and advised for normal use. -If reporting a bug it will be very helpful to change this to 'DEBUG' and -then reproduce the bug. Changes to this will take effect immediately, no -need for a restart.

      -
    8. -
    9. -

      Both programs not only log to their old locations (console for EDMC, and -%TEMP%\EDMarketConnector.log for the main application), but now also to -a size-limited and rotated logfile inside the folder -%TEMP%\EDMarketConnector\ .

      -
        -
      1. The base filename inside there is EDMarketConnector-debug.log for the -main program and EDMC-debug.log for the command-line program.
      2. -
      3. A new file is only started if/when it reaches the 1 MiB size limit.
      4. -
      5. We'll keep at most 10 backups of each file, so the maximum disk space -used by this will be 22 MiB.
      6. -
      7. Only actually logged output goes to these files, which currently is -far from all the traditional output that goes to the old file/console. -Anything using print(...) will not appear in these new files.
      8. -
      9. These files always default to DEBUG level, whereas the old log file -continues to follow the user-set logging level.
      10. -
      -
    10. -
    11. -

      Default logging level for plugins is DEBUG. This won't change what's -actually logged, it just ensures that everything gets through to the two -channels that then decide what is output.

      -
    12. -
    -
  • -
  • -

    There's a little extra DEBUG logging at startup so we can be sure of some -things like Python version used (pertinent if running from source).

    -
  • -
  • -

    Minor tweak to EDDN plugin logging so we know what message we tried to send -if it fails.

    -
  • -
  • -

    More logging added to companion.py to aid diagnosing Frontier Auth issues.

    -
  • -
  • -

    Extra TRACE level logging added for when we process Location, Docked, -t puFSDJump and CarrierJump events for EDSM. This was added to help track -down the cause of #713.

    -
  • -
-

Translators: There are new strings to translate related to Log Levels -and the new UI Scaling. Thanks to those who already updated!

-

There was a series of betas and release candidates between 4.0.6 and 4.1.0, -see their individual changelogs on -GitHub EDMarketConnector Releases. -All the pertinent changes in them were folded into the text above.

- -

Release 4.0.6

-
    -
  • Correct the three System Provider plugins to not show the next system -in a plotted route instead of the current system.
  • -
- -

Release 4.0.5

-
    -
  • Built using Python 3.7.9.
  • -
  • Fix EDSM plugin so the System provider actually updates the URLs for -jumps to new systems.
  • -
-

In general this cleans up the code for all three System and Station Providers; -EDDB, EDSM, Inara.

- -

Release 4.0.4

-
    -
  • -

    Built using Python 3.7.8. Prior 4.0.x releases used 3.7.7.

    -
  • -
  • -

    Don't crash if no non-default Journal Directory has been set.

    -
  • -
  • -

    Only send to Inara API at most once every 30 seconds. This should avoid -the "Inara 400 Too much requests, slow down, cowboy. ;) ..." message and -being locked out from the API for an hour as a result. Any events that -require data to be sent during the 30s cooldown will be queued and sent when -that timer expires.

    -

    This was caused by previous changes in an attempt to send cargo events -to Inara more often. This fix retains that enhancement.

    -

    Note that if you log out and stop EDMC within 30 seconds you might have -some events not sent. If we tried to force a send then it might hit the -limit when you want to log back in and continue playing. As it is you can -re-run EDMC and log back into the game to ensure Inara is synchronised -properly.

    -
  • -
- - -

Release 4.0.3

-

NB: Anyone who installed a 4.0.3-rcX release candidate version should first -uninstall it before installing this. -
Your settings are safe, they're in either the Registry on Windows, or in a -file outside the install location on other OSes. -
Your third-party plugins should also be safe, because you placed them in -e.g. %LOCALAPPDATA%\EDMarketConnector\plugins, not in the installation -plugins folder, didn't you ?

-

This release contains fixes for a handful of bugs in 4.0.2.0, as well as a -switch to full Semantic Version -strings.

-
    -
  • -

    Switch to Semantic Version strings.

    -
      -
    • As part of this the version check with EDMC.exe -v might now show -some exception/error output if it fails to download and parse the appcast -file. The string it shows, new version available or not, should be the -same format as previously.
    • -
    -
  • -
  • -

    Fix for bug #616 - EDMC Not Showing "Station" after Update -This was caused by changes to the EDDB plugin inadvertently no longer -maintaining some state that it turned out the Inara plugin was depending -on.

    -
      -
    • Inara plugin is now using direct URLs for System and Station links. It -no longer relies on you having entered an Inara API Key.
    • -
    • All three 'provider' plugins (EDDB, EDSM, Inara) should now be using the -same logic for when they update and what they display.
    • -
    • If you Request Docking, whether the request succeeds or not, the -station name will now show and be clickable.
    • -
    • If you Undock, Supercruise away or FSDJump away then any station name -will be replaced with a × (multiply) character. As with unpopulated -systems clicking this will take you either to the system page, or to a -list of stations in the system (depending on provider used).
    • -
    -
  • -
  • -

    A fix for ships without a player-set name using a single (space -character) as their name in the UI, instead of the ship model name.

    -

    See #614 - Ship is not displaying but IS hotlinked.

    -
  • -
  • -

    A fix for some file paths on Linux not understanding ~ as "my home -directory". this should help anyone setting up on linux.

    -

    See #486 - Some info about running on Manjaro.

    -
  • -
  • -

    A new option to use an alternate method of opening a URL for shipyard links. -It's called 'Use alternate URL method' and is located in the 'File' > -'Settings' dialogue on the 'Configuration' tab, next to the dropdown used to -choose shipyard provider. If your setup results in coriolis.io or edsy.org -saying they can't load your build then try toggling this on.

    -

    This method writes a small .html file, -%LOCALAPPDATA%\EDMarketConnector\shipyard.html -(or other-OS equivalent location), and directs your browser to open that. -The file contains a meta refresh redirect to the URL for your build on -your chosen shipyard provider. The file is not deleted after use, so -you can also use this as "let's re-open that last build" facility even -without -EDMC running.

    -

    Please let us know if this doesn't work for you! -Anti-Virus or Software Firewalls might object to the "open .html file, and -then it redirects" workaround.

    -

    See #617 - Ship load out link error.

    -
  • -
  • -

    Translations updated:

    -
      -
    • New phrases were added and the only 100% translated languages are now: -Czech, Finnish, German, Italian, Japanese, Portugese (Brazil), Russian, -Serbian (Latin), Serbian (Latin, Bosnia and Herzegovina).
    • -
    -

    Thank you translators! Please do contribute on -the OneSkyApp project -if you are able to.

    -
  • -
- - -

Release 4.0.2.0

-

Only a minor fix to EDMC.exe

-
    -
  • Restore the reporting of new releases for EDMC.exe -v.
  • -
- -

Release 4.0.1.0

-

This fixes a bug with the EDDB 'System Provider' URLs.

-
    -
  • It was possible to pick up, and use, a bad SystemAddress from the Frontier -CAPI. The CAPI will no longer be used as a source for this.
  • -
  • If we do not yet have a SystemAddress from the Journal we will use the -SystemName instead. This carries the small risk of the player being in one -of the duplicate-name systems, in which case EDDB might not display the -correct system.
  • -
- -

Release 4.0.0.0

-

Developers please note the new Contributing.md -, particularly Git branch structure and tag conventions -.

-
    -
  • -

    This release is based on Python 3.7, not 2.7, so a user might find some of -their plugins stop working. If you have any plugins that do not have the -proper support you'll see a popup about this when you -start the program, at most once every 24 hours. As directed on that -popup you can check the status of -your plugins on 'File' > 'Settings' > 'Plugins' in the new 'Plugins Without -Python 3.x Support:' section.

    -

    If the popup gets annoying then follow the directions to -disable a plugin.

    -

    For any plugins without Python 3.x support you should first ensure you're -using the latest version of that plugin. If that hasn't been updated then -you might want to contact the plugin developer to see if they'll update the -plugin. We've checked many plugins and put them in the appropriate -section of this list.

    -

    Plugin authors should also read the latest Developer Plugin -Documentation -, particularly the section -Available imports -. Let us know if we've missed anything.

    -
  • -
  • -

    New 'Help' > 'About E:D Market Connector' menu item to show the currently -running version. Includes a link to the release notes.

    -
  • -
  • -

    Translations updated:

    -
      -
    • -

      New languages: Serbian (Latin, Bosnia and Herzegovina), -Slovenian (Slovenia) and Swedish.

      -
    • -
    • -

      New phrases were added and the only 100% translated languages are now: -Czech, French, German, Japanese, Polish, Portugese (Brazil), -Portugese (Portugal), Russian, Serbian (Latin), -Serbian (Latin, Bosnia and Herzegovina), Spanish, Swedish (Sweden) -Ukrainian,

      -
    • -
    -

    Thank you translators! Please do contribute on -the OneSkyApp project -if you are able to.

    -
  • -
  • -

    EDDB plugin now uses a system's SystemAddress to construct the URL to view -the system on eddb.io. This removes the need for the systems.p file. -That file will be removed in a future version, plugin authors should not -be relying on its presence.

    -
  • -
  • -

    EDDB plugin now uses a station's MarketID to construct a URL to view the -station on eddb.io. This removes the need for stations.p. That file will -be removed in a future version, plugin authors should not be relying on its -presence.

    -

    NB: It's now using the system's "Population" data from Journal messages to -determine if the system has stations or not. This allows for the x as -station name to be clickable to open the eddb.io page for system when you're -not docked. It's known that some systems with stations have a Population of -"0" and thus won't allow this functionality. This is Frontier's issue, not -EDMC's. If you logged out in a populated system, run EDMC afresh, and use -the 'Update' button you won't see the x until you login fully to the game.

    -
  • -
  • -

    Tweak to Inara plugin so it will send updates via the Inara API more -frequently. Will now send an update, no more often than about once a -minute, if your cargo changes at all. This still won't update if you dock -and quickly buy or sell some cargo, but it's better than it was before. -You can nudge it by waiting a minute then re-opening the Commodities screen, -or indeed performing any other action the logs a new Journal event.

    -
  • -
  • -

    The old 'anonymous' and custom 'uploaderID' options were taken out of -the UI back in December 2018, but the settings lingered in the Windows -Registry. Thus some users would still have been sending an anonymised or -custom 'uploaderID' in EDDN messages with no easy way to de-activate this.

    -

    The EDDN Relay has been forcefully anonymising uploaderID since March -2018 anyway, so this is redundant. Thus the code that performs this -anonymisation has now been removed.

    -
  • -
  • -

    There used to be an option to output commodities data in 'BPC' format, but -it was removed from the UI back in Dec 2016. A few small pieces of code -lingered and they have now been removed. Any plugin that was passing -COMMODITY_BPC to commodity.export() will now break.

    -
  • -
  • -

    Fixed a bug where certain combinations of 'Output' and 'EDDN' options would -lead to all options on both tabs reverting to their defaults.

    -
  • -
  • -

    Fixed a bug where if you copied a Journal file to the live location, -resulting in a "Journal.YYMMDDHHMMss.XX - Copy.log" file, the application -would pick it up as 'new' and potentially re-send duplicate data to all of -EDDN, EDSM and Inara.

    -

    Now the only files the application will take note of must:

    -
      -
    1. Start with Journal. or JournalBeta..
    2. -
    3. Have the 12-digit date/timestamp, followed by a . -
    4. -
    5. Have the 2 digit serial number, followed by a . -
    6. -
    7. Nothing else before the trailing log.
    8. -
    -
  • -
  • -

    Fixed the location of Registry keys for the update checker, WinSparkle:

    -
      -
    • To be under the new EDCD Registry key in -Computer\HKEY_CURRENT_USER\Software\.
    • -
    • To be under EDMarketConnector instead of EDMarketConnector.py inside -there.
    • -
    -
  • -
  • -

    Fixed to throw an exception, rather than a Segmentation Fault, if -run on Linux without DISPLAY properly set.

    -
  • -
  • -

    Fixed EDMC.exe (command line tool) to correctly report the version with --v.

    -
  • -
- - -

Release 3.46

-

This should be the final release of EDMC based on Python 2.7. The next release after this, assuming this one doesn't introduce new bugs, will be based on Python 3.7. Any plugins that users have installed will need to have been updated to work under Python 3.7 by the time that next version of EDMC is released. During EDMC startup, at most once per day, you might see a popup with the text: - -

One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the 'Plugins' tab of 'File' > 'Settings'. You should check if there is an updated version available, else alert the developer that they will need to update the code when EDMC moves to Python 3.x
- -If so, do as it directs and check "File" > "Settings" > "Plugins" tab and see what plugins are listed in the section with the text "Plugins Without Python 3.x Support". -

-

-If any of your plugins are listed in that section then they will need updating, by you or the original developer, to work with Python 3.7. See Migrating To Python 3.7 for more information. -

-

Changes in this version: -

    -
  • The CAPI CLIENT_ID has been changed to one under Athanasius' account, so when users are asked to (re-)authenticate with Frontier they'll see "Elite Dangerous Market Connector (EDCD/Athanasius)" as the application asking for permission. There's been no change to the use of the data Frontier then gives access to.
  • -
  • Updated translations (as of 2019-09-26 in general and 2019-11-04 for Polish).
  • -
  • Linux: Should now appear on task bar whilst in dark mode theme.
  • -
  • INARA: Send correct opponentName for Interdicted and Interdiction events.<.li> -
  • Send SAASignalsFound events to EDDN.
  • -
  • Add Agronomic Treatment introduced for a community goal.
  • -
  • Fix Detailed Surface Scanner rating.
  • -
  • Fix for the "Inara 400 The reputation value exceeds the valid range" error.
  • -
  • Minimum interval between checks for a new version of EDMC has been reduced from 47 hours to 8 hours.
  • -
  • There is a new option, within the 'Configuration' tab, 'Disable Automatic Application Updates Check when in-game' which when active should prevent update checks from showing a popup whilst you're in-game. You can still use "Help" > "Check for updates" to trigger a manual check.
  • -
  • Support added for the journal 'CarrierJump' event, triggered when you're docked on a Fleet Carrier as it performs a jump. This is now sent to: EDDN, Inara, EDSM. NB: EDSM doesn't yet support this event at the time of writing, so will still not track such Carrier Jumps in your Flight Log or current location. Generally when EDSM is updated to handle such new events it will back-process stored unrecognised events.
  • -
-

- -

Release 3.45

-

There was no real 3.45, it was 'burned' testing that updates from 3.44 would work with the new update_feed URL.

- -

Release 3.44

-

CHANGE OF MAINTAINER

-

Due to a lack of time to give the project the attention it needs Marginal has handed over ownership of the EDMarketConnector GitHub repository to the EDCD (Elite Dangerous Community Developers) organisation.

-

Initially Athanasius will now be responsible for maintaining the code, including addressing any Pull Requests and Issues, and making releases. Unfortunately he has no access to hardware running MacOS so can't easily generate builds for that platform or test them. So for the time being releases will be for Windows 10 only. MacOS users are advised to look into running from source (see the github README).

-

Going forwards the intention is to move to the python 3.7 code as soon as possible. To facilitate this there will be one more python 2.7 release in addition to this one, with the main aim of that being to add code to alert the user about any plugins they use that have apparently not been updated to run under python 3.7.

-

See the project GitHub repository's README.md for further information.

-
    -
  • Version increased to 3.4.4.0 / 3.44.
  • -
  • URL the application checks for updates changed to point to github,
  • -
-

Release 3.43

-
    -
  • New commodity and modules from “September Update”.
  • -
  • Increase transparent theme font size.
  • -
  • Misc fixes.
  • -
  • More control over plugin widget colors.
  • -
-

The first time that you run the app while playing the game you are redirected to Frontier's authentication website and prompted for your username and password.

-

Release 3.42

-
    -
  • Use EDSY.org address for EDShipyard.
  • -
  • Fixes for running under Wine on Linux.
  • -
  • Support not always on top with dark theme on Linux.
  • -
  • Add advanced multi-cannon from ”Bridging the Gap”.
  • -
-

Release 3.41

-
    -
  • Transparent theme window size reduced.
  • -
-

Release 3.40

-
    -
  • Use Euro Caps font with transparent theme.
  • -
  • Add new modules in 3.4.
  • -
  • Improved authentication when app started with game already running.
  • -
-

Release 3.38

-
    -
  • More authentication fixes.
  • -
  • Send influence and reputation gain to Inara on mission completion.
  • -
-

Release 3.37

-
    -
  • More authentication fixes.
  • -
  • More robust/graceful handling of Frontier Auth and/or cAPI server outages.
  • -
-

Release 3.36

-
    -
  • Fix for forthcoming Frontier authentication changes.
  • -
  • Fix for installation on non-English systems.
  • -
-

Release 3.35

-
    -
  • Display feedback on successful authentication.
  • -
  • Outfitting and Shipyard data also sent to EDDN on visiting outfitting or shipyard in-game, and tagged with a “Horizons” flag.
  • -
  • Sends your local faction reputation to Inara.
  • -
-

The first time that you run the app while playing the game you are redirected to Frontier's authentication website and prompted for your username and password.

-

Release 3.33

-
    -
  • More authentication fixes.
  • -
-

Release 3.32

-
    -
  • Fix for token expiry during a session (“Frontier server is down” error).
  • -
  • Force re-authentication if credentials entered for wrong Cmdr.
  • -
  • More logging of OAuth failures.
  • -
-

Release 3.31

-
    -
  • Support for OAuth2-based access to station commodity market, outfitting and shipyard data.
  • -
  • Fix for command-line program.
  • -
  • Improved handling of authentication errors.
  • -
  • Commodity market data also sent to EDDN on visiting the in-game commodity market.
  • -
  • Misc fixes.
  • -
-

Release 3.30

-
    -
  • Support for OAuth2-based access to station commodity market, outfitting and shipyard data.
  • -
  • Commodity market data also sent to EDDN on visiting the in-game commodity market.
  • -
  • Misc fixes.
  • -
-

Release 3.20

-
    -
  • Preliminary support for E:D 3.3.
  • -
  • Support accessing Journal on macOS remotely over SMB.
  • -
  • Misc fixes.
  • -
-

Release 3.12

- -

Release 3.11

-
    -
  • Misc fixes.
  • -
-

Release 3.10

-
    -
  • Support for new ships and modules in E:D 3.1.
  • -
  • Fix for sending ship loadouts with engineered modules with certain secondary effects to Inara.
  • -
  • Add separators between plugins in main window.
  • -
  • Chinese (Simplified) translation courtesy of Cmdr Zhixian Wu.
  • -
  • Portuguese (Portugal) translation courtesy of Carlos Oliveira.
  • -
-

Release 3.06

-
    -
  • Extend localisation support to plugins.
  • -
  • Hungarian translation courtesy of Cmdr Wormhole.
  • -
  • Misc fixes.
  • -
-

Release 3.05

-
    -
  • Fix for “Frontier server is down” error on systems with primary language other than English.
  • -
  • Fix for TD prices file format.
  • -
-

Release 3.04

-
    -
  • Export ship loadout to Coriolis in Journal “Loadout” format.
  • -
  • Fix for “This app requires accurate timestamps” error - get timestamps for cAPI-derived data from cAPI server.
  • -
  • Fix for TCE integration.
  • -
  • Support for “package plugins”.
  • -
-

Release 3.03

-
    -
  • Fixes for stats and plugin display.
  • -
-

Release 3.02

-
    -
  • Choose between eddb, EDSM and Inara for station and shipyard links.
  • -
  • Don't display “Solo” mode in main window.
  • -
  • Fix for saving ship loadout to file when ship name contains punctuation.
  • -
-

Release 3.01

-
    -
  • Various fixes for EDSM, Inara and TCE integrations.
  • -
  • Fix for failure to terminate cleanly.
  • -
  • Switch ship loadout file to journal format.
  • -
-

Release 3.00

-
    -
  • Support for E:D 3.0.
  • -
  • Updates your entire fleet on EDSM and/or Inara whenever you visit the shipyard in game.
  • -
  • Updates your current ship's loadout on EDSM and/or Inara whenever it changes.
  • -
  • Plugin access to your dashboard status.
  • -
]]> Date: Fri, 12 Mar 2021 14:41:48 +0000 Subject: [PATCH 004/425] Release 4.2.0: appcast --- edmarketconnector.xml | 78 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 74 insertions(+), 4 deletions(-) diff --git a/edmarketconnector.xml b/edmarketconnector.xml index 3d524be9..9202e404 100644 --- a/edmarketconnector.xml +++ b/edmarketconnector.xml @@ -36,11 +36,81 @@ - Release 4.1.6 + Release 4.2.0 body { font-family:"Segoe UI","Tahoma"; font-size: 75%; } h2 { font-family:"Segoe UI","Tahoma"; font-size: 105%; } +

Release 4.2.0

+

This release increases the Minor version due to the major change in how +multiple-instance checking is done.

+
    +
  • +

    Adds Steam and Epic to the list of "audiences" in the Frontier Auth callout +so that you can authorise using those accounts, rather than their associated +Frontier Account details.

    +
  • +
  • +

    New status message "CAPI: No commander data returned" if a /profile +request has no commander in the returned data. This can happen if you +literally haven't yet created a Commander on the account. Previously you'd +get a confusing 'commander' message shown.

    +
  • +
  • +

    Changes the "is there another process already running?" check to be based on +a lockfile in the configured Journals directory. The name of this file is +edmc-journal-lock.txt and upon successful locking it will contain text +like:

    +
    Path: <configured path to your Journals>
    +PID: <process ID of the application>
    +
    +

    The lock will be released and applied to the new directory if you change it +via Settings > Configuration. If the new location is already locked you'll +get a 'Retry/Ignore?' pop-up.

    +

    For most users things will operate no differently, although note that the +multiple instance check does now apply to platforms other than Windows.

    +

    For anyone wanting to run multiple instances of the program this is now +possible via:

    +

    runas /user:<USER> "\"c:\Program Files (x86)\EDMarketConnector\EDMarketConnector.exe\" --force-localserver-for-auth"

    +

    If anything has messed with the backslash characters there then know that you +need to have " (double-quote) around the entire command (path to program .exe +and any extra arguments), and as a result need to place a backslash before +any double-quote characters in the command (such as around the space-including +path to the program).

    +

    I've verified it renders correctly on GitHub.

    +

    The old check was based solely on there being a window present with the title +we expect. This prevented using runas /user:SOMEUSER ... to run a second +copy of the application, as the resulting window would still be within the +same desktop environment and thus be found in the check.

    +

    The new method does assume that the Journals directory is writable by the +user we're running as. This might not be true in the case of sharing the +file system to another host in a read-only manner. If we fail to open the +lock file read-write then the application aborts the checks and will simply +continue running as normal.

    +

    Note that any single instance of EDMarketConnector.exe will still only monitor +and act upon the latest Journal file in the configured location. If you run +Elite Dangerous for another Commander then the application will want to start +monitoring that separate Commander. See wiki:Troubleshooting#i-run-two-instances-of-ed-simultaneously-but-i-cant-run-two-instances-of-edmc +which will be updated when this change is in a full release.

    +
  • +
  • +

    Adds the command-line argument --force-localserver-for-auth. This forces +using a local webserver for the Frontier Auth callback. This should be used +when running multiple instances of the application for all instances +else there's no guarantee of the edmc:// protocol callback reaching the +correct process and Frontier Auth will fail.

    +
  • +
  • +

    Adds the command-line argument --suppress-dupe-process-popup to exit +without showing the warning popup in the case that EDMarketConnector found +another process already running.

    +

    This can be useful if wanting to blindly run both EDMC and the game from a +batch file or similar.

    +
  • +
+ + +

Release 4.1.6

We might have finally found the cause of the application hangs during shutdown. Note that this became easier to track down due to the downtime @@ -96,11 +166,11 @@ the last mission requiring that cargo type, as found in Cargo.json.

]]>
From 9924985f18ca4b54b56d2c0015908ed4cad5dfd7 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Mon, 15 Mar 2021 19:38:16 +0000 Subject: [PATCH 005/425] appcast 4.2.1 --- edmarketconnector.xml | 46 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/edmarketconnector.xml b/edmarketconnector.xml index 9202e404..531ef029 100644 --- a/edmarketconnector.xml +++ b/edmarketconnector.xml @@ -36,11 +36,51 @@ - Release 4.2.0 + Release 4.2.1 body { font-family:"Segoe UI","Tahoma"; font-size: 75%; } h2 { font-family:"Segoe UI","Tahoma"; font-size: 105%; } +

Release 4.2.1

+

This is a bug-fix release.

+
    +
  • +

    Updated translations. Thanks once again to all those contributing as per +Translations.

    +
  • +
  • +

    PLUGINS.md: Clarify when CargoJSON is populated.

    +
  • +
  • +

    macOS: pip install -r requirements.txt will now include pyobjc so that +running this application works at all. Check the updated Running from +source +for some advice if attempting to run on macOS.

    +
  • +
  • +

    JournalLock: Handle when the Journal directory isn't set at all, rather than +erroring. Fixes #910 - Not launching (Linux).

    +
  • +
  • +

    Extra logging added to track down cause of #909 - Authentication not possible (PC) +. The debug log file might now indicate what's wrong, or we might need +you to run

    +
    "c:\Program Files (x86)\EDMarketConnector/EDMarketConnector.exe" --trace
    +
    +

    in order to increase the log level and gather some extra information. +Caution is advised if sharing a --trace log file as it will now contain +some of the actual auth data returned from Frontier.

    +
  • +
  • +

    Ensure that 'Save Raw Data' will work. Fixes #908 - Raw export of CAPI data broken.

    +
  • +
  • +

    Prevent EDDN plugin from erroring when we determine if the commander has +Horizons. Fixes #907 - Modules is a list not a dict on damaged stations

    +
  • +
+ +

Release 4.2.0

This release increases the Minor version due to the major change in how multiple-instance checking is done.

@@ -166,10 +206,10 @@ the last mission requiring that cargo type, as found in Cargo.json.

]]>
From ec103cea7b487344f5aaa72e0e3c3627debbc932 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Wed, 17 Mar 2021 12:13:28 +0000 Subject: [PATCH 006/425] Release 4.2.2: appcast --- edmarketconnector.xml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/edmarketconnector.xml b/edmarketconnector.xml index 531ef029..00b046e1 100644 --- a/edmarketconnector.xml +++ b/edmarketconnector.xml @@ -36,11 +36,19 @@ - Release 4.2.1 + Release 4.2.2 body { font-family:"Segoe UI","Tahoma"; font-size: 75%; } h2 { font-family:"Segoe UI","Tahoma"; font-size: 105%; } +

Release 4.2.2

+

This release contains a minor bug-fix, actually properly checking a station's +ships list before operating on it.

+
    +
  • Check that ships['shipuard_list'] is a dict before trying to use +.values() on it. This fixes the issue with seeing list object has no attribute values in the application status line.
  • +
+

Release 4.2.1

This is a bug-fix release.

]]>
- +
From e5f99c29548356993a62ec743da8d61f1b2cad4b Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Wed, 8 May 2024 21:56:52 -0400 Subject: [PATCH 252/425] [#2228] Add SCO Module Information --- edshipyard.py | 4 +- modules.json | 210 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 212 insertions(+), 2 deletions(-) diff --git a/edshipyard.py b/edshipyard.py index 15936dfc..2c29959f 100644 --- a/edshipyard.py +++ b/edshipyard.py @@ -178,8 +178,8 @@ def export(data, filename=None) -> None: # noqa: C901, CCR001 # a locale that uses comma for decimal separator. except ZeroDivisionError: range_unladen = range_laden = 0.0 - string += (f'Range : {range_unladen:.2f} LY current without cargo\n' - f' {range_laden:.2f} LY current with cargo\n') + string += (f'Range : {range_unladen:.2f} LY unladen\n' + f' {range_laden:.2f} LY laden\n') except Exception: if __debug__: diff --git a/modules.json b/modules.json index 16e72f7f..b19441d4 100644 --- a/modules.json +++ b/modules.json @@ -1765,6 +1765,216 @@ "int_hullreinforcement_size5_class2": { "mass": 16 }, + "int_hyperdrive_overcharge_size2_class1": { + "mass": 2.5, + "optmass": 60, + "maxfuel": 0.6, + "fuelmul": 0.008, + "fuelpower": 2 + }, + "int_hyperdrive_overcharge_size2_class2": { + "mass": 2.5, + "optmass": 90, + "maxfuel": 0.9, + "fuelmul": 0.012, + "fuelpower": 2 + }, + "int_hyperdrive_overcharge_size2_class3": { + "mass": 2.5, + "optmass": 90, + "maxfuel": 0.9, + "fuelmul": 0.012, + "fuelpower": 2 + }, + "int_hyperdrive_overcharge_size2_class4": { + "mass": 2.5, + "optmass": 90, + "maxfuel": 0.9, + "fuelmul": 0.012, + "fuelpower": 2 + }, + "int_hyperdrive_overcharge_size2_class5": { + "mass": 2.5, + "optmass": 100, + "maxfuel": 1, + "fuelmul": 0.013, + "fuelpower": 2 + }, + "int_hyperdrive_overcharge_size3_class1": { + "mass": 5, + "optmass": 100, + "maxfuel": 1.2, + "fuelmul": 0.008, + "fuelpower": 2.15 + }, + "int_hyperdrive_overcharge_size3_class2": { + "mass": 2, + "optmass": 150, + "maxfuel": 1.8, + "fuelmul": 0.012, + "fuelpower": 2.15 + }, + "int_hyperdrive_overcharge_size3_class3": { + "mass": 5, + "optmass": 150, + "maxfuel": 1.8, + "fuelmul": 0.012, + "fuelpower": 2.15 + }, + "int_hyperdrive_overcharge_size3_class4": { + "mass": 5, + "optmass": 150, + "maxfuel": 1.8, + "fuelmul": 0.012, + "fuelpower": 2.15 + }, + "int_hyperdrive_overcharge_size3_class5": { + "mass": 5, + "optmass": 167, + "maxfuel": 1.9, + "fuelmul": 0.013, + "fuelpower": 2.15 + }, + "int_hyperdrive_overcharge_size4_class1": { + "mass": 10, + "optmass": 350, + "maxfuel": 2, + "fuelmul": 0.008, + "fuelpower": 2.3 + }, + "int_hyperdrive_overcharge_size4_class2": { + "mass": 4, + "optmass": 525, + "maxfuel": 3, + "fuelmul": 0.012, + "fuelpower": 2.3 + }, + "int_hyperdrive_overcharge_size4_class3": { + "mass": 10, + "optmass": 525, + "maxfuel": 3, + "fuelmul": 0.012, + "fuelpower": 2.3 + }, + "int_hyperdrive_overcharge_size4_class4": { + "mass": 10, + "optmass": 525, + "maxfuel": 3, + "fuelmul": 0.012, + "fuelpower": 2.3 + }, + "int_hyperdrive_overcharge_size4_class5": { + "mass": 10, + "optmass": 585, + "maxfuel": 3.2, + "fuelmul": 0.013, + "fuelpower": 2.3 + }, + "int_hyperdrive_overcharge_size5_class1": { + "mass": 20, + "optmass": 700, + "maxfuel": 3.3, + "fuelmul": 0.008, + "fuelpower": 2.45 + }, + "int_hyperdrive_overcharge_size5_class2": { + "mass": 8, + "optmass": 1050, + "maxfuel": 5, + "fuelmul": 0.012, + "fuelpower": 2.45 + }, + "int_hyperdrive_overcharge_size5_class3": { + "mass": 20, + "optmass": 1050, + "maxfuel": 5, + "fuelmul": 0.012, + "fuelpower": 2.45 + }, + "int_hyperdrive_overcharge_size5_class4": { + "mass": 20, + "optmass": 1050, + "maxfuel": 5, + "fuelmul": 0.012, + "fuelpower": 2.45 + }, + "int_hyperdrive_overcharge_size5_class5": { + "mass": 20, + "optmass": 1175, + "maxfuel": 5.2, + "fuelmul": 0.013, + "fuelpower": 2.45 + }, + "int_hyperdrive_overcharge_size6_class1": { + "mass": 40, + "optmass": 1200, + "maxfuel": 5.3, + "fuelmul": 0.008, + "fuelpower": 2.6 + }, + "int_hyperdrive_overcharge_size6_class2": { + "mass": 16, + "optmass": 1800, + "maxfuel": 8, + "fuelmul": 0.012, + "fuelpower": 2.6 + }, + "int_hyperdrive_overcharge_size6_class3": { + "mass": 40, + "optmass": 1800, + "maxfuel": 8, + "fuelmul": 0.012, + "fuelpower": 2.6 + }, + "int_hyperdrive_overcharge_size6_class4": { + "mass": 40, + "optmass": 1800, + "maxfuel": 8, + "fuelmul": 0.012, + "fuelpower": 2.6 + }, + "int_hyperdrive_overcharge_size6_class5": { + "mass": 40, + "optmass": 2000, + "maxfuel": 8.3, + "fuelmul": 0.013, + "fuelpower": 2.6 + }, + "int_hyperdrive_overcharge_size7_class1": { + "mass": 80, + "optmass": 1800, + "maxfuel": 8.5, + "fuelmul": 0.008, + "fuelpower": 2.75 + }, + "int_hyperdrive_overcharge_size7_class2": { + "mass": 32, + "optmass": 2700, + "maxfuel": 12.8, + "fuelmul": 0.012, + "fuelpower": 2.75 + }, + "int_hyperdrive_overcharge_size7_class3": { + "mass": 80, + "optmass": 2700, + "maxfuel": 12.8, + "fuelmul": 0.012, + "fuelpower": 2.75 + }, + "int_hyperdrive_overcharge_size7_class4": { + "mass": 80, + "optmass": 2700, + "maxfuel": 12.8, + "fuelmul": 0.012, + "fuelpower": 2.75 + }, + "int_hyperdrive_overcharge_size7_class5": { + "mass": 80, + "optmass": 3000, + "maxfuel": 13.1, + "fuelmul": 0.013, + "fuelpower": 2.75 + }, "int_hyperdrive_size2_class1": { "mass": 2.5, "optmass": 48, From 6ffcd91de5fd95c496b273ded83061a42b82eda6 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Fri, 10 May 2024 17:49:13 -0400 Subject: [PATCH 253/425] [2228] Add PyMkII Armor Details From upcoming Coriolis data --- modules.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules.json b/modules.json index b19441d4..e9e444d6 100644 --- a/modules.json +++ b/modules.json @@ -3363,6 +3363,21 @@ "python_armour_reactive": { "mass": 53 }, + "python_nx_armour_grade1": { + "mass": 0 + }, + "python_nx_armour_grade2": { + "mass": 26 + }, + "python_nx_armour_grade3": { + "mass": 53 + }, + "python_nx_armour_mirrored": { + "mass": 53 + }, + "python_nx_armour_reactive": { + "mass": 53 + }, "sidewinder_armour_grade1": { "mass": 0 }, From 163fd197e7faedc4b17787331d610bc6edf87b7a Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sat, 11 May 2024 17:20:10 -0400 Subject: [PATCH 254/425] Merge pull request #2231 from HullSeals/fix/2228/add-sco [2228] Add SCO Modules and Preliminary Python Mk II Support --- edshipyard.py | 4 +- modules.json | 225 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 227 insertions(+), 2 deletions(-) diff --git a/edshipyard.py b/edshipyard.py index 15936dfc..2c29959f 100644 --- a/edshipyard.py +++ b/edshipyard.py @@ -178,8 +178,8 @@ def export(data, filename=None) -> None: # noqa: C901, CCR001 # a locale that uses comma for decimal separator. except ZeroDivisionError: range_unladen = range_laden = 0.0 - string += (f'Range : {range_unladen:.2f} LY current without cargo\n' - f' {range_laden:.2f} LY current with cargo\n') + string += (f'Range : {range_unladen:.2f} LY unladen\n' + f' {range_laden:.2f} LY laden\n') except Exception: if __debug__: diff --git a/modules.json b/modules.json index 16e72f7f..e9e444d6 100644 --- a/modules.json +++ b/modules.json @@ -1765,6 +1765,216 @@ "int_hullreinforcement_size5_class2": { "mass": 16 }, + "int_hyperdrive_overcharge_size2_class1": { + "mass": 2.5, + "optmass": 60, + "maxfuel": 0.6, + "fuelmul": 0.008, + "fuelpower": 2 + }, + "int_hyperdrive_overcharge_size2_class2": { + "mass": 2.5, + "optmass": 90, + "maxfuel": 0.9, + "fuelmul": 0.012, + "fuelpower": 2 + }, + "int_hyperdrive_overcharge_size2_class3": { + "mass": 2.5, + "optmass": 90, + "maxfuel": 0.9, + "fuelmul": 0.012, + "fuelpower": 2 + }, + "int_hyperdrive_overcharge_size2_class4": { + "mass": 2.5, + "optmass": 90, + "maxfuel": 0.9, + "fuelmul": 0.012, + "fuelpower": 2 + }, + "int_hyperdrive_overcharge_size2_class5": { + "mass": 2.5, + "optmass": 100, + "maxfuel": 1, + "fuelmul": 0.013, + "fuelpower": 2 + }, + "int_hyperdrive_overcharge_size3_class1": { + "mass": 5, + "optmass": 100, + "maxfuel": 1.2, + "fuelmul": 0.008, + "fuelpower": 2.15 + }, + "int_hyperdrive_overcharge_size3_class2": { + "mass": 2, + "optmass": 150, + "maxfuel": 1.8, + "fuelmul": 0.012, + "fuelpower": 2.15 + }, + "int_hyperdrive_overcharge_size3_class3": { + "mass": 5, + "optmass": 150, + "maxfuel": 1.8, + "fuelmul": 0.012, + "fuelpower": 2.15 + }, + "int_hyperdrive_overcharge_size3_class4": { + "mass": 5, + "optmass": 150, + "maxfuel": 1.8, + "fuelmul": 0.012, + "fuelpower": 2.15 + }, + "int_hyperdrive_overcharge_size3_class5": { + "mass": 5, + "optmass": 167, + "maxfuel": 1.9, + "fuelmul": 0.013, + "fuelpower": 2.15 + }, + "int_hyperdrive_overcharge_size4_class1": { + "mass": 10, + "optmass": 350, + "maxfuel": 2, + "fuelmul": 0.008, + "fuelpower": 2.3 + }, + "int_hyperdrive_overcharge_size4_class2": { + "mass": 4, + "optmass": 525, + "maxfuel": 3, + "fuelmul": 0.012, + "fuelpower": 2.3 + }, + "int_hyperdrive_overcharge_size4_class3": { + "mass": 10, + "optmass": 525, + "maxfuel": 3, + "fuelmul": 0.012, + "fuelpower": 2.3 + }, + "int_hyperdrive_overcharge_size4_class4": { + "mass": 10, + "optmass": 525, + "maxfuel": 3, + "fuelmul": 0.012, + "fuelpower": 2.3 + }, + "int_hyperdrive_overcharge_size4_class5": { + "mass": 10, + "optmass": 585, + "maxfuel": 3.2, + "fuelmul": 0.013, + "fuelpower": 2.3 + }, + "int_hyperdrive_overcharge_size5_class1": { + "mass": 20, + "optmass": 700, + "maxfuel": 3.3, + "fuelmul": 0.008, + "fuelpower": 2.45 + }, + "int_hyperdrive_overcharge_size5_class2": { + "mass": 8, + "optmass": 1050, + "maxfuel": 5, + "fuelmul": 0.012, + "fuelpower": 2.45 + }, + "int_hyperdrive_overcharge_size5_class3": { + "mass": 20, + "optmass": 1050, + "maxfuel": 5, + "fuelmul": 0.012, + "fuelpower": 2.45 + }, + "int_hyperdrive_overcharge_size5_class4": { + "mass": 20, + "optmass": 1050, + "maxfuel": 5, + "fuelmul": 0.012, + "fuelpower": 2.45 + }, + "int_hyperdrive_overcharge_size5_class5": { + "mass": 20, + "optmass": 1175, + "maxfuel": 5.2, + "fuelmul": 0.013, + "fuelpower": 2.45 + }, + "int_hyperdrive_overcharge_size6_class1": { + "mass": 40, + "optmass": 1200, + "maxfuel": 5.3, + "fuelmul": 0.008, + "fuelpower": 2.6 + }, + "int_hyperdrive_overcharge_size6_class2": { + "mass": 16, + "optmass": 1800, + "maxfuel": 8, + "fuelmul": 0.012, + "fuelpower": 2.6 + }, + "int_hyperdrive_overcharge_size6_class3": { + "mass": 40, + "optmass": 1800, + "maxfuel": 8, + "fuelmul": 0.012, + "fuelpower": 2.6 + }, + "int_hyperdrive_overcharge_size6_class4": { + "mass": 40, + "optmass": 1800, + "maxfuel": 8, + "fuelmul": 0.012, + "fuelpower": 2.6 + }, + "int_hyperdrive_overcharge_size6_class5": { + "mass": 40, + "optmass": 2000, + "maxfuel": 8.3, + "fuelmul": 0.013, + "fuelpower": 2.6 + }, + "int_hyperdrive_overcharge_size7_class1": { + "mass": 80, + "optmass": 1800, + "maxfuel": 8.5, + "fuelmul": 0.008, + "fuelpower": 2.75 + }, + "int_hyperdrive_overcharge_size7_class2": { + "mass": 32, + "optmass": 2700, + "maxfuel": 12.8, + "fuelmul": 0.012, + "fuelpower": 2.75 + }, + "int_hyperdrive_overcharge_size7_class3": { + "mass": 80, + "optmass": 2700, + "maxfuel": 12.8, + "fuelmul": 0.012, + "fuelpower": 2.75 + }, + "int_hyperdrive_overcharge_size7_class4": { + "mass": 80, + "optmass": 2700, + "maxfuel": 12.8, + "fuelmul": 0.012, + "fuelpower": 2.75 + }, + "int_hyperdrive_overcharge_size7_class5": { + "mass": 80, + "optmass": 3000, + "maxfuel": 13.1, + "fuelmul": 0.013, + "fuelpower": 2.75 + }, "int_hyperdrive_size2_class1": { "mass": 2.5, "optmass": 48, @@ -3153,6 +3363,21 @@ "python_armour_reactive": { "mass": 53 }, + "python_nx_armour_grade1": { + "mass": 0 + }, + "python_nx_armour_grade2": { + "mass": 26 + }, + "python_nx_armour_grade3": { + "mass": 53 + }, + "python_nx_armour_mirrored": { + "mass": 53 + }, + "python_nx_armour_reactive": { + "mass": 53 + }, "sidewinder_armour_grade1": { "mass": 0 }, From 6032e5202d74d30cc187e467fd1cbc49e6e5f2a4 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sat, 11 May 2024 17:58:39 -0400 Subject: [PATCH 255/425] [RELEASE] 5.10.6 --- ChangeLog.md | 29 +++++++++++++++++++++++++++++ config/__init__.py | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 324d1f8d..1dc357f1 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,6 +6,27 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- +Release 5.10.6 +=== +This release contains the data information for the new SCO modules added in Elite update 18.04. +This should represent full support for the new Python Mk II. + +We now sign our code! This does mean that built EXEs are now slightly modified on our developer's machines. +For information on what this means, and opt-out options, please visit https://github.com/EDCD/EDMarketConnector/wiki/Code-Signing-and-EDMC + +**Changes and Enhancements** +* Added new SCO Module Details +* Reverted a change from the prior release due to breaking some consumers. +**Plugin Developers** +* modules.p and ships.p are deprecated, and slated for removal in 5.11+! +* The `openurl()` function in ttkHyperlinkLabel has been deprecated, +and slated for removal in 5.11+! Please migrate to `webbrowser.open()`. + +**Plugin Developers** +* modules.p and ships.p are deprecated, and slated for removal in 5.11+! +* The `openurl()` function in ttkHyperlinkLabel has been deprecated, +and slated for removal in 5.11+! Please migrate to `webbrowser.open()`. + Release 5.10.5 === This release contains a fix for a bug that could crash EDMC's console versions when reading outfitting information @@ -14,6 +35,9 @@ from the new SCO Frame Shift Drive modules. Please note that this does not offer full support for the new SCO modules or the Python Mk II. More support will be added in a future update. +We now sign our code! This does mean that built EXEs are now slightly modified on our developer's machines. +For information on what this means, and opt-out options, please visit https://github.com/EDCD/EDMarketConnector/wiki/Code-Signing-and-EDMC + **Changes and Enhancements** * Updated Translations * Added limited data regarding the Python Mk II @@ -24,6 +48,11 @@ be added in a future update. * Fixed a bug where the new SCO modules would display as a normal Frame Shift Drive * Fixed a bug which could crash EDMC if the exact details of a Frame Shift Drive were unknown +**Plugin Developers** +* modules.p and ships.p are deprecated, and slated for removal in 5.11+! +* The `openurl()` function in ttkHyperlinkLabel has been deprecated, +and slated for removal in 5.11+! Please migrate to `webbrowser.open()`. + Release 5.10.4 === This release contains updated dependencies, modules files, translations, and adds two new EDDN schemas. It also diff --git a/config/__init__.py b/config/__init__.py index a4a1e200..7e81d968 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -53,7 +53,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.10.5' +_static_appversion = '5.10.6' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From 8b7923e186321d4fad7c397b484cdbed9e7dd82f Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sat, 11 May 2024 17:58:39 -0400 Subject: [PATCH 256/425] [RELEASE] 5.10.6 --- ChangeLog.md | 29 +++++++++++++++++++++++++++++ config/__init__.py | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 324d1f8d..1dc357f1 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,6 +6,27 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- +Release 5.10.6 +=== +This release contains the data information for the new SCO modules added in Elite update 18.04. +This should represent full support for the new Python Mk II. + +We now sign our code! This does mean that built EXEs are now slightly modified on our developer's machines. +For information on what this means, and opt-out options, please visit https://github.com/EDCD/EDMarketConnector/wiki/Code-Signing-and-EDMC + +**Changes and Enhancements** +* Added new SCO Module Details +* Reverted a change from the prior release due to breaking some consumers. +**Plugin Developers** +* modules.p and ships.p are deprecated, and slated for removal in 5.11+! +* The `openurl()` function in ttkHyperlinkLabel has been deprecated, +and slated for removal in 5.11+! Please migrate to `webbrowser.open()`. + +**Plugin Developers** +* modules.p and ships.p are deprecated, and slated for removal in 5.11+! +* The `openurl()` function in ttkHyperlinkLabel has been deprecated, +and slated for removal in 5.11+! Please migrate to `webbrowser.open()`. + Release 5.10.5 === This release contains a fix for a bug that could crash EDMC's console versions when reading outfitting information @@ -14,6 +35,9 @@ from the new SCO Frame Shift Drive modules. Please note that this does not offer full support for the new SCO modules or the Python Mk II. More support will be added in a future update. +We now sign our code! This does mean that built EXEs are now slightly modified on our developer's machines. +For information on what this means, and opt-out options, please visit https://github.com/EDCD/EDMarketConnector/wiki/Code-Signing-and-EDMC + **Changes and Enhancements** * Updated Translations * Added limited data regarding the Python Mk II @@ -24,6 +48,11 @@ be added in a future update. * Fixed a bug where the new SCO modules would display as a normal Frame Shift Drive * Fixed a bug which could crash EDMC if the exact details of a Frame Shift Drive were unknown +**Plugin Developers** +* modules.p and ships.p are deprecated, and slated for removal in 5.11+! +* The `openurl()` function in ttkHyperlinkLabel has been deprecated, +and slated for removal in 5.11+! Please migrate to `webbrowser.open()`. + Release 5.10.4 === This release contains updated dependencies, modules files, translations, and adds two new EDDN schemas. It also diff --git a/config/__init__.py b/config/__init__.py index 92347c0b..0a12e2ec 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -54,7 +54,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.10.5' +_static_appversion = '5.10.6' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From 37b13fd81d1f9c0bea32f2fd474baf74b9fbb1d6 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sat, 11 May 2024 18:10:32 -0400 Subject: [PATCH 257/425] [5.10.6] Update XML --- ChangeLog.md | 3 ++- edmarketconnector.xml | 21 +++++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 7d14ca9c..e0d98bf4 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -15,8 +15,9 @@ We now sign our code! This does mean that built EXEs are now slightly modified o For information on what this means, and opt-out options, please visit https://github.com/EDCD/EDMarketConnector/wiki/Code-Signing-and-EDMC **Changes and Enhancements** -* Added new SCO Module Details +* Added new SCO and Python Armor Module Details * Reverted a change from the prior release due to breaking some consumers. + **Plugin Developers** * modules.p and ships.p are deprecated, and slated for removal in 5.11+! * The `openurl()` function in ttkHyperlinkLabel has been deprecated, diff --git a/edmarketconnector.xml b/edmarketconnector.xml index 40fa6c00..88ff05ce 100644 --- a/edmarketconnector.xml +++ b/edmarketconnector.xml @@ -22,10 +22,27 @@
- Release 5.10.5 + Release 5.10.6 body { font-family:"Segoe UI","Tahoma"; font-size: 75%; } h2 { font-family:"Segoe UI","Tahoma"; font-size: 105%; }

We now test against, and package with, Python 3.11.7.

As a result, we do not support Windows 7, 8, or 8.1.
+

Release 5.10.6

+

This release contains the data information for the new SCO modules added in Elite update 18.04. +This should represent full support for the new Python Mk II.

+

We now sign our code! This does mean that built EXEs are now slightly modified on our developer's machines. +For information on what this means, and opt-out options, please visit https://github.com/EDCD/EDMarketConnector/wiki/Code-Signing-and-EDMC

+

Changes and Enhancements

+
    +
  • Added new SCO and Python Armor Module Details
  • +
  • Reverted a change from the prior release due to breaking some consumers.
  • +
+

Plugin Developers

+
    +
  • modules.p and ships.p are deprecated, and slated for removal in 5.11+!
  • +
  • The openurl() function in ttkHyperlinkLabel has been deprecated, +and slated for removal in 5.11+! Please migrate to webbrowser.open().
  • +
+

Release 5.10.5

This release contains a fix for a bug that could crash EDMC's console versions when reading outfitting information from the new SCO Frame Shift Drive modules.

Please note that this does not offer full support for the new SCO modules or the Python Mk II. More support will be added in a future update.

@@ -2255,7 +2272,7 @@ about this: PTS CAPI saying Commander is Docked after jumping to new system.

]]>
- +
From ad16f0666dabc95a385942902e229fb034c5ecf8 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 12 May 2024 23:16:45 -0400 Subject: [PATCH 258/425] [2232] Fix Missing Preferences Fixes an issue that could present on clean installs where the EDSM keys weren't generated properly. When the heck did this bug get introduced??? --- plugins/edsm.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/plugins/edsm.py b/plugins/edsm.py index 5cd974d5..fd4d3925 100644 --- a/plugins/edsm.py +++ b/plugins/edsm.py @@ -491,6 +491,20 @@ def credentials(cmdr: str) -> tuple[str, str] | None: edsm_usernames = config.get_list('edsm_usernames') edsm_apikeys = config.get_list('edsm_apikeys') + if not edsm_usernames: # https://github.com/EDCD/EDMarketConnector/issues/2232 + edsm_usernames = ["" for _ in range(len(cmdrs))] + config.set('edsm_usernames', edsm_usernames) + else: # Check for Mismatched Length - fill with null values. + if len(edsm_usernames) < len(cmdrs): + edsm_usernames.extend(["" for _ in range(len(cmdrs) - len(edsm_usernames))]) + + if not edsm_apikeys: + edsm_apikeys = ["" for _ in range(len(cmdrs))] + config.set('edsm_apikeys', edsm_apikeys) + else: # Check for Mismatched Length - fill with null values. + if len(edsm_apikeys) < len(cmdrs): + edsm_apikeys.extend(["" for _ in range(len(cmdrs) - len(edsm_apikeys))]) + if cmdr in cmdrs and len(cmdrs) == len(edsm_usernames) == len(edsm_apikeys): idx = cmdrs.index(cmdr) if idx < len(edsm_usernames) and idx < len(edsm_apikeys): From eece4c2ba75e51c7062905c885ba8fd180b791cd Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 12 May 2024 23:18:24 -0400 Subject: [PATCH 259/425] [2232] Set EDSM Settings --- plugins/edsm.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/edsm.py b/plugins/edsm.py index fd4d3925..1d9f8cb8 100644 --- a/plugins/edsm.py +++ b/plugins/edsm.py @@ -493,17 +493,17 @@ def credentials(cmdr: str) -> tuple[str, str] | None: if not edsm_usernames: # https://github.com/EDCD/EDMarketConnector/issues/2232 edsm_usernames = ["" for _ in range(len(cmdrs))] - config.set('edsm_usernames', edsm_usernames) else: # Check for Mismatched Length - fill with null values. if len(edsm_usernames) < len(cmdrs): edsm_usernames.extend(["" for _ in range(len(cmdrs) - len(edsm_usernames))]) + config.set('edsm_usernames', edsm_usernames) if not edsm_apikeys: edsm_apikeys = ["" for _ in range(len(cmdrs))] - config.set('edsm_apikeys', edsm_apikeys) else: # Check for Mismatched Length - fill with null values. if len(edsm_apikeys) < len(cmdrs): edsm_apikeys.extend(["" for _ in range(len(cmdrs) - len(edsm_apikeys))]) + config.set('edsm_apikeys', edsm_apikeys) if cmdr in cmdrs and len(cmdrs) == len(edsm_usernames) == len(edsm_apikeys): idx = cmdrs.index(cmdr) From fb6206279a4ba47e171ee12feeba00adc05f9740 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 13 May 2024 12:27:39 +0000 Subject: [PATCH 260/425] updating submodules --- coriolis-data | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coriolis-data b/coriolis-data index 8adfd86b..651aab5a 160000 --- a/coriolis-data +++ b/coriolis-data @@ -1 +1 @@ -Subproject commit 8adfd86b64e8c14e873d2f5123d88ca6743420b9 +Subproject commit 651aab5af6a22980a1f88dcbb9ed256244cd6dff From 64cd5b3cc5ad8e2463b1da121f1e2f0107972dca Mon Sep 17 00:00:00 2001 From: Phoebe <40956085+C1701D@users.noreply.github.com> Date: Tue, 14 May 2024 01:42:26 +0200 Subject: [PATCH 261/425] [1173] Add alt_URL check --- ttkHyperlinkLabel.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/ttkHyperlinkLabel.py b/ttkHyperlinkLabel.py index 3bb878a6..f7780566 100644 --- a/ttkHyperlinkLabel.py +++ b/ttkHyperlinkLabel.py @@ -19,6 +19,7 @@ In addition to standard ttk.Label arguments, takes the following arguments: May be imported by plugins """ from __future__ import annotations +import html from functools import partial import sys import tkinter as tk @@ -27,9 +28,11 @@ from tkinter import font as tk_font from tkinter import ttk from typing import Any import plug +from os import path from config import config, logger from l10n import translations as tr from monitor import monitor +from EDMarketConnector import SHIPYARD_HTML_TEMPLATE class HyperlinkLabel(tk.Label or ttk.Label): # type: ignore @@ -70,7 +73,7 @@ class HyperlinkLabel(tk.Label or ttk.Label): # type: ignore # Add Menu Options self.plug_options = kw.pop('plug_options', None) self.name = kw.get('name', None) - if self.name == 'ship' and not bool(config.get_int("use_alt_shipyard_open")): + if self.name == 'ship': self.menu.add_separator() for url in plug.provides('shipyard_url'): self.menu.add_command( @@ -96,12 +99,27 @@ class HyperlinkLabel(tk.Label or ttk.Label): # type: ignore def open_shipyard(self, url: str): """Open the Current Ship Loadout in the Selected Provider.""" - if loadout := monitor.ship(): + if not (loadout := monitor.ship()): + logger.warning('No ship loadout, aborting.') + return '' + if not bool(config.get_int("use_alt_shipyard_open")): opener = plug.invoke(url, 'EDSY', 'shipyard_url', loadout, monitor.is_beta) if opener: return webbrowser.open(opener) - logger.warning('No ship loadout, aborting.') - return '' + else: + # Avoid file length limits if possible + provider = config.get_str('shipyard_provider', default='EDSY') + target = plug.invoke(provider, 'EDSY', 'shipyard_url', loadout, monitor.is_beta) + file_name = path.join(config.app_dir_path, "last_shipyard.html") + + with open(file_name, 'w') as f: + f.write(SHIPYARD_HTML_TEMPLATE.format( + link=html.escape(str(target)), + provider_name=html.escape(str(provider)), + ship_name=html.escape("Ship") + )) + + webbrowser.open(f'file://localhost/{file_name}') def open_system(self, url: str): """Open the Current System in the Selected Provider.""" From 459881d618ee04cfcfc2875139570c3bd1f86de6 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 13 May 2024 19:45:53 -0400 Subject: [PATCH 262/425] [1173] Fix Circular Import --- EDMarketConnector.py | 17 +---------------- ttkHyperlinkLabel.py | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index d9243063..8eebd631 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -431,25 +431,10 @@ from hotkey import hotkeymgr from l10n import translations as tr from monitor import monitor from theme import theme -from ttkHyperlinkLabel import HyperlinkLabel +from ttkHyperlinkLabel import HyperlinkLabel, SHIPYARD_HTML_TEMPLATE SERVER_RETRY = 5 # retry pause for Companion servers [s] -SHIPYARD_HTML_TEMPLATE = """ - - - - - Redirecting you to your {ship_name} at {provider_name}... - - - - You should be redirected to your {ship_name} at {provider_name} shortly... - - - -""" - class AppWindow: """Define the main application window.""" diff --git a/ttkHyperlinkLabel.py b/ttkHyperlinkLabel.py index f7780566..3ec0a26d 100644 --- a/ttkHyperlinkLabel.py +++ b/ttkHyperlinkLabel.py @@ -32,7 +32,21 @@ from os import path from config import config, logger from l10n import translations as tr from monitor import monitor -from EDMarketConnector import SHIPYARD_HTML_TEMPLATE + +SHIPYARD_HTML_TEMPLATE = """ + + + + + Redirecting you to your {ship_name} at {provider_name}... + + + + You should be redirected to your {ship_name} at {provider_name} shortly... + + + +""" class HyperlinkLabel(tk.Label or ttk.Label): # type: ignore From 68fac14c676a25263cb50b1618caa812a0ffc62e Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 14 May 2024 20:13:49 -0400 Subject: [PATCH 263/425] [Translations] Update Translations --- EDMarketConnector.py | 2 +- L10n/en.template | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index 4932ea0d..15b068d3 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -2205,7 +2205,7 @@ sys.path: {sys.path}''' logger.exception(f"EDMC Critical Error: {err}") title = tr.tl("Error") # LANG: Generic error prefix message = tr.tl( # LANG: EDMC Critical Error Notification - "EDSM encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!" + "EDMC encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!" ) err = f"{err.__class__.__name__}: {err}" # type: ignore # hijacking the existing exception detection detail = tr.tl( # LANG: EDMC Critical Error Details diff --git a/L10n/en.template b/L10n/en.template index ae854134..8e82a9e4 100644 --- a/L10n/en.template +++ b/L10n/en.template @@ -37,7 +37,7 @@ "Error: unable to get token" = "Error: unable to get token"; /* EDMarketConnector.py: EDMC Critical Error Notification; */ -"EDSM encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!" = "EDSM encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!"; +"EDMC encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!" = "EDSM encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!"; /* EDMarketConnector.py: EDMC Critical Error Details; */ "Here's what EDMC Detected:\r\n\r\n{ERR}\r\n\r\nDo you want to file a Bug Report on GitHub?" = "Here's what EDMC Detected:\r\n\r\n{ERR}\r\n\r\nDo you want to file a Bug Report on GitHub?"; From 148c853b1e191aa0c8e049daabd8c4176666f85b Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 14 May 2024 23:04:16 -0400 Subject: [PATCH 264/425] *Grumble Grumble* --- L10n/en.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/L10n/en.template b/L10n/en.template index 8e82a9e4..307841b2 100644 --- a/L10n/en.template +++ b/L10n/en.template @@ -37,7 +37,7 @@ "Error: unable to get token" = "Error: unable to get token"; /* EDMarketConnector.py: EDMC Critical Error Notification; */ -"EDMC encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!" = "EDSM encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!"; +"EDMC encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!" = "EDMC encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!"; /* EDMarketConnector.py: EDMC Critical Error Details; */ "Here's what EDMC Detected:\r\n\r\n{ERR}\r\n\r\nDo you want to file a Bug Report on GitHub?" = "Here's what EDMC Detected:\r\n\r\n{ERR}\r\n\r\nDo you want to file a Bug Report on GitHub?"; From 77720685de54e368fcdeff5eb405819df4543ce5 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 20 May 2024 11:50:33 -0400 Subject: [PATCH 265/425] [Minor] Update Version for Alpha Tracking --- config/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/__init__.py b/config/__init__.py index 7e81d968..bf514186 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -53,7 +53,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.10.6' +_static_appversion = '5.11.0-alpha3' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From 950a204305e83639be904f68ecbeebc40f0f9099 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 May 2024 05:59:14 +0000 Subject: [PATCH 266/425] --- updated-dependencies: - dependency-name: requests dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index b6a7482f..34091caf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ certifi==2024.2.2 -requests==2.31.0 +requests==2.32.0 # requests depends on this now ? charset-normalizer==3.3.2 From f6d7100f24ae070dd57836bebae7a6f39720bcb0 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 21 May 2024 16:54:49 -0400 Subject: [PATCH 267/425] [Fix] Update Translations, Fix Menu Creation, Fix Alt URL --- L10n/en.template | 9 ++++++ myNotebook.py | 10 ++++--- ttkHyperlinkLabel.py | 67 ++++++++++++++++++++++++-------------------- 3 files changed, 51 insertions(+), 35 deletions(-) diff --git a/L10n/en.template b/L10n/en.template index 307841b2..56e45805 100644 --- a/L10n/en.template +++ b/L10n/en.template @@ -126,6 +126,15 @@ /* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:962; ttkHyperlinkLabel.py:53; */ "Copy" = "Copy"; +/* myNotebook.py: Label for 'Cut' as in 'Cut and Paste'; */ +"Cut" = "Cut"; + +/* myNotebook.py: Label for 'Paste' as in 'Copy and Paste'; */ +"Paste" = "Paste"; + +/* myNotebook.py: Label for 'Select All'; */ +"Select All" = "Select All"; + /* EDMarketConnector.py: CAPI auth aborted because of killswitch; EDMarketConnector.py: CAPI auth query aborted because of killswitch; In files: EDMarketConnector.py:973; EDMarketConnector.py:1067; */ "CAPI auth disabled by killswitch" = "CAPI auth disabled by killswitch"; diff --git a/myNotebook.py b/myNotebook.py index 8a3cf901..635af5c1 100644 --- a/myNotebook.py +++ b/myNotebook.py @@ -67,12 +67,14 @@ class EntryMenu(ttk.Entry): ttk.Entry.__init__(self, *args, **kwargs) self.menu = tk.Menu(self, tearoff=False) - self.menu.add_command(label="Copy", command=self.copy) - self.menu.add_command(label="Cut", command=self.cut) + self.menu.add_command(label=tr.tl("Copy"), command=self.copy) # LANG: Label for 'Copy' as in 'Copy and Paste' + self.menu.add_command(label=tr.tl("Cut"), command=self.cut) # LANG: Label for 'Cut' as in 'Cut and Paste' self.menu.add_separator() - self.menu.add_command(label="Paste", command=self.paste) + # LANG: Label for 'Paste' as in 'Copy and Paste' + self.menu.add_command(label=tr.tl("Paste"), command=self.paste) self.menu.add_separator() - self.menu.add_command(label="Select All", command=self.select_all) + # LANG: Label for 'Select All' + self.menu.add_command(label=tr.tl("Select All"), command=self.select_all) self.bind("", self.display_popup) diff --git a/ttkHyperlinkLabel.py b/ttkHyperlinkLabel.py index 3ec0a26d..6266d9fb 100644 --- a/ttkHyperlinkLabel.py +++ b/ttkHyperlinkLabel.py @@ -70,10 +70,6 @@ class HyperlinkLabel(tk.Label or ttk.Label): # type: ignore ttk.Label.__init__(self, master, **kw) self.bind('', self._click) - - self.menu = tk.Menu(tearoff=tk.FALSE) - # LANG: Label for 'Copy' as in 'Copy and Paste' - self.menu.add_command(label=tr.tl('Copy'), command=self.copy) # As in Copy and Paste self.bind('', self._contextmenu) self.bind('', self._enter) @@ -87,29 +83,6 @@ class HyperlinkLabel(tk.Label or ttk.Label): # type: ignore # Add Menu Options self.plug_options = kw.pop('plug_options', None) self.name = kw.get('name', None) - if self.name == 'ship': - self.menu.add_separator() - for url in plug.provides('shipyard_url'): - self.menu.add_command( - label=tr.tl("Open in {URL}").format(URL=url), # LANG: Open Element In Selected Provider - command=partial(self.open_shipyard, url) - ) - - if self.name == 'station': - self.menu.add_separator() - for url in plug.provides('station_url'): - self.menu.add_command( - label=tr.tl("Open in {URL}").format(URL=url), # LANG: Open Element In Selected Provider - command=partial(self.open_station, url) - ) - - if self.name == 'system': - self.menu.add_separator() - for url in plug.provides('system_url'): - self.menu.add_command( - label=tr.tl("Open in {URL}").format(URL=url), # LANG: Open Element In Selected Provider - command=partial(self.open_system, url) - ) def open_shipyard(self, url: str): """Open the Current Ship Loadout in the Selected Provider.""" @@ -122,14 +95,13 @@ class HyperlinkLabel(tk.Label or ttk.Label): # type: ignore return webbrowser.open(opener) else: # Avoid file length limits if possible - provider = config.get_str('shipyard_provider', default='EDSY') - target = plug.invoke(provider, 'EDSY', 'shipyard_url', loadout, monitor.is_beta) + target = plug.invoke(url, 'EDSY', 'shipyard_url', loadout, monitor.is_beta) file_name = path.join(config.app_dir_path, "last_shipyard.html") with open(file_name, 'w') as f: f.write(SHIPYARD_HTML_TEMPLATE.format( link=html.escape(str(target)), - provider_name=html.escape(str(provider)), + provider_name=html.escape(str(url)), ship_name=html.escape("Ship") )) @@ -212,8 +184,41 @@ class HyperlinkLabel(tk.Label or ttk.Label): # type: ignore webbrowser.open(url) def _contextmenu(self, event: tk.Event) -> None: + """ + Display the context menu when right-clicked. + + :param event: The event object. + """ + menu = tk.Menu(tearoff=tk.FALSE) + # LANG: Label for 'Copy' as in 'Copy and Paste' + menu.add_command(label=tr.tl('Copy'), command=self.copy) # As in Copy and Paste + + if self.name == 'ship': + menu.add_separator() + for url in plug.provides('shipyard_url'): + menu.add_command( + label=tr.tl("Open in {URL}").format(URL=url), # LANG: Open Element In Selected Provider + command=partial(self.open_shipyard, url) + ) + + if self.name == 'station': + menu.add_separator() + for url in plug.provides('station_url'): + menu.add_command( + label=tr.tl("Open in {URL}").format(URL=url), # LANG: Open Element In Selected Provider + command=partial(self.open_station, url) + ) + + if self.name == 'system': + menu.add_separator() + for url in plug.provides('system_url'): + menu.add_command( + label=tr.tl("Open in {URL}").format(URL=url), # LANG: Open Element In Selected Provider + command=partial(self.open_system, url) + ) + if self['text'] and (self.popup_copy(self['text']) if callable(self.popup_copy) else self.popup_copy): - self.menu.post(event.x_root, event.y_root) + menu.post(event.x_root, event.y_root) def copy(self) -> None: """Copy the current text to the clipboard.""" From 778ccaeaaa6d9e13db4ec61b01f7a2df5babac58 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 26 May 2024 14:42:12 -0400 Subject: [PATCH 268/425] [519] Fix Padding & Display Levels --- EDMarketConnector.py | 2 +- prefs.py | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index 92c0f491..cfa68ce7 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -844,7 +844,7 @@ class AppWindow: ) update_msg = update_msg.replace('\\n', '\n') update_msg = update_msg.replace('\\r', '\r') - stable_popup = tk.messagebox.askyesno(title=title, message=update_msg) + stable_popup = tk.messagebox.askyesno(title=title, message=update_msg, parent=postargs.get('Parent')) if stable_popup: webbrowser.open("https://github.com/edCD/eDMarketConnector/releases/latest") diff --git a/prefs.py b/prefs.py index cdbb4fc4..5567e094 100644 --- a/prefs.py +++ b/prefs.py @@ -535,7 +535,7 @@ class PreferencesDialog(tk.Toplevel): ) self.update_track.configure(width=15) - self.update_track.grid(column=1, pady=self.BOXY, sticky=tk.W, row=curr_row) + self.update_track.grid(column=1, pady=self.BOXY, padx=self.PADX, sticky=tk.W, row=curr_row) self.disable_autoappupdatecheckingame = tk.IntVar(value=config.get_int('disable_autoappupdatecheckingame')) self.disable_autoappupdatecheckingame_btn = nb.Checkbutton( @@ -1262,8 +1262,9 @@ class PreferencesDialog(tk.Toplevel): # Send to the Post Config if we updated the update branch post_flags = { 'Update': True if self.curr_update_track != self.update_paths.get() else False, - 'Track': self.update_paths.get() - } + 'Track': self.update_paths.get(), + 'Parent': self + } # Notify if self.callback: self.callback(**post_flags) From fe7afad5e7b8acb30a55a933087c7f2b47f019af Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 26 May 2024 15:14:02 -0400 Subject: [PATCH 269/425] [Fix] Set Parent for messageboxes --- EDMCSystemProfiler.py | 2 +- EDMarketConnector.py | 12 ++++++++---- myNotebook.py | 3 ++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/EDMCSystemProfiler.py b/EDMCSystemProfiler.py index 90a96cee..92502cc8 100644 --- a/EDMCSystemProfiler.py +++ b/EDMCSystemProfiler.py @@ -105,7 +105,7 @@ def copy_sys_report(root: tk.Tk, report: str) -> None: """Copy the system info to the keyboard.""" root.clipboard_clear() root.clipboard_append(report) - messagebox.showinfo("System Profiler", "System Report copied to Clipboard") + messagebox.showinfo("System Profiler", "System Report copied to Clipboard", parent=root) def main() -> None: diff --git a/EDMarketConnector.py b/EDMarketConnector.py index cfa68ce7..7f870108 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -2068,7 +2068,8 @@ def validate_providers(): tk.messagebox.showinfo( # LANG: Popup window title for Reset Providers tr.tl('EDMC: Default Providers Reset'), - popup_text + popup_text, + parent=root ) @@ -2237,7 +2238,8 @@ sys.path: {sys.path}''' detail = detail.replace('\\n', '\n') detail = detail.replace('\\r', '\r') msg = tk.messagebox.askyesno( - title=title, message=message, detail=detail, icon=tkinter.messagebox.ERROR, type=tkinter.messagebox.YESNO + title=title, message=message, detail=detail, icon=tkinter.messagebox.ERROR, type=tkinter.messagebox.YESNO, + parent=root ) if msg: webbrowser.open( @@ -2271,7 +2273,8 @@ sys.path: {sys.path}''' tk.messagebox.showinfo( # LANG: Popup window title for list of 'broken' plugins that failed to load tr.tl('EDMC: Broken Plugins'), - popup_text + popup_text, + parent=root ) def messagebox_not_py3(): @@ -2301,7 +2304,8 @@ sys.path: {sys.path}''' tk.messagebox.showinfo( # LANG: Popup window title for list of 'enabled' plugins that don't work with Python 3.x tr.tl('EDMC: Plugins Without Python 3.x Support'), - popup_text + popup_text, + parent=root ) config.set('plugins_not_py3_last', int(time())) diff --git a/myNotebook.py b/myNotebook.py index 635af5c1..0b083c23 100644 --- a/myNotebook.py +++ b/myNotebook.py @@ -108,7 +108,8 @@ class EntryMenu(ttk.Entry): # Hijack existing translation, yes it doesn't exactly match here. messagebox.showwarning( tr.tl('Error'), # LANG: Generic error prefix - following text is from Frontier auth service; - tr.tl('Cannot paste non-text content.') # LANG: Can't Paste Images or Files in Text + tr.tl('Cannot paste non-text content.'), # LANG: Can't Paste Images or Files in Text + parent=self.master ) return text = self.clipboard_get() From bbb7d4bf32990c53df07c8deec205bbc14d11326 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 26 May 2024 16:56:16 -0400 Subject: [PATCH 270/425] [Lang] Update Languages --- L10n/cs.strings | 24 ----------------- L10n/de.strings | 45 +++++++++++-------------------- L10n/es.strings | 24 ----------------- L10n/fi.strings | 24 ----------------- L10n/fr.strings | 24 ----------------- L10n/hu.strings | 24 ----------------- L10n/it.strings | 51 +++++++++++++---------------------- L10n/ja.strings | 31 +--------------------- L10n/ko.strings | 24 ----------------- L10n/lv.strings | 24 ----------------- L10n/nl.strings | 24 ----------------- L10n/pl.strings | 31 +--------------------- L10n/pt-BR.strings | 58 +++++++++++++++++++--------------------- L10n/pt-PT.strings | 59 ++++++++++++++++++++--------------------- L10n/ru.strings | 45 +++++++++++-------------------- L10n/sl.strings | 24 ----------------- L10n/sr-Latn-BA.strings | 30 --------------------- L10n/sr-Latn.strings | 45 +++++++++++-------------------- L10n/sv-SE.strings | 24 ----------------- L10n/tr.strings | 45 +++++++++++-------------------- L10n/uk.strings | 24 ----------------- L10n/zh-Hans.strings | 24 ----------------- 22 files changed, 137 insertions(+), 591 deletions(-) diff --git a/L10n/cs.strings b/L10n/cs.strings index 071b5e69..d432effe 100644 --- a/L10n/cs.strings +++ b/L10n/cs.strings @@ -61,12 +61,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Upravit"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "Zobrazit"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Okno"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Nápověda"; @@ -256,9 +250,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "Chyba: Inara {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Nastavení"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Vyberte, která data chcete ukládat"; @@ -277,9 +268,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Cesta k souboru"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Změnit..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Procházet..."; @@ -289,21 +277,9 @@ /* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:431; prefs.py:446; */ "E:D journal file location" = "E:D umístění souboru deníku"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Klávesová zkratka"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Klávesová zkratka"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "Restartujte {APP} pro aktivaci klávesových zkratek"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} vyžaduje oprávnění pro použití klávesových zkratek"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Otevřít Předvolby systému"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Pouze pokud je Elite: Dangerous aktivní"; diff --git a/L10n/de.strings b/L10n/de.strings index be36b877..448607ac 100644 --- a/L10n/de.strings +++ b/L10n/de.strings @@ -36,6 +36,12 @@ /* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:508; */ "Error: unable to get token" = "Fehler: konnte Token nicht erhalten"; +/* EDMarketConnector.py: EDMC Critical Error Notification; */ +"EDMC encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!" = "EDMC ist in einen unwiederbringlichen kritischen Fehler gelaufen. EDMC fährt zum Selbstschutz herunter!"; + +/* EDMarketConnector.py: EDMC Critical Error Details; */ +"Here's what EDMC Detected:\r\n\r\n{ERR}\r\n\r\nDo you want to file a Bug Report on GitHub?" = "Das hat EDMC erkannt:\n\n{ERR}\n\nMöchtest Du einen Bug Report auf GitHub einreichen?"; + /* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:844; */ "Frontier CAPI down for maintenance" = "Frontier CAPI offline wegen Wartung"; @@ -78,12 +84,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Bearbeiten"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "Ansicht"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Fenster"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Hilfe"; @@ -93,6 +93,9 @@ /* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:930; EDMarketConnector.py:958; */ "Check for Updates..." = "Auf Aktualisierungen überprüfen..."; +/* EDMarketConnector.py: Help > Open System Profiler; In files: EDMarketConnector.py:888; */ +"Open System Profiler" = "Öffne System Profiler"; + /* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:931; EDMarketConnector.py:948; */ "Save Raw Data..." = "Speichere Originaldaten..."; @@ -213,12 +216,6 @@ /* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:2253:2259; */ "One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Eins oder mehr deiner aktivierten Plugins hat noch keinen Support für Python 3.x. Du kannst dir die Liste im '{PLUGINS}'-Tab unter '{FILE}' > '{SETTINGS}' ansehen. Du solltest prüfen, ob es für diese Updates gibt und ansonsten dem Entwickler Bescheid geben, dass sie ihren Code für Python 3.x aktualisieren müssen.\n\nDu kannst ein Plugin deaktivieren, indem du dessen Ordner ein '{DISABLED}' am Ende des Namens anhängst."; -/* EDMarketConnector.py: Popup-text about missing FDEVID Files; In files: EDMarketConnector.py:2329; */ -"FDevID Files not found! Some functionality regarding commodities may be disabled.\r\n\r\n Do you want to open the Wiki page on how to set up submodules?" = "FDevID Dateien nicht gefunden! Einige Funktionen in Bezug auf Waren sind möglicherweise deaktiviert.\n\nMöchten du die Wiki-Seite zum Einrichten von Submodulen öffnen?"; - -/* EDMarketConnector.py: Popup window title for missing FDEVID files; In files: EDMarketConnector.py:2340; */ -"FDevIDs: Missing Commodity Files" = "FDevIDs: Warendateien fehlen"; - /* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:2263; prefs.py:986; */ "Plugins" = "Plugins"; @@ -351,9 +348,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "Fehler: Inara {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Einstellungen"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Bitte wähle zu speichernde Daten aus"; @@ -372,9 +366,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Speicherort"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Ordner..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Durchsuchen..."; @@ -390,21 +381,9 @@ /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "Fleet Carrier CAPI-Anfragen aktivieren"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Makro"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Hotkey"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "Starte {APP} neu, um den Tastenkürzel nutzen zu können"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} benötigt für Tastenkürzel Systemrechte (Bedienungshilfen)"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Öffne Systemeinstellungen"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Nur wenn Elite: Dangerous geöffnet ist"; @@ -782,3 +761,9 @@ /* update.py: Update Available Text; In files: update.py:229; */ "{NEWVER} is available" = "{NEWVER} ist verfügbar"; + +/* myNotebook.py: Can't Paste Images or Files in Text; */ +"Cannot paste non-text content." = "Kann keinen non-Text-Inhalt einfügen."; + +/* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ +"Open in {URL}" = "Öffnen in {URL}"; diff --git a/L10n/es.strings b/L10n/es.strings index 18874ccf..96bb83bc 100644 --- a/L10n/es.strings +++ b/L10n/es.strings @@ -67,12 +67,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Editar"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "Visualización"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Ventana"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Ayuda"; @@ -271,9 +265,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "Error: Inara {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Preferencias"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Seleccione qué datos quiere guardar"; @@ -292,9 +283,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Localización de archivos"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Cambiar..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Examinar..."; @@ -304,21 +292,9 @@ /* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:431; prefs.py:446; */ "E:D journal file location" = "Localización del archivo de Journal de E:D"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Tecla de acceso directo"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Tecla de acceso directo"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "Reinicie {APP} para usar los accesos directos de teclado"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} necesita permisos para usar teclas de acceso directo"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Abrir Preferencias del Sistema"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Solo cuando Elite: Dangerous es la aplicación activa"; diff --git a/L10n/fi.strings b/L10n/fi.strings index d53d3bc8..198a0eba 100644 --- a/L10n/fi.strings +++ b/L10n/fi.strings @@ -61,12 +61,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Muokkaa"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "Näytä"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Ikkuna"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Apua"; @@ -229,9 +223,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "Inaran virhe: {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Valinnat"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Valitse mitkä tiedot tallennetaan"; @@ -250,9 +241,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Tiedostosijainti"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Muuta..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Selaa..."; @@ -262,21 +250,9 @@ /* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:431; prefs.py:446; */ "E:D journal file location" = "E:D lokikirjan tiedostosijainti"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Näppäimistöoikopolku"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Pikanäppäin"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "Käynnistä {APP} uudelleen käyttääksesi pikanäppäimiä"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} tarvitsee lupasi pikakuvakkeiden käyttämiseen"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Avaa järjestelmän asetukset"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Vain jos Elite:Dangerous on käynnissä"; diff --git a/L10n/fr.strings b/L10n/fr.strings index 5d53fd24..d8e54ca0 100644 --- a/L10n/fr.strings +++ b/L10n/fr.strings @@ -78,12 +78,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Édition"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "Présentation"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Fenêtre"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Aide"; @@ -222,9 +216,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "Erreur : Inara {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Préférences"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Veuillez choisir les données à sauvegarder"; @@ -243,9 +234,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Emplacement des fichiers"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Spécifier..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Parcourir..."; @@ -255,21 +243,9 @@ /* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:431; prefs.py:446; */ "E:D journal file location" = "Emplacement du journal E:D"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Raccourci clavier"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Raccourci clavier"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "Rédémarrez {APP} pour utiliser les raccourcis"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} a besoin de permissions pour utiliser les raccourcis"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Ouvrir Préférences Système"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Seulement quand Elite: Dangerous est l'application active"; diff --git a/L10n/hu.strings b/L10n/hu.strings index c3311ac7..cf141709 100644 --- a/L10n/hu.strings +++ b/L10n/hu.strings @@ -37,12 +37,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Szerkeszt"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "Nézet"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Ablak"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Segítség"; @@ -169,9 +163,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "Hiba:Inara {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Beállítások"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Kérem válassza ki a menteni kivánt adatokat."; @@ -190,9 +181,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Fálj helye"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Módosítás..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Böngész"; @@ -202,21 +190,9 @@ /* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:431; prefs.py:446; */ "E:D journal file location" = "E:D journal fájl helye"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Billentyűparancsok"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Gyorsgomb"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "Újranidítás {APP} parancsikonok használatával"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} engedély szükséges a parancsikon használatához"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Rendszerbeállítások megnyitáss"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Csak ha az Elite Dangerous fut"; diff --git a/L10n/it.strings b/L10n/it.strings index c1cd9b33..024a732f 100644 --- a/L10n/it.strings +++ b/L10n/it.strings @@ -2,10 +2,10 @@ "Send flight log and CMDR status to EDSM" = "Invia il registro di volo e lo stato del CMDR a EDSM"; /* prefs.py:Label on button used to open a filesystem folder; In files: prefs.py:706; */ -"Open Log Folder" = "Cartella Log"; +"Open Log Folder" = "Apri la Cartella dei Log"; /* inara.py:Text Inara Show API key; In files: inara.py:305; */ -"Show API Key" = "Mostra API Key"; +"Show API Key" = "Mostra l'API Key"; /* Language name */ "!Language" = "Italiano"; @@ -36,11 +36,17 @@ /* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:508; */ "Error: unable to get token" = "Errore: impossibile ottenere il token"; +/* EDMarketConnector.py: EDMC Critical Error Notification; */ +"EDMC encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!" = "EDMC ha incontrato un errore critico, e non riesce a risolvere. EDMC si spegnerà in via cautelativa!"; + +/* EDMarketConnector.py: EDMC Critical Error Details; */ +"Here's what EDMC Detected:\r\n\r\n{ERR}\r\n\r\nDo you want to file a Bug Report on GitHub?" = "Ecco cosa EDMC ha rilevato:\n\n{ERR}\n\nVuoi compilare un Rapporto di Bug su GitHub?"; + /* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:844; */ "Frontier CAPI down for maintenance" = "CAPI di Frontier inattivo per manutenzione"; /* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:856; */ -"Frontier CAPI query failure" = "Errore nella query CAPI di Frontier"; +"Frontier CAPI query failure" = "Query CAPI di Frontier fallita"; /* EDMarketConnector.py: Main UI Update button; EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:601; EDMarketConnector.py:919; EDMarketConnector.py:1748; */ "Update" = "Recupera"; @@ -78,12 +84,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Appunti"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "Vista"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Finestra"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Guida"; @@ -93,6 +93,9 @@ /* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:930; EDMarketConnector.py:958; */ "Check for Updates..." = "Controlla aggiornamenti..."; +/* EDMarketConnector.py: Help > Open System Profiler; In files: EDMarketConnector.py:888; */ +"Open System Profiler" = "Apri Profilazione di Sistema"; + /* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:931; EDMarketConnector.py:948; */ "Save Raw Data..." = "Salva i Dati Grezzi..."; @@ -213,12 +216,6 @@ /* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:2253:2259; */ "One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Uno o più dei tuoi plugin non ha ancora il supporto per Python 3.x. Per favore guarda la lista '{PLUGINS}' nella tab a '{FILE}' > '{SETTINGS}'. Dovresti controllare se ci sono aggiornamenti, altrimenti avvisa gli sviluppatori che devono aggiornare il codice a Python 3.x.\n\nPuoi disabilitare il plugin rinominando la cartella aggiungendo '{DISABLED}' alla fine del nome."; -/* EDMarketConnector.py: Popup-text about missing FDEVID Files; In files: EDMarketConnector.py:2329; */ -"FDevID Files not found! Some functionality regarding commodities may be disabled.\r\n\r\n Do you want to open the Wiki page on how to set up submodules?" = "File FDevID non trovati! Alcune funzionalità relative alle commodities potrebbero essere disabilitate.\n\n Vuoi aprire la pagina Wiki su come impostare i sottomoduli?"; - -/* EDMarketConnector.py: Popup window title for missing FDEVID files; In files: EDMarketConnector.py:2340; */ -"FDevIDs: Missing Commodity Files" = "FDevID: file delle Commodity mancanti"; - /* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:2263; prefs.py:986; */ "Plugins" = "Plugins"; @@ -351,9 +348,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "Errore: Inara {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Preferenze"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Si prega di scegliere che dati salvare"; @@ -372,9 +366,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Percorso del file"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Cambia..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Sfoglia..."; @@ -390,21 +381,9 @@ /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "Abilita le query CAPI della Fleetcarrier"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Scorciatoia di tastiera"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Hotkey"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "Riavvia {APP} per usare le scorciatoie"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} ha bisogno dei permessi per usare le scorciatoie"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Apri Preferenze di Sistema"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Solo quando “Elite: Dangerous” è in primo piano"; @@ -803,3 +782,9 @@ /* update.py: Update Available Text; In files: update.py:229; */ "{NEWVER} is available" = "{NEWVER} è disponibile"; + +/* myNotebook.py: Can't Paste Images or Files in Text; */ +"Cannot paste non-text content." = "Non si può incollare contenuto non testuale"; + +/* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ +"Open in {URL}" = "Apri {URL}"; diff --git a/L10n/ja.strings b/L10n/ja.strings index 75acb252..fcb336f1 100644 --- a/L10n/ja.strings +++ b/L10n/ja.strings @@ -78,12 +78,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "編集"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "表示"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "ウィンドウ"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "ヘルプ"; @@ -213,12 +207,6 @@ /* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:2253:2259; */ "One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "有効にしている1つ以上のプラグインがPython 3.xをサポートしていません。'{FILE}' > '{SETTINGS}'\nメニューで表示される設定ダイアログの'{PLUGINS}' タブの一覧を確認してください。更新済みのバージョンがあるかを確認し、なければ開発者にPython 3.xに対応するように開発者に連絡してください。\n\nプラグインを無効にするにはフォルダ名の最後に'{DISABLED}'を追加してください。"; -/* EDMarketConnector.py: Popup-text about missing FDEVID Files; In files: EDMarketConnector.py:2329; */ -"FDevID Files not found! Some functionality regarding commodities may be disabled.\r\n\r\n Do you want to open the Wiki page on how to set up submodules?" = "FDevIDファイルが見つかりません!商品に関するいくつかの機能が無効になるかもしれません。\n\nサブモジュールの設定方法についてのWikiページを開きますか?"; - -/* EDMarketConnector.py: Popup window title for missing FDEVID files; In files: EDMarketConnector.py:2340; */ -"FDevIDs: Missing Commodity Files" = "FDevIDs: 商品ファイルが見つかりません"; - /* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:2263; prefs.py:986; */ "Plugins" = "プラグイン"; @@ -351,9 +339,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "エラー: Inara {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "環境設定"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "保存するデータの種類を選択して下さい"; @@ -372,9 +357,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "ファイルの出力先"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "変更..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "参照..."; @@ -390,21 +372,9 @@ /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "フリートキャリアCAPIクエリを有効にする"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "ショートカット"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "ホットキー"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "ショートカットを利用するには {APP} を再起動してください"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} がショートカットを利用するには許可が必要です"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "システム環境設定を開く"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Elite: Dangerousがアクティブの時だけ有効"; @@ -803,3 +773,4 @@ /* update.py: Update Available Text; In files: update.py:229; */ "{NEWVER} is available" = "{NEWVER} があります"; + diff --git a/L10n/ko.strings b/L10n/ko.strings index e29ad74f..58e43ba4 100644 --- a/L10n/ko.strings +++ b/L10n/ko.strings @@ -70,12 +70,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "편집"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "보기"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "창"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "도움말"; @@ -289,9 +283,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "오류: Inara {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "설정"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "어느 데이터를 저장할 지 선택해주세요"; @@ -310,9 +301,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "파일 위치"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "바꾸기..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "찾아보기..."; @@ -322,21 +310,9 @@ /* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:431; prefs.py:446; */ "E:D journal file location" = "E:D 저널(journal) 파일 위치"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "단축키 설정"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "단축키"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "단축키를 사용하려면 {APP}을(를) 다시 시작하십시오"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "단축기 사용을 위해선 {APP}이 권한 허용을 필요로 합니다"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "시스템 설정 열기"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Elite: Dangerous가 활성 창 상태일때만"; diff --git a/L10n/lv.strings b/L10n/lv.strings index 3aa46284..a99cfd44 100644 --- a/L10n/lv.strings +++ b/L10n/lv.strings @@ -34,12 +34,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Labot"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "Skats"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Logs"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Palīdzība"; @@ -157,9 +151,6 @@ /* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:953; edsm.py:1043; */ "Error: Can't connect to EDSM" = "Kļūda: Nevar savienoties ar EDSM"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Iestatījumi"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Lūdzu izvēlaties kādus datus saglabāt"; @@ -178,9 +169,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Faila atrašanās vieta"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Mainīt..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Pārlūkot..."; @@ -190,21 +178,9 @@ /* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:431; prefs.py:446; */ "E:D journal file location" = "E:D žurnāla faila atrašanās vieta"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Ātrais taustiņš"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Ātrais taustiņš"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "Restartējiet {APP} lai izmantotu īssceļus"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} vajag atļaujas lai izmantotu īssceļus"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Atvērt sistēmas iestatījumus"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Tikai kad Elite: Dangerous ir aktīvā aplikācija"; diff --git a/L10n/nl.strings b/L10n/nl.strings index f6a4a32f..a3232089 100644 --- a/L10n/nl.strings +++ b/L10n/nl.strings @@ -37,12 +37,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Bewerken"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "Beeld"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Venster"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Help"; @@ -175,9 +169,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "Fout: Inara {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Preferences"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Welke gegevens wilt u opslaan?"; @@ -196,9 +187,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Bestand locatie"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Wijzigen..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Bladeren..."; @@ -208,21 +196,9 @@ /* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:431; prefs.py:446; */ "E:D journal file location" = "E:D journaal bestand locatie"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Toetscombinaties"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Hotkey"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "{APP} heropstarten om toetscombinaties te gebruiken"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} heeft toestemming nodig om toetscombinaties te gebruiken"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Open Systeemvoorkeuren"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Alleen wanneer Elite: Dangerous de actieve applicatie is"; diff --git a/L10n/pl.strings b/L10n/pl.strings index efde05be..3ab5992a 100644 --- a/L10n/pl.strings +++ b/L10n/pl.strings @@ -78,12 +78,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Edycja"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "Widok"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Okno"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Pomoc"; @@ -213,12 +207,6 @@ /* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:2253:2259; */ "One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Co najmniej jeden z uruchomionych pluginów nie wspiera Python 3.x. Sprawdź listę w '{FILE}' > '{SETTINGS}', sekcja '{PLUGINS}'. Upewnij się, że dostępna jest aktualna wersja pluginu, w przeciwnym razie poinformuj twórcę, że należy zaktualizować kod do wersji Python 3.x.\n\nMożesz wyłączyć plugin, dodając '{DISABLED}' na koniec nazwy jego folderu."; -/* EDMarketConnector.py: Popup-text about missing FDEVID Files; In files: EDMarketConnector.py:2329; */ -"FDevID Files not found! Some functionality regarding commodities may be disabled.\r\n\r\n Do you want to open the Wiki page on how to set up submodules?" = "Pliki FDevID nie znalezione. Część funkcjonalności związanej z materiałami może nie działać. \n\nChcesz otworzyć stronę Wiki dotyczacą konfiguracji podmodułów?"; - -/* EDMarketConnector.py: Popup window title for missing FDEVID files; In files: EDMarketConnector.py:2340; */ -"FDevIDs: Missing Commodity Files" = "FDevIDs: Brakuje plików z towarami."; - /* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:2263; prefs.py:986; */ "Plugins" = "Pluginy"; @@ -351,9 +339,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "Błąd: Inara {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Preferencje"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Jakie dane zapisywać"; @@ -372,9 +357,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Położenie pliku"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Zmień..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Przeglądaj..."; @@ -390,21 +372,9 @@ /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "Włącz zapytania CAPI dla lotniskowca"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Skrót klawiaturowy"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Skr. Klaw."; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "Zrestartuj {APP} by użyć{CR}skrótu klawiszowego."; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} wymaga uprawnień by{CR}móc korzystać ze skrótów klawiszowych."; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Otwórz Preferencje systemowe"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Tylko gdy Elite: Dangerous jest aplikacją aktywną"; @@ -803,3 +773,4 @@ /* update.py: Update Available Text; In files: update.py:229; */ "{NEWVER} is available" = "Dostępna nowa wersja {NEWVER}"; + diff --git a/L10n/pt-BR.strings b/L10n/pt-BR.strings index b4d9e933..48922eb4 100644 --- a/L10n/pt-BR.strings +++ b/L10n/pt-BR.strings @@ -36,6 +36,12 @@ /* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:508; */ "Error: unable to get token" = "Erro: não foi possível obter o token"; +/* EDMarketConnector.py: EDMC Critical Error Notification; */ +"EDMC encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!" = "EDMC encontrou um erro crítico e não conseguiu recuperar-se. Encerrando o EDMC para proteção própria!"; + +/* EDMarketConnector.py: EDMC Critical Error Details; */ +"Here's what EDMC Detected:\r\n\r\n{ERR}\r\n\r\nDo you want to file a Bug Report on GitHub?" = "Aqui está o que o EDMC detectou:\n\n{ERR}\n\nGostaria de reportar o bug em nosso GitHub?"; + /* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:844; */ "Frontier CAPI down for maintenance" = "CAPI da Frontier indisponível por manutenção"; @@ -78,12 +84,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Editar"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "Visualizar"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Janela"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Ajuda"; @@ -93,6 +93,9 @@ /* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:930; EDMarketConnector.py:958; */ "Check for Updates..." = "Verificar por Atualizações..."; +/* EDMarketConnector.py: Help > Open System Profiler; In files: EDMarketConnector.py:888; */ +"Open System Profiler" = "Abrir Perfil de Sistema"; + /* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:931; EDMarketConnector.py:948; */ "Save Raw Data..." = "Salvar dados brutos..."; @@ -213,12 +216,6 @@ /* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:2253:2259; */ "One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Um ou mais dos plugins habilitados não possuem suporte ao Python 3.x. Você pode ver a lista na guia '{PLUGINS}' em '{FILE}' > '{SETTINGS}'. Você deve verificar se existe versão atualizada ou então avisar o desenvolvedor de que ele precisa atualizar o código para o Python 3.x.\n\nVocê pode desabilitar um plugin renomeando sua pasta para que seu nome termine com '{DISABLED}'."; -/* EDMarketConnector.py: Popup-text about missing FDEVID Files; In files: EDMarketConnector.py:2329; */ -"FDevID Files not found! Some functionality regarding commodities may be disabled.\r\n\r\n Do you want to open the Wiki page on how to set up submodules?" = "Arquivo FDevID não encontrados! Algumas funções de mercadorias podem estar indisponíveis.\n\nGostaria de abrir a Wiki com instruções para configurar sub-módulos?"; - -/* EDMarketConnector.py: Popup window title for missing FDEVID files; In files: EDMarketConnector.py:2340; */ -"FDevIDs: Missing Commodity Files" = "FDevIDs: Arquivos de Mercadorias não encontrados"; - /* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:2263; prefs.py:986; */ "Plugins" = "Plugins"; @@ -351,9 +348,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "Erro: Inara {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Preferências"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Por favor, escolha quais dados para salvar"; @@ -372,9 +366,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Localização do Arquivo"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Alterar..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Procurar..."; @@ -390,21 +381,9 @@ /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "Ativar requisições CAPI para porta-frotas"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Atalho de teclado"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Tecla de atalho"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "Reinicie o {APP} para usar os atalhos"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} precisa de permissão para usar atalhos"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Abrir preferências do sistema"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Somente quando o Elite: Dangerous é o aplicativo ativo"; @@ -803,3 +782,22 @@ /* update.py: Update Available Text; In files: update.py:229; */ "{NEWVER} is available" = "{NEWVER} está disponível"; + +/* prefs.py: Stable Version of EDMC; */ +"Stable" = "Estável"; + +/* prefs.py: Select the Update Track (Beta, Stable); */ +"Update Track" = "Caminho de Atualizações"; + +/* EDMarketConnector.py: Inform the user the Update Track has changed; */ +"Update Track Changed to {TRACK}" = "Caminho de Atualizações modificado para {TRACK}"; + + +/* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ +"Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Caminho de atualizações modificado de Estável para Beta. Você não receberá mais atualizações Beta. Você seguirá na versão Beta atual até a próxima atualização Estável.\n\nVocê pode reverter manualmente para a última versão Estável. Para fazer isso, faça download e instale a última versão Estável manualmente. Fique atento: isto pode introduzir bugs ou quebrar completamente a aplicação caso você o retorno volte para uma versão principal com mudanças significativas.\n\nGostaria de abrir o GitHub para fazer download da última versão?"; + +/* myNotebook.py: Can't Paste Images or Files in Text; */ +"Cannot paste non-text content." = "Só é possível colar texto."; + +/* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ +"Open in {URL}" = "Abrir em {URL}"; diff --git a/L10n/pt-PT.strings b/L10n/pt-PT.strings index 0fd5b585..68d4912d 100644 --- a/L10n/pt-PT.strings +++ b/L10n/pt-PT.strings @@ -36,6 +36,12 @@ /* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:508; */ "Error: unable to get token" = "Erro: Não é possível obter o token"; +/* EDMarketConnector.py: EDMC Critical Error Notification; */ +"EDMC encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!" = "O EDMC encontrou um erro crítico e não consegue recuperar. O EDMC irá desligar-se para proteção própria."; + +/* EDMarketConnector.py: EDMC Critical Error Details; */ +"Here's what EDMC Detected:\r\n\r\n{ERR}\r\n\r\nDo you want to file a Bug Report on GitHub?" = "O EDMC detectou o seguinte:\n\n{ERR}\n\nDeseja preencher um Bug Report no GitHub?"; + /* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:844; */ "Frontier CAPI down for maintenance" = "CAPI da Frontier em manutenção."; @@ -78,12 +84,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Editar"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "Ver"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Janela"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Ajuda"; @@ -93,6 +93,9 @@ /* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:930; EDMarketConnector.py:958; */ "Check for Updates..." = "Procurar por Actualizações..."; +/* EDMarketConnector.py: Help > Open System Profiler; In files: EDMarketConnector.py:888; */ +"Open System Profiler" = "Abrir Informações do Sistema"; + /* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:931; EDMarketConnector.py:948; */ "Save Raw Data..." = "Salvar dados em bruto..."; @@ -213,12 +216,6 @@ /* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:2253:2259; */ "One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Um ou mais dos plugins activados não possui ainda suporte para Python 3.x. Por favor verifique a lista na aba '{PLUGINS}' em '{FILE}' > '{SETTINGS}'. Deverá verificar se está disponível uma versão mais actualizada, caso contrário, informe o desenvolvedor de que necessita de actualizar o código para suportar Python 3.x.\n\nPode desactivar um plugin colocando '{DISABLED}' no fim do nome da pasta correspondente."; -/* EDMarketConnector.py: Popup-text about missing FDEVID Files; In files: EDMarketConnector.py:2329; */ -"FDevID Files not found! Some functionality regarding commodities may be disabled.\r\n\r\n Do you want to open the Wiki page on how to set up submodules?" = "Ficheiros FDevID não encontrados. Algumas funcionalidades relacionadas com mercadorias poderão estar indisponíveis.\nDeseja abrir a página da Wiki sobre configuração de submódulos?"; - -/* EDMarketConnector.py: Popup window title for missing FDEVID files; In files: EDMarketConnector.py:2340; */ -"FDevIDs: Missing Commodity Files" = "FDevIDs: Ficheiros de Mercadorias em falta."; - /* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:2263; prefs.py:986; */ "Plugins" = "Plugins"; @@ -231,6 +228,18 @@ /* EDMarketConnector.py: Popup-text about 'broken' plugins that failed to load; In files: EDMarketConnector.py:2266; */ "One or more of your enabled plugins failed to load. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. This could be caused by a wrong folder structure. The load.py file should be located under plugins/PLUGIN_NAME/load.py.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Um ou mais dos plugins activados não arrancou correctamente. Por favor consule a lista na aba {PLUGINS}', em '{FILE}' > '{SETTINGS}'. Isto poderá ser causado por má estrutura de pastas. O ficheiro load.py deverá estar dentro de plugins/NOME_DO_PLUGIN/load.py. \nPode desactivar um plugin colocando '{DISABLED}' no fim do nome da pasta."; +/* EDMarketConnector.py: Popup-text about Reset Providers; In files: EDMarketConnector.py:2146; */ +"One or more of your URL Providers were invalid, and have been reset:\r\n\r\n" = "Um ou vários dos Provedores de URLs eram inválidos e foram reconfigurados.\n"; + +/* EDMarketConnector.py: Text About What Provider Was Reset; In files: EDMarketConnector.py:2148; */ +"{PROVIDER} was set to {OLDPROV}, and has been reset to {NEWPROV}\r\n" = "{PROVIDER} era {OLDPROV}, foi reconfigurado para {NEWPROV}"; + +/* EDMarketConnector.py: Popup window title for Reset Providers; In files: EDMarketConnector.py:2161; */ +"EDMC: Default Providers Reset" = "EDMC: Provedores for defeito reconfigurados."; + +/* EDMarketConnector.py: Await Full CMDR Login to Game; In files: EDMarketConnector.py:813; */ +"Awaiting Full CMDR Login" = "Aguardando pelo login completo do CMDR."; + /* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:208; */ "Journal directory already locked" = "Directório do Diário já se encontra bloqueado"; @@ -339,9 +348,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "Erro: Inara: {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Preferências"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Por favor escolher quais os dados a guardar"; @@ -360,9 +366,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Localização do Ficheiro"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Alterar..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Procurar..."; @@ -378,21 +381,9 @@ /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "Ligar Consultas CAPI de Transportador de Frota"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Atalho de Teclado"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Tecla Rápida"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "Reinicie o {APP} para usar os atalhos"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "A {APP} precisa de autorização para usar atalhos"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Abrir Preferências do Sistema"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Apenas quando o Elite:Dangerous é a aplicação activa"; @@ -789,3 +780,11 @@ /* stats.py: Status dialog title; In files: stats.py:418; */ "Ships" = "Naves"; +/* update.py: Update Available Text; In files: update.py:229; */ +"{NEWVER} is available" = "{NEWVER} disponível."; + +/* myNotebook.py: Can't Paste Images or Files in Text; */ +"Cannot paste non-text content." = "Só é possível colar conteúdo texto."; + +/* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ +"Open in {URL}" = "Abrir em {URL}"; diff --git a/L10n/ru.strings b/L10n/ru.strings index 19449e21..54f77d62 100644 --- a/L10n/ru.strings +++ b/L10n/ru.strings @@ -36,6 +36,12 @@ /* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:508; */ "Error: unable to get token" = "Ошибка: не удается получить токен"; +/* EDMarketConnector.py: EDMC Critical Error Notification; */ +"EDMC encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!" = "EDMC столкнулся с критической ошибкой и не может восстановиться. EDMC отключается для собственной защиты!"; + +/* EDMarketConnector.py: EDMC Critical Error Details; */ +"Here's what EDMC Detected:\r\n\r\n{ERR}\r\n\r\nDo you want to file a Bug Report on GitHub?" = "Вот что обнаружил EDMC:\n\n{ERR}\n\nВы хотите отправить сообщение об ошибке на GitHub?"; + /* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:844; */ "Frontier CAPI down for maintenance" = "Frontier CAPI остановлен для технического обслуживания"; @@ -78,12 +84,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Правка"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "Вид"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Окно"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Дополнительно"; @@ -93,6 +93,9 @@ /* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:930; EDMarketConnector.py:958; */ "Check for Updates..." = "Проверить наличие обновлений..."; +/* EDMarketConnector.py: Help > Open System Profiler; In files: EDMarketConnector.py:888; */ +"Open System Profiler" = "Открыть системный профайлер"; + /* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:931; EDMarketConnector.py:948; */ "Save Raw Data..." = "Сохранить \"сырые\" данные.."; @@ -213,12 +216,6 @@ /* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:2253:2259; */ "One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Один или несколько ваших подключённых плагинов ещё не имеют поддержки Python 3.x. Пожалуйста, ознакомьтесь со списком во вкладке '{PLUGINS}' '{FILE}' > '{SETTINGS}'. Вы должны проверить наличие обновлённой версии, в противном случае предупредите разработчика о необходимости обновления кода на Python 3.x.\n\nВы можете отключить плагин, переименовав его папку в '{DISABLED}'."; -/* EDMarketConnector.py: Popup-text about missing FDEVID Files; In files: EDMarketConnector.py:2329; */ -"FDevID Files not found! Some functionality regarding commodities may be disabled.\r\n\r\n Do you want to open the Wiki page on how to set up submodules?" = "FDevID файлы не найдены! Некоторые функции, связанные с товарами, могут быть отключены.\n\nВы хотите открыть страницу Wiki о том, как настроить вспомогательные модули?"; - -/* EDMarketConnector.py: Popup window title for missing FDEVID files; In files: EDMarketConnector.py:2340; */ -"FDevIDs: Missing Commodity Files" = "FDevIDs: отсутствуют файлы товаров"; - /* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:2263; prefs.py:986; */ "Plugins" = "Плагины"; @@ -351,9 +348,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "Ошибка: Inara {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Настройки"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Выберите какие данные стоит сохранять"; @@ -372,9 +366,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Путь хранения файлов"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Обзор..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Просмотреть..."; @@ -390,21 +381,9 @@ /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "Включить запросы к CAPI о флотоносце"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Сочетание клавиш"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Горячая клавиша"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "Перезапустите {APP}, чтобы использовать сочетание клавиш"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} требуется разрешение на использование глобальных сочетаний клавиш"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Открыты «Настройки системы»"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Только когда окно Elite: Dangerous активно"; @@ -803,3 +782,9 @@ /* update.py: Update Available Text; In files: update.py:229; */ "{NEWVER} is available" = "{NEWVER} доступен"; + +/* myNotebook.py: Can't Paste Images or Files in Text; */ +"Cannot paste non-text content." = "Невозможно добавить нетекстовое содержимое."; + +/* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ +"Open in {URL}" = "Открыть через {URL}"; diff --git a/L10n/sl.strings b/L10n/sl.strings index 1ecb1753..1c038e61 100644 --- a/L10n/sl.strings +++ b/L10n/sl.strings @@ -31,12 +31,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Uredi"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "Pogled"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Okno"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Pomoč"; @@ -136,9 +130,6 @@ /* edsm.py: EDSM Plugin - Error connecting to EDSM API; In files: edsm.py:953; edsm.py:1043; */ "Error: Can't connect to EDSM" = "Napaka: Povezava z EDSM ni mogoča"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Nastavitve"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Izberite podatke, ki jih želite shraniti"; @@ -154,30 +145,15 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Lokacija datoteke"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Spremeni..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Prebrskaj..."; /* prefs.py: Label for 'Output' Settings/Preferences tab; In files: prefs.py:405; */ "Output" = "Izpis"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Bližnjica"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Bližnjica"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "Ponovno poženi {APP} za uporabo bližnjic"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} potrebuje dovoljenja za uporabo bližnjic"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Odpri sistemske nastavitve"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Samo ko je Elite:Dangerous aktivna aplikacija "; diff --git a/L10n/sr-Latn-BA.strings b/L10n/sr-Latn-BA.strings index f541416a..2d79e7e9 100644 --- a/L10n/sr-Latn-BA.strings +++ b/L10n/sr-Latn-BA.strings @@ -78,12 +78,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Uredi"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "Pogled"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Prozor"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Pomoć"; @@ -213,12 +207,6 @@ /* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:2253:2259; */ "One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Jedan ili više aktiviranih dodataka (plugins) nemaju podršku za Python 3.x. Pogledajte listu u '{PLUGINS}' tabu u '{FILE}' > '{SETTINGS}'. Provjerite da li postoji nadograđena verzija ili obavijesite autora da treba da promijeni kod za Python 3.x.\n\nMožete deaktivirati dodatak (plugin) dodavanjem '{DISABLED}' na kraju imena njegovog foldera."; -/* EDMarketConnector.py: Popup-text about missing FDEVID Files; In files: EDMarketConnector.py:2329; */ -"FDevID Files not found! Some functionality regarding commodities may be disabled.\r\n\r\n Do you want to open the Wiki page on how to set up submodules?" = "FDevID fajlovi nisu pronađeni. Određene opcije vezane za robu bi mogle da budu nedostupne.\n\nDa li želite da otvorite Wiki stranicu sa uputstvom za podešavanje podmodula?"; - -/* EDMarketConnector.py: Popup window title for missing FDEVID files; In files: EDMarketConnector.py:2340; */ -"FDevIDs: Missing Commodity Files" = "FDevIDs: Nedostaju Commodity fajlovi"; - /* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:2263; prefs.py:986; */ "Plugins" = "Dodaci (plugins)"; @@ -339,9 +327,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "Greška: Inara {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Podešavanja"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Izaberite koji podaci se snimaju"; @@ -360,9 +345,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Lokacija fajlova"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Promijeni..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Potraži..."; @@ -378,21 +360,9 @@ /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "Omogući Fleetcarrier CAPI Upite"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Prečica"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Prečica"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "Restartujte {APP} da bi ste koristili prečice"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} traži dozvolu da koristi prečice"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Otvori sistemska podešavanja"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Samo kada je Elite: Dangerous aktivna aplikacija"; diff --git a/L10n/sr-Latn.strings b/L10n/sr-Latn.strings index e801d067..291a036b 100644 --- a/L10n/sr-Latn.strings +++ b/L10n/sr-Latn.strings @@ -36,6 +36,12 @@ /* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:508; */ "Error: unable to get token" = "Greška: nemoguće dobaviti token"; +/* EDMarketConnector.py: EDMC Critical Error Notification; */ +"EDMC encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!" = "EDMC je naišao na kritičnu grešku i ne može da se oporavi. EDMC će biti ugašen radi svoje zaštite."; + +/* EDMarketConnector.py: EDMC Critical Error Details; */ +"Here's what EDMC Detected:\r\n\r\n{ERR}\r\n\r\nDo you want to file a Bug Report on GitHub?" = "Evo šta je EDMC detektovao:\n\n{ERR}\n\nDa li želite da napravite Bug Report na GitHub-u?"; + /* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:844; */ "Frontier CAPI down for maintenance" = "Frontier CAPI isključen radi održavanja"; @@ -78,12 +84,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Izmeni"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "Pogled"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Prozor"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Pomoć"; @@ -93,6 +93,9 @@ /* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:930; EDMarketConnector.py:958; */ "Check for Updates..." = "Proveri da li postoje izmene..."; +/* EDMarketConnector.py: Help > Open System Profiler; In files: EDMarketConnector.py:888; */ +"Open System Profiler" = "Otvori System Profiler"; + /* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:931; EDMarketConnector.py:948; */ "Save Raw Data..." = "Snimi sirove podatke..."; @@ -213,12 +216,6 @@ /* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:2253:2259; */ "One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Jedan ili više aktiviranih dodataka (plugins) nemaju podršku za Python 3.x. Pogledajte listu u '{PLUGINS}' tabu u '{FILE}' > '{SETTINGS}'. Proverite da li postoji nadograđena verzija ili obavesite autora da treba da promeni kod za Python 3.x.\n\nMožete deaktivirati dodatak (plugin) dodavanjem '{DISABLED}' na kraju imena njegovog foldera."; -/* EDMarketConnector.py: Popup-text about missing FDEVID Files; In files: EDMarketConnector.py:2329; */ -"FDevID Files not found! Some functionality regarding commodities may be disabled.\r\n\r\n Do you want to open the Wiki page on how to set up submodules?" = "FDevID fajlovi nisu pronađeni! Neke funkcionalnosti vezane za artikle će možda biti deaktivirane.\n\nDa li želite da otvorite Wiki stranu koja objašnjava kako da podesite pod-module?"; - -/* EDMarketConnector.py: Popup window title for missing FDEVID files; In files: EDMarketConnector.py:2340; */ -"FDevIDs: Missing Commodity Files" = "FDevIDs: Nedostaju fajlovi za robu"; - /* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:2263; prefs.py:986; */ "Plugins" = "Dodaci (plugins)"; @@ -351,9 +348,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "Greška: Inara {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Podešavanja"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Izaberite koji se podaci snimaju"; @@ -372,9 +366,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Lokacija fajlova"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Izmeni..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Potraži..."; @@ -390,21 +381,9 @@ /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "Aktiviraj Fleetcarrier CAPIU Upite"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Skraćenica"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Skraćenica"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "Restartujte {APP} da bi ste koristili skraćenice"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} traži dozvolu da koristi skraćenice"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Otvori sistemska podešavanja"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Samo kada je Elite: Dangerous aktivna aplikacija"; @@ -803,3 +782,9 @@ /* update.py: Update Available Text; In files: update.py:229; */ "{NEWVER} is available" = "{NEWVER} je dostupna"; + +/* myNotebook.py: Can't Paste Images or Files in Text; */ +"Cannot paste non-text content." = "Nemoguće je nalepiti netekstualni sadržaj."; + +/* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ +"Open in {URL}" = "Otvori na {URL}"; diff --git a/L10n/sv-SE.strings b/L10n/sv-SE.strings index 8f944159..e0f63e0c 100644 --- a/L10n/sv-SE.strings +++ b/L10n/sv-SE.strings @@ -37,12 +37,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Ändra"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "View"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Fönster"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Hjälp"; @@ -175,9 +169,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "Fel: Inara {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Inställningar"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Välj vilket data som skall lagras"; @@ -196,9 +187,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Filsökväg"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Ändra..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Bläddra..."; @@ -208,21 +196,9 @@ /* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:431; prefs.py:446; */ "E:D journal file location" = "E:D journal-fil sökväg"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Genväg, tangentbord"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Snabbkommando"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "Starta om {APP} för att använda genvägar"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} behöver rättigheter för att använda genvägar"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Öppna systeminställningar"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Bara när: Elite Dangerous är det aktiva programmet"; diff --git a/L10n/tr.strings b/L10n/tr.strings index 9d37dfa1..a7fbabe1 100644 --- a/L10n/tr.strings +++ b/L10n/tr.strings @@ -36,6 +36,12 @@ /* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:508; */ "Error: unable to get token" = "Hata: token erişilemedi"; +/* EDMarketConnector.py: EDMC Critical Error Notification; */ +"EDMC encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!" = "EDMC kritik bir hatayla karşılaştı ve kurtarılamıyor. EDMC kendi koruması için kapanıyor!"; + +/* EDMarketConnector.py: EDMC Critical Error Details; */ +"Here's what EDMC Detected:\r\n\r\n{ERR}\r\n\r\nDo you want to file a Bug Report on GitHub?" = "EDMC tespit edilen hata:\n\n{ERR}\n\nGitHub'da bir Hata Raporu göndermek ister misiniz?"; + /* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:844; */ "Frontier CAPI down for maintenance" = "Frontier CAPI bakım için kapalı durumda"; @@ -78,12 +84,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Düzenle"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "Görüntüle"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Pencere"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Yardım"; @@ -93,6 +93,9 @@ /* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:930; EDMarketConnector.py:958; */ "Check for Updates..." = "Güncellemeleri Denetle..."; +/* EDMarketConnector.py: Help > Open System Profiler; In files: EDMarketConnector.py:888; */ +"Open System Profiler" = "Sistem Profilcisi'ni açın"; + /* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:931; EDMarketConnector.py:948; */ "Save Raw Data..." = "Ham Verileri Kaydet..."; @@ -213,12 +216,6 @@ /* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:2253:2259; */ "One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Etkin eklentilerinizden bir veya daha fazlası henüz Python 3.x desteğine sahip değil. '{PLUGINS}' sekmesindeki '{FILE}' > '{SETTINGS}' bölümünde bulunan listeyi bulun. Güncellenmiş bir sürümün mevcut olup olmadığını kontrol edin, aksi takdirde geliştiriciyi Python 3.x kodunu güncellemesi gerektiği konusunda uyarmalısınız.\n\nBir eklentiyi, klasörünü adının sonunda '{DISABLED}' olacak şekilde yeniden adlandırarak devre dışı bırakabilirsiniz."; -/* EDMarketConnector.py: Popup-text about missing FDEVID Files; In files: EDMarketConnector.py:2329; */ -"FDevID Files not found! Some functionality regarding commodities may be disabled.\r\n\r\n Do you want to open the Wiki page on how to set up submodules?" = "FDevID Dosyaları bulunamadı! Ürünlerle ilgili bazı işlevler devre dışı bırakılabilir.\n\nAlt modüllerin nasıl kurulacağına ilişkin Wiki sayfasını açmak ister misiniz?"; - -/* EDMarketConnector.py: Popup window title for missing FDEVID files; In files: EDMarketConnector.py:2340; */ -"FDevIDs: Missing Commodity Files" = "FDevIDs: Eksik Ürün Dosyaları"; - /* EDMarketConnector.py: Settings > Plugins tab; prefs.py: Label on Settings > Plugins tab; In files: EDMarketConnector.py:2263; prefs.py:986; */ "Plugins" = "Eklentiler"; @@ -351,9 +348,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "Hata: Inara {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Tercihler"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Lütfen hangi verilerin kaydedileceğini seçin"; @@ -372,9 +366,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Dosya konumu"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Değiştir..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Gezin..."; @@ -390,21 +381,9 @@ /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "Filo Taşıyıcı CAPI sorgulamalarını etkinleştir"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Klavye Kısayolu"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Kısayoltuşu"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "Kısayolları kullanmak için {APP}'i yeniden başlat"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP}'nin kısayolları kullanabilmesi için izne ihtiyacı var"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Sistem Tercihlerini Aç"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Sadece Elite: Dangerous aktif uygulama olduğunda"; @@ -803,3 +782,9 @@ /* update.py: Update Available Text; In files: update.py:229; */ "{NEWVER} is available" = "{NEWVER} sürüm mevcut"; + +/* myNotebook.py: Can't Paste Images or Files in Text; */ +"Cannot paste non-text content." = "Metin dışı içerik yapıştırılamadı"; + +/* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ +"Open in {URL}" = "Şurada aç {URL}"; diff --git a/L10n/uk.strings b/L10n/uk.strings index 35d2c229..125200f1 100644 --- a/L10n/uk.strings +++ b/L10n/uk.strings @@ -55,12 +55,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "Редагувати"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "Вид"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "Вікно"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "Довідка"; @@ -211,9 +205,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "Помилка: Inara {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "Уподобання"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "Оберіть дані які буде збережено"; @@ -232,9 +223,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "Розташування файлу"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "Внесення змін..."; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "Перегляд..."; @@ -244,21 +232,9 @@ /* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:431; prefs.py:446; */ "E:D journal file location" = "Розташування файлу-журналу E:D"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "Сполучення клавіш"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Гаряча клавіша"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "Перезавантажте {APP} для використання ярликів"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} необхідні дозволи для використання ярликів"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "Відкрити налаштування системи"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "Тільки тоді, коли Elite: Dangerous є активним додатком"; diff --git a/L10n/zh-Hans.strings b/L10n/zh-Hans.strings index 03e263dd..2cc13543 100644 --- a/L10n/zh-Hans.strings +++ b/L10n/zh-Hans.strings @@ -70,12 +70,6 @@ /* EDMarketConnector.py: 'Edit' menu title on OSX; EDMarketConnector.py: 'Edit' menu title; In files: EDMarketConnector.py:922; EDMarketConnector.py:940; EDMarketConnector.py:943; */ "Edit" = "编辑"; -/* EDMarketConnector.py: 'View' menu title on OSX; In files: EDMarketConnector.py:923; */ -"View" = "显示"; - -/* EDMarketConnector.py: 'Window' menu title on OSX; In files: EDMarketConnector.py:924; */ -"Window" = "窗口"; - /* EDMarketConnector.py: Help' menu title on OSX; EDMarketConnector.py: 'Help' menu title; In files: EDMarketConnector.py:925; EDMarketConnector.py:941; EDMarketConnector.py:944; */ "Help" = "帮助"; @@ -319,9 +313,6 @@ /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "错误:Inara {MSG}"; -/* prefs.py: File > Preferences menu entry for macOS; In files: prefs.py:237; */ -"Preferences" = "偏好"; - /* prefs.py: Settings > Output - choosing what data to save to files; In files: prefs.py:335; */ "Please choose what data to save" = "请选择想要保存的数据"; @@ -340,9 +331,6 @@ /* prefs.py: Settings > Output - Label for "where files are located"; In files: prefs.py:379; prefs.py:398; */ "File location" = "保存位置"; -/* prefs.py: macOS Preferences - files location selection button; In files: prefs.py:387; prefs.py:437; */ -"Change..." = "更改…"; - /* prefs.py: NOT-macOS Settings - files location selection button; prefs.py: NOT-macOS Setting - files location selection button; In files: prefs.py:390; prefs.py:440; */ "Browse..." = "浏览…"; @@ -358,21 +346,9 @@ /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "开启舰队母舰 (fleet carrier) CAPI 访问"; -/* prefs.py: Hotkey/Shortcut settings prompt on OSX; In files: prefs.py:490; */ -"Keyboard shortcut" = "键盘快捷键"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "快捷键"; -/* prefs.py: macOS Preferences > Configuration - restart the app message; In files: prefs.py:501; */ -"Re-start {APP} to use shortcuts" = "重启 {APP} 以使用快捷键"; - -/* prefs.py: macOS - Configuration - need to grant the app permission for keyboard shortcuts; In files: prefs.py:510; */ -"{APP} needs permission to use shortcuts" = "{APP} 需要权限以使用快捷键"; - -/* prefs.py: Shortcut settings button on OSX; In files: prefs.py:515; */ -"Open System Preferences" = "打开系统偏好设置"; - /* prefs.py: Configuration - Act on hotkey only when ED is in foreground; In files: prefs.py:538; */ "Only when Elite: Dangerous is the active app" = "仅当 Elite: Dangerous 在前台运行时生效"; From 1db12a48195532f153b079833c5c00c54676eea8 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 26 May 2024 20:43:55 -0400 Subject: [PATCH 271/425] Revert "Merge branch 'releases' into enhancement/519/add-beta" This reverts commit 6e557caac5508e6ebad020235a5bd62209d91573, reversing changes made to 1e1ab64b1a8c50e192056666850845881a21f68b. --- ChangeLog.md | 3 +-- edmarketconnector.xml | 45 ++----------------------------------------- 2 files changed, 3 insertions(+), 45 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index e0d98bf4..7d14ca9c 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -15,9 +15,8 @@ We now sign our code! This does mean that built EXEs are now slightly modified o For information on what this means, and opt-out options, please visit https://github.com/EDCD/EDMarketConnector/wiki/Code-Signing-and-EDMC **Changes and Enhancements** -* Added new SCO and Python Armor Module Details +* Added new SCO Module Details * Reverted a change from the prior release due to breaking some consumers. - **Plugin Developers** * modules.p and ships.p are deprecated, and slated for removal in 5.11+! * The `openurl()` function in ttkHyperlinkLabel has been deprecated, diff --git a/edmarketconnector.xml b/edmarketconnector.xml index 88ff05ce..cc797794 100644 --- a/edmarketconnector.xml +++ b/edmarketconnector.xml @@ -22,51 +22,10 @@
- Release 5.10.6 + Release 5.10.4 body { font-family:"Segoe UI","Tahoma"; font-size: 75%; } h2 { font-family:"Segoe UI","Tahoma"; font-size: 105%; }

We now test against, and package with, Python 3.11.7.

As a result, we do not support Windows 7, 8, or 8.1.
-

Release 5.10.6

-

This release contains the data information for the new SCO modules added in Elite update 18.04. -This should represent full support for the new Python Mk II.

-

We now sign our code! This does mean that built EXEs are now slightly modified on our developer's machines. -For information on what this means, and opt-out options, please visit https://github.com/EDCD/EDMarketConnector/wiki/Code-Signing-and-EDMC

-

Changes and Enhancements

-
    -
  • Added new SCO and Python Armor Module Details
  • -
  • Reverted a change from the prior release due to breaking some consumers.
  • -
-

Plugin Developers

-
    -
  • modules.p and ships.p are deprecated, and slated for removal in 5.11+!
  • -
  • The openurl() function in ttkHyperlinkLabel has been deprecated, -and slated for removal in 5.11+! Please migrate to webbrowser.open().
  • -
-
-

Release 5.10.5

-

This release contains a fix for a bug that could crash EDMC's console versions when reading outfitting information from the new SCO Frame Shift Drive modules.

-

Please note that this does not offer full support for the new SCO modules or the Python Mk II. More support will be added in a future update.

-

We now sign our code! This does mean that built EXEs are now slightly modified on our developer's machines. -For information on what this means, and opt-out options, please visit https://github.com/EDCD/EDMarketConnector/wiki/Code-Signing-and-EDMC

-

Changes and Enhancements

-
    -
  • Updated Translations
  • -
  • Added limited data regarding the Python Mk II
  • -
  • Added a few Coriolis module information entries
  • -
-

Bug Fixes

-
    -
  • Fixed a bug that could cause the new SCO modules to display improper ratings or sizes
  • -
  • Fixed a bug where the new SCO modules would display as a normal Frame Shift Drive
  • -
  • Fixed a bug which could crash EDMC if the exact details of a Frame Shift Drive were unknown
  • -
-

Plugin Developers

-
    -
  • modules.p and ships.p are deprecated, and slated for removal in 5.11+!
  • -
  • The openurl() function in ttkHyperlinkLabel has been deprecated, -and slated for removal in 5.11+! Please migrate to webbrowser.open().
  • -
-

Release 5.10.4

This release contains updated dependencies, modules files, translations, and adds two new EDDN schemas. It also adds Turkish translations to EDMC!

@@ -2272,7 +2231,7 @@ about this: PTS CAPI saying Commander is Docked after jumping to new system.

]]>
- +
From 6f13f1d893691a117d51a791701d7caadace4be9 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 27 May 2024 09:46:01 -0400 Subject: [PATCH 272/425] [Admin] RM XML File --- edmarketconnector.xml | 2237 ----------------------------------------- 1 file changed, 2237 deletions(-) delete mode 100644 edmarketconnector.xml diff --git a/edmarketconnector.xml b/edmarketconnector.xml deleted file mode 100644 index cc797794..00000000 --- a/edmarketconnector.xml +++ /dev/null @@ -1,2237 +0,0 @@ - - - - E:D Market Connector - https://raw.githubusercontent.com/EDCD/EDMarketConnector/releases/edmarketconnector.xml - Most recent changes with links to updates. - - - Release 3.44 - h2 { font-size: 105%; } -

Release 3.44

-

CHANGE OF MAINTAINER

-

Due to a lack of time to give the project the attention it needs Marginal has handed over ownership of the EDMarketConnector GitHub repository to the EDCD (Elite Dangerous Community Developers) organisation.

-

Initially Athanasius will now be responsible for maintaining the code, including addressing any Pull Requests and Issues, and making releases. Unfortunately he has no access to hardware running MacOS so can't easily generate builds for that platform or test them. So for the time being releases will be for Windows 10 only. MacOS users are advised to look into running from source (see the github README).

-

Going forwards the intention is to move to the python 3.7 code as soon as possible. To facilitate this there will be one more python 2.7 release in addition to this one, with the main aim of that being to add code to alert the user about any plugins they use that have apparently not been updated to run under python 3.7.

-

See the project GitHub repository's README.md for further information.

-
    -
  • Version increased to 3.4.4.0 / 3.44.
  • -
  • URL the application checks for updates changed to point to github,
  • -
]]>
- -
- - - Release 5.10.4 - body { font-family:"Segoe UI","Tahoma"; font-size: 75%; } h2 { font-family:"Segoe UI","Tahoma"; font-size: 105%; } -

We now test against, and package with, Python 3.11.7.

-

As a result, we do not support Windows 7, 8, or 8.1.
-

Release 5.10.4

-

This release contains updated dependencies, modules files, translations, and adds two new EDDN schemas. It also -adds Turkish translations to EDMC!

-

We now sign our code! This does mean that built EXEs are now slightly modified on our developer's machines. -For information on what this means, and opt-out options, please visit https://github.com/EDCD/EDMarketConnector/wiki/Code-Signing-and-EDMC

-

Changes and Enhancements

-
    -
  • Adds Turkish Translations to EDMC
  • -
  • Adds DockingDenied and DockingGranted EDDN Schemas
  • -
  • Updated FDevIDs Dependency
  • -
  • Updated Translations
  • -
  • Updated modules files to process several missing module types used for bug squishing or going fast
  • -
  • Updated Python Dependencies
  • -
-

Bug Fixes

-
    -
  • Fixed a bug on older Python versions which couldn't import updated type annotations
  • -
-

Plugin Developers

-
    -
  • modules.p and ships.p are deprecated, and slated for removal in 5.11+!
  • -
  • The openurl() function in ttkHyperlinkLabel has been deprecated, -and slated for removal in 5.11+! Please migrate to webbrowser.open().
  • -
-
-

Release 5.10.3

-

This release contains a bugfix for the shipyard outfitting parsing system and an update to the French translations.

-We now sign our code! This does mean that built EXEs are now slightly modified on our developer's machines. -For information on what this means, and opt-out options, please visit https://github.com/EDCD/EDMarketConnector/wiki/Code-Signing-and-EDMC -

Changes and Enhancements

-
    -
  • Updated French Translations
  • -
-

Bug Fixes

-
    -
  • Fixed a bug that crashed the outfitting system when encountering armor. (Thanks TCE team for identifying this one!)
  • -
-

Plugin Developers

-
    -
  • modules.p and ships.p are deprecated, and slated -for removal in the next major release! Please look for that change coming soon.
  • -
  • Note to plugin developers: The openurl() function in ttkHyperlinkLabel has been deprecated, -and slated for removal in the next major release! Please migrate to webbrowser.open().
  • -
- -
- -

Release 5.10.2

-

This release contains updated dependencies, some bug fixes, a few minor enhancements to some supporting files, -and some resorted resources as well as a new image for some of the built EXEs.

- -We now sign our code! This does mean that built EXEs are now slightly modified on our developer's machines. -For information on what this means, and opt-out options, please visit https://github.com/EDCD/EDMarketConnector/wiki/Code-Signing-and-EDMC -

Changes and Enhancements

-
    -
  • Added additional logging to the Python build string in the case of missing files
  • -
  • Added a new icon to EDMC's Command-Line EXE
  • -
  • Added additional logging to the build system
  • -
  • Updated several dependencies
  • -
  • Updated FDEV IDs
  • -
  • Updated relevant copyright dates
  • -
  • Updated automatic build script to support code signing workflow
  • -
  • Updated translations to the latest versions
  • -
  • Moved a few unused files to the resources folder. These files have no references in the code
  • -
-

Bug Fixes

-
    -
  • Fixed a bug that could cause EDMC to handle SIGINT signals improperly
  • -
  • Fixed a bug that could result in URL providers to be set to invalid values
  • -
  • Fixed a bug that could result in Coriolis URL providers to revert back to "Auto" on language translations
  • -
  • Fixed a bug where Inara didn't understand being blown up by a Thargoid, and blew itself up instead
  • -
  • Fixed a printing issue for the localization system for unused strings
  • -
-

Removed Files

-
    -
  • Removed two unused manifest and MacOS icon files which are no longer in use.
  • -
-

Known Issues

- -

Plugin Developers

-
    -
  • modules.p and ships.p are deprecated, and slated -for removal in the next major release! Please look for that change coming soon.
  • -
  • Note to plugin developers: The openurl() function in ttkHyperlinkLabel has been deprecated, -and slated for removal in the next major release! Please migrate to webbrowser.open().
  • -
- -
- -

Release 5.10.1

-

This release contains a number of bugfixes, minor performance enhancements, workflow and dependency updates, and a function deprecation.

-Note to plugin developers: modules.p and ships.p are deprecated, and slated for removal in the next major release! Please look for that change coming soon. -Note to plugin developers: The openurl() function in ttkHyperlinkLabel has been deprecated, and slated for removal in the next major release! Please migrate to webbrowser.open(). - -

Changes and Enhancements

-
    -
  • Deprecated `openurl()`. Please migrate to `webbrowser.open()`
  • -
  • Updated a number of list comparisons to use more efficient tuple comparisons
  • -
  • Updated a few type hints
  • -
  • Updated a few binary comparitors to be more efficient
  • -
  • Moved `resources.json` and `modules.json` back to the top level for all users
  • -
  • Updated several dependencies
  • -
  • Updated Python version to 3.11.7
  • -
-

Bug Fixes

-
    -
  • Fixed an issue where resources files could be in different locations for different users.
      -
    • These files are now in the same location (top level) for all users on all distributions.
    • -
    -
  • -
  • Fixed an issue where CMDRs without the Git application installed would crash on start if running from Source.
      -
    • Thanks to the Flatpak team for pointing this one out!
    • -
    -
  • -
  • Fixed a bug where CMDRs running from source would have their git hash version displayed as UNKNOWN.
      -
    • We're now more failure tolerant and use the bundled .gitversion if no true git hash is provided.
    • -
    -
  • -
  • Fixed a bug where starting two copies of EDMC with a valid install would not generate a duplicate warning.
  • -
-
- -

Release 5.10.0

-

This release contains a number of under-the-hood changes to EDMC designed to improve performance, code maintainability, and stability of the EDMC application, while providing new features and quality-of-life fixes.

-Note to plugin developers: modules.p and ships.p are deprecated, and slated for removal in the next major release! Please look for that change coming soon. - -

Changes and Enhancements

-
    -
  • Added new modules.json and ships.json files to improve security and readability
  • -
  • Added a core Spansh URL provider plugin
  • -
  • Added a new auth response page for successful FDEV authentication
  • -
  • Added a new Open Log Folder option to the Help menu
  • -
  • Added a new --start_min command flag to force the application to start minimized
  • -
  • Added a new pop-up if plugins fail to load or are not supported
  • -
  • Updated commodities and module files to the latest versions
  • -
  • Updated core EDMC and core Plugin menus to a standardized layout
  • -
  • Updates the Inara URL formats to the new endpoints
  • -
-

Bug Fixes

-
    -
  • Fixed an issue where indentation of text strings in certain settings windows under various languages -would be unevenly indented
  • -
  • Fixed an issue where the Plugins Folder label in the Plugins settings window would cut off the -selection box for the plugin storage location
  • -
-

Code Clean Up

-
    -
  • Added future annotation imports to help with code compatibility
  • -
  • Added a few conditional checks on input processing
  • -
  • Simplified some RegEx expressions, complex functions, logic flows, and Import statements
  • -
  • Simplified the WinSparkle GitHub Build Action
  • -
  • Began to change single-character variables to more descriptive names
  • -
  • Moved a number of global variables into their requisite classes
  • -
  • Updated a number of dependencies to the latest versions
  • -
  • Updated GitHub Actions to the latest versions
  • -
  • Updated a number of resource-allocating functions to use more efficient closing logic
  • -
  • Updated some calls to arrays to be more efficient
  • -
  • Removed a number of old-style typing hints in favor of PEP 585 style hints
  • -
  • Removed a number of redundant if - return - else or raise - else statements for code readability
  • -
  • Removed some default parameter assignments
  • -
  • Removed some obsolete calls to Object
  • -
-

Plugin Developers

-
    -
  • modules.p and ships.p have been deprecated, and will be removed in 6.0. -If you are using these files, please update to use the new modules.json and ships.json files instead.
  • -
  • A new method of standardizing the paddings used in settings panels has been applied to the core settings panels. -We strongly encourage you to follow these style hints! A proper guide will be added to the wiki.
  • -

- -

Release 5.9.5

-

This release fixes an uncommon problem with the uninstaller logic if upgrading from a version prior to 5.9.0 to improve consistancy across versions.

-Note to plugin developers: modules.p and ships.p will be deprecated in the next version, and slated for removal in the next major release! Please look for that change coming soon. -
    -
  • Updates Module pickle files to latest values.
  • -
  • Fixes a problem with the uninstaller logic caused by prior versions having fluctuating GUIDs.
  • -

- -

Release 5.9.4

-

This release fixes a widely-reported bug that resulted in the cAPI Authentication flow being disrupted for a subset of users. Thank you to all the CMDRs who reported this to us and provided logs to us so that we could get the issue isolated.

-
    -
  • Fixes a missing registry issue that could cause the EDMC:// protocol to fail. (#2061, #2059, #2058, #2057)
  • -
  • Renames the default start menu shortcut to be more clear. (#2062)
  • -

- -

Release 5.9.3

-

This release is identical to 5.9.2, except reverts a bad change.

-
    -
  • REVERTS Deprecated load_module() is now retired (#1462)
  • -

- -

Release 5.9.2

-

This release fixes a critical issue on clean installs which would not update -the Windows registry to allow for protocol handling.

-

All users are strongly encouraged to update.

-
    -
  • Fixes a critical bug with the installer on new installs not creating registry keys (#2046)
  • -
  • Re-enables automatic submodule updates (#1443)
  • -
  • Help -> About Version String can now be copied to clipboard (#1936)
  • -
  • EDMC Task Manager Printout now is less useless (#2045)
  • -
  • Deprecated load_module() is now retired (#1462)
  • -
  • API Keys are masked in Settings (#2047)
  • -
  • Installer will now refuse to install on Win7 and Earlier (#1122)
  • -

- -

Release 5.9.1

-

This release updates the build system in use for EDMC to a more feature-rich installer, as well -as updating the commodity information to be up-to-date for Update 16.

-

NOTE: This version hands over the installer to an EXE file for Windows instead of an MSI. -This does not change any functionality or plugin capability of EDMC. You may need to -manually close EDMC during the update process if updating from version 5.9.0 or earlier.

-
    -
  • Removed the old WiX Build System
  • -
  • Handed over the Build system to Inno Setup
  • -
  • Broke apart the Build and Installer scripts for ease of development
  • -
  • Updated FDevIDs to latest version
  • -
  • Updated coriolis-data to latest version
  • -
  • Updated some internal documentation
  • -

- -

Release 5.9.0

-

This release is essentially the same as 5.9.0-rc1 with only a typo, the version and -this changelog updated.

-

This release contains the removal of the EDDB module, as well as a few under-the-hood -updates.

-
    -
  • Removes the EDDB plugin due to EDDB shutting down.
  • -
  • Unsets EDDB as the default handler for certain URL preferences.
  • -
  • Updates the FDevIDs to latest versions.
  • -
  • Removes EDDB references from help string documentations.
  • -
  • Updated a number of dependencies to their latest working versions
  • -

- -

Release 5.8.1

-

This fixes a bug where the Cmdr/APIKey sections on Settings > EDSM would never be shown.

-
- -

Release 5.8.0

-

This release is essentially the same as 5.8.0-rc3 with only the version and -this changelog updated.

-

It brings a new feature related to Fleetcarrier data, some convenience for -Linux users, some fixes, and otherwise some internal changes that should not -adversely affect either users or third-party plugins. For the latter, read -below for some new/changed things that could benefit you.

-
    -
  • -

    This release, and all future ones, now create two additional archive files -in the GitHub release:

    -
      -
    1. EDMarketConnector-release-<version>.zip
    2. -
    3. EDMarketConnector-release-<version>.tar.gz
    4. -
    -

    The advantage of these over the GitHub auto-generated ones is that they -have been hand-crafted to contain all the necessary files, and only -those files.

    -

    If you use the application from source, and not via a git clone, then we -highly recommend you use one of these archives, not the GitHub -auto-generated ones.

    -

    Anyone installing on Windows should continue to use the -EDMarketConnector_win_<version>.msi files as before.

    -
  • -
  • -

    New Feature - You can now have the application query the /fleetcarrier -CAPI endpoint for data about your Fleet Carrier. The data will then be -passed to interested plugins.

    -

    Note that there are some caveats:

    -
      -
    1. -

      This feature defaults to Off. The option is on the Configuration tab -of Settings as "Enable Fleetcarrier CAPI Queries". It is advised to only -enable this if you know you utilise plugins that make use of the data.

      -
    2. -
    3. -

      These queries are only triggered by CarrierBuy and CarrierStats -Journal events, i.e. upon buying a Fleetcarrier or opening the Carrier -Management UI in-game. NB: There is a 15 minute cooldown between -queries.

      -
    4. -
    5. -

      If you have Fleetcarrier cargo which got into the cargo hold through a lot -of individual transactions, or if you have a lot of separate buy/sell -orders then these queries can take a long time to complete.

      -

      If this happens with your game account then all other CAPI queries will -be blocked until the /fleetcarrier query completes. 'Other CAPI -queries' means those usually triggered upon docking to gather station -market, shipyard and outfitting data. To ameliorate the effects of this -there is currently a timeout of 60 seconds on /fleetcarrier queries, -and will not occur more often than every 15 minutes.

      -

      We plan to address this by moving the /fleetcarrier queries into their -own separate thread in the future.

      -
    6. -
    -
  • -
  • -

    The code for choosing the 'Output' folder is now simply the tkinter -function for such a dialogue, rather than a special case on Windows. In -the past the former had issues with Unicode characters, but in testing no -such issue was observed (on a supported OS).

    -
  • -
  • -

    There are two new items on the "Help" menu:

    -
      -
    1. Troubleshooting -> Wiki:Troubleshooting -
    2. -
    3. Report A Bug -> Issues - New Bug Report -
    4. -
    -
  • -
  • -

    Translations have been updated. Thanks again to our volunteer translators!

    -
  • -
  • -

    If we ever activate any functionality killswitches, the popup denoting which -are active has been made more readable.

    -
  • -
  • -

    There's a new section in Contributing.md - "Python Environment". This -should aid any new developers in getting things set up.

    -
  • -
-

Linux Users

-

We now ship an io.edcd.EDMarketConnector.desktop file. To make use of this -you should run scripts/linux-setup.sh once. This will:

-
    -
  1. -

    Check that you have $HOME/bin in your PATH. If not, it will abort.

    -
  2. -
  3. -

    Create a shell script edmarketconnector in $HOME/bin to launch the -application.

    -

    NB: This relies on the filesystem location you placed the source in not -changing. So if you move the source you will need to re-run the script.

    -
  4. -
  5. -

    Copy the .desktop and .icon files into appropriate locations. The .desktop -file utilises the shell script created in step 2, and thus relies on it -existing and on it being in a directory that is in your PATH.

    -
  6. -
-

Once this has been completed any XDG-compliant desktops should have an entry -for "E:D Market Connector" in their "Games" menu.

-

Fixes

-
    -
  • -

    The tracking of a Cmdr's location that was being performed by the core EDDN -plugin has been moved into the Journal monitoring code. This results in -the tracking being correct upon application (re)start, reflecting the state -from the latest Journal file, rather than only picking up with any -subsequent new Journal events.

    -

    This change should remove instances of "Wrong System! Missed Jump ?" and -similar sanity-check "errors" when continuing to play after a user restarts -the application whilst the game is running.

    -

    Plugin developers, see below for how this change can positively affect you.

    -
  • -
  • -

    The name of the files written by "File" > "Save Raw Data" now have a . -between the system and station names.

    -
  • -
  • -

    Use of CAPI data in EDMC.exe when invoked with either -s or -n -arguments hadn't been updated for prior changes, causing such invocations to -fail. This has been fixed.

    -
  • -
-

Plugin Developers

-
    -
  • -

    Each plugin is now handed its own sub-frame as the parent parameter passed -to plugin_app() instead of the actual main UI frame. These new Frames -are placed in the position that plugin UI would have gone into. This should -have no side effects on well-behaved plugins.

    -

    However, if you have code that attempts to do things like parent.children() -or the like in your plugin_app() implementation, this might have stopped -working. You shouldn't be trying to do anything with any of the UI outside -your plugin anyway, but if you definitely have a need then look things up -using .nametowidget(). There are examples in the core plugins (which DO -have good reason, due to maintaining main UI label values).

    -

    All of the plugins listed on our Wiki were given perfunctory testing and no -issues from this change were observed.

    -

    This is a necessary first step to some pending plugin/UI work:

    - -
  • -
  • -

    New - capi_fleetcarrier() function to receive the data from a CAPI -/fleetcarrier query. See PLUGINS.md for details.

    -
  • -
  • -

    It was found that the ShutDown event (note the capitalisation, this is -distinct from the actual Journal Shutdown event) synthesized for plugins -when it is detected that the game has exited was never actually being -delivered. Instead this was erroneously replaced with a synthesized StartUp -event. This has been fixed.

    -
  • -
  • -

    As the location tracking has been moved out of the core EDDN plugin, and into -monitor.py all of it is now available as members of the state dictionary -which is passed to journal_entry().

    -

    This both means that no plugin should need to perform such location state -tracking itself and they can take advantage of it being fully up to date -when a user restarts the application with the game running.

    -

    A reminder: When performing 'catch up' on the newest Journal file found at -startup, the application does not pass any events to the -journal_entry() method in plugins. This is to avoid spamming with -data/state that has possibly already been handled, and in the case of the -Cmdr moving around will end up not being relevant by the time the end of the -file is reached. This limitation was also why the core EDDN plugin couldn't -properly initiate its location tracking state in this scenario.

    -

    See PLUGINS.md for details of the new state members. Pay particular -attention to the footnote that details the caveats around Body tracking.

    -

    Careful testing has been done for only the following. So, if you make use -of any of the other new state values and spot a bug, please report it:

    -
      -
    1. SystemName
    2. -
    3. SystemAddress
    4. -
    5. Body (Name)
    6. -
    7. BodyID
    8. -
    9. BodyType
    10. -
    11. StationName
    12. -
    13. StationType
    14. -
    15. (Station) MarketID
    16. -
    -
  • -
  • -

    There is an additional property request_cmdr on CAPIData objects, which -records the name of the Cmdr the request was made for.

    -
  • -
  • -

    FDevIDs files are their latest versions at time of this version's build.

    -
  • -
  • -

    examples\plugintest - dropped the "pre-5.0.0 config" code, as it's long -since irrelevant.

    -
  • -
-

Developers

-
    -
  • -

    If you utilise a git clone of the source code, you should also ensure the -sub-modules are initialised and synchronised. -wiki:Running from source -has been updated to include the necessary commands.

    -
  • -
  • -

    The coriolis-data git sub-module now uses an HTTPS, not "git" URL, so won't -require authentication for a simple git pull.

    -
  • -
  • -

    If you have a dump directory in CWD when running EDMarketConnector.py under -a debugger you will get files in that location when CAPI queries complete. -This will now include files with names of the form -FleetCarrier.<callsign>.<timstamp>.json for /fleetcarrier data.

    -
  • -
  • -

    All the main UI tk widgets are now properly named. This might make things -easier if debugging UI widgets as you'll no longer see a bunch of !label1, -!frame1 and the like.

    -

    Each plugin's separator is named as per the scheme plugin_hr_<X>, and when -a plugin has UI its new container Frame is named plugin_X. Both of these -start with 1, not 0.

    -
  • -
-
- - -

Release 5.7.0

-

This release re-enables CAPI queries for Legacy players. As a result, the -'Update' button functionality is now restored for Legacy players, along with -"Automatically update on docking" functionality.

-
    -
  • -

    We now test against, and package with, Python 3.11.1, 32-bit.

    -
  • -
  • -

    This release is functionally identical to 5.7.0-rc1, as no problems were -reported with that.

    -
  • -
  • -

    As noted above, Legacy players now have CAPI functionality once more. -Plugin developers check below for how you can determine the source galaxy -of such data.

    -
  • -
  • -

    Due to a bug it turned out that a workaround for "old browsers don't support -very long URLs" had been inactive since late 2019. As no-one has noticed -or complained we've now removed the defunct code in favour of the simple -webbrowser.open(<url>).

    -

    Testing showed that all of Firefox, Chrome and Chrome-based Edge worked with -very long URLs without issues.

    -
  • -
  • -

    EDMC.exe -n had been broken for a while, it now functions once more.

    -
  • -
  • -

    Some output related to detecting and parsing gameversion from Journals -has been moved from INFO to DEBUG. This returns the output of any EDMC.exe -command to the former, quieter, version.

    -
  • -
-

Bugs

-
    -
  • -

    A corner case of "game not running" and "user presses 'Update' button" would -result in an empty uploaderID string being sent to EDDN. Such messages are -still accepted by the EDDN Gateway, and the Relay then obfuscates this field -anyway. So, at worse, this would make it look like the same uploader was in -lots of different places. This has been fixed.

    -
  • -
  • -

    The message about converting legacy replay.jsonl was being emitted even -when there was no file to convert. This has been fixed.

    -
  • -
-

Plugin Developers

-
    -
  • -

    An erroneous statement about "all of Python stdlib" in PLUGINS.md has been -corrected. We don't/can't easily include all of this. Ask if any part of it -you require is missing.

    -
  • -
  • -

    In order to not pass Legacy data to plugins without them being aware of it -there is now a new function cmdr_data_legacy(), which mirrors the -functionality of cmdr_data(), but for Legacy data only. See PLUGINS.md -for more details.

    -
  • -
  • -

    The data passed to cmdr_data() and cmdr_data_legacy() is now correctly -typed as CAPIData. This is a sub-class of UserDict, so you can continue -to use it as such. However, it also has one extra property, source_host, -which can be used to determine if the data was from the Live or Legacy -CAPI endpoint host. See PLUGINS.md for more details.

    -
  • -
  • -

    If any plugin had been attempting to make use of config.get_int('theme'), -then be aware that we've finally moved from hard-coded values to actual -defined constants. Example use would be as in:

    -
    from config import config
    -from theme import theme
    -
    -active_theme = config.get_int('theme')
    -if active_theme == theme.THEME_DARK:
    -    ...
    -elif active_theme == theme.THEME_TRANSPARENT:
    -    ...
    -elif active_theme == theme.THEME_DEFAULT:
    -    ...
    -else:
    -    ...
    -

    But remember that all tkinter widgets in plugins will inherit the main UI -current theme colours anyway.

    -
  • -
  • -

    The contents of NavRoute.json will now be loaded during 'catch-up' when -EDMarketConnector is (re-)started. The synthetic StartUp (note the -capitalisation) event that is emitted after the catch-up ends will have -state['NavRoute'] containing this data.

    -

    However, the Fileheader event from detecting a subsequent new Journal file -will blank this data again. Thus, if you're interested in "last plotted -route" on startup you should react to the StartUp event. Also, note that -the contents will indicate a NavRouteClear if that was the last such -event.

    -

    PLUGINS.md has been updated to reflect this.

    -
  • -
  • -

    If you've ever been in the habit of running our develop branch, please -don't. Whilst we try to ensure that any code merged into this branch doesn't -contain bugs, it hasn't at that point undergone more thorough testing. -Please use the stable branch unless otherwise directed.

    -
  • -
  • -

    Some small updates have been made in edmc_data as a part of reviewing the -latest update to coriolis-data. -We make no guarantee about keeping these parts of edmc_data up to date. -Any plugins attempting to use that data should look at alternatives, such -as FDevIDs/outfitting.csv.

    -

    A future update might remove those maps, or at least fully deprecate their -use by plugins. Please contact us now if you actually make use of this -data.

    -
  • -
-
- - -

Release 5.6.1

-

This release addresses some minor bugs and annoyances with v5.6.0, especially -for Legacy galaxy players.

-

In general, at this early stage of the galaxy split, we prefer to continue to -warn Legacy users who have 'send data' options active for sites that only -accept Live data. In the future this might be reviewed and such warnings -removed such that the functionality fails silently. This might be of use -to users who actively play in both galaxies.

-
    -
  • -

    CAPI queries will now only be attempted for Live galaxy players This is -a stop-gap whilst the functionality is implemented for Legacy galaxy players. -Doing so prevents using Live galaxy data whilst playing Legacy galaxy, which -would be increasingly wrong and misleading.

    -
      -
    1. 'Automatic update on docking' will do nothing for Legacy players.
    2. -
    3. Pressing the 'Update' button whilst playing Legacy will result in a status -line message "CAPI for Legacy not yet supported", and otherwise achieve -nothing. The only function of this button is to query CAPI data and -pass it to plugins, which does not include Inara and EDSM.
    4. -
    5. A Legacy player trying to use "File" > "Status" will get the message -"Status: No CAPI data yet" due to depending on CAPI data.
    6. -
    -

    It is hoped to implement CAPI data retrieval and use for Legacy players soon, -although this will likely entail extending the plugins API to include a new -function specifically for this. Thus only updated plugins would support -this.

    -
  • -
  • -

    EDDN: Where data has been sourced from the CAPI this application now sends -a header->gameversion in the format "CAPI-(Live|Legacy)-<endpoint" as per -the updated documentation.

    -
      -
    1. -

      As this version only queries CAPI for Live players that will only be -"CAPI-Live-<endpoint>" for the time being.

      -
    2. -
    3. -

      If, somehow, the CAPI host queried matches neither the -current Live host, the Legacy host, nor the past beta host, you will see -"CAPI-UNKNOWN-<endpoint>".

      -
    4. -
    5. -

      As that statement implies, this application will also signal 'Live' if -pts-companion.orerve.net has been used, due to detecting an alpha or beta -version of the game. However, in that case the /test schemas will be used.

      -
    6. -
    -

    Closes #1734.

    -
  • -
  • -

    Inara: Only warn about Legacy data if sending is enabled in Settings > Inara.

    -

    Closes #1730.

    -
  • -
  • -

    Inara: Handling of some events has had a sanity check added so that the -Inara API doesn't complain about empty strings being sent. In these cases -the event will simply not be sent.

    -

    Closes #1732.

    -
  • -
  • -

    EDSM: EDSM has decided to accept only Live data on its API. Thus, this -application will only attempt to send data for Live galaxy players.

    -

    If a Legacy galaxy player has the Settings > EDSM > "Send flight log and -Cmdr status to EDSM" option active then they will receive an error about -this at most once every 5 minutes. Disabling that option will prevent the -warning.

    -
  • -
-

Plugin Developers

-
    -
  • PLUGINS.md has been updated to make it clear that the only use of imports -from the config module are for setting/getting/removing a plugin's own -configuration, or detecting application shutdown in progress.
  • -
  • PLUGINS.md has also been updated to add a note about how the data passed -to a plugin cmdr_data() is, strictly speaking, an instance of CAPIData, -which is an extension of UserDict. It has some extra properties on it, -but these are for internal use only and no plugin should rely on them.
  • -
  • As noted above, implementing CAPI data for Legacy players will likely entail -an additional function in the API provided to plugins. See -#1728 for discussion -about this.
  • -
-
- - -

Release 5.6.0

-

Tha major reason for this release is to address the Live versus Legacy galaxy -split coming in Update 14 of the game. -See the section "Update 14 and the Galaxy Split" below for how this might -impact you.

-

Changes

-
    -
  • -

    We now test against, and package with, Python 3.10.8.

    -
  • -
  • -

    The code for sending data to EDDN has been reworked. This changes the -'replay log' from utilising an internal array, backed by a flat file -(replay.jsonl), to an sqlite3 database.

    -

    As a result:

    -
      -
    1. Any messages stored in the old replay.jsonl are converted at startup, -if that file is present, and then the file removed.
    2. -
    3. All new messages are stored in this new sqlite3 queue before any attempt -is made to send them. An immediate attempt is then made to send any -message not affected by "Delay sending until docked".
    4. -
    5. Sending of queued messages will be attempted every 5 minutes, unless -"Delay sending until docked" is active and the Cmdr is not docked in -their own ship. This is in case a message failed to send due to an issue -communicating with the EDDN Gateway.
    6. -
    7. When you dock in your own ship an immediate attempt to send all queued -messages will be initiated.
    8. -
    9. When processing queued messages the same 0.4-second inter-message delay -as with the old code has been implemented. This serves to not suddenly -flood the EDDN Gateway. If any message fails to send for Gateway reasons, -i.e. not a bad message, then this processing is abandoned to wait for -the next invocation.
    10. -
    -

    The 5-minute timer in point 3 differs from the old code, where almost any -new message sending attempt could initiate processing of the queue. At -application startup this delay is only 10 seconds.

    -

    Currently, the feedback of "Sending data to EDDN..." in the UI status line -has been removed.

    -

    If you do not have "Delay sending until docked" active, then the only -messages that will be at all delayed will be where there was a communication -problem with the EDDN Gateway, or it otherwise indicated a problem other -than 'your message is bad'.

    -
  • -
  • -

    As a result of this EDDN rework this application now sends appropriate -gameversion and gamebuild strings in EDDN message headers. -The rework was necessary in order to enable this, in case of any queued -or delayed messages which did not contain this information in the legacy -replay.jsonl format.

    -
  • -
  • -

    For EDSM there is a very unlikely set of circumstances that could, in theory -lead to some events not being sent. This is so as to safeguard against -sending a batch with a gameversion/build claimed that does not match for -all of the events in that batch.

    -

    It would take a combination of "communications with EDSM are slow", more -events (the ones that would be lost), a game client crash, and starting -a new game client before the 'more events' are sent.

    -
  • -
-

Update 14 and the Galaxy Split

-

Due to the galaxy split announced by Frontier -there are some changes to the major third-party websites and tools.

-
    -
  • -

    Inara has chosen -to only accept Live galaxy data on its API.

    -

    This application will not even process Journal data for Inara after -2022-11-29T09:00:00+00:00 unless the gameversion indicates a Live client. -This explicitly checks that the game's version is semantically equal to or -greater than '4.0.0'.

    -

    If a Live client is not detected, then there is an INFO level logging -message "Inara only accepts Live galaxy data", which is also set as the main -UI status line. This message will repeat, at most, every 5 minutes.

    -

    If you continue to play in the Legacy galaxy only then you probably want to -just disable the Inara plugin with the checkbox on Settings > Inara.

    -
  • -
  • -

    All batches of events sent to EDSM will be tagged with a gameversion, in -a similar manner to the EDDN header.

    -

    Ref: EDSM api-journal-v1

    -
  • -
  • -

    All EDDN messages will now have appropriate gameversion and gamebuild -fields in the header as per -EDDN/docs/Developers.md.

    -

    As a result of this you can expect third-party sites to choose to filter data -based on that.

    -

    Look for announcements by individual sites/tools as to what they have chosen -to do.

    -
  • -
-

Known Bugs

-

In testing if it had been broken at all due to 5.5.0 -> 5.6.0 changes it has -come to light that EDMC.EXE -n, to send data to EDDN, was already broken in -5.5.0.

-

In addition, there is now some extra 'INFO' logging output which will be -produced by any invocation of EDMC.EXE. This might break third-party use of -it, e.g. Trade Computer Extension Mk.II. -This will be fixed as soon as the dust settles from Update 14, with emphasis -being on ensuring the GUI EDMarketConnector.exe functions properly.

-

Notes for EDDN Listeners

-
    -
  • -

    Where EDMC sourced data from the Journal files it will set gameversion -and gamebuild as per their values in Fileheader or LoadGame, whichever -was more recent (there are some events that occur between these).

    -
  • -
  • -

    If any message was already delayed such that it did not -have the EDDN header recorded, then the gameversion and gamebuild will -be empty strings. In order to indicate this the softwareName will have - (legacy replay) appended to it, e.g. E:D Market Connector Connector [Windows] (legacy replay). In general this indicates that the message was -queued up using a version of EDMC prior to this one. If you're only -interested in Live galaxy data then you might want to ignore such messages.

    -
  • -
  • -

    Where EDMC sourced data from a CAPI endpoint, the resulting EDDN message -will have a gameversion of CAPI-<endpoint> set, e.g. CAPI-market. -At this time it is not 100% certain which galaxy this data will be for, so -all listeners are advised to ignore/queue such data until this is clarified.

    -

    gamebuild will be an empty string for all CAPI-sourced data.

    -
  • -
-

Plugin Developers

-
    -
  • There is a new flag in state passed to plugins, IsDocked. See PLUGINS.md -for details.
  • -
-
- -

Release 5.5.0

-
    -
  • Virus Total scan results for this release.
  • -
  • We now test against, and package with, Python 3.10.7.
  • -
  • EDDN: Support added for the FCMaterials schemas to aid third-party sites in -offering searches for where to buy and sell Odyssey Micro Resources, -including on Fleet Carriers with the bar tender facility.
  • -
-

Bug Fixes

-
    -
  • EDDN: Abort fsssignaldiscovered sending of message if no signals passed -the checks.
  • -
  • EDDN: Add Horizons check for location on fsssignaldiscovered messages.
  • -
  • Don't alert the user if the first attempted load of NavRoute.json contains -no route.
  • -
  • Inara: Don't set marketID for ApproachSettlement unless it's actually -present in the event.
  • -
-

Plugin Developers

-
    -
  • -

    We now build using the new, setuptools mediated py2exe freeze() method, -so we're in the clear for when distutils is removed in Python 3.12.

    -

    This shouldn't have any adverse effects on plugins, i.e. all of the same -Python modules are still packaged as before.

    -
  • -
  • -

    Support has been added for the NavRouteClear event. We do send this -through to plugins, so that they know the player has cleared the route, -but we keep the previously plotted route details in state['NavRoute'].

    -
  • -
  • -

    The documentation of the return type of journal_entry() has been corrected -to Optional[str].

    -
  • -
  • -

    FDevIDs files (commodity.csv rare_commodity.csv) updated to latest -versions.

    -
  • -
-

Developers

-
    -
  • We now build using the new, setuptools mediated py2exe freeze() method, -so we're in the clear for when distutils is removed in Python 3.12.
  • -
  • The old setup.py file, along with associated py2exe.cmd have been removed -in favour of the new Build-exe-and-msi.py file. Documentation updated.
  • -
-
- -

Release 5.4.1

-
    -
  • -

    If for any reason EDMarketConnector.exe fails to shutdown and exit when -asked to by the upgrade process this should no longer result in a spontaneous -system reboot. Closes #1492.

    -

    A manual reboot will still be required to complete the EDMarketConnector -upgrade process and we make no guarantees about the stability of the -application until this is done.

    -
  • -
  • -

    The new EDDN fsssignaldiscovered/1 schema has been implemented.

    -
  • -
  • -

    EDSM trace level logging will no longer log API credentials unless explicitly -asked to, separately from other EDSM API trace logging.

    -
  • -
-

-Bug Fixes

-
    -
  • EDDN: Ensure we always remove all _Localised suffix keys in data. This -was missed in some recent new schemas and turned out to be an issue for at -least approachsettlement/1.
  • -
-
- -

Release 5.4.0

-
    -
  • We now test against, and package with, Python 3.10.4.
  • -
  • New EDDN schema fssbodysignals is now supported.
  • -
  • Odyssey Update 12 will add BodyID to CodexEntry journal events, so don't -overwrite this with an augmentation if it is already present. We've also -added the same for BodyName in case Frontier ever add that.
  • -
  • -Translations updated. -Thanks again to all the contributors.
  • -
-

-Bug Fixes

-
    -
  • Cross-check the MarketID in CAPI data, not only the station name, to ensure -the data is for the correct station. Closes #1572.
  • -
  • Location cross-check paranoia added to several EDDN message types to ensure -no bad data is sent.
  • -
  • Ensure we don't send bad BodyID/Name for an orbital station if the player -uses a taxi. -Closes #1522.
  • -
-

-Developers

-
    -
  • Odyssey Update 12 adds a new Journal event, and file, FCMaterials.json, -detailing the available trades at a Fleet Carrier's bar tender. Support has -been added for this. Plugin developers are sent an FCMaterials event -with the full contents of the file.
  • -
-

-EDMC.exe

-

This now uses specific exit codes in all cases, rather than a generic -EXIT_SYS_ERR (6) for some cases. See the appropriate line in EDMC.py for -details.

- - -

Release 5.3.4

-

Whilst EDMarketConnector.exe was fixed for the Odyssey Update 11 difference in Journal file names, EDMC.exe was not. If you're wondering, that's the command-line utility that, for instance, Trade Computer Extensions uses to obtain data.

-
    -
  • Use the new common function for finding latest journal file in EDMC.py.
  • -
  • Quietens some NavRoute related logging for the benefit of EDMC.py. This is -now at DEBUG level, rather than INFO.
  • -
- - -

Release 5.3.3

-

Unfortunately 5.3.2 failed to fully address the issues caused by the different -Journal filenames when using the Odyssey Update 11 client. It's fine if you -run EDMarketConnector first and then the game, as the code path that detects -a new file always does just that.

-

But the code for EDMarketConnector startup to find the current newest Journal -file relied on sorting the filenames and that would mean the new-style names -would always sort as 'oldest'.

-

This release fixes that code to properly use the file modification timestamp -to determine the newest file on startup.

- - -

Release 5.3.2

-

This release contains one change to cope with how Frontier decided to name -the Journal files differently in the Update 11 Odyssey client.

- - -

Release 5.3.1

-

This release addresses some issues with newer EDDN code which could cause erroneous alerts to the player, or sending of bad messages.

  • EDDN: Cope with ApproachSettlement on login occurring before Location, -such that we don't yet know the name of the star system the player is in.

    Closes #1484

    -
  • EDDN: Cope with ApproachSettlement missing planetary coordinates on login -at/near a settlement in Horizons.

    Closes #1476

    -
  • EDDN: Change the CodexEntry "empty string" checks to only apply to those -values where the schema enforces "must be at least one character".

    This prevents the big 'CodexEntry had empty string, PLEASE ALERT THE EDMC DEVELOPERS' message from triggering on, e.g. NearestDestination being -empty, which the schema allows.

    Closes #1481

    -

Plugin Developers

-
  • -

    If you use a sub-class for a widget the core code will no longer break if -your code raises an exception. e.g. a plugin was failing due to Python -3.10 using collections.abc instead of collections, and the plugin's -custom widget had a configure() method which was called by the core -theme code on startup or theme change. This then caused the whole -application UI to never show up on startup.

    -

    This also applies if you set up a button such that enter/leave on it, i.e. -mouse in/out, causes the theme.py code for that to trigger.

    -

    So, now in such cases the main UI should actually show up, although your -plugin's UI might look weird due to theming not being properly applied.

    -

    The plugin exception WILL be logged, at ERROR level.

    -
  • -
- - -

Release 5.3.0

-

As has sadly become routine now, please read -our statement about malware false positives -affecting our installers and/or the files they contain. We are as confident -as we can be, without detailed auditing of python.org's releases and all -the py2exe source and releases, that there is no malware in the files we make -available.

-

This release is primarily aimed at fixing some more egregious bugs, -shortcomings and annoyances with the application. It also adds support for -two additional -EDDN -schemas.

-
    -
  • -

    We now test and build using Python 3.10.2. We do not yet make use of any -features specific to Python 3.10 (or 3.9). Let us restate that we -absolutely reserve the right to commence doing so.

    -
  • -
  • -

    We now set a custom User-Agent header in all web requests, i.e. to EDDN, -EDSM and the like. This is of the form:

    -

    EDCD-EDMarketConnector-<version>

    -
  • -
  • -

    "File" -> "Status" will now show the new Odyssey ranks, both the new -categories and the new 'prestige' ranks, e.g. 'Elite I'.

    -

    NB: Due to an oversight there are currently no translations for these.

    -

    Closes #1369.

    -
  • -
  • -

    Running EDMarketConnector.exe --reset-ui will now also reset any changes to -the application "UI Scale" or geometry (position and size).

    -

    Closes #1155.

    -
  • -
  • -

    We now use UTC-based timestamps in the application's log files. Prior to -this change it was the "local time", but without any indication of the -applied timezone. Each line's timestamp has UTC as a suffix now. We -are assuming that your local clock is correct and the timezone is set -correctly, such that Python's time.gmtime() yields UTC times.

    -

    This should make it easier to correlate application logfiles with in-game -time and/or third-party service timestamps.

    -
  • -
  • -

    The process used to build the Windows installers should now always pick up -all the necessary files automatically. Prior to this we used a manual -process to update the installer configuration which was prone to both user -error and neglecting to update it as necessary.

    -
  • -
  • -

    If the application fails to load valid data from the NavRoute.json file -when processing a Journal NavRoute event, it will attempt to retry this -operation a number of times as it processes subsequent Journal events.

    -

    This should hopefully work around a race condition where the game might -not have yet updated NavRoute.json at all, or has truncated it to empty, -when we first attempt this.

    -

    We will also now NOT attempt to load NavRoute.json during the startup -'Journal catch-up' mode, which only sets internal state.

    -

    Closes #1348.

    -
  • -
  • -

    Inara: Use the <journal log>->Statistics->Bank_Account->Current_Wealth -value when sending a setCommanderCredits message to Inara to set -commanderAssets.

    -

    In addition, a setCommanderCredits message at game login will now only -ever be sent at game login. Yes, you will NEED to relog to send an -updated balance. This is the only way in which to sanely keep the -'Total Assets' value on Inara from bouncing around.

    -

    Refer to Inara:API:docs:setCommanderCredits.

    -

    Closes #1401.

    -
  • -
  • -

    Inara: Send a setCommanderRankPilot message when the player logs in to the -game on-foot. Previously you would HAVE to be in a ship at login time -for this to be sent.

    -

    Thus, you can now relog on-foot in order to update Inara with any Rank up -or progress since the session started.

    -

    Closes #1378.

    -
  • -
  • -

    Inara: Fix for always sending a Rank Progress of 0%.

    -

    Closes #1378.

    -
  • -
  • -

    Inara: You should once more see updates for any materials used in -Engineering. The bug was in our more general Journal event processing -code pertaining to EngineerCraft events, such that the state passed to -the Inara plugin hadn't been updated.

    -

    Such updates should happen 'immediately', but take into account that there -can be a delay of up to 35 seconds for any data sent to Inara, due to how -we avoid breaking the "2 messages a minute" limit on the Inara API.

    -

    Closes #1395.

    -
  • -
  • -

    EDDN: Implement new approachsettlement/1 -schema.

    -
  • -
  • -

    EDDN: Implement new fssallbodiesfound/1 -schema.

    -
  • -
  • -

    EDDN: We now compress all outgoing messages. This might help get some -particularly large navroute messages go through.

    -

    If any message is now rejected as 'too large' we will drop it, and thus -not retry it later. The application logs will reflect this.

    -

    NB: The EDDN Gateway was updated to allow messages up to 1 MiB in size -anyway. The old limit was 100 KiB.

    -

    Closes #1390.

    -
  • -
  • -

    EDDN: In an attempt to diagnose some errors observed on the EDDN Gateway -with respect to messages sent from this application some additional checks -and logging have been added.

    -

    NB: After some thorough investigation it was concluded that these EDDN -errors were likely the result of long-delayed messages due to use of -the "Delay sending until docked" option.

    -

    There should be no functional changes for users. But if you see any of -the following in this application's log files PLEASE OPEN -AN ISSUE ON GITHUB -with all the requested information, so that we can correct the relevant -code:

    -
      -
    • No system name in entry, and system_name was not set either! entry: ...
    • -
    • BodyName was present but not a string! ...
    • -
    • post-processing entry contains entry ...
    • -
    • this.body_id was not set properly: ...
    • -
    • system is falsey, can't add StarSystem
    • -
    • this.coordinates is falsey, can't add StarPos
    • -
    • this.systemaddress is falsey, can't add SystemAddress
    • -
    • this.status_body_name was not set properly: ...
    • -
    -

    You might also see any of the following in the application status text -(bottom of the window):

    -
      -
    • passed-in system_name is empty, can't add System
    • -
    • CodexEntry had empty string, PLEASE ALERT THE EDMC DEVELOPERS
    • -
    • system is falsey, can't add StarSystem
    • -
    • this.coordinates is falsey, can't add StarPos
    • -
    • this.systemaddress is falsey, can't add SystemAddress
    • -
    -

    Ref: #1403 -#1393.

    -
  • -
-

-Translations

-
    -
  • -

    Use a different workaround for OneSky (translations website) using "zh-Hans" -for Chinese (Simplified), whereas Windows will call this "zh-CN". This is -in-code and documented with a comment, as opposed to some 'magic' in the -Windows Installer configuration that had no such documentation. It's less -fragile than relying on that, or developers using a script/documented -process to rename the file.

    -
  • -
  • -

    As noted above we forgot to upload to -OneSky -after adding the Odyssey new ranks/categories. This has now been done, -and some new phrases await translation.

    -
  • -
- -

Release 5.2.4

-

This is a very minor update that simply imports the latest versions of -data files so that some niche functionality works properly.

-
    -
  • -

    Update commodity.csv and rare_commodity.csv from the latest -EDCD/FDevIDs versions. This addresses -an issue with export of market data in Trade Dangerous format containing -OnionHeadC rather than the correct name, Onionhead Gamma Strain, that -Trade Dangerous is expecting.

    -

    This will only have affected Trade Dangerous users who use EDMarketConnector -as a source of market data.

    -
  • -
-
- -

Release 5.2.3

-

This release fixes one bug and fixes some example code.

-
    -
  • -

    Odyssey changed the order of some Journal events. This caused our logic -for tracking the following to break, and thus not report them ever to Inara:

    -
      -
    • Ship Combat, Trade and Exploration ranks.
    • -
    • On-foot Combat and Exobiologist ranks.
    • -
    • Engineer unlocks and progress.
    • -
    • Reputations with Major Factions (Superpowers).
    • -
    -

    This is now fixed and the current state of all of these will be correctly -reported to Inara if you have API access for it configured.

    -
  • -
-

-Developers

-
    -
  • -

    Now built using Python 3.9.9.

    -
  • -
  • -

    Updated PLUGINS.md -to state that we don't actually include all of Python's standard library.

    -
  • -
  • -

    The click_counter -example plugin code has been corrected to both actually work fully, and pass -our linting.

    -
  • -
- - -

Release 5.2.2

-

This release adds one new feature and addresses some bugs. We've also -updated to using Python 3.9.8.

-
    -
  • -

    Windows now has "minimize to system tray" support.

    -
      -
    • The system tray icon will always be present.
    • -
    • There is a new option on the Settings > Appearance tab - -Minimize to system tray.
    • -
    • When this new option is active, minimizing the application will also -hide the taskbar icon.
    • -
    • When the new option is not active, the application will minimize to the -taskbar as normal.
    • -
    -
  • -
-

-Bug Fixex

-
    -
  • -

    If a CAPI query failed in such a way that no requests.Response object -was made available we attempted to blindly dump the non-existent object.
    -We now check that it actually exists, and log the specifics of the exception.

    -
  • -
  • -

    A user experienced the game writing a NavRoute.json file without a -Route array, which caused the application to attempt sending a badly formed -navroute message to EDDN. That message was then remembered and constantly -retried.

    -
      -
    • -

      We now sanity check the NavRoute.json contents to be sure there is a -Route array, even if it is empty. If it's not present no attempt -to send the EDDN message will be made.

      -

      If this scenario occurs the user will see a status line message No 'Route' array in NavRoute.json contents.

      -
    • -
    • -

      For any EDDN message that receives a 400 status back we will drop it -from the replay log.

      -
    • -
    -
  • -
-
- -

Release 5.2.1

-

This release primarily addresses the issue of the program asking for -Frontier authorization much too often.

-
    -
  • Actually utilise the Frontier Refresh Token when the CAPI response is -"Unauthorized". The re-factoring of this code to make CAPI queries -threaded inadvertently prevented this.
  • -
- -

Release 5.2.0

-
    -
  • -

    The 'Update' button is disabled if CQC/Arena is detected.

    -
  • -
  • -

    Frontier CAPI queries now run in their own thread. There should be no -change in functionality for users. This affects both EDMarketConnector -(GUI) and EDMC (command-line).

    -
  • -
  • -

    File > Status will now use cached CAPI data, rather than causing a fresh -query. Currently if data has not yet been cached nothing will happen when -trying to use this.

    -
  • -
  • -

    Trying to use File > Status when the current commander is unknown, or -there is has been no CAPI data retrieval yet, will now result in the 'bad' -sound being played and an appropriate status line message.

    -
  • -
  • -

    File > Save Raw Data also now uses the cached CAPI data, rather than -causing a fresh query. This will write an empty JSON {} if no data is -yet available.

    -
  • -
  • -

    New docs/Licenses/ directory containing all relevant -third-party licenses for the software this application uses.

    -
  • -
  • -

    Settings > Output > File Location 'Browse' button will now always be -available, even if no output options are active.

    -
  • -
  • -

    The 'no git installed' logging when running from source is now at INFO -level, not ERROR. This will look less scary.

    -
  • -
  • -

    EDMarketConnetor command-line arguments have been re-ordered into -logical groups for --help output.

    -
  • -
  • -

    Support added for several new EDDN schemas relating to specific Journal -events. The live EDDN server has been updated to support these.

    -

    Schema support added for:

    -
      -
    • codexentry/1
    • -
    • fssdiscoveryscan/1
    • -
    • navbeaconscan/1
    • -
    • navroute/1
    • -
    • scanbarycentre/1
    • -
    -
  • -
  • -

    If a message to EDDN gets an 'unknown schema' response it will NOT be -saved in the replaylog for later retries, instead being discarded.

    -
  • -
-

-Bug Fixes

-
    -
  • -

    Pressing the 'Update' button when in space (not docked, not on a body -surface) will no longer cause a spurious "Docked but unknown station: EDO -Settlement?" message.

    -
  • -
  • -

    A bug preventing --force-localserver-auth from working has been fixed.

    -
  • -
  • -

    horizons and odyssey flags should now always be set properly on all -EDDN messages. The horizons flag was missing from some.

    -
  • -
-

-Developers

-
    -
  • -

    Now built using Python 3.9.7.

    -
  • -
  • -

    New journal_entry_cqc() function for plugins to receive journal events -specifically and only when the player is in CQC/Arena. This allows -for tracking things that happen in CQC/Arena without polluting -journal_entry(). See PLUGINS.md for details.

    -
  • -
  • -

    Command-line argument --trace-all to force all possible --trace-on to be -active.

    -
  • -
  • -

    Contributing.md has been updated for how to properly use trace_on().

    -
  • -
  • -

    EDMC.(py,exe) now also makes use of --trace-on.

    -
  • -
  • -

    EDMarketConnector now has --capi-pretend-down to act as if the CAPI -server is down.

    -
  • -
  • -

    Killswitches now have support for removing key/values entirely, or forcing -the value. See docs/Killswitches.md for details.

    -
  • -
  • -

    state['Odyssey'] added, set from LoadGame journal event.

    -
  • -
  • -

    You can now test against a different EDDN server using --eddn-url -command-line argument. This needs to be the full 'upload' URL, i.e. for -the live instance this is https://eddn.edcd.io:4430/upload/.

    -
  • -
  • -

    New command-line argument --eddn-tracking-ui to track the EDDN plugin's -idea of the current BodyName and BodyID, from both the Journal and -Status.json.

    -
  • -
- -

Release 5.1.3

-
    -
  • -

    Attempt to flush any pending EDSM API data when a Journal Shutdown or -Fileheader event is seen. After this, the data is dropped. This ensures -that, if the user next logs in to a different commander, the data isn't then -sent to the wrong EDSM account.

    -
  • -
  • -

    Ensure a previous Journal file is fully read/drained before starting -processing of a new one. In particular, this ensures properly seeing the end -of a continued Journal file when opening the continuation file.

    -
  • -
  • -

    New config options, in a new Privacy tab, to hide the current Private -Group, or captain of a ship you're multi-crewing on. These usually appear -on the Commander line of the main UI, appended after your commander name, -with a / between.

    -
  • -
  • -

    EDO dockable settlement names with + characters appended will no longer -cause 'server lagging' reports.

    -
  • -
  • -

    Don't force DEBUG level logging to the -plain log file -if --trace isn't used to force TRACE level logging. This means logging -to the plain log file will once more respect the user-set Log Level, as in -the Configuration tab of Settings.

    -

    As its name implies, the debug log file -will always contain at least DEBUG level logging, or TRACE if forced.

    -
  • -
-

-(Plugin) Developers

-
    -
  • -

    New EDMarketConnector option --trace-on ... to control if certain TRACE -level logging is used or not. This helps keep the noise down whilst being -able to have users activate choice bits of logging to help track down bugs.

    -

    See Contributing.md for -details.

    -
  • -
  • -

    Loading of ShipLocker.json content is now tried up to 5 times, 10ms apart, -if there is a file loading, or JSON decoding, failure. This should -hopefully result in the data being loaded correctly if a race condition with -the game client actually writing to and closing the file is encountered.

    -
  • -
  • -

    config.get_bool('some_str', default=SomeDefault) will now actually honour -that specified default.

    -
  • -
- -

Release 5.1.2

-
    -
  • -

    A Journal event change in EDO Update 6 will have caused some translated -suit names to not be properly mapped to their sane versions. This change -has now been addressed and suit names should always come out as intended in -the EDMarketConnector.exe UI.

    -
  • -
  • -

    There is a new command-line argument to cause all Frontier Authorisation to -be forgotten: EDMarketConnector.exe --forget-frontier-auth.

    -
  • -
  • -

    Situations where Frontier CAPI data doesn't agree on the location we have -tracked from Journal events will now log more useful information.

    -
  • -
-

-Bug Fixes

-
    -
  • The code should now be robust against the case of any Journal event name -changing.
  • -
-

-Plugin Developers

-
    -
  • -

    We now store GameLanguage, GameVersion and GameBuild in the state -passed to journal_entry() from the LoadGame event.

    -
  • -
  • -

    Various suit data, i.e. class and mods, is now stored from relevant -Journal events, rather than only being available from CAPI data. In -general we now consider the Journal to be the canonical source of suit -data, with CAPI only as a backup.

    -
  • -
  • -

    Backpack contents should now track correctly if using the 'Resupply' option -available on the ship boarding menu.

    -
  • -
  • -

    We now cache the main application version when first determined, so -that subsequent references to config.appversion() won't cause extra log -spam (which was possible when, e.g. having a git command but using non-git -source).

    -
  • -
- -

Release 5.1.1

-

The big change in this is adjustments to be in line with Journal changes in -Elite Dangerous Odyssey 4.0.0.400, released 2021-06-10, with respect to the -Odyssey materials Inventory.

-

This update is mandatory if you want EDMarketConnector to update Inara.cz -with your Odyssey inventory.

-
    -
  • -

    ShipLockerMaterials is dead, long live ShipLocker. Along with other -changes to how backpack inventory is handled we should now actually be -able to fully track all Odyssey on-foot materials and consumables without -errors.

    -
  • -
  • -

    Inara plugin adjusted to send the new ShipLocker inventory to Inara.cz. -This is still only your ship inventory of Odyssey materials, not -anything currently in your backpack whilst on foot. -See this issue -for some quotes from Artie (Inara.cz developer) about not including -backpack contents in the Inara inventory.

    -
  • -
  • -

    Errors related to sending data to EDDN are now more specific to aid in -diagnoising issues.

    -
  • -
  • -

    Quietened some log output if we encounter connection errors trying to -utilise the Frontier CAPI service.

    -
  • -
-

-Translations

-

We believe that nothing should be worse in this version compared to 5.1.1, -although a small tweak or two might have leaked through.

-

We'll be fully addressing translations in a near-future release after we've -conclude the necessary code level work for the new system. Nothing should -change for those of you helping on OneSky, other than at most the -'comments' on each translation. They should be more useful!

-

Pending that work we've specifically chosen not to update any -translations in this release, so they'll be the same as released in 5.1.0.

-

-Bug Fixes

-
    -
  • -

    Handle where the Backpack.json file for a Backpack event is a zero length -file. Closes #1138.

    -
  • -
  • -

    Fixed case of 'Selection' in 'Override Beta/Normal Selection' text on -Settings > Configuration. This allows translations to work.

    -
  • -
-

-Plugin Developers

-
    -
  • -

    We've updated Contributing.md including:

    -
      -
    1. Re-ordered the sections to be in a more logcial and helpful order.
    2. -
    3. Added a section about choosing an appropriate log level for messages.
    4. -
    5. fstrings now mandatory, other than some use of .format() with respect to -translated strings.
    6. -
    -
  • -
  • -

    docs/Translations.md updated about a forthcoming -change to how we can programmatically check that all translation strings -have a proper comment in 'L10n/en.template' to aid translators.

    -
  • -
  • -

    state passed to journal_entry() now has ShipLockerJSON which contains -the json.load()-ed data from the new 'ShipLocker.json' file. We do -attempt to always load from this file, even when the ShipLocker Journal -event itself contains all of the data (which it does on startup, embark and -disembark), so it should always be populated when plugins see any event -related to Odyssey inventory.

    -
  • -
- - -

Release 5.1.0

-
    -
  • -

    Updates to how this application utilises the Inara.cz API.

    -
      -
    1. The current state of your ShipLockerMaterials (MicroResources for Odyssey -Suit and handheld Weapons upgrading and engineering) will now be sent. -Note that we can't reliably track this on the fly, so it will only -update when we see a full ShipLockerMaterials Journal event, such as -at login or when you disembark from any vehicle.
    2. -
    3. Odyssey Suits and their Loadouts will now be sent.
    4. -
    5. When you land on a body surface, be that in your own ship, in a Taxi, -or in a Dropship. Depending on the exact scenario a Station might be -sent along with this.
    6. -
    -
  • -
  • -

    You can now both edit the 'normal' and 'beta' coriolis.io URLs, and -choose which of them are used. 'Auto' means allowing the application to -use the normal one when you're running the live game, or the beta version -if running a beta version of the game.

    -
  • -
  • -

    Suit names will now be displayed correctly when we have pulled the data -from the Frontier CAPI, rather than Journal entries.

    -
  • -
  • -

    Many translations updated once more, especially for new strings. Thanks -as always to those contributing!

    -
  • -
-

-Bug Fixes

- -

-Plugin Developers

-

There are some new members of the state dictionary passed to -journal_entry(); Taxi, Dropship, Body and BodyType. See -PLUGINS.md for the details.

- -

Release 5.0.4

-

This is a minor bugfix release, ensuring that Odyssey Suit names (and loadout) -will actually display if you're in your ship on login and never leave it.

-

NB: This still requires a Frontier CAPI data pull, either automatically -because you're docked if you have that option set, or by pressing the -'Update' button. We can't display data when we don't have it from either -CAPI or Journal sources. You'll also see '<Unknown>' between the time we -see the Journal LoadGame event during login and when there's either a -Journal suit-related event, or a CAPI data pull completes.

- - -

Release 5.0.3

-
    -
  • -

    You can now click on a 'cell' in the "File" > "Status" popup to copy that -text to the clipboard. This was a relatively easy, and non-intrusive, code -change. We'll look at richer, fuller, copy functionality in the future.

    -
  • -
  • -

    Suit names, for all grades, should now be displaying as just the relevant -word, never a symbol, and with the redundant 'suit' word(s) from all -languages removed. Note that Frontier have not translated the -following, so neither do we: "Artemis", "Dominator", "Maverick". The 'Flight -Suit' should, approximately, use the Frontier-supplied translation for -'Flight' in this context. In essence the displayed name is now as short -as possible whilst disambiguating the suit names from each other.

    -
  • -
-

-Bug Fixes

-
    -
  • -

    The check for "source, but with extra changes?" in appversion will now -not cause an error if the "git" command isn't available. Also, the extra -text added to the build number is now ".DIRTY".

    -
  • -
  • -

    Actually properly handle the "you just made progress" version of the -EngineerProgress Journal event, so that it doesn't throw errors.

    -
  • -
-

-Plugin Developers

-
    -
  • -

    The backpack and ship locker tracking of micro-resources might now -actually be correct with respect to 'reality' in-game. This is in part -thanks to Frontier changes to some events in 4.0.0.200.

    -
  • -
  • -

    Suit names will now only be sourced from Journal events if the -application didn't (yet) have the equivalent CAPI data.

    -
  • -
  • -

    The displayed Suit name is stored in an extra "edmcName" key within -state['Suits'] and state['SuitCurrent']. What was found in the -Journal or CAPI data is still present in the "name" and "locName" values.

    -
  • -
  • -

    The "language", "gameversion" and "build" values from the "Fileheader" event -are all now stored in state[] fields. See PLUGINS.md for -updated documentation.

    -
  • -
  • -

    We have a new Contributing.md policy of adding -comments in a defined format when we add or change code such that there's a -'hack', 'magic' or 'workaround' in play. You might find some of this -enlightening going forwards.

    -
  • -
- -

Release 5.0.2

-

This release is primarily aimed at getting the UI "Suit: ..." line working -properly.

-
    -
  • -

    The "Suit: ..." UI line should now function as best it can given the -available data from the game. It should not appear if you have launched -the Horizons version of the game, even if your account has Odyssey -enabled. You might see "<Unknown>" as the text when this application -does not yet have the required data.

    -
  • -
  • -

    Changed the less than obvious "unable to get endpoint: /profile" error -message to "Frontier CAPI query failure: /profile", and similarly for the -other CAPI endpoints we attempt to access. This new form is potentially -translated, but translators need time to do that.

    -

    In addition the old message "Received error {r.status_code} from server" -has been changed to "Frontier CAPI server error: {r.status_code}" and is -potentially translated.

    -
  • -
  • -

    The filenames used for 'Market data in CSV format file' will now be sane, -and as they were before 5.0.0.

    -
  • -
  • -

    Linux: 'Shipyard provider' will no longer default to showing 'False' if -no specific provider has been selected.

    -
  • -
-

-Plugin Developers

-
    -
  • -

    Extra Flagse values added in the live release of Odyssey have been added to -edmc_data.py.

    -
  • -
  • -

    Odyssey 'BackPack' values should now track better, but might still not be -perfect due to Journal bugs/shortcomings.

    -
  • -
  • -

    state passed to journal_entry() now has a BackpackJSON (note the case) -member which is a copy of the data from the Backpack.json (yes, that's -currently the correct case) file that is written when there's a BackPack -(guess what, yes, that is currently the correct case) event written to -the Journal.

    -
  • -
  • -

    state['Credits'] tracking is almost certainly not perfect. We're -accounting for the credits component of SuitUpgrade now, but there -might be other such we've yet accounted for.

    -
  • -
  • -

    state['Suits'] and associated other keys should now be tracking from -Journal events, where possible, as well as CAPI data.

    -
  • -
  • -

    There is a section in PLUGINS.md about how to package an extra Python -module with your plugin. Note the new caveat in -PLUGINS.md:Avoiding-pitfalls -about the name of your plugin's directory.

    -
  • -
- -

Release 5.0.1

-

The main reason for this release is to add an 'odyssey' boolean flag to all -EDDN messages for the benefit of listeners, e.g. eddb.io, inara.cz, -edsm.net, spansh.co.uk, etc. Please do update so as to make their lives -easier once Odyssey has launched!

-
    -
  • -

    Translations have been updated again. Thanks to all the contributors. -See wiki:Translations -and Translations welcome -for links and discussion if you want to help.

    -
  • -
  • -

    Changed the error message "Error: Frontier server is down" to -"Error: Frontier CAPI didn't respond" to make it clear this pertains to -the CAPI and not the game servers.

    -
  • -
-

-Killswitches

-

In the 5.0.0 changelog we said:

-
We will **NOT** be using this merely to try and get some - laggards to upgrade.
-

However, from now on there is an exception to this. After this -release any subsequent -beta or -rc versions will be killswitched after -their full release is published.

-

For example, if we put out a 5.0.2-beta1 and 5.0.2-rc1 before the full -5.0.2, then when 5.0.2 was published we would activate all available -killswitches for versions 5.0.2-beta1 and 5.0.2-rc1. In this example -5.0.1 would not be killswitched as part of this policy (but still -could be if, e.g. a data corruption bug was found in it).

-

In general please do not linger on any -beta or -rc release if there -has been a subsequent release. Upgrade to the equivalent full release once it -is published.

-

-Plugin Developers

-
    -
  • -

    Please make the effort to subscribe to GitHub notifications of new -EDMarketConnector releases:

    -
      -
    1. Login to GitHub.
    2. -
    3. Navigate to EDMarketConnector.
    4. -
    5. Click the 'Watch' (or 'Unwatch' if you previously set up any watches on -us). It's currently (2021-05-13) the left-most button of 3 near the -top-right of the page.
    6. -
    7. Click 'Custom'.
    8. -
    9. Ensure 'Releases' is selected.
    10. -
    11. Click 'Apply'.
    12. -
    -

    This way you'll be aware, as early as possible, of any -beta and -rc -changelogs and changes that might affect your work.

    -
  • -
  • -

    state passed to journal_entry() has a new member Odyssey (note the -capital O) which is a boolean indicating if the LoadGame event both has -an Odyssey key, and if so, what the value was. Defaults to False.

    -
  • -
  • -

    PLUGINS.md updated to document the state['Horizons'] flag that has been -present in it since version 3.0 of the game.

    -
  • -
  • -

    The stations.p and systems.p files that were deprecated in 5.0.0 have -now also been removed in git. As this release is made they will no -longer be in the develop, main or stable branches. If you truly -need to find a copy look at the Release/4.2.7 tag, but do read the 5.0.0 -changelog for why we stopped using them and what you can change to also -not need them.

    -
  • -
- -

Release 5.0.0

-
    -
  • -

    We now test against, and package with, Python 3.9.5.

    -

    As a consequence of this we no longer support Windows 7.
    -This is due to -Python 3.9.x itself not supporting Windows 7. -The application (both EDMarketConnector.exe and EDMC.exe) will crash on -startup due to a missing DLL.

    -

    This should have no other impact on users or plugin developers, other -than the latter now being free to use features that were introduced since the -Python 3.7 series.

    -

    Developers can check the contents of the .python-version file -in the source (it's not distributed with the Windows installer) for the -currently used version in a given branch.

    -
  • -
-

-This Update Is Mandatory

-

This release is a mandatory upgrade for the release of Elite Dangerous -Odyssey. Any bug reports against earlier releases, pertaining to Odyssey or -not, will be directed to reproduce them with 5.0.0 or later. There are also -minor bugs in 4.2.7 and earlier that have been fixed in this version. There -will NOT be another 4.2.x release.

-

The major version has been incremented not for Odyssey support, but because -we have made some minor breaking changes to the APIs we provide for plugin -developers.

-

Due to these plugin API changes (see below) users might need to update their -plugins. A check of all the -Plugins we know about -only found one with an issue related to the move to edmc_data.py, the -developer was informed and the issue addressed.

-

Other plugins should, at most, log deprecation warnings about the -config changes (again, see below).

-

In the first instance please report any issues with plugins to their -developers, not us. They can contact us about EDMC core code issues if -they find such in their investigations.

-

All plugin developers would benefit from having a GitHub account and then -setting up a watch on EDMarketConnector -of at least 'Releases' under 'Custom'.

-

NB: If you had any beta or -rc1 of 5.0.0 installed and see anything weird -with this full release it would be advisable to manually uninstall, confirm -the installation directory (default c:\Program Files (x86)\EDMarketConnector) -is empty, and then re-install 5.0.0 to be sure you have a clean, working, -install. Anyone upgrading from 4.2.7 or earlier shouldn't see any issues -with this.

-

-Changes and Enhancements

-
    -
  • -

    If the application detects it's running against a non-live (alpha or beta) -version of the game it will append " (beta)" to the Commander name on the -main UI.

    -
  • -
  • -

    Updated translations. Once more, thanks to all the translators!

    -
  • -
  • -

    We now sanity check a returned Frontier Authentication token to be sure -it's for the current Commander. If it's not you'll see -Error: customer_id doesn't match! on the bottom status line. Double-check -you're using the correct credentials when authing!

    -
  • -
  • -

    New 'Main window transparency' slider on Settings > Appearance.

    -
  • -
  • -

    New command-line argument for EDMarketConnector.exe --reset-ui. This will:

    -
      -
    1. Reset to the default Theme.
    2. -
    3. Reset the UI transparency to fully opaque.
    4. -
    -

    The intention is this can be used if you've lost sight of the main window -due to tweaking these options.

    -

    There is a new file EDMarketConnector - reset-ui.bat to make utilising -this easy on Windows.

    -
  • -
  • -

    New CL arg for EDMarketConnector.exe --force-edmc-protocol. -This is really only of use to core developers (its purpose being to force -use of the edmc:// protocol for Frontier Auth callbacks, even when not -'frozen').

    -
  • -
  • -

    Linux config will be flushed to disk after any change. This means that -EDMC.py can now actually make use of the latest CAPI auth if it's been -updated by EDMarketConnector.py since that started.

    -

    If you want to run multiple instances of the application under Linux then -please check the updated Troubleshooting: Multi-Accounting -wiki entry.

    -
  • -
  • -

    Linux and macOS: You can now set a font name and size in your config file.
    -Ensuring this is a TTF font, rather than a bitmap font, should allow the -application UI scaling to work.

    -
      -
    1. 'font' - the font name to attempt using
    2. -
    3. 'font_size' - the font size to attempt using.
    4. -
    -

    There is no UI for this in Preferences, you will need to edit your -config file -to set or change it, and then restart the application.

    -

    This is not supported on Windows so as not to risk weird bugs. UI -Scaling works on Windows without this.

    -
  • -
  • -

    We now also cite the git 'short hash' in the version string. For a Windows -install of the application this is sourced from the .gitversion file -(written during the build process).

    -

    When running from source we attempt to use the command git rev-parse --short HEAD -to obtain this. If this doesn't work it will be set to 'UNKNOWN'.

    -
  • -
  • -

    We have added a 'killswitch' feature to turn off specific functionality if it -is found to have a bug. An example use of this would be in an "oh -shit! we're sending bad data to EDDN!" moment so as to protect EDDN -listeners such as EDDB.

    -

    If we ever have to use this we'll announce it clearly and endeavour to -get a fixed version of the program released ASAP. We will NOT be -using this merely to try and get some laggards to upgrade.

    -

    Plugin Developers: See Killswitches.md for more -information about this.

    -
  • -
  • -

    Our logging code will make best efforts to still show class name and -other such fields if it has trouble finding any of the required data for -the calling frame. This means no longer seeing ??:??:?? when there is -an issue with this.

    -
  • -
  • -

    macOS: We've managed to test the latest code on macOS Catalina. Other than -keyboard shortcut support not working -it appears to be working.

    -
  • -
  • -

    We've pulled the latest Coriolis data which might have caused changes to -ship and module names as written out to some files.

    -
  • -
-

-Odyssey

-

Every effort was made during the Odyssey Alphas to ensure that this -application will continue to function correctly with it. As always, make a -Bug Report -if you find anything not working, but be sure to check our -Known Issues first.

-
    -
  • -

    A new UI element 'Suit' now appears below 'Ship' when applicable. It -details the type of suit you currently have equipped and its Loadout name.
    -This UI element is collapsed/hidden if no suit/on-foot state is detected, -e.g. not playing Odyssey.

    -
  • -
  • -

    Note that we can only reliably know about Suits and their Loadouts from a -CAPI data pull (which is what we do automatically on docking if -configured to do so, or when you press the 'Update' button). We do -attempt to gather this data from Journal events as well, but if you -switch to a Suit Loadout that hasn't been mentioned in them yet we won't -be able to display that until the next CAPI data pull.

    -
  • -
-

If anyone becomes aware of a 'suit loadouts' site/tool, a la Coriolis/EDSY -but for Odyssey Suits, do let us know so we can add support for it! -We're already kicking around ideas to e.g. place JSON text in the clipboard -if the Suit Loadout is clicked.

-

-Bug Fixes

-
    -
  • -

    Fix ship loadout export to files to not trip up in the face of file encoding -issues. This relates to the 'Ship Loadout' option on the 'Output' tab of -Settings/Preferences.

    -
  • -
  • -

    Ship Type/Name will now be greyed out, and not clickable, if we don't -currently have loadout information for it. This prevents trying to send an -empty loadout to your shipyard provider.

    -
  • -
  • -

    Bug fixed when handling CAPI-sourced shipyard information. This happens -due to a Frontier bug with not returning shipyard data at all for normal -stations.

    -

    It has been observed that Frontier has fixed this bug for Odyssey.

    -
  • -
  • -

    Don't try to get Ship information from LoadGame event if directly in CQC.

    -
  • -
  • -

    Inara: Don't attempt to send an empty -setCommanderReputationMajorFaction API call. This quietens an error -from the Inara API caused when a Cmdr literally has no Major Faction -Reputation yet.

    -
  • -
-

-Code Clean Up

-
    -
  • -

    Code pertaining to processing Journal events was reworked and noisy logging -reduced as a consequence.

    -
  • -
  • -

    A little TRACE logging output has been commented out for now.

    -
  • -
  • -

    The code for File > Status has been cleaned up.

    -
  • -
  • -

    Localisation code has been cleaned up.

    -
  • -
  • -

    Code handling the Frontier Authorisation callback on Windows has been -cleaned up.

    -
  • -
  • -

    A lot of general code cleanup relating to: Inara, outfitting, Frontier -CAPI, hotkey (manual Updates), dashboard (Status.json monitoring), -commodities files, and ED format ship loadout files.

    -
  • -
-

-Plugin Developers

-
    -
  • -

    The files stations.p and systems.p have been removed from the Windows -Installer. These were never intended for third-party use. Their use in -core code was for generating EDDB-id URLs, but we long since changed the -EDDB plugin's handlers for that to use alternate URL formats based on -game IDs or names.

    -

    If you were using either to lookup EDDB IDs for systems and/or stations -then please see how system_url() and station_url() now work in -plugins/eddb.py.

    -

    This change also removed the core (not plugin) eddb.py file which -generated these files. You can find it still in the git history if needs -be. It had gotten to the stage where generating systems.p took many -hours and required 64-bit Python to have any hope of working due to -memory usage.

    -
  • -
  • -

    All static data that is -cleared for use by plugins -is now in the file -edmc_data.py and should be imported from there, not any other module.

    -

    The one thing we didn't move was the 'bracket map' dictionaries in td.py -as they're for use only by the code in that file.

    -

    All future such data will be added to this file, and we'll endeavour not -to make breaking changes to any of it without increasing our Major version.

    -
  • -
  • -

    config.appversion() is now a function that returns a semantic_version.Version. -In contexts where you're expecting a string this should mostly -just work. If needs be wrap it in str().

    -

    For backwards compatibility with pre-5.0.0 you can use:

    -
  • -
-
    from config import appversion
-
-    if callable(appversion):
-        edmc_version = appversion()
-    else:
-        edmc_version = appversion
-
    -
  • -

    Example plugin -plugintest -updated. This includes an example of how to check core EDMC version if needs -be. This example is also in -PLUGINS.md.

    -
  • -
  • -

    config.py has undergone a major rewrite. You should no longer be using -config.get(...) or config.getint(...), which will both give a -deprecation warning.
    -Use instead the correct config.get_<type>() function:

    -
      -
    • config.get_list(<key>)
    • -
    • config.get_str(<key>)
    • -
    • config.get_bool(<key>)
    • -
    • config.get_int(<key>)
    • -
    -

    Setting still uses config.set(...).

    -

    So:

    -
      -
    1. Replace all instances of config.get() and config.getint() as above.
    2. -
    3. For ease of maintaining compatibility with pre-5.0.0 versions include -this code in at least one module/file (no harm in it being in all that -manipulate plugin config):
    4. -
    -
  • -
-
from config import config
-
-# For compatibility with pre-5.0.0
-if not hasattr(config, 'get_int'):
-    config.get_int = config.getint
-
-if not hasattr(config, 'get_str'):
-    config.get_str = config.get
-
-if not hasattr(config, 'get_bool'):
-    config.get_bool = lambda key: bool(config.getint(key))
-
-if not hasattr(config, 'get_list'):
-    config.get_list = config.get
-
-
    -
  • -

    Utilising our provided logging from a class-level, i.e. not a solid -instance of a class, property/function will now work.

    -
  • -
  • -

    We now change the current working directory of EDMarketConnector.exe to -its location as soon as possible in its execution. We're also -paranoid about ensuring we reference the full path to the .gitversion file.

    -

    However, no plugin should itself call os.chdir(...) or equivalent. You'll -change the current working directory for all core code and other plugins as -well (it's global to the whole process, not per-thread). Use full -absolute paths instead (pathlib is what to use for this).

    -
  • -
  • -

    The state dict passed to plugins in journal_entry() calls (which is -actually monitor.state in the core code) has received many additions -relating to Odyssey, as well as other fixes and enhancements.

    -
      -
    1. -

      Support has been added for the NavRoute (not Route as v28 of the -official Journal documentation erroneously labels it) Journal event and -its associated file NavRoute.json. See PLUGINS.md:Events documentation

      -
    2. -
    3. -

      Similarly, there is now support for the ModuleInfo event and its -associated ModulesInfo.json file.

      -
    4. -
    5. -

      state['Credits'] - until now no effort was made to keep this -record of the credits balance up to date after the initial LoadGame -event. This has now been addressed, and the balance should stay in sync -as best it can from the available Journal events. It will always correct -back to the actual balance on each CAPI data pull or game relog/restart.

      -
    6. -
    7. -

      state['Cargo'] now takes account of any CargoTransfer events. -This was added to the game in the Fleet Carriers update, but also covers -transfers to/from an SRV.

      -
    8. -
    9. -

      state['OnFoot'] is a new boolean, set true whenever we detect -the Cmdr is on-foot, i.e. not in any type of vehicle (Cmdr's own ship, -SRV, multi-crew in another Cmdr's ship, Apex taxi, or a Dropship).

      -
    10. -
    11. -

      state['Suits'] and state['SuitLoadouts'] added as dicts containing -information about the Cmdr's owned Suits and the Loadouts the Cmdr has -defined to utilise them (and on-foot weapons). -Note that in the raw CAPI data these are arrays if all members -contiguously exist, else a dictionary, but we have chosen to always coerce -these to a python dict for simplicity. They will be empty dicts, not -None if there is no data.
      -We use the CAPI data names for keys, not the Journal ones - e.g. slots -for weapons equipped, not Modules. -The id field found on e.g. weapon details in suit loadouts may be None -if we got the data from the Journal rather than the CAPI data. -NB: This data is only guaranteed up to date and correct after a fresh CAPI -data pull, as the current Journal events don't allow for updating it on the -fly (this should change in a future Odyssey patch).

      -
    12. -
    13. -

      state['SuitCurrent'] and state['SuitLoadoutCurrent'] contain the -obvious "currently in use" data as per the Suits/SuitLoadouts.

      -
    14. -
    15. -

      Tracking of the new Odyssey 'Microresources' has been added:

      -
        -
      1. -Component - dict for 'Ship Locker' inventory.
      2. -
      3. -Item - dict for 'Ship Locker' inventory.
      4. -
      5. -Consumable - dict for 'Ship Locker' inventory.
      6. -
      7. -Data - dict for 'Ship Locker' inventory.
      8. -
      9. -BackPack - on-foot inventory, a dict containing again -dicts for Component, Item, Consumable and Data. -However note that the lack of a Journal event when throwing a grenade, -along with no BackPackMaterials event if logging in on-foot means that -we can't track the BackPack inventory perfectly.
      10. -
      -
    16. -
    -

    See the updated PLUGINS.md file for details.

    -
  • -
  • -

    As Status.json, and thus the EDMC 'dashboard' output now has a 'flags2' -key we have added the associated constants to edmc_data.py with a -Flags2 prefix on the names.

    -
  • -
  • -

    Note that during the Odyssey Alpha it was observed that the CAPI -data['commander']['docked'] boolean was always true if the Cmdr was -in their ship. This is a regression from pre-Odyssey behaviour. The -core EDMC code copes with this. Please add a reproduction to the issue -about this: -PTS CAPI saying Commander is Docked after jumping to new system.

    -
  • -
]]>
- -
-
-
From a9c026c3ef1f0ed709077a759467bff1e32e5416 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 27 May 2024 09:46:01 -0400 Subject: [PATCH 273/425] [Admin] RM XML File From dbeaac657bea0a85ee95a4756e99c09845fa3538 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 27 May 2024 09:51:54 -0400 Subject: [PATCH 274/425] [Admin] Update GitIgnore and Path for XML --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index df50e32b..778820c6 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,8 @@ appcast_mac_*.xml EDMC_Installer_Config.iss EDMarketConnector.wxs wix/components.wxs +edmarketconnector.xml +edmarketconnector-beta.xml # Ignore Visual Elements Manifest file for Windows EDMarketConnector.VisualElementsManifest.xml From 99a7451b5dd5b12aeb7934cbd66ef5a4b64bbc4a Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 27 May 2024 09:52:16 -0400 Subject: [PATCH 275/425] [519] Change Beta Location --- config/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/__init__.py b/config/__init__.py index 1a0ae24a..2fca7922 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -485,7 +485,7 @@ config = get_config() def get_update_feed() -> str: """Select the proper update feed for the current update track.""" if config.get_bool('beta_optin'): - return 'https://raw.githubusercontent.com/EDCD/EDMarketConnector/beta/edmarketconnector.xml' + return 'https://raw.githubusercontent.com/EDCD/EDMarketConnector/releases/edmarketconnector-beta.xml' return 'https://raw.githubusercontent.com/EDCD/EDMarketConnector/releases/edmarketconnector.xml' From 95e037c9bc180d0b927b3a4f255b3e9a8aae3468 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 27 May 2024 09:51:54 -0400 Subject: [PATCH 276/425] [Admin] Update GitIgnore and Path for XML --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index a7da806e..0cdfe698 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,8 @@ appcast_mac_*.xml EDMC_Installer_Config.iss EDMarketConnector.wxs wix/components.wxs +edmarketconnector.xml +edmarketconnector-beta.xml # Ignore Visual Elements Manifest file for Windows EDMarketConnector.VisualElementsManifest.xml From 9432078488afbbc424c8d73fcb97ea44e50707dd Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 27 May 2024 09:46:01 -0400 Subject: [PATCH 277/425] [Admin] RM XML File From d1cc1ff54aaecf2107ef833c322c879c0625f883 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 27 May 2024 09:51:54 -0400 Subject: [PATCH 278/425] [Admin] Update GitIgnore and Path for XML --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index a7da806e..0cdfe698 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,8 @@ appcast_mac_*.xml EDMC_Installer_Config.iss EDMarketConnector.wxs wix/components.wxs +edmarketconnector.xml +edmarketconnector-beta.xml # Ignore Visual Elements Manifest file for Windows EDMarketConnector.VisualElementsManifest.xml From 0464990e25b8867b7cc72794d1bd9b26d1ef3439 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 27 May 2024 10:00:21 -0400 Subject: [PATCH 279/425] [Admin] RM XML File --- edmarketconnector.xml | 252 ------------------------------------------ 1 file changed, 252 deletions(-) delete mode 100644 edmarketconnector.xml diff --git a/edmarketconnector.xml b/edmarketconnector.xml deleted file mode 100644 index a4187153..00000000 --- a/edmarketconnector.xml +++ /dev/null @@ -1,252 +0,0 @@ - - - - E:D Market Connector - https://raw.githubusercontent.com/EDCD/EDMarketConnector/releases/edmarketconnector.xml - Most recent changes with links to updates. - - - - - Release 3.44 - - h2 { font-size: 105%; } -

Release 3.44

-

CHANGE OF MAINTAINER

-

Due to a lack of time to give the project the attention it needs Marginal has handed over ownership of the EDMarketConnector GitHub repository to the EDCD (Elite Dangerous Community Developers) organisation.

-

Initially Athanasius will now be responsible for maintaining the code, including addressing any Pull Requests and Issues, and making releases. Unfortunately he has no access to hardware running MacOS so can't easily generate builds for that platform or test them. So for the time being releases will be for Windows 10 only. MacOS users are advised to look into running from source (see the github README).

-

Going forwards the intention is to move to the python 3.7 code as soon as possible. To facilitate this there will be one more python 2.7 release in addition to this one, with the main aim of that being to add code to alert the user about any plugins they use that have apparently not been updated to run under python 3.7.

-

See the project GitHub repository's README.md for further information.

-
    -
  • Version increased to 3.4.4.0 / 3.44.
  • -
  • URL the application checks for updates changed to point to github,
  • -
- ]]> -
- -
- - - - - Release 4.2.3 - - body { font-family:"Segoe UI","Tahoma"; font-size: 75%; } h2 { font-family:"Segoe UI","Tahoma"; font-size: 105%; } - -

Release 4.2.3

-

This release mostly addresses an issue when Frontier Authorisation gets stuck -on 'Logging in...' despite completing the authorisation on the Frontier -website.

-
    -
  • -

    Allow edmc... argument to EDMarketConnector.exe. This should only be -necessary when something has prevented your web browser from invoking the -edmc protocol via DDE.

    -

    If you were encountering the 'Logging in...' issue and still do with this -release then please try running the application via the new -EDMarketConnector - localserver-auth.bat file in the installation -directory.

    -

    This simply runs EDMarketConnector.exe with the ---force-localserver-for-auth command-line argument. This forces the code -to setup and use a webserver on a random port on localhost for the -Frontier Authorisation callback, the same way it already works on -non-Windows platforms.

    -
  • -
  • -

    Add Korean translation to both the application and the installer.

    -
  • -
- - -

Release 4.2.2

-

This release contains a minor bug-fix, actually properly checking a station's -ships list before operating on it.

-
    -
  • Check that ships['shipuard_list'] is a dict before trying to use -.values() on it. This fixes the issue with seeing list object has no attribute values in the application status line.
  • -
- -

Release 4.2.1

-

This is a bug-fix release.

-
    -
  • -

    Updated translations. Thanks once again to all those contributing as per -Translations.

    -
  • -
  • -

    PLUGINS.md: Clarify when CargoJSON is populated.

    -
  • -
  • -

    macOS: pip install -r requirements.txt will now include pyobjc so that -running this application works at all. Check the updated Running from -source -for some advice if attempting to run on macOS.

    -
  • -
  • -

    JournalLock: Handle when the Journal directory isn't set at all, rather than -erroring. Fixes #910 - Not launching (Linux).

    -
  • -
  • -

    Extra logging added to track down cause of #909 - Authentication not possible (PC) -. The debug log file might now indicate what's wrong, or we might need -you to run

    -
    "c:\Program Files (x86)\EDMarketConnector/EDMarketConnector.exe" --trace
    -
    -

    in order to increase the log level and gather some extra information. -Caution is advised if sharing a --trace log file as it will now contain -some of the actual auth data returned from Frontier.

    -
  • -
  • -

    Ensure that 'Save Raw Data' will work. Fixes #908 - Raw export of CAPI data broken.

    -
  • -
  • -

    Prevent EDDN plugin from erroring when we determine if the commander has -Horizons. Fixes #907 - Modules is a list not a dict on damaged stations

    -
  • -
- - -

Release 4.2.0

-

This release increases the Minor version due to the major change in how -multiple-instance checking is done.

-
    -
  • -

    Adds Steam and Epic to the list of "audiences" in the Frontier Auth callout -so that you can authorise using those accounts, rather than their associated -Frontier Account details.

    -
  • -
  • -

    New status message "CAPI: No commander data returned" if a /profile -request has no commander in the returned data. This can happen if you -literally haven't yet created a Commander on the account. Previously you'd -get a confusing 'commander' message shown.

    -
  • -
  • -

    Changes the "is there another process already running?" check to be based on -a lockfile in the configured Journals directory. The name of this file is -edmc-journal-lock.txt and upon successful locking it will contain text -like:

    -
    Path: <configured path to your Journals>
    -PID: <process ID of the application>
    -
    -

    The lock will be released and applied to the new directory if you change it -via Settings > Configuration. If the new location is already locked you'll -get a 'Retry/Ignore?' pop-up.

    -

    For most users things will operate no differently, although note that the -multiple instance check does now apply to platforms other than Windows.

    -

    For anyone wanting to run multiple instances of the program this is now -possible via:

    -

    runas /user:<USER> "\"c:\Program Files (x86)\EDMarketConnector\EDMarketConnector.exe\" --force-localserver-for-auth"

    -

    If anything has messed with the backslash characters there then know that you -need to have " (double-quote) around the entire command (path to program .exe -and any extra arguments), and as a result need to place a backslash before -any double-quote characters in the command (such as around the space-including -path to the program).

    -

    I've verified it renders correctly on GitHub.

    -

    The old check was based solely on there being a window present with the title -we expect. This prevented using runas /user:SOMEUSER ... to run a second -copy of the application, as the resulting window would still be within the -same desktop environment and thus be found in the check.

    -

    The new method does assume that the Journals directory is writable by the -user we're running as. This might not be true in the case of sharing the -file system to another host in a read-only manner. If we fail to open the -lock file read-write then the application aborts the checks and will simply -continue running as normal.

    -

    Note that any single instance of EDMarketConnector.exe will still only monitor -and act upon the latest Journal file in the configured location. If you run -Elite Dangerous for another Commander then the application will want to start -monitoring that separate Commander. See wiki:Troubleshooting#i-run-two-instances-of-ed-simultaneously-but-i-cant-run-two-instances-of-edmc -which will be updated when this change is in a full release.

    -
  • -
  • -

    Adds the command-line argument --force-localserver-for-auth. This forces -using a local webserver for the Frontier Auth callback. This should be used -when running multiple instances of the application for all instances -else there's no guarantee of the edmc:// protocol callback reaching the -correct process and Frontier Auth will fail.

    -
  • -
  • -

    Adds the command-line argument --suppress-dupe-process-popup to exit -without showing the warning popup in the case that EDMarketConnector found -another process already running.

    -

    This can be useful if wanting to blindly run both EDMC and the game from a -batch file or similar.

    -
  • -
- - - -

Release 4.1.6

-

We might have finally found the cause of the application hangs during shutdown. -Note that this became easier to track down due to the downtime -for migration of www.edsm.net around 2021-01-11. Before these fixes EDSM's -API not being available would cause an EDMC hang on shutdown.

-
    -
  • -

    We've applied extra paranoia to some of the application shutdown code to -ensure we're not still trying to handle journal events during this sequence.

    -

    We also re-ordered the shutdown sequence, which might help avoid the shutdown -hang.

    -

    If you encounter a shutdown hang then please add a comment and log files to -Application can leave a zombie process on shutdown #678 -to help us track down the cause and fix it.

    -
  • -
  • -

    We now avoid making Tk event_generate() calls whilst the appliction is -shutting down.

    -
  • -
  • -

    Plugins should actively avoid making any sort of Tk event_generate() call -during application shutdown.

    -

    This means using if not config.shutting_down: to gate any code in worker -threads that might attempt this. Also, be sure you're not attempting such -in your plugin_stop() function.

    -

    See plugins/edsm.py and plugins/inara.py for example of the usage.

    -
  • -
  • -

    Any use of plug.show_error() won't actually change the UI status line -during shutdown, but the text you tried to show will be logged instead.

    -
  • -
  • -

    Cargo tracking will now correctly count all instances of the same type of -cargo for different missions. Previously it only counted the cargo for -the last mission requiring that cargo type, as found in Cargo.json.

    -
  • -
  • -

    The loaded contents of Cargo.json can now be found in monitor.state['CargoJSON']. -monitor.state is what is passed to plugins as state in the -journal_entry() call.

    -
  • -
  • -

    Our logging code should now cope with logging from a property.

    -
  • -
  • -

    Logging from any name-mangled method should now work properly.

    -
  • -
  • -

    Miscellaneous updates to PLUGINS.md - mostly to clarify some things.

    -
  • -
- - ]]> -
- -
- -
-
From cf9d9106454a3b164a1cfea94185cd3a36dbe895 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 27 May 2024 10:00:21 -0400 Subject: [PATCH 280/425] [Admin] RM XML File --- edmarketconnector.xml | 252 ------------------------------------------ 1 file changed, 252 deletions(-) delete mode 100644 edmarketconnector.xml diff --git a/edmarketconnector.xml b/edmarketconnector.xml deleted file mode 100644 index a4187153..00000000 --- a/edmarketconnector.xml +++ /dev/null @@ -1,252 +0,0 @@ - - - - E:D Market Connector - https://raw.githubusercontent.com/EDCD/EDMarketConnector/releases/edmarketconnector.xml - Most recent changes with links to updates. - - - - - Release 3.44 - - h2 { font-size: 105%; } -

Release 3.44

-

CHANGE OF MAINTAINER

-

Due to a lack of time to give the project the attention it needs Marginal has handed over ownership of the EDMarketConnector GitHub repository to the EDCD (Elite Dangerous Community Developers) organisation.

-

Initially Athanasius will now be responsible for maintaining the code, including addressing any Pull Requests and Issues, and making releases. Unfortunately he has no access to hardware running MacOS so can't easily generate builds for that platform or test them. So for the time being releases will be for Windows 10 only. MacOS users are advised to look into running from source (see the github README).

-

Going forwards the intention is to move to the python 3.7 code as soon as possible. To facilitate this there will be one more python 2.7 release in addition to this one, with the main aim of that being to add code to alert the user about any plugins they use that have apparently not been updated to run under python 3.7.

-

See the project GitHub repository's README.md for further information.

-
    -
  • Version increased to 3.4.4.0 / 3.44.
  • -
  • URL the application checks for updates changed to point to github,
  • -
- ]]> -
- -
- - - - - Release 4.2.3 - - body { font-family:"Segoe UI","Tahoma"; font-size: 75%; } h2 { font-family:"Segoe UI","Tahoma"; font-size: 105%; } - -

Release 4.2.3

-

This release mostly addresses an issue when Frontier Authorisation gets stuck -on 'Logging in...' despite completing the authorisation on the Frontier -website.

-
    -
  • -

    Allow edmc... argument to EDMarketConnector.exe. This should only be -necessary when something has prevented your web browser from invoking the -edmc protocol via DDE.

    -

    If you were encountering the 'Logging in...' issue and still do with this -release then please try running the application via the new -EDMarketConnector - localserver-auth.bat file in the installation -directory.

    -

    This simply runs EDMarketConnector.exe with the ---force-localserver-for-auth command-line argument. This forces the code -to setup and use a webserver on a random port on localhost for the -Frontier Authorisation callback, the same way it already works on -non-Windows platforms.

    -
  • -
  • -

    Add Korean translation to both the application and the installer.

    -
  • -
- - -

Release 4.2.2

-

This release contains a minor bug-fix, actually properly checking a station's -ships list before operating on it.

-
    -
  • Check that ships['shipuard_list'] is a dict before trying to use -.values() on it. This fixes the issue with seeing list object has no attribute values in the application status line.
  • -
- -

Release 4.2.1

-

This is a bug-fix release.

-
    -
  • -

    Updated translations. Thanks once again to all those contributing as per -Translations.

    -
  • -
  • -

    PLUGINS.md: Clarify when CargoJSON is populated.

    -
  • -
  • -

    macOS: pip install -r requirements.txt will now include pyobjc so that -running this application works at all. Check the updated Running from -source -for some advice if attempting to run on macOS.

    -
  • -
  • -

    JournalLock: Handle when the Journal directory isn't set at all, rather than -erroring. Fixes #910 - Not launching (Linux).

    -
  • -
  • -

    Extra logging added to track down cause of #909 - Authentication not possible (PC) -. The debug log file might now indicate what's wrong, or we might need -you to run

    -
    "c:\Program Files (x86)\EDMarketConnector/EDMarketConnector.exe" --trace
    -
    -

    in order to increase the log level and gather some extra information. -Caution is advised if sharing a --trace log file as it will now contain -some of the actual auth data returned from Frontier.

    -
  • -
  • -

    Ensure that 'Save Raw Data' will work. Fixes #908 - Raw export of CAPI data broken.

    -
  • -
  • -

    Prevent EDDN plugin from erroring when we determine if the commander has -Horizons. Fixes #907 - Modules is a list not a dict on damaged stations

    -
  • -
- - -

Release 4.2.0

-

This release increases the Minor version due to the major change in how -multiple-instance checking is done.

-
    -
  • -

    Adds Steam and Epic to the list of "audiences" in the Frontier Auth callout -so that you can authorise using those accounts, rather than their associated -Frontier Account details.

    -
  • -
  • -

    New status message "CAPI: No commander data returned" if a /profile -request has no commander in the returned data. This can happen if you -literally haven't yet created a Commander on the account. Previously you'd -get a confusing 'commander' message shown.

    -
  • -
  • -

    Changes the "is there another process already running?" check to be based on -a lockfile in the configured Journals directory. The name of this file is -edmc-journal-lock.txt and upon successful locking it will contain text -like:

    -
    Path: <configured path to your Journals>
    -PID: <process ID of the application>
    -
    -

    The lock will be released and applied to the new directory if you change it -via Settings > Configuration. If the new location is already locked you'll -get a 'Retry/Ignore?' pop-up.

    -

    For most users things will operate no differently, although note that the -multiple instance check does now apply to platforms other than Windows.

    -

    For anyone wanting to run multiple instances of the program this is now -possible via:

    -

    runas /user:<USER> "\"c:\Program Files (x86)\EDMarketConnector\EDMarketConnector.exe\" --force-localserver-for-auth"

    -

    If anything has messed with the backslash characters there then know that you -need to have " (double-quote) around the entire command (path to program .exe -and any extra arguments), and as a result need to place a backslash before -any double-quote characters in the command (such as around the space-including -path to the program).

    -

    I've verified it renders correctly on GitHub.

    -

    The old check was based solely on there being a window present with the title -we expect. This prevented using runas /user:SOMEUSER ... to run a second -copy of the application, as the resulting window would still be within the -same desktop environment and thus be found in the check.

    -

    The new method does assume that the Journals directory is writable by the -user we're running as. This might not be true in the case of sharing the -file system to another host in a read-only manner. If we fail to open the -lock file read-write then the application aborts the checks and will simply -continue running as normal.

    -

    Note that any single instance of EDMarketConnector.exe will still only monitor -and act upon the latest Journal file in the configured location. If you run -Elite Dangerous for another Commander then the application will want to start -monitoring that separate Commander. See wiki:Troubleshooting#i-run-two-instances-of-ed-simultaneously-but-i-cant-run-two-instances-of-edmc -which will be updated when this change is in a full release.

    -
  • -
  • -

    Adds the command-line argument --force-localserver-for-auth. This forces -using a local webserver for the Frontier Auth callback. This should be used -when running multiple instances of the application for all instances -else there's no guarantee of the edmc:// protocol callback reaching the -correct process and Frontier Auth will fail.

    -
  • -
  • -

    Adds the command-line argument --suppress-dupe-process-popup to exit -without showing the warning popup in the case that EDMarketConnector found -another process already running.

    -

    This can be useful if wanting to blindly run both EDMC and the game from a -batch file or similar.

    -
  • -
- - - -

Release 4.1.6

-

We might have finally found the cause of the application hangs during shutdown. -Note that this became easier to track down due to the downtime -for migration of www.edsm.net around 2021-01-11. Before these fixes EDSM's -API not being available would cause an EDMC hang on shutdown.

-
    -
  • -

    We've applied extra paranoia to some of the application shutdown code to -ensure we're not still trying to handle journal events during this sequence.

    -

    We also re-ordered the shutdown sequence, which might help avoid the shutdown -hang.

    -

    If you encounter a shutdown hang then please add a comment and log files to -Application can leave a zombie process on shutdown #678 -to help us track down the cause and fix it.

    -
  • -
  • -

    We now avoid making Tk event_generate() calls whilst the appliction is -shutting down.

    -
  • -
  • -

    Plugins should actively avoid making any sort of Tk event_generate() call -during application shutdown.

    -

    This means using if not config.shutting_down: to gate any code in worker -threads that might attempt this. Also, be sure you're not attempting such -in your plugin_stop() function.

    -

    See plugins/edsm.py and plugins/inara.py for example of the usage.

    -
  • -
  • -

    Any use of plug.show_error() won't actually change the UI status line -during shutdown, but the text you tried to show will be logged instead.

    -
  • -
  • -

    Cargo tracking will now correctly count all instances of the same type of -cargo for different missions. Previously it only counted the cargo for -the last mission requiring that cargo type, as found in Cargo.json.

    -
  • -
  • -

    The loaded contents of Cargo.json can now be found in monitor.state['CargoJSON']. -monitor.state is what is passed to plugins as state in the -journal_entry() call.

    -
  • -
  • -

    Our logging code should now cope with logging from a property.

    -
  • -
  • -

    Logging from any name-mangled method should now work properly.

    -
  • -
  • -

    Miscellaneous updates to PLUGINS.md - mostly to clarify some things.

    -
  • -
- - ]]> -
- -
- -
-
From edae51ff3303620cae151e2383427907d783a6d9 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 27 May 2024 09:46:01 -0400 Subject: [PATCH 281/425] [Admin] RM XML File From f9c5677a57c1ea0a7400b6aec09d27311bb8356a Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 27 May 2024 09:51:54 -0400 Subject: [PATCH 282/425] [Admin] Update GitIgnore and Path for XML --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index a7da806e..0cdfe698 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,8 @@ appcast_mac_*.xml EDMC_Installer_Config.iss EDMarketConnector.wxs wix/components.wxs +edmarketconnector.xml +edmarketconnector-beta.xml # Ignore Visual Elements Manifest file for Windows EDMarketConnector.VisualElementsManifest.xml From 8b5e3b57604f596e7ad529a3e066df4ae0c4f537 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 27 May 2024 10:00:21 -0400 Subject: [PATCH 283/425] [Admin] RM XML File --- edmarketconnector.xml | 252 ------------------------------------------ 1 file changed, 252 deletions(-) delete mode 100644 edmarketconnector.xml diff --git a/edmarketconnector.xml b/edmarketconnector.xml deleted file mode 100644 index a4187153..00000000 --- a/edmarketconnector.xml +++ /dev/null @@ -1,252 +0,0 @@ - - - - E:D Market Connector - https://raw.githubusercontent.com/EDCD/EDMarketConnector/releases/edmarketconnector.xml - Most recent changes with links to updates. - - - - - Release 3.44 - - h2 { font-size: 105%; } -

Release 3.44

-

CHANGE OF MAINTAINER

-

Due to a lack of time to give the project the attention it needs Marginal has handed over ownership of the EDMarketConnector GitHub repository to the EDCD (Elite Dangerous Community Developers) organisation.

-

Initially Athanasius will now be responsible for maintaining the code, including addressing any Pull Requests and Issues, and making releases. Unfortunately he has no access to hardware running MacOS so can't easily generate builds for that platform or test them. So for the time being releases will be for Windows 10 only. MacOS users are advised to look into running from source (see the github README).

-

Going forwards the intention is to move to the python 3.7 code as soon as possible. To facilitate this there will be one more python 2.7 release in addition to this one, with the main aim of that being to add code to alert the user about any plugins they use that have apparently not been updated to run under python 3.7.

-

See the project GitHub repository's README.md for further information.

-
    -
  • Version increased to 3.4.4.0 / 3.44.
  • -
  • URL the application checks for updates changed to point to github,
  • -
- ]]> -
- -
- - - - - Release 4.2.3 - - body { font-family:"Segoe UI","Tahoma"; font-size: 75%; } h2 { font-family:"Segoe UI","Tahoma"; font-size: 105%; } - -

Release 4.2.3

-

This release mostly addresses an issue when Frontier Authorisation gets stuck -on 'Logging in...' despite completing the authorisation on the Frontier -website.

-
    -
  • -

    Allow edmc... argument to EDMarketConnector.exe. This should only be -necessary when something has prevented your web browser from invoking the -edmc protocol via DDE.

    -

    If you were encountering the 'Logging in...' issue and still do with this -release then please try running the application via the new -EDMarketConnector - localserver-auth.bat file in the installation -directory.

    -

    This simply runs EDMarketConnector.exe with the ---force-localserver-for-auth command-line argument. This forces the code -to setup and use a webserver on a random port on localhost for the -Frontier Authorisation callback, the same way it already works on -non-Windows platforms.

    -
  • -
  • -

    Add Korean translation to both the application and the installer.

    -
  • -
- - -

Release 4.2.2

-

This release contains a minor bug-fix, actually properly checking a station's -ships list before operating on it.

-
    -
  • Check that ships['shipuard_list'] is a dict before trying to use -.values() on it. This fixes the issue with seeing list object has no attribute values in the application status line.
  • -
- -

Release 4.2.1

-

This is a bug-fix release.

-
    -
  • -

    Updated translations. Thanks once again to all those contributing as per -Translations.

    -
  • -
  • -

    PLUGINS.md: Clarify when CargoJSON is populated.

    -
  • -
  • -

    macOS: pip install -r requirements.txt will now include pyobjc so that -running this application works at all. Check the updated Running from -source -for some advice if attempting to run on macOS.

    -
  • -
  • -

    JournalLock: Handle when the Journal directory isn't set at all, rather than -erroring. Fixes #910 - Not launching (Linux).

    -
  • -
  • -

    Extra logging added to track down cause of #909 - Authentication not possible (PC) -. The debug log file might now indicate what's wrong, or we might need -you to run

    -
    "c:\Program Files (x86)\EDMarketConnector/EDMarketConnector.exe" --trace
    -
    -

    in order to increase the log level and gather some extra information. -Caution is advised if sharing a --trace log file as it will now contain -some of the actual auth data returned from Frontier.

    -
  • -
  • -

    Ensure that 'Save Raw Data' will work. Fixes #908 - Raw export of CAPI data broken.

    -
  • -
  • -

    Prevent EDDN plugin from erroring when we determine if the commander has -Horizons. Fixes #907 - Modules is a list not a dict on damaged stations

    -
  • -
- - -

Release 4.2.0

-

This release increases the Minor version due to the major change in how -multiple-instance checking is done.

-
    -
  • -

    Adds Steam and Epic to the list of "audiences" in the Frontier Auth callout -so that you can authorise using those accounts, rather than their associated -Frontier Account details.

    -
  • -
  • -

    New status message "CAPI: No commander data returned" if a /profile -request has no commander in the returned data. This can happen if you -literally haven't yet created a Commander on the account. Previously you'd -get a confusing 'commander' message shown.

    -
  • -
  • -

    Changes the "is there another process already running?" check to be based on -a lockfile in the configured Journals directory. The name of this file is -edmc-journal-lock.txt and upon successful locking it will contain text -like:

    -
    Path: <configured path to your Journals>
    -PID: <process ID of the application>
    -
    -

    The lock will be released and applied to the new directory if you change it -via Settings > Configuration. If the new location is already locked you'll -get a 'Retry/Ignore?' pop-up.

    -

    For most users things will operate no differently, although note that the -multiple instance check does now apply to platforms other than Windows.

    -

    For anyone wanting to run multiple instances of the program this is now -possible via:

    -

    runas /user:<USER> "\"c:\Program Files (x86)\EDMarketConnector\EDMarketConnector.exe\" --force-localserver-for-auth"

    -

    If anything has messed with the backslash characters there then know that you -need to have " (double-quote) around the entire command (path to program .exe -and any extra arguments), and as a result need to place a backslash before -any double-quote characters in the command (such as around the space-including -path to the program).

    -

    I've verified it renders correctly on GitHub.

    -

    The old check was based solely on there being a window present with the title -we expect. This prevented using runas /user:SOMEUSER ... to run a second -copy of the application, as the resulting window would still be within the -same desktop environment and thus be found in the check.

    -

    The new method does assume that the Journals directory is writable by the -user we're running as. This might not be true in the case of sharing the -file system to another host in a read-only manner. If we fail to open the -lock file read-write then the application aborts the checks and will simply -continue running as normal.

    -

    Note that any single instance of EDMarketConnector.exe will still only monitor -and act upon the latest Journal file in the configured location. If you run -Elite Dangerous for another Commander then the application will want to start -monitoring that separate Commander. See wiki:Troubleshooting#i-run-two-instances-of-ed-simultaneously-but-i-cant-run-two-instances-of-edmc -which will be updated when this change is in a full release.

    -
  • -
  • -

    Adds the command-line argument --force-localserver-for-auth. This forces -using a local webserver for the Frontier Auth callback. This should be used -when running multiple instances of the application for all instances -else there's no guarantee of the edmc:// protocol callback reaching the -correct process and Frontier Auth will fail.

    -
  • -
  • -

    Adds the command-line argument --suppress-dupe-process-popup to exit -without showing the warning popup in the case that EDMarketConnector found -another process already running.

    -

    This can be useful if wanting to blindly run both EDMC and the game from a -batch file or similar.

    -
  • -
- - - -

Release 4.1.6

-

We might have finally found the cause of the application hangs during shutdown. -Note that this became easier to track down due to the downtime -for migration of www.edsm.net around 2021-01-11. Before these fixes EDSM's -API not being available would cause an EDMC hang on shutdown.

-
    -
  • -

    We've applied extra paranoia to some of the application shutdown code to -ensure we're not still trying to handle journal events during this sequence.

    -

    We also re-ordered the shutdown sequence, which might help avoid the shutdown -hang.

    -

    If you encounter a shutdown hang then please add a comment and log files to -Application can leave a zombie process on shutdown #678 -to help us track down the cause and fix it.

    -
  • -
  • -

    We now avoid making Tk event_generate() calls whilst the appliction is -shutting down.

    -
  • -
  • -

    Plugins should actively avoid making any sort of Tk event_generate() call -during application shutdown.

    -

    This means using if not config.shutting_down: to gate any code in worker -threads that might attempt this. Also, be sure you're not attempting such -in your plugin_stop() function.

    -

    See plugins/edsm.py and plugins/inara.py for example of the usage.

    -
  • -
  • -

    Any use of plug.show_error() won't actually change the UI status line -during shutdown, but the text you tried to show will be logged instead.

    -
  • -
  • -

    Cargo tracking will now correctly count all instances of the same type of -cargo for different missions. Previously it only counted the cargo for -the last mission requiring that cargo type, as found in Cargo.json.

    -
  • -
  • -

    The loaded contents of Cargo.json can now be found in monitor.state['CargoJSON']. -monitor.state is what is passed to plugins as state in the -journal_entry() call.

    -
  • -
  • -

    Our logging code should now cope with logging from a property.

    -
  • -
  • -

    Logging from any name-mangled method should now work properly.

    -
  • -
  • -

    Miscellaneous updates to PLUGINS.md - mostly to clarify some things.

    -
  • -
- - ]]> -
- -
- -
-
From 5fa8f689ba3fd69798c9ee5860fb289053a4b347 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 27 May 2024 10:16:05 -0400 Subject: [PATCH 284/425] [5.11.0-rc1] Update Changelog, Init --- ChangeLog.md | 64 ++++++++++++++++++++++++++++++++++++++++++++++ config/__init__.py | 2 +- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 7d14ca9c..8c810a53 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,6 +6,70 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- +Release 5.11.0-rc1 +=== + +This release includes a number of new features and improvements, including a new Beta Update Track for testing future updates, enhanced context menus for text entry fields and UI elements, a revamp to the existing translation system and logging capabilities, and more. This release includes the Python Image Library (PIL) into our core bundle, adds a number of stability and configuration checks to the tool, and adds new schemas and configuration values to senders. + +This release also includes a number of bug fixes, performance enhancements, and updates to various aspects of the code to enhance maintainability are included. Notably, MacOS support has been removed due to a lack of support for this OS in Elite, and a number of functions have been deprecated and will be removed in later versions. Plugin developers, take note! + +**Changes and Enhancements** +* Established a Beta Update Track to allow users to assist in future update testing +* Added a global context menu for text entry fields that includes cut, copy, and paste options +* Added a context menu for Ship, System, and Station UI elements which allows opening the respective link in any of the available resource providers. +* Added translation hooks to the update available status string +* Added additional status logging when we're awaiting game log-in +* Added the Python Image Library (PIL) to the core EDMC library bundle +* Added respect for EDSM API limits to the default plugin +* Added EDDN stationType and carrierDockingAccess schemas to the sent events +* Added MaxJumpRange and CargoCapacity events to the Inara sender +* Added a high-level critical error handler to gracefully terminate the program in the event of a catastrophic error +* Added the ability to override the default language for a translation by adding the optional 'lang' parameter to the translate function for individual functions +* Added an updated template and new security reporting guidance to the documentation +* Added a new updater for the FDevID Files to keep the dependency up to date without requiring a new patch version push +* Added a System Profiler Utility to assist with gathering system and environment information for bug report purposes +* Added a new security policy for responsible disclosure of identified security issues +* Enabled security code scanning on the GitHub repository +* Updates the look and feel of the "Already Running" popup to reduce overhead and improve the look of the popup +* Updated translations to latest versions +* Updated documentation to reflect certain changes to the code +* Updated the GitHub Bug Report template +* Updated the GitHub Pull Request template +* Updated internal workflows to more recent versions +* Updated util_ships to avoid using Windows reserved file names as output +* Converted all usages of the unnecessary OrderedDict to use the standard dict +* Clarifies the hierarchy of parent classes for custom MyNotebook classes +* Renamed the default translation function from `_()` to `tr.tl()` +* Renamed the Translations base class to conform to Pythonic standards +* Deprecated the `_Translations` class +* Deprecated the `Translations` singleton in favor of `translations` +* Unpinned several dependencies that were already dependencies of other dependencies to prevent dependency conflicts (say that 5 times fast) +* Updated a few type hints to allow updates to more updated dependencies +* Changed the translation function import to no longer rely on forcing it into Python's builtins +* Handed over a few tk classes to their ttk equivalents for better styling +* Reworked the Plugin system to no longer use the deprecated importlib.load_module() +* Deprecated nb.Entry and nb.ColoredButton as they simply point toward other classes with no processing +* Removed macOS support +* Removed deprecated modules.p and ships.p files +* Removed deprecated openurl() function + +**Bug Fixes** +* Fixed a bug where certain types of exceptions from the Requests module wouldn't be handled properly regarding killswitches +* Fixed a rare bug where source builds running on 64-bit Python could generate an OverflowError in the monitor system +* Fixed a bug where EDMC would open directories in the webbrowser instead of the file explorer on Linux +* Fixed a rare bug that could cause the EDSM plugin to crash due to missing configuration values + +**Plugin Developers** +* nb.Entry is deprecated, and is slated for removal in 6.0 or later. Please migrate to nb.EntryMenu +* nb.ColoredButton is deprecated, and is slated for removal in 6.0 or later. Please migrate to tk.Button +* Calling internal translations with `_()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to importing `translations` and calling `translations.translate` or `translations.tl` directly +* `Translations` as the translate system singleton is deprecated, and is slated for removal in 6.0 or later. Please migrate to the `translations` singleton +* `help_open_log_folder()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to open_folder() +* `update_feed` is deprecated, and is slated for removal in 6.0 or later. Please migrate to `get_update_feed()`. +* modules.p and ships.p are deprecated, and have been removed +* The `openurl()` function in ttkHyperlinkLabel has been removed. Please migrate to `webbrowser.open()` + + Release 5.10.6 === This release contains the data information for the new SCO modules added in Elite update 18.04. diff --git a/config/__init__.py b/config/__init__.py index 2fca7922..7a08d963 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -54,7 +54,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.11.0-alpha3' +_static_appversion = '5.11.0-rc1' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From 1ecc460a9fbbacdf226ec27406552727d9cbce19 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 27 May 2024 10:16:05 -0400 Subject: [PATCH 285/425] [5.11.0-rc1] Update Changelog, Init --- ChangeLog.md | 64 ++++++++++++++++++++++++++++++++++++++++++++++ config/__init__.py | 2 +- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 7d14ca9c..8c810a53 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,6 +6,70 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- +Release 5.11.0-rc1 +=== + +This release includes a number of new features and improvements, including a new Beta Update Track for testing future updates, enhanced context menus for text entry fields and UI elements, a revamp to the existing translation system and logging capabilities, and more. This release includes the Python Image Library (PIL) into our core bundle, adds a number of stability and configuration checks to the tool, and adds new schemas and configuration values to senders. + +This release also includes a number of bug fixes, performance enhancements, and updates to various aspects of the code to enhance maintainability are included. Notably, MacOS support has been removed due to a lack of support for this OS in Elite, and a number of functions have been deprecated and will be removed in later versions. Plugin developers, take note! + +**Changes and Enhancements** +* Established a Beta Update Track to allow users to assist in future update testing +* Added a global context menu for text entry fields that includes cut, copy, and paste options +* Added a context menu for Ship, System, and Station UI elements which allows opening the respective link in any of the available resource providers. +* Added translation hooks to the update available status string +* Added additional status logging when we're awaiting game log-in +* Added the Python Image Library (PIL) to the core EDMC library bundle +* Added respect for EDSM API limits to the default plugin +* Added EDDN stationType and carrierDockingAccess schemas to the sent events +* Added MaxJumpRange and CargoCapacity events to the Inara sender +* Added a high-level critical error handler to gracefully terminate the program in the event of a catastrophic error +* Added the ability to override the default language for a translation by adding the optional 'lang' parameter to the translate function for individual functions +* Added an updated template and new security reporting guidance to the documentation +* Added a new updater for the FDevID Files to keep the dependency up to date without requiring a new patch version push +* Added a System Profiler Utility to assist with gathering system and environment information for bug report purposes +* Added a new security policy for responsible disclosure of identified security issues +* Enabled security code scanning on the GitHub repository +* Updates the look and feel of the "Already Running" popup to reduce overhead and improve the look of the popup +* Updated translations to latest versions +* Updated documentation to reflect certain changes to the code +* Updated the GitHub Bug Report template +* Updated the GitHub Pull Request template +* Updated internal workflows to more recent versions +* Updated util_ships to avoid using Windows reserved file names as output +* Converted all usages of the unnecessary OrderedDict to use the standard dict +* Clarifies the hierarchy of parent classes for custom MyNotebook classes +* Renamed the default translation function from `_()` to `tr.tl()` +* Renamed the Translations base class to conform to Pythonic standards +* Deprecated the `_Translations` class +* Deprecated the `Translations` singleton in favor of `translations` +* Unpinned several dependencies that were already dependencies of other dependencies to prevent dependency conflicts (say that 5 times fast) +* Updated a few type hints to allow updates to more updated dependencies +* Changed the translation function import to no longer rely on forcing it into Python's builtins +* Handed over a few tk classes to their ttk equivalents for better styling +* Reworked the Plugin system to no longer use the deprecated importlib.load_module() +* Deprecated nb.Entry and nb.ColoredButton as they simply point toward other classes with no processing +* Removed macOS support +* Removed deprecated modules.p and ships.p files +* Removed deprecated openurl() function + +**Bug Fixes** +* Fixed a bug where certain types of exceptions from the Requests module wouldn't be handled properly regarding killswitches +* Fixed a rare bug where source builds running on 64-bit Python could generate an OverflowError in the monitor system +* Fixed a bug where EDMC would open directories in the webbrowser instead of the file explorer on Linux +* Fixed a rare bug that could cause the EDSM plugin to crash due to missing configuration values + +**Plugin Developers** +* nb.Entry is deprecated, and is slated for removal in 6.0 or later. Please migrate to nb.EntryMenu +* nb.ColoredButton is deprecated, and is slated for removal in 6.0 or later. Please migrate to tk.Button +* Calling internal translations with `_()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to importing `translations` and calling `translations.translate` or `translations.tl` directly +* `Translations` as the translate system singleton is deprecated, and is slated for removal in 6.0 or later. Please migrate to the `translations` singleton +* `help_open_log_folder()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to open_folder() +* `update_feed` is deprecated, and is slated for removal in 6.0 or later. Please migrate to `get_update_feed()`. +* modules.p and ships.p are deprecated, and have been removed +* The `openurl()` function in ttkHyperlinkLabel has been removed. Please migrate to `webbrowser.open()` + + Release 5.10.6 === This release contains the data information for the new SCO modules added in Elite update 18.04. diff --git a/config/__init__.py b/config/__init__.py index 2fca7922..7a08d963 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -54,7 +54,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.11.0-alpha3' +_static_appversion = '5.11.0-rc1' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From 6660ab77f917e5dc0eee676247656c84efb42879 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 28 May 2024 08:27:36 -0400 Subject: [PATCH 286/425] [#1293][#1124] Resize Settings Window, Reorder Plugins --- prefs.py | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/prefs.py b/prefs.py index 5567e094..8904eb5b 100644 --- a/prefs.py +++ b/prefs.py @@ -232,7 +232,7 @@ class PreferencesDialog(tk.Toplevel): """The EDMC preferences dialog.""" def __init__(self, parent: tk.Tk, callback: Optional[Callable]): - tk.Toplevel.__init__(self, parent) + super().__init__(parent) self.parent = parent self.callback = callback @@ -242,25 +242,30 @@ class PreferencesDialog(tk.Toplevel): if parent.winfo_viewable(): self.transient(parent) - # position over parent - # http://core.tcl.tk/tk/tktview/c84f660833546b1b84e7 - # TODO this is fixed supposedly. + # Position over parent self.geometry(f'+{parent.winfo_rootx()}+{parent.winfo_rooty()}') - # remove decoration + # Remove decoration if sys.platform == 'win32': self.attributes('-toolwindow', tk.TRUE) - self.resizable(tk.FALSE, tk.FALSE) + # Allow the window to be resizable + self.resizable(tk.TRUE, tk.TRUE) self.cmdr: str | bool | None = False # Note if Cmdr changes in the Journal self.is_beta: bool = False # Note if Beta status changes in the Journal self.cmdrchanged_alarm: Optional[str] = None # This stores an ID that can be used to cancel a scheduled call + # Set up the main frame frame = ttk.Frame(self) frame.grid(sticky=tk.NSEW) + self.columnconfigure(0, weight=1) + self.rowconfigure(0, weight=1) + frame.columnconfigure(0, weight=1) + frame.rowconfigure(0, weight=1) + frame.rowconfigure(1, weight=0) - notebook: ttk.Notebook = nb.Notebook(frame) + notebook: nb.Notebook = nb.Notebook(frame) notebook.bind('<>', self.tabchanged) # Recompute on tab change self.PADX = 10 @@ -268,16 +273,17 @@ class PreferencesDialog(tk.Toplevel): self.LISTX = 25 # indent listed items self.PADY = 1 # close spacing self.BOXY = 2 # box spacing - self.SEPY = 10 # seperator line spacing + self.SEPY = 10 # separator line spacing # Set up different tabs - self.__setup_output_tab(notebook) - self.__setup_plugin_tabs(notebook) self.__setup_config_tab(notebook) - self.__setup_privacy_tab(notebook) self.__setup_appearance_tab(notebook) + self.__setup_output_tab(notebook) + self.__setup_privacy_tab(notebook) self.__setup_plugin_tab(notebook) + self.__setup_plugin_tabs(notebook) + # Set up the button frame buttonframe = ttk.Frame(frame) buttonframe.grid(padx=self.PADX, pady=self.PADX, sticky=tk.NSEW) buttonframe.columnconfigure(0, weight=1) @@ -298,7 +304,7 @@ class PreferencesDialog(tk.Toplevel): # wait for window to appear on screen before calling grab_set self.parent.update_idletasks() - self.parent.wm_attributes('-topmost', 0) # needed for dialog to appear ontop of parent on Linux + self.parent.wm_attributes('-topmost', 0) # needed for dialog to appear on top of parent on Linux self.wait_visibility() self.grab_set() From 6e6a6814be2b7905305f92a6d53efff648e5cdfa Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 28 May 2024 08:40:28 -0400 Subject: [PATCH 287/425] [1283] Enforce Minimum Size --- prefs.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/prefs.py b/prefs.py index 8904eb5b..0e3e3dea 100644 --- a/prefs.py +++ b/prefs.py @@ -322,6 +322,12 @@ class PreferencesDialog(tk.Toplevel): # Set Log Directory self.logfile_loc = pathlib.Path(tempfile.gettempdir()) / appname + # Set minimum size to prevent content cut-off + self.update_idletasks() # Update "requested size" from geometry manager + min_width = self.winfo_reqwidth() + min_height = self.winfo_reqheight() + self.wm_minsize(min_width, min_height) + def __setup_output_tab(self, root_notebook: ttk.Notebook) -> None: output_frame = nb.Frame(root_notebook) output_frame.columnconfigure(0, weight=1) From f53388e2117b048d53e7a8e45be4f98c9bb58a83 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 28 May 2024 08:53:18 -0400 Subject: [PATCH 288/425] [Minor] Update System Profiler Logging --- EDMarketConnector.py | 2 +- prefs.py | 24 ++++++++++++++---------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index 7f870108..249b842f 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -620,7 +620,7 @@ class AppWindow: self.help_menu.add_command(command=lambda: not self.HelpAbout.showing and self.HelpAbout(self.w)) logfile_loc = pathlib.Path(tempfile.gettempdir()) / appname self.help_menu.add_command(command=lambda: prefs.open_folder(logfile_loc)) # Open Log Folder - self.help_menu.add_command(command=prefs.help_open_system_profiler) # Open Log Folde + self.help_menu.add_command(command=lambda: prefs.help_open_system_profiler(self)) # Open Log Folde self.menubar.add_cascade(menu=self.help_menu) if sys.platform == 'win32': diff --git a/prefs.py b/prefs.py index 5567e094..08d8c6a0 100644 --- a/prefs.py +++ b/prefs.py @@ -57,14 +57,18 @@ def open_folder(file: pathlib.Path) -> None: system(f'xdg-open "{file}"') -def help_open_system_profiler() -> None: +def help_open_system_profiler(parent) -> None: """Open the EDMC System Profiler.""" profiler_path = pathlib.Path(config.respath_path) - if getattr(sys, 'frozen', False): - profiler_path /= 'EDMCSystemProfiler.exe' - subprocess.run(profiler_path) - else: - subprocess.run(['python', "EDMCSystemProfiler.py"], shell=True) + try: + if getattr(sys, 'frozen', False): + profiler_path /= 'EDMCSystemProfiler.exe' + subprocess.run(profiler_path, check=True) + else: + subprocess.run(['python', "EDMCSystemProfiler.py"], shell=True, check=True) + except Exception as err: + parent.status["text"] = "Unable to Launch System Profiler" + logger.exception(err) class PrefsVersion: @@ -927,7 +931,7 @@ class PreferencesDialog(tk.Toplevel): ).grid(column=1, padx=self.PADX, pady=self.PADY, sticky=tk.N, row=cur_row) enabled_plugins = list(filter(lambda x: x.folder and x.module, plug.PLUGINS)) - if len(enabled_plugins): + if enabled_plugins: ttk.Separator(plugins_frame, orient=tk.HORIZONTAL).grid( columnspan=3, padx=self.PADX, pady=self.SEPY, sticky=tk.EW, row=row.get() ) @@ -949,7 +953,7 @@ class PreferencesDialog(tk.Toplevel): ############################################################ # Show which plugins don't have Python 3.x support ############################################################ - if len(plug.PLUGINS_not_py3): + if plug.PLUGINS_not_py3: ttk.Separator(plugins_frame, orient=tk.HORIZONTAL).grid( columnspan=3, padx=self.PADX, pady=self.SEPY, sticky=tk.EW, row=row.get() ) @@ -975,7 +979,7 @@ class PreferencesDialog(tk.Toplevel): # Show disabled plugins ############################################################ disabled_plugins = list(filter(lambda x: x.folder and not x.module, plug.PLUGINS)) - if len(disabled_plugins): + if disabled_plugins: ttk.Separator(plugins_frame, orient=tk.HORIZONTAL).grid( columnspan=3, padx=self.PADX, pady=self.SEPY, sticky=tk.EW, row=row.get() ) @@ -992,7 +996,7 @@ class PreferencesDialog(tk.Toplevel): ############################################################ # Show plugins that failed to load ############################################################ - if len(plug.PLUGINS_broken): + if plug.PLUGINS_broken: ttk.Separator(plugins_frame, orient=tk.HORIZONTAL).grid( columnspan=3, padx=self.PADX, pady=self.SEPY, sticky=tk.EW, row=row.get() ) From 8a27ca266d945af528165d7f0ce5c767a3c13ea4 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 28 May 2024 09:02:58 -0400 Subject: [PATCH 289/425] [Minor] Add Translation --- L10n/en.template | 3 +++ prefs.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/L10n/en.template b/L10n/en.template index b45dfed9..3906b897 100644 --- a/L10n/en.template +++ b/L10n/en.template @@ -489,6 +489,9 @@ /* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:977; */ "Disabled Plugins" = "Disabled Plugins"; +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Error in System Profiler"; + /* stats.py: Cmdr stats; In files: stats.py:58; */ "Balance" = "Balance"; diff --git a/prefs.py b/prefs.py index 08d8c6a0..7e15bc3b 100644 --- a/prefs.py +++ b/prefs.py @@ -67,7 +67,7 @@ def help_open_system_profiler(parent) -> None: else: subprocess.run(['python', "EDMCSystemProfiler.py"], shell=True, check=True) except Exception as err: - parent.status["text"] = "Unable to Launch System Profiler" + parent.status["text"] = tr.tl("Error in System Profiler") # LANG: Catch & Record Profiler Errors logger.exception(err) From bc2adfa655a7531761a79a6c24d33e5be1b7b7cc Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 28 May 2024 11:28:18 -0400 Subject: [PATCH 290/425] [5.11.0-rc2] Update Changelog and Init --- ChangeLog.md | 14 +++++++++++++- config/__init__.py | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 8c810a53..5d480fb8 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,8 +6,20 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- -Release 5.11.0-rc1 +Pre-Release 5.11.0-rc2 === +This is a release candidate for 5.11.0. + +This release is identical to 5.11.0-rc1, with a few additions: + +**Changes and Enhancements** +* Adds Additional Error Processing to the System Profiler when launched from EDMC +* Adds the ability to resize the Settings window to larger than the initial default size +* Tweaked a few list length checks that could just be boolean to be bool + +Pre-Release 5.11.0-rc1 +=== +This is a release candidate for 5.11.0. This release includes a number of new features and improvements, including a new Beta Update Track for testing future updates, enhanced context menus for text entry fields and UI elements, a revamp to the existing translation system and logging capabilities, and more. This release includes the Python Image Library (PIL) into our core bundle, adds a number of stability and configuration checks to the tool, and adds new schemas and configuration values to senders. diff --git a/config/__init__.py b/config/__init__.py index 7a08d963..ab0bdd0a 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -54,7 +54,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.11.0-rc1' +_static_appversion = '5.11.0-rc2' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From 3dd3652c59a9dd41a6840420e9c50466348b16de Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 28 May 2024 21:14:12 -0400 Subject: [PATCH 291/425] [#1469] Add Translation Push Check --- .github/workflows/push-checks.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/push-checks.yml b/.github/workflows/push-checks.yml index a15a718c..c38e2f6c 100644 --- a/.github/workflows/push-checks.yml +++ b/.github/workflows/push-checks.yml @@ -69,3 +69,11 @@ jobs: - name: mypy type checks run: | ./scripts/mypy-all.sh --platform win32 + + - name: translation checks + run: | + output=$(python ./scripts/find_localised_strings.py --compare-lang L10n/en.template --directory . --ignore coriolis-data 2>&1) + if [ -n "$output" ]; then + echo $output + exit 1 + fi \ No newline at end of file From b6d4371d675b4b9e27f922b411d77a25fb3d8fcf Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Thu, 30 May 2024 18:22:35 -0400 Subject: [PATCH 292/425] [1469] Update Translation Scripting Also runs through the Black linter for parsability sake. --- .github/workflows/push-checks.yml | 6 +- scripts/find_localised_strings.py | 171 ++++++++++++++++++------------ 2 files changed, 106 insertions(+), 71 deletions(-) diff --git a/.github/workflows/push-checks.yml b/.github/workflows/push-checks.yml index c38e2f6c..e238ad8f 100644 --- a/.github/workflows/push-checks.yml +++ b/.github/workflows/push-checks.yml @@ -72,8 +72,4 @@ jobs: - name: translation checks run: | - output=$(python ./scripts/find_localised_strings.py --compare-lang L10n/en.template --directory . --ignore coriolis-data 2>&1) - if [ -n "$output" ]; then - echo $output - exit 1 - fi \ No newline at end of file + python ./scripts/find_localised_strings.py --compare-lang L10n/en.template --directory . --ignore coriolis-data diff --git a/scripts/find_localised_strings.py b/scripts/find_localised_strings.py index 5911d64c..8187f262 100644 --- a/scripts/find_localised_strings.py +++ b/scripts/find_localised_strings.py @@ -1,4 +1,5 @@ """Search all given paths recursively for localised string calls.""" + from __future__ import annotations import argparse @@ -17,20 +18,20 @@ def get_func_name(thing: ast.AST) -> str: if isinstance(thing, ast.Attribute): return get_func_name(thing.value) - return '' + return "" def get_arg(call: ast.Call) -> str: """Extract the argument string to the translate function.""" if len(call.args) > 1: - print('??? > 1 args', call.args, file=sys.stderr) + print("??? > 1 args", call.args, file=sys.stderr) arg = call.args[0] if isinstance(arg, ast.Constant): return arg.value if isinstance(arg, ast.Name): - return f'VARIABLE! CHECK CODE! {arg.id}' - return f'Unknown! {type(arg)=} {ast.dump(arg)} ||| {ast.unparse(arg)}' + return f"VARIABLE! CHECK CODE! {arg.id}" + return f"Unknown! {type(arg)=} {ast.dump(arg)} ||| {ast.unparse(arg)}" def find_calls_in_stmt(statement: ast.AST) -> list[ast.Call]: @@ -38,8 +39,14 @@ def find_calls_in_stmt(statement: ast.AST) -> list[ast.Call]: out = [] for n in ast.iter_child_nodes(statement): out.extend(find_calls_in_stmt(n)) - if isinstance(statement, ast.Call) and get_func_name(statement.func) in ('tr', 'translations'): - if ast.unparse(statement).find('.tl') != -1 or ast.unparse(statement).find('translate') != -1: + if isinstance(statement, ast.Call) and get_func_name(statement.func) in ( + "tr", + "translations", + ): + if ( + ast.unparse(statement).find(".tl") != -1 + or ast.unparse(statement).find("translate") != -1 + ): out.append(statement) return out @@ -53,11 +60,13 @@ COMMENT_OWN_LINE_RE is for a comment on its own line. The difference is necessary in order to tell if a 'above' LANG comment is for its own line (SAME_LINE), or meant to be for this following line (OWN_LINE). """ -COMMENT_SAME_LINE_RE = re.compile(r'^.*?(#.*)$') -COMMENT_OWN_LINE_RE = re.compile(r'^\s*?(#.*)$') +COMMENT_SAME_LINE_RE = re.compile(r"^.*?(#.*)$") +COMMENT_OWN_LINE_RE = re.compile(r"^\s*?(#.*)$") -def extract_comments(call: ast.Call, lines: list[str], file: pathlib.Path) -> str | None: # noqa: CCR001 +def extract_comments( # noqa: CCR001 + call: ast.Call, lines: list[str], file: pathlib.Path +) -> str | None: """ Extract comments from source code based on the given call. @@ -83,23 +92,23 @@ def extract_comments(call: ast.Call, lines: list[str], file: pathlib.Path) -> st 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}' + if not above_comment.startswith("# LANG:"): + bad_comment = f"Unknown comment for {file}:{call.lineno} {above_line}" above_comment = None else: - above_comment = above_comment.replace('# LANG:', '').strip() + above_comment = above_comment.replace("# LANG:", "").strip() if current_line is not None: match = COMMENT_SAME_LINE_RE.match(current_line) 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}' + 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() + current_comment = current_comment.replace("# LANG:", "").strip() if current_comment is not None: out = current_comment @@ -109,13 +118,13 @@ def extract_comments(call: ast.Call, lines: list[str], file: pathlib.Path) -> st print(bad_comment, file=sys.stderr) if out is None: - print(f'No comment for {file}:{call.lineno} {current_line}', file=sys.stderr) + print(f"No comment for {file}:{call.lineno} {current_line}", file=sys.stderr) return out def scan_file(path: pathlib.Path) -> list[ast.Call]: """Scan a file for ast.Calls.""" - data = path.read_text(encoding='utf-8') + data = path.read_text(encoding="utf-8") lines = data.splitlines() parsed = ast.parse(data) out: list[ast.Call] = [] @@ -125,13 +134,15 @@ def scan_file(path: pathlib.Path) -> list[ast.Call]: # see if we can extract any comments for call in out: - setattr(call, 'comment', extract_comments(call, lines, path)) + setattr(call, "comment", extract_comments(call, lines, path)) out.sort(key=lambda c: c.lineno) return out -def scan_directory(path: pathlib.Path, skip: list[pathlib.Path] | None = None) -> dict[pathlib.Path, list[ast.Call]]: +def scan_directory( + path: pathlib.Path, skip: list[pathlib.Path] | None = None +) -> dict[pathlib.Path, list[ast.Call]]: """ Scan a directory for expected callsites. @@ -145,7 +156,7 @@ def scan_directory(path: pathlib.Path, skip: list[pathlib.Path] | None = None) - if any(same_path.name == thing.name for same_path in skip): continue - if thing.is_file() and thing.suffix == '.py': + if thing.is_file() and thing.suffix == ".py": out[thing] = scan_file(thing) elif thing.is_dir(): out.update(scan_directory(thing, skip)) @@ -163,10 +174,10 @@ def parse_template(path) -> set[str]: """ lang_re = re.compile(r'\s*"([^"]+)"\s*=\s*"([^"]+)"\s*;\s*$') out = set() - with open(path, encoding='utf-8') as file: + with open(path, encoding="utf-8") as file: for line in file: match = lang_re.match(line.strip()) - if match and match.group(1) != '!Language': + if match and match.group(1) != "!Language": out.add(match.group(1)) return out @@ -183,14 +194,16 @@ class FileLocation: line_end_col: int | None @staticmethod - def from_call(path: pathlib.Path, c: ast.Call) -> 'FileLocation': + def from_call(path: pathlib.Path, c: ast.Call) -> "FileLocation": """ Create a FileLocation from a Call and Path. :param path: Path to the file this FileLocation is in :param c: Call object to extract line information from """ - return FileLocation(path, c.lineno, c.col_offset, c.end_lineno, c.end_col_offset) + return FileLocation( + path, c.lineno, c.col_offset, c.end_lineno, c.end_col_offset + ) @dataclasses.dataclass @@ -238,95 +251,121 @@ def generate_lang_template(data: dict[pathlib.Path, list[ast.Call]]) -> str: entries: list[LangEntry] = [] for path, calls in data.items(): for c in calls: - entries.append(LangEntry([FileLocation.from_call(path, c)], get_arg(c), [getattr(c, 'comment')])) + entries.append( + LangEntry( + [FileLocation.from_call(path, c)], + get_arg(c), + [getattr(c, "comment")], + ) + ) deduped = dedupe_lang_entries(entries) - out = '''/* Language name */ + out = """/* Language name */ "!Language" = "English"; -''' - print(f'Done Deduping entries {len(entries)=} {len(deduped)=}', file=sys.stderr) +""" + print(f"Done Deduping entries {len(entries)=} {len(deduped)=}", file=sys.stderr) for entry in deduped: assert len(entry.comments) == len(entry.locations) comment_set = set() for comment, loc in zip(entry.comments, entry.locations): if comment: - comment_set.add(f'{loc.path.name}: {comment};') + comment_set.add(f"{loc.path.name}: {comment};") - files = 'In files: ' + entry.files() - comment = ' '.join(comment_set).strip() + files = "In files: " + entry.files() + comment = " ".join(comment_set).strip() - header = f'{comment} {files}'.strip() + header = f"{comment} {files}".strip() string = f'"{entry.string}"' - out += f'/* {header} */\n' - out += f'{string} = {string};\n\n' + out += f"/* {header} */\n" + out += f"{string} = {string};\n\n" return out -if __name__ == '__main__': +def main(): # noqa: CCR001 + """Run the Translation Checker.""" parser = argparse.ArgumentParser() - parser.add_argument('--directory', help='Directory to search from', default='.') - parser.add_argument('--ignore', action='append', help='directories to ignore', default=['venv', '.venv', '.git']) + parser.add_argument("--directory", help="Directory to search from", default=".") + parser.add_argument( + "--ignore", + action="append", + help="Directories to ignore", + default=["venv", ".venv", ".git"], + ) group = parser.add_mutually_exclusive_group() - group.add_argument('--json', action='store_true', help='JSON output') - group.add_argument('--lang', help='en.template "strings" output to specified file, "-" for stdout') - group.add_argument('--compare-lang', help='en.template file to compare against') + group.add_argument("--json", action="store_true", help="JSON output") + group.add_argument( + "--lang", help='en.template "strings" output to specified file, "-" for stdout' + ) + group.add_argument("--compare-lang", help="en.template file to compare against") args = parser.parse_args() directory = pathlib.Path(args.directory) res = scan_directory(directory, [pathlib.Path(p) for p in args.ignore]) - if args.compare_lang is not None and len(args.compare_lang) > 0: + output = [] + + if args.compare_lang: seen = set() template = parse_template(args.compare_lang) - for file, calls in res.items(): for c in calls: arg = get_arg(c) if arg in template: seen.add(arg) else: - print(f'NEW! {file}:{c.lineno}: {arg!r}') + output.append(f"NEW! {file}:{c.lineno}: {arg!r}") for old in set(template) ^ seen: - print(f'No longer used: {old!r}') + output.append(f"No longer used: {old!r}") elif args.json: to_print_data = [ { - 'path': str(path), - 'string': get_arg(c), - 'reconstructed': ast.unparse(c), - 'start_line': c.lineno, - 'start_offset': c.col_offset, - 'end_line': c.end_lineno, - 'end_offset': c.end_col_offset, - 'comment': getattr(c, 'comment', None) - } for (path, calls) in res.items() for c in calls + "path": str(path), + "string": get_arg(c), + "reconstructed": ast.unparse(c), + "start_line": c.lineno, + "start_offset": c.col_offset, + "end_line": c.end_lineno, + "end_offset": c.end_col_offset, + "comment": getattr(c, "comment", None), + } + for path, calls in res.items() + for c in calls ] - - print(json.dumps(to_print_data, indent=2)) + output.append(json.dumps(to_print_data, indent=2)) elif args.lang: - if args.lang == '-': - print(generate_lang_template(res)) - + lang_template = generate_lang_template(res) + if args.lang == "-": + output.append(lang_template) else: - with open(args.lang, mode='w+', newline='\n') as langfile: - langfile.writelines(generate_lang_template(res)) + with open(args.lang, mode="w+", newline="\n", encoding="UTF-8") as langfile: + langfile.writelines(lang_template) else: for path, calls in res.items(): - if len(calls) == 0: + if not calls: continue - - print(path) + output.append(str(path)) for c in calls: - print( - f' {c.lineno:4d}({c.col_offset:3d}):{c.end_lineno:4d}({c.end_col_offset:3d})\t', ast.unparse(c) + output.append( + f" {c.lineno:4d}({c.col_offset:3d}):{c.end_lineno:4d}({c.end_col_offset:3d})\t{ast.unparse(c)}" ) + output.append("") - print() + # Print all collected output at the end + if output: + print("\n".join(output)) + sys.exit(1) + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + sys.exit() From d5939d0d578326d400bca6db94a707f4ab8b1a80 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Jun 2024 17:05:22 +0000 Subject: [PATCH 293/425] Bump autopep8 from 2.1.0 to 2.2.0 Bumps [autopep8](https://github.com/hhatto/autopep8) from 2.1.0 to 2.2.0. - [Release notes](https://github.com/hhatto/autopep8/releases) - [Commits](https://github.com/hhatto/autopep8/compare/v2.1.0...v2.2.0) --- updated-dependencies: - dependency-name: autopep8 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index be08bd6e..e0a240b2 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -25,7 +25,7 @@ types-requests==2.31.0.20240311 types-pkg-resources==0.1.3 # Code formatting tools -autopep8==2.1.0 +autopep8==2.2.0 # Git pre-commit checking pre-commit==3.6.2 From 595a22543363f1998fdce8d315ee9f903ea91227 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Jun 2024 17:05:29 +0000 Subject: [PATCH 294/425] Bump setuptools from 69.2.0 to 70.0.0 Bumps [setuptools](https://github.com/pypa/setuptools) from 69.2.0 to 70.0.0. - [Release notes](https://github.com/pypa/setuptools/releases) - [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst) - [Commits](https://github.com/pypa/setuptools/compare/v69.2.0...v70.0.0) --- updated-dependencies: - dependency-name: setuptools dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index be08bd6e..d5274c34 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -5,7 +5,7 @@ wheel # We can't rely on just picking this up from either the base (not venv), # or venv-init-time version. Specify here so that dependabot will prod us # about new versions. -setuptools==69.2.0 +setuptools==70.0.0 # Static analysis tools flake8==7.0.0 From 7b97cba62262b9d576f7977fcdd6bdf0258796c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Jun 2024 17:05:36 +0000 Subject: [PATCH 295/425] Bump mypy from 1.9.0 to 1.10.0 Bumps [mypy](https://github.com/python/mypy) from 1.9.0 to 1.10.0. - [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md) - [Commits](https://github.com/python/mypy/compare/1.9.0...v1.10.0) --- updated-dependencies: - dependency-name: mypy dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index be08bd6e..7e6c1f85 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -18,7 +18,7 @@ flake8-noqa==1.4.0 flake8-polyfill==1.0.2 flake8-use-fstring==1.4 -mypy==1.9.0 +mypy==1.10.0 pep8-naming==0.13.3 safety==3.2.0 types-requests==2.31.0.20240311 From 3e88f72a54d5ee95b857f5ed5a3784e5a2927f2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Jun 2024 17:05:40 +0000 Subject: [PATCH 296/425] Bump requests from 2.31.0 to 2.32.3 Bumps [requests](https://github.com/psf/requests) from 2.31.0 to 2.32.3. - [Release notes](https://github.com/psf/requests/releases) - [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md) - [Commits](https://github.com/psf/requests/compare/v2.31.0...v2.32.3) --- updated-dependencies: - dependency-name: requests dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a7f8aa7c..83fa9c0d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -requests==2.31.0 +requests==2.32.3 pillow==10.3.0 watchdog==4.0.0 infi.systray==0.1.12; sys_platform == 'win32' From 9eead0b9176ee6fb10f48195866ff23c797d5360 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 17:41:54 +0000 Subject: [PATCH 297/425] Bump pre-commit from 3.6.2 to 3.7.1 Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 3.6.2 to 3.7.1. - [Release notes](https://github.com/pre-commit/pre-commit/releases) - [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md) - [Commits](https://github.com/pre-commit/pre-commit/compare/v3.6.2...v3.7.1) --- updated-dependencies: - dependency-name: pre-commit dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 538a3579..7c8e1ef5 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -28,7 +28,7 @@ types-pkg-resources==0.1.3 autopep8==2.2.0 # Git pre-commit checking -pre-commit==3.6.2 +pre-commit==3.7.1 # HTML changelogs grip==4.6.2 From d4960efa8c3fd413d7ad5e973b205b4b0a9c6057 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 3 Jun 2024 16:35:51 -0400 Subject: [PATCH 298/425] [Lang] Update Translations Also corrects fleetcarrier to proper Fleet Carrier --- EDMarketConnector.py | 8 +- L10n/de.strings | 26 +++- L10n/en.template | 12 +- L10n/it.strings | 4 +- L10n/ja.strings | 4 +- L10n/nl.strings | 128 +++++++++++++++++++ L10n/pl.strings | 4 +- L10n/pt-BR.strings | 13 +- L10n/pt-PT.strings | 4 +- L10n/ru.strings | 26 +++- L10n/sr-Latn-BA.strings | 63 +++++++++- L10n/sr-Latn.strings | 4 +- L10n/tr.strings | 26 +++- L10n/uk.strings | 263 ++++++++++++++++++++++++++++++++++++++++ L10n/zh-Hans.strings | 4 +- companion.py | 6 +- plug.py | 4 +- prefs.py | 2 +- 18 files changed, 559 insertions(+), 42 deletions(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index 249b842f..f512ccf1 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -1067,7 +1067,7 @@ class AppWindow: """ Perform CAPI fleetcarrier data retrieval and associated actions. - This is triggered by certain FleetCarrier journal events + This is triggered by certain Fleet Carrier journal events :param event: Tk generated event details. """ @@ -1105,7 +1105,7 @@ class AppWindow: self.w.update_idletasks() query_time = int(time()) - logger.trace_if('capi.worker', 'Requesting fleetcarrier data') + logger.trace_if('capi.worker', 'Requesting Fleet Carrier data') config.set('fleetcarrierquerytime', query_time) logger.trace_if('capi.worker', 'Calling companion.session.fleetcarrier') companion.session.fleetcarrier( @@ -1144,11 +1144,11 @@ class AppWindow: # Validation if 'name' not in capi_response.capi_data: # LANG: No data was returned for the fleetcarrier from the Frontier CAPI - err = self.status['text'] = tr.tl('CAPI: No fleetcarrier data returned') + err = self.status['text'] = tr.tl('CAPI: No Fleet Carrier data returned') elif not capi_response.capi_data.get('name', {}).get('callsign'): # LANG: We didn't have the fleetcarrier callsign when we should have - err = self.status['text'] = tr.tl("CAPI: Fleetcarrier data incomplete") # Shouldn't happen + err = self.status['text'] = tr.tl("CAPI: Fleet Carrier data incomplete") # Shouldn't happen else: if __debug__: # Recording diff --git a/L10n/de.strings b/L10n/de.strings index 448607ac..8631da0d 100644 --- a/L10n/de.strings +++ b/L10n/de.strings @@ -126,6 +126,15 @@ /* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:962; ttkHyperlinkLabel.py:53; */ "Copy" = "Kopieren"; +/* myNotebook.py: Label for 'Cut' as in 'Cut and Paste'; */ +"Cut" = "Ausschneiden"; + +/* myNotebook.py: Label for 'Paste' as in 'Copy and Paste'; */ +"Paste" = "Einfügen"; + +/* myNotebook.py: Label for 'Select All'; */ +"Select All" = "Alles auswählen"; + /* EDMarketConnector.py: CAPI auth aborted because of killswitch; EDMarketConnector.py: CAPI auth query aborted because of killswitch; In files: EDMarketConnector.py:973; EDMarketConnector.py:1067; */ "CAPI auth disabled by killswitch" = "CAPI auth durch Killswitch deaktiviert"; @@ -168,12 +177,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "CAPI Fleet Carrier durch Killswitch deaktiviert"; + /* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ "CAPI: No fleetcarrier data returned" = "CAPI: Keine Fleet Carrier-Daten erhalten"; /* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ "CAPI: Fleetcarrier data incomplete" = "CAPI: Fleet Carrier-Daten unvollständig"; - /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Keine Kommandanten-Daten erhalten"; @@ -378,9 +387,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "CAPI-Einstellungen"; + /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "Fleet Carrier CAPI-Anfragen aktivieren"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Hotkey"; @@ -762,6 +771,19 @@ /* update.py: Update Available Text; In files: update.py:229; */ "{NEWVER} is available" = "{NEWVER} ist verfügbar"; +/* prefs.py: Stable Version of EDMC; */ +"Stable" = "Stabil"; + +/* prefs.py: Select the Update Track (Beta, Stable); */ +"Update Track" = "Update-Kanal"; + +/* EDMarketConnector.py: Inform the user the Update Track has changed; */ +"Update Track Changed to {TRACK}" = "Update-Kanal geändert auf {TRACK}"; + + +/* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ +"Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Update-Kanal von Beta auf Stabil geändert. Du wirst keine weiteren Beta-Updates erhalten. Du wirst bis zum nächsten stabilen Release auf der aktuellen Beta-Version bleiben.\n\nDu kannst manuell zur aktuellen stabilen Version zurückkehren. Um dies zu tun, musst du die aktuelle stabile Version manuell herunterladen und installieren. Beachte, dass dies Fehler verursachen oder gar nicht funktionieren könnte, wenn du von einem größeren Versionssprung mit signifikanten Änderungen downgradest.\n\nMöchtest du GitHub öffnen, um den neuesten Release herunterzuladen?"; + /* myNotebook.py: Can't Paste Images or Files in Text; */ "Cannot paste non-text content." = "Kann keinen non-Text-Inhalt einfügen."; diff --git a/L10n/en.template b/L10n/en.template index 3906b897..1c1e110f 100644 --- a/L10n/en.template +++ b/L10n/en.template @@ -177,11 +177,11 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "CAPI fleetcarrier disabled by killswitch"; -/* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No fleetcarrier data returned" = "CAPI: No fleetcarrier data returned"; +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: No Fleet Carrier data returned"; -/* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleetcarrier data incomplete" = "CAPI: Fleetcarrier data incomplete"; +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: Fleet Carrier data incomplete"; /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: No commander data returned"; @@ -388,7 +388,7 @@ "CAPI Settings" = "CAPI Settings"; /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleetcarrier CAPI Queries" = "Enable Fleetcarrier CAPI Queries"; +"Enable Fleet Carrier CAPI Queries" = "Enable Fleet Carrier CAPI Queries"; /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Hotkey"; @@ -812,4 +812,4 @@ "Cannot paste non-text content." = "Cannot paste non-text content."; /* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ -"Open in {URL}" = "Open in {URL}"; \ No newline at end of file +"Open in {URL}" = "Open in {URL}"; diff --git a/L10n/it.strings b/L10n/it.strings index 024a732f..003475f1 100644 --- a/L10n/it.strings +++ b/L10n/it.strings @@ -168,12 +168,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "Fleetcarrier CAPI disabilitato dal killswitch"; + /* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ "CAPI: No fleetcarrier data returned" = "CAPI: Nessun dato della fleetcarrier ricevuto"; /* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ "CAPI: Fleetcarrier data incomplete" = "CAPI: Dati della Fleetcarrier incompleti"; - /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Nessun dato sul commandante"; @@ -378,9 +378,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "Impostazioni CAPI"; + /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "Abilita le query CAPI della Fleetcarrier"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Hotkey"; diff --git a/L10n/ja.strings b/L10n/ja.strings index fcb336f1..3d0ef85e 100644 --- a/L10n/ja.strings +++ b/L10n/ja.strings @@ -159,12 +159,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "CAPIフリートキャリアはkillswitchによって無効にされています"; + /* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ "CAPI: No fleetcarrier data returned" = "CAPI: フリートキャリアデータの返信なし"; /* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ "CAPI: Fleetcarrier data incomplete" = "CAPI: フリートキャリアデータが不完全"; - /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: コマンダーのデータが返ってきませんでした"; @@ -369,9 +369,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "CAPI設定"; + /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "フリートキャリアCAPIクエリを有効にする"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "ホットキー"; diff --git a/L10n/nl.strings b/L10n/nl.strings index a3232089..3586645a 100644 --- a/L10n/nl.strings +++ b/L10n/nl.strings @@ -1,3 +1,14 @@ +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Fout in systeemprofiler"; + +/* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ +"Send flight log and CMDR status to EDSM" = "Stuur logboek en CMDR-status naar EDSM"; + +/* prefs.py:Label on button used to open a filesystem folder; In files: prefs.py:706; */ +"Open Log Folder" = "Open logboekmap"; + +/* inara.py:Text Inara Show API key; In files: inara.py:305; */ +"Show API Key" = "Toon API key"; /* Language name */ "!Language" = "Nederlands"; @@ -10,12 +21,33 @@ /* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:296; */ "Error: Wrong Cmdr" = "Fout: Verkeerde Cmdr"; +/* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:432; companion.py:517; */ +"Error" = "Fout"; + +/* companion.py: Frontier auth customer_id doesn't match game session FID; In files: companion.py:486; */ +"Error: customer_id doesn't match!" = "Fout: customer_id komt niet overeen!"; + +/* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:508; */ +"Error: unable to get token" = "Fout: kon token niet verkrijgen"; + +/* EDMarketConnector.py: EDMC Critical Error Notification; */ +"EDMC encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!" = "Er trad een kritieke fout op, en EDMC kan niet herstellen. Het programma sluit af uit zelfbescherming!"; + +/* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:844; */ +"Frontier CAPI down for maintenance" = "Frontier CAPI offline voor onderhoud"; + /* EDMarketConnector.py: Main UI Update button; EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:601; EDMarketConnector.py:919; EDMarketConnector.py:1748; */ "Update" = "Bijwerken"; /* EDMarketConnector.py: Appearance - Label for checkbox to select if application always on top; prefs.py: Appearance - Label for checkbox to select if application always on top; In files: EDMarketConnector.py:710; prefs.py:875; */ "Always on top" = "Altijd op voorgrond"; +/* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:837; */ +"Unknown" = "Onbekend"; + +/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:906; */ +"Error: Check E:D journal file location" = "Fout: Controleer locatie van E:D logboekbestand"; + /* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:913; edsm.py:332; stats.py:57; theme.py:290; */ "Cmdr" = "Cmdr"; @@ -46,6 +78,9 @@ /* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:930; EDMarketConnector.py:958; */ "Check for Updates..." = "Controleren op updates..."; +/* EDMarketConnector.py: Help > Open System Profiler; In files: EDMarketConnector.py:888; */ +"Open System Profiler" = "Open systeemprofiler"; + /* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:931; EDMarketConnector.py:948; */ "Save Raw Data..." = "Sla onbewerkte gegevens op..."; @@ -55,6 +90,12 @@ /* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:933; EDMarketConnector.py:953; */ "Documentation" = "Documentatie"; +/* EDMarketConnector.py: Help > Troubleshooting; In files: EDMarketConnector.py:934; EDMarketConnector.py:954; */ +"Troubleshooting" = "Probleemoplossing"; + +/* EDMarketConnector.py: Help > Report A Bug; In files: EDMarketConnector.py:935; EDMarketConnector.py:955; */ +"Report A Bug" = "Meld een bug"; + /* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:936; EDMarketConnector.py:956; */ "Privacy Policy" = "Privacybeleid"; @@ -70,6 +111,18 @@ /* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:962; ttkHyperlinkLabel.py:53; */ "Copy" = "Kopieëren"; +/* myNotebook.py: Label for 'Cut' as in 'Cut and Paste'; */ +"Cut" = "Knippen"; + +/* myNotebook.py: Label for 'Paste' as in 'Copy and Paste'; */ +"Paste" = "Plakken"; + +/* myNotebook.py: Label for 'Select All'; */ +"Select All" = "Selecteer alles"; + +/* EDMarketConnector.py: CAPI auth aborted because of killswitch; EDMarketConnector.py: CAPI auth query aborted because of killswitch; In files: EDMarketConnector.py:973; EDMarketConnector.py:1067; */ +"CAPI auth disabled by killswitch" = "CAPI authenticatie uitgeschakeld door killswitch"; + /* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:978; */ "Logging in..." = "Bezig met inloggen..."; @@ -85,9 +138,39 @@ /* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:1038; */ "Station doesn't have a market!" = "Station heeft geen markt!"; +/* EDMarketConnector.py: CAPI queries aborted because Cmdr name is unknown; EDMarketConnector.py: CAPI fleetcarrier query aborted because Cmdr name is unknown; In files: EDMarketConnector.py:1077; EDMarketConnector.py:1164; */ +"CAPI query aborted: Cmdr name unknown" = "CAPI query onderbroken: Cmdr naam onbekend"; + +/* EDMarketConnector.py: CAPI queries aborted because game mode unknown; In files: EDMarketConnector.py:1083; */ +"CAPI query aborted: Game mode unknown" = "CAPI query onderbroken: game mode onbekend"; + +/* EDMarketConnector.py: CAPI queries aborted because GameVersion unknown; EDMarketConnector.py: CAPI fleetcarrier query aborted because GameVersion unknown; In files: EDMarketConnector.py:1089; EDMarketConnector.py:1170; */ +"CAPI query aborted: GameVersion unknown" = "CAPI query onderbroken: GameVersion onbekend"; + +/* EDMarketConnector.py: CAPI queries aborted because current star system name unknown; In files: EDMarketConnector.py:1095; */ +"CAPI query aborted: Current system unknown" = "CAPI query onderbroken: huidig systeem onbekend"; + +/* EDMarketConnector.py: CAPI queries aborted because player is in multi-crew on other Cmdr's ship; In files: EDMarketConnector.py:1101; */ +"CAPI query aborted: In other-ship multi-crew" = "CAPI query onderbroken: in multi-crew ander schip"; + +/* EDMarketConnector.py: CAPI queries aborted because player is in CQC (Arena); In files: EDMarketConnector.py:1107; */ +"CAPI query aborted: CQC (Arena) detected" = "CAPI query onderbroken: in CQC (Arena)"; + /* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:1128; EDMarketConnector.py:1179; */ "Fetching data..." = "Data wordt opgehaald..."; +/* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ +"CAPI fleetcarrier disabled by killswitch" = "CAPI fleetcarrier uitgeschakeld door killswitch"; + + +/* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No fleetcarrier data returned" = "CAPI: geen fleet carrier data verkregen"; + +/* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleetcarrier data incomplete" = "CAPI: data fleet carrier incompleet"; +/* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ +"CAPI: No commander data returned" = "CAPI: geen commander data verkregen"; + /* EDMarketConnector.py: We didn't have the commander name when we should have; stats.py: Unknown commander; In files: EDMarketConnector.py:1246; stats.py:333; */ "Who are you?!" = "Wie ben je?!"; @@ -97,6 +180,12 @@ /* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1259; stats.py:349; */ "What are you flying?!" = "Waar vlieg je in?!"; +/* EDMarketConnector.py: Frontier CAPI server error when fetching data; In files: EDMarketConnector.py:1384; */ +"Frontier CAPI server error" = "Frontier CAPI serverfout"; + +/* EDMarketConnector.py: Frontier CAPI Access Token expired, trying to get a new one; In files: EDMarketConnector.py:1390; */ +"CAPI: Refreshing access token..." = "CAPI: toegangstoken vernieuwen..."; + /* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1434; */ "Last updated at %H:%M:%S" = "Voor het laatst bijgewerkt om %H:%M:%S"; @@ -115,6 +204,9 @@ /* EDMarketConnector.py: Generic 'OK' button label; prefs.py: 'OK' button on Settings/Preferences window; In files: EDMarketConnector.py:1864; prefs.py:292; */ "OK" = "OK"; +/* EDMarketConnector.py: The application is shutting down; In files: EDMarketConnector.py:1936; */ +"Shutting down..." = "Afsluiten..."; + /* EDMarketConnector.py: Popup-text about 'active' plugins without Python 3.x support; In files: EDMarketConnector.py:2253:2259; */ "One or more of your enabled plugins do not yet have support for Python 3.x. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. You should check if there is an updated version available, else alert the developer that they need to update the code for Python 3.x.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Een of meer ingeschakelde plugins hebben nog geen Python 3.x ondersteuning. Kijk op de lijst op de '{PLUGINS}' tab van '{FILE}' > '{SETTINGS}'. Check of er een bijgewerkte versie beschikbaar is. Laat anders de developer weten dat ze de code moeten updaten voor Python 3.x.\n\nJe kan de plugin uitschakelen door het mapje te hernoemen met '{DISABLED}' aan het eind van de naam."; @@ -124,9 +216,45 @@ /* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2274; */ "EDMC: Plugins Without Python 3.x Support" = "EDMS: Plugins zonder Python 3.x ondersteuning"; +/* EDMarketConnector.py: Popup-text about 'broken' plugins that failed to load; In files: EDMarketConnector.py:2266; */ +"One or more of your enabled plugins failed to load. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. This could be caused by a wrong folder structure. The load.py file should be located under plugins/PLUGIN_NAME/load.py.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Een of meer van je ingeschakelde plugins kon niet laden. Controleer de lijst op de '{PLUGINS}' tab van '{FILE}' > '{SETTINGS}'. Dit zou veroorzaakt kunnen worden door een verkeerde mappenstructuur. Het bestand load.py hoort op plugins/PLUGIN_NAAM/load.py\n\nJe kunt een plugin uitschakelen door '{DISABLED}' aan het einde van de naam van de plugin-map toe te voegen."; + +/* EDMarketConnector.py: Await Full CMDR Login to Game; In files: EDMarketConnector.py:813; */ +"Awaiting Full CMDR Login" = "Wachten op volledige CMDR login"; + +/* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:208; */ +"Journal directory already locked" = "Logboekmap al vergrendeld"; + +/* journal_lock.py: Text for when newly selected Journal directory is already locked; In files: journal_lock.py:225:226; */ +"The new Journal Directory location is already locked.{CR}You can either attempt to resolve this and then Retry, or choose to Ignore this." = "De nieuwe logboekmaplocatie is al vergrendeld. {CR} Je kan dit probleem verhelpen en het dan opnieuw proberen, of dit probleem negeren."; + +/* journal_lock.py: Generic 'Retry' button label; In files: journal_lock.py:230; */ +"Retry" = "Probeer opnieuw"; + +/* journal_lock.py: Generic 'Ignore' button label; In files: journal_lock.py:234; */ +"Ignore" = "Negeer"; + /* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:193; prefs.py:455; prefs.py:709; prefs.py:742; */ "Default" = "Standaard"; +/* coriolis.py: 'Auto' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - auto; In files: coriolis.py:48; coriolis.py:74; coriolis.py:77; coriolis.py:94; coriolis.py:123; coriolis.py:139; coriolis.py:145; coriolis.py:179; coriolis.py:182; */ +"Auto" = "Auto"; + +/* coriolis.py: 'Normal' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - normal; In files: coriolis.py:49; coriolis.py:75; coriolis.py:95; coriolis.py:121; coriolis.py:137; coriolis.py:180; */ +"Normal" = "Normaal"; + +/* coriolis.py: 'Beta' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - beta; In files: coriolis.py:50; coriolis.py:76; coriolis.py:96; coriolis.py:122; coriolis.py:138; coriolis.py:181; */ +"Beta" = "Beta"; + +/* coriolis.py: Settings>Coriolis: Label for 'NOT alpha/beta game version' URL; In files: coriolis.py:97; */ +"Normal URL" = "Normale URL"; + +/* coriolis.py: Generic 'Reset' button label; In files: coriolis.py:100; coriolis.py:109; */ +"Reset" = "Reset"; + +/* coriolis.py: Settings>Coriolis: Label for 'alpha/beta game version' URL; In files: coriolis.py:106; */ +"Beta URL" = "Beta-URL"; + /* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:458; eddn.py:2413; eddn.py:2451; eddn.py:2519; */ "Error: Can't connect to EDDN" = "Fout: Kan geen verbinding maken met EDDN"; diff --git a/L10n/pl.strings b/L10n/pl.strings index 3ab5992a..4b88c8b4 100644 --- a/L10n/pl.strings +++ b/L10n/pl.strings @@ -159,12 +159,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "Fleetcarier CAPI wyłączony \"kill switchem\""; + /* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ "CAPI: No fleetcarrier data returned" = "CAPI: Nie zwrócono danych dotyczących lotniskowca"; /* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ "CAPI: Fleetcarrier data incomplete" = "CAPI: Niekompletne dane lotniskowca"; - /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Nie zwrócono danych dowódcy"; @@ -369,9 +369,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "Ustawienia CAPI"; + /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "Włącz zapytania CAPI dla lotniskowca"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Skr. Klaw."; diff --git a/L10n/pt-BR.strings b/L10n/pt-BR.strings index 48922eb4..9bbb2c6c 100644 --- a/L10n/pt-BR.strings +++ b/L10n/pt-BR.strings @@ -126,6 +126,15 @@ /* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:962; ttkHyperlinkLabel.py:53; */ "Copy" = "Copiar"; +/* myNotebook.py: Label for 'Cut' as in 'Cut and Paste'; */ +"Cut" = "Recortar"; + +/* myNotebook.py: Label for 'Paste' as in 'Copy and Paste'; */ +"Paste" = "Colar"; + +/* myNotebook.py: Label for 'Select All'; */ +"Select All" = "Selecionar tudo"; + /* EDMarketConnector.py: CAPI auth aborted because of killswitch; EDMarketConnector.py: CAPI auth query aborted because of killswitch; In files: EDMarketConnector.py:973; EDMarketConnector.py:1067; */ "CAPI auth disabled by killswitch" = "Autenticação CAPI desativada pelo botão de interrupção."; @@ -168,12 +177,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "CAPI para porta-frotas desativado pelo botão de interrupção."; + /* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ "CAPI: No fleetcarrier data returned" = "CAPI: Nenhum dado de porta-fortas retornado"; /* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ "CAPI: Fleetcarrier data incomplete" = "CAPI: Dados de porta-frota incompletos"; - /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Nenhum dado de comandante retornado"; @@ -378,9 +387,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "Configurações de CAPI"; + /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "Ativar requisições CAPI para porta-frotas"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Tecla de atalho"; diff --git a/L10n/pt-PT.strings b/L10n/pt-PT.strings index 68d4912d..2d240917 100644 --- a/L10n/pt-PT.strings +++ b/L10n/pt-PT.strings @@ -168,12 +168,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "Consulta à CAPI de Transportador de Frota cancelada por botão"; + /* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ "CAPI: No fleetcarrier data returned" = "CAPI: Sem dados de Transportador de Frota"; /* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ "CAPI: Fleetcarrier data incomplete" = "CAPI: Dados de Transportador de Frota incompletos"; - /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Dados do Comandante não recebidos"; @@ -378,9 +378,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "Definições CAPI"; + /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "Ligar Consultas CAPI de Transportador de Frota"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Tecla Rápida"; diff --git a/L10n/ru.strings b/L10n/ru.strings index 54f77d62..f16ca3a6 100644 --- a/L10n/ru.strings +++ b/L10n/ru.strings @@ -126,6 +126,15 @@ /* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:962; ttkHyperlinkLabel.py:53; */ "Copy" = "Копировать"; +/* myNotebook.py: Label for 'Cut' as in 'Cut and Paste'; */ +"Cut" = "Вырезать"; + +/* myNotebook.py: Label for 'Paste' as in 'Copy and Paste'; */ +"Paste" = "Вставить"; + +/* myNotebook.py: Label for 'Select All'; */ +"Select All" = "Выбрать все"; + /* EDMarketConnector.py: CAPI auth aborted because of killswitch; EDMarketConnector.py: CAPI auth query aborted because of killswitch; In files: EDMarketConnector.py:973; EDMarketConnector.py:1067; */ "CAPI auth disabled by killswitch" = "CAPI аутентификация отключена с помощью killswitch"; @@ -168,12 +177,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "CAPI кораблей-носителей отключен с помощью killswitch"; + /* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ "CAPI: No fleetcarrier data returned" = "CAPI: Нет данных о флотоносце"; /* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ "CAPI: Fleetcarrier data incomplete" = "CAPI: Неполная информация о флотоносце"; - /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Нет данных пилота"; @@ -378,9 +387,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "Настройки CAPI"; + /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "Включить запросы к CAPI о флотоносце"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Горячая клавиша"; @@ -783,6 +792,19 @@ /* update.py: Update Available Text; In files: update.py:229; */ "{NEWVER} is available" = "{NEWVER} доступен"; +/* prefs.py: Stable Version of EDMC; */ +"Stable" = "Стабильная"; + +/* prefs.py: Select the Update Track (Beta, Stable); */ +"Update Track" = "Обновить маршрут"; + +/* EDMarketConnector.py: Inform the user the Update Track has changed; */ +"Update Track Changed to {TRACK}" = "Обновить маршрут. Изменено на {TRACK}"; + + +/* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ +"Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Изменен путь обновления с \"Бета\" на \"Стабильный\". Вы больше не будете получать обновления \"Бета\". Вы останетесь на текущей бета-версии до следующего стабильного релиза.\n\nВы можете вручную вернуться к последней версии \"Стабильная\". Для этого необходимо загрузить и установить последнюю версию \"Стабильная\" вручную. Обратите внимание, что при переходе между основными версиями со значительными изменениями могут возникнуть ошибки или полная поломка.\n\nХотите открыть GitHub, чтобы загрузить последнюю версию?"; + /* myNotebook.py: Can't Paste Images or Files in Text; */ "Cannot paste non-text content." = "Невозможно добавить нетекстовое содержимое."; diff --git a/L10n/sr-Latn-BA.strings b/L10n/sr-Latn-BA.strings index 2d79e7e9..00b6e053 100644 --- a/L10n/sr-Latn-BA.strings +++ b/L10n/sr-Latn-BA.strings @@ -1,5 +1,5 @@ /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ -"Send flight log and CMDR status to EDSM" = "Pošalji log leta i Cmdr status na EDSM"; +"Send flight log and CMDR status to EDSM" = "Pošalji log leta i CMDR status na EDSM"; /* prefs.py:Label on button used to open a filesystem folder; In files: prefs.py:706; */ "Open Log Folder" = "Otvori folder sa logovima"; @@ -22,7 +22,7 @@ "Error: Invalid Credentials" = "Greška: Neispravni kredencijali"; /* companion.py: Frontier CAPI authorisation not for currently game-active commander; In files: companion.py:296; */ -"Error: Wrong Cmdr" = "Greška: Pogrešan Cmdr"; +"Error: Wrong Cmdr" = "Greška: Pogrešan CMDR"; /* companion.py: Generic error prefix - following text is from Frontier auth service; In files: companion.py:432; companion.py:517; */ "Error" = "Greška"; @@ -36,6 +36,12 @@ /* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:508; */ "Error: unable to get token" = "Greška: Nemoguće dobaviti token"; +/* EDMarketConnector.py: EDMC Critical Error Notification; */ +"EDMC encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!" = "EDMC je naišao na kritičnu grešku i ne može da se oporavi. EDMC će biti ugašen zbog vlastite zaštite."; + +/* EDMarketConnector.py: EDMC Critical Error Details; */ +"Here's what EDMC Detected:\r\n\r\n{ERR}\r\n\r\nDo you want to file a Bug Report on GitHub?" = "EDMC je detektovao sljedeće:\n\n{ERR}\n\nDa li želite da izvršite Bug Report na GitHub-u?"; + /* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:844; */ "Frontier CAPI down for maintenance" = "Frontier CAPI nedostupan zbog održavanja"; @@ -55,7 +61,7 @@ "Error: Check E:D journal file location" = "Greška: Provjerite lokaciju E:D journal fajla"; /* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:913; edsm.py:332; stats.py:57; theme.py:290; */ -"Cmdr" = "Cmdr"; +"Cmdr" = "CMDR"; /* EDMarketConnector.py: 'Ship' or multi-crew role label in main window, as applicable; EDMarketConnector.py: Multicrew role label in main window; In files: EDMarketConnector.py:915; EDMarketConnector.py:1487; */ "Role" = "Uloga"; @@ -87,6 +93,9 @@ /* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:930; EDMarketConnector.py:958; */ "Check for Updates..." = "Provjeri nadogradnje..."; +/* EDMarketConnector.py: Help > Open System Profiler; In files: EDMarketConnector.py:888; */ +"Open System Profiler" = "Otvori System Profiler"; + /* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:931; EDMarketConnector.py:948; */ "Save Raw Data..." = "Snimi sirove podatke..."; @@ -117,6 +126,15 @@ /* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:962; ttkHyperlinkLabel.py:53; */ "Copy" = "Kopiraj"; +/* myNotebook.py: Label for 'Cut' as in 'Cut and Paste'; */ +"Cut" = "Izreži"; + +/* myNotebook.py: Label for 'Paste' as in 'Copy and Paste'; */ +"Paste" = "Nalijepi"; + +/* myNotebook.py: Label for 'Select All'; */ +"Select All" = "Selektuj sve"; + /* EDMarketConnector.py: CAPI auth aborted because of killswitch; EDMarketConnector.py: CAPI auth query aborted because of killswitch; In files: EDMarketConnector.py:973; EDMarketConnector.py:1067; */ "CAPI auth disabled by killswitch" = "CAPI autentifikacija onemogućena putem sistemskog prekidača"; @@ -159,12 +177,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "CAPI fleetcarrier onemogućen putem sistemskog prekidača"; + /* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ "CAPI: No fleetcarrier data returned" = "CAPI: Fleetcarrier podaci nisu dobijeni"; /* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ "CAPI: Fleetcarrier data incomplete" = "CAPI: Fleetcarrier podaci nisu potpuni"; - /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Nema podataka o komandantu"; @@ -219,6 +237,18 @@ /* EDMarketConnector.py: Popup-text about 'broken' plugins that failed to load; In files: EDMarketConnector.py:2266; */ "One or more of your enabled plugins failed to load. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. This could be caused by a wrong folder structure. The load.py file should be located under plugins/PLUGIN_NAME/load.py.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Jedan ili više aktiviranih dodataka (plugins) nemaju podršku za Python 3.x. Pogledajte listu u '{PLUGINS}' tabu u '{FILE}' > '{SETTINGS}'. Pogrešna struktura foldera može da uzrokuje problem. Fajl load.py treba da bude smješten u plugins/PLUGIN_NAME/load.py.\n\nMožete deaktivirati dodatak (plugin) dodavanjem '{DISABLED}' na kraju imena njegovog foldera."; +/* EDMarketConnector.py: Popup-text about Reset Providers; In files: EDMarketConnector.py:2146; */ +"One or more of your URL Providers were invalid, and have been reset:\r\n\r\n" = "Jedan ili više URL Providera su pogrešni i zbog toga su resetovani:\n"; + +/* EDMarketConnector.py: Text About What Provider Was Reset; In files: EDMarketConnector.py:2148; */ +"{PROVIDER} was set to {OLDPROV}, and has been reset to {NEWPROV}\r\n" = "{PROVIDER} je bio postavljen na {OLDPROV}, a sad je resetovan na {NEWPROV}\n"; + +/* EDMarketConnector.py: Popup window title for Reset Providers; In files: EDMarketConnector.py:2161; */ +"EDMC: Default Providers Reset" = "EDMC: Standardni Provideri su resetovani"; + +/* EDMarketConnector.py: Await Full CMDR Login to Game; In files: EDMarketConnector.py:813; */ +"Awaiting Full CMDR Login" = "Čekam da se CMDR potpuno uloguje"; + /* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:208; */ "Journal directory already locked" = "Journal direktorijum je već zaključan"; @@ -313,7 +343,7 @@ "Error: Can't connect to EDSM" = "Greška: Nemoguće povezivanje sa EDSM"; /* inara.py: Checkbox to enable INARA API Usage; In files: inara.py:257; */ -"Send flight log and Cmdr status to Inara" = "Pošalji log leta i Cmdr status na Inara"; +"Send flight log and Cmdr status to Inara" = "Pošalji log leta i CMDR status na Inara"; /* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:269; */ "Inara credentials" = "Kredencijali za Inara"; @@ -357,9 +387,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "CAPI Podešavanja"; + /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "Omogući Fleetcarrier CAPI Upite"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Prečica"; @@ -759,3 +789,24 @@ /* stats.py: Status dialog title; In files: stats.py:418; */ "Ships" = "Brodovi"; +/* update.py: Update Available Text; In files: update.py:229; */ +"{NEWVER} is available" = "{NEWVER} je dostupna"; + +/* prefs.py: Stable Version of EDMC; */ +"Stable" = "Stabilna"; + +/* prefs.py: Select the Update Track (Beta, Stable); */ +"Update Track" = "Kanal osvježavanja"; + +/* EDMarketConnector.py: Inform the user the Update Track has changed; */ +"Update Track Changed to {TRACK}" = "Kanal za osvježavanje je promijenjen u {TRACK}"; + + +/* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ +"Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Kanal za osvježavanje je promijenjen iz Beta u Stabilni. Više nećete primati Beta osvježavanja. Ostaćete na trenutnoj Beta verziji do sljedeće Stabilne verzije.\n\nMožete se ručno vratiti na posljednju Stabilnu verziju. Da biste to učinili morate da skinete i ručno instališete posljednju Stabilnu verziju. Ova procedura može da uvede nove bugove ili da potpuno onesposobi program ako prelazite između verzija sa mnogo značajnih promjena.\n\nDa li želite da otvorite GitHub stranicu za download posljednje verzije?"; + +/* myNotebook.py: Can't Paste Images or Files in Text; */ +"Cannot paste non-text content." = "Nije moguće da se zalijepi netekstualni sadržaj."; + +/* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ +"Open in {URL}" = "Otvori u {URL}"; diff --git a/L10n/sr-Latn.strings b/L10n/sr-Latn.strings index 291a036b..7aee7f41 100644 --- a/L10n/sr-Latn.strings +++ b/L10n/sr-Latn.strings @@ -168,12 +168,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "CAPI fleetcarrier deaktiviran preko sistemskog prekidača"; + /* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ "CAPI: No fleetcarrier data returned" = "CAPI: Podaci o fleetcarrier-u nisu dobijeni"; /* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ "CAPI: Fleetcarrier data incomplete" = "CAPI: Podaci o fleetcarrier-u su nepotpuni"; - /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Nema podataka o komandiru"; @@ -378,9 +378,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "CAPI Podešavanja"; + /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "Aktiviraj Fleetcarrier CAPIU Upite"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Skraćenica"; diff --git a/L10n/tr.strings b/L10n/tr.strings index a7fbabe1..e35c00a2 100644 --- a/L10n/tr.strings +++ b/L10n/tr.strings @@ -126,6 +126,15 @@ /* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:962; ttkHyperlinkLabel.py:53; */ "Copy" = "Kopyala"; +/* myNotebook.py: Label for 'Cut' as in 'Cut and Paste'; */ +"Cut" = "Kes"; + +/* myNotebook.py: Label for 'Paste' as in 'Copy and Paste'; */ +"Paste" = "Yapıştır"; + +/* myNotebook.py: Label for 'Select All'; */ +"Select All" = "Tümünü Seç"; + /* EDMarketConnector.py: CAPI auth aborted because of killswitch; EDMarketConnector.py: CAPI auth query aborted because of killswitch; In files: EDMarketConnector.py:973; EDMarketConnector.py:1067; */ "CAPI auth disabled by killswitch" = "CAPI kimlik doğrulaması killswitch tarafından devre dışı bırakıldı"; @@ -168,12 +177,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "CAPI filo taşıyıcısı killswitch tarafından devre dışı bırakıldı"; + /* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ "CAPI: No fleetcarrier data returned" = "CAPI: Filo taşıyıcı verisi gelmedi."; /* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ "CAPI: Fleetcarrier data incomplete" = "CAPI: Filo taşıyıcı verileri eksik"; - /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Cmdr verisi döndürülmedi"; @@ -378,9 +387,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "CAPI ayarları"; + /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "Filo Taşıyıcı CAPI sorgulamalarını etkinleştir"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Kısayoltuşu"; @@ -783,6 +792,19 @@ /* update.py: Update Available Text; In files: update.py:229; */ "{NEWVER} is available" = "{NEWVER} sürüm mevcut"; +/* prefs.py: Stable Version of EDMC; */ +"Stable" = "Stabil"; + +/* prefs.py: Select the Update Track (Beta, Stable); */ +"Update Track" = "Takibi Güncelle"; + +/* EDMarketConnector.py: Inform the user the Update Track has changed; */ +"Update Track Changed to {TRACK}" = "Aktif Takip {TRACK} olarak güncellendi."; + + +/* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ +"Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Güncelleme takibi Beta'dan Kararlı olarak değiştirildi. Artık Beta güncellemelerini almayacaksınız. Bir sonraki Kararlı sürüme kadar mevcut Beta sürümünüzde kalacaksınız.\n\nEn son Stabil sürüme manuel olarak geri dönebilirsiniz. Bunu yapmak için en son Stabil sürümünü manuel olarak indirip yüklemeniz gerekir. Önemli değişiklikler içeren ana sürümler arasında sürüm düşürme durumunda bunun hatalara yol açabileceğini veya tamamen bozulabileceğini unutmayın.\n\nEn son sürümü indirmek için GitHub'u açmak istiyor musunuz?"; + /* myNotebook.py: Can't Paste Images or Files in Text; */ "Cannot paste non-text content." = "Metin dışı içerik yapıştırılamadı"; diff --git a/L10n/uk.strings b/L10n/uk.strings index 125200f1..b4760202 100644 --- a/L10n/uk.strings +++ b/L10n/uk.strings @@ -1,9 +1,23 @@ +/* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ +"Send flight log and CMDR status to EDSM" = "Відправляти дані бортового журналу до EDSM"; + +/* prefs.py:Label on button used to open a filesystem folder; In files: prefs.py:706; */ +"Open Log Folder" = "Відкрити папку журналу"; + +/* inara.py:Text Inara Show API key; In files: inara.py:305; */ +"Show API Key" = "Показати ключ API"; /* Language name */ "!Language" = "Українська"; +/* companion.py: Frontier CAPI didn't respond; In files: companion.py:226; */ +"Error: Frontier CAPI didn't respond" = "Помилка: Frontier CAPI не відповідає"; + /* companion.py: Frontier CAPI data doesn't agree with latest Journal game location; In files: companion.py:245; */ "Error: Frontier server is lagging" = "Помилка: З`єднання з сервером гри з затримками!"; +/* companion.py: Commander is docked at an EDO settlement, got out and back in, we forgot the station; In files: companion.py:261; */ +"Docked but unknown station: EDO Settlement?" = "Пристикований, проте станція невідома: поселення EDO?"; + /* companion.py: Generic "something went wrong with Frontier Auth" error; In files: companion.py:271; */ "Error: Invalid Credentials" = "Помилка: Невірні облікові дані!"; @@ -22,6 +36,18 @@ /* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:508; */ "Error: unable to get token" = "Помилка: не вдалося отримати токен"; +/* EDMarketConnector.py: EDMC Critical Error Notification; */ +"EDMC encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!" = "EDMC виявив критичну помилку, і не може відновити функціонування. EDMC вимкнеться заради самозахисту!"; + +/* EDMarketConnector.py: EDMC Critical Error Details; */ +"Here's what EDMC Detected:\r\n\r\n{ERR}\r\n\r\nDo you want to file a Bug Report on GitHub?" = "Ось що EDMC зміг з'ясувати:\n\n{ERR}\n\nХочете створити баг репорт на GitHub?"; + +/* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:844; */ +"Frontier CAPI down for maintenance" = "Frontier CAPI відключений через технічне обслуговування"; + +/* companion.py: Frontier CAPI data retrieval failed; In files: companion.py:856; */ +"Frontier CAPI query failure" = "Помилка запиту Frontier CAPI"; + /* EDMarketConnector.py: Main UI Update button; EDMarketConnector.py: Update button in main window; In files: EDMarketConnector.py:601; EDMarketConnector.py:919; EDMarketConnector.py:1748; */ "Update" = "Оновлення"; @@ -31,6 +57,9 @@ /* EDMarketConnector.py: Unknown suit; In files: EDMarketConnector.py:837; */ "Unknown" = "Невідомо"; +/* EDMarketConnector.py: ED Journal file location appears to be in error; In files: EDMarketConnector.py:906; */ +"Error: Check E:D journal file location" = "Помилка: перевірте розташування файлу журналу E:D"; + /* EDMarketConnector.py: Label for commander name in main window; edsm.py: Game Commander name label in EDSM settings; stats.py: Cmdr stats; theme.py: Label for commander name in main window; In files: EDMarketConnector.py:913; edsm.py:332; stats.py:57; theme.py:290; */ "Cmdr" = "Км-др"; @@ -64,6 +93,9 @@ /* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:930; EDMarketConnector.py:958; */ "Check for Updates..." = "Перевірка оновлень..."; +/* EDMarketConnector.py: Help > Open System Profiler; In files: EDMarketConnector.py:888; */ +"Open System Profiler" = "Відкрити Профайлер Систем"; + /* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:931; EDMarketConnector.py:948; */ "Save Raw Data..." = "Зберегти необроблені дані..."; @@ -73,6 +105,12 @@ /* EDMarketConnector.py: Help > Documentation; In files: EDMarketConnector.py:933; EDMarketConnector.py:953; */ "Documentation" = "Документація"; +/* EDMarketConnector.py: Help > Troubleshooting; In files: EDMarketConnector.py:934; EDMarketConnector.py:954; */ +"Troubleshooting" = "Усунення несправностей"; + +/* EDMarketConnector.py: Help > Report A Bug; In files: EDMarketConnector.py:935; EDMarketConnector.py:955; */ +"Report A Bug" = "Повідомити про помилку"; + /* EDMarketConnector.py: Help > Privacy Policy; In files: EDMarketConnector.py:936; EDMarketConnector.py:956; */ "Privacy Policy" = "Політика конфіденційності"; @@ -88,6 +126,18 @@ /* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:962; ttkHyperlinkLabel.py:53; */ "Copy" = "Копіювати"; +/* myNotebook.py: Label for 'Cut' as in 'Cut and Paste'; */ +"Cut" = "Вирізати"; + +/* myNotebook.py: Label for 'Paste' as in 'Copy and Paste'; */ +"Paste" = "Вставити"; + +/* myNotebook.py: Label for 'Select All'; */ +"Select All" = "Вибрати все"; + +/* EDMarketConnector.py: CAPI auth aborted because of killswitch; EDMarketConnector.py: CAPI auth query aborted because of killswitch; In files: EDMarketConnector.py:973; EDMarketConnector.py:1067; */ +"CAPI auth disabled by killswitch" = "Автентифікація CAPI виключена функцією аварійного відключення"; + /* EDMarketConnector.py: Status - Attempting to get a Frontier Auth Access Token; In files: EDMarketConnector.py:978; */ "Logging in..." = "Вхід в..."; @@ -103,9 +153,36 @@ /* EDMarketConnector.py: Status - No station market data from Frontier CAPI; In files: EDMarketConnector.py:1038; */ "Station doesn't have a market!" = "На станції немає ринку!"; +/* EDMarketConnector.py: CAPI queries aborted because Cmdr name is unknown; EDMarketConnector.py: CAPI fleetcarrier query aborted because Cmdr name is unknown; In files: EDMarketConnector.py:1077; EDMarketConnector.py:1164; */ +"CAPI query aborted: Cmdr name unknown" = "Запит CAPI скасований: Невідоме ім'я КМДР"; + +/* EDMarketConnector.py: CAPI queries aborted because game mode unknown; In files: EDMarketConnector.py:1083; */ +"CAPI query aborted: Game mode unknown" = "Запит CAPI скасований: Невідомий режим гри"; + +/* EDMarketConnector.py: CAPI queries aborted because GameVersion unknown; EDMarketConnector.py: CAPI fleetcarrier query aborted because GameVersion unknown; In files: EDMarketConnector.py:1089; EDMarketConnector.py:1170; */ +"CAPI query aborted: GameVersion unknown" = "Запит CAPI скасований: Невідома версія гри"; + +/* EDMarketConnector.py: CAPI queries aborted because current star system name unknown; In files: EDMarketConnector.py:1095; */ +"CAPI query aborted: Current system unknown" = "Запит CAPI скасований: Невідома поточна система"; + +/* EDMarketConnector.py: CAPI queries aborted because player is in multi-crew on other Cmdr's ship; In files: EDMarketConnector.py:1101; */ +"CAPI query aborted: In other-ship multi-crew" = "Запит CAPI скасований: в режимі мультиекіпажу іншого корабля"; + +/* EDMarketConnector.py: CAPI queries aborted because player is in CQC (Arena); In files: EDMarketConnector.py:1107; */ +"CAPI query aborted: CQC (Arena) detected" = "Запит CAPI скасований: Арена Близького бою (CQC) виявлена"; + /* EDMarketConnector.py: Status - Attempting to retrieve data from Frontier CAPI; In files: EDMarketConnector.py:1128; EDMarketConnector.py:1179; */ "Fetching data..." = "Отримання даних..."; +/* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ +"CAPI fleetcarrier disabled by killswitch" = "Запит CAPI корабля-носія скасований функцією аварійного відключення"; + + +/* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No fleetcarrier data returned" = "CAPI: Немає даних корабля-носія"; + +/* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleetcarrier data incomplete" = "CAPI: Дані корабля-носія неповні"; /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Не отримано данних пілота"; @@ -118,6 +195,12 @@ /* EDMarketConnector.py: We don't know what ship the commander is in, when we should; stats.py: Unknown ship; In files: EDMarketConnector.py:1259; stats.py:349; */ "What are you flying?!" = "На чому летимо?!"; +/* EDMarketConnector.py: Frontier CAPI server error when fetching data; In files: EDMarketConnector.py:1384; */ +"Frontier CAPI server error" = "Frontier CAPI: cерверна помилка"; + +/* EDMarketConnector.py: Frontier CAPI Access Token expired, trying to get a new one; In files: EDMarketConnector.py:1390; */ +"CAPI: Refreshing access token..." = "CAPI: Оновлюємо токен доступу..."; + /* EDMarketConnector.py: Time when we last obtained Frontier CAPI data; In files: EDMarketConnector.py:1434; */ "Last updated at %H:%M:%S" = "Останнє оновлення було %H:%M:%S"; @@ -148,6 +231,24 @@ /* EDMarketConnector.py: Popup window title for list of 'enabled' plugins that don't work with Python 3.x; In files: EDMarketConnector.py:2274; */ "EDMC: Plugins Without Python 3.x Support" = "EDMC: Плагіни без підтримки Python 3.x!"; +/* EDMarketConnector.py: Popup window title for list of 'broken' plugins that failed to load; In files: EDMarketConnector.py:2285; */ +"EDMC: Broken Plugins" = "EDMC: Поломані плагіни"; + +/* EDMarketConnector.py: Popup-text about 'broken' plugins that failed to load; In files: EDMarketConnector.py:2266; */ +"One or more of your enabled plugins failed to load. Please see the list on the '{PLUGINS}' tab of '{FILE}' > '{SETTINGS}'. This could be caused by a wrong folder structure. The load.py file should be located under plugins/PLUGIN_NAME/load.py.\r\n\r\nYou can disable a plugin by renaming its folder to have '{DISABLED}' on the end of the name." = "Не вдалося завантажити один або декілька увімкнених плагінів. Перегляньте список на вкладці '{PLUGINS}' в '{FILE}' > '{SETTINGS}'. Ця помилка могла бути спричинена неправильною структурою папок. Файл load.py повинен знаходитися у папці plugins/PLUGIN_NAME/load.py\n\nВи можете відключити плагін, перейменувавши його папку додавши '{DISABLED}' в кінці назви."; + +/* EDMarketConnector.py: Popup-text about Reset Providers; In files: EDMarketConnector.py:2146; */ +"One or more of your URL Providers were invalid, and have been reset:\r\n\r\n" = "Один або декілька ваших провайдерів URL були хибні та скинуті:\n"; + +/* EDMarketConnector.py: Text About What Provider Was Reset; In files: EDMarketConnector.py:2148; */ +"{PROVIDER} was set to {OLDPROV}, and has been reset to {NEWPROV}\r\n" = "{PROVIDER} мав значення {OLDPROV}, та був скинутий до {NEWPROV}\n"; + +/* EDMarketConnector.py: Popup window title for Reset Providers; In files: EDMarketConnector.py:2161; */ +"EDMC: Default Providers Reset" = "EDMC: Провайдери за замовчуванням були скинуті"; + +/* EDMarketConnector.py: Await Full CMDR Login to Game; In files: EDMarketConnector.py:813; */ +"Awaiting Full CMDR Login" = "Очікуємо повного входу КМДР"; + /* journal_lock.py: Title text on popup when Journal directory already locked; In files: journal_lock.py:208; */ "Journal directory already locked" = "Каталог журналу вже заблокований"; @@ -163,9 +264,45 @@ /* l10n.py: The system default language choice in Settings > Appearance; prefs.py: Settings > Configuration - Label on 'reset journal files location to default' button; prefs.py: The system default language choice in Settings > Appearance; prefs.py: Label for 'Default' theme radio button; In files: l10n.py:193; prefs.py:455; prefs.py:709; prefs.py:742; */ "Default" = "Стандартне налаштування"; +/* coriolis.py: 'Auto' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - auto; In files: coriolis.py:48; coriolis.py:74; coriolis.py:77; coriolis.py:94; coriolis.py:123; coriolis.py:139; coriolis.py:145; coriolis.py:179; coriolis.py:182; */ +"Auto" = "Авто"; + +/* coriolis.py: 'Normal' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - normal; In files: coriolis.py:49; coriolis.py:75; coriolis.py:95; coriolis.py:121; coriolis.py:137; coriolis.py:180; */ +"Normal" = "Нормальний"; + +/* coriolis.py: 'Beta' label for Coriolis site override selection; coriolis.py: Coriolis normal/beta selection - beta; In files: coriolis.py:50; coriolis.py:76; coriolis.py:96; coriolis.py:122; coriolis.py:138; coriolis.py:181; */ +"Beta" = "Бета"; + +/* coriolis.py: Settings>Coriolis: Help/hint for changing coriolis URLs; In files: coriolis.py:91:93; */ +"Set the URL to use with coriolis.io ship loadouts. Note that this MUST end with '/import?data='" = "Вставте URL для використання із корабельними збірками coriolis.io. Зауважте що '/import?data=' ПОВИННО бути в кінці!"; + +/* coriolis.py: Settings>Coriolis: Label for 'NOT alpha/beta game version' URL; In files: coriolis.py:97; */ +"Normal URL" = "Нормальний URL"; + +/* coriolis.py: Generic 'Reset' button label; In files: coriolis.py:100; coriolis.py:109; */ +"Reset" = "Скинути"; + +/* coriolis.py: Settings>Coriolis: Label for 'alpha/beta game version' URL; In files: coriolis.py:106; */ +"Beta URL" = "Бета URL"; + +/* coriolis.py: Settings>Coriolis: Label for selection of using Normal, Beta or 'auto' Coriolis URL; In files: coriolis.py:116; */ +"Override Beta/Normal Selection" = "Перевизначити вибір Бета/Нормальний"; + +/* coriolis.py: Settings>Coriolis - invalid override mode found; In files: coriolis.py:156; */ +"Invalid Coriolis override mode!" = "Неправильний режим перевизначення Coriolis!"; + /* eddn.py: Error while trying to send data to EDDN; In files: eddn.py:458; eddn.py:2413; eddn.py:2451; eddn.py:2519; */ "Error: Can't connect to EDDN" = "Помилка: Немає зв'язку з EDDN!"; +/* eddn.py: EDDN has banned this version of our client; In files: eddn.py:576; */ +"EDDN Error: EDMC is too old for EDDN. Please update." = "Помилка EDDN: версія EDMC є занадто старою для EDDN. Будь-ласка, оновіть."; + +/* eddn.py: EDDN returned an error that indicates something about what we sent it was wrong; In files: eddn.py:582; */ +"EDDN Error: Validation Failed (EDMC Too Old?). See Log" = "Помилка EDDN: Перевірка провалена (EDMC занадно старий?). Див. Лог"; + +/* eddn.py: EDDN returned some sort of HTTP error, one we didn't expect. {STATUS} contains a number; In files: eddn.py:587; */ +"EDDN Error: Returned {STATUS} status code" = "Помилка EDDN: Код {STATUS} було повернуто."; + /* eddn.py: Enable EDDN support for station data checkbox label; In files: eddn.py:2041; */ "Send station data to the Elite Dangerous Data Network" = "Надсилати дані станцій до Elite Dangerous Data Network"; @@ -175,6 +312,9 @@ /* eddn.py: EDDN delay sending until docked option is on, this message notes that a send was skipped due to this; In files: eddn.py:2063; */ "Delay sending until docked" = "Відкласти відправку даних до стикування"; +/* eddn.py: Killswitch disabled EDDN; In files: eddn.py:2178; */ +"EDDN journal handler disabled. See Log." = "Журнал EDDN відключено. Див. Лог"; + /* eddn.py: Status text shown while attempting to send data; In files: eddn.py:2507; */ "Sending data to EDDN..." = "Відправка даних до EDDN..."; @@ -190,6 +330,12 @@ /* edsm.py: We have no data on the current commander; prefs.py: No hotkey/shortcut set; stats.py: No rank; In files: edsm.py:394; prefs.py:527; prefs.py:1157; prefs.py:1190; stats.py:154; stats.py:173; stats.py:192; stats.py:209; */ "None" = "Нічого"; +/* edsm.py: EDSM plugin - Journal handling disabled by killswitch; In files: edsm.py:516; */ +"EDSM Handler disabled. See Log." = "Обробник EDSM відключено. Див. Лог"; + +/* edsm.py: EDSM - Only Live data; In files: edsm.py:632; */ +"EDSM only accepts Live galaxy data" = "EDSM приймає дані тільки Live версії галактики"; + /* edsm.py: EDSM Plugin - Error message from EDSM API; In files: edsm.py:916; edsm.py:1048; */ "Error: EDSM {MSG}" = "Помилка: EDSM {MSG}!"; @@ -202,6 +348,12 @@ /* inara.py: Text for INARA API keys link ( goes to https://inara.cz/settings-api ); In files: inara.py:269; */ "Inara credentials" = "Обліковий запис Inara"; +/* inara.py: The Inara API only accepts Live galaxy data, not Legacy galaxy data; inara.py: Inara - Only Live data; In files: inara.py:384; inara.py:386; */ +"Inara only accepts Live galaxy data" = "Inara приймає дані тільки Live версії галактики"; + +/* inara.py: INARA support disabled via killswitch; In files: inara.py:395; */ +"Inara disabled. See Log." = "Inara відключено. Див. Лог"; + /* inara.py: INARA API returned some kind of error (error message will be contained in {MSG}); In files: inara.py:1650; inara.py:1663; */ "Error: Inara {MSG}" = "Помилка: Inara {MSG}"; @@ -232,6 +384,12 @@ /* prefs.py: Settings > Configuration - Label for Journal files location; In files: prefs.py:431; prefs.py:446; */ "E:D journal file location" = "Розташування файлу-журналу E:D"; +/* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ +"CAPI Settings" = "Налаштування CAPI"; + + +/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ +"Enable Fleetcarrier CAPI Queries" = "Ввімкнути запити CAPI кораблів-носіїв"; /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Гаряча клавіша"; @@ -259,6 +417,15 @@ /* prefs.py: Label for 'Configuration' tab in Settings; In files: prefs.py:681; */ "Configuration" = "Конфігурація"; +/* prefs.py: UI elements privacy section header in privacy tab of preferences; In files: prefs.py:690; */ +"Main UI privacy options" = "Налаштування приватності основного вікна."; + +/* prefs.py: Hide private group owner name from UI checkbox; In files: prefs.py:695; */ +"Hide private group name in UI" = "Приховати назву приватної групи у вікні"; + +/* prefs.py: Hide multicrew captain name from main UI checkbox; In files: prefs.py:699; */ +"Hide multi-crew captain name" = "Приховати ім'я капітана мультиекіпажу"; + /* prefs.py: Preferences privacy tab title; In files: prefs.py:703; */ "Privacy" = "Конфіденційність"; @@ -316,6 +483,9 @@ /* prefs.py: Plugins - Label on URL to documentation about migrating plugins from Python 2.7; In files: prefs.py:962; */ "Information on migrating plugins" = "Інформація про міграцію плагінів"; +/* prefs.py: Plugins - Label for list of 'broken' plugins that failed to load; In files: prefs.py:1039; */ +"Broken Plugins" = "Поломані плагіни"; + /* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:977; */ "Disabled Plugins" = "Вимкнені плагіни"; @@ -328,6 +498,21 @@ /* stats.py: Top rank; In files: stats.py:63; */ "Elite" = "Еліта"; +/* stats.py: Top rank +1; In files: stats.py:64; */ +"Elite I" = "Еліта І"; + +/* stats.py: Top rank +2; In files: stats.py:65; */ +"Elite II" = "Еліта ІІ"; + +/* stats.py: Top rank +3; In files: stats.py:66; */ +"Elite III" = "Еліта ІІІ"; + +/* stats.py: Top rank +4; In files: stats.py:67; */ +"Elite IV" = "Еліта IV"; + +/* stats.py: Top rank +5; In files: stats.py:68; */ +"Elite V" = "Еліта V"; + /* stats.py: Ranking; In files: stats.py:74; */ "Combat" = "Бойовий"; @@ -337,6 +522,12 @@ /* stats.py: Ranking; In files: stats.py:76; */ "Explorer" = "Дослідницький"; +/* stats.py: Ranking; In files: stats.py:77; */ +"Mercenary" = "Найманець"; + +/* stats.py: Ranking; In files: stats.py:78; */ +"Exobiologist" = "Екзобіолог"; + /* stats.py: Ranking; In files: stats.py:79; */ "CQC" = "Близький бій (CQC)"; @@ -421,6 +612,51 @@ /* stats.py: Explorer rank; In files: stats.py:118; */ "Pioneer" = "Піонер"; +/* stats.py: Mercenary rank; In files: stats.py:122; */ +"Defenceless" = "Беззахисний"; + +/* stats.py: Mercenary rank; In files: stats.py:123; */ +"Mostly Defenceless" = "Здебільшого беззахисний"; + +/* stats.py: Mercenary rank; In files: stats.py:124; */ +"Rookie" = "Новачок"; + +/* stats.py: Mercenary rank; In files: stats.py:125; */ +"Soldier" = "Солдат"; + +/* stats.py: Mercenary rank; In files: stats.py:126; stats.py:128; */ +"Gunslinger" = "Стрілець"; + +/* stats.py: Mercenary rank; In files: stats.py:127; */ +"Warrior" = "Воїн"; + +/* stats.py: Mercenary rank; In files: stats.py:129; */ +"Deadeye" = "Снайпер"; + +/* stats.py: Exobiologist rank; In files: stats.py:132; */ +"Directionless" = "Безнапрямний"; + +/* stats.py: Exobiologist rank; In files: stats.py:133; */ +"Mostly Directionless" = "Здебільшого безнапрямний"; + +/* stats.py: Exobiologist rank; In files: stats.py:134; */ +"Compiler" = "Упорядник"; + +/* stats.py: Exobiologist rank; In files: stats.py:135; */ +"Collector" = "Колектор"; + +/* stats.py: Exobiologist rank; In files: stats.py:136; */ +"Cataloguer" = "Каталогіст"; + +/* stats.py: Exobiologist rank; In files: stats.py:137; */ +"Taxonomist" = "Систематик"; + +/* stats.py: Exobiologist rank; In files: stats.py:138; */ +"Ecologist" = "Еколог"; + +/* stats.py: Exobiologist rank; In files: stats.py:139; */ +"Geneticist" = "Генетик"; + /* stats.py: CQC rank; In files: stats.py:142; */ "Helpless" = "Безпорадний"; @@ -541,9 +777,36 @@ /* stats.py: Power rank; In files: stats.py:197; */ "Rating 5" = "Рейтинг 5"; +/* stats.py: Current commander unknown when trying to use 'File' > 'Status'; In files: stats.py:315; */ +"Status: Don't yet know your Commander name" = "Статус: Поки ще не знаємо ім'я вашого КМДР"; + +/* stats.py: No Frontier CAPI data yet when trying to use 'File' > 'Status'; In files: stats.py:323; */ +"Status: No CAPI data yet" = "Статус: Поки ще немає даних CAPI"; + /* stats.py: Status dialog subtitle - CR value of ship; In files: stats.py:409; */ "Value" = "Вартість"; /* stats.py: Status dialog title; In files: stats.py:418; */ "Ships" = "Кораблі"; +/* update.py: Update Available Text; In files: update.py:229; */ +"{NEWVER} is available" = "{NEWVER} доступна"; + +/* prefs.py: Stable Version of EDMC; */ +"Stable" = "Стабільний"; + +/* prefs.py: Select the Update Track (Beta, Stable); */ +"Update Track" = "Шлях оновлень"; + +/* EDMarketConnector.py: Inform the user the Update Track has changed; */ +"Update Track Changed to {TRACK}" = "Шлях оновлень змінено на {TRACK}"; + + +/* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ +"Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Шлях оновлень змінено з \"Бета\" на \"Стабільний\". Ви більше не будете отримувати бета оновлень. Ви залишитеся на версії бета до наступного стабільного релізу.\n\nВи можете вручну вернутися до останньої стабільної версії. Щоб це зробити, вам необхідно завантажити останню стабільну версію вручну. Зауважте що заниження версії між релізами з багатьма змінами може спричинити помилки чи повністю унеможливити роботу програми.\n\nБажаєте відкрити сторінку GitHub для завантаження останнього релізу?"; + +/* myNotebook.py: Can't Paste Images or Files in Text; */ +"Cannot paste non-text content." = "Неможливо вставити нетекстовий вміст буфера обміну."; + +/* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ +"Open in {URL}" = "Відкрити у {URL}"; diff --git a/L10n/zh-Hans.strings b/L10n/zh-Hans.strings index 2cc13543..0b13a5a1 100644 --- a/L10n/zh-Hans.strings +++ b/L10n/zh-Hans.strings @@ -151,12 +151,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "CAPI 舰队母舰 (fleet carrier) 被 killswitch 禁用"; + /* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ "CAPI: No fleetcarrier data returned" = "CAPI:无舰队母舰 (fleet carrier) 数据"; /* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ "CAPI: Fleetcarrier data incomplete" = "CAPI:舰队母舰 (fleet carrier) 数据不完整"; - /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI:没有指挥官数据"; @@ -343,9 +343,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "CAPI 设置"; + /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleetcarrier CAPI Queries" = "开启舰队母舰 (fleet carrier) CAPI 访问"; - /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "快捷键"; diff --git a/companion.py b/companion.py index 1b9c693a..934fc8bb 100644 --- a/companion.py +++ b/companion.py @@ -1063,7 +1063,7 @@ class Session: play_sound: bool = False, auto_update: bool = False ) -> None: """ - Perform CAPI query for fleetcarrier data. + Perform CAPI query for Fleet Carrier data. :param query_time: When this query was initiated. :param tk_response_event: Name of tk event to generate when response queued. @@ -1074,8 +1074,8 @@ class Session: if not capi_host: return - # Ask the thread worker to perform a fleetcarrier query - logger.trace_if('capi.worker', 'Enqueueing fleetcarrier request') + # Ask the thread worker to perform a Fleet Carrier query + logger.trace_if('capi.worker', 'Enqueueing Fleet Carrier request') self.capi_request_queue.put( EDMCCAPIRequest( capi_host=capi_host, diff --git a/plug.py b/plug.py index bd98f2bb..9c203f25 100644 --- a/plug.py +++ b/plug.py @@ -418,7 +418,7 @@ def notify_capidata(data: companion.CAPIData, is_beta: bool) -> str | None: def notify_capi_fleetcarrierdata(data: companion.CAPIData) -> str | None: """ - Send the latest CAPI Fleetcarrier data from the FD servers to each plugin. + Send the latest CAPI Fleet Carrier data from the FD servers to each plugin. :param data: The CAPIData returned in the CAPI response :returns: Error message from the first plugin that returns one (if any) @@ -433,7 +433,7 @@ def notify_capi_fleetcarrierdata(data: companion.CAPIData) -> str | None: error = error if error else newerror except Exception: - logger.exception(f'Plugin "{plugin.name}" failed on receiving Fleetcarrier data') + logger.exception(f'Plugin "{plugin.name}" failed on receiving Fleet Carrier data') return error diff --git a/prefs.py b/prefs.py index 298d8cb3..7f217ac8 100644 --- a/prefs.py +++ b/prefs.py @@ -476,7 +476,7 @@ class PreferencesDialog(tk.Toplevel): nb.Checkbutton( config_frame, # LANG: Configuration - Enable or disable the Fleet Carrier CAPI calls - text=tr.tl('Enable Fleetcarrier CAPI Queries'), + text=tr.tl('Enable Fleet Carrier CAPI Queries'), variable=self.capi_fleetcarrier ).grid(columnspan=4, padx=self.BUTTONX, pady=self.PADY, sticky=tk.W, row=row.get()) From 40b5785697f17bb77e60dac18260f68548a75253 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 4 Jun 2024 16:50:53 -0400 Subject: [PATCH 299/425] [Lang] Update Translations --- L10n/de.strings | 12 ++++++++++++ L10n/pt-BR.strings | 12 ++++++++++++ L10n/sr-Latn-BA.strings | 12 ++++++++++++ L10n/tr.strings | 12 ++++++++++++ L10n/uk.strings | 12 ++++++++++++ 5 files changed, 60 insertions(+) diff --git a/L10n/de.strings b/L10n/de.strings index 8631da0d..a5da5f81 100644 --- a/L10n/de.strings +++ b/L10n/de.strings @@ -1,3 +1,15 @@ +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Fehler im System Profiler"; + +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: Carrier-Daten unvollständig"; + +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: Keine Carrier-Daten erhalten"; + +/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ +"Enable Fleet Carrier CAPI Queries" = "Carrier-CAPI-Anfragen aktivieren"; + /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Sende Fluglog und CMDR-Status an EDSM"; diff --git a/L10n/pt-BR.strings b/L10n/pt-BR.strings index 9bbb2c6c..791a582a 100644 --- a/L10n/pt-BR.strings +++ b/L10n/pt-BR.strings @@ -1,3 +1,15 @@ +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Erro no Perfil de Sistema"; + +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: Dados de porta-frotas incompletos"; + +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: Nenhum dado de porta-frotas retornado"; + +/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ +"Enable Fleet Carrier CAPI Queries" = "Ativar requisições CAPI para porta-frotas"; + /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Enviar registro de voo e status do CMDT para o EDSM"; diff --git a/L10n/sr-Latn-BA.strings b/L10n/sr-Latn-BA.strings index 00b6e053..c861be2a 100644 --- a/L10n/sr-Latn-BA.strings +++ b/L10n/sr-Latn-BA.strings @@ -1,3 +1,15 @@ +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Greša u System Profileru"; + +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: Fleet Carrier podaci nisu kompletni"; + +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: Fleet Carrier nisu dobijeni"; + +/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ +"Enable Fleet Carrier CAPI Queries" = "Omogući Fleet Carrier CAPI upite"; + /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Pošalji log leta i CMDR status na EDSM"; diff --git a/L10n/tr.strings b/L10n/tr.strings index e35c00a2..d99bb562 100644 --- a/L10n/tr.strings +++ b/L10n/tr.strings @@ -1,3 +1,15 @@ +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Sistem Profilcisinde Hata oluştu"; + +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: Filo Taşıyıcısı verileri eksik"; + +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: Filo Taşıyıcısı verisi bulunamadı"; + +/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ +"Enable Fleet Carrier CAPI Queries" = "Filo Taşıyıcı CAPI Sorgularını Etkinleştir"; + /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Uçuş günlüğünü ve CMDR durumunu EDSM'e gönder"; diff --git a/L10n/uk.strings b/L10n/uk.strings index b4760202..3729f7c0 100644 --- a/L10n/uk.strings +++ b/L10n/uk.strings @@ -1,3 +1,15 @@ +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Помилка у Профайлері Систем"; + +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: Дані корабля-носія неповні"; + +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: Немає даних корабля-носія"; + +/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ +"Enable Fleet Carrier CAPI Queries" = "Ввімкнути запити CAPI кораблів-носіїв"; + /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Відправляти дані бортового журналу до EDSM"; From 4e74b0474bd4394abea2d2e044e26c62a0155473 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 4 Jun 2024 16:57:47 -0400 Subject: [PATCH 300/425] [RELEASE] 5.11.0 --- ChangeLog.md | 19 +++++-------------- config/__init__.py | 2 +- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 5d480fb8..1f4defc8 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,20 +6,8 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- -Pre-Release 5.11.0-rc2 +Release 5.11.0 === -This is a release candidate for 5.11.0. - -This release is identical to 5.11.0-rc1, with a few additions: - -**Changes and Enhancements** -* Adds Additional Error Processing to the System Profiler when launched from EDMC -* Adds the ability to resize the Settings window to larger than the initial default size -* Tweaked a few list length checks that could just be boolean to be bool - -Pre-Release 5.11.0-rc1 -=== -This is a release candidate for 5.11.0. This release includes a number of new features and improvements, including a new Beta Update Track for testing future updates, enhanced context menus for text entry fields and UI elements, a revamp to the existing translation system and logging capabilities, and more. This release includes the Python Image Library (PIL) into our core bundle, adds a number of stability and configuration checks to the tool, and adds new schemas and configuration values to senders. @@ -41,9 +29,12 @@ This release also includes a number of bug fixes, performance enhancements, and * Added a new updater for the FDevID Files to keep the dependency up to date without requiring a new patch version push * Added a System Profiler Utility to assist with gathering system and environment information for bug report purposes * Added a new security policy for responsible disclosure of identified security issues +* Adds Additional Error Processing to the System Profiler when launched from EDMC +* Adds the ability to resize the Settings window to larger than the initial default size * Enabled security code scanning on the GitHub repository +* Tweaked a few list length checks that could just be boolean to be bool * Updates the look and feel of the "Already Running" popup to reduce overhead and improve the look of the popup -* Updated translations to latest versions +* Updated translations to latest versions, including a new language: Ukranian! * Updated documentation to reflect certain changes to the code * Updated the GitHub Bug Report template * Updated the GitHub Pull Request template diff --git a/config/__init__.py b/config/__init__.py index ab0bdd0a..18c77c06 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -54,7 +54,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.11.0-rc2' +_static_appversion = '5.11.0' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From 9ddd0ffacc0d77206ea70b18d7a44148eadee349 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Wed, 5 Jun 2024 17:22:52 -0400 Subject: [PATCH 301/425] [Emergency] Revert Setuptools Update --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 7c8e1ef5..19e55b66 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -5,7 +5,7 @@ wheel # We can't rely on just picking this up from either the base (not venv), # or venv-init-time version. Specify here so that dependabot will prod us # about new versions. -setuptools==70.0.0 +setuptools==69.2.0 # Static analysis tools flake8==7.0.0 From 3209b4e1fbbd00846062e8868fd9bf4fd55cb663 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Thu, 6 Jun 2024 17:25:51 -0400 Subject: [PATCH 302/425] [2251] ResPath Update --- build.py | 2 +- collate.py | 6 +++++- companion.py | 4 ++-- update.py | 18 +++++++++++++++--- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/build.py b/build.py index 2483a4e0..c5236c5a 100644 --- a/build.py +++ b/build.py @@ -208,5 +208,5 @@ def build() -> None: if __name__ == "__main__": - check_for_fdev_updates() + check_for_fdev_updates(local=True) build() diff --git a/collate.py b/collate.py index caf5994f..380cb8ba 100755 --- a/collate.py +++ b/collate.py @@ -22,6 +22,7 @@ from traceback import print_exc import companion import outfitting +from config import config from edmc_data import companion_category_map, ship_name_map @@ -50,7 +51,10 @@ def addcommodities(data) -> None: # noqa: CCR001 if not data['lastStarport'].get('commodities'): return - commodityfile = pathlib.Path('FDevIDs/commodity.csv') + try: + commodityfile = pathlib.Path(config.app_dir_path / 'FDevIDs' / 'commodity.csv') + except FileNotFoundError: + commodityfile = pathlib.Path('FDevIDs/commodity.csv') commodities = {} # slurp existing diff --git a/companion.py b/companion.py index 934fc8bb..775da295 100644 --- a/companion.py +++ b/companion.py @@ -1203,10 +1203,10 @@ def fixup(data: CAPIData) -> CAPIData: # noqa: C901, CCR001 # Can't be usefully if not commodity_map: # Lazily populate for f in ('commodity.csv', 'rare_commodity.csv'): - if not os.path.isfile(config.respath_path / 'FDevIDs/' / f): + if not os.path.isfile(config.app_dir_path / 'FDevIDs/' / f): logger.warning(f'FDevID file {f} not found! Generating output without these commodity name rewrites.') continue - with open(config.respath_path / 'FDevIDs' / f, 'r') as csvfile: + with open(config.app_dir_path / 'FDevIDs' / f, 'r') as csvfile: reader = csv.DictReader(csvfile) for row in reader: diff --git a/update.py b/update.py index d6364c2d..9dd6229a 100644 --- a/update.py +++ b/update.py @@ -8,6 +8,7 @@ See LICENSE file. from __future__ import annotations import pathlib +import shutil import sys import threading from traceback import print_exc @@ -26,21 +27,32 @@ if TYPE_CHECKING: logger = get_main_logger() -def check_for_fdev_updates(silent: bool = False) -> None: # noqa: CCR001 +def check_for_fdev_updates(silent: bool = False, local: bool = False) -> None: # noqa: CCR001 """Check for and download FDEV ID file updates.""" + if local: + pathway = config.app_dir_path + else: + pathway = config.respath_path + files_urls = [ ('commodity.csv', 'https://raw.githubusercontent.com/EDCD/FDevIDs/master/commodity.csv'), ('rare_commodity.csv', 'https://raw.githubusercontent.com/EDCD/FDevIDs/master/rare_commodity.csv') ] for file, url in files_urls: - fdevid_file = pathlib.Path(config.respath_path / 'FDevIDs' / file) + fdevid_file = pathlib.Path(pathway / 'FDevIDs' / file) fdevid_file.parent.mkdir(parents=True, exist_ok=True) try: with open(fdevid_file, newline='', encoding='utf-8') as f: local_content = f.read() except FileNotFoundError: - local_content = None + logger.info(f'File {file} not found. Writing from bundle...') + for localfile in files_urls: + filepath = f"FDevIDs/{localfile[0]}" + shutil.copy(filepath, pathway / 'FDevIDs') + fdevid_file = pathlib.Path(pathway / 'FDevIDs' / file) + with open(fdevid_file, newline='', encoding='utf-8') as f: + local_content = f.read() response = requests.get(url) if response.status_code != 200: From 76c94bfdb99187016a51052b0949a9a4a9d8c488 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Thu, 6 Jun 2024 17:56:19 -0400 Subject: [PATCH 303/425] [2251] Update FDEVID Timeout --- update.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/update.py b/update.py index 9dd6229a..49a99a1b 100644 --- a/update.py +++ b/update.py @@ -54,7 +54,7 @@ def check_for_fdev_updates(silent: bool = False, local: bool = False) -> None: with open(fdevid_file, newline='', encoding='utf-8') as f: local_content = f.read() - response = requests.get(url) + response = requests.get(url, timeout=20) if response.status_code != 200: if not silent: logger.error(f'Failed to download {file}! Unable to continue.') From 1f92c0cdfb5c68ff192fe6197dd3989aefd37184 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Thu, 6 Jun 2024 18:08:03 -0400 Subject: [PATCH 304/425] [2251] Remember the File May Not Exist --- update.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/update.py b/update.py index 49a99a1b..c9b80fb0 100644 --- a/update.py +++ b/update.py @@ -30,9 +30,9 @@ logger = get_main_logger() def check_for_fdev_updates(silent: bool = False, local: bool = False) -> None: # noqa: CCR001 """Check for and download FDEV ID file updates.""" if local: - pathway = config.app_dir_path - else: pathway = config.respath_path + else: + pathway = config.app_dir_path files_urls = [ ('commodity.csv', 'https://raw.githubusercontent.com/EDCD/FDevIDs/master/commodity.csv'), @@ -47,12 +47,15 @@ def check_for_fdev_updates(silent: bool = False, local: bool = False) -> None: local_content = f.read() except FileNotFoundError: logger.info(f'File {file} not found. Writing from bundle...') - for localfile in files_urls: - filepath = f"FDevIDs/{localfile[0]}" - shutil.copy(filepath, pathway / 'FDevIDs') - fdevid_file = pathlib.Path(pathway / 'FDevIDs' / file) - with open(fdevid_file, newline='', encoding='utf-8') as f: - local_content = f.read() + try: + for localfile in files_urls: + filepath = f"FDevIDs/{localfile[0]}" + shutil.copy(filepath, pathway / 'FDevIDs') + fdevid_file = pathlib.Path(pathway / 'FDevIDs' / file) + with open(fdevid_file, newline='', encoding='utf-8') as f: + local_content = f.read() + except FileNotFoundError: + local_content = None response = requests.get(url, timeout=20) if response.status_code != 200: From 79bb416fe19d32f723063f74bc9ef6290b4825c6 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Thu, 6 Jun 2024 18:16:27 -0400 Subject: [PATCH 305/425] [2251] No Ouroboros CSVs please --- update.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/update.py b/update.py index c9b80fb0..35cc31e9 100644 --- a/update.py +++ b/update.py @@ -50,7 +50,10 @@ def check_for_fdev_updates(silent: bool = False, local: bool = False) -> None: try: for localfile in files_urls: filepath = f"FDevIDs/{localfile[0]}" - shutil.copy(filepath, pathway / 'FDevIDs') + try: + shutil.copy(filepath, pathway / 'FDevIDs') + except shutil.SameFileError: + logger.info("Not replacing same file...") fdevid_file = pathlib.Path(pathway / 'FDevIDs' / file) with open(fdevid_file, newline='', encoding='utf-8') as f: local_content = f.read() From bdf4f659b99ac339aa6639f4d1ec9295a5057926 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Thu, 6 Jun 2024 18:25:46 -0400 Subject: [PATCH 306/425] [2251] More Update Checks --- EDMarketConnector.py | 2 ++ config/__init__.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index f512ccf1..beefa309 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -25,6 +25,7 @@ from os import chdir, environ, path from time import localtime, strftime, time from typing import TYPE_CHECKING, Any, Literal from constants import applongname, appname, protocolhandler_redirect +from update import check_for_fdev_updates # Have this as early as possible for people running EDMarketConnector.exe # from cmd.exe or a bat file or similar. Else they might not be in the correct @@ -2323,6 +2324,7 @@ sys.path: {sys.path}''' root.after(2, show_killswitch_poppup, root) # Start the main event loop try: + check_for_fdev_updates() root.mainloop() except KeyboardInterrupt: logger.info("Ctrl+C Detected, Attempting Clean Shutdown") diff --git a/config/__init__.py b/config/__init__.py index 18c77c06..7682c7e3 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -54,7 +54,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.11.0' +_static_appversion = '5.11.1-alpha2' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From 19309308545e35296b8ae93c71f4ba29ddac5c13 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Thu, 6 Jun 2024 18:34:03 -0400 Subject: [PATCH 307/425] [2251] Add Temp Local Check --- config/__init__.py | 2 +- update.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/config/__init__.py b/config/__init__.py index 7682c7e3..395adc9e 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -54,7 +54,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.11.1-alpha2' +_static_appversion = '5.11.1-alpha3' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' diff --git a/update.py b/update.py index 35cc31e9..14360a4b 100644 --- a/update.py +++ b/update.py @@ -187,6 +187,12 @@ class Updater: self.updater.win_sparkle_check_update_with_ui() check_for_fdev_updates() + # TEMP: Only include until 6.0 + try: + check_for_fdev_updates(local=True) + except Exception as e: + logger.info('Tried to update local FDEV files but failed.') + logger.info(e) def check_appcast(self) -> EDMCVersion | None: """ From dd8b18cbae94dd6298b0bbb76e6a796d72cee825 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Thu, 6 Jun 2024 18:49:12 -0400 Subject: [PATCH 308/425] [2251] Clarify Bundle Update Error Msg --- update.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/update.py b/update.py index 14360a4b..6e1564f9 100644 --- a/update.py +++ b/update.py @@ -191,8 +191,9 @@ class Updater: try: check_for_fdev_updates(local=True) except Exception as e: - logger.info('Tried to update local FDEV files but failed.') - logger.info(e) + logger.info("Tried to update bundle FDEV files but failed. Don't worry, " + "this likely isn't important and can be ignored unless" + f" you run into other issues. If you're curious: {e}") def check_appcast(self) -> EDMCVersion | None: """ From 2f6e9fa4c2af01182f30b1add013420c7c004d0e Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Thu, 6 Jun 2024 19:41:10 -0400 Subject: [PATCH 309/425] [2251] Use Pathlib --- update.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/update.py b/update.py index 6e1564f9..adf118e4 100644 --- a/update.py +++ b/update.py @@ -49,7 +49,7 @@ def check_for_fdev_updates(silent: bool = False, local: bool = False) -> None: logger.info(f'File {file} not found. Writing from bundle...') try: for localfile in files_urls: - filepath = f"FDevIDs/{localfile[0]}" + filepath = pathlib.Path(f"FDevIDs/{localfile[0]}") try: shutil.copy(filepath, pathway / 'FDevIDs') except shutil.SameFileError: From 424c509c44239e2ee4ad3eab4fce988c5964693c Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Thu, 6 Jun 2024 19:48:39 -0400 Subject: [PATCH 310/425] [2251] Reset Update Import Location --- EDMarketConnector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index beefa309..e1524b00 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -25,7 +25,6 @@ from os import chdir, environ, path from time import localtime, strftime, time from typing import TYPE_CHECKING, Any, Literal from constants import applongname, appname, protocolhandler_redirect -from update import check_for_fdev_updates # Have this as early as possible for people running EDMarketConnector.exe # from cmd.exe or a bat file or similar. Else they might not be in the correct @@ -66,6 +65,7 @@ from config import appversion, appversion_nobuild, config, copyright from EDMCLogging import edmclogger, logger, logging from journal_lock import JournalLock, JournalLockResult +from update import check_for_fdev_updates if __name__ == '__main__': # noqa: C901 # Command-line arguments From 2c60499451aff68df1b2b1387c68df6b0109f0cc Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Fri, 7 Jun 2024 17:35:29 -0400 Subject: [PATCH 311/425] [RELEASE] 5.11.1-beta0 --- ChangeLog.md | 23 +++++++++++++++++++++++ config/__init__.py | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 1f4defc8..c4fd2f2b 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,6 +6,29 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- +Pre-Release 5.11.1-beta0 +=== + +This is a release candidate for 5.11.1. + +This release fixes a bug regarding FDevID files when running from Source in a non-writable location. + +**Changes and Enhancements** +* Added a check on Git Pushes to check for updated translation strings for developers + +**Bug Fixes** +* Fixed a bug that could result in the program not updating or writing FDevID files when running from source in a location where the running user can't write to + +**Plugin Developers** +* nb.Entry is deprecated, and is slated for removal in 6.0 or later. Please migrate to nb.EntryMenu +* nb.ColoredButton is deprecated, and is slated for removal in 6.0 or later. Please migrate to tk.Button +* Calling internal translations with `_()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to importing `translations` and calling `translations.translate` or `translations.tl` directly +* `Translations` as the translate system singleton is deprecated, and is slated for removal in 6.0 or later. Please migrate to the `translations` singleton +* `help_open_log_folder()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to open_folder() +* `update_feed` is deprecated, and is slated for removal in 6.0 or later. Please migrate to `get_update_feed()`. +* FDevID files (`commodity.csv` and `rare_commodity.csv`) have moved their preferred location to the app dir (same location as default Plugins folder). Please migrate to use `config.app_dir_path`. + + Release 5.11.0 === diff --git a/config/__init__.py b/config/__init__.py index 395adc9e..fe258475 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -54,7 +54,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.11.1-alpha3' +_static_appversion = '5.11.1-beta0' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From b0e682f66c0fa157a5f8cab54b78966a2e2d0b3b Mon Sep 17 00:00:00 2001 From: Bruno Marques Date: Sun, 9 Jun 2024 18:40:03 +0100 Subject: [PATCH 312/425] Enabled DeprecationWarning by default and fixed references --- EDMCLogging.py | 3 +++ config/__init__.py | 21 +++++++++++---------- l10n.py | 10 +++++----- myNotebook.py | 5 +++-- prefs.py | 7 +++---- 5 files changed, 25 insertions(+), 21 deletions(-) diff --git a/EDMCLogging.py b/EDMCLogging.py index 74b439f9..b6d4b353 100644 --- a/EDMCLogging.py +++ b/EDMCLogging.py @@ -42,6 +42,7 @@ import logging.handlers import os import pathlib import tempfile +import warnings from contextlib import suppress from fnmatch import fnmatch # So that any warning about accessing a protected member is only in one place. @@ -99,6 +100,8 @@ logging.Logger.trace = lambda self, message, *args, **kwargs: self._log( # type # MAGIC-CONT: See MAGIC tagged comment in Logger.__init__() logging.Formatter.converter = gmtime +warnings.simplefilter('default', DeprecationWarning) + def _trace_if(self: logging.Logger, condition: str, message: str, *args, **kwargs) -> None: if any(fnmatch(condition, p) for p in config_mod.trace_on): diff --git a/config/__init__.py b/config/__init__.py index fe258475..9636d49a 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -41,7 +41,6 @@ import pathlib import re import subprocess import sys -import traceback import warnings from abc import abstractmethod from typing import Any, Callable, Type, TypeVar @@ -329,8 +328,7 @@ class AbstractConfig(abc.ABC): :raises OSError: On Windows, if a Registry error occurs. :return: The data or the default. """ - warnings.warn(DeprecationWarning('get is Deprecated. use the specific getter for your type')) - logger.debug('Attempt to use Deprecated get() method\n' + ''.join(traceback.format_stack())) + warnings.warn('get is Deprecated. use the specific getter for your type', DeprecationWarning, stacklevel=2) if (a_list := self._suppress_call(self.get_list, ValueError, key, default=None)) is not None: return a_list @@ -388,8 +386,7 @@ class AbstractConfig(abc.ABC): See get_int for its replacement. :raises OSError: On Windows, if a Registry error occurs. """ - warnings.warn(DeprecationWarning('getint is Deprecated. Use get_int instead')) - logger.debug('Attempt to use Deprecated getint() method\n' + ''.join(traceback.format_stack())) + warnings.warn('getint is Deprecated. Use get_int instead', DeprecationWarning, stacklevel=2) return self.get_int(key, default=default) @@ -448,15 +445,15 @@ class AbstractConfig(abc.ABC): def get_password(self, account: str) -> None: """Legacy password retrieval.""" - warnings.warn("password subsystem is no longer supported", DeprecationWarning) + warnings.warn("password subsystem is no longer supported", DeprecationWarning, stacklevel=2) def set_password(self, account: str, password: str) -> None: """Legacy password setting.""" - warnings.warn("password subsystem is no longer supported", DeprecationWarning) + warnings.warn("password subsystem is no longer supported", DeprecationWarning, stacklevel=2) def delete_password(self, account: str) -> None: """Legacy password deletion.""" - warnings.warn("password subsystem is no longer supported", DeprecationWarning) + warnings.warn("password subsystem is no longer supported", DeprecationWarning, stacklevel=2) def get_config(*args, **kwargs) -> AbstractConfig: @@ -489,5 +486,9 @@ def get_update_feed() -> str: return 'https://raw.githubusercontent.com/EDCD/EDMarketConnector/releases/edmarketconnector.xml' -# WARNING: update_feed is deprecated, and will be removed in 6.0 or later. Please migrate to get_update_feed() -update_feed = get_update_feed() +def __getattr__(name: str): + if name == 'update_feed': + warnings.warn('update_feed is deprecated, and will be removed in 6.0 or later. ' + 'Please migrate to get_update_feed()', DeprecationWarning, stacklevel=2) + return get_update_feed() + raise AttributeError(name=name) diff --git a/l10n.py b/l10n.py index 27cd95c5..79bab04a 100755 --- a/l10n.py +++ b/l10n.py @@ -263,15 +263,15 @@ class _Locale: """Locale holds a few utility methods to convert data to and from localized versions.""" def stringFromNumber(self, number: float | int, decimals: int | None = None) -> str: # noqa: N802 - warnings.warn(DeprecationWarning('use _Locale.string_from_number instead.')) + warnings.warn('use _Locale.string_from_number instead.', DeprecationWarning, stacklevel=2) return self.string_from_number(number, decimals) # type: ignore def numberFromString(self, string: str) -> int | float | None: # noqa: N802 - warnings.warn(DeprecationWarning('use _Locale.number_from_string instead.')) + warnings.warn('use _Locale.number_from_string instead.', DeprecationWarning, stacklevel=2) return self.number_from_string(string) def preferredLanguages(self) -> Iterable[str]: # noqa: N802 - warnings.warn(DeprecationWarning('use _Locale.preferred_languages instead.')) + warnings.warn('use _Locale.preferred_languages instead.', DeprecationWarning, stacklevel=2) return self.preferred_languages() def string_from_number(self, number: float | int, decimals: int = 5) -> str: @@ -367,8 +367,8 @@ translations = Translations() # Begin Deprecation Zone class _Translations(Translations): def __init__(self): - logger.warning(DeprecationWarning('Translations and _Translations() are deprecated. ' - 'Please use translations and Translations() instead.')) + warnings.warn('Translations and _Translations() are deprecated. ' + 'Please use translations and Translations() instead.', DeprecationWarning, stacklevel=2) super().__init__() diff --git a/myNotebook.py b/myNotebook.py index 0b083c23..d8b2b41b 100644 --- a/myNotebook.py +++ b/myNotebook.py @@ -11,6 +11,7 @@ from __future__ import annotations import sys import tkinter as tk +import warnings from tkinter import ttk, messagebox from PIL import ImageGrab from l10n import translations as tr @@ -124,8 +125,8 @@ class EntryMenu(ttk.Entry): class Entry(EntryMenu): """Custom ttk.Entry class to fix some display issues.""" - # DEPRECATED: Migrate to EntryMenu. Will remove in 6.0 or later. def __init__(self, master: ttk.Frame | None = None, **kw): + warnings.warn('Migrate to EntryMenu. Will remove in 6.0 or later.', DeprecationWarning, stacklevel=2) EntryMenu.__init__(self, master, **kw) @@ -142,8 +143,8 @@ class Button(ttk.Button): class ColoredButton(tk.Button): """Custom tk.Button class to fix some display issues.""" - # DEPRECATED: Migrate to tk.Button. Will remove in 6.0 or later. def __init__(self, master: ttk.Frame | None = None, **kw): + warnings.warn('Migrate to tk.Button. Will remove in 6.0 or later.', DeprecationWarning, stacklevel=2) tk.Button.__init__(self, master, **kw) diff --git a/prefs.py b/prefs.py index 7f217ac8..136b52de 100644 --- a/prefs.py +++ b/prefs.py @@ -9,6 +9,7 @@ import subprocess import sys import tempfile import tkinter as tk +import warnings from os import system from os.path import expanduser, expandvars, join, normpath from tkinter import colorchooser as tkColorChooser # type: ignore # noqa: N812 @@ -40,10 +41,8 @@ logger = get_main_logger() def help_open_log_folder() -> None: """Open the folder logs are stored in.""" - logger.warning( - DeprecationWarning("This function is deprecated, use open_log_folder instead. " - "This function will be removed in 6.0 or later") - ) + warnings.warn('prefs.help_open_log_folder is deprecated, use open_log_folder instead. ' + 'This function will be removed in 6.0 or later', DeprecationWarning, stacklevel=2) open_folder(pathlib.Path(tempfile.gettempdir()) / appname) From 192ba5f8f27f12b5b5365f031eb176c893432446 Mon Sep 17 00:00:00 2001 From: Bruno Marques Date: Sun, 9 Jun 2024 20:07:13 +0100 Subject: [PATCH 313/425] Adding pkg_resources exception to DeprecationWarning --- EDMCLogging.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/EDMCLogging.py b/EDMCLogging.py index b6d4b353..ab53dbec 100644 --- a/EDMCLogging.py +++ b/EDMCLogging.py @@ -101,6 +101,8 @@ logging.Logger.trace = lambda self, message, *args, **kwargs: self._log( # type logging.Formatter.converter = gmtime warnings.simplefilter('default', DeprecationWarning) +# TODO remove after infi.systray drops pkg_resources +warnings.filterwarnings('ignore', '.*pkg_resources', DeprecationWarning) def _trace_if(self: logging.Logger, condition: str, message: str, *args, **kwargs) -> None: From 13e74f2c575ae56731e2e4a1e8ff68dba4536786 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 9 Jun 2024 15:28:27 -0400 Subject: [PATCH 314/425] [2255] Replace Infi Systray with simplesystray --- EDMCLogging.py | 2 -- EDMarketConnector.py | 4 ++-- requirements-dev.txt | 2 +- requirements.txt | 2 +- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/EDMCLogging.py b/EDMCLogging.py index ab53dbec..b6d4b353 100644 --- a/EDMCLogging.py +++ b/EDMCLogging.py @@ -101,8 +101,6 @@ logging.Logger.trace = lambda self, message, *args, **kwargs: self._log( # type logging.Formatter.converter = gmtime warnings.simplefilter('default', DeprecationWarning) -# TODO remove after infi.systray drops pkg_resources -warnings.filterwarnings('ignore', '.*pkg_resources', DeprecationWarning) def _trace_if(self: logging.Logger, condition: str, message: str, *args, **kwargs) -> None: diff --git a/EDMarketConnector.py b/EDMarketConnector.py index e1524b00..cd76ccc0 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -396,7 +396,7 @@ if TYPE_CHECKING: from logging import TRACE # type: ignore # noqa: F401 # Needed to update mypy if sys.platform == 'win32': - from infi.systray import SysTrayIcon + from simplesystray import SysTrayIcon # isort: on @@ -452,7 +452,7 @@ class AppWindow: self.prefsdialog = None if sys.platform == 'win32': - from infi.systray import SysTrayIcon + from simplesystray import SysTrayIcon def open_window(systray: 'SysTrayIcon') -> None: self.w.deiconify() diff --git a/requirements-dev.txt b/requirements-dev.txt index 19e55b66..7c8e1ef5 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -5,7 +5,7 @@ wheel # We can't rely on just picking this up from either the base (not venv), # or venv-init-time version. Specify here so that dependabot will prod us # about new versions. -setuptools==69.2.0 +setuptools==70.0.0 # Static analysis tools flake8==7.0.0 diff --git a/requirements.txt b/requirements.txt index 83fa9c0d..22f0a360 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ requests==2.32.3 pillow==10.3.0 watchdog==4.0.0 -infi.systray==0.1.12; sys_platform == 'win32' +simplesystray==0.1.0; sys_platform == 'win32' semantic-version==2.10.0 From 7d5fdb2b84de93900c5732672762763eec2ee8e8 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 9 Jun 2024 15:52:44 -0400 Subject: [PATCH 315/425] [2255] Update Dep Comment Format --- config/__init__.py | 5 +++++ l10n.py | 15 ++++++++------- myNotebook.py | 2 ++ prefs.py | 2 +- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/config/__init__.py b/config/__init__.py index 9636d49a..b4dec93a 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -328,6 +328,7 @@ class AbstractConfig(abc.ABC): :raises OSError: On Windows, if a Registry error occurs. :return: The data or the default. """ + # DEPRECATED: Migrate to specific type getters. Will remove in 6.0 or later. warnings.warn('get is Deprecated. use the specific getter for your type', DeprecationWarning, stacklevel=2) if (a_list := self._suppress_call(self.get_list, ValueError, key, default=None)) is not None: @@ -386,6 +387,7 @@ class AbstractConfig(abc.ABC): See get_int for its replacement. :raises OSError: On Windows, if a Registry error occurs. """ + # DEPRECATED: Migrate to get_int. Will remove in 6.0 or later. warnings.warn('getint is Deprecated. Use get_int instead', DeprecationWarning, stacklevel=2) return self.get_int(key, default=default) @@ -443,6 +445,7 @@ class AbstractConfig(abc.ABC): """Close this config and release any associated resources.""" raise NotImplementedError +# DEPRECATED: Password system doesn't do anything. Will remove in 6.0 or later. def get_password(self, account: str) -> None: """Legacy password retrieval.""" warnings.warn("password subsystem is no longer supported", DeprecationWarning, stacklevel=2) @@ -454,6 +457,7 @@ class AbstractConfig(abc.ABC): def delete_password(self, account: str) -> None: """Legacy password deletion.""" warnings.warn("password subsystem is no longer supported", DeprecationWarning, stacklevel=2) +# End Dep Zone def get_config(*args, **kwargs) -> AbstractConfig: @@ -486,6 +490,7 @@ def get_update_feed() -> str: return 'https://raw.githubusercontent.com/EDCD/EDMarketConnector/releases/edmarketconnector.xml' +# DEPRECATED: Migrate to get_update_feed(). Will remove in 6.0 or later. def __getattr__(name: str): if name == 'update_feed': warnings.warn('update_feed is deprecated, and will be removed in 6.0 or later. ' diff --git a/l10n.py b/l10n.py index 79bab04a..5798a1af 100755 --- a/l10n.py +++ b/l10n.py @@ -86,8 +86,7 @@ class Translations: Use when translation is not desired or not available """ self.translations = {None: {}} - # WARNING: '_' is Deprecated. Will be removed in 6.0 or later. - # Migrate to calling translations.translate or tr.tl directly. + # DEPRECATED: Migrate to translations.translate or tr.tl. Will remove in 6.0 or later. builtins.__dict__['_'] = lambda x: str(x).replace(r'\"', '"').replace('{CR}', '\n') def install(self, lang: str | None = None) -> None: # noqa: CCR001 @@ -131,8 +130,7 @@ class Translations: except Exception: logger.exception(f'Exception occurred while parsing {lang}.strings in plugin {plugin}') - # WARNING: '_' is Deprecated. Will be removed in 6.0 or later. - # Migrate to calling translations.translate or tr.tl directly. + # DEPRECATED: Migrate to translations.translate or tr.tl. Will remove in 6.0 or later. builtins.__dict__['_'] = self.translate def contents(self, lang: str, plugin_path: str | None = None) -> dict[str, str]: @@ -262,14 +260,17 @@ class Translations: class _Locale: """Locale holds a few utility methods to convert data to and from localized versions.""" - def stringFromNumber(self, number: float | int, decimals: int | None = None) -> str: # noqa: N802 + # DEPRECATED: Migrate to _Locale.string_from_number. Will remove in 6.0 or later. + def stringFromNumber(self, number: float | int, decimals: int | None = None) -> str: # noqa: warnings.warn('use _Locale.string_from_number instead.', DeprecationWarning, stacklevel=2) return self.string_from_number(number, decimals) # type: ignore + # DEPRECATED: Migrate to _Locale.number_from_string. Will remove in 6.0 or later. def numberFromString(self, string: str) -> int | float | None: # noqa: N802 warnings.warn('use _Locale.number_from_string instead.', DeprecationWarning, stacklevel=2) return self.number_from_string(string) + # DEPRECATED: Migrate to _Locale.preferred_languages. Will remove in 6.0 or later. def preferredLanguages(self) -> Iterable[str]: # noqa: N802 warnings.warn('use _Locale.preferred_languages instead.', DeprecationWarning, stacklevel=2) return self.preferred_languages() @@ -362,8 +363,8 @@ Locale = _Locale() translations = Translations() -# WARNING: 'Translations' singleton is deprecated. Will be removed in 6.0 or later. -# Migrate to importing 'translations'. +# DEPRECATED: Migrate to `translations`. Will be removed in 6.0 or later. +# 'Translations' singleton is deprecated. # Begin Deprecation Zone class _Translations(Translations): def __init__(self): diff --git a/myNotebook.py b/myNotebook.py index d8b2b41b..c57a6deb 100644 --- a/myNotebook.py +++ b/myNotebook.py @@ -125,6 +125,7 @@ class EntryMenu(ttk.Entry): class Entry(EntryMenu): """Custom ttk.Entry class to fix some display issues.""" + # DEPRECATED: Migrate to EntryMenu. Will remove in 6.0 or later. def __init__(self, master: ttk.Frame | None = None, **kw): warnings.warn('Migrate to EntryMenu. Will remove in 6.0 or later.', DeprecationWarning, stacklevel=2) EntryMenu.__init__(self, master, **kw) @@ -143,6 +144,7 @@ class Button(ttk.Button): class ColoredButton(tk.Button): """Custom tk.Button class to fix some display issues.""" + # DEPRECATED: Migrate to tk.Button. Will remove in 6.0 or later. def __init__(self, master: ttk.Frame | None = None, **kw): warnings.warn('Migrate to tk.Button. Will remove in 6.0 or later.', DeprecationWarning, stacklevel=2) tk.Button.__init__(self, master, **kw) diff --git a/prefs.py b/prefs.py index 136b52de..9f2062f4 100644 --- a/prefs.py +++ b/prefs.py @@ -38,7 +38,7 @@ logger = get_main_logger() # May be imported by plugins - +# DEPRECATED: Migrate to open_log_folder. Will remove in 6.0 or later. def help_open_log_folder() -> None: """Open the folder logs are stored in.""" warnings.warn('prefs.help_open_log_folder is deprecated, use open_log_folder instead. ' From f56302e5077c213b63d5f584ce584651f4689c39 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 9 Jun 2024 15:56:44 -0400 Subject: [PATCH 316/425] [2255] Fix Removed Comment --- l10n.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/l10n.py b/l10n.py index 5798a1af..8613244f 100755 --- a/l10n.py +++ b/l10n.py @@ -261,7 +261,7 @@ class _Locale: """Locale holds a few utility methods to convert data to and from localized versions.""" # DEPRECATED: Migrate to _Locale.string_from_number. Will remove in 6.0 or later. - def stringFromNumber(self, number: float | int, decimals: int | None = None) -> str: # noqa: + def stringFromNumber(self, number: float | int, decimals: int | None = None) -> str: # noqa: N802 warnings.warn('use _Locale.string_from_number instead.', DeprecationWarning, stacklevel=2) return self.string_from_number(number, decimals) # type: ignore From 5d433884393a45514bc587e78fc7f92ba8bd1a26 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 9 Jun 2024 17:26:19 -0400 Subject: [PATCH 317/425] [RELEASE] 5.11.1 --- ChangeLog.md | 10 ++++++---- config/__init__.py | 3 +-- update.py | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index c4fd2f2b..664f95f8 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,15 +6,17 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- -Pre-Release 5.11.1-beta0 +Release 5.11.1 === -This is a release candidate for 5.11.1. - -This release fixes a bug regarding FDevID files when running from Source in a non-writable location. +This release fixes a bug regarding FDevID files when running from Source in a non-writable location. Additionally, +Deprecation Warnings are now more visible to aid in plugin development. **Changes and Enhancements** * Added a check on Git Pushes to check for updated translation strings for developers +* Enabled deprecation warnings to pass to plugins and logs +* Updated Dependencies +* Replaced infi.systray with drop-in replacement simplesystray **Bug Fixes** * Fixed a bug that could result in the program not updating or writing FDevID files when running from source in a location where the running user can't write to diff --git a/config/__init__.py b/config/__init__.py index b4dec93a..8dfcf46b 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -30,7 +30,6 @@ __all__ = [ 'AbstractConfig', 'config', 'get_update_feed', - 'update_feed' ] import abc @@ -53,7 +52,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.11.1-beta0' +_static_appversion = '5.11.1' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' diff --git a/update.py b/update.py index adf118e4..adef9a80 100644 --- a/update.py +++ b/update.py @@ -197,7 +197,7 @@ class Updater: def check_appcast(self) -> EDMCVersion | None: """ - Manually (no Sparkle or WinSparkle) check the update_feed appcast file. + Manually (no Sparkle or WinSparkle) check the get_update_feed() appcast file. Checks if any listed version is semantically greater than the current running version. From 1a12288f74e60a5f24d80a2d7cd508da5ef9f127 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 9 Jun 2024 17:47:34 -0400 Subject: [PATCH 318/425] [Minor] Update Changelog Details --- ChangeLog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 664f95f8..1c2ac9c2 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,6 +1,6 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in reverse chronological order (latest first). --- -* We currently test against, and package with, Python 3.11.7, 32-bit. +* We currently test against, and package with, Python 3.11.9, 32-bit. * As a result, we do not support Windows 7, 8, or 8.1. * Developers can check the contents of the `.python-version` file in the source (not distributed with the Windows installer) for the From 3290cd63991be85aaee632929b36cd947aca3071 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 9 Jun 2024 19:15:46 -0400 Subject: [PATCH 319/425] [2256] Allow Variable Num of Variables --- EDMarketConnector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index cd76ccc0..1b138dd8 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -454,7 +454,7 @@ class AppWindow: if sys.platform == 'win32': from simplesystray import SysTrayIcon - def open_window(systray: 'SysTrayIcon') -> None: + def open_window(systray: 'SysTrayIcon', *args) -> None: self.w.deiconify() menu_options = (("Open", None, open_window),) From b10548da578374e1ca33b57b51636d8b088d8e41 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 9 Jun 2024 19:23:00 -0400 Subject: [PATCH 320/425] [LANG] Update Translations --- L10n/ru.strings | 12 ++++++++++++ L10n/sr-Latn-BA.strings | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/L10n/ru.strings b/L10n/ru.strings index f16ca3a6..e90f3e3b 100644 --- a/L10n/ru.strings +++ b/L10n/ru.strings @@ -1,3 +1,15 @@ +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Ошибка в системном профайлере"; + +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: Неполная информация о корабле-носителе"; + +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: Нет данных о корабле-носителе"; + +/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ +"Enable Fleet Carrier CAPI Queries" = "Включить запросы к CAPI о корабле-носителе"; + /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Отправить журнал полетов и статус командира в EDSM"; diff --git a/L10n/sr-Latn-BA.strings b/L10n/sr-Latn-BA.strings index c861be2a..85b7e5aa 100644 --- a/L10n/sr-Latn-BA.strings +++ b/L10n/sr-Latn-BA.strings @@ -5,7 +5,7 @@ "CAPI: Fleet Carrier data incomplete" = "CAPI: Fleet Carrier podaci nisu kompletni"; /* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No Fleet Carrier data returned" = "CAPI: Fleet Carrier nisu dobijeni"; +"CAPI: No Fleet Carrier data returned" = "CAPI: Fleet Carrier podaci nisu dobijeni"; /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ "Enable Fleet Carrier CAPI Queries" = "Omogući Fleet Carrier CAPI upite"; From d4b7173cf4a36a90d3fa3c1092b13fc3edc2c85f Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 9 Jun 2024 20:50:30 -0400 Subject: [PATCH 321/425] [525] Update Reddit and HTML Changelog --- .gitignore | 3 +- requirements-dev.txt | 2 +- scripts/build_changelog.py | 107 +++++++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 scripts/build_changelog.py diff --git a/.gitignore b/.gitignore index 778820c6..1df2f666 100644 --- a/.gitignore +++ b/.gitignore @@ -9,8 +9,9 @@ build dist.win32/ dist.* -# Ignore generated ChangeLog.html file +# Ignore generated ChangeLog files ChangeLog.html +/scripts/script_output # Ignore files dump diff --git a/requirements-dev.txt b/requirements-dev.txt index 7c8e1ef5..05c5ad29 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -31,7 +31,7 @@ autopep8==2.2.0 pre-commit==3.7.1 # HTML changelogs -grip==4.6.2 +mistune==3.0.2 # Packaging # We only need py2exe on windows. diff --git a/scripts/build_changelog.py b/scripts/build_changelog.py new file mode 100644 index 00000000..ce266fd7 --- /dev/null +++ b/scripts/build_changelog.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python3 +# flake8: noqa +""" +build_changelog.py - Read the latest changelog file and format for the Forums and Reddit. + +Copyright (c) EDCD, All Rights Reserved +Licensed under the GNU General Public License. +See LICENSE file. +""" +import pathlib +import re +from os import chdir +import mistune + + +def get_changelog() -> str: + """Pull the last full changelog details in MD.""" + with open("../CHANGELOG.md", encoding="utf-8") as changelog_file: + content = changelog_file.read() + changelog_list: list = content.split("---", maxsplit=2) + changelog = changelog_list[2] + changelog_list = changelog.split("===", maxsplit=2) + changelog_list[0] = changelog_list[0].rstrip() + changelog_list[0] = changelog_list[0].lstrip() + changelog_list[0] += "\n===" + changelog_list[1] = changelog_list[1].rstrip() + changelog_list[1] = "\n".join(changelog_list[1].split("\n")[:-2]) + changelog = changelog_list[0] + changelog_list[1] + changelog = changelog.rstrip() + return changelog + + +def build_html(md_changelog) -> None: + html_out = mistune.html(md_changelog) + html_out = re.sub("h1", "h2", html_out) + html_out += "\n
" + with open("script_output/html_changelog.txt", "w", encoding="utf-8") as html_file: + html_file.write(html_out) + + +def build_reddit( + md_changelog: str, vt_signed: str, vt_unsigned: str, version: str, gh_link: str +) -> None: + reddit_start = """# What Is Elite Dangerous Market Connector? + +Elite Dangerous Market Connector ("EDMC") is a third-party application for use with Frontier Developments' game "Elite Dangerous". Its purpose is to facilitate supplying certain game data to, and in some cases retrieving it from, a number of websites and other tools. + +To achieve this it utilizes the Journal Files written by the game when played on a PC. It also makes use of Frontier's Companion API ("Frontier's CAPI"), accessible once you've authorized this application. + +EDMC has a plugin system that many other developers have made use of to extend its functionality. + +Find out more on the [EDMC Wiki](https://github.com/EDCD/EDMarketConnector/wiki). + +~~----------------------------------------------------~~ + +You can also view the Elite: Dangerous Forum thread [HERE](https://forums.frontier.co.uk/threads/elite-dangerous-market-connector-edmc.618708/). + +~~----------------------------------------------------~~ + +**As has become routine now, various anti-virus software are reporting a false positive on our installer and/or files it contains. We've pre-emptively uploaded the installer to** [VirusTotal]( +""" + reddit_mid_1 = """) **if you want to check what it's saying. Please see our** [Troubleshooting/AV-false-positives FAQ](https://github.com/EDCD/EDMarketConnector/wiki/Troubleshooting#installer-and-or-executables-flagged-as-malicious-viruses) **for further information.** + +[Unsigned Installer](""" + + reddit_mid_2 = """) if you don't want to use the code-signed option. + +~~----------------------------------------------------~~ +""" + versionsearch = f"Release {version}" + updated = f"# [Release {version}]({gh_link})" + md_changelog = re.sub("===\n", "", md_changelog) + md_changelog = re.sub(versionsearch, updated, md_changelog) + reddit_end = f""" + +**Linux** + +If you're running on Linux, try the [Flatpak](https://flathub.org/apps/io.edcd.EDMarketConnector) build of EDMC! (Update to {version} coming soon.)""" + + reddit_out = ( + reddit_start + + vt_signed + + reddit_mid_1 + + vt_unsigned + + reddit_mid_2 + + md_changelog + + reddit_end + ) + with open( + "script_output/reddit_changelog.txt", "w", encoding="utf-8" + ) as reddit_file: + reddit_file.write(reddit_out) + + +def main() -> None: + vt_signed = input("Please enter the VirusTotal URL for the Signed Installer: ") + vt_unsigned = input("Please enter the VirusTotal URL for the Unsigned Installer: ") + version = input("Please enter the version of EDMC: ") + gh_link = input(f"Please enter the GitHub link for {version}: ") + md_changelog = get_changelog() + build_reddit(md_changelog, vt_signed, vt_unsigned, version, gh_link) + build_html(md_changelog) + + +if __name__ == "__main__": + chdir(pathlib.Path(__file__).parent) + main() From 340c9818fcecc60af66f14f405342d50f79c8cbf Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 9 Jun 2024 21:22:24 -0400 Subject: [PATCH 322/425] [525] Add FDEV Forum Post --- scripts/build_changelog.py | 65 ++++++++++++++++++++++++++++++++++---- 1 file changed, 58 insertions(+), 7 deletions(-) diff --git a/scripts/build_changelog.py b/scripts/build_changelog.py index ce266fd7..c4772a83 100644 --- a/scripts/build_changelog.py +++ b/scripts/build_changelog.py @@ -13,7 +13,7 @@ from os import chdir import mistune -def get_changelog() -> str: +def get_changelog() -> tuple[str, str]: """Pull the last full changelog details in MD.""" with open("../CHANGELOG.md", encoding="utf-8") as changelog_file: content = changelog_file.read() @@ -27,15 +27,65 @@ def get_changelog() -> str: changelog_list[1] = "\n".join(changelog_list[1].split("\n")[:-2]) changelog = changelog_list[0] + changelog_list[1] changelog = changelog.rstrip() - return changelog + version = changelog.split("\n")[0] + version = version.split(" ")[1] + return changelog, version -def build_html(md_changelog) -> None: +def build_html(md_changelog) -> str: html_out = mistune.html(md_changelog) html_out = re.sub("h1", "h2", html_out) html_out += "\n
" with open("script_output/html_changelog.txt", "w", encoding="utf-8") as html_file: html_file.write(html_out) + return html_out + + +def build_fdev( + vt_signed: str, + vt_unsigned: str, + version: str, + gh_link: str, + html: str, +) -> None: + fdev_out = ( + "[HEADING=2][URL='" + + gh_link + + "'][SIZE=7]Release " + + version + + "[/SIZE][/URL][/HEADING]\n[URL='" + + vt_signed + ) + fdev_out += ( + "']Pre-emptive upload to VirusTotal[/URL]. ([URL='" + + vt_unsigned + + "']Unsigned Installer[/URL])\n\n" + ) + + if version.startswith("Pre-Release") or version.startswith("Beta"): + fdev_out += f'This is a release candidate for {version}. It has been pushed to the "Beta" track for updates!' + fdev_out += ( + '\n\nFor more information on the "Beta" update track, please read ' + "[URL='https://github.com/EDCD/EDMarketConnector/wiki/Participating-in-Open-Betas-of-EDMC']" + "This Wiki Article[/URL]. Questions and comments are welcome!\n\n" + ) + changelog_trim = html.split("\n", maxsplit=1) + md_log = changelog_trim[1] + md_log = re.sub("

", "", md_log) + md_log = re.sub("

", "", md_log) + md_log = re.sub("", "\n[HEADING=3]", md_log) + md_log = re.sub("", "[/HEADING]", md_log) + md_log = re.sub("
    ", "[LIST]", md_log) + md_log = re.sub("
  • ", "[*]", md_log) + md_log = re.sub("
  • ", "", md_log) + md_log = re.sub("", "[ICODE]", md_log) + md_log = re.sub("", "[/ICODE]", md_log) + md_log = re.sub("
\n", "[/LIST]", md_log) + fdev_out += md_log + + with open("script_output/fdev_changelog.txt", "w", encoding="utf-8") as fdev_file: + fdev_file.write(fdev_out) + return def build_reddit( @@ -93,13 +143,14 @@ If you're running on Linux, try the [Flatpak](https://flathub.org/apps/io.edcd.E def main() -> None: + md_changelog, version = get_changelog() + print(f"Detected version {version} in the changelog. Continuing...") + gh_link = input(f"Please enter the GitHub link for {version}: ") vt_signed = input("Please enter the VirusTotal URL for the Signed Installer: ") vt_unsigned = input("Please enter the VirusTotal URL for the Unsigned Installer: ") - version = input("Please enter the version of EDMC: ") - gh_link = input(f"Please enter the GitHub link for {version}: ") - md_changelog = get_changelog() build_reddit(md_changelog, vt_signed, vt_unsigned, version, gh_link) - build_html(md_changelog) + html = build_html(md_changelog) + build_fdev(vt_signed, vt_unsigned, version, gh_link, html) if __name__ == "__main__": From 33f8e9c83707431ca5e4cd1f16120d0220ad1d1f Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 9 Jun 2024 21:51:56 -0400 Subject: [PATCH 323/425] [525] Cleanup Script --- scripts/build_changelog.py | 125 ++++++++++++++++++++----------------- 1 file changed, 66 insertions(+), 59 deletions(-) diff --git a/scripts/build_changelog.py b/scripts/build_changelog.py index c4772a83..f0c01994 100644 --- a/scripts/build_changelog.py +++ b/scripts/build_changelog.py @@ -7,6 +7,7 @@ Copyright (c) EDCD, All Rights Reserved Licensed under the GNU General Public License. See LICENSE file. """ + import pathlib import re from os import chdir @@ -15,82 +16,87 @@ import mistune def get_changelog() -> tuple[str, str]: """Pull the last full changelog details in MD.""" - with open("../CHANGELOG.md", encoding="utf-8") as changelog_file: - content = changelog_file.read() - changelog_list: list = content.split("---", maxsplit=2) - changelog = changelog_list[2] - changelog_list = changelog.split("===", maxsplit=2) - changelog_list[0] = changelog_list[0].rstrip() - changelog_list[0] = changelog_list[0].lstrip() - changelog_list[0] += "\n===" - changelog_list[1] = changelog_list[1].rstrip() - changelog_list[1] = "\n".join(changelog_list[1].split("\n")[:-2]) - changelog = changelog_list[0] + changelog_list[1] - changelog = changelog.rstrip() - version = changelog.split("\n")[0] - version = version.split(" ")[1] - return changelog, version + try: + with open("../CHANGELOG.md", encoding="utf-8") as changelog_file: + content = changelog_file.read() + except FileNotFoundError as exc: + raise FileNotFoundError("Changelog file not found.") from exc + + changelog_list = content.split("---", maxsplit=2) + if len(changelog_list) < 3: + raise ValueError("Changelog format is incorrect.") + + changelog = changelog_list[2].split("===", maxsplit=2) + if len(changelog) < 2: + raise ValueError("Changelog format is incorrect.") + + changelog[0] = changelog[0].strip() + changelog[1] = "\n".join(changelog[1].strip().split("\n")[:-2]) + version = changelog[0] + version = version.split(" ")[1] + changelog = changelog[1].strip() + + return changelog, version -def build_html(md_changelog) -> str: - html_out = mistune.html(md_changelog) - html_out = re.sub("h1", "h2", html_out) - html_out += "\n
" +def build_html(md_changelog: str, version: str) -> str: + """Convert markdown changelog to HTML.""" + html_out = f"

Release {version}

\n" + html_out += mistune.html(md_changelog) + html_out = re.sub(r"h1", "h2", html_out) + "\n
" + with open("script_output/html_changelog.txt", "w", encoding="utf-8") as html_file: html_file.write(html_out) + return html_out +def format_fdev(md_log: str) -> str: + """Format changelog for FDEV forums.""" + md_log = re.sub(r"

|

", "", md_log) + md_log = re.sub(r"", "\n[HEADING=3]", md_log) + md_log = re.sub(r"", "[/HEADING]", md_log) + md_log = re.sub(r"
    ", "[LIST]", md_log) + md_log = re.sub(r"
  • ", "[*]", md_log) + md_log = re.sub(r"
  • ", "", md_log) + md_log = re.sub(r"", "[ICODE]", md_log) + md_log = re.sub(r"", "[/ICODE]", md_log) + md_log = re.sub(r"
\n", "[/LIST]", md_log) + md_log = re.sub(r"
", "", md_log) + md_log = re.sub(r"Changes and Enhancements", "What's Changed", md_log) + return md_log + + def build_fdev( - vt_signed: str, - vt_unsigned: str, - version: str, - gh_link: str, - html: str, + vt_signed: str, vt_unsigned: str, version: str, gh_link: str, html: str ) -> None: + """Build changelog for FDEV forums.""" fdev_out = ( - "[HEADING=2][URL='" - + gh_link - + "'][SIZE=7]Release " - + version - + "[/SIZE][/URL][/HEADING]\n[URL='" - + vt_signed - ) - fdev_out += ( - "']Pre-emptive upload to VirusTotal[/URL]. ([URL='" - + vt_unsigned - + "']Unsigned Installer[/URL])\n\n" + f"[HEADING=2][URL='{gh_link}'][SIZE=7]Release {version}[/SIZE][/URL][/HEADING]\n" + f"[URL='{vt_signed}']Pre-emptive upload to VirusTotal[/URL]. " + f"([URL='{vt_unsigned}']Unsigned Installer[/URL])\n\n" ) - if version.startswith("Pre-Release") or version.startswith("Beta"): - fdev_out += f'This is a release candidate for {version}. It has been pushed to the "Beta" track for updates!' + if version.startswith(("Pre-Release", "Beta")): fdev_out += ( - '\n\nFor more information on the "Beta" update track, please read ' + f'This is a release candidate for {version}. It has been pushed to the "Beta" track for updates!\n\n' + 'For more information on the "Beta" update track, please read ' "[URL='https://github.com/EDCD/EDMarketConnector/wiki/Participating-in-Open-Betas-of-EDMC']" "This Wiki Article[/URL]. Questions and comments are welcome!\n\n" ) - changelog_trim = html.split("\n", maxsplit=1) - md_log = changelog_trim[1] - md_log = re.sub("

", "", md_log) - md_log = re.sub("

", "", md_log) - md_log = re.sub("", "\n[HEADING=3]", md_log) - md_log = re.sub("", "[/HEADING]", md_log) - md_log = re.sub("
    ", "[LIST]", md_log) - md_log = re.sub("
  • ", "[*]", md_log) - md_log = re.sub("
  • ", "", md_log) - md_log = re.sub("", "[ICODE]", md_log) - md_log = re.sub("", "[/ICODE]", md_log) - md_log = re.sub("
\n", "[/LIST]", md_log) + + md_log = html.split("\n", maxsplit=1)[1] + md_log = format_fdev(md_log) fdev_out += md_log with open("script_output/fdev_changelog.txt", "w", encoding="utf-8") as fdev_file: fdev_file.write(fdev_out) - return def build_reddit( md_changelog: str, vt_signed: str, vt_unsigned: str, version: str, gh_link: str ) -> None: + """Build changelog for Reddit.""" reddit_start = """# What Is Elite Dangerous Market Connector? Elite Dangerous Market Connector ("EDMC") is a third-party application for use with Frontier Developments' game "Elite Dangerous". Its purpose is to facilitate supplying certain game data to, and in some cases retrieving it from, a number of websites and other tools. @@ -107,9 +113,8 @@ You can also view the Elite: Dangerous Forum thread [HERE](https://forums.fronti ~~----------------------------------------------------~~ -**As has become routine now, various anti-virus software are reporting a false positive on our installer and/or files it contains. We've pre-emptively uploaded the installer to** [VirusTotal]( -""" - reddit_mid_1 = """) **if you want to check what it's saying. Please see our** [Troubleshooting/AV-false-positives FAQ](https://github.com/EDCD/EDMarketConnector/wiki/Troubleshooting#installer-and-or-executables-flagged-as-malicious-viruses) **for further information.** +**As has become routine now, various anti-virus software are reporting a false positive on our installer and/or files it contains. We've pre-emptively uploaded the installer to** [VirusTotal](""" + reddit_mid_1 = """) **if you want to check what it's saying. Please see our** [Troubleshooting/AV-false-positives FAQ](https://github.com/EDCD/EDMarketConnector/wiki/Troubleshooting#installer-and-or-executables-flagged-as-malicious-viruses) **for further information.** [Unsigned Installer](""" @@ -117,10 +122,9 @@ You can also view the Elite: Dangerous Forum thread [HERE](https://forums.fronti ~~----------------------------------------------------~~ """ - versionsearch = f"Release {version}" - updated = f"# [Release {version}]({gh_link})" - md_changelog = re.sub("===\n", "", md_changelog) - md_changelog = re.sub(versionsearch, updated, md_changelog) + updated = f"# [Release {version}]({gh_link})\n\n" + md_changelog = re.sub(r"===\n", "", md_changelog) + md_changelog = re.sub(f"Release {version}", updated, md_changelog) reddit_end = f""" **Linux** @@ -133,9 +137,11 @@ If you're running on Linux, try the [Flatpak](https://flathub.org/apps/io.edcd.E + reddit_mid_1 + vt_unsigned + reddit_mid_2 + + updated + md_changelog + reddit_end ) + with open( "script_output/reddit_changelog.txt", "w", encoding="utf-8" ) as reddit_file: @@ -143,13 +149,14 @@ If you're running on Linux, try the [Flatpak](https://flathub.org/apps/io.edcd.E def main() -> None: + """Run the Changelog Generator""" md_changelog, version = get_changelog() print(f"Detected version {version} in the changelog. Continuing...") gh_link = input(f"Please enter the GitHub link for {version}: ") vt_signed = input("Please enter the VirusTotal URL for the Signed Installer: ") vt_unsigned = input("Please enter the VirusTotal URL for the Unsigned Installer: ") build_reddit(md_changelog, vt_signed, vt_unsigned, version, gh_link) - html = build_html(md_changelog) + html = build_html(md_changelog, version) build_fdev(vt_signed, vt_unsigned, version, gh_link, html) From 74af852fca8786ebaa463990b29a54f2b44468f6 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 10 Jun 2024 09:43:00 -0400 Subject: [PATCH 324/425] [2215] Move Logging Directory --- EDMCLogging.py | 5 +---- EDMarketConnector.py | 10 ++++++---- debug_webserver.py | 6 ++---- prefs.py | 6 ++---- 4 files changed, 11 insertions(+), 16 deletions(-) diff --git a/EDMCLogging.py b/EDMCLogging.py index b6d4b353..c09de41e 100644 --- a/EDMCLogging.py +++ b/EDMCLogging.py @@ -41,7 +41,6 @@ import logging import logging.handlers import os import pathlib -import tempfile import warnings from contextlib import suppress from fnmatch import fnmatch @@ -51,7 +50,6 @@ from threading import get_native_id as thread_native_id from time import gmtime from traceback import print_exc from typing import TYPE_CHECKING, cast - import config as config_mod from config import appcmdname, appname, config @@ -184,8 +182,7 @@ class Logger: # We want the files in %TEMP%\{appname}\ as {logger_name}-debug.log and # rotated versions. # This is {logger_name} so that EDMC.py logs to a different file. - logfile_rotating = pathlib.Path(tempfile.gettempdir()) - logfile_rotating /= f'{appname}' + logfile_rotating = pathlib.Path(config.app_dir_path / 'logs') logfile_rotating.mkdir(exist_ok=True) logfile_rotating /= f'{logger_name}-debug.log' diff --git a/EDMarketConnector.py b/EDMarketConnector.py index cd76ccc0..609cc2e9 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -20,7 +20,6 @@ import subprocess import sys import threading import webbrowser -import tempfile from os import chdir, environ, path from time import localtime, strftime, time from typing import TYPE_CHECKING, Any, Literal @@ -42,16 +41,19 @@ else: # not frozen. chdir(pathlib.Path(__file__).parent) - # config will now cause an appname logger to be set up, so we need the # console redirect before this if __name__ == '__main__': # Keep this as the very first code run to be as sure as possible of no # output until after this redirect is done, if needed. if getattr(sys, 'frozen', False): + from config import config # By default py2exe tries to write log to dirname(sys.executable) which fails when installed # unbuffered not allowed for text in python3, so use `1 for line buffering - log_file_path = path.join(tempfile.gettempdir(), f'{appname}.log') + log_file_path = pathlib.Path(config.app_dir_path / 'logs') + log_file_path.mkdir(exist_ok=True) + log_file_path /= f'{appname}.log' + sys.stdout = sys.stderr = open(log_file_path, mode='wt', buffering=1) # Do NOT use WITH here. # TODO: Test: Make *sure* this redirect is working, else py2exe is going to cause an exit popup @@ -619,7 +621,7 @@ class AppWindow: self.help_menu.add_command(command=lambda: self.updater.check_for_updates()) # Check for Updates... # About E:D Market Connector self.help_menu.add_command(command=lambda: not self.HelpAbout.showing and self.HelpAbout(self.w)) - logfile_loc = pathlib.Path(tempfile.gettempdir()) / appname + logfile_loc = pathlib.Path(config.app_dir_path / 'logs') self.help_menu.add_command(command=lambda: prefs.open_folder(logfile_loc)) # Open Log Folder self.help_menu.add_command(command=lambda: prefs.help_open_system_profiler(self)) # Open Log Folde diff --git a/debug_webserver.py b/debug_webserver.py index 87f7eaed..eeedce97 100644 --- a/debug_webserver.py +++ b/debug_webserver.py @@ -4,20 +4,18 @@ from __future__ import annotations import gzip import json import pathlib -import tempfile import threading import zlib from http import server from typing import Any, Callable, Literal from urllib.parse import parse_qs - -from config import appname +import config from EDMCLogging import get_main_logger logger = get_main_logger() output_lock = threading.Lock() -output_data_path = pathlib.Path(tempfile.gettempdir()) / f'{appname}' / 'http_debug' +output_data_path = pathlib.Path(config.app_dir_path / 'logs' / 'http_debug') SAFE_TRANSLATE = str.maketrans({x: '_' for x in "!@#$%^&*()./\\\r\n[]-+='\";:?<>,~`"}) diff --git a/prefs.py b/prefs.py index 9f2062f4..f07a41db 100644 --- a/prefs.py +++ b/prefs.py @@ -7,7 +7,6 @@ import logging import pathlib import subprocess import sys -import tempfile import tkinter as tk import warnings from os import system @@ -20,7 +19,6 @@ import myNotebook as nb # noqa: N813 import plug from config import appversion_nobuild, config from EDMCLogging import edmclogger, get_main_logger -from constants import appname from hotkey import hotkeymgr from l10n import translations as tr from monitor import monitor @@ -43,7 +41,7 @@ def help_open_log_folder() -> None: """Open the folder logs are stored in.""" warnings.warn('prefs.help_open_log_folder is deprecated, use open_log_folder instead. ' 'This function will be removed in 6.0 or later', DeprecationWarning, stacklevel=2) - open_folder(pathlib.Path(tempfile.gettempdir()) / appname) + open_folder(pathlib.Path(config.app_dir_path / 'logs')) def open_folder(file: pathlib.Path) -> None: @@ -323,7 +321,7 @@ class PreferencesDialog(tk.Toplevel): self.geometry(f"+{position.left}+{position.top}") # Set Log Directory - self.logfile_loc = pathlib.Path(tempfile.gettempdir()) / appname + self.logfile_loc = pathlib.Path(config.app_dir_path / 'logs') # Set minimum size to prevent content cut-off self.update_idletasks() # Update "requested size" from geometry manager From c198108700df9aa6b9fa0438219e505e71c1afd5 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 10 Jun 2024 12:55:58 -0400 Subject: [PATCH 325/425] [748] Establish EDMC Shutdown Mechanism --- EDMarketConnector.py | 12 +++++++++++- prefs.py | 18 +++++++++++------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index cd76ccc0..2582f570 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -845,9 +845,19 @@ class AppWindow: ) update_msg = update_msg.replace('\\n', '\n') update_msg = update_msg.replace('\\r', '\r') - stable_popup = tk.messagebox.askyesno(title=title, message=update_msg, parent=postargs.get('Parent')) + stable_popup = tk.messagebox.askyesno(title=title, message=update_msg) if stable_popup: webbrowser.open("https://github.com/edCD/eDMarketConnector/releases/latest") + if postargs.get('Restart_Req'): + restart_msg = tr.tl('A restart of EDMC is required. EDMC will now shut down.') + restart_box = tk.messagebox.Message( + title=tr.tl('Restart Required'), + message=restart_msg, + type=tk.messagebox.OK + ) + restart_box.show() + if restart_box: + app.onexit() def set_labels(self): """Set main window labels, e.g. after language change.""" diff --git a/prefs.py b/prefs.py index 9f2062f4..dffe71b9 100644 --- a/prefs.py +++ b/prefs.py @@ -239,6 +239,7 @@ class PreferencesDialog(tk.Toplevel): self.parent = parent self.callback = callback + self.req_restart = False # LANG: File > Settings (macOS) self.title(tr.tl('Settings')) @@ -1274,19 +1275,22 @@ class PreferencesDialog(tk.Toplevel): config.set('dark_highlight', self.theme_colors[1]) theme.apply(self.parent) - # Send to the Post Config if we updated the update branch - post_flags = { - 'Update': True if self.curr_update_track != self.update_paths.get() else False, - 'Track': self.update_paths.get(), - 'Parent': self - } # Notify if self.callback: - self.callback(**post_flags) + self.callback() plug.notify_prefs_changed(monitor.cmdr, monitor.is_beta) self._destroy() + # Send to the Post Config if we updated the update branch or need to restart + post_flags = { + 'Update': True if self.curr_update_track != self.update_paths.get() else False, + 'Track': self.update_paths.get(), + 'Parent': self, + 'Restart_Req': True if self.req_restart else False + } + if self.callback: + self.callback(**post_flags) def _destroy(self) -> None: """widget.destroy wrapper that does some extra cleanup.""" From fe8818d187be86c85358c35d81062425b850dca1 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 10 Jun 2024 17:21:06 -0400 Subject: [PATCH 326/425] [2114] Apply PathLib Handover --- EDMC.py | 11 +++++--- EDMCLogging.py | 7 ++--- EDMCSystemProfiler.py | 17 ++++++------ EDMarketConnector.py | 16 ++++++------ build.py | 19 +++++++------- collate.py | 15 +++++------ commodity.py | 4 +-- companion.py | 5 ++-- dashboard.py | 9 ++++--- docs/examples/plugintest/load.py | 14 +++++----- installer.py | 12 ++++----- l10n.py | 44 ++++++++++++++++---------------- loadout.py | 6 ++--- monitor.py | 36 +++++++++++++------------- plug.py | 22 ++++++++++------ prefs.py | 18 ++++++------- theme.py | 5 ++-- ttkHyperlinkLabel.py | 3 +-- 18 files changed, 137 insertions(+), 126 deletions(-) diff --git a/EDMC.py b/EDMC.py index 6b72c7d1..55236b9c 100755 --- a/EDMC.py +++ b/EDMC.py @@ -14,6 +14,7 @@ import locale import os import queue import sys +from pathlib import Path from time import sleep, time from typing import TYPE_CHECKING, Any @@ -212,22 +213,24 @@ def main(): # noqa: C901, CCR001 # system, chances are its the current locale, and not utf-8. Otherwise if it was copied, its probably # utf8. Either way, try the system FIRST because reading something like cp1251 in UTF-8 results in garbage # but the reverse results in an exception. - json_file = os.path.abspath(args.j) + json_file = Path(args.j).resolve() try: with open(json_file) as file_handle: data = json.load(file_handle) except UnicodeDecodeError: with open(json_file, encoding='utf-8') as file_handle: data = json.load(file_handle) - config.set('querytime', int(os.path.getmtime(args.j))) + file_path = Path(args.j) + modification_time = file_path.stat().st_mtime + config.set('querytime', int(modification_time)) else: # Get state from latest Journal file logger.debug('Getting state from latest journal file') try: - monitor.currentdir = config.get_str('journaldir', default=config.default_journal_dir) + monitor.currentdir = Path(config.get_str('journaldir', default=config.default_journal_dir)) if not monitor.currentdir: - monitor.currentdir = config.default_journal_dir + monitor.currentdir = Path(config.default_journal_dir) logger.debug(f'logdir = "{monitor.currentdir}"') logfile = monitor.journal_newest_filename(monitor.currentdir) diff --git a/EDMCLogging.py b/EDMCLogging.py index b6d4b353..09a01860 100644 --- a/EDMCLogging.py +++ b/EDMCLogging.py @@ -26,12 +26,13 @@ To utilise logging in core code, or internal plugins, include this: To utilise logging in a 'found' (third-party) plugin, include this: - import os + from pathlib import Path import logging - plugin_name = os.path.basename(os.path.dirname(__file__)) + # Retrieve the name of the plugin folder + plugin_name = Path(__file__).resolve().parent.name + # Set up logger with hierarchical name including appname and plugin_name # plugin_name here *must* be the name of the folder the plugin resides in - # See, plug.py:load_plugins() logger = logging.getLogger(f'{appname}.{plugin_name}') """ from __future__ import annotations diff --git a/EDMCSystemProfiler.py b/EDMCSystemProfiler.py index 92502cc8..8b1dcbe5 100644 --- a/EDMCSystemProfiler.py +++ b/EDMCSystemProfiler.py @@ -11,7 +11,7 @@ import locale import webbrowser import platform import sys -from os import chdir, environ, path +from os import chdir, environ import pathlib import logging from journal_lock import JournalLock @@ -19,10 +19,10 @@ from journal_lock import JournalLock if getattr(sys, "frozen", False): # Under py2exe sys.path[0] is the executable name if sys.platform == "win32": - chdir(path.dirname(sys.path[0])) + chdir(pathlib.Path(sys.path[0]).parent) # Allow executable to be invoked from any cwd - environ["TCL_LIBRARY"] = path.join(path.dirname(sys.path[0]), "lib", "tcl") - environ["TK_LIBRARY"] = path.join(path.dirname(sys.path[0]), "lib", "tk") + environ['TCL_LIBRARY'] = str(pathlib.Path(sys.path[0]).parent / 'lib' / 'tcl') + environ['TK_LIBRARY'] = str(pathlib.Path(sys.path[0]).parent / 'lib' / 'tk') else: # We still want to *try* to have CWD be where the main script is, even if @@ -44,11 +44,12 @@ def get_sys_report(config: config.AbstractConfig) -> str: plt = platform.uname() locale.setlocale(locale.LC_ALL, "") lcl = locale.getlocale() - monitor.currentdir = config.get_str( + monitor.currentdir = pathlib.Path(config.get_str( "journaldir", default=config.default_journal_dir + ) ) if not monitor.currentdir: - monitor.currentdir = config.default_journal_dir + monitor.currentdir = pathlib.Path(config.default_journal_dir) try: logfile = monitor.journal_newest_filename(monitor.currentdir) if logfile is None: @@ -115,12 +116,12 @@ def main() -> None: root.withdraw() # Hide the window initially to calculate the dimensions try: icon_image = tk.PhotoImage( - file=path.join(cur_config.respath_path, "io.edcd.EDMarketConnector.png") + file=pathlib.Path(cur_config.respath_path) / "io.edcd.EDMarketConnector.png" ) root.iconphoto(True, icon_image) except tk.TclError: - root.iconbitmap(path.join(cur_config.respath_path, "EDMarketConnector.ico")) + root.iconbitmap(pathlib.Path(cur_config.respath_path) / "EDMarketConnector.ico") sys_report = get_sys_report(cur_config) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index cd76ccc0..f67a4fe1 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -21,7 +21,7 @@ import sys import threading import webbrowser import tempfile -from os import chdir, environ, path +from os import chdir, environ from time import localtime, strftime, time from typing import TYPE_CHECKING, Any, Literal from constants import applongname, appname, protocolhandler_redirect @@ -32,10 +32,10 @@ from constants import applongname, appname, protocolhandler_redirect if getattr(sys, 'frozen', False): # Under py2exe sys.path[0] is the executable name if sys.platform == 'win32': - chdir(path.dirname(sys.path[0])) + os.chdir(pathlib.Path(sys.path[0]).parent) # Allow executable to be invoked from any cwd - environ['TCL_LIBRARY'] = path.join(path.dirname(sys.path[0]), 'lib', 'tcl') - environ['TK_LIBRARY'] = path.join(path.dirname(sys.path[0]), 'lib', 'tk') + environ['TCL_LIBRARY'] = str(pathlib.Path(sys.path[0]).parent / 'lib' / 'tcl') + environ['TK_LIBRARY'] = str(pathlib.Path(sys.path[0]).parent / 'lib' / 'tk') else: # We still want to *try* to have CWD be where the main script is, even if @@ -51,7 +51,7 @@ if __name__ == '__main__': if getattr(sys, 'frozen', False): # By default py2exe tries to write log to dirname(sys.executable) which fails when installed # unbuffered not allowed for text in python3, so use `1 for line buffering - log_file_path = path.join(tempfile.gettempdir(), f'{appname}.log') + log_file_path = pathlib.Path(tempfile.gettempdir()) / f'{appname}.log' sys.stdout = sys.stderr = open(log_file_path, mode='wt', buffering=1) # Do NOT use WITH here. # TODO: Test: Make *sure* this redirect is working, else py2exe is going to cause an exit popup @@ -468,8 +468,8 @@ class AppWindow: self.w.wm_iconbitmap(default='EDMarketConnector.ico') else: - self.w.tk.call('wm', 'iconphoto', self.w, '-default', - tk.PhotoImage(file=path.join(config.respath_path, 'io.edcd.EDMarketConnector.png'))) + image_path = pathlib.Path(config.respath_path) / 'io.edcd.EDMarketConnector.png' + self.w.tk.call('wm', 'iconphoto', self.w, '-default', image=tk.PhotoImage(file=image_path)) # TODO: Export to files and merge from them in future ? self.theme_icon = tk.PhotoImage( @@ -1639,7 +1639,7 @@ class AppWindow: # Avoid file length limits if possible provider = config.get_str('shipyard_provider', default='EDSY') target = plug.invoke(provider, 'EDSY', 'shipyard_url', loadout, monitor.is_beta) - file_name = path.join(config.app_dir_path, "last_shipyard.html") + file_name = pathlib.Path(config.app_dir_path) / "last_shipyard.html" with open(file_name, 'w') as f: f.write(SHIPYARD_HTML_TEMPLATE.format( diff --git a/build.py b/build.py index c5236c5a..224de56f 100644 --- a/build.py +++ b/build.py @@ -10,7 +10,6 @@ import shutil import sys import pathlib from string import Template -from os.path import join, isdir import py2exe from config import ( appcmdname, @@ -37,7 +36,7 @@ def iss_build(template_path: str, output_file: str) -> None: new_file.write(newfile) -def system_check(dist_dir: str) -> str: +def system_check(dist_dir: pathlib.Path) -> str: """Check if the system is able to build.""" if sys.version_info < (3, 11): sys.exit(f"Unexpected Python version {sys.version}") @@ -55,17 +54,17 @@ def system_check(dist_dir: str) -> str: print(f"Git short hash: {git_shorthash}") - if dist_dir and len(dist_dir) > 1 and isdir(dist_dir): + if dist_dir and pathlib.Path.is_dir(dist_dir): shutil.rmtree(dist_dir) return gitversion_file def generate_data_files( app_name: str, gitversion_file: str, plugins: list[str] -) -> list[tuple[str, list[str]]]: +) -> list[tuple[object, object]]: """Create the required datafiles to build.""" l10n_dir = "L10n" - fdevids_dir = "FDevIDs" + fdevids_dir = pathlib.Path("FDevIDs") data_files = [ ( "", @@ -88,13 +87,13 @@ def generate_data_files( ), ( l10n_dir, - [join(l10n_dir, x) for x in os.listdir(l10n_dir) if x.endswith(".strings")], + [pathlib.Path(l10n_dir) / x for x in os.listdir(l10n_dir) if x.endswith(".strings")] ), ( fdevids_dir, [ - join(fdevids_dir, "commodity.csv"), - join(fdevids_dir, "rare_commodity.csv"), + pathlib.Path(fdevids_dir / "commodity.csv"), + pathlib.Path(fdevids_dir / "rare_commodity.csv"), ], ), ("plugins", plugins), @@ -104,7 +103,7 @@ def generate_data_files( def build() -> None: """Build EDMarketConnector using Py2Exe.""" - dist_dir: str = "dist.win32" + dist_dir: pathlib.Path = pathlib.Path("dist.win32") gitversion_filename: str = system_check(dist_dir) # Constants @@ -142,7 +141,7 @@ def build() -> None: } # Function to generate DATA_FILES list - data_files: list[tuple[str, list[str]]] = generate_data_files( + data_files: list[tuple[object, object]] = generate_data_files( appname, gitversion_filename, plugins ) diff --git a/collate.py b/collate.py index 380cb8ba..0a413052 100755 --- a/collate.py +++ b/collate.py @@ -17,7 +17,6 @@ import json import os import pathlib import sys -from os.path import isfile from traceback import print_exc import companion @@ -35,7 +34,7 @@ def __make_backup(file_name: pathlib.Path, suffix: str = '.bak') -> None: """ backup_name = file_name.parent / (file_name.name + suffix) - if isfile(backup_name): + if pathlib.Path.is_file(backup_name): os.unlink(backup_name) os.rename(file_name, backup_name) @@ -58,7 +57,7 @@ def addcommodities(data) -> None: # noqa: CCR001 commodities = {} # slurp existing - if isfile(commodityfile): + if pathlib.Path.is_file(commodityfile): with open(commodityfile) as csvfile: reader = csv.DictReader(csvfile) for row in reader: @@ -86,7 +85,7 @@ def addcommodities(data) -> None: # noqa: CCR001 if len(commodities) <= size_pre: return - if isfile(commodityfile): + if pathlib.Path.is_file(commodityfile): __make_backup(commodityfile) with open(commodityfile, 'w', newline='\n') as csvfile: @@ -109,7 +108,7 @@ def addmodules(data): # noqa: C901, CCR001 fields = ('id', 'symbol', 'category', 'name', 'mount', 'guidance', 'ship', 'class', 'rating', 'entitlement') # slurp existing - if isfile(outfile): + if pathlib.Path.is_file(outfile): with open(outfile) as csvfile: reader = csv.DictReader(csvfile, restval='') for row in reader: @@ -147,7 +146,7 @@ def addmodules(data): # noqa: C901, CCR001 if not len(modules) > size_pre: return - if isfile(outfile): + if pathlib.Path.is_file(outfile): __make_backup(outfile) with open(outfile, 'w', newline='\n') as csvfile: @@ -170,7 +169,7 @@ def addships(data) -> None: # noqa: CCR001 fields = ('id', 'symbol', 'name') # slurp existing - if isfile(shipfile): + if pathlib.Path.is_file(shipfile): with open(shipfile) as csvfile: reader = csv.DictReader(csvfile, restval='') for row in reader: @@ -200,7 +199,7 @@ def addships(data) -> None: # noqa: CCR001 if not len(ships) > size_pre: return - if isfile(shipfile): + if pathlib.Path.is_file(shipfile): __make_backup(shipfile) with open(shipfile, 'w', newline='\n') as csvfile: diff --git a/commodity.py b/commodity.py index 6b167fa1..52c0f8b8 100644 --- a/commodity.py +++ b/commodity.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- import time -from os.path import join +from pathlib import Path from config import config from edmc_data import commodity_bracketmap as bracketmap @@ -29,7 +29,7 @@ def export(data, kind=COMMODITY_DEFAULT, filename=None) -> None: filename_time = time.strftime('%Y-%m-%dT%H.%M.%S', time.localtime(querytime)) filename_kind = 'csv' filename = f'{filename_system}.{filename_starport}.{filename_time}.{filename_kind}' - filename = join(config.get_str('outdir'), filename) + filename = Path(config.get_str('outdir')) / filename if kind == COMMODITY_CSV: sep = ';' # BUG: for fixing later after cleanup diff --git a/companion.py b/companion.py index 775da295..d91fed22 100644 --- a/companion.py +++ b/companion.py @@ -27,6 +27,7 @@ import tkinter as tk import urllib.parse import webbrowser from email.utils import parsedate +from pathlib import Path from queue import Queue from typing import TYPE_CHECKING, Any, Mapping, TypeVar import requests @@ -1135,7 +1136,7 @@ class Session: def dump_capi_data(self, data: CAPIData) -> None: """Dump CAPI data to file for examination.""" - if os.path.isdir('dump'): + if Path('dump').is_dir(): file_name: str = "" if data.source_endpoint == self.FRONTIER_CAPI_PATH_FLEETCARRIER: file_name += f"FleetCarrier.{data['name']['callsign']}" @@ -1203,7 +1204,7 @@ def fixup(data: CAPIData) -> CAPIData: # noqa: C901, CCR001 # Can't be usefully if not commodity_map: # Lazily populate for f in ('commodity.csv', 'rare_commodity.csv'): - if not os.path.isfile(config.app_dir_path / 'FDevIDs/' / f): + if not (Path(config.app_dir_path) / 'FDevIDs' / f).is_file(): logger.warning(f'FDevID file {f} not found! Generating output without these commodity name rewrites.') continue with open(config.app_dir_path / 'FDevIDs' / f, 'r') as csvfile: diff --git a/dashboard.py b/dashboard.py index 4776319c..a57264c0 100644 --- a/dashboard.py +++ b/dashboard.py @@ -12,7 +12,7 @@ import sys import time import tkinter as tk from calendar import timegm -from os.path import getsize, isdir, isfile, join +from pathlib import Path from typing import Any, cast from watchdog.observers.api import BaseObserver from config import config @@ -57,7 +57,7 @@ class Dashboard(FileSystemEventHandler): logdir = config.get_str('journaldir', default=config.default_journal_dir) logdir = logdir or config.default_journal_dir - if not isdir(logdir): + if not Path.is_dir(Path(logdir)): logger.info(f"No logdir, or it isn't a directory: {logdir=}") self.stop() return False @@ -164,7 +164,8 @@ class Dashboard(FileSystemEventHandler): :param event: Watchdog event. """ - if event.is_directory or (isfile(event.src_path) and getsize(event.src_path)): + modpath = Path(event.src_path) + if event.is_directory or (modpath.is_file() and modpath.stat().st_size): # Can get on_modified events when the file is emptied self.process(event.src_path if not event.is_directory else None) @@ -177,7 +178,7 @@ class Dashboard(FileSystemEventHandler): if config.shutting_down: return try: - status_json_path = join(self.currentdir, 'Status.json') + status_json_path = Path(self.currentdir) / 'Status.json' with open(status_json_path, 'rb') as h: data = h.read().strip() if data: # Can be empty if polling while the file is being re-written diff --git a/docs/examples/plugintest/load.py b/docs/examples/plugintest/load.py index 4aca1689..b494f436 100644 --- a/docs/examples/plugintest/load.py +++ b/docs/examples/plugintest/load.py @@ -3,10 +3,10 @@ """Plugin that tests that modules we bundle for plugins are present and working.""" import logging -import os import shutil import sqlite3 import zipfile +from pathlib import Path import semantic_version from SubA import SubA @@ -14,7 +14,7 @@ from SubA import SubA from config import appname, appversion, config # This could also be returned from plugin_start3() -plugin_name = os.path.basename(os.path.dirname(__file__)) +plugin_name = Path(__file__).resolve().parent.name # Logger per found plugin, so the folder name is included in # the logging format. @@ -49,17 +49,17 @@ class PluginTest: def __init__(self, directory: str): logger.debug(f'directory = "{directory}') - dbfile = os.path.join(directory, this.DBFILE) + dbfile = Path(directory) / this.DBFILE # Test 'import zipfile' - with zipfile.ZipFile(dbfile + '.zip', 'w') as zip: - if os.path.exists(dbfile): + with zipfile.ZipFile(str(dbfile) + '.zip', 'w') as zip: + if dbfile.exists(): zip.write(dbfile) zip.close() # Testing 'import shutil' - if os.path.exists(dbfile): - shutil.copyfile(dbfile, dbfile + '.bak') + if dbfile.exists(): + shutil.copyfile(dbfile, str(dbfile) + '.bak') # Testing 'import sqlite3' self.sqlconn = sqlite3.connect(dbfile) diff --git a/installer.py b/installer.py index 754b3373..1ee79ddb 100644 --- a/installer.py +++ b/installer.py @@ -5,23 +5,23 @@ Copyright (c) EDCD, All Rights Reserved Licensed under the GNU General Public License. See LICENSE file. """ -import os import subprocess +from pathlib import Path from build import build -def run_inno_setup_installer(iss_path: str) -> None: +def run_inno_setup_installer(iss_path: Path) -> None: """Run the Inno installer, building the installation exe.""" # Get the path to the Inno Setup compiler (iscc.exe) (Currently set to default path) - inno_setup_compiler_path: str = "C:\\Program Files (x86)\\Inno Setup 6\\ISCC.exe" + inno_setup_compiler_path = Path("C:\\Program Files (x86)\\Inno Setup 6\\ISCC.exe") # Check if the Inno Setup compiler executable exists - if not os.path.isfile(inno_setup_compiler_path): + if not inno_setup_compiler_path.exists(): print(f"Error: Inno Setup compiler not found at '{inno_setup_compiler_path}'.") return # Check if the provided .iss file exists - if not os.path.isfile(iss_file_path): + if not iss_file_path.exists(): print(f"Error: The provided .iss file '{iss_path}' not found.") return @@ -40,6 +40,6 @@ def run_inno_setup_installer(iss_path: str) -> None: if __name__ == "__main__": build() # Add the ISS Template File - iss_file_path: str = "./EDMC_Installer_Config.iss" + iss_file_path = Path("./EDMC_Installer_Config.iss") # Build the ISS file run_inno_setup_installer(iss_file_path) diff --git a/l10n.py b/l10n.py index 8613244f..857b1596 100755 --- a/l10n.py +++ b/l10n.py @@ -17,10 +17,9 @@ import re import sys import warnings from contextlib import suppress -from os import listdir, sep, makedirs -from os.path import basename, dirname, isdir, join, abspath, exists +from os import listdir, sep from typing import TYPE_CHECKING, Iterable, TextIO, cast - +import pathlib from config import config from EDMCLogging import get_main_logger @@ -35,7 +34,7 @@ logger = get_main_logger() # Language name LANGUAGE_ID = '!Language' -LOCALISATION_DIR = 'L10n' +LOCALISATION_DIR: pathlib.Path = pathlib.Path('L10n') if sys.platform == 'win32': import ctypes @@ -119,10 +118,10 @@ class Translations: self.translations = {None: self.contents(cast(str, lang))} for plugin in listdir(config.plugin_dir_path): - plugin_path = join(config.plugin_dir_path, plugin, LOCALISATION_DIR) - if isdir(plugin_path): + plugin_path = config.plugin_dir_path / plugin / LOCALISATION_DIR + if pathlib.Path.is_dir(plugin_path): try: - self.translations[plugin] = self.contents(cast(str, lang), str(plugin_path)) + self.translations[plugin] = self.contents(cast(str, lang), plugin_path) except UnicodeDecodeError as e: logger.warning(f'Malformed file {lang}.strings in plugin {plugin}: {e}') @@ -133,7 +132,7 @@ class Translations: # DEPRECATED: Migrate to translations.translate or tr.tl. Will remove in 6.0 or later. builtins.__dict__['_'] = self.translate - def contents(self, lang: str, plugin_path: str | None = None) -> dict[str, str]: + def contents(self, lang: str, plugin_path: pathlib.Path | None = None) -> dict[str, str]: """Load all the translations from a translation file.""" assert lang in self.available() translations = {} @@ -173,12 +172,12 @@ class Translations: :return: The translated string """ plugin_name: str | None = None - plugin_path: str | None = None + plugin_path: pathlib.Path | None = None if context: # TODO: There is probably a better way to go about this now. plugin_name = context[len(config.plugin_dir)+1:].split(sep)[0] - plugin_path = join(config.plugin_dir_path, plugin_name, LOCALISATION_DIR) + plugin_path = pathlib.Path(config.plugin_dir_path / plugin_name / LOCALISATION_DIR) if lang: contents: dict[str, str] = self.contents(lang=lang, plugin_path=plugin_path) @@ -225,17 +224,17 @@ class Translations: return names - def respath(self) -> str: + def respath(self) -> pathlib.Path: """Path to localisation files.""" if getattr(sys, 'frozen', False): - return abspath(join(dirname(sys.executable), LOCALISATION_DIR)) + return pathlib.Path(sys.executable).parent.joinpath(LOCALISATION_DIR).resolve() if __file__: - return abspath(join(dirname(__file__), LOCALISATION_DIR)) + return pathlib.Path(__file__).parent.joinpath(LOCALISATION_DIR).resolve() - return abspath(LOCALISATION_DIR) + return pathlib.Path(LOCALISATION_DIR).resolve() - def file(self, lang: str, plugin_path: str | None = None) -> TextIO | None: + def file(self, lang: str, plugin_path: pathlib.Path | None = None) -> TextIO | None: """ Open the given lang file for reading. @@ -244,8 +243,8 @@ class Translations: :return: the opened file (Note: This should be closed when done) """ if plugin_path: - file_path = join(plugin_path, f'{lang}.strings') - if not exists(file_path): + file_path = plugin_path / f"{lang}.strings" + if not file_path.exists(): return None try: @@ -253,7 +252,7 @@ class Translations: except OSError: logger.exception(f'could not open {file_path}') - res_path = join(self.respath(), f'{lang}.strings') + res_path = self.respath() / f'{lang}.strings' return open(res_path, encoding='utf-8') @@ -382,9 +381,10 @@ Translations: Translations = translations # type: ignore if __name__ == "__main__": regexp = re.compile(r'''_\([ur]?(['"])(((? N regexp = re.compile(re.escape(ship) + r'\.\d\d\d\d-\d\d-\d\dT\d\d\.\d\d\.\d\d\.txt') oldfiles = sorted([x for x in listdir(config.get_str('outdir')) if regexp.match(x)]) if oldfiles: - with open(join(config.get_str('outdir'), oldfiles[-1]), 'rU') as h: + with open(Path(config.get_str('outdir')) / Path(oldfiles[-1]), 'rU') as h: if h.read() == string: return # same as last time - don't write @@ -55,7 +55,7 @@ def export(data: companion.CAPIData, requested_filename: str | None = None) -> N output_directory = config.get_str('outdir') ship_time = time.strftime('%Y-%m-%dT%H.%M.%S', time.localtime(query_time)) - file_path = join(output_directory, f"{ship}.{ship_time}.txt") + file_path = output_directory / Path(f"{ship}.{ship_time}.txt") with open(file_path, 'wt') as h: h.write(string) diff --git a/monitor.py b/monitor.py index 9d33f5eb..aca6af32 100644 --- a/monitor.py +++ b/monitor.py @@ -8,7 +8,7 @@ See LICENSE file. from __future__ import annotations import json -import pathlib +from pathlib import Path import queue import re import sys @@ -16,7 +16,6 @@ import threading from calendar import timegm from collections import defaultdict from os import SEEK_END, SEEK_SET, listdir -from os.path import basename, expanduser, getctime, isdir, join from time import gmtime, localtime, mktime, sleep, strftime, strptime, time from typing import TYPE_CHECKING, Any, BinaryIO, MutableMapping import semantic_version @@ -81,7 +80,7 @@ class EDLogs(FileSystemEventHandler): # TODO(A_D): A bunch of these should be switched to default values (eg '' for strings) and no longer be Optional FileSystemEventHandler.__init__(self) # futureproofing - not need for current version of watchdog self.root: 'tkinter.Tk' = None # type: ignore # Don't use Optional[] - mypy thinks no methods - self.currentdir: str | None = None # The actual logdir that we're monitoring + self.currentdir: Path | None = None # The actual logdir that we're monitoring self.logfile: str | None = None self.observer: BaseObserver | None = None self.observed = None # a watchdog ObservedWatch, or None if polling @@ -202,9 +201,9 @@ class EDLogs(FileSystemEventHandler): if journal_dir == '' or journal_dir is None: journal_dir = config.default_journal_dir - logdir = expanduser(journal_dir) + logdir = Path(journal_dir).expanduser() - if not logdir or not isdir(logdir): + if not logdir or not Path.is_dir(logdir): logger.error(f'Journal Directory is invalid: "{logdir}"') self.stop() return False @@ -277,9 +276,10 @@ class EDLogs(FileSystemEventHandler): # Odyssey Update 11 has, e.g. Journal.2022-03-15T152503.01.log # Horizons Update 11 equivalent: Journal.220315152335.01.log # So we can no longer use a naive sort. - journals_dir_path = pathlib.Path(journals_dir) - journal_files = (journals_dir_path / pathlib.Path(x) for x in journal_files) - return str(max(journal_files, key=getctime)) + journals_dir_path = Path(journals_dir) + journal_files = (journals_dir_path / Path(x) for x in journal_files) + latest_file = max(journal_files, key=lambda f: Path(f).stat().st_ctime) + return str(latest_file) return None @@ -348,7 +348,7 @@ class EDLogs(FileSystemEventHandler): def on_created(self, event: 'FileSystemEvent') -> None: """Watchdog callback when, e.g. client (re)started.""" - if not event.is_directory and self._RE_LOGFILE.search(basename(event.src_path)): + if not event.is_directory and self._RE_LOGFILE.search(Path(event.src_path).name): self.logfile = event.src_path @@ -1056,7 +1056,7 @@ class EDLogs(FileSystemEventHandler): self.state['Cargo'] = defaultdict(int) # From 3.3 full Cargo event (after the first one) is written to a separate file if 'Inventory' not in entry: - with open(join(self.currentdir, 'Cargo.json'), 'rb') as h: # type: ignore + with open(self.currentdir / 'Cargo.json', 'rb') as h: # type: ignore entry = json.load(h) self.state['CargoJSON'] = entry @@ -1083,7 +1083,7 @@ class EDLogs(FileSystemEventHandler): # Always attempt loading of this, but if it fails we'll hope this was # a startup/boarding version and thus `entry` contains # the data anyway. - currentdir_path = pathlib.Path(str(self.currentdir)) + currentdir_path = Path(str(self.currentdir)) shiplocker_filename = currentdir_path / 'ShipLocker.json' shiplocker_max_attempts = 5 shiplocker_fail_sleep = 0.01 @@ -1152,7 +1152,7 @@ class EDLogs(FileSystemEventHandler): # TODO: v31 doc says this is`backpack.json` ... but Howard Chalkley # said it's `Backpack.json` - backpack_file = pathlib.Path(str(self.currentdir)) / 'Backpack.json' + backpack_file = Path(str(self.currentdir)) / 'Backpack.json' backpack_data = None if not backpack_file.exists(): @@ -1528,7 +1528,7 @@ class EDLogs(FileSystemEventHandler): entry = fcmaterials elif event_type == 'moduleinfo': - with open(join(self.currentdir, 'ModulesInfo.json'), 'rb') as mf: # type: ignore + with open(self.currentdir / 'ModulesInfo.json', 'rb') as mf: # type: ignore try: entry = json.load(mf) @@ -2242,14 +2242,14 @@ class EDLogs(FileSystemEventHandler): oldfiles = sorted((x for x in listdir(config.get_str('outdir')) if regexp.match(x))) if oldfiles: try: - with open(join(config.get_str('outdir'), oldfiles[-1]), encoding='utf-8') as h: + with open(config.get_str('outdir') / Path(oldfiles[-1]), encoding='utf-8') as h: if h.read() == string: return # same as last time - don't write except UnicodeError: logger.exception("UnicodeError reading old ship loadout with utf-8 encoding, trying without...") try: - with open(join(config.get_str('outdir'), oldfiles[-1])) as h: + with open(config.get_str('outdir') / Path(oldfiles[-1])) as h: if h.read() == string: return # same as last time - don't write @@ -2268,7 +2268,7 @@ class EDLogs(FileSystemEventHandler): # Write ts = strftime('%Y-%m-%dT%H.%M.%S', localtime(time())) - filename = join(config.get_str('outdir'), f'{ship}.{ts}.txt') + filename = config.get_str('outdir') / Path(f'{ship}.{ts}.txt') try: with open(filename, 'wt', encoding='utf-8') as h: @@ -2355,7 +2355,7 @@ class EDLogs(FileSystemEventHandler): try: - with open(join(self.currentdir, 'NavRoute.json')) as f: + with open(self.currentdir / 'NavRoute.json') as f: raw = f.read() except Exception as e: @@ -2381,7 +2381,7 @@ class EDLogs(FileSystemEventHandler): try: - with open(join(self.currentdir, 'FCMaterials.json')) as f: + with open(self.currentdir / 'FCMaterials.json') as f: raw = f.read() except Exception as e: diff --git a/plug.py b/plug.py index 9c203f25..7c407242 100644 --- a/plug.py +++ b/plug.py @@ -14,6 +14,7 @@ import operator import os import sys import tkinter as tk +from pathlib import Path from tkinter import ttk from typing import Any, Mapping, MutableMapping @@ -47,7 +48,7 @@ last_error = LastError() class Plugin: """An EDMC plugin.""" - def __init__(self, name: str, loadfile: str | None, plugin_logger: logging.Logger | None): # noqa: CCR001 + def __init__(self, name: str, loadfile: Path | None, plugin_logger: logging.Logger | None): # noqa: CCR001 """ Load a single plugin. @@ -73,7 +74,7 @@ class Plugin: sys.modules[module.__name__] = module spec.loader.exec_module(module) if getattr(module, 'plugin_start3', None): - newname = module.plugin_start3(os.path.dirname(loadfile)) + newname = module.plugin_start3(Path(loadfile).resolve().parent) self.name = str(newname) if newname else self.name self.module = module elif getattr(module, 'plugin_start', None): @@ -171,7 +172,9 @@ def _load_internal_plugins(): for name in sorted(os.listdir(config.internal_plugin_dir_path)): if name.endswith('.py') and name[0] not in ('.', '_'): try: - plugin = Plugin(name[:-3], os.path.join(config.internal_plugin_dir_path, name), logger) + plugin_name = name[:-3] + plugin_path = config.internal_plugin_dir_path / name + plugin = Plugin(plugin_name, plugin_path, logger) plugin.folder = None internal.append(plugin) except Exception: @@ -186,9 +189,12 @@ def _load_found_plugins(): # The intent here is to e.g. have EDMC-Overlay load before any plugins # that depend on it. - for name in sorted(os.listdir(config.plugin_dir_path), key=lambda n: ( - not os.path.isfile(os.path.join(config.plugin_dir_path, n, '__init__.py')), n.lower())): - if not os.path.isdir(os.path.join(config.plugin_dir_path, name)) or name[0] in ('.', '_'): + plugin_files = sorted(Path(config.plugin_dir_path).iterdir(), key=lambda p: ( + not (p / '__init__.py').is_file(), p.name.lower())) + + for plugin_file in plugin_files: + name = plugin_file.name + if not (Path(config.plugin_dir_path) / name).is_dir() or name.startswith(('.', '_')): pass elif name.endswith('.disabled'): name, discard = name.rsplit('.', 1) @@ -196,12 +202,12 @@ def _load_found_plugins(): else: try: # Add plugin's folder to load path in case plugin has internal package dependencies - sys.path.append(os.path.join(config.plugin_dir_path, name)) + sys.path.append(str(Path(config.plugin_dir_path) / name)) import EDMCLogging # Create a logger for this 'found' plugin. Must be before the load.py is loaded. plugin_logger = EDMCLogging.get_plugin_logger(name) - found.append(Plugin(name, os.path.join(config.plugin_dir_path, name, 'load.py'), plugin_logger)) + found.append(Plugin(name, config.plugin_dir_path / name / 'load.py', plugin_logger)) except Exception: PLUGINS_broken.append(Plugin(name, None, logger)) logger.exception(f'Failure loading found Plugin "{name}"') diff --git a/prefs.py b/prefs.py index 9f2062f4..673d1e70 100644 --- a/prefs.py +++ b/prefs.py @@ -4,14 +4,14 @@ from __future__ import annotations import contextlib import logging -import pathlib +from os.path import expandvars +from pathlib import Path import subprocess import sys import tempfile import tkinter as tk import warnings from os import system -from os.path import expanduser, expandvars, join, normpath from tkinter import colorchooser as tkColorChooser # type: ignore # noqa: N812 from tkinter import ttk from types import TracebackType @@ -43,10 +43,10 @@ def help_open_log_folder() -> None: """Open the folder logs are stored in.""" warnings.warn('prefs.help_open_log_folder is deprecated, use open_log_folder instead. ' 'This function will be removed in 6.0 or later', DeprecationWarning, stacklevel=2) - open_folder(pathlib.Path(tempfile.gettempdir()) / appname) + open_folder(Path(tempfile.gettempdir()) / appname) -def open_folder(file: pathlib.Path) -> None: +def open_folder(file: Path) -> None: """Open the given file in the OS file explorer.""" if sys.platform.startswith('win'): # On Windows, use the "start" command to open the folder @@ -58,7 +58,7 @@ def open_folder(file: pathlib.Path) -> None: def help_open_system_profiler(parent) -> None: """Open the EDMC System Profiler.""" - profiler_path = pathlib.Path(config.respath_path) + profiler_path = Path(config.respath_path) try: if getattr(sys, 'frozen', False): profiler_path /= 'EDMCSystemProfiler.exe' @@ -323,7 +323,7 @@ class PreferencesDialog(tk.Toplevel): self.geometry(f"+{position.left}+{position.top}") # Set Log Directory - self.logfile_loc = pathlib.Path(tempfile.gettempdir()) / appname + self.logfile_loc = Path(tempfile.gettempdir()) / appname # Set minimum size to prevent content cut-off self.update_idletasks() # Update "requested size" from geometry manager @@ -1066,7 +1066,7 @@ class PreferencesDialog(tk.Toplevel): import tkinter.filedialog directory = tkinter.filedialog.askdirectory( parent=self, - initialdir=expanduser(pathvar.get()), + initialdir=Path(pathvar.get()).expanduser(), title=title, mustexist=tk.TRUE ) @@ -1088,7 +1088,7 @@ class PreferencesDialog(tk.Toplevel): if sys.platform == 'win32': start = len(config.home.split('\\')) if pathvar.get().lower().startswith(config.home.lower()) else 0 display = [] - components = normpath(pathvar.get()).split('\\') + components = Path(pathvar.get()).resolve().parts buf = ctypes.create_unicode_buffer(MAX_PATH) pidsRes = ctypes.c_int() # noqa: N806 # Windows convention for i in range(start, len(components)): @@ -1233,7 +1233,7 @@ class PreferencesDialog(tk.Toplevel): config.set( 'outdir', - join(config.home_path, self.outdir.get()[2:]) if self.outdir.get().startswith('~') else self.outdir.get() + str(config.home_path / self.outdir.get()[2:]) if self.outdir.get().startswith('~') else self.outdir.get() ) logdir = self.logdir.get() diff --git a/theme.py b/theme.py index 94e99f7a..41913f42 100644 --- a/theme.py +++ b/theme.py @@ -12,8 +12,8 @@ from __future__ import annotations import os import sys +from pathlib import Path import tkinter as tk -from os.path import join from tkinter import font as tk_font from tkinter import ttk from typing import Callable @@ -38,7 +38,8 @@ if sys.platform == 'win32': AddFontResourceEx.restypes = [LPCWSTR, DWORD, LPCVOID] # type: ignore FR_PRIVATE = 0x10 FR_NOT_ENUM = 0x20 - AddFontResourceEx(join(config.respath, 'EUROCAPS.TTF'), FR_PRIVATE, 0) + font_path = Path(config.respath) / 'EUROCAPS.TTF' + AddFontResourceEx(str(font_path), FR_PRIVATE, 0) elif sys.platform == 'linux': # pyright: reportUnboundVariable=false diff --git a/ttkHyperlinkLabel.py b/ttkHyperlinkLabel.py index 6266d9fb..0852e89b 100644 --- a/ttkHyperlinkLabel.py +++ b/ttkHyperlinkLabel.py @@ -28,7 +28,6 @@ from tkinter import font as tk_font from tkinter import ttk from typing import Any import plug -from os import path from config import config, logger from l10n import translations as tr from monitor import monitor @@ -96,7 +95,7 @@ class HyperlinkLabel(tk.Label or ttk.Label): # type: ignore else: # Avoid file length limits if possible target = plug.invoke(url, 'EDSY', 'shipyard_url', loadout, monitor.is_beta) - file_name = path.join(config.app_dir_path, "last_shipyard.html") + file_name = config.app_dir_path / "last_shipyard.html" with open(file_name, 'w') as f: f.write(SHIPYARD_HTML_TEMPLATE.format( From f8b7a8b919f468a97a1ae6a6761f477b1fff3044 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 10 Jun 2024 17:49:13 -0400 Subject: [PATCH 327/425] [2114] Cleanup Initial Commit Some of these are already paths. --- EDMCLogging.py | 4 ++-- EDMCSystemProfiler.py | 4 ++-- EDMarketConnector.py | 4 ++-- collate.py | 2 +- companion.py | 2 +- l10n.py | 2 +- plug.py | 6 +++--- prefs.py | 2 +- theme.py | 3 +-- 9 files changed, 14 insertions(+), 15 deletions(-) diff --git a/EDMCLogging.py b/EDMCLogging.py index 09a01860..eedd9f4e 100644 --- a/EDMCLogging.py +++ b/EDMCLogging.py @@ -490,8 +490,8 @@ class EDMCContextFilter(logging.Filter): :return: The munged module_name. """ file_name = pathlib.Path(frame_info.filename).expanduser() - plugin_dir = pathlib.Path(config.plugin_dir_path).expanduser() - internal_plugin_dir = pathlib.Path(config.internal_plugin_dir_path).expanduser() + plugin_dir = config.plugin_dir_path.expanduser() + internal_plugin_dir = config.internal_plugin_dir_path.expanduser() # Find the first parent called 'plugins' plugin_top = file_name while plugin_top and plugin_top.name != '': diff --git a/EDMCSystemProfiler.py b/EDMCSystemProfiler.py index 8b1dcbe5..816c5e8b 100644 --- a/EDMCSystemProfiler.py +++ b/EDMCSystemProfiler.py @@ -116,12 +116,12 @@ def main() -> None: root.withdraw() # Hide the window initially to calculate the dimensions try: icon_image = tk.PhotoImage( - file=pathlib.Path(cur_config.respath_path) / "io.edcd.EDMarketConnector.png" + file=cur_config.respath_path / "io.edcd.EDMarketConnector.png" ) root.iconphoto(True, icon_image) except tk.TclError: - root.iconbitmap(pathlib.Path(cur_config.respath_path) / "EDMarketConnector.ico") + root.iconbitmap(cur_config.respath_path / "EDMarketConnector.ico") sys_report = get_sys_report(cur_config) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index f67a4fe1..c6234e0c 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -468,7 +468,7 @@ class AppWindow: self.w.wm_iconbitmap(default='EDMarketConnector.ico') else: - image_path = pathlib.Path(config.respath_path) / 'io.edcd.EDMarketConnector.png' + image_path = config.respath_path / 'io.edcd.EDMarketConnector.png' self.w.tk.call('wm', 'iconphoto', self.w, '-default', image=tk.PhotoImage(file=image_path)) # TODO: Export to files and merge from them in future ? @@ -1639,7 +1639,7 @@ class AppWindow: # Avoid file length limits if possible provider = config.get_str('shipyard_provider', default='EDSY') target = plug.invoke(provider, 'EDSY', 'shipyard_url', loadout, monitor.is_beta) - file_name = pathlib.Path(config.app_dir_path) / "last_shipyard.html" + file_name = config.app_dir_path / "last_shipyard.html" with open(file_name, 'w') as f: f.write(SHIPYARD_HTML_TEMPLATE.format( diff --git a/collate.py b/collate.py index 0a413052..bba94df1 100755 --- a/collate.py +++ b/collate.py @@ -51,7 +51,7 @@ def addcommodities(data) -> None: # noqa: CCR001 return try: - commodityfile = pathlib.Path(config.app_dir_path / 'FDevIDs' / 'commodity.csv') + commodityfile = config.app_dir_path / 'FDevIDs' / 'commodity.csv' except FileNotFoundError: commodityfile = pathlib.Path('FDevIDs/commodity.csv') commodities = {} diff --git a/companion.py b/companion.py index d91fed22..9d655bc6 100644 --- a/companion.py +++ b/companion.py @@ -1204,7 +1204,7 @@ def fixup(data: CAPIData) -> CAPIData: # noqa: C901, CCR001 # Can't be usefully if not commodity_map: # Lazily populate for f in ('commodity.csv', 'rare_commodity.csv'): - if not (Path(config.app_dir_path) / 'FDevIDs' / f).is_file(): + if not (config.app_dir_path / 'FDevIDs' / f).is_file(): logger.warning(f'FDevID file {f} not found! Generating output without these commodity name rewrites.') continue with open(config.app_dir_path / 'FDevIDs' / f, 'r') as csvfile: diff --git a/l10n.py b/l10n.py index 857b1596..8367d72c 100755 --- a/l10n.py +++ b/l10n.py @@ -177,7 +177,7 @@ class Translations: if context: # TODO: There is probably a better way to go about this now. plugin_name = context[len(config.plugin_dir)+1:].split(sep)[0] - plugin_path = pathlib.Path(config.plugin_dir_path / plugin_name / LOCALISATION_DIR) + plugin_path = config.plugin_dir_path / plugin_name / LOCALISATION_DIR if lang: contents: dict[str, str] = self.contents(lang=lang, plugin_path=plugin_path) diff --git a/plug.py b/plug.py index 7c407242..ee53e76b 100644 --- a/plug.py +++ b/plug.py @@ -189,12 +189,12 @@ def _load_found_plugins(): # The intent here is to e.g. have EDMC-Overlay load before any plugins # that depend on it. - plugin_files = sorted(Path(config.plugin_dir_path).iterdir(), key=lambda p: ( + plugin_files = sorted(config.plugin_dir_path.iterdir(), key=lambda p: ( not (p / '__init__.py').is_file(), p.name.lower())) for plugin_file in plugin_files: name = plugin_file.name - if not (Path(config.plugin_dir_path) / name).is_dir() or name.startswith(('.', '_')): + if not (config.plugin_dir_path / name).is_dir() or name.startswith(('.', '_')): pass elif name.endswith('.disabled'): name, discard = name.rsplit('.', 1) @@ -202,7 +202,7 @@ def _load_found_plugins(): else: try: # Add plugin's folder to load path in case plugin has internal package dependencies - sys.path.append(str(Path(config.plugin_dir_path) / name)) + sys.path.append(str(config.plugin_dir_path / name)) import EDMCLogging # Create a logger for this 'found' plugin. Must be before the load.py is loaded. diff --git a/prefs.py b/prefs.py index 673d1e70..94fda4d2 100644 --- a/prefs.py +++ b/prefs.py @@ -58,7 +58,7 @@ def open_folder(file: Path) -> None: def help_open_system_profiler(parent) -> None: """Open the EDMC System Profiler.""" - profiler_path = Path(config.respath_path) + profiler_path = config.respath_path try: if getattr(sys, 'frozen', False): profiler_path /= 'EDMCSystemProfiler.exe' diff --git a/theme.py b/theme.py index 41913f42..c0018912 100644 --- a/theme.py +++ b/theme.py @@ -12,7 +12,6 @@ from __future__ import annotations import os import sys -from pathlib import Path import tkinter as tk from tkinter import font as tk_font from tkinter import ttk @@ -38,7 +37,7 @@ if sys.platform == 'win32': AddFontResourceEx.restypes = [LPCWSTR, DWORD, LPCVOID] # type: ignore FR_PRIVATE = 0x10 FR_NOT_ENUM = 0x20 - font_path = Path(config.respath) / 'EUROCAPS.TTF' + font_path = config.respath_path / 'EUROCAPS.TTF' AddFontResourceEx(str(font_path), FR_PRIVATE, 0) elif sys.platform == 'linux': From da5d317797155c8599b5b5d1e59609dcc440e1da Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 10 Jun 2024 18:16:11 -0400 Subject: [PATCH 328/425] [2114] Additional Cleanup --- EDMC.py | 2 +- EDMCSystemProfiler.py | 2 +- l10n.py | 6 +++--- loadout.py | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/EDMC.py b/EDMC.py index 55236b9c..ce0db95b 100755 --- a/EDMC.py +++ b/EDMC.py @@ -230,7 +230,7 @@ def main(): # noqa: C901, CCR001 try: monitor.currentdir = Path(config.get_str('journaldir', default=config.default_journal_dir)) if not monitor.currentdir: - monitor.currentdir = Path(config.default_journal_dir) + monitor.currentdir = config.default_journal_dir_path logger.debug(f'logdir = "{monitor.currentdir}"') logfile = monitor.journal_newest_filename(monitor.currentdir) diff --git a/EDMCSystemProfiler.py b/EDMCSystemProfiler.py index 816c5e8b..77212db7 100644 --- a/EDMCSystemProfiler.py +++ b/EDMCSystemProfiler.py @@ -49,7 +49,7 @@ def get_sys_report(config: config.AbstractConfig) -> str: ) ) if not monitor.currentdir: - monitor.currentdir = pathlib.Path(config.default_journal_dir) + monitor.currentdir = config.default_journal_dir_path try: logfile = monitor.journal_newest_filename(monitor.currentdir) if logfile is None: diff --git a/l10n.py b/l10n.py index 8367d72c..ce1ab6a7 100755 --- a/l10n.py +++ b/l10n.py @@ -232,7 +232,7 @@ class Translations: if __file__: return pathlib.Path(__file__).parent.joinpath(LOCALISATION_DIR).resolve() - return pathlib.Path(LOCALISATION_DIR).resolve() + return LOCALISATION_DIR.resolve() def file(self, lang: str, plugin_path: pathlib.Path | None = None) -> TextIO | None: """ @@ -396,8 +396,8 @@ if __name__ == "__main__": (match.group(4) and (match.group(4)[1:].strip()) + '. ' or '') + f'[{pathlib.Path(f).name}]' ) if seen: - target_path = pathlib.Path(LOCALISATION_DIR / 'en.template.new') - pathlib.Path(target_path).parent.mkdir(parents=True, exist_ok=True) + target_path = LOCALISATION_DIR / 'en.template.new' + target_path.parent.mkdir(parents=True, exist_ok=True) with open(target_path, 'w', encoding='utf-8') as target_file: target_file.write(f'/* Language name */\n"{LANGUAGE_ID}" = "English";\n\n') for thing in sorted(seen, key=str.lower): diff --git a/loadout.py b/loadout.py index f2efc9b4..144439c0 100644 --- a/loadout.py +++ b/loadout.py @@ -53,9 +53,9 @@ def export(data: companion.CAPIData, requested_filename: str | None = None) -> N # Write - output_directory = config.get_str('outdir') + output_directory = Path(config.get_str('outdir')) ship_time = time.strftime('%Y-%m-%dT%H.%M.%S', time.localtime(query_time)) - file_path = output_directory / Path(f"{ship}.{ship_time}.txt") + file_path = output_directory / f"{ship}.{ship_time}.txt" with open(file_path, 'wt') as h: h.write(string) From 17a7af959a29aa0c6a02a88aa8cf3c150e8ac8fb Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 10 Jun 2024 23:00:44 -0400 Subject: [PATCH 329/425] [#1805] pywin32 Handoff --- config/windows.py | 29 ++++------------ hotkey/windows.py | 83 +++++++++++++++++++++++--------------------- monitor.py | 18 +++------- prefs.py | 10 ++---- requirements-dev.txt | 2 -- requirements.txt | 2 ++ stats.py | 9 ++--- theme.py | 11 +++--- 8 files changed, 68 insertions(+), 96 deletions(-) diff --git a/config/windows.py b/config/windows.py index 75e3f697..9f330483 100644 --- a/config/windows.py +++ b/config/windows.py @@ -7,41 +7,23 @@ See LICENSE file. """ from __future__ import annotations -import ctypes import functools import pathlib import sys import uuid import winreg -from ctypes.wintypes import DWORD, HANDLE from typing import Literal from config import AbstractConfig, applongname, appname, logger +from win32comext.shell import shell assert sys.platform == 'win32' REG_RESERVED_ALWAYS_ZERO = 0 -# This is the only way to do this from python without external deps (which do this anyway). -FOLDERID_Documents = uuid.UUID('{FDD39AD0-238F-46AF-ADB4-6C85480369C7}') -FOLDERID_LocalAppData = uuid.UUID('{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}') -FOLDERID_Profile = uuid.UUID('{5E6C858F-0E22-4760-9AFE-EA3317B67173}') -FOLDERID_SavedGames = uuid.UUID('{4C5C32FF-BB9D-43b0-B5B4-2D72E54EAAA4}') - -SHGetKnownFolderPath = ctypes.windll.shell32.SHGetKnownFolderPath -SHGetKnownFolderPath.argtypes = [ctypes.c_char_p, DWORD, HANDLE, ctypes.POINTER(ctypes.c_wchar_p)] - -CoTaskMemFree = ctypes.windll.ole32.CoTaskMemFree -CoTaskMemFree.argtypes = [ctypes.c_void_p] - def known_folder_path(guid: uuid.UUID) -> str | None: """Look up a Windows GUID to actual folder path name.""" - buf = ctypes.c_wchar_p() - if SHGetKnownFolderPath(ctypes.create_string_buffer(guid.bytes_le), 0, 0, ctypes.byref(buf)): - return None - retval = buf.value # copy data - CoTaskMemFree(buf) # and free original - return retval + return shell.SHGetKnownFolderPath(guid, 0, 0) class WinConfig(AbstractConfig): @@ -49,7 +31,8 @@ class WinConfig(AbstractConfig): def __init__(self) -> None: super().__init__() - self.app_dir_path = pathlib.Path(known_folder_path(FOLDERID_LocalAppData)) / appname # type: ignore + if local_appdata := known_folder_path(shell.FOLDERID_LocalAppData): + self.app_dir_path = pathlib.Path(local_appdata) / appname self.app_dir_path.mkdir(exist_ok=True) self.plugin_dir_path = self.app_dir_path / 'plugins' @@ -65,7 +48,7 @@ class WinConfig(AbstractConfig): self.home_path = pathlib.Path.home() journal_dir_path = pathlib.Path( - known_folder_path(FOLDERID_SavedGames)) / 'Frontier Developments' / 'Elite Dangerous' # type: ignore + known_folder_path(shell.FOLDERID_SavedGames)) / 'Frontier Developments' / 'Elite Dangerous' # type: ignore self.default_journal_dir_path = journal_dir_path if journal_dir_path.is_dir() else None # type: ignore REGISTRY_SUBKEY = r'Software\Marginal\EDMarketConnector' # noqa: N806 @@ -84,7 +67,7 @@ class WinConfig(AbstractConfig): self.identifier = applongname if (outdir_str := self.get_str('outdir')) is None or not pathlib.Path(outdir_str).is_dir(): - docs = known_folder_path(FOLDERID_Documents) + docs = known_folder_path(shell.FOLDERID_Documents) self.set("outdir", docs if docs is not None else self.home) def __get_regentry(self, key: str) -> None | list | str | int: diff --git a/hotkey/windows.py b/hotkey/windows.py index fa4cb3a6..cbcbd161 100644 --- a/hotkey/windows.py +++ b/hotkey/windows.py @@ -8,7 +8,10 @@ import sys import threading import tkinter as tk import winsound -from ctypes.wintypes import DWORD, HWND, LONG, LPWSTR, MSG, ULONG, WORD +from ctypes.wintypes import DWORD, LONG, MSG, ULONG, WORD +import pywintypes +import win32api +import win32gui from config import config from EDMCLogging import get_main_logger from hotkey import AbstractHotkeyMgr @@ -17,26 +20,20 @@ assert sys.platform == 'win32' logger = get_main_logger() -RegisterHotKey = ctypes.windll.user32.RegisterHotKey -UnregisterHotKey = ctypes.windll.user32.UnregisterHotKey +UnregisterHotKey = ctypes.windll.user32.UnregisterHotKey # TODO: Coming Soon + MOD_ALT = 0x0001 MOD_CONTROL = 0x0002 MOD_SHIFT = 0x0004 MOD_WIN = 0x0008 MOD_NOREPEAT = 0x4000 -GetMessage = ctypes.windll.user32.GetMessageW -TranslateMessage = ctypes.windll.user32.TranslateMessage -DispatchMessage = ctypes.windll.user32.DispatchMessageW -PostThreadMessage = ctypes.windll.user32.PostThreadMessageW WM_QUIT = 0x0012 WM_HOTKEY = 0x0312 WM_APP = 0x8000 WM_SND_GOOD = WM_APP + 1 WM_SND_BAD = WM_APP + 2 -GetKeyState = ctypes.windll.user32.GetKeyState -MapVirtualKey = ctypes.windll.user32.MapVirtualKeyW VK_BACK = 0x08 VK_CLEAR = 0x0c VK_RETURN = 0x0d @@ -60,10 +57,13 @@ VK_SCROLL = 0x91 VK_PROCESSKEY = 0xe5 VK_OEM_CLEAR = 0xfe -GetForegroundWindow = ctypes.windll.user32.GetForegroundWindow -GetWindowText = ctypes.windll.user32.GetWindowTextW -GetWindowText.argtypes = [HWND, LPWSTR, ctypes.c_int] -GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW +# VirtualKey mapping values +# +MAPVK_VK_TO_VSC = 0 +MAPVK_VSC_TO_VK = 1 +MAPVK_VK_TO_CHAR = 2 +MAPVK_VSC_TO_VK_EX = 3 +MAPVK_VK_TO_VSC_EX = 4 def window_title(h) -> str: @@ -74,9 +74,9 @@ def window_title(h) -> str: :return: Window title. """ if h: - title_length = GetWindowTextLength(h) + 1 + title_length = win32gui.GetWindowTextLength(h) + 1 buf = ctypes.create_unicode_buffer(title_length) - if GetWindowText(h, buf, title_length): + if win32gui.GetWindowText(h, buf, title_length): return buf.value return '' @@ -197,7 +197,7 @@ class WindowsHotkeyMgr(AbstractHotkeyMgr): logger.debug('Thread is/was running') self.thread = None # type: ignore logger.debug('Telling thread WM_QUIT') - PostThreadMessage(thread.ident, WM_QUIT, 0, 0) + win32gui.PostThreadMessage(thread.ident, WM_QUIT, 0, 0) logger.debug('Joining thread') thread.join() # Wait for it to unregister hotkey and quit @@ -210,8 +210,10 @@ class WindowsHotkeyMgr(AbstractHotkeyMgr): """Handle hotkeys.""" logger.debug('Begin...') # Hotkey must be registered by the thread that handles it - if not RegisterHotKey(None, 1, modifiers | MOD_NOREPEAT, keycode): - logger.debug("We're not the right thread?") + try: + win32gui.RegisterHotKey(None, 1, modifiers | MOD_NOREPEAT, keycode) + except pywintypes.error: + logger.exception("We're not the right thread?") self.thread = None # type: ignore return @@ -219,14 +221,14 @@ class WindowsHotkeyMgr(AbstractHotkeyMgr): msg = MSG() logger.debug('Entering GetMessage() loop...') - while GetMessage(ctypes.byref(msg), None, 0, 0) != 0: + while win32gui.GetMessage(ctypes.byref(msg), None, 0, 0) != 0: logger.debug('Got message') if msg.message == WM_HOTKEY: logger.debug('WM_HOTKEY') if ( - config.get_int('hotkey_always') - or window_title(GetForegroundWindow()).startswith('Elite - Dangerous') + config.get_int('hotkey_always') + or window_title(win32gui.GetForegroundWindow()).startswith('Elite - Dangerous') ): if not config.shutting_down: logger.debug('Sending event <>') @@ -236,8 +238,10 @@ class WindowsHotkeyMgr(AbstractHotkeyMgr): logger.debug('Passing key on') UnregisterHotKey(None, 1) SendInput(1, fake, ctypes.sizeof(INPUT)) - if not RegisterHotKey(None, 1, modifiers | MOD_NOREPEAT, keycode): - logger.debug("We aren't registered for this ?") + try: + win32gui.RegisterHotKey(None, 1, modifiers | MOD_NOREPEAT, keycode) + except pywintypes.error: + logger.exception("We aren't registered for this ?") break elif msg.message == WM_SND_GOOD: @@ -250,8 +254,8 @@ class WindowsHotkeyMgr(AbstractHotkeyMgr): else: logger.debug('Something else') - TranslateMessage(ctypes.byref(msg)) - DispatchMessage(ctypes.byref(msg)) + win32gui.TranslateMessage(ctypes.byref(msg)) + win32gui.DispatchMessage(ctypes.byref(msg)) logger.debug('Exited GetMessage() loop.') UnregisterHotKey(None, 1) @@ -266,7 +270,7 @@ class WindowsHotkeyMgr(AbstractHotkeyMgr): """Stop acquiring hotkey state.""" pass - def fromevent(self, event) -> bool | tuple | None: # noqa: CCR001 + def fromevent(self, event) -> bool | tuple | None: """ Return configuration (keycode, modifiers) or None=clear or False=retain previous. @@ -277,11 +281,11 @@ class WindowsHotkeyMgr(AbstractHotkeyMgr): :param event: tk event ? :return: False to retain previous, None to not use, else (keycode, modifiers) """ - modifiers = ((GetKeyState(VK_MENU) & 0x8000) and MOD_ALT) \ - | ((GetKeyState(VK_CONTROL) & 0x8000) and MOD_CONTROL) \ - | ((GetKeyState(VK_SHIFT) & 0x8000) and MOD_SHIFT) \ - | ((GetKeyState(VK_LWIN) & 0x8000) and MOD_WIN) \ - | ((GetKeyState(VK_RWIN) & 0x8000) and MOD_WIN) + modifiers = ((win32api.GetKeyState(VK_MENU) & 0x8000) and MOD_ALT) \ + | ((win32api.GetKeyState(VK_CONTROL) & 0x8000) and MOD_CONTROL) \ + | ((win32api.GetKeyState(VK_SHIFT) & 0x8000) and MOD_SHIFT) \ + | ((win32api.GetKeyState(VK_LWIN) & 0x8000) and MOD_WIN) \ + | ((win32api.GetKeyState(VK_RWIN) & 0x8000) and MOD_WIN) keycode = event.keycode if keycode in (VK_SHIFT, VK_CONTROL, VK_MENU, VK_LWIN, VK_RWIN): @@ -295,7 +299,7 @@ class WindowsHotkeyMgr(AbstractHotkeyMgr): return None if ( - keycode in (VK_RETURN, VK_SPACE, VK_OEM_MINUS) or ord('A') <= keycode <= ord('Z') + keycode in (VK_RETURN, VK_SPACE, VK_OEM_MINUS) or ord('A') <= keycode <= ord('Z') ): # don't allow keys needed for typing in System Map winsound.MessageBeep() return None @@ -305,12 +309,13 @@ class WindowsHotkeyMgr(AbstractHotkeyMgr): return 0, modifiers # See if the keycode is usable and available - if RegisterHotKey(None, 2, modifiers | MOD_NOREPEAT, keycode): + try: + win32gui.RegisterHotKey(None, 2, modifiers | MOD_NOREPEAT, keycode) UnregisterHotKey(None, 2) return keycode, modifiers - - winsound.MessageBeep() - return None + except pywintypes.error: + winsound.MessageBeep() + return None def display(self, keycode, modifiers) -> str: """ @@ -346,7 +351,7 @@ class WindowsHotkeyMgr(AbstractHotkeyMgr): text += WindowsHotkeyMgr.DISPLAY[keycode] else: - c = MapVirtualKey(keycode, 2) # printable ? + c = win32api.MapVirtualKey(keycode, MAPVK_VK_TO_CHAR) if not c: # oops not printable text += '⁈' @@ -361,9 +366,9 @@ class WindowsHotkeyMgr(AbstractHotkeyMgr): def play_good(self) -> None: """Play the 'good' sound.""" if self.thread: - PostThreadMessage(self.thread.ident, WM_SND_GOOD, 0, 0) + win32gui.PostThreadMessage(self.thread.ident, WM_SND_GOOD, 0, 0) def play_bad(self) -> None: """Play the 'bad' sound.""" if self.thread: - PostThreadMessage(self.thread.ident, WM_SND_BAD, 0, 0) + win32gui.PostThreadMessage(self.thread.ident, WM_SND_BAD, 0, 0) diff --git a/monitor.py b/monitor.py index 9d33f5eb..ba1a4d39 100644 --- a/monitor.py +++ b/monitor.py @@ -36,23 +36,15 @@ MAX_FCMATERIALS_DISCREPANCY = 5 # Timestamp difference in seconds if sys.platform == 'win32': import ctypes - from ctypes.wintypes import BOOL, HWND, LPARAM, LPWSTR + from ctypes.wintypes import BOOL, HWND, LPARAM + import win32gui from watchdog.events import FileSystemEventHandler, FileSystemEvent from watchdog.observers import Observer from watchdog.observers.api import BaseObserver - EnumWindows = ctypes.windll.user32.EnumWindows EnumWindowsProc = ctypes.WINFUNCTYPE(BOOL, HWND, LPARAM) - CloseHandle = ctypes.windll.kernel32.CloseHandle - - GetWindowText = ctypes.windll.user32.GetWindowTextW - GetWindowText.argtypes = [HWND, LPWSTR, ctypes.c_int] - GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW - GetWindowTextLength.argtypes = [ctypes.wintypes.HWND] - GetWindowTextLength.restype = ctypes.c_int - GetProcessHandleFromHwnd = ctypes.windll.oleacc.GetProcessHandleFromHwnd else: @@ -2131,9 +2123,9 @@ class EDLogs(FileSystemEventHandler): if sys.platform == 'win32': def WindowTitle(h): # noqa: N802 if h: - length = GetWindowTextLength(h) + 1 + length = win32gui.GetWindowTextLength(h) + 1 buf = ctypes.create_unicode_buffer(length) - if GetWindowText(h, buf, length): + if win32gui.GetWindowText(h, buf, length): return buf.value return None @@ -2147,7 +2139,7 @@ class EDLogs(FileSystemEventHandler): return True - return not EnumWindows(EnumWindowsProc(callback), 0) + return not win32gui.EnumWindows(EnumWindowsProc(callback), 0) return False diff --git a/prefs.py b/prefs.py index 9f2062f4..e7ccef18 100644 --- a/prefs.py +++ b/prefs.py @@ -188,7 +188,8 @@ class AutoInc(contextlib.AbstractContextManager): if sys.platform == 'win32': import ctypes import winreg - from ctypes.wintypes import HINSTANCE, HWND, LPCWSTR, LPWSTR, MAX_PATH, POINT, RECT, SIZE, UINT + from ctypes.wintypes import HINSTANCE, LPCWSTR, LPWSTR, MAX_PATH, POINT, RECT, SIZE, UINT + import win32gui is_wine = False try: WINE_REGISTRY_KEY = r'HKEY_LOCAL_MACHINE\Software\Wine' @@ -219,11 +220,6 @@ if sys.platform == 'win32': ctypes.POINTER(RECT) ] - GetParent = ctypes.windll.user32.GetParent - GetParent.argtypes = [HWND] - GetWindowRect = ctypes.windll.user32.GetWindowRect - GetWindowRect.argtypes = [HWND, ctypes.POINTER(RECT)] - SHGetLocalizedName = ctypes.windll.shell32.SHGetLocalizedName SHGetLocalizedName.argtypes = [LPCWSTR, LPWSTR, UINT, ctypes.POINTER(ctypes.c_int)] @@ -314,7 +310,7 @@ class PreferencesDialog(tk.Toplevel): # Ensure fully on-screen if sys.platform == 'win32' and CalculatePopupWindowPosition: position = RECT() - GetWindowRect(GetParent(self.winfo_id()), position) + win32gui.GetWindowRect(win32gui.GetParent(self.winfo_id()), position) if CalculatePopupWindowPosition( POINT(parent.winfo_rootx(), parent.winfo_rooty()), SIZE(position.right - position.left, position.bottom - position.top), # type: ignore diff --git a/requirements-dev.txt b/requirements-dev.txt index 7c8e1ef5..1e30ff46 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -42,8 +42,6 @@ pytest==8.2.0 pytest-cov==5.0.0 # Pytest code coverage support coverage[toml]==7.5.0 # pytest-cov dep. This is here to ensure that it includes TOML support for pyproject.toml configs coverage-conditional-plugin==0.9.0 -# For manipulating folder permissions and the like. -pywin32==306; sys_platform == 'win32' # All of the normal requirements diff --git a/requirements.txt b/requirements.txt index 22f0a360..b278cce5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,3 +3,5 @@ pillow==10.3.0 watchdog==4.0.0 simplesystray==0.1.0; sys_platform == 'win32' semantic-version==2.10.0 +# For manipulating folder permissions and the like. +pywin32==306; sys_platform == 'win32' \ No newline at end of file diff --git a/stats.py b/stats.py index db61f789..965b7fc8 100644 --- a/stats.py +++ b/stats.py @@ -25,17 +25,14 @@ logger = EDMCLogging.get_main_logger() if sys.platform == 'win32': import ctypes - from ctypes.wintypes import HWND, POINT, RECT, SIZE, UINT + from ctypes.wintypes import POINT, RECT, SIZE, UINT + import win32gui try: CalculatePopupWindowPosition = ctypes.windll.user32.CalculatePopupWindowPosition CalculatePopupWindowPosition.argtypes = [ ctypes.POINTER(POINT), ctypes.POINTER(SIZE), UINT, ctypes.POINTER(RECT), ctypes.POINTER(RECT) ] - GetParent = ctypes.windll.user32.GetParent - GetParent.argtypes = [HWND] - GetWindowRect = ctypes.windll.user32.GetWindowRect - GetWindowRect.argtypes = [HWND, ctypes.POINTER(RECT)] except Exception: # Not supported under Wine 4.0 CalculatePopupWindowPosition = None # type: ignore @@ -423,7 +420,7 @@ class StatsResults(tk.Toplevel): # Ensure fully on-screen if sys.platform == 'win32' and CalculatePopupWindowPosition: position = RECT() - GetWindowRect(GetParent(self.winfo_id()), position) + win32gui.GetWindowRect(win32gui.GetParent(self.winfo_id()), position) if CalculatePopupWindowPosition( POINT(parent.winfo_rootx(), parent.winfo_rooty()), # - is evidently supported on the C side diff --git a/theme.py b/theme.py index 94e99f7a..dc48499e 100644 --- a/theme.py +++ b/theme.py @@ -34,6 +34,7 @@ if sys.platform == "linux": if sys.platform == 'win32': import ctypes from ctypes.wintypes import DWORD, LPCVOID, LPCWSTR + import win32gui AddFontResourceEx = ctypes.windll.gdi32.AddFontResourceExW AddFontResourceEx.restypes = [LPCWSTR, DWORD, LPCVOID] # type: ignore FR_PRIVATE = 0x10 @@ -427,8 +428,6 @@ class _Theme: GWL_EXSTYLE = -20 # noqa: N806 # ctypes WS_EX_APPWINDOW = 0x00040000 # noqa: N806 # ctypes WS_EX_LAYERED = 0x00080000 # noqa: N806 # ctypes - GetWindowLongW = ctypes.windll.user32.GetWindowLongW # noqa: N806 # ctypes - SetWindowLongW = ctypes.windll.user32.SetWindowLongW # noqa: N806 # ctypes # FIXME: Lose the "treat this like a boolean" bullshit if theme == self.THEME_DEFAULT: @@ -445,14 +444,14 @@ class _Theme: root.withdraw() root.update_idletasks() # Size and windows styles get recalculated here - hwnd = ctypes.windll.user32.GetParent(root.winfo_id()) - SetWindowLongW(hwnd, GWL_STYLE, GetWindowLongW(hwnd, GWL_STYLE) & ~WS_MAXIMIZEBOX) # disable maximize + hwnd = win32gui.GetParent(root.winfo_id()) + win32gui.SetWindowLong(hwnd, GWL_STYLE, win32gui.GetWindowLong(hwnd, GWL_STYLE) & ~WS_MAXIMIZEBOX) # disable maximize if theme == self.THEME_TRANSPARENT: - SetWindowLongW(hwnd, GWL_EXSTYLE, WS_EX_APPWINDOW | WS_EX_LAYERED) # Add to taskbar + win32gui.SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_APPWINDOW | WS_EX_LAYERED) # Add to taskbar else: - SetWindowLongW(hwnd, GWL_EXSTYLE, WS_EX_APPWINDOW) # Add to taskbar + win32gui.SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_APPWINDOW) # Add to taskbar root.deiconify() root.wait_visibility() # need main window to be displayed before returning From 256be4c8a9351729798382234c88cafa4abfeace Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 10 Jun 2024 23:03:20 -0400 Subject: [PATCH 330/425] [1805] Linter Cleanup --- hotkey/windows.py | 2 +- theme.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/hotkey/windows.py b/hotkey/windows.py index cbcbd161..188c89e9 100644 --- a/hotkey/windows.py +++ b/hotkey/windows.py @@ -270,7 +270,7 @@ class WindowsHotkeyMgr(AbstractHotkeyMgr): """Stop acquiring hotkey state.""" pass - def fromevent(self, event) -> bool | tuple | None: + def fromevent(self, event) -> bool | tuple | None: # noqa: CCR001 """ Return configuration (keycode, modifiers) or None=clear or False=retain previous. diff --git a/theme.py b/theme.py index dc48499e..121bcb60 100644 --- a/theme.py +++ b/theme.py @@ -445,7 +445,8 @@ class _Theme: root.withdraw() root.update_idletasks() # Size and windows styles get recalculated here hwnd = win32gui.GetParent(root.winfo_id()) - win32gui.SetWindowLong(hwnd, GWL_STYLE, win32gui.GetWindowLong(hwnd, GWL_STYLE) & ~WS_MAXIMIZEBOX) # disable maximize + win32gui.SetWindowLong(hwnd, GWL_STYLE, + win32gui.GetWindowLong(hwnd, GWL_STYLE) & ~WS_MAXIMIZEBOX) # disable maximize if theme == self.THEME_TRANSPARENT: win32gui.SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_APPWINDOW | WS_EX_LAYERED) # Add to taskbar From b1ba45ab906c14a50c7a2b099624b7f4b29dce2c Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 10 Jun 2024 23:29:04 -0400 Subject: [PATCH 331/425] [1805] Update Prototypes --- hotkey/windows.py | 5 ++++- l10n.py | 1 - monitor.py | 4 +++- prefs.py | 5 ++++- stats.py | 12 ++++++------ 5 files changed, 17 insertions(+), 10 deletions(-) diff --git a/hotkey/windows.py b/hotkey/windows.py index 188c89e9..671df1e8 100644 --- a/hotkey/windows.py +++ b/hotkey/windows.py @@ -8,7 +8,7 @@ import sys import threading import tkinter as tk import winsound -from ctypes.wintypes import DWORD, LONG, MSG, ULONG, WORD +from ctypes.wintypes import DWORD, LONG, MSG, ULONG, WORD, HWND, BOOL, UINT import pywintypes import win32api import win32gui @@ -21,6 +21,8 @@ assert sys.platform == 'win32' logger = get_main_logger() UnregisterHotKey = ctypes.windll.user32.UnregisterHotKey # TODO: Coming Soon +UnregisterHotKey.argtypes = [HWND, ctypes.c_int] +UnregisterHotKey.restype = BOOL MOD_ALT = 0x0001 MOD_CONTROL = 0x0002 @@ -138,6 +140,7 @@ class INPUT(ctypes.Structure): SendInput = ctypes.windll.user32.SendInput SendInput.argtypes = [ctypes.c_uint, ctypes.POINTER(INPUT), ctypes.c_int] +SendInput.restype = UINT INPUT_MOUSE = 0 INPUT_KEYBOARD = 1 diff --git a/l10n.py b/l10n.py index 8613244f..29c18f75 100755 --- a/l10n.py +++ b/l10n.py @@ -50,7 +50,6 @@ if sys.platform == 'win32': GetUserPreferredUILanguages.argtypes = [ DWORD, ctypes.POINTER(ctypes.c_ulong), LPCVOID, ctypes.POINTER(ctypes.c_ulong) ] - GetUserPreferredUILanguages.restype = BOOL LOCALE_NAME_USER_DEFAULT = None diff --git a/monitor.py b/monitor.py index ba1a4d39..5a971c69 100644 --- a/monitor.py +++ b/monitor.py @@ -36,7 +36,7 @@ MAX_FCMATERIALS_DISCREPANCY = 5 # Timestamp difference in seconds if sys.platform == 'win32': import ctypes - from ctypes.wintypes import BOOL, HWND, LPARAM + from ctypes.wintypes import BOOL, HWND, LPARAM, HANDLE import win32gui from watchdog.events import FileSystemEventHandler, FileSystemEvent @@ -45,6 +45,8 @@ if sys.platform == 'win32': EnumWindowsProc = ctypes.WINFUNCTYPE(BOOL, HWND, LPARAM) CloseHandle = ctypes.windll.kernel32.CloseHandle + CloseHandle.argtypes = [HANDLE] + CloseHandle.restype = BOOL GetProcessHandleFromHwnd = ctypes.windll.oleacc.GetProcessHandleFromHwnd else: diff --git a/prefs.py b/prefs.py index e7ccef18..89e107fb 100644 --- a/prefs.py +++ b/prefs.py @@ -188,7 +188,7 @@ class AutoInc(contextlib.AbstractContextManager): if sys.platform == 'win32': import ctypes import winreg - from ctypes.wintypes import HINSTANCE, LPCWSTR, LPWSTR, MAX_PATH, POINT, RECT, SIZE, UINT + from ctypes.wintypes import HINSTANCE, LPCWSTR, LPWSTR, MAX_PATH, POINT, RECT, SIZE, UINT, BOOL import win32gui is_wine = False try: @@ -204,6 +204,8 @@ if sys.platform == 'win32': if not is_wine: try: CalculatePopupWindowPosition = ctypes.windll.user32.CalculatePopupWindowPosition + CalculatePopupWindowPosition.argtypes = [POINT, SIZE, UINT, RECT, RECT] + CalculatePopupWindowPosition.restype = BOOL except AttributeError as e: logger.error( @@ -225,6 +227,7 @@ if sys.platform == 'win32': LoadString = ctypes.windll.user32.LoadStringW LoadString.argtypes = [HINSTANCE, UINT, LPWSTR, ctypes.c_int] + LoadString.restype = ctypes.c_int class PreferencesDialog(tk.Toplevel): diff --git a/stats.py b/stats.py index 965b7fc8..b8a6531a 100644 --- a/stats.py +++ b/stats.py @@ -25,7 +25,7 @@ logger = EDMCLogging.get_main_logger() if sys.platform == 'win32': import ctypes - from ctypes.wintypes import POINT, RECT, SIZE, UINT + from ctypes.wintypes import POINT, RECT, SIZE, UINT, BOOL import win32gui try: @@ -33,6 +33,7 @@ if sys.platform == 'win32': 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 @@ -240,7 +241,7 @@ def ships(companion_data: dict[str, Any]) -> list[ShipRet]: """ Return a list of 5 tuples of ship information. - :param data: [description] + :param companion_data: [description] :return: A 5 tuple of strings containing: Ship ID, Ship Type Name (internal), Ship Name, System, Station, and Value """ ships: list[dict[str, Any]] = companion.listify(cast(list, companion_data.get('ships'))) @@ -250,16 +251,15 @@ def ships(companion_data: dict[str, Any]) -> list[ShipRet]: ships.insert(0, ships.pop(current)) # Put current ship first if not companion_data['commander'].get('docked'): - out: list[ShipRet] = [] # Set current system, not last docked - out.append(ShipRet( + out: list[ShipRet] = [ShipRet( id=str(ships[0]['id']), type=ship_name_map.get(ships[0]['name'].lower(), ships[0]['name']), name=str(ships[0].get('shipName', '')), system=companion_data['lastSystem']['name'], station='', value=str(ships[0]['value']['total']) - )) + )] out.extend( ShipRet( id=str(ship['id']), @@ -299,7 +299,7 @@ def export_ships(companion_data: dict[str, Any], filename: AnyStr) -> None: h.writerow(list(thing)) -class StatsDialog(): +class StatsDialog: """Status dialog containing all of the current cmdr's stats.""" def __init__(self, parent: tk.Tk, status: tk.Label) -> None: From f8d354a4dd408fad5641ca7c5dc9dc93d8e4c41b Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 11 Jun 2024 10:42:57 -0400 Subject: [PATCH 332/425] [1805] Implement win32con in Hotkey --- EDMarketConnector.py | 40 ++++++++++------------- hotkey/windows.py | 76 ++++++++++++++------------------------------ monitor.py | 2 +- 3 files changed, 41 insertions(+), 77 deletions(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index cd76ccc0..e48a927c 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -253,23 +253,17 @@ if __name__ == '__main__': # noqa: C901 logger.trace_if('frontier-auth.windows', 'Begin...') if sys.platform == 'win32': - # If *this* instance hasn't locked, then another already has and we # now need to do the edmc:// checks for auth callback if locked != JournalLockResult.LOCKED: - from ctypes import windll, c_int, create_unicode_buffer, WINFUNCTYPE - from ctypes.wintypes import BOOL, HWND, INT, LPARAM, LPCWSTR, LPWSTR + from ctypes import windll, create_unicode_buffer, WINFUNCTYPE + from ctypes.wintypes import BOOL, HWND, LPARAM + import win32gui + import win32api - EnumWindows = windll.user32.EnumWindows # noqa: N806 - GetClassName = windll.user32.GetClassNameW # noqa: N806 - GetClassName.argtypes = [HWND, LPWSTR, c_int] - GetWindowText = windll.user32.GetWindowTextW # noqa: N806 - GetWindowText.argtypes = [HWND, LPWSTR, c_int] - GetWindowTextLength = windll.user32.GetWindowTextLengthW # noqa: N806 GetProcessHandleFromHwnd = windll.oleacc.GetProcessHandleFromHwnd # noqa: N806 SW_RESTORE = 9 # noqa: N806 - SetForegroundWindow = windll.user32.SetForegroundWindow # noqa: N806 ShowWindow = windll.user32.ShowWindow # noqa: N806 ShowWindowAsync = windll.user32.ShowWindowAsync # noqa: N806 @@ -278,14 +272,11 @@ if __name__ == '__main__': # noqa: C901 COINIT_DISABLE_OLE1DDE = 0x4 # noqa: N806 CoInitializeEx = windll.ole32.CoInitializeEx # noqa: N806 - ShellExecute = windll.shell32.ShellExecuteW # noqa: N806 - ShellExecute.argtypes = [HWND, LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR, INT] - def window_title(h: int) -> str | None: if h: - text_length = GetWindowTextLength(h) + 1 + text_length = win32gui.GetWindowTextLength(h) + 1 buf = create_unicode_buffer(text_length) - if GetWindowText(h, buf, text_length): + if win32gui.GetWindowText(h): return buf.value return None @@ -309,7 +300,7 @@ if __name__ == '__main__': # noqa: C901 # class name limited to 256 - https://msdn.microsoft.com/en-us/library/windows/desktop/ms633576 cls = create_unicode_buffer(257) # This conditional is exploded to make debugging slightly easier - if GetClassName(window_handle, cls, 257): + if win32gui.GetClassName(window_handle, cls, 257): if cls.value == 'TkTopLevel': if window_title(window_handle) == applongname: if GetProcessHandleFromHwnd(window_handle): @@ -318,11 +309,11 @@ if __name__ == '__main__': # noqa: C901 CoInitializeEx(0, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE) # Wait for it to be responsive to avoid ShellExecute recursing ShowWindow(window_handle, SW_RESTORE) - ShellExecute(0, None, sys.argv[1], None, None, SW_RESTORE) + win32api.ShellExecute(0, None, sys.argv[1], None, None, SW_RESTORE) else: ShowWindowAsync(window_handle, SW_RESTORE) - SetForegroundWindow(window_handle) + win32gui.SetForegroundWindow(window_handle) return False # Indicate window found, so stop iterating @@ -334,7 +325,7 @@ if __name__ == '__main__': # noqa: C901 # enumwindwsproc() on each. When an invocation returns False it # stops iterating. # Ref: - EnumWindows(enumwindowsproc, 0) + win32gui.EnumWindows(enumwindowsproc, 0) def already_running_popup(): """Create the "already running" popup.""" @@ -701,13 +692,14 @@ class AppWindow: if match: if sys.platform == 'win32': # Check that the titlebar will be at least partly on screen - import ctypes - from ctypes.wintypes import POINT + import win32api + import win32con + x = int(match.group(1)) + 16 + y = int(match.group(2)) + 16 + point = (x, y) # https://msdn.microsoft.com/en-us/library/dd145064 - MONITOR_DEFAULTTONULL = 0 # noqa: N806 - if ctypes.windll.user32.MonitorFromPoint(POINT(int(match.group(1)) + 16, int(match.group(2)) + 16), - MONITOR_DEFAULTTONULL): + if win32api.MonitorFromPoint(point, win32con.MONITOR_DEFAULTTONULL): self.w.geometry(config.get_str('geometry')) else: self.w.geometry(config.get_str('geometry')) diff --git a/hotkey/windows.py b/hotkey/windows.py index 671df1e8..51da80be 100644 --- a/hotkey/windows.py +++ b/hotkey/windows.py @@ -12,6 +12,7 @@ from ctypes.wintypes import DWORD, LONG, MSG, ULONG, WORD, HWND, BOOL, UINT import pywintypes import win32api import win32gui +import win32con from config import config from EDMCLogging import get_main_logger from hotkey import AbstractHotkeyMgr @@ -24,40 +25,10 @@ UnregisterHotKey = ctypes.windll.user32.UnregisterHotKey # TODO: Coming Soon UnregisterHotKey.argtypes = [HWND, ctypes.c_int] UnregisterHotKey.restype = BOOL -MOD_ALT = 0x0001 -MOD_CONTROL = 0x0002 -MOD_SHIFT = 0x0004 -MOD_WIN = 0x0008 MOD_NOREPEAT = 0x4000 - -WM_QUIT = 0x0012 -WM_HOTKEY = 0x0312 -WM_APP = 0x8000 -WM_SND_GOOD = WM_APP + 1 -WM_SND_BAD = WM_APP + 2 - -VK_BACK = 0x08 -VK_CLEAR = 0x0c -VK_RETURN = 0x0d -VK_SHIFT = 0x10 -VK_CONTROL = 0x11 -VK_MENU = 0x12 -VK_CAPITAL = 0x14 -VK_MODECHANGE = 0x1f -VK_ESCAPE = 0x1b -VK_SPACE = 0x20 -VK_DELETE = 0x2e -VK_LWIN = 0x5b -VK_RWIN = 0x5c -VK_NUMPAD0 = 0x60 -VK_DIVIDE = 0x6f -VK_F1 = 0x70 -VK_F24 = 0x87 +WM_SND_GOOD = win32con.WM_APP + 1 +WM_SND_BAD = win32con.WM_APP + 2 VK_OEM_MINUS = 0xbd -VK_NUMLOCK = 0x90 -VK_SCROLL = 0x91 -VK_PROCESSKEY = 0xe5 -VK_OEM_CLEAR = 0xfe # VirtualKey mapping values # @@ -200,7 +171,7 @@ class WindowsHotkeyMgr(AbstractHotkeyMgr): logger.debug('Thread is/was running') self.thread = None # type: ignore logger.debug('Telling thread WM_QUIT') - win32gui.PostThreadMessage(thread.ident, WM_QUIT, 0, 0) + win32gui.PostThreadMessage(thread.ident, win32con.WM_QUIT, 0, 0) logger.debug('Joining thread') thread.join() # Wait for it to unregister hotkey and quit @@ -226,7 +197,7 @@ class WindowsHotkeyMgr(AbstractHotkeyMgr): logger.debug('Entering GetMessage() loop...') while win32gui.GetMessage(ctypes.byref(msg), None, 0, 0) != 0: logger.debug('Got message') - if msg.message == WM_HOTKEY: + if msg.message == win32con.WM_HOTKEY: logger.debug('WM_HOTKEY') if ( @@ -284,31 +255,32 @@ class WindowsHotkeyMgr(AbstractHotkeyMgr): :param event: tk event ? :return: False to retain previous, None to not use, else (keycode, modifiers) """ - modifiers = ((win32api.GetKeyState(VK_MENU) & 0x8000) and MOD_ALT) \ - | ((win32api.GetKeyState(VK_CONTROL) & 0x8000) and MOD_CONTROL) \ - | ((win32api.GetKeyState(VK_SHIFT) & 0x8000) and MOD_SHIFT) \ - | ((win32api.GetKeyState(VK_LWIN) & 0x8000) and MOD_WIN) \ - | ((win32api.GetKeyState(VK_RWIN) & 0x8000) and MOD_WIN) + modifiers = ((win32api.GetKeyState(win32con.VK_MENU) & 0x8000) and win32con.MOD_ALT) \ + | ((win32api.GetKeyState(win32con.VK_CONTROL) & 0x8000) and win32con.MOD_CONTROL) \ + | ((win32api.GetKeyState(win32con.VK_SHIFT) & 0x8000) and win32con.MOD_SHIFT) \ + | ((win32api.GetKeyState(win32con.VK_LWIN) & 0x8000) and win32con.MOD_WIN) \ + | ((win32api.GetKeyState(win32con.VK_RWIN) & 0x8000) and win32con.MOD_WIN) keycode = event.keycode - if keycode in (VK_SHIFT, VK_CONTROL, VK_MENU, VK_LWIN, VK_RWIN): + if keycode in (win32con.VK_SHIFT, win32con.VK_CONTROL, win32con.VK_MENU, win32con.VK_LWIN, win32con.VK_RWIN): return 0, modifiers if not modifiers: - if keycode == VK_ESCAPE: # Esc = retain previous + if keycode == win32con.VK_ESCAPE: # Esc = retain previous return False - if keycode in (VK_BACK, VK_DELETE, VK_CLEAR, VK_OEM_CLEAR): # BkSp, Del, Clear = clear hotkey + if keycode in (win32con.VK_BACK, win32con.VK_DELETE, + win32con.VK_CLEAR, win32con.VK_OEM_CLEAR): # BkSp, Del, Clear = clear hotkey return None if ( - keycode in (VK_RETURN, VK_SPACE, VK_OEM_MINUS) or ord('A') <= keycode <= ord('Z') + keycode in (win32con.VK_RETURN, win32con.VK_SPACE, VK_OEM_MINUS) or ord('A') <= keycode <= ord('Z') ): # don't allow keys needed for typing in System Map winsound.MessageBeep() return None - if (keycode in (VK_NUMLOCK, VK_SCROLL, VK_PROCESSKEY) - or VK_CAPITAL <= keycode <= VK_MODECHANGE): # ignore unmodified mode switch keys + if (keycode in (win32con.VK_NUMLOCK, win32con.VK_SCROLL, win32con.VK_PROCESSKEY) + or win32con.VK_CAPITAL <= keycode <= win32con.VK_MODECHANGE): # ignore unmodified mode switch keys return 0, modifiers # See if the keycode is usable and available @@ -329,26 +301,26 @@ class WindowsHotkeyMgr(AbstractHotkeyMgr): :return: string form """ text = '' - if modifiers & MOD_WIN: + if modifiers & win32con.MOD_WIN: text += '❖+' - if modifiers & MOD_CONTROL: + if modifiers & win32con.MOD_CONTROL: text += 'Ctrl+' - if modifiers & MOD_ALT: + if modifiers & win32con.MOD_ALT: text += 'Alt+' - if modifiers & MOD_SHIFT: + if modifiers & win32con.MOD_SHIFT: text += '⇧+' - if VK_NUMPAD0 <= keycode <= VK_DIVIDE: + if win32con.VK_NUMPAD0 <= keycode <= win32con.VK_DIVIDE: text += '№' if not keycode: pass - elif VK_F1 <= keycode <= VK_F24: - text += f'F{keycode + 1 - VK_F1}' + elif win32con.VK_F1 <= keycode <= win32con.VK_F24: + text += f'F{keycode + 1 - win32con.VK_F1}' elif keycode in WindowsHotkeyMgr.DISPLAY: # specials text += WindowsHotkeyMgr.DISPLAY[keycode] diff --git a/monitor.py b/monitor.py index 5a971c69..2f508bf9 100644 --- a/monitor.py +++ b/monitor.py @@ -2127,7 +2127,7 @@ class EDLogs(FileSystemEventHandler): if h: length = win32gui.GetWindowTextLength(h) + 1 buf = ctypes.create_unicode_buffer(length) - if win32gui.GetWindowText(h, buf, length): + if win32gui.GetWindowText(h): return buf.value return None From 571558daffe579f856cd1d1efc4af42f7caf3b17 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 11 Jun 2024 11:06:58 -0400 Subject: [PATCH 333/425] [1805] Additional Handover --- EDMarketConnector.py | 8 ++++---- hotkey/windows.py | 2 +- protocol.py | 10 +++++----- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index e48a927c..0cd34486 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -260,10 +260,10 @@ if __name__ == '__main__': # noqa: C901 from ctypes.wintypes import BOOL, HWND, LPARAM import win32gui import win32api + import win32con GetProcessHandleFromHwnd = windll.oleacc.GetProcessHandleFromHwnd # noqa: N806 - SW_RESTORE = 9 # noqa: N806 ShowWindow = windll.user32.ShowWindow # noqa: N806 ShowWindowAsync = windll.user32.ShowWindowAsync # noqa: N806 @@ -308,11 +308,11 @@ if __name__ == '__main__': # noqa: C901 if len(sys.argv) > 1 and sys.argv[1].startswith(protocolhandler_redirect): CoInitializeEx(0, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE) # Wait for it to be responsive to avoid ShellExecute recursing - ShowWindow(window_handle, SW_RESTORE) - win32api.ShellExecute(0, None, sys.argv[1], None, None, SW_RESTORE) + ShowWindow(window_handle, win32con.SW_RESTORE) + win32api.ShellExecute(0, None, sys.argv[1], None, None, win32con.SW_RESTORE) else: - ShowWindowAsync(window_handle, SW_RESTORE) + ShowWindowAsync(window_handle, win32con.SW_RESTORE) win32gui.SetForegroundWindow(window_handle) return False # Indicate window found, so stop iterating diff --git a/hotkey/windows.py b/hotkey/windows.py index 51da80be..95b1a83a 100644 --- a/hotkey/windows.py +++ b/hotkey/windows.py @@ -49,7 +49,7 @@ def window_title(h) -> str: if h: title_length = win32gui.GetWindowTextLength(h) + 1 buf = ctypes.create_unicode_buffer(title_length) - if win32gui.GetWindowText(h, buf, title_length): + if win32gui.GetWindowText(h): return buf.value return '' diff --git a/protocol.py b/protocol.py index 1fb88595..eed14b44 100644 --- a/protocol.py +++ b/protocol.py @@ -76,6 +76,9 @@ if (config.auth_force_edmc_protocol # noqa: C901 ATOM, BOOL, DWORD, HBRUSH, HGLOBAL, HICON, HINSTANCE, HMENU, HWND, INT, LPARAM, LPCWSTR, LPMSG, LPVOID, LPWSTR, MSG, UINT, WPARAM ) + from win32con import CW_USEDEFAULT + import win32gui + import win32con class WNDCLASS(Structure): """ @@ -98,7 +101,6 @@ if (config.auth_force_edmc_protocol # noqa: C901 ('lpszClassName', LPCWSTR) ] - CW_USEDEFAULT = 0x80000000 CreateWindowExW = windll.user32.CreateWindowExW CreateWindowExW.argtypes = [DWORD, LPCWSTR, LPCWSTR, DWORD, INT, INT, INT, INT, HWND, HMENU, HINSTANCE, LPVOID] @@ -114,7 +116,6 @@ if (config.auth_force_edmc_protocol # noqa: C901 paramflags = (1, "hWnd"), (1, "Msg"), (1, "wParam"), (1, "lParam") DefWindowProcW = prototype(("DefWindowProcW", windll.user32), paramflags) - GetParent = windll.user32.GetParent SetForegroundWindow = windll.user32.SetForegroundWindow # @@ -132,7 +133,6 @@ if (config.auth_force_edmc_protocol # noqa: C901 PostMessageW = windll.user32.PostMessageW PostMessageW.argtypes = [HWND, UINT, WPARAM, LPARAM] - WM_QUIT = 0x0012 # https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-dde-initiate WM_DDE_INITIATE = 0x03E0 WM_DDE_TERMINATE = 0x03E1 @@ -229,7 +229,7 @@ if (config.auth_force_edmc_protocol # noqa: C901 thread = self.thread if thread: self.thread = None - PostThreadMessageW(thread.ident, WM_QUIT, 0, 0) + PostThreadMessageW(thread.ident, win32con.WM_QUIT, 0, 0) thread.join() # Wait for it to quit def worker(self) -> None: @@ -291,7 +291,7 @@ if (config.auth_force_edmc_protocol # noqa: C901 logger.debug(f'Message starts with {self.redirect}') self.event(url) - SetForegroundWindow(GetParent(self.master.winfo_id())) # raise app window + SetForegroundWindow(win32gui.GetParent(self.master.winfo_id())) # raise app window # Send back a WM_DDE_ACK. this is _required_ with WM_DDE_EXECUTE PostMessageW(msg.wParam, WM_DDE_ACK, hwnd, PackDDElParam(WM_DDE_ACK, 0x80, msg.lParam)) From 625856c31c871559bf02f4f64c0617c54fcad711 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 11 Jun 2024 11:36:43 -0400 Subject: [PATCH 334/425] [1805] Apply More Pywin32 --- EDMarketConnector.py | 4 +-- monitor.py | 8 ++--- prefs.py | 11 +++---- protocol.py | 75 ++++++++++++-------------------------------- stats.py | 2 +- theme.py | 15 +++------ 6 files changed, 34 insertions(+), 81 deletions(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index 0cd34486..ecc84e1b 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -263,8 +263,6 @@ if __name__ == '__main__': # noqa: C901 import win32con GetProcessHandleFromHwnd = windll.oleacc.GetProcessHandleFromHwnd # noqa: N806 - - ShowWindow = windll.user32.ShowWindow # noqa: N806 ShowWindowAsync = windll.user32.ShowWindowAsync # noqa: N806 COINIT_MULTITHREADED = 0 # noqa: N806,F841 @@ -308,7 +306,7 @@ if __name__ == '__main__': # noqa: C901 if len(sys.argv) > 1 and sys.argv[1].startswith(protocolhandler_redirect): CoInitializeEx(0, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE) # Wait for it to be responsive to avoid ShellExecute recursing - ShowWindow(window_handle, win32con.SW_RESTORE) + win32gui.ShowWindow(window_handle, win32con.SW_RESTORE) win32api.ShellExecute(0, None, sys.argv[1], None, None, win32con.SW_RESTORE) else: diff --git a/monitor.py b/monitor.py index 2f508bf9..8b55a2b9 100644 --- a/monitor.py +++ b/monitor.py @@ -36,17 +36,15 @@ MAX_FCMATERIALS_DISCREPANCY = 5 # Timestamp difference in seconds if sys.platform == 'win32': import ctypes - from ctypes.wintypes import BOOL, HWND, LPARAM, HANDLE + from ctypes.wintypes import BOOL, HWND, LPARAM import win32gui + import win32api from watchdog.events import FileSystemEventHandler, FileSystemEvent from watchdog.observers import Observer from watchdog.observers.api import BaseObserver EnumWindowsProc = ctypes.WINFUNCTYPE(BOOL, HWND, LPARAM) - CloseHandle = ctypes.windll.kernel32.CloseHandle - CloseHandle.argtypes = [HANDLE] - CloseHandle.restype = BOOL GetProcessHandleFromHwnd = ctypes.windll.oleacc.GetProcessHandleFromHwnd else: @@ -2136,7 +2134,7 @@ class EDLogs(FileSystemEventHandler): if name and name.startswith('Elite - Dangerous'): handle = GetProcessHandleFromHwnd(hWnd) if handle: # If GetProcessHandleFromHwnd succeeds then the app is already running as this user - CloseHandle(handle) + win32api.CloseHandle(handle) return False # stop enumeration return True diff --git a/prefs.py b/prefs.py index 89e107fb..7e4465d1 100644 --- a/prefs.py +++ b/prefs.py @@ -188,8 +188,9 @@ class AutoInc(contextlib.AbstractContextManager): if sys.platform == 'win32': import ctypes import winreg - from ctypes.wintypes import HINSTANCE, 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 is_wine = False try: WINE_REGISTRY_KEY = r'HKEY_LOCAL_MACHINE\Software\Wine' @@ -225,10 +226,6 @@ if sys.platform == 'win32': SHGetLocalizedName = ctypes.windll.shell32.SHGetLocalizedName SHGetLocalizedName.argtypes = [LPCWSTR, LPWSTR, UINT, ctypes.POINTER(ctypes.c_int)] - LoadString = ctypes.windll.user32.LoadStringW - LoadString.argtypes = [HINSTANCE, UINT, LPWSTR, ctypes.c_int] - LoadString.restype = ctypes.c_int - class PreferencesDialog(tk.Toplevel): """The EDMC preferences dialog.""" @@ -313,7 +310,7 @@ class PreferencesDialog(tk.Toplevel): # Ensure fully on-screen if sys.platform == 'win32' and CalculatePopupWindowPosition: position = RECT() - win32gui.GetWindowRect(win32gui.GetParent(self.winfo_id()), position) + 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 @@ -1093,7 +1090,7 @@ class PreferencesDialog(tk.Toplevel): for i in range(start, len(components)): try: if (not SHGetLocalizedName('\\'.join(components[:i+1]), buf, MAX_PATH, ctypes.byref(pidsRes)) and - LoadString(ctypes.WinDLL(expandvars(buf.value))._handle, pidsRes.value, buf, MAX_PATH)): + win32api.LoadString(ctypes.WinDLL(expandvars(buf.value))._handle, pidsRes.value, buf, MAX_PATH)): display.append(buf.value) else: diff --git a/protocol.py b/protocol.py index eed14b44..a0f02f15 100644 --- a/protocol.py +++ b/protocol.py @@ -69,16 +69,16 @@ if (config.auth_force_edmc_protocol # noqa: C901 # This could be false if you use auth_force_edmc_protocol, but then you get to keep the pieces assert sys.platform == 'win32' # spell-checker: words HBRUSH HICON WPARAM wstring WNDCLASS HMENU HGLOBAL - from ctypes import ( # type: ignore - windll, POINTER, WINFUNCTYPE, Structure, byref, c_long, c_void_p, create_unicode_buffer, wstring_at + from ctypes import ( + windll, WINFUNCTYPE, Structure, byref, c_long, c_void_p, create_unicode_buffer, wstring_at ) from ctypes.wintypes import ( - ATOM, BOOL, DWORD, HBRUSH, HGLOBAL, HICON, HINSTANCE, HMENU, HWND, INT, LPARAM, LPCWSTR, LPMSG, LPVOID, LPWSTR, + ATOM, HBRUSH, HICON, HINSTANCE, HWND, INT, LPARAM, LPCWSTR, LPWSTR, MSG, UINT, WPARAM ) - from win32con import CW_USEDEFAULT import win32gui import win32con + import win32api class WNDCLASS(Structure): """ @@ -101,37 +101,7 @@ if (config.auth_force_edmc_protocol # noqa: C901 ('lpszClassName', LPCWSTR) ] - - CreateWindowExW = windll.user32.CreateWindowExW - CreateWindowExW.argtypes = [DWORD, LPCWSTR, LPCWSTR, DWORD, INT, INT, INT, INT, HWND, HMENU, HINSTANCE, LPVOID] - CreateWindowExW.restype = HWND - RegisterClassW = windll.user32.RegisterClassW - RegisterClassW.argtypes = [POINTER(WNDCLASS)] - # DefWindowProcW - # Ref: - # LRESULT DefWindowProcW([in] HWND hWnd,[in] UINT Msg,[in] WPARAM wParam,[in] LPARAM lParam); - # As per example at - - prototype = WINFUNCTYPE(c_long, HWND, UINT, WPARAM, LPARAM) - paramflags = (1, "hWnd"), (1, "Msg"), (1, "wParam"), (1, "lParam") - DefWindowProcW = prototype(("DefWindowProcW", windll.user32), paramflags) - - SetForegroundWindow = windll.user32.SetForegroundWindow - - # - # NB: Despite 'BOOL' return type, it *can* be >0, 0 or -1, so is actually - # c_long - prototype = WINFUNCTYPE(c_long, LPMSG, HWND, UINT, UINT) - paramflags = (1, "lpMsg"), (1, "hWnd"), (1, "wMsgFilterMin"), (1, "wMsgFilterMax") - GetMessageW = prototype(("GetMessageW", windll.user32), paramflags) - TranslateMessage = windll.user32.TranslateMessage - DispatchMessageW = windll.user32.DispatchMessageW - PostThreadMessageW = windll.user32.PostThreadMessageW - SendMessageW = windll.user32.SendMessageW - SendMessageW.argtypes = [HWND, UINT, WPARAM, LPARAM] - PostMessageW = windll.user32.PostMessageW - PostMessageW.argtypes = [HWND, UINT, WPARAM, LPARAM] # https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-dde-initiate WM_DDE_INITIATE = 0x03E0 @@ -148,12 +118,6 @@ if (config.auth_force_edmc_protocol # noqa: C901 GlobalGetAtomNameW = windll.kernel32.GlobalGetAtomNameW GlobalGetAtomNameW.argtypes = [ATOM, LPWSTR, INT] GlobalGetAtomNameW.restype = UINT - GlobalLock = windll.kernel32.GlobalLock - GlobalLock.argtypes = [HGLOBAL] - GlobalLock.restype = LPVOID - GlobalUnlock = windll.kernel32.GlobalUnlock - GlobalUnlock.argtypes = [HGLOBAL] - GlobalUnlock.restype = BOOL # Windows Message handler stuff (IPC) # https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms633573(v=vs.85) @@ -171,7 +135,7 @@ if (config.auth_force_edmc_protocol # noqa: C901 if message != WM_DDE_INITIATE: # Not a DDE init message, bail and tell windows to do the default # https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-defwindowproca?redirectedfrom=MSDN - return DefWindowProcW(hwnd, message, wParam, lParam) + return win32gui.DefWindowProc(hwnd, message, wParam, lParam) service = create_unicode_buffer(256) topic = create_unicode_buffer(256) @@ -196,7 +160,7 @@ if (config.auth_force_edmc_protocol # noqa: C901 if target_is_valid and topic_is_valid: # if everything is happy, send an acknowledgement of the DDE request - SendMessageW( + win32gui.SendMessage( wParam, WM_DDE_ACK, hwnd, PackDDElParam(WM_DDE_ACK, GlobalAddAtomW(appname), GlobalAddAtomW('System')) ) @@ -229,7 +193,7 @@ if (config.auth_force_edmc_protocol # noqa: C901 thread = self.thread if thread: self.thread = None - PostThreadMessageW(thread.ident, win32con.WM_QUIT, 0, 0) + win32api.PostThreadMessage(thread.ident, win32con.WM_QUIT, 0, 0) thread.join() # Wait for it to quit def worker(self) -> None: @@ -239,24 +203,25 @@ if (config.auth_force_edmc_protocol # noqa: C901 wndclass.lpfnWndProc = WndProc wndclass.cbClsExtra = 0 wndclass.cbWndExtra = 0 - wndclass.hInstance = windll.kernel32.GetModuleHandleW(0) + wndclass.hInstance = win32gui.GetModuleHandle(0) wndclass.hIcon = None wndclass.hCursor = None wndclass.hbrBackground = None wndclass.lpszMenuName = None wndclass.lpszClassName = 'DDEServer' - if not RegisterClassW(byref(wndclass)): + if not win32gui.RegisterClass(byref(wndclass)): print('Failed to register Dynamic Data Exchange for cAPI') return # https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-createwindowexw - hwnd = CreateWindowExW( + hwnd = win32gui.CreateWindowEx( 0, # dwExStyle wndclass.lpszClassName, # lpClassName "DDE Server", # lpWindowName 0, # dwStyle - CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, # X, Y, nWidth, nHeight + # X, Y, nWidth, nHeight + win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, self.master.winfo_id(), # hWndParent # Don't use HWND_MESSAGE since the window won't get DDE broadcasts None, # hMenu wndclass.hInstance, # hInstance @@ -276,13 +241,13 @@ if (config.auth_force_edmc_protocol # noqa: C901 # # But it does actually work. Either getting a non-0 value and # entering the loop, or getting 0 and exiting it. - while GetMessageW(byref(msg), None, 0, 0) != 0: + while win32gui.GetMessage(byref(msg), None, 0, 0) != 0: logger.trace_if('frontier-auth.windows', f'DDE message of type: {msg.message}') if msg.message == WM_DDE_EXECUTE: # GlobalLock does some sort of "please dont move this?" # https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-globallock - args = wstring_at(GlobalLock(msg.lParam)).strip() - GlobalUnlock(msg.lParam) # Unlocks the GlobalLock-ed object + args = wstring_at(win32gui.GlobalLock(msg.lParam)).strip() + win32gui.GlobalUnlock(msg.lParam) # Unlocks the GlobalLock-ed object if args.lower().startswith('open("') and args.endswith('")'): logger.trace_if('frontier-auth.windows', f'args are: {args}') @@ -291,20 +256,20 @@ if (config.auth_force_edmc_protocol # noqa: C901 logger.debug(f'Message starts with {self.redirect}') self.event(url) - SetForegroundWindow(win32gui.GetParent(self.master.winfo_id())) # raise app window + win32gui.SetForegroundWindow(win32gui.GetParent(self.master.winfo_id())) # raise app window # Send back a WM_DDE_ACK. this is _required_ with WM_DDE_EXECUTE - PostMessageW(msg.wParam, WM_DDE_ACK, hwnd, PackDDElParam(WM_DDE_ACK, 0x80, msg.lParam)) + win32gui.PostMessage(msg.wParam, WM_DDE_ACK, hwnd, PackDDElParam(WM_DDE_ACK, 0x80, msg.lParam)) else: # Send back a WM_DDE_ACK. this is _required_ with WM_DDE_EXECUTE - PostMessageW(msg.wParam, WM_DDE_ACK, hwnd, PackDDElParam(WM_DDE_ACK, 0, msg.lParam)) + win32gui.PostMessage(msg.wParam, WM_DDE_ACK, hwnd, PackDDElParam(WM_DDE_ACK, 0, msg.lParam)) elif msg.message == WM_DDE_TERMINATE: - PostMessageW(msg.wParam, WM_DDE_TERMINATE, hwnd, 0) + win32gui.PostMessage(msg.wParam, WM_DDE_TERMINATE, hwnd, 0) else: TranslateMessage(byref(msg)) # "Translates virtual key messages into character messages" ??? - DispatchMessageW(byref(msg)) + win32gui.DispatchMessage(byref(msg)) else: # Linux / Run from source diff --git a/stats.py b/stats.py index b8a6531a..b0ba34b3 100644 --- a/stats.py +++ b/stats.py @@ -420,7 +420,7 @@ class StatsResults(tk.Toplevel): # Ensure fully on-screen if sys.platform == 'win32' and CalculatePopupWindowPosition: position = RECT() - win32gui.GetWindowRect(win32gui.GetParent(self.winfo_id()), position) + win32gui.GetWindowRect(win32gui.GetParent(self.winfo_id())) if CalculatePopupWindowPosition( POINT(parent.winfo_rootx(), parent.winfo_rooty()), # - is evidently supported on the C side diff --git a/theme.py b/theme.py index 121bcb60..6024bf4f 100644 --- a/theme.py +++ b/theme.py @@ -422,12 +422,7 @@ class _Theme: self.active = theme if sys.platform == 'win32': - GWL_STYLE = -16 # noqa: N806 # ctypes - WS_MAXIMIZEBOX = 0x00010000 # noqa: N806 # ctypes - # tk8.5.9/win/tkWinWm.c:342 - GWL_EXSTYLE = -20 # noqa: N806 # ctypes - WS_EX_APPWINDOW = 0x00040000 # noqa: N806 # ctypes - WS_EX_LAYERED = 0x00080000 # noqa: N806 # ctypes + import win32con # FIXME: Lose the "treat this like a boolean" bullshit if theme == self.THEME_DEFAULT: @@ -445,14 +440,14 @@ class _Theme: root.withdraw() root.update_idletasks() # Size and windows styles get recalculated here hwnd = win32gui.GetParent(root.winfo_id()) - win32gui.SetWindowLong(hwnd, GWL_STYLE, - win32gui.GetWindowLong(hwnd, GWL_STYLE) & ~WS_MAXIMIZEBOX) # disable maximize + win32gui.SetWindowLong(hwnd, win32con.GWL_STYLE, + win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE) & ~win32con.WS_MAXIMIZEBOX) # disable maximize if theme == self.THEME_TRANSPARENT: - win32gui.SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_APPWINDOW | WS_EX_LAYERED) # Add to taskbar + win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, win32con.WS_EX_APPWINDOW | win32con.WS_EX_LAYERED) # Add to taskbar else: - win32gui.SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_APPWINDOW) # Add to taskbar + win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, win32con.WS_EX_APPWINDOW) # Add to taskbar root.deiconify() root.wait_visibility() # need main window to be displayed before returning From 85f5c3283dd50d35226990ab129d58fc4ebf4e66 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 11 Jun 2024 11:40:18 -0400 Subject: [PATCH 335/425] [1805] Shut UP flake8 --- prefs.py | 3 ++- theme.py | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/prefs.py b/prefs.py index 7e4465d1..e2afa280 100644 --- a/prefs.py +++ b/prefs.py @@ -1090,7 +1090,8 @@ class PreferencesDialog(tk.Toplevel): for i in range(start, len(components)): try: if (not SHGetLocalizedName('\\'.join(components[:i+1]), buf, MAX_PATH, ctypes.byref(pidsRes)) and - win32api.LoadString(ctypes.WinDLL(expandvars(buf.value))._handle, pidsRes.value, buf, MAX_PATH)): + win32api.LoadString(ctypes.WinDLL(expandvars(buf.value))._handle, + pidsRes.value, buf, MAX_PATH)): display.append(buf.value) else: diff --git a/theme.py b/theme.py index 6024bf4f..b638bea2 100644 --- a/theme.py +++ b/theme.py @@ -441,10 +441,12 @@ class _Theme: root.update_idletasks() # Size and windows styles get recalculated here hwnd = win32gui.GetParent(root.winfo_id()) win32gui.SetWindowLong(hwnd, win32con.GWL_STYLE, - win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE) & ~win32con.WS_MAXIMIZEBOX) # disable maximize + win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE) + & ~win32con.WS_MAXIMIZEBOX) # disable maximize if theme == self.THEME_TRANSPARENT: - win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, win32con.WS_EX_APPWINDOW | win32con.WS_EX_LAYERED) # Add to taskbar + win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, + win32con.WS_EX_APPWINDOW | win32con.WS_EX_LAYERED) # Add to taskbar else: win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, win32con.WS_EX_APPWINDOW) # Add to taskbar From c60c0483b45149908c14300b1bb9860b2a55d062 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sat, 15 Jun 2024 22:13:34 -0400 Subject: [PATCH 336/425] [#2262] Initial SLEF Output --- coriolis-update-files.py | 3 +- inara.json | 267 +++++++++++++++++++++++++++++++++++++++ plugins/inara.py | 53 ++++++++ ships.json | 117 +++++++++++------ 4 files changed, 400 insertions(+), 40 deletions(-) create mode 100644 inara.json diff --git a/coriolis-update-files.py b/coriolis-update-files.py index f31a2e32..6dfcc0c9 100755 --- a/coriolis-update-files.py +++ b/coriolis-update-files.py @@ -51,7 +51,8 @@ if __name__ == "__main__": for m in list(data['Ships'].values()): name = coriolis_ship_map.get(m['properties']['name'], str(m['properties']['name'])) assert name in reverse_ship_map, name - ships[name] = {'hullMass': m['properties']['hullMass']} + ships[name] = {'hullMass': m['properties']['hullMass'], + 'reserveFuelCapacity': m['properties']['reserveFuelCapacity']} for i, bulkhead in enumerate(bulkheads): modules['_'.join([reverse_ship_map[name], 'armour', bulkhead])] = {'mass': m['bulkheads'][i]['mass']} diff --git a/inara.json b/inara.json new file mode 100644 index 00000000..1c5cba8a --- /dev/null +++ b/inara.json @@ -0,0 +1,267 @@ +{ + "header": { + "appName": "EDMarketConnector", + "appVersion": "5.11.1+85f5c328.DIRTY" + }, + "data": { + "FuelCapacity": { + "Main": 128, + "Reserve": 0.81 + }, + "Ship": "belugaliner", + "ShipName": "HSRV Guiding Light", + "ShipIdent": "NFC-23", + "HullValue": 69924158, + "ModulesValue": 96918434, + "Rebuy": 8342132, + "MaxJumpRange": 52.615143, + "UnladenMass": 1233.057983, + "CargoCapacity": 16, + "Modules": [ + { + "Slot": "TinyHardpoint1", + "Item": "hpt_heatsinklauncher_turret_tiny", + "ItemHealth": 1.0, + "On": true, + "Value": 3072 + }, + { + "Slot": "TinyHardpoint2", + "Item": "hpt_heatsinklauncher_turret_tiny", + "ItemHealth": 1.0, + "On": true, + "Value": 3413 + }, + { + "Slot": "TinyHardpoint3", + "Item": "hpt_heatsinklauncher_turret_tiny", + "ItemHealth": 1.0, + "On": true, + "Value": 3072 + }, + { + "Slot": "TinyHardpoint4", + "Item": "hpt_heatsinklauncher_turret_tiny", + "ItemHealth": 1.0, + "On": true, + "Value": 3072 + }, + { + "Slot": "PaintJob", + "Item": "paintjob_belugaliner_lrpo_azure", + "ItemHealth": 1.0, + "On": true, + "Priority": 1 + }, + { + "Slot": "Armour", + "Item": "belugaliner_armour_grade1", + "ItemHealth": 1.0, + "On": true, + "Priority": 1 + }, + { + "Slot": "PowerPlant", + "Item": "int_powerplant_size6_class5", + "ItemHealth": 1.0, + "On": true, + "Priority": 1, + "Value": 11382139 + }, + { + "Slot": "MainEngines", + "Item": "int_engine_size7_class2", + "ItemHealth": 1.0, + "On": true, + "Priority": 1, + "Value": 1666898 + }, + { + "Slot": "FrameShiftDrive", + "Item": "int_hyperdrive_size7_class5", + "ItemHealth": 1.0, + "On": true, + "Value": 45006196 + }, + { + "Slot": "LifeSupport", + "Item": "int_lifesupport_size8_class2", + "ItemHealth": 1.0, + "On": true, + "Value": 1530326 + }, + { + "Slot": "PowerDistributor", + "Item": "int_powerdistributor_size6_class5", + "ItemHealth": 1.0, + "On": true, + "Priority": 1, + "Value": 3049917 + }, + { + "Slot": "Radar", + "Item": "int_sensors_size5_class2", + "ItemHealth": 1.0, + "On": true, + "Priority": 1, + "Value": 69713 + }, + { + "Slot": "FuelTank", + "Item": "int_fueltank_size7_class3", + "ItemHealth": 1.0, + "On": true, + "Priority": 1, + "Value": 1562752 + }, + { + "Slot": "Decal1", + "Item": "decal_distantworlds2", + "ItemHealth": 1.0, + "On": true, + "Priority": 1 + }, + { + "Slot": "Decal2", + "Item": "decal_distantworlds2", + "ItemHealth": 1.0, + "On": true, + "Priority": 1 + }, + { + "Slot": "Decal3", + "Item": "decal_distantworlds2", + "ItemHealth": 1.0, + "On": true, + "Priority": 1 + }, + { + "Slot": "ShipName0", + "Item": "nameplate_practical01_black", + "ItemHealth": 1.0, + "On": true, + "Priority": 1 + }, + { + "Slot": "ShipName1", + "Item": "nameplate_practical01_black", + "ItemHealth": 1.0, + "On": true, + "Priority": 1 + }, + { + "Slot": "ShipID0", + "Item": "nameplate_shipid_singleline_black", + "ItemHealth": 1.0, + "On": true, + "Priority": 1 + }, + { + "Slot": "ShipID1", + "Item": "nameplate_shipid_singleline_black", + "ItemHealth": 1.0, + "On": true, + "Priority": 1 + }, + { + "Slot": "Slot01_Size6", + "Item": "int_fuelscoop_size6_class5", + "ItemHealth": 1.0, + "On": true, + "Value": 25240068 + }, + { + "Slot": "Slot02_Size6", + "Item": "int_repairer_size6_class2", + "ItemHealth": 1.0, + "On": true, + "Value": 497429 + }, + { + "Slot": "Slot03_Size6", + "Item": "int_shieldgenerator_size5_class2", + "ItemHealth": 1.0, + "On": true, + "Value": 165879 + }, + { + "Slot": "Slot04_Size6", + "Item": "int_dronecontrol_repair_size5_class2", + "ItemHealth": 1.0, + "On": true, + "Value": 85293 + }, + { + "Slot": "Slot05_Size5", + "Item": "int_guardianfsdbooster_size5", + "ItemHealth": 1.0, + "On": true, + "Value": 5688921 + }, + { + "Slot": "Slot07_Size4", + "Item": "int_cargorack_size4_class1", + "ItemHealth": 1.0, + "On": true, + "Priority": 1, + "Value": 30124 + }, + { + "Slot": "Slot11_Size3", + "Item": "int_detailedsurfacescanner_tiny", + "ItemHealth": 1.0, + "On": true, + "Value": 219375 + }, + { + "Slot": "Slot12_Size1", + "Item": "int_repairer_size1_class5", + "ItemHealth": 1.0, + "On": false, + "Value": 710775 + }, + { + "Slot": "PlanetaryApproachSuite", + "Item": "int_planetapproachsuite_advanced", + "ItemHealth": 1.0, + "On": true, + "Priority": 1 + }, + { + "Slot": "WeaponColour", + "Item": "weaponcustomisation_red", + "ItemHealth": 1.0, + "On": true, + "Priority": 1 + }, + { + "Slot": "EngineColour", + "Item": "enginecustomisation_orange", + "ItemHealth": 1.0, + "On": true, + "Priority": 1 + }, + { + "Slot": "VesselVoice", + "Item": "voicepack_verity", + "ItemHealth": 1.0, + "On": true, + "Priority": 1 + }, + { + "Slot": "ShipCockpit", + "Item": "belugaliner_cockpit", + "ItemHealth": 1.0, + "On": true, + "Priority": 1 + }, + { + "Slot": "CargoHatch", + "Item": "modularcargobaydoor", + "ItemHealth": 1.0, + "On": false, + "Priority": 1 + } + ] + } +} \ No newline at end of file diff --git a/plugins/inara.py b/plugins/inara.py index f2c9830e..1cae5c64 100644 --- a/plugins/inara.py +++ b/plugins/inara.py @@ -35,6 +35,7 @@ import requests import edmc_data import killswitch import myNotebook as nb # noqa: N813 +from edshipyard import ships import plug import timeout_session from companion import CAPIData @@ -870,6 +871,7 @@ def journal_entry( # noqa: C901, CCR001 cur_ship['shipRebuyCost'] = state['Rebuy'] new_add_event('setCommanderShip', entry['timestamp'], cur_ship) + make_slef(state, entry) # Stored modules if event_name == 'StoredModules': @@ -1476,6 +1478,57 @@ def make_loadout(state: dict[str, Any]) -> dict[str, Any]: # noqa: CCR001 } +def make_slef(state: dict[str, Any], entry) -> None: + initial_dict = { + "header": {"appName": appname, "appVersion": str(appversion())} + } + data_dict = {} + loadout = make_loadout(state) + modules = loadout['shipLoadout'] + mod_dict = [] + for module in modules: + if module['slotName']: + builder = { + 'Slot': module['slotName'], + 'Item': module['itemName'] + } + if module.get('itemHealth'): + builder.update({'ItemHealth': module['itemHealth']}) + if module.get('isOn'): + builder.update({'On': True}) + elif not module.get('isOn'): + builder.update({'On': False}) + if module.get('itemPriority'): + builder.update({'Priority': module['itemPriority']}) + if module.get('itemValue'): + builder.update({'Value': module['itemValue']}) + if not module.get('itemValue'): + builder.update({'Value': 0}) + if module.get('slotName') == 'FuelTank': + cap = module['itemName'].split('size') + cap = cap[1].split('_') + cap = 2**int(cap[0]) + ship = edmc_data.ship_name_map[state["ShipType"]] + fuel = {'Main': cap, 'Reserve': ships[ship]['reserveFuelCapacity']} + data_dict.update({"FuelCapacity": fuel}) + mod_dict.append(builder) + data_dict.update({ + 'Ship': state["ShipType"], + 'ShipName': state['ShipName'], + 'ShipIdent': state['ShipIdent'], + 'HullValue': state['HullValue'], + 'ModulesValue': state['ModulesValue'], + 'Rebuy': state['Rebuy'], + 'MaxJumpRange': entry['MaxJumpRange'], + 'UnladenMass': entry['UnladenMass'], + 'CargoCapacity': entry['CargoCapacity'], + 'Modules': mod_dict, + }) + initial_dict.update({'data': data_dict}) + json.dump(initial_dict, open('inara.json', 'w'), indent=4) + return None + + def new_add_event( name: str, timestamp: str, diff --git a/ships.json b/ships.json index 65a2989e..ac05d5d8 100644 --- a/ships.json +++ b/ships.json @@ -1,119 +1,158 @@ { "Adder": { - "hullMass": 35 + "hullMass": 35, + "reserveFuelCapacity": 0.36 }, "Alliance Challenger": { - "hullMass": 450 + "hullMass": 450, + "reserveFuelCapacity": 0.77 }, "Alliance Chieftain": { - "hullMass": 400 + "hullMass": 400, + "reserveFuelCapacity": 0.77 }, "Alliance Crusader": { - "hullMass": 500 + "hullMass": 500, + "reserveFuelCapacity": 0.77 }, "Anaconda": { - "hullMass": 400 + "hullMass": 400, + "reserveFuelCapacity": 1.07 }, "Asp Explorer": { - "hullMass": 280 + "hullMass": 280, + "reserveFuelCapacity": 0.63 }, "Asp Scout": { - "hullMass": 150 + "hullMass": 150, + "reserveFuelCapacity": 0.47 }, "Beluga Liner": { - "hullMass": 950 + "hullMass": 950, + "reserveFuelCapacity": 0.81 }, "Cobra MkIII": { - "hullMass": 180 + "hullMass": 180, + "reserveFuelCapacity": 0.49 }, "Cobra MkIV": { - "hullMass": 210 + "hullMass": 210, + "reserveFuelCapacity": 0.51 }, "Diamondback Explorer": { - "hullMass": 260 + "hullMass": 260, + "reserveFuelCapacity": 0.52 }, "Diamondback Scout": { - "hullMass": 170 + "hullMass": 170, + "reserveFuelCapacity": 0.49 }, "Dolphin": { - "hullMass": 140 + "hullMass": 140, + "reserveFuelCapacity": 0.5 }, "Eagle": { - "hullMass": 50 + "hullMass": 50, + "reserveFuelCapacity": 0.34 }, "Federal Assault Ship": { - "hullMass": 480 + "hullMass": 480, + "reserveFuelCapacity": 0.72 }, "Federal Corvette": { - "hullMass": 900 + "hullMass": 900, + "reserveFuelCapacity": 1.13 }, "Federal Dropship": { - "hullMass": 580 + "hullMass": 580, + "reserveFuelCapacity": 0.83 }, "Federal Gunship": { - "hullMass": 580 + "hullMass": 580, + "reserveFuelCapacity": 0.82 }, "Fer-de-Lance": { - "hullMass": 250 + "hullMass": 250, + "reserveFuelCapacity": 0.67 }, "Hauler": { - "hullMass": 14 + "hullMass": 14, + "reserveFuelCapacity": 0.25 }, "Imperial Clipper": { - "hullMass": 400 + "hullMass": 400, + "reserveFuelCapacity": 0.74 }, "Imperial Courier": { - "hullMass": 35 + "hullMass": 35, + "reserveFuelCapacity": 0.41 }, "Imperial Cutter": { - "hullMass": 1100 + "hullMass": 1100, + "reserveFuelCapacity": 1.16 }, "Imperial Eagle": { - "hullMass": 50 + "hullMass": 50, + "reserveFuelCapacity": 0.37 }, "Keelback": { - "hullMass": 180 + "hullMass": 180, + "reserveFuelCapacity": 0.39 }, "Krait MkII": { - "hullMass": 320 + "hullMass": 320, + "reserveFuelCapacity": 0.63 }, "Krait Phantom": { - "hullMass": 270 + "hullMass": 270, + "reserveFuelCapacity": 0.63 }, "Mamba": { - "hullMass": 250 + "hullMass": 250, + "reserveFuelCapacity": 0.5 }, "Orca": { - "hullMass": 290 + "hullMass": 290, + "reserveFuelCapacity": 0.79 }, "Python": { - "hullMass": 350 + "hullMass": 350, + "reserveFuelCapacity": 0.83 }, "Python Mk II": { - "hullMass": 450 + "hullMass": 450, + "reserveFuelCapacity": 0.83 }, "Sidewinder": { - "hullMass": 25 + "hullMass": 25, + "reserveFuelCapacity": 0.3 }, "Type-10 Defender": { - "hullMass": 1200 + "hullMass": 1200, + "reserveFuelCapacity": 0.77 }, "Type-6 Transporter": { - "hullMass": 155 + "hullMass": 155, + "reserveFuelCapacity": 0.39 }, "Type-7 Transporter": { - "hullMass": 350 + "hullMass": 350, + "reserveFuelCapacity": 0.52 }, "Type-9 Heavy": { - "hullMass": 850 + "hullMass": 850, + "reserveFuelCapacity": 0.77 }, "Viper MkIII": { - "hullMass": 50 + "hullMass": 50, + "reserveFuelCapacity": 0.41 }, "Viper MkIV": { - "hullMass": 190 + "hullMass": 190, + "reserveFuelCapacity": 0.46 }, "Vulture": { - "hullMass": 230 + "hullMass": 230, + "reserveFuelCapacity": 0.57 } } \ No newline at end of file From fb1e3dcab6268a56cad742b3fcf259c3ba17450f Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 17 Jun 2024 14:51:56 -0400 Subject: [PATCH 337/425] [Minor] Fix MyPy Complaint --- scripts/build_changelog.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/build_changelog.py b/scripts/build_changelog.py index f0c01994..6b050774 100644 --- a/scripts/build_changelog.py +++ b/scripts/build_changelog.py @@ -34,9 +34,9 @@ def get_changelog() -> tuple[str, str]: changelog[1] = "\n".join(changelog[1].strip().split("\n")[:-2]) version = changelog[0] version = version.split(" ")[1] - changelog = changelog[1].strip() + final_changelog = changelog[1].strip() - return changelog, version + return final_changelog, version def build_html(md_changelog: str, version: str) -> str: From 87f59a54fa41c1333e0fae680884a4da59a8c2fb Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 17 Jun 2024 16:38:20 -0400 Subject: [PATCH 338/425] [RELEASE] 5.10.2 --- ChangeLog.md | 12 ++++++++++++ config/__init__.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 1c2ac9c2..2f9248f1 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,6 +6,18 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- +Release 5.11.2 +=== + +This release fixes a bug where minimizing to the system tray could cause the program to not un-minimize. + +**Changes and Enhancements** +* Updated Translations +* Added a developer utilty to help speed up changelog development + +**Bug Fixes** +* Fixed a bug where minimizing to the system tray could cause the program to not un-minimize. + Release 5.11.1 === diff --git a/config/__init__.py b/config/__init__.py index 8dfcf46b..4fe565e4 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -52,7 +52,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.11.1' +_static_appversion = '5.11.2' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From 62038a0fec548448ad4a710bc6ca4f923e71aed4 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 17 Jun 2024 16:38:20 -0400 Subject: [PATCH 339/425] [RELEASE] 5.11.2 --- ChangeLog.md | 12 ++++++++++++ config/__init__.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 1c2ac9c2..2f9248f1 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,6 +6,18 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- +Release 5.11.2 +=== + +This release fixes a bug where minimizing to the system tray could cause the program to not un-minimize. + +**Changes and Enhancements** +* Updated Translations +* Added a developer utilty to help speed up changelog development + +**Bug Fixes** +* Fixed a bug where minimizing to the system tray could cause the program to not un-minimize. + Release 5.11.1 === diff --git a/config/__init__.py b/config/__init__.py index 8dfcf46b..4fe565e4 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -52,7 +52,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.11.1' +_static_appversion = '5.11.2' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From 0aa1128094e36a09e4293096ad40d064c00ba96e Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 17 Jun 2024 17:09:30 -0400 Subject: [PATCH 340/425] [Docs] Fix Typo in Changelog >:( --- ChangeLog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 2f9248f1..30023566 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -13,7 +13,7 @@ This release fixes a bug where minimizing to the system tray could cause the pro **Changes and Enhancements** * Updated Translations -* Added a developer utilty to help speed up changelog development +* Added a developer utility to help speed up changelog development **Bug Fixes** * Fixed a bug where minimizing to the system tray could cause the program to not un-minimize. From fcd7b8da0f458de15960720e2f48e1cd1c81215e Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 17 Jun 2024 18:20:53 -0400 Subject: [PATCH 341/425] [2215] Clarify Config Imports --- EDMCLogging.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/EDMCLogging.py b/EDMCLogging.py index c09de41e..3f3e79b1 100644 --- a/EDMCLogging.py +++ b/EDMCLogging.py @@ -50,8 +50,7 @@ from threading import get_native_id as thread_native_id from time import gmtime from traceback import print_exc from typing import TYPE_CHECKING, cast -import config as config_mod -from config import appcmdname, appname, config +from config import appcmdname, appname, config, trace_on # TODO: Tests: # @@ -102,7 +101,7 @@ warnings.simplefilter('default', DeprecationWarning) def _trace_if(self: logging.Logger, condition: str, message: str, *args, **kwargs) -> None: - if any(fnmatch(condition, p) for p in config_mod.trace_on): + if any(fnmatch(condition, p) for p in trace_on): self._log(logging.TRACE, message, args, **kwargs) # type: ignore # we added it return From 81a3b4fd5f0cbad5f23dcd5d93b20523733461ee Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 18 Jun 2024 09:51:36 -0400 Subject: [PATCH 342/425] [1805] Pull In Code from 1808 --- monitor.py | 75 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 57 insertions(+), 18 deletions(-) diff --git a/monitor.py b/monitor.py index 8b55a2b9..85f56a4c 100644 --- a/monitor.py +++ b/monitor.py @@ -15,7 +15,7 @@ import sys import threading from calendar import timegm from collections import defaultdict -from os import SEEK_END, SEEK_SET, listdir +from os import SEEK_END, SEEK_SET, listdir, environ from os.path import basename, expanduser, getctime, isdir, join from time import gmtime, localtime, mktime, sleep, strftime, strptime, time from typing import TYPE_CHECKING, Any, BinaryIO, MutableMapping @@ -35,18 +35,16 @@ MAX_NAVROUTE_DISCREPANCY = 5 # Timestamp difference in seconds MAX_FCMATERIALS_DISCREPANCY = 5 # Timestamp difference in seconds if sys.platform == 'win32': - import ctypes - from ctypes.wintypes import BOOL, HWND, LPARAM + import win32process + import win32con + import win32security import win32gui import win32api - + import pywintypes from watchdog.events import FileSystemEventHandler, FileSystemEvent from watchdog.observers import Observer from watchdog.observers.api import BaseObserver - EnumWindowsProc = ctypes.WINFUNCTYPE(BOOL, HWND, LPARAM) - GetProcessHandleFromHwnd = ctypes.windll.oleacc.GetProcessHandleFromHwnd - else: # Linux's inotify doesn't work over CIFS or NFS, so poll FileSystemEventHandler = object # dummy @@ -113,6 +111,13 @@ class EDLogs(FileSystemEventHandler): # be >= for Live, and < for Legacy. self.live_galaxy_base_version = semantic_version.Version('4.0.0') + if sys.platform == 'win32': + # Get the SID of the user we're running as for later use in + # `game_running()` + self.user_sid, self.user_domain, self.user_type = win32security.LookupAccountName( + None, environ['USERNAME'] + ) + self.__init_state() def __init_state(self) -> None: @@ -2123,23 +2128,57 @@ class EDLogs(FileSystemEventHandler): if sys.platform == 'win32': def WindowTitle(h): # noqa: N802 if h: - length = win32gui.GetWindowTextLength(h) + 1 - buf = ctypes.create_unicode_buffer(length) - if win32gui.GetWindowText(h): - return buf.value + return win32gui.GetWindowText(h) return None - def callback(hWnd, lParam): # noqa: N803 - name = WindowTitle(hWnd) + def callback(hwnd, hwnds): # noqa: N803 + name = WindowTitle(hwnd) if name and name.startswith('Elite - Dangerous'): - handle = GetProcessHandleFromHwnd(hWnd) - if handle: # If GetProcessHandleFromHwnd succeeds then the app is already running as this user - win32api.CloseHandle(handle) - return False # stop enumeration + # We've found a window that *looks* like an ED game process, but now we need to check + # if it's owned by the current user. + + # Get the process_id of the window we found + # + thread_id, process_id = win32process.GetWindowThreadProcessId(hwnd) + + # Use that to get a process handle + # + # The first arg can't simply be `0`, and `win32con.PROCESS_TERMINATE` works + handle = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION, False, process_id) + if handle: + # We got the handle OK, now we need a token for it + process_token = win32security.OpenProcessToken(handle, win32security.TOKEN_QUERY) + # So we can use that to get information about the User + token_information, i = win32security.GetTokenInformation( + process_token, win32security.TokenUser + ) + # And lastly check if token_information, which should be a PySID object, matches + # that of the current user we looked up in `__init__()`. + if token_information == self.user_sid: + # This can be used to convert the token to username, domain name, and account type + # user, domain, name_use = win32security.LookupAccountSid(None, token_information) + hwnds.append(hwnd) + return False # Indicate window found, so stop iterating return True - return not win32gui.EnumWindows(EnumWindowsProc(callback), 0) + # Ref: + ed_windows: list[int] = [] + try: + win32gui.EnumWindows(callback, ed_windows) + + except pywintypes.error as e: + # Ref: + # Because False is returned in the callback to indicate "found the window, stop + # processing", this causes EnumWindows() to return `0`, which is generically + # treated as an error, so exception is raised. + # So, check the exception's .winerror, and ignore if `0`. + if e.winerror != 0: + logger.exception("EnumWindows exception:") + + bacon = bool(ed_windows) + print(bacon) + return bacon return False From f1df1c7da77b7bef9d045fdd6b69b7df94af1fcc Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 18 Jun 2024 12:20:08 -0400 Subject: [PATCH 343/425] [#610] Enable game_running on Linux --- monitor.py | 105 ++++++++++++++++------------------------------------- 1 file changed, 31 insertions(+), 74 deletions(-) diff --git a/monitor.py b/monitor.py index 85f56a4c..ee5eaa99 100644 --- a/monitor.py +++ b/monitor.py @@ -15,10 +15,11 @@ import sys import threading from calendar import timegm from collections import defaultdict -from os import SEEK_END, SEEK_SET, listdir, environ +from os import SEEK_END, SEEK_SET, listdir from os.path import basename, expanduser, getctime, isdir, join from time import gmtime, localtime, mktime, sleep, strftime, strptime, time from typing import TYPE_CHECKING, Any, BinaryIO, MutableMapping +import psutil import semantic_version import util_ships from config import config @@ -35,12 +36,6 @@ MAX_NAVROUTE_DISCREPANCY = 5 # Timestamp difference in seconds MAX_FCMATERIALS_DISCREPANCY = 5 # Timestamp difference in seconds if sys.platform == 'win32': - import win32process - import win32con - import win32security - import win32gui - import win32api - import pywintypes from watchdog.events import FileSystemEventHandler, FileSystemEvent from watchdog.observers import Observer from watchdog.observers.api import BaseObserver @@ -60,7 +55,8 @@ class EDLogs(FileSystemEventHandler): """Monitoring of Journal files.""" # Magic with FileSystemEventHandler can confuse type checkers when they do not have access to every import - _POLL = 1 # Polling is cheap, so do it often + _POLL = 1 # Polling while running is cheap, so do it often + _INACTIVE_POLL = 10 # Polling while not running isn't as cheap, so do it less often _RE_CANONICALISE = re.compile(r'\$(.+)_name;') _RE_CATEGORY = re.compile(r'\$MICRORESOURCE_CATEGORY_(.+);') _RE_LOGFILE = re.compile(r'^Journal(Alpha|Beta)?\.[0-9]{2,4}(-)?[0-9]{2}(-)?[0-9]{2}(T)?[0-9]{2}[0-9]{2}[0-9]{2}' @@ -90,6 +86,7 @@ class EDLogs(FileSystemEventHandler): self.catching_up = False self.game_was_running = False # For generation of the "ShutDown" event + self.running_process = None # Context for journal handling self.version: str | None = None @@ -111,13 +108,6 @@ class EDLogs(FileSystemEventHandler): # be >= for Live, and < for Legacy. self.live_galaxy_base_version = semantic_version.Version('4.0.0') - if sys.platform == 'win32': - # Get the SID of the user we're running as for later use in - # `game_running()` - self.user_sid, self.user_domain, self.user_type = win32security.LookupAccountName( - None, environ['USERNAME'] - ) - self.__init_state() def __init_state(self) -> None: @@ -469,7 +459,10 @@ class EDLogs(FileSystemEventHandler): loghandle = open(logfile, 'rb', 0) # unbuffered log_pos = 0 - sleep(self._POLL) + if self.game_was_running: + sleep(self._POLL) + else: + sleep(self._INACTIVE_POLL) # Check whether we're still supposed to be running if threading.current_thread() != self.thread: @@ -2117,70 +2110,34 @@ class EDLogs(FileSystemEventHandler): return entry - def game_running(self) -> bool: # noqa: CCR001 + def game_running(self) -> bool: """ Determine if the game is currently running. - TODO: Implement on Linux - :return: bool - True if the game is running. """ - if sys.platform == 'win32': - def WindowTitle(h): # noqa: N802 - if h: - return win32gui.GetWindowText(h) - return None - - def callback(hwnd, hwnds): # noqa: N803 - name = WindowTitle(hwnd) - if name and name.startswith('Elite - Dangerous'): - # We've found a window that *looks* like an ED game process, but now we need to check - # if it's owned by the current user. - - # Get the process_id of the window we found - # - thread_id, process_id = win32process.GetWindowThreadProcessId(hwnd) - - # Use that to get a process handle - # - # The first arg can't simply be `0`, and `win32con.PROCESS_TERMINATE` works - handle = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION, False, process_id) - if handle: - # We got the handle OK, now we need a token for it - process_token = win32security.OpenProcessToken(handle, win32security.TOKEN_QUERY) - # So we can use that to get information about the User - token_information, i = win32security.GetTokenInformation( - process_token, win32security.TokenUser - ) - # And lastly check if token_information, which should be a PySID object, matches - # that of the current user we looked up in `__init__()`. - if token_information == self.user_sid: - # This can be used to convert the token to username, domain name, and account type - # user, domain, name_use = win32security.LookupAccountSid(None, token_information) - hwnds.append(hwnd) - return False # Indicate window found, so stop iterating - - return True - - # Ref: - ed_windows: list[int] = [] + if self.running_process: + p = self.running_process try: - win32gui.EnumWindows(callback, ed_windows) - - except pywintypes.error as e: - # Ref: - # Because False is returned in the callback to indicate "found the window, stop - # processing", this causes EnumWindows() to return `0`, which is generically - # treated as an error, so exception is raised. - # So, check the exception's .winerror, and ignore if `0`. - if e.winerror != 0: - logger.exception("EnumWindows exception:") - - bacon = bool(ed_windows) - print(bacon) - return bacon - - return False + with p.oneshot(): + if p.status() not in [psutil.STATUS_RUNNING, psutil.STATUS_SLEEPING]: + raise psutil.NoSuchProcess + except psutil.NoSuchProcess: + # Process likely expired + self.running_process = None + if not self.running_process: + edmc_process = psutil.Process() + edmc_user = edmc_process.username() + try: + for pid in psutil.pids(): + proc = psutil.Process(pid) + if 'EliteDangerous' in proc.name() and proc.username() == edmc_user: + self.running_process = proc + return True + except psutil.NoSuchProcess: + pass + return False + return bool(self.running_process) def ship(self, timestamped=True) -> MutableMapping[str, Any] | None: """ From d319dd03b56f25a9e7932dc9ddffe2c8a5fdb3a9 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 18 Jun 2024 12:22:37 -0400 Subject: [PATCH 344/425] [610] Add to Requirements --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index b278cce5..3c44ddec 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,4 +4,5 @@ watchdog==4.0.0 simplesystray==0.1.0; sys_platform == 'win32' semantic-version==2.10.0 # For manipulating folder permissions and the like. -pywin32==306; sys_platform == 'win32' \ No newline at end of file +pywin32==306; sys_platform == 'win32' +psutil==5.9.8 From c0deeeb4cfdd0bccd23216647e7e13d8a08bbc60 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 18 Jun 2024 13:09:21 -0400 Subject: [PATCH 345/425] [1805] Simplify Window Text Call --- EDMarketConnector.py | 6 +----- hotkey/windows.py | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index ecc84e1b..86446218 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -272,11 +272,7 @@ if __name__ == '__main__': # noqa: C901 def window_title(h: int) -> str | None: if h: - text_length = win32gui.GetWindowTextLength(h) + 1 - buf = create_unicode_buffer(text_length) - if win32gui.GetWindowText(h): - return buf.value - + return win32gui.GetWindowText(h) return None @WINFUNCTYPE(BOOL, HWND, LPARAM) diff --git a/hotkey/windows.py b/hotkey/windows.py index 95b1a83a..ddccc333 100644 --- a/hotkey/windows.py +++ b/hotkey/windows.py @@ -47,11 +47,7 @@ def window_title(h) -> str: :return: Window title. """ if h: - title_length = win32gui.GetWindowTextLength(h) + 1 - buf = ctypes.create_unicode_buffer(title_length) - if win32gui.GetWindowText(h): - return buf.value - + return win32gui.GetWindowText(h) return '' From d478a68bc61de1fdc20c6ca526e4c1740944e672 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 18 Jun 2024 21:15:11 -0400 Subject: [PATCH 346/425] [2262] Simplify SLEF Building --- plugins/inara.py | 55 +++++++++++++++--------------------------------- 1 file changed, 17 insertions(+), 38 deletions(-) diff --git a/plugins/inara.py b/plugins/inara.py index 1cae5c64..3fd42f34 100644 --- a/plugins/inara.py +++ b/plugins/inara.py @@ -871,7 +871,7 @@ def journal_entry( # noqa: C901, CCR001 cur_ship['shipRebuyCost'] = state['Rebuy'] new_add_event('setCommanderShip', entry['timestamp'], cur_ship) - make_slef(state, entry) + make_slef(entry) # Stored modules if event_name == 'StoredModules': @@ -1478,51 +1478,30 @@ def make_loadout(state: dict[str, Any]) -> dict[str, Any]: # noqa: CCR001 } -def make_slef(state: dict[str, Any], entry) -> None: +def make_slef(entry) -> None: initial_dict = { "header": {"appName": appname, "appVersion": str(appversion())} } data_dict = {} - loadout = make_loadout(state) - modules = loadout['shipLoadout'] - mod_dict = [] - for module in modules: - if module['slotName']: - builder = { - 'Slot': module['slotName'], - 'Item': module['itemName'] - } - if module.get('itemHealth'): - builder.update({'ItemHealth': module['itemHealth']}) - if module.get('isOn'): - builder.update({'On': True}) - elif not module.get('isOn'): - builder.update({'On': False}) - if module.get('itemPriority'): - builder.update({'Priority': module['itemPriority']}) - if module.get('itemValue'): - builder.update({'Value': module['itemValue']}) - if not module.get('itemValue'): - builder.update({'Value': 0}) - if module.get('slotName') == 'FuelTank': - cap = module['itemName'].split('size') - cap = cap[1].split('_') - cap = 2**int(cap[0]) - ship = edmc_data.ship_name_map[state["ShipType"]] - fuel = {'Main': cap, 'Reserve': ships[ship]['reserveFuelCapacity']} - data_dict.update({"FuelCapacity": fuel}) - mod_dict.append(builder) + for module in entry['Modules']: + if module.get('Slot') == 'FuelTank': + cap = module['Item'].split('size') + cap = cap[1].split('_') + cap = 2 ** int(cap[0]) + ship = edmc_data.ship_name_map[entry["Ship"]] + fuel = {'Main': cap, 'Reserve': ships[ship]['reserveFuelCapacity']} + data_dict.update({"FuelCapacity": fuel}) data_dict.update({ - 'Ship': state["ShipType"], - 'ShipName': state['ShipName'], - 'ShipIdent': state['ShipIdent'], - 'HullValue': state['HullValue'], - 'ModulesValue': state['ModulesValue'], - 'Rebuy': state['Rebuy'], + 'Ship': entry["Ship"], + 'ShipName': entry['ShipName'], + 'ShipIdent': entry['ShipIdent'], + 'HullValue': entry['HullValue'], + 'ModulesValue': entry['ModulesValue'], + 'Rebuy': entry['Rebuy'], 'MaxJumpRange': entry['MaxJumpRange'], 'UnladenMass': entry['UnladenMass'], 'CargoCapacity': entry['CargoCapacity'], - 'Modules': mod_dict, + 'Modules': entry['Modules'], }) initial_dict.update({'data': data_dict}) json.dump(initial_dict, open('inara.json', 'w'), indent=4) From 0cc35db96b560f971a78b3d4f30003a37805bc18 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 18 Jun 2024 22:02:41 -0400 Subject: [PATCH 347/425] [2262] SLEF to this var --- plugins/inara.py | 6 +++++- ttkHyperlinkLabel.py | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/plugins/inara.py b/plugins/inara.py index 3fd42f34..c3f030c4 100644 --- a/plugins/inara.py +++ b/plugins/inara.py @@ -107,6 +107,7 @@ class This: self.fleet: list[dict[str, Any]] | None = None self.shipswap: bool = False # just swapped ship self.on_foot = False + self.SLEF: str | None = None self.timer_run = True @@ -1504,7 +1505,10 @@ def make_slef(entry) -> None: 'Modules': entry['Modules'], }) initial_dict.update({'data': data_dict}) - json.dump(initial_dict, open('inara.json', 'w'), indent=4) + output = json.dumps(initial_dict, indent=4) + this.SLEF = str(output) + print('set output') + print(type(this.SLEF)) return None diff --git a/ttkHyperlinkLabel.py b/ttkHyperlinkLabel.py index 6266d9fb..95ebd2e7 100644 --- a/ttkHyperlinkLabel.py +++ b/ttkHyperlinkLabel.py @@ -194,6 +194,11 @@ class HyperlinkLabel(tk.Label or ttk.Label): # type: ignore menu.add_command(label=tr.tl('Copy'), command=self.copy) # As in Copy and Paste if self.name == 'ship': + # TODO: Get SLEF from Inara + # print(self.SLEF) + # menu.add_command(label=tr.tl('Copy INARA SLEF'), command=lambda: self.copy_slef(self), state=tk.DISABLED) + # menu.entryconfigure(1, state=self.SLEF and tk.NORMAL or tk.DISABLED) + menu.add_separator() for url in plug.provides('shipyard_url'): menu.add_command( @@ -224,3 +229,8 @@ class HyperlinkLabel(tk.Label or ttk.Label): # type: ignore """Copy the current text to the clipboard.""" self.clipboard_clear() self.clipboard_append(self['text']) + + # def copy_slef(self, this) -> None: + # """Copy the current text to the clipboard.""" + # self.clipboard_clear() + # self.clipboard_append(this.SLEF) From 3b6259276a9fdfb606abbd59fd8aca488f1c32e3 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 23 Jun 2024 13:05:39 -0400 Subject: [PATCH 348/425] [2262] Move SLEF to Monitor --- inara.json | 267 ------------------------------------------- monitor.py | 34 +++++- plugins/inara.py | 35 ------ ttkHyperlinkLabel.py | 14 +-- 4 files changed, 39 insertions(+), 311 deletions(-) delete mode 100644 inara.json diff --git a/inara.json b/inara.json deleted file mode 100644 index 1c5cba8a..00000000 --- a/inara.json +++ /dev/null @@ -1,267 +0,0 @@ -{ - "header": { - "appName": "EDMarketConnector", - "appVersion": "5.11.1+85f5c328.DIRTY" - }, - "data": { - "FuelCapacity": { - "Main": 128, - "Reserve": 0.81 - }, - "Ship": "belugaliner", - "ShipName": "HSRV Guiding Light", - "ShipIdent": "NFC-23", - "HullValue": 69924158, - "ModulesValue": 96918434, - "Rebuy": 8342132, - "MaxJumpRange": 52.615143, - "UnladenMass": 1233.057983, - "CargoCapacity": 16, - "Modules": [ - { - "Slot": "TinyHardpoint1", - "Item": "hpt_heatsinklauncher_turret_tiny", - "ItemHealth": 1.0, - "On": true, - "Value": 3072 - }, - { - "Slot": "TinyHardpoint2", - "Item": "hpt_heatsinklauncher_turret_tiny", - "ItemHealth": 1.0, - "On": true, - "Value": 3413 - }, - { - "Slot": "TinyHardpoint3", - "Item": "hpt_heatsinklauncher_turret_tiny", - "ItemHealth": 1.0, - "On": true, - "Value": 3072 - }, - { - "Slot": "TinyHardpoint4", - "Item": "hpt_heatsinklauncher_turret_tiny", - "ItemHealth": 1.0, - "On": true, - "Value": 3072 - }, - { - "Slot": "PaintJob", - "Item": "paintjob_belugaliner_lrpo_azure", - "ItemHealth": 1.0, - "On": true, - "Priority": 1 - }, - { - "Slot": "Armour", - "Item": "belugaliner_armour_grade1", - "ItemHealth": 1.0, - "On": true, - "Priority": 1 - }, - { - "Slot": "PowerPlant", - "Item": "int_powerplant_size6_class5", - "ItemHealth": 1.0, - "On": true, - "Priority": 1, - "Value": 11382139 - }, - { - "Slot": "MainEngines", - "Item": "int_engine_size7_class2", - "ItemHealth": 1.0, - "On": true, - "Priority": 1, - "Value": 1666898 - }, - { - "Slot": "FrameShiftDrive", - "Item": "int_hyperdrive_size7_class5", - "ItemHealth": 1.0, - "On": true, - "Value": 45006196 - }, - { - "Slot": "LifeSupport", - "Item": "int_lifesupport_size8_class2", - "ItemHealth": 1.0, - "On": true, - "Value": 1530326 - }, - { - "Slot": "PowerDistributor", - "Item": "int_powerdistributor_size6_class5", - "ItemHealth": 1.0, - "On": true, - "Priority": 1, - "Value": 3049917 - }, - { - "Slot": "Radar", - "Item": "int_sensors_size5_class2", - "ItemHealth": 1.0, - "On": true, - "Priority": 1, - "Value": 69713 - }, - { - "Slot": "FuelTank", - "Item": "int_fueltank_size7_class3", - "ItemHealth": 1.0, - "On": true, - "Priority": 1, - "Value": 1562752 - }, - { - "Slot": "Decal1", - "Item": "decal_distantworlds2", - "ItemHealth": 1.0, - "On": true, - "Priority": 1 - }, - { - "Slot": "Decal2", - "Item": "decal_distantworlds2", - "ItemHealth": 1.0, - "On": true, - "Priority": 1 - }, - { - "Slot": "Decal3", - "Item": "decal_distantworlds2", - "ItemHealth": 1.0, - "On": true, - "Priority": 1 - }, - { - "Slot": "ShipName0", - "Item": "nameplate_practical01_black", - "ItemHealth": 1.0, - "On": true, - "Priority": 1 - }, - { - "Slot": "ShipName1", - "Item": "nameplate_practical01_black", - "ItemHealth": 1.0, - "On": true, - "Priority": 1 - }, - { - "Slot": "ShipID0", - "Item": "nameplate_shipid_singleline_black", - "ItemHealth": 1.0, - "On": true, - "Priority": 1 - }, - { - "Slot": "ShipID1", - "Item": "nameplate_shipid_singleline_black", - "ItemHealth": 1.0, - "On": true, - "Priority": 1 - }, - { - "Slot": "Slot01_Size6", - "Item": "int_fuelscoop_size6_class5", - "ItemHealth": 1.0, - "On": true, - "Value": 25240068 - }, - { - "Slot": "Slot02_Size6", - "Item": "int_repairer_size6_class2", - "ItemHealth": 1.0, - "On": true, - "Value": 497429 - }, - { - "Slot": "Slot03_Size6", - "Item": "int_shieldgenerator_size5_class2", - "ItemHealth": 1.0, - "On": true, - "Value": 165879 - }, - { - "Slot": "Slot04_Size6", - "Item": "int_dronecontrol_repair_size5_class2", - "ItemHealth": 1.0, - "On": true, - "Value": 85293 - }, - { - "Slot": "Slot05_Size5", - "Item": "int_guardianfsdbooster_size5", - "ItemHealth": 1.0, - "On": true, - "Value": 5688921 - }, - { - "Slot": "Slot07_Size4", - "Item": "int_cargorack_size4_class1", - "ItemHealth": 1.0, - "On": true, - "Priority": 1, - "Value": 30124 - }, - { - "Slot": "Slot11_Size3", - "Item": "int_detailedsurfacescanner_tiny", - "ItemHealth": 1.0, - "On": true, - "Value": 219375 - }, - { - "Slot": "Slot12_Size1", - "Item": "int_repairer_size1_class5", - "ItemHealth": 1.0, - "On": false, - "Value": 710775 - }, - { - "Slot": "PlanetaryApproachSuite", - "Item": "int_planetapproachsuite_advanced", - "ItemHealth": 1.0, - "On": true, - "Priority": 1 - }, - { - "Slot": "WeaponColour", - "Item": "weaponcustomisation_red", - "ItemHealth": 1.0, - "On": true, - "Priority": 1 - }, - { - "Slot": "EngineColour", - "Item": "enginecustomisation_orange", - "ItemHealth": 1.0, - "On": true, - "Priority": 1 - }, - { - "Slot": "VesselVoice", - "Item": "voicepack_verity", - "ItemHealth": 1.0, - "On": true, - "Priority": 1 - }, - { - "Slot": "ShipCockpit", - "Item": "belugaliner_cockpit", - "ItemHealth": 1.0, - "On": true, - "Priority": 1 - }, - { - "Slot": "CargoHatch", - "Item": "modularcargobaydoor", - "ItemHealth": 1.0, - "On": false, - "Priority": 1 - } - ] - } -} \ No newline at end of file diff --git a/monitor.py b/monitor.py index 9d33f5eb..ae0f3ad7 100644 --- a/monitor.py +++ b/monitor.py @@ -21,9 +21,10 @@ from time import gmtime, localtime, mktime, sleep, strftime, strptime, time from typing import TYPE_CHECKING, Any, BinaryIO, MutableMapping import semantic_version import util_ships -from config import config -from edmc_data import edmc_suit_shortnames, edmc_suit_symbol_localised +from config import config, appname, appversion +from edmc_data import edmc_suit_shortnames, edmc_suit_symbol_localised, ship_name_map from EDMCLogging import get_main_logger +from edshipyard import ships if TYPE_CHECKING: import tkinter @@ -109,6 +110,7 @@ class EDLogs(FileSystemEventHandler): self.group: str | None = None self.cmdr: str | None = None self.started: int | None = None # Timestamp of the LoadGame event + self.slef: str | None = None self._navroute_retries_remaining = 0 self._last_navroute_journal_timestamp: float | None = None @@ -701,6 +703,34 @@ class EDLogs(FileSystemEventHandler): module.pop('AmmoInHopper') self.state['Modules'][module['Slot']] = module + # SLEF + initial_dict = { + "header": {"appName": appname, "appVersion": str(appversion())} + } + data_dict = {} + for module in entry['Modules']: + if module.get('Slot') == 'FuelTank': + cap = module['Item'].split('size') + cap = cap[1].split('_') + cap = 2 ** int(cap[0]) + ship = ship_name_map[entry["Ship"]] + fuel = {'Main': cap, 'Reserve': ships[ship]['reserveFuelCapacity']} + data_dict.update({"FuelCapacity": fuel}) + data_dict.update({ + 'Ship': entry["Ship"], + 'ShipName': entry['ShipName'], + 'ShipIdent': entry['ShipIdent'], + 'HullValue': entry['HullValue'], + 'ModulesValue': entry['ModulesValue'], + 'Rebuy': entry['Rebuy'], + 'MaxJumpRange': entry['MaxJumpRange'], + 'UnladenMass': entry['UnladenMass'], + 'CargoCapacity': entry['CargoCapacity'], + 'Modules': entry['Modules'], + }) + initial_dict.update({'data': data_dict}) + output = json.dumps(initial_dict, indent=4) + self.slef = str(output) elif event_type == 'modulebuy': self.state['Modules'][entry['Slot']] = { diff --git a/plugins/inara.py b/plugins/inara.py index c3f030c4..a4cc0e55 100644 --- a/plugins/inara.py +++ b/plugins/inara.py @@ -35,7 +35,6 @@ import requests import edmc_data import killswitch import myNotebook as nb # noqa: N813 -from edshipyard import ships import plug import timeout_session from companion import CAPIData @@ -872,7 +871,6 @@ def journal_entry( # noqa: C901, CCR001 cur_ship['shipRebuyCost'] = state['Rebuy'] new_add_event('setCommanderShip', entry['timestamp'], cur_ship) - make_slef(entry) # Stored modules if event_name == 'StoredModules': @@ -1479,39 +1477,6 @@ def make_loadout(state: dict[str, Any]) -> dict[str, Any]: # noqa: CCR001 } -def make_slef(entry) -> None: - initial_dict = { - "header": {"appName": appname, "appVersion": str(appversion())} - } - data_dict = {} - for module in entry['Modules']: - if module.get('Slot') == 'FuelTank': - cap = module['Item'].split('size') - cap = cap[1].split('_') - cap = 2 ** int(cap[0]) - ship = edmc_data.ship_name_map[entry["Ship"]] - fuel = {'Main': cap, 'Reserve': ships[ship]['reserveFuelCapacity']} - data_dict.update({"FuelCapacity": fuel}) - data_dict.update({ - 'Ship': entry["Ship"], - 'ShipName': entry['ShipName'], - 'ShipIdent': entry['ShipIdent'], - 'HullValue': entry['HullValue'], - 'ModulesValue': entry['ModulesValue'], - 'Rebuy': entry['Rebuy'], - 'MaxJumpRange': entry['MaxJumpRange'], - 'UnladenMass': entry['UnladenMass'], - 'CargoCapacity': entry['CargoCapacity'], - 'Modules': entry['Modules'], - }) - initial_dict.update({'data': data_dict}) - output = json.dumps(initial_dict, indent=4) - this.SLEF = str(output) - print('set output') - print(type(this.SLEF)) - return None - - def new_add_event( name: str, timestamp: str, diff --git a/ttkHyperlinkLabel.py b/ttkHyperlinkLabel.py index 95ebd2e7..5ca4feb4 100644 --- a/ttkHyperlinkLabel.py +++ b/ttkHyperlinkLabel.py @@ -195,9 +195,9 @@ class HyperlinkLabel(tk.Label or ttk.Label): # type: ignore if self.name == 'ship': # TODO: Get SLEF from Inara - # print(self.SLEF) - # menu.add_command(label=tr.tl('Copy INARA SLEF'), command=lambda: self.copy_slef(self), state=tk.DISABLED) - # menu.entryconfigure(1, state=self.SLEF and tk.NORMAL or tk.DISABLED) + print(bool(monitor.slef)) + menu.add_command(label=tr.tl('Copy INARA SLEF'), command=self.copy_slef, state=tk.DISABLED) + menu.entryconfigure(1, state=monitor.slef and tk.NORMAL or tk.DISABLED) menu.add_separator() for url in plug.provides('shipyard_url'): @@ -230,7 +230,7 @@ class HyperlinkLabel(tk.Label or ttk.Label): # type: ignore self.clipboard_clear() self.clipboard_append(self['text']) - # def copy_slef(self, this) -> None: - # """Copy the current text to the clipboard.""" - # self.clipboard_clear() - # self.clipboard_append(this.SLEF) + def copy_slef(self) -> None: + """Copy the current text to the clipboard.""" + self.clipboard_clear() + self.clipboard_append(monitor.slef) From 47192ce674375f4b87590167919547c25a070d92 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 23 Jun 2024 13:06:52 -0400 Subject: [PATCH 349/425] [2262] Remove Dev self.SLEF --- plugins/inara.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/inara.py b/plugins/inara.py index a4cc0e55..f2c9830e 100644 --- a/plugins/inara.py +++ b/plugins/inara.py @@ -106,7 +106,6 @@ class This: self.fleet: list[dict[str, Any]] | None = None self.shipswap: bool = False # just swapped ship self.on_foot = False - self.SLEF: str | None = None self.timer_run = True From d9f7b72e4655777b70ec4e1cfa0b4183231fe518 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 23 Jun 2024 13:09:13 -0400 Subject: [PATCH 350/425] [2262] Update Type Hinting --- monitor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monitor.py b/monitor.py index ae0f3ad7..29970ec0 100644 --- a/monitor.py +++ b/monitor.py @@ -704,7 +704,7 @@ class EDLogs(FileSystemEventHandler): self.state['Modules'][module['Slot']] = module # SLEF - initial_dict = { + initial_dict: dict[str, dict[str, Any]] = { "header": {"appName": appname, "appVersion": str(appversion())} } data_dict = {} From 5a9970e6c7cf2191662ebde0bf9d0fa873d7acd6 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 23 Jun 2024 13:10:57 -0400 Subject: [PATCH 351/425] [2262] Remove Debug Code --- ttkHyperlinkLabel.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ttkHyperlinkLabel.py b/ttkHyperlinkLabel.py index 5ca4feb4..6678530a 100644 --- a/ttkHyperlinkLabel.py +++ b/ttkHyperlinkLabel.py @@ -194,8 +194,6 @@ class HyperlinkLabel(tk.Label or ttk.Label): # type: ignore menu.add_command(label=tr.tl('Copy'), command=self.copy) # As in Copy and Paste if self.name == 'ship': - # TODO: Get SLEF from Inara - print(bool(monitor.slef)) menu.add_command(label=tr.tl('Copy INARA SLEF'), command=self.copy_slef, state=tk.DISABLED) menu.entryconfigure(1, state=monitor.slef and tk.NORMAL or tk.DISABLED) From 067bef628e64716c3bd655e52369d2de474f09ad Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 23 Jun 2024 13:14:41 -0400 Subject: [PATCH 352/425] [2262] Update Capitalizations and add Translations --- L10n/en.template | 3 +++ ttkHyperlinkLabel.py | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/L10n/en.template b/L10n/en.template index 1c1e110f..34734787 100644 --- a/L10n/en.template +++ b/L10n/en.template @@ -813,3 +813,6 @@ /* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ "Open in {URL}" = "Open in {URL}"; + +/* ttkHyperlinkLabel.py: Copy the Inara SLEF Format of the active ship to the clipboard; */ +"Copy Inara SLEF" = "Copy Inara SLEF"; diff --git a/ttkHyperlinkLabel.py b/ttkHyperlinkLabel.py index 6678530a..9f445690 100644 --- a/ttkHyperlinkLabel.py +++ b/ttkHyperlinkLabel.py @@ -194,7 +194,8 @@ class HyperlinkLabel(tk.Label or ttk.Label): # type: ignore menu.add_command(label=tr.tl('Copy'), command=self.copy) # As in Copy and Paste if self.name == 'ship': - menu.add_command(label=tr.tl('Copy INARA SLEF'), command=self.copy_slef, state=tk.DISABLED) + # LANG: Copy the Inara SLEF Format of the active ship to the clipboard + menu.add_command(label=tr.tl('Copy Inara SLEF'), command=self.copy_slef, state=tk.DISABLED) menu.entryconfigure(1, state=monitor.slef and tk.NORMAL or tk.DISABLED) menu.add_separator() From 19c91511359812f7c1b8bb920e50014e26b564b6 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 23 Jun 2024 13:26:44 -0400 Subject: [PATCH 353/425] [2262] Format SLEF with Square Brackets --- monitor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monitor.py b/monitor.py index 29970ec0..b11301b8 100644 --- a/monitor.py +++ b/monitor.py @@ -730,7 +730,7 @@ class EDLogs(FileSystemEventHandler): }) initial_dict.update({'data': data_dict}) output = json.dumps(initial_dict, indent=4) - self.slef = str(output) + self.slef = str(f"[{output}]") elif event_type == 'modulebuy': self.state['Modules'][entry['Slot']] = { From 86b5556efbd41cb7bed0233dba40d580d1466480 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 25 Jun 2024 11:25:05 -0400 Subject: [PATCH 354/425] [748] Enable Plugin Change w/ App Restart --- EDMarketConnector.py | 3 +- L10n/en.template | 14 +++++++-- config/__init__.py | 6 ++++ config/linux.py | 6 +++- config/windows.py | 34 ++++++++++++---------- prefs.py | 69 ++++++++++++++++++++++++++++++++------------ 6 files changed, 93 insertions(+), 39 deletions(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index 2582f570..390841cc 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -849,9 +849,10 @@ class AppWindow: if stable_popup: webbrowser.open("https://github.com/edCD/eDMarketConnector/releases/latest") if postargs.get('Restart_Req'): + # LANG: Text of Notification Popup for EDMC Restart restart_msg = tr.tl('A restart of EDMC is required. EDMC will now shut down.') restart_box = tk.messagebox.Message( - title=tr.tl('Restart Required'), + title=tr.tl('Restart Required'), # LANG: Title of Notification Popup for EDMC Restart message=restart_msg, type=tk.messagebox.OK ) diff --git a/L10n/en.template b/L10n/en.template index 1c1e110f..a7b3ec29 100644 --- a/L10n/en.template +++ b/L10n/en.template @@ -468,8 +468,11 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Plugins folder"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Open"; +/* prefs.py: Label on button used to open the Plugin Folder; */ +"Open Plugins Folder" = "Open Plugins Folder"; + +/* prefs.py: Selecting the Location of the Plugin Directory on the Filesystem; */ +"Plugin Directory Location" = "Plugin Directory Location"; /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name"; @@ -804,10 +807,15 @@ /* EDMarketConnector.py: Inform the user the Update Track has changed; */ "Update Track Changed to {TRACK}" = "Update Track Changed to {TRACK}"; - /* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ "Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?"; +/* EDMarketConnector.py: Title of Notification Popup for EDMC Restart; */ +"Restart Required" = "Restart Required"; + +/* EDMarketConnector.py: Text of Notification Popup for EDMC Restart; */ +"A restart of EDMC is required. EDMC will now shut down." = "A restart of EDMC is required. EDMC will now shut down."; + /* myNotebook.py: Can't Paste Images or Files in Text; */ "Cannot paste non-text content." = "Cannot paste non-text content."; diff --git a/config/__init__.py b/config/__init__.py index 8dfcf46b..9a00b9a9 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -189,6 +189,7 @@ class AbstractConfig(abc.ABC): app_dir_path: pathlib.Path plugin_dir_path: pathlib.Path + default_plugin_dir_path: pathlib.Path internal_plugin_dir_path: pathlib.Path respath_path: pathlib.Path home_path: pathlib.Path @@ -279,6 +280,11 @@ class AbstractConfig(abc.ABC): """Return a string version of plugin_dir.""" return str(self.plugin_dir_path) + @property + def default_plugin_dir(self) -> str: + """Return a string version of plugin_dir.""" + return str(self.default_plugin_dir_path) + @property def internal_plugin_dir(self) -> str: """Return a string version of internal_plugin_dir.""" diff --git a/config/linux.py b/config/linux.py index 51a40626..5900fe98 100644 --- a/config/linux.py +++ b/config/linux.py @@ -31,7 +31,11 @@ class LinuxConfig(AbstractConfig): self.app_dir_path = xdg_data_home / appname self.app_dir_path.mkdir(exist_ok=True, parents=True) - self.plugin_dir_path = self.app_dir_path / 'plugins' + self.default_plugin_dir_path = self.app_dir_path / 'plugins' + if (plugdir_str := self.get_str('plugin_dir')) is None or not pathlib.Path(plugdir_str).is_dir(): + self.set("plugin_dir", str(self.default_plugin_dir_path)) + plugdir_str = self.default_plugin_dir + self.plugin_dir_path = pathlib.Path(plugdir_str) self.plugin_dir_path.mkdir(exist_ok=True) self.respath_path = pathlib.Path(__file__).parent.parent diff --git a/config/windows.py b/config/windows.py index 75e3f697..c0d25b71 100644 --- a/config/windows.py +++ b/config/windows.py @@ -49,10 +49,28 @@ class WinConfig(AbstractConfig): def __init__(self) -> None: super().__init__() + REGISTRY_SUBKEY = r'Software\Marginal\EDMarketConnector' # noqa: N806 + create_key_defaults = functools.partial( + winreg.CreateKeyEx, + key=winreg.HKEY_CURRENT_USER, + access=winreg.KEY_ALL_ACCESS | winreg.KEY_WOW64_64KEY, + ) + + try: + self.__reg_handle: winreg.HKEYType = create_key_defaults(sub_key=REGISTRY_SUBKEY) + + except OSError: + logger.exception('Could not create required registry keys') + raise + self.app_dir_path = pathlib.Path(known_folder_path(FOLDERID_LocalAppData)) / appname # type: ignore self.app_dir_path.mkdir(exist_ok=True) - self.plugin_dir_path = self.app_dir_path / 'plugins' + self.default_plugin_dir_path = self.app_dir_path / 'plugins' + if (plugdir_str := self.get_str('plugin_dir')) is None or not pathlib.Path(plugdir_str).is_dir(): + self.set("plugin_dir", str(self.default_plugin_dir_path)) + plugdir_str = self.default_plugin_dir + self.plugin_dir_path = pathlib.Path(plugdir_str) self.plugin_dir_path.mkdir(exist_ok=True) if getattr(sys, 'frozen', False): @@ -68,20 +86,6 @@ class WinConfig(AbstractConfig): known_folder_path(FOLDERID_SavedGames)) / 'Frontier Developments' / 'Elite Dangerous' # type: ignore self.default_journal_dir_path = journal_dir_path if journal_dir_path.is_dir() else None # type: ignore - REGISTRY_SUBKEY = r'Software\Marginal\EDMarketConnector' # noqa: N806 - create_key_defaults = functools.partial( - winreg.CreateKeyEx, - key=winreg.HKEY_CURRENT_USER, - access=winreg.KEY_ALL_ACCESS | winreg.KEY_WOW64_64KEY, - ) - - try: - self.__reg_handle: winreg.HKEYType = create_key_defaults(sub_key=REGISTRY_SUBKEY) - - except OSError: - logger.exception('Could not create required registry keys') - raise - self.identifier = applongname if (outdir_str := self.get_str('outdir')) is None or not pathlib.Path(outdir_str).is_dir(): docs = known_folder_path(FOLDERID_Documents) diff --git a/prefs.py b/prefs.py index dffe71b9..be989601 100644 --- a/prefs.py +++ b/prefs.py @@ -912,20 +912,15 @@ class PreferencesDialog(tk.Toplevel): # Plugin settings and info plugins_frame = nb.Frame(notebook) plugins_frame.columnconfigure(0, weight=1) - plugdir = tk.StringVar() - plugdir.set(config.plugin_dir) row = AutoInc(start=0) - - # Section heading in settings + self.plugdir = tk.StringVar() + self.plugdir.set(str(config.get_str('plugin_dir'))) # LANG: Label for location of third-party plugins folder - nb.Label(plugins_frame, text=tr.tl('Plugins folder') + ':').grid( - padx=self.PADX, pady=self.PADY, sticky=tk.W, row=row.get() - ) - - plugdirentry = ttk.Entry(plugins_frame, justify=tk.LEFT) - self.displaypath(plugdir, plugdirentry) - plugdirentry.grid(columnspan=2, padx=self.PADX, pady=self.BOXY, sticky=tk.EW, row=row.get()) - + self.plugdir_label = nb.Label(plugins_frame, text=tr.tl('Plugins folder') + ':') + self.plugdir_label.grid(padx=self.PADX, pady=self.PADY, sticky=tk.W, row=row.get()) + self.plugdir_entry = ttk.Entry(plugins_frame, takefocus=False, + textvariable=self.plugdir) # Link StringVar to Entry widget + self.plugdir_entry.grid(columnspan=4, padx=self.PADX, pady=self.BOXY, sticky=tk.EW, row=row.get()) with row as cur_row: nb.Label( plugins_frame, @@ -933,19 +928,41 @@ class PreferencesDialog(tk.Toplevel): # LANG: Tip/label about how to disable plugins text=tr.tl( "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name").format(EXT='.disabled') - ).grid(columnspan=2, padx=self.PADX, pady=self.PADY, sticky=tk.EW, row=cur_row) + ).grid(columnspan=1, padx=self.PADX, pady=self.PADY, sticky=tk.EW, row=cur_row) - ttk.Button( + # Open Plugin Folder Button + self.open_plug_folder_btn = ttk.Button( plugins_frame, - # LANG: Label on button used to open a filesystem folder - text=tr.tl('Open'), # Button that opens a folder in Explorer/Finder + # LANG: Label on button used to open the Plugin Folder + text=tr.tl('Open Plugins Folder'), command=lambda: open_folder(config.plugin_dir_path) - ).grid(column=1, padx=self.PADX, pady=self.PADY, sticky=tk.N, row=cur_row) + ) + self.open_plug_folder_btn.grid(column=1, padx=self.PADX, pady=self.PADY, sticky=tk.EW, row=cur_row) + + # Browse Button + text = tr.tl('Browse...') # LANG: NOT-macOS Settings - files location selection button + self.plugbutton = ttk.Button( + plugins_frame, + text=text, + # LANG: Selecting the Location of the Plugin Directory on the Filesystem + command=lambda: self.filebrowse(tr.tl('Plugin Directory Location'), self.plugdir) + ) + self.plugbutton.grid(column=2, padx=self.PADX, pady=self.PADY, sticky=tk.EW, row=cur_row) + + if config.default_journal_dir_path: + # Appearance theme and language setting + ttk.Button( + plugins_frame, + # LANG: Settings > Configuration - Label on 'reset journal files location to default' button + text=tr.tl('Default'), + command=self.plugdir_reset, + state=tk.NORMAL if config.get_str('plugin_dir') else tk.DISABLED + ).grid(column=3, padx=self.PADX, pady=self.PADY, sticky=tk.EW, row=cur_row) enabled_plugins = list(filter(lambda x: x.folder and x.module, plug.PLUGINS)) if enabled_plugins: ttk.Separator(plugins_frame, orient=tk.HORIZONTAL).grid( - columnspan=3, padx=self.PADX, pady=self.SEPY, sticky=tk.EW, row=row.get() + columnspan=4, padx=self.PADX, pady=self.SEPY, sticky=tk.EW, row=row.get() ) nb.Label( plugins_frame, @@ -1123,6 +1140,13 @@ class PreferencesDialog(tk.Toplevel): self.outvarchanged() + def plugdir_reset(self) -> None: + """Reset the log dir to the default.""" + if config.default_plugin_dir_path: + self.plugdir.set(config.default_plugin_dir) + + self.outvarchanged() + def disable_autoappupdatecheckingame_changed(self) -> None: """Save out the auto update check in game config.""" config.set('disable_autoappupdatecheckingame', self.disable_autoappupdatecheckingame.get()) @@ -1218,7 +1242,7 @@ class PreferencesDialog(tk.Toplevel): return 'break' # stops further processing - insertion, Tab traversal etc - def apply(self) -> None: + def apply(self) -> None: # noqa: CCR001 """Update the config with the options set on the dialog.""" config.set('PrefsVersion', prefsVersion.stringToSerial(appversion_nobuild())) config.set( @@ -1274,6 +1298,13 @@ class PreferencesDialog(tk.Toplevel): config.set('dark_text', self.theme_colors[0]) config.set('dark_highlight', self.theme_colors[1]) theme.apply(self.parent) + if self.plugdir.get() != config.get('plugin_dir'): + config.set( + 'plugin_dir', + join(config.home_path, self.plugdir.get()[2:]) if self.plugdir.get().startswith( + '~') else self.plugdir.get() + ) + self.req_restart = True # Notify if self.callback: From fee05d3aa5a6993259f3517ef8148dcdb43b3707 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 25 Jun 2024 12:01:29 -0400 Subject: [PATCH 355/425] [748] Enable Automatic Restart --- EDMarketConnector.py | 8 +++++--- L10n/en.template | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index 390841cc..f905ee29 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -850,7 +850,7 @@ class AppWindow: webbrowser.open("https://github.com/edCD/eDMarketConnector/releases/latest") if postargs.get('Restart_Req'): # LANG: Text of Notification Popup for EDMC Restart - restart_msg = tr.tl('A restart of EDMC is required. EDMC will now shut down.') + restart_msg = tr.tl('A restart of EDMC is required. EDMC will now restart.') restart_box = tk.messagebox.Message( title=tr.tl('Restart Required'), # LANG: Title of Notification Popup for EDMC Restart message=restart_msg, @@ -858,7 +858,7 @@ class AppWindow: ) restart_box.show() if restart_box: - app.onexit() + app.onexit(restart=True) def set_labels(self): """Set main window labels, e.g. after language change.""" @@ -1862,7 +1862,7 @@ class AppWindow: ) exit_thread.start() - def onexit(self, event=None) -> None: + def onexit(self, event=None, restart: bool=False) -> None: """Application shutdown procedure.""" if sys.platform == 'win32': shutdown_thread = threading.Thread( @@ -1925,6 +1925,8 @@ class AppWindow: self.w.destroy() logger.info('Done.') + if restart: + return os.execv(sys.executable, ['python'] + sys.argv) def drag_start(self, event) -> None: """Initiate dragging the window.""" diff --git a/L10n/en.template b/L10n/en.template index a7b3ec29..74b9728f 100644 --- a/L10n/en.template +++ b/L10n/en.template @@ -814,7 +814,7 @@ "Restart Required" = "Restart Required"; /* EDMarketConnector.py: Text of Notification Popup for EDMC Restart; */ -"A restart of EDMC is required. EDMC will now shut down." = "A restart of EDMC is required. EDMC will now shut down."; +"A restart of EDMC is required. EDMC will now restart." = "A restart of EDMC is required. EDMC will now restart."; /* myNotebook.py: Can't Paste Images or Files in Text; */ "Cannot paste non-text content." = "Cannot paste non-text content."; From 6643f838dcbfaab6ea1c5bdb0e6ff595178c7c58 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 25 Jun 2024 12:07:49 -0400 Subject: [PATCH 356/425] [748] Update URL --- EDMarketConnector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index f905ee29..b64dc1c8 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -847,7 +847,7 @@ class AppWindow: update_msg = update_msg.replace('\\r', '\r') stable_popup = tk.messagebox.askyesno(title=title, message=update_msg) if stable_popup: - webbrowser.open("https://github.com/edCD/eDMarketConnector/releases/latest") + webbrowser.open("https://github.com/EDCD/eDMarketConnector/releases/latest") if postargs.get('Restart_Req'): # LANG: Text of Notification Popup for EDMC Restart restart_msg = tr.tl('A restart of EDMC is required. EDMC will now restart.') From b47c2bddde07ebbf4d0fdea7e057bfa8a16c050e Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 25 Jun 2024 12:11:49 -0400 Subject: [PATCH 357/425] [Minor] Flake8 Fix --- EDMarketConnector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index b64dc1c8..b2b7582e 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -1862,7 +1862,7 @@ class AppWindow: ) exit_thread.start() - def onexit(self, event=None, restart: bool=False) -> None: + def onexit(self, event=None, restart: bool = False) -> None: """Application shutdown procedure.""" if sys.platform == 'win32': shutdown_thread = threading.Thread( From d22f39496b972bab3b4a042e2fb84965f96c4d4b Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 25 Jun 2024 12:18:52 -0400 Subject: [PATCH 358/425] [748] Reorder Linux Settings --- EDMarketConnector.py | 2 +- config/linux.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index b2b7582e..843b076a 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -1926,7 +1926,7 @@ class AppWindow: logger.info('Done.') if restart: - return os.execv(sys.executable, ['python'] + sys.argv) + os.execv(sys.executable, ['python'] + sys.argv) def drag_start(self, event) -> None: """Initiate dragging the window.""" diff --git a/config/linux.py b/config/linux.py index 5900fe98..a7a472f4 100644 --- a/config/linux.py +++ b/config/linux.py @@ -32,12 +32,6 @@ class LinuxConfig(AbstractConfig): self.app_dir_path.mkdir(exist_ok=True, parents=True) self.default_plugin_dir_path = self.app_dir_path / 'plugins' - if (plugdir_str := self.get_str('plugin_dir')) is None or not pathlib.Path(plugdir_str).is_dir(): - self.set("plugin_dir", str(self.default_plugin_dir_path)) - plugdir_str = self.default_plugin_dir - self.plugin_dir_path = pathlib.Path(plugdir_str) - self.plugin_dir_path.mkdir(exist_ok=True) - self.respath_path = pathlib.Path(__file__).parent.parent self.internal_plugin_dir_path = self.respath_path / 'plugins' @@ -66,6 +60,12 @@ class LinuxConfig(AbstractConfig): self.config.add_section(self.SECTION) + if (plugdir_str := self.get_str('plugin_dir')) is None or not pathlib.Path(plugdir_str).is_dir(): + self.set("plugin_dir", str(self.default_plugin_dir_path)) + plugdir_str = self.default_plugin_dir + self.plugin_dir_path = pathlib.Path(plugdir_str) + self.plugin_dir_path.mkdir(exist_ok=True) + if (outdir := self.get_str('outdir')) is None or not pathlib.Path(outdir).is_dir(): self.set('outdir', self.home) From a385b6fd80b994f9aa414a39155ec5b26f509eeb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 17:38:51 +0000 Subject: [PATCH 359/425] Bump flake8 from 7.0.0 to 7.1.0 Bumps [flake8](https://github.com/pycqa/flake8) from 7.0.0 to 7.1.0. - [Commits](https://github.com/pycqa/flake8/compare/7.0.0...7.1.0) --- updated-dependencies: - dependency-name: flake8 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 05c5ad29..28a239d2 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -8,7 +8,7 @@ wheel setuptools==70.0.0 # Static analysis tools -flake8==7.0.0 +flake8==7.1.0 flake8-annotations-coverage==0.0.6 flake8-cognitive-complexity==0.1.0 flake8-comprehensions==3.14.0 From 0adc9cbe63311c967c7a4b42e96cb513868fd886 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 17:38:56 +0000 Subject: [PATCH 360/425] Bump pep8-naming from 0.13.3 to 0.14.1 Bumps [pep8-naming](https://github.com/PyCQA/pep8-naming) from 0.13.3 to 0.14.1. - [Release notes](https://github.com/PyCQA/pep8-naming/releases) - [Changelog](https://github.com/PyCQA/pep8-naming/blob/main/CHANGELOG.rst) - [Commits](https://github.com/PyCQA/pep8-naming/compare/0.13.3...0.14.1) --- updated-dependencies: - dependency-name: pep8-naming dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 05c5ad29..68062755 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -19,7 +19,7 @@ flake8-polyfill==1.0.2 flake8-use-fstring==1.4 mypy==1.10.0 -pep8-naming==0.13.3 +pep8-naming==0.14.1 safety==3.2.0 types-requests==2.31.0.20240311 types-pkg-resources==0.1.3 From 47b621c2b8abf451952dbe9f41a0c0a11bb71259 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 17:38:59 +0000 Subject: [PATCH 361/425] Bump watchdog from 4.0.0 to 4.0.1 Bumps [watchdog](https://github.com/gorakhargosh/watchdog) from 4.0.0 to 4.0.1. - [Release notes](https://github.com/gorakhargosh/watchdog/releases) - [Changelog](https://github.com/gorakhargosh/watchdog/blob/master/changelog.rst) - [Commits](https://github.com/gorakhargosh/watchdog/compare/v4.0.0...v4.0.1) --- updated-dependencies: - dependency-name: watchdog dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 22f0a360..87795065 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ requests==2.32.3 pillow==10.3.0 -watchdog==4.0.0 +watchdog==4.0.1 simplesystray==0.1.0; sys_platform == 'win32' semantic-version==2.10.0 From bac4b30848293bccf224bf505203e827c7982260 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 17:39:04 +0000 Subject: [PATCH 362/425] Bump pytest from 8.2.0 to 8.2.2 Bumps [pytest](https://github.com/pytest-dev/pytest) from 8.2.0 to 8.2.2. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/8.2.0...8.2.2) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 05c5ad29..9c4f249d 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -38,7 +38,7 @@ mistune==3.0.2 py2exe==0.13.0.1; sys_platform == 'win32' # Testing -pytest==8.2.0 +pytest==8.2.2 pytest-cov==5.0.0 # Pytest code coverage support coverage[toml]==7.5.0 # pytest-cov dep. This is here to ensure that it includes TOML support for pyproject.toml configs coverage-conditional-plugin==0.9.0 From 054245f34848679d11a4771b38c66f4d1081a6df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 18:46:54 +0000 Subject: [PATCH 363/425] Bump flake8-comprehensions from 3.14.0 to 3.15.0 Bumps [flake8-comprehensions](https://github.com/adamchainz/flake8-comprehensions) from 3.14.0 to 3.15.0. - [Changelog](https://github.com/adamchainz/flake8-comprehensions/blob/main/CHANGELOG.rst) - [Commits](https://github.com/adamchainz/flake8-comprehensions/compare/3.14.0...3.15.0) --- updated-dependencies: - dependency-name: flake8-comprehensions dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 2f27e2ab..fe145993 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -11,7 +11,7 @@ setuptools==70.0.0 flake8==7.1.0 flake8-annotations-coverage==0.0.6 flake8-cognitive-complexity==0.1.0 -flake8-comprehensions==3.14.0 +flake8-comprehensions==3.15.0 flake8-docstrings==1.7.0 flake8-json==24.4.0 flake8-noqa==1.4.0 From e9755fae783bfce12ed05928d5d93e2e510ac1a5 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 1 Jul 2024 14:56:51 -0400 Subject: [PATCH 364/425] [2270] C420 Unnecessary Dict Comprehension --- debug_webserver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debug_webserver.py b/debug_webserver.py index 87f7eaed..1825c771 100644 --- a/debug_webserver.py +++ b/debug_webserver.py @@ -18,7 +18,7 @@ logger = get_main_logger() output_lock = threading.Lock() output_data_path = pathlib.Path(tempfile.gettempdir()) / f'{appname}' / 'http_debug' -SAFE_TRANSLATE = str.maketrans({x: '_' for x in "!@#$%^&*()./\\\r\n[]-+='\";:?<>,~`"}) +SAFE_TRANSLATE = str.maketrans(dict.fromkeys("!@#$%^&*()./\\\r\n[]-+='\";:?<>,~`", '_')) class LoggingHandler(server.BaseHTTPRequestHandler): From ee0f317791c1663c8a49af9c5002e18c1da5e4f3 Mon Sep 17 00:00:00 2001 From: Hans Acker <104778425+HansAcker@users.noreply.github.com> Date: Sat, 13 Jul 2024 06:35:21 +0200 Subject: [PATCH 365/425] pass Horizons/Odyssey flags in NavRoute The old workaround appears to be not needed anymore. EDDN accepts NavRoute with Horizons/Odyssey flags now. EDDiscovery, EDO Materials Helper and others also set these flags. --- plugins/eddn.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/plugins/eddn.py b/plugins/eddn.py index 2b223036..0128f946 100644 --- a/plugins/eddn.py +++ b/plugins/eddn.py @@ -1416,15 +1416,6 @@ class EDDN: ####################################################################### # Elisions ####################################################################### - # WORKAROUND WIP EDDN schema | 2021-10-17: This will reject with the Odyssey or Horizons flags present - if 'odyssey' in entry: - del entry['odyssey'] - - if 'horizons' in entry: - del entry['horizons'] - - # END WORKAROUND - # In case Frontier ever add any entry = filter_localised(entry) ####################################################################### From 40463d4de814ad88ea1d8265d74c4d6c23a4ac15 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 21 Jul 2024 23:46:15 -0400 Subject: [PATCH 366/425] [2114] Update Pathlib Usage --- prefs.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/prefs.py b/prefs.py index ffe9eed0..69e6a840 100644 --- a/prefs.py +++ b/prefs.py @@ -41,7 +41,7 @@ def help_open_log_folder() -> None: """Open the folder logs are stored in.""" warnings.warn('prefs.help_open_log_folder is deprecated, use open_log_folder instead. ' 'This function will be removed in 6.0 or later', DeprecationWarning, stacklevel=2) - open_folder(pathlib.Path(config.app_dir_path / 'logs')) + open_folder(Path(config.app_dir_path / 'logs')) def open_folder(file: Path) -> None: @@ -322,7 +322,7 @@ class PreferencesDialog(tk.Toplevel): self.geometry(f"+{position.left}+{position.top}") # Set Log Directory - self.logfile_loc = pathlib.Path(config.app_dir_path / 'logs') + self.logfile_loc = Path(config.app_dir_path / 'logs') # Set minimum size to prevent content cut-off self.update_idletasks() # Update "requested size" from geometry manager @@ -1299,8 +1299,8 @@ class PreferencesDialog(tk.Toplevel): if self.plugdir.get() != config.get('plugin_dir'): config.set( 'plugin_dir', - join(config.home_path, self.plugdir.get()[2:]) if self.plugdir.get().startswith( - '~') else self.plugdir.get() + str(Path(config.home_path, self.plugdir.get()[2:])) if self.plugdir.get().startswith('~') else + str(Path(self.plugdir.get())) ) self.req_restart = True From 759fc12dcb89fd8677462a05bc9772134515d2ed Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 22 Jul 2024 13:48:45 -0400 Subject: [PATCH 367/425] [1805] Update Prototype --- EDMarketConnector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index 516a816d..0c347b36 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -296,7 +296,7 @@ if __name__ == '__main__': # noqa: C901 # class name limited to 256 - https://msdn.microsoft.com/en-us/library/windows/desktop/ms633576 cls = create_unicode_buffer(257) # This conditional is exploded to make debugging slightly easier - if win32gui.GetClassName(window_handle, cls, 257): + if win32gui.GetClassName(window_handle): if cls.value == 'TkTopLevel': if window_title(window_handle) == applongname: if GetProcessHandleFromHwnd(window_handle): From 6a3691d755c002c7f671926701792e95c6995beb Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 29 Jul 2024 18:58:30 -0400 Subject: [PATCH 368/425] [2278] Fix Incomplete OrderedDict --- plugins/eddn.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/plugins/eddn.py b/plugins/eddn.py index 2b223036..0ece6327 100644 --- a/plugins/eddn.py +++ b/plugins/eddn.py @@ -958,13 +958,13 @@ class EDDN: self.send_message(cmdr, { '$schemaRef': f'https://eddn.edcd.io/schemas/outfitting/2{"/test" if is_beta else ""}', 'message': { - ('timestamp', entry['timestamp']), - ('systemName', entry['StarSystem']), - ('stationName', entry['StationName']), - ('marketId', entry['MarketID']), - ('horizons', horizons), - ('modules', outfitting), - ('odyssey', entry['odyssey']) + 'timestamp': entry['timestamp'], + 'systemName': entry['StarSystem'], + 'stationName': entry['StationName'], + 'marketId': entry['MarketID'], + 'horizons': horizons, + 'modules': outfitting, + 'odyssey': entry['odyssey'] }, }) @@ -992,13 +992,13 @@ class EDDN: self.send_message(cmdr, { '$schemaRef': f'https://eddn.edcd.io/schemas/shipyard/2{"/test" if is_beta else ""}', 'message': { - ('timestamp', entry['timestamp']), - ('systemName', entry['StarSystem']), - ('stationName', entry['StationName']), - ('marketId', entry['MarketID']), - ('horizons', horizons), - ('ships', shipyard), - ('odyssey', entry['odyssey']) + 'timestamp': entry['timestamp'], + 'systemName': entry['StarSystem'], + 'stationName': entry['StationName'], + 'marketId': entry['MarketID'], + 'horizons': horizons, + 'ships': shipyard, + 'odyssey': entry['odyssey'] }, }) From 1e9dec13716a0348be9166f093cad8e13c387d26 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 29 Jul 2024 19:32:16 -0400 Subject: [PATCH 369/425] [610] Improved process_iter Significant speed-up. Around 20x in psutils 6.0! --- monitor.py | 9 ++++----- requirements.txt | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/monitor.py b/monitor.py index d0a79716..ce6b6075 100644 --- a/monitor.py +++ b/monitor.py @@ -2156,12 +2156,11 @@ class EDLogs(FileSystemEventHandler): # Process likely expired self.running_process = None if not self.running_process: - edmc_process = psutil.Process() - edmc_user = edmc_process.username() try: - for pid in psutil.pids(): - proc = psutil.Process(pid) - if 'EliteDangerous' in proc.name() and proc.username() == edmc_user: + edmc_process = psutil.Process() + edmc_user = edmc_process.username() + for proc in psutil.process_iter(['name', 'username']): + if 'EliteDangerous' in proc.info['name'] and proc.info['username'] == edmc_user: self.running_process = proc return True except psutil.NoSuchProcess: diff --git a/requirements.txt b/requirements.txt index 23e90a95..7aac47d1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,4 @@ simplesystray==0.1.0; sys_platform == 'win32' semantic-version==2.10.0 # For manipulating folder permissions and the like. pywin32==306; sys_platform == 'win32' -psutil==5.9.8 +psutil==6.0.0 From 2e6a2a4a843b98e90ade3c8f3062b1996e88ceae Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 29 Jul 2024 19:40:03 -0400 Subject: [PATCH 370/425] [Lang] Update Language Files --- L10n/it.strings | 34 ++++++++++++++++++++++++++++++++ L10n/ja.strings | 48 ++++++++++++++++++++++++++++++++++++++++++++++ L10n/pt-BR.strings | 2 +- L10n/pt-PT.strings | 34 ++++++++++++++++++++++++++++++++ 4 files changed, 117 insertions(+), 1 deletion(-) diff --git a/L10n/it.strings b/L10n/it.strings index 003475f1..3431df2e 100644 --- a/L10n/it.strings +++ b/L10n/it.strings @@ -1,3 +1,15 @@ +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Errore nel Sistema di Profilazione"; + +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: dati della Fleet Carrier incompleti"; + +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: nessun dato della Fleet Carrier ottenuto"; + +/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ +"Enable Fleet Carrier CAPI Queries" = "Abilita le query CAPI per le Fleet Carrier"; + /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Invia il registro di volo e lo stato del CMDR a EDSM"; @@ -126,6 +138,15 @@ /* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:962; ttkHyperlinkLabel.py:53; */ "Copy" = "Copia"; +/* myNotebook.py: Label for 'Cut' as in 'Cut and Paste'; */ +"Cut" = "Taglia"; + +/* myNotebook.py: Label for 'Paste' as in 'Copy and Paste'; */ +"Paste" = "Incolla"; + +/* myNotebook.py: Label for 'Select All'; */ +"Select All" = "Seleziona Tutto"; + /* EDMarketConnector.py: CAPI auth aborted because of killswitch; EDMarketConnector.py: CAPI auth query aborted because of killswitch; In files: EDMarketConnector.py:973; EDMarketConnector.py:1067; */ "CAPI auth disabled by killswitch" = "Autenticazione CAPI disabilitata dal killswitch"; @@ -783,6 +804,19 @@ /* update.py: Update Available Text; In files: update.py:229; */ "{NEWVER} is available" = "{NEWVER} è disponibile"; +/* prefs.py: Stable Version of EDMC; */ +"Stable" = "Stabile"; + +/* prefs.py: Select the Update Track (Beta, Stable); */ +"Update Track" = "Canale di aggiornamento"; + +/* EDMarketConnector.py: Inform the user the Update Track has changed; */ +"Update Track Changed to {TRACK}" = "Canale di aggiornamento cambiato in {TRACK}"; + + +/* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ +"Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Il canale di aggiornamento è cambiato da Beta a Stabile. Non riceverai più aggiornamenti Beta. Rimarrai sulla tua attuale versione Beta fino alla prossima release Stabile.\n\nPuoi tornare manualmente all'ultima versione Stabile. Per farlo, devi scaricare e installare manualmente l'ultima versione Stabile. Nota che questo potrebbe introdurre bug o causare malfunzionamenti se si esegue il downgrade tra versioni principali con cambiamenti significativi.\n\nVuoi aprire GitHub per scaricare l'ultima release?"; + /* myNotebook.py: Can't Paste Images or Files in Text; */ "Cannot paste non-text content." = "Non si può incollare contenuto non testuale"; diff --git a/L10n/ja.strings b/L10n/ja.strings index 3d0ef85e..b0e2cb68 100644 --- a/L10n/ja.strings +++ b/L10n/ja.strings @@ -1,3 +1,15 @@ +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "システムプロファイラーでエラー"; + +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: フリートキャリアデータが不完全"; + +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: フリートキャリアデータの返信なし"; + +/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ +"Enable Fleet Carrier CAPI Queries" = "フリートキャリアCAPIクエリを有効にする"; + /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "フライトログとCMDRステータスをEDSMへ送信する"; @@ -36,6 +48,12 @@ /* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:508; */ "Error: unable to get token" = "エラー: トークンが取得できません"; +/* EDMarketConnector.py: EDMC Critical Error Notification; */ +"EDMC encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!" = "EDMCは致命的な問題に遭遇し、復旧できません。EDMCは自身の保護のためシャットダウンします!"; + +/* EDMarketConnector.py: EDMC Critical Error Details; */ +"Here's what EDMC Detected:\r\n\r\n{ERR}\r\n\r\nDo you want to file a Bug Report on GitHub?" = "EDMCが検知した問題は以下の通りです:\n\n{ERR}\n\nGitHubにバグレポートを作成しますか?"; + /* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:844; */ "Frontier CAPI down for maintenance" = "Frontier CAPIがメンテナンスのため停止中"; @@ -87,6 +105,9 @@ /* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:930; EDMarketConnector.py:958; */ "Check for Updates..." = "更新の確認..."; +/* EDMarketConnector.py: Help > Open System Profiler; In files: EDMarketConnector.py:888; */ +"Open System Profiler" = "システムプロファイラーを開く"; + /* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:931; EDMarketConnector.py:948; */ "Save Raw Data..." = "生データの保存..."; @@ -117,6 +138,15 @@ /* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:962; ttkHyperlinkLabel.py:53; */ "Copy" = "コピー"; +/* myNotebook.py: Label for 'Cut' as in 'Cut and Paste'; */ +"Cut" = "切り取り"; + +/* myNotebook.py: Label for 'Paste' as in 'Copy and Paste'; */ +"Paste" = "貼り付け"; + +/* myNotebook.py: Label for 'Select All'; */ +"Select All" = "全てを選択"; + /* EDMarketConnector.py: CAPI auth aborted because of killswitch; EDMarketConnector.py: CAPI auth query aborted because of killswitch; In files: EDMarketConnector.py:973; EDMarketConnector.py:1067; */ "CAPI auth disabled by killswitch" = "CAPI認証はkillswitchによって無効にされています"; @@ -774,3 +804,21 @@ /* update.py: Update Available Text; In files: update.py:229; */ "{NEWVER} is available" = "{NEWVER} があります"; +/* prefs.py: Stable Version of EDMC; */ +"Stable" = "安定版"; + +/* prefs.py: Select the Update Track (Beta, Stable); */ +"Update Track" = "アップデートトラック"; + +/* EDMarketConnector.py: Inform the user the Update Track has changed; */ +"Update Track Changed to {TRACK}" = "アップデートトラックを {TRACK} に変更します"; + + +/* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ +"Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "アップデートトラックをベータから安定版に変更しました。今後ベータ版のアップデートを受け取ることはありません。次の安定版がリリースされるまでこのベータ版をご利用いただけます。\n\n手動で最新の安定版に戻すことができます。そのためには、最新の安定版を手動でダウンロードしてインストールする必要があります。大きな変更を伴うメジャーバージョン間のダウングレードの場合、バグが発生したり、完全に壊れたりする可能性があることに注意してください。\n\nGitHubを開いて最新リリースをダウンロードしますか?"; + +/* myNotebook.py: Can't Paste Images or Files in Text; */ +"Cannot paste non-text content." = "テキストではない内容は貼り付けできません"; + +/* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ +"Open in {URL}" = "{URL} で開く"; diff --git a/L10n/pt-BR.strings b/L10n/pt-BR.strings index 791a582a..b145dd04 100644 --- a/L10n/pt-BR.strings +++ b/L10n/pt-BR.strings @@ -379,7 +379,7 @@ "Market data in Trade Dangerous format file" = "Dados de mercado no arquivo de formato Trade Dangerous"; /* prefs.py: Settings > Output option; In files: prefs.py:360; */ -"Ship loadout" = "Modulação da nave"; +"Ship loadout" = "Build da Nave"; /* prefs.py: Settings > Output option; In files: prefs.py:370; */ "Automatically update on docking" = "Atualizar automaticamente na docagem"; diff --git a/L10n/pt-PT.strings b/L10n/pt-PT.strings index 2d240917..1851155c 100644 --- a/L10n/pt-PT.strings +++ b/L10n/pt-PT.strings @@ -1,3 +1,15 @@ +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Erro nas Informações do Sistema"; + +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: Dados de Transportador de Frota incompletos"; + +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: Sem dados de Transportador de Frota"; + +/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ +"Enable Fleet Carrier CAPI Queries" = "Ligar Consultas CAPI de Transportador de Frota"; + /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Enviar registos de voo e estado de CMDR para o EDSM"; @@ -126,6 +138,15 @@ /* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:962; ttkHyperlinkLabel.py:53; */ "Copy" = "Copiar"; +/* myNotebook.py: Label for 'Cut' as in 'Cut and Paste'; */ +"Cut" = "Cortar"; + +/* myNotebook.py: Label for 'Paste' as in 'Copy and Paste'; */ +"Paste" = "Colar"; + +/* myNotebook.py: Label for 'Select All'; */ +"Select All" = "Selecionar Tudo"; + /* EDMarketConnector.py: CAPI auth aborted because of killswitch; EDMarketConnector.py: CAPI auth query aborted because of killswitch; In files: EDMarketConnector.py:973; EDMarketConnector.py:1067; */ "CAPI auth disabled by killswitch" = "Autenticação CAPI desligada por botão"; @@ -783,6 +804,19 @@ /* update.py: Update Available Text; In files: update.py:229; */ "{NEWVER} is available" = "{NEWVER} disponível."; +/* prefs.py: Stable Version of EDMC; */ +"Stable" = "Estável"; + +/* prefs.py: Select the Update Track (Beta, Stable); */ +"Update Track" = "Caminho de Actualizações"; + +/* EDMarketConnector.py: Inform the user the Update Track has changed; */ +"Update Track Changed to {TRACK}" = "Caminho de Actualizações alterado para {TRACK}"; + + +/* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ +"Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Caminho de Actualizações alterado de Estável para Beta. Deixará de receber actualizações Beta. Irá continuar na versão Beta até à próxima actualização Estável.\n\nPode, manualmente, reverter para a última versão Estável. Para isso, faça download e instale a última versão Estável manualmente. Note que o retrocesso para versões anteriores com diferenças significativas poderá introduzir bugs ou danificar a instalação.\n\nDeseja abrir o GitHub para fazer download da última versão?"; + /* myNotebook.py: Can't Paste Images or Files in Text; */ "Cannot paste non-text content." = "Só é possível colar conteúdo texto."; From bff62c3ebb51947dfe5fa845d7bdf6d8dd339f81 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 29 Jul 2024 19:49:36 -0400 Subject: [PATCH 371/425] Update Changelog and Config --- ChangeLog.md | 30 ++++++++++++++++++++++++++++++ config/__init__.py | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 30023566..39825fca 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,6 +6,27 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- +Release 5.11.3-beta0 +=== +This is a release candidate for 5.11.3. + +This release fixes a bug where an incomplete hand-over from ordereddict to dict types would cause a sender failure. + +**Changes and Enhancements** +* Updated Translations + +**Bug Fixes** +* Fixed a bug where two senders might fail due to improper data formats + +**Plugin Developers** +* nb.Entry is deprecated, and is slated for removal in 6.0 or later. Please migrate to nb.EntryMenu +* nb.ColoredButton is deprecated, and is slated for removal in 6.0 or later. Please migrate to tk.Button +* Calling internal translations with `_()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to importing `translations` and calling `translations.translate` or `translations.tl` directly +* `Translations` as the translate system singleton is deprecated, and is slated for removal in 6.0 or later. Please migrate to the `translations` singleton +* `help_open_log_folder()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to open_folder() +* `update_feed` is deprecated, and is slated for removal in 6.0 or later. Please migrate to `get_update_feed()`. +* FDevID files (`commodity.csv` and `rare_commodity.csv`) have moved their preferred location to the app dir (same location as default Plugins folder). Please migrate to use `config.app_dir_path`. + Release 5.11.2 === @@ -18,6 +39,15 @@ This release fixes a bug where minimizing to the system tray could cause the pro **Bug Fixes** * Fixed a bug where minimizing to the system tray could cause the program to not un-minimize. +**Plugin Developers** +* nb.Entry is deprecated, and is slated for removal in 6.0 or later. Please migrate to nb.EntryMenu +* nb.ColoredButton is deprecated, and is slated for removal in 6.0 or later. Please migrate to tk.Button +* Calling internal translations with `_()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to importing `translations` and calling `translations.translate` or `translations.tl` directly +* `Translations` as the translate system singleton is deprecated, and is slated for removal in 6.0 or later. Please migrate to the `translations` singleton +* `help_open_log_folder()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to open_folder() +* `update_feed` is deprecated, and is slated for removal in 6.0 or later. Please migrate to `get_update_feed()`. +* FDevID files (`commodity.csv` and `rare_commodity.csv`) have moved their preferred location to the app dir (same location as default Plugins folder). Please migrate to use `config.app_dir_path`. + Release 5.11.1 === diff --git a/config/__init__.py b/config/__init__.py index 4d63bb38..956a5453 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -52,7 +52,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.11.2' +_static_appversion = '5.11.3-beta0' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From 8c24768828f07547c845e2c041a3c1c6c060058f Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 29 Jul 2024 20:00:01 -0400 Subject: [PATCH 372/425] [RELEASE] 5.10.3-beta0 [2278] Fix Incomplete Ordered Dict --- ChangeLog.md | 30 +++++++++++++++++++++++++++++ L10n/it.strings | 34 ++++++++++++++++++++++++++++++++ L10n/ja.strings | 48 ++++++++++++++++++++++++++++++++++++++++++++++ L10n/pt-BR.strings | 2 +- L10n/pt-PT.strings | 34 ++++++++++++++++++++++++++++++++ config/__init__.py | 2 +- plugins/eddn.py | 28 +++++++++++++-------------- 7 files changed, 162 insertions(+), 16 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 2f9248f1..e8f4d1c7 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,6 +6,27 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- +Release 5.11.3-beta0 +=== +This is a release candidate for 5.11.3. + +This release fixes a bug where an incomplete hand-over from ordereddict to dict types would cause a sender failure. + +**Changes and Enhancements** +* Updated Translations + +**Bug Fixes** +* Fixed a bug where two senders might fail due to improper data formats + +**Plugin Developers** +* nb.Entry is deprecated, and is slated for removal in 6.0 or later. Please migrate to nb.EntryMenu +* nb.ColoredButton is deprecated, and is slated for removal in 6.0 or later. Please migrate to tk.Button +* Calling internal translations with `_()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to importing `translations` and calling `translations.translate` or `translations.tl` directly +* `Translations` as the translate system singleton is deprecated, and is slated for removal in 6.0 or later. Please migrate to the `translations` singleton +* `help_open_log_folder()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to open_folder() +* `update_feed` is deprecated, and is slated for removal in 6.0 or later. Please migrate to `get_update_feed()`. +* FDevID files (`commodity.csv` and `rare_commodity.csv`) have moved their preferred location to the app dir (same location as default Plugins folder). Please migrate to use `config.app_dir_path`. + Release 5.11.2 === @@ -18,6 +39,15 @@ This release fixes a bug where minimizing to the system tray could cause the pro **Bug Fixes** * Fixed a bug where minimizing to the system tray could cause the program to not un-minimize. +**Plugin Developers** +* nb.Entry is deprecated, and is slated for removal in 6.0 or later. Please migrate to nb.EntryMenu +* nb.ColoredButton is deprecated, and is slated for removal in 6.0 or later. Please migrate to tk.Button +* Calling internal translations with `_()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to importing `translations` and calling `translations.translate` or `translations.tl` directly +* `Translations` as the translate system singleton is deprecated, and is slated for removal in 6.0 or later. Please migrate to the `translations` singleton +* `help_open_log_folder()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to open_folder() +* `update_feed` is deprecated, and is slated for removal in 6.0 or later. Please migrate to `get_update_feed()`. +* FDevID files (`commodity.csv` and `rare_commodity.csv`) have moved their preferred location to the app dir (same location as default Plugins folder). Please migrate to use `config.app_dir_path`. + Release 5.11.1 === diff --git a/L10n/it.strings b/L10n/it.strings index 003475f1..3431df2e 100644 --- a/L10n/it.strings +++ b/L10n/it.strings @@ -1,3 +1,15 @@ +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Errore nel Sistema di Profilazione"; + +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: dati della Fleet Carrier incompleti"; + +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: nessun dato della Fleet Carrier ottenuto"; + +/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ +"Enable Fleet Carrier CAPI Queries" = "Abilita le query CAPI per le Fleet Carrier"; + /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Invia il registro di volo e lo stato del CMDR a EDSM"; @@ -126,6 +138,15 @@ /* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:962; ttkHyperlinkLabel.py:53; */ "Copy" = "Copia"; +/* myNotebook.py: Label for 'Cut' as in 'Cut and Paste'; */ +"Cut" = "Taglia"; + +/* myNotebook.py: Label for 'Paste' as in 'Copy and Paste'; */ +"Paste" = "Incolla"; + +/* myNotebook.py: Label for 'Select All'; */ +"Select All" = "Seleziona Tutto"; + /* EDMarketConnector.py: CAPI auth aborted because of killswitch; EDMarketConnector.py: CAPI auth query aborted because of killswitch; In files: EDMarketConnector.py:973; EDMarketConnector.py:1067; */ "CAPI auth disabled by killswitch" = "Autenticazione CAPI disabilitata dal killswitch"; @@ -783,6 +804,19 @@ /* update.py: Update Available Text; In files: update.py:229; */ "{NEWVER} is available" = "{NEWVER} è disponibile"; +/* prefs.py: Stable Version of EDMC; */ +"Stable" = "Stabile"; + +/* prefs.py: Select the Update Track (Beta, Stable); */ +"Update Track" = "Canale di aggiornamento"; + +/* EDMarketConnector.py: Inform the user the Update Track has changed; */ +"Update Track Changed to {TRACK}" = "Canale di aggiornamento cambiato in {TRACK}"; + + +/* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ +"Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Il canale di aggiornamento è cambiato da Beta a Stabile. Non riceverai più aggiornamenti Beta. Rimarrai sulla tua attuale versione Beta fino alla prossima release Stabile.\n\nPuoi tornare manualmente all'ultima versione Stabile. Per farlo, devi scaricare e installare manualmente l'ultima versione Stabile. Nota che questo potrebbe introdurre bug o causare malfunzionamenti se si esegue il downgrade tra versioni principali con cambiamenti significativi.\n\nVuoi aprire GitHub per scaricare l'ultima release?"; + /* myNotebook.py: Can't Paste Images or Files in Text; */ "Cannot paste non-text content." = "Non si può incollare contenuto non testuale"; diff --git a/L10n/ja.strings b/L10n/ja.strings index 3d0ef85e..b0e2cb68 100644 --- a/L10n/ja.strings +++ b/L10n/ja.strings @@ -1,3 +1,15 @@ +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "システムプロファイラーでエラー"; + +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: フリートキャリアデータが不完全"; + +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: フリートキャリアデータの返信なし"; + +/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ +"Enable Fleet Carrier CAPI Queries" = "フリートキャリアCAPIクエリを有効にする"; + /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "フライトログとCMDRステータスをEDSMへ送信する"; @@ -36,6 +48,12 @@ /* companion.py: Failed to get Access Token from Frontier Auth service; In files: companion.py:508; */ "Error: unable to get token" = "エラー: トークンが取得できません"; +/* EDMarketConnector.py: EDMC Critical Error Notification; */ +"EDMC encountered a critical error, and cannot recover. EDMC is shutting down for its own protection!" = "EDMCは致命的な問題に遭遇し、復旧できません。EDMCは自身の保護のためシャットダウンします!"; + +/* EDMarketConnector.py: EDMC Critical Error Details; */ +"Here's what EDMC Detected:\r\n\r\n{ERR}\r\n\r\nDo you want to file a Bug Report on GitHub?" = "EDMCが検知した問題は以下の通りです:\n\n{ERR}\n\nGitHubにバグレポートを作成しますか?"; + /* companion.py: Frontier CAPI returned 418, meaning down for maintenance; In files: companion.py:844; */ "Frontier CAPI down for maintenance" = "Frontier CAPIがメンテナンスのため停止中"; @@ -87,6 +105,9 @@ /* EDMarketConnector.py: Help > Check for Updates...; In files: EDMarketConnector.py:930; EDMarketConnector.py:958; */ "Check for Updates..." = "更新の確認..."; +/* EDMarketConnector.py: Help > Open System Profiler; In files: EDMarketConnector.py:888; */ +"Open System Profiler" = "システムプロファイラーを開く"; + /* EDMarketConnector.py: File > Save Raw Data...; In files: EDMarketConnector.py:931; EDMarketConnector.py:948; */ "Save Raw Data..." = "生データの保存..."; @@ -117,6 +138,15 @@ /* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:962; ttkHyperlinkLabel.py:53; */ "Copy" = "コピー"; +/* myNotebook.py: Label for 'Cut' as in 'Cut and Paste'; */ +"Cut" = "切り取り"; + +/* myNotebook.py: Label for 'Paste' as in 'Copy and Paste'; */ +"Paste" = "貼り付け"; + +/* myNotebook.py: Label for 'Select All'; */ +"Select All" = "全てを選択"; + /* EDMarketConnector.py: CAPI auth aborted because of killswitch; EDMarketConnector.py: CAPI auth query aborted because of killswitch; In files: EDMarketConnector.py:973; EDMarketConnector.py:1067; */ "CAPI auth disabled by killswitch" = "CAPI認証はkillswitchによって無効にされています"; @@ -774,3 +804,21 @@ /* update.py: Update Available Text; In files: update.py:229; */ "{NEWVER} is available" = "{NEWVER} があります"; +/* prefs.py: Stable Version of EDMC; */ +"Stable" = "安定版"; + +/* prefs.py: Select the Update Track (Beta, Stable); */ +"Update Track" = "アップデートトラック"; + +/* EDMarketConnector.py: Inform the user the Update Track has changed; */ +"Update Track Changed to {TRACK}" = "アップデートトラックを {TRACK} に変更します"; + + +/* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ +"Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "アップデートトラックをベータから安定版に変更しました。今後ベータ版のアップデートを受け取ることはありません。次の安定版がリリースされるまでこのベータ版をご利用いただけます。\n\n手動で最新の安定版に戻すことができます。そのためには、最新の安定版を手動でダウンロードしてインストールする必要があります。大きな変更を伴うメジャーバージョン間のダウングレードの場合、バグが発生したり、完全に壊れたりする可能性があることに注意してください。\n\nGitHubを開いて最新リリースをダウンロードしますか?"; + +/* myNotebook.py: Can't Paste Images or Files in Text; */ +"Cannot paste non-text content." = "テキストではない内容は貼り付けできません"; + +/* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ +"Open in {URL}" = "{URL} で開く"; diff --git a/L10n/pt-BR.strings b/L10n/pt-BR.strings index 791a582a..b145dd04 100644 --- a/L10n/pt-BR.strings +++ b/L10n/pt-BR.strings @@ -379,7 +379,7 @@ "Market data in Trade Dangerous format file" = "Dados de mercado no arquivo de formato Trade Dangerous"; /* prefs.py: Settings > Output option; In files: prefs.py:360; */ -"Ship loadout" = "Modulação da nave"; +"Ship loadout" = "Build da Nave"; /* prefs.py: Settings > Output option; In files: prefs.py:370; */ "Automatically update on docking" = "Atualizar automaticamente na docagem"; diff --git a/L10n/pt-PT.strings b/L10n/pt-PT.strings index 2d240917..1851155c 100644 --- a/L10n/pt-PT.strings +++ b/L10n/pt-PT.strings @@ -1,3 +1,15 @@ +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Erro nas Informações do Sistema"; + +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: Dados de Transportador de Frota incompletos"; + +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: Sem dados de Transportador de Frota"; + +/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ +"Enable Fleet Carrier CAPI Queries" = "Ligar Consultas CAPI de Transportador de Frota"; + /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Enviar registos de voo e estado de CMDR para o EDSM"; @@ -126,6 +138,15 @@ /* EDMarketConnector.py: Label for 'Copy' as in 'Copy and Paste'; ttkHyperlinkLabel.py: Label for 'Copy' as in 'Copy and Paste'; In files: EDMarketConnector.py:962; ttkHyperlinkLabel.py:53; */ "Copy" = "Copiar"; +/* myNotebook.py: Label for 'Cut' as in 'Cut and Paste'; */ +"Cut" = "Cortar"; + +/* myNotebook.py: Label for 'Paste' as in 'Copy and Paste'; */ +"Paste" = "Colar"; + +/* myNotebook.py: Label for 'Select All'; */ +"Select All" = "Selecionar Tudo"; + /* EDMarketConnector.py: CAPI auth aborted because of killswitch; EDMarketConnector.py: CAPI auth query aborted because of killswitch; In files: EDMarketConnector.py:973; EDMarketConnector.py:1067; */ "CAPI auth disabled by killswitch" = "Autenticação CAPI desligada por botão"; @@ -783,6 +804,19 @@ /* update.py: Update Available Text; In files: update.py:229; */ "{NEWVER} is available" = "{NEWVER} disponível."; +/* prefs.py: Stable Version of EDMC; */ +"Stable" = "Estável"; + +/* prefs.py: Select the Update Track (Beta, Stable); */ +"Update Track" = "Caminho de Actualizações"; + +/* EDMarketConnector.py: Inform the user the Update Track has changed; */ +"Update Track Changed to {TRACK}" = "Caminho de Actualizações alterado para {TRACK}"; + + +/* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ +"Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Caminho de Actualizações alterado de Estável para Beta. Deixará de receber actualizações Beta. Irá continuar na versão Beta até à próxima actualização Estável.\n\nPode, manualmente, reverter para a última versão Estável. Para isso, faça download e instale a última versão Estável manualmente. Note que o retrocesso para versões anteriores com diferenças significativas poderá introduzir bugs ou danificar a instalação.\n\nDeseja abrir o GitHub para fazer download da última versão?"; + /* myNotebook.py: Can't Paste Images or Files in Text; */ "Cannot paste non-text content." = "Só é possível colar conteúdo texto."; diff --git a/config/__init__.py b/config/__init__.py index 4fe565e4..a8545ea9 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -52,7 +52,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.11.2' +_static_appversion = '5.11.3-beta0' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' diff --git a/plugins/eddn.py b/plugins/eddn.py index 2b223036..0ece6327 100644 --- a/plugins/eddn.py +++ b/plugins/eddn.py @@ -958,13 +958,13 @@ class EDDN: self.send_message(cmdr, { '$schemaRef': f'https://eddn.edcd.io/schemas/outfitting/2{"/test" if is_beta else ""}', 'message': { - ('timestamp', entry['timestamp']), - ('systemName', entry['StarSystem']), - ('stationName', entry['StationName']), - ('marketId', entry['MarketID']), - ('horizons', horizons), - ('modules', outfitting), - ('odyssey', entry['odyssey']) + 'timestamp': entry['timestamp'], + 'systemName': entry['StarSystem'], + 'stationName': entry['StationName'], + 'marketId': entry['MarketID'], + 'horizons': horizons, + 'modules': outfitting, + 'odyssey': entry['odyssey'] }, }) @@ -992,13 +992,13 @@ class EDDN: self.send_message(cmdr, { '$schemaRef': f'https://eddn.edcd.io/schemas/shipyard/2{"/test" if is_beta else ""}', 'message': { - ('timestamp', entry['timestamp']), - ('systemName', entry['StarSystem']), - ('stationName', entry['StationName']), - ('marketId', entry['MarketID']), - ('horizons', horizons), - ('ships', shipyard), - ('odyssey', entry['odyssey']) + 'timestamp': entry['timestamp'], + 'systemName': entry['StarSystem'], + 'stationName': entry['StationName'], + 'marketId': entry['MarketID'], + 'horizons': horizons, + 'ships': shipyard, + 'odyssey': entry['odyssey'] }, }) From 449958e5dba094a5548071492f90bd4c6df9ac52 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 17:29:26 +0000 Subject: [PATCH 373/425] Bump types-requests from 2.31.0.20240311 to 2.32.0.20240712 Bumps [types-requests](https://github.com/python/typeshed) from 2.31.0.20240311 to 2.32.0.20240712. - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-requests dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 49d21562..cc0df807 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -21,7 +21,7 @@ flake8-use-fstring==1.4 mypy==1.10.0 pep8-naming==0.14.1 safety==3.2.0 -types-requests==2.31.0.20240311 +types-requests==2.32.0.20240712 types-pkg-resources==0.1.3 # Code formatting tools From 9cb894adc5001a5280e856fb5c17d798dfbecb78 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 17:29:32 +0000 Subject: [PATCH 374/425] Bump autopep8 from 2.2.0 to 2.3.1 Bumps [autopep8](https://github.com/hhatto/autopep8) from 2.2.0 to 2.3.1. - [Release notes](https://github.com/hhatto/autopep8/releases) - [Commits](https://github.com/hhatto/autopep8/compare/v2.2.0...v2.3.1) --- updated-dependencies: - dependency-name: autopep8 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 49d21562..ac2b060c 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -25,7 +25,7 @@ types-requests==2.31.0.20240311 types-pkg-resources==0.1.3 # Code formatting tools -autopep8==2.2.0 +autopep8==2.3.1 # Git pre-commit checking pre-commit==3.7.1 From e01a7552380418c8e3a8016e7fcd74d1c0a09764 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 17:29:39 +0000 Subject: [PATCH 375/425] Bump coverage[toml] from 7.5.0 to 7.6.0 Bumps [coverage[toml]](https://github.com/nedbat/coveragepy) from 7.5.0 to 7.6.0. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/7.5.0...7.6.0) --- updated-dependencies: - dependency-name: coverage[toml] dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 49d21562..eb088b65 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -40,7 +40,7 @@ py2exe==0.13.0.1; sys_platform == 'win32' # Testing pytest==8.2.2 pytest-cov==5.0.0 # Pytest code coverage support -coverage[toml]==7.5.0 # pytest-cov dep. This is here to ensure that it includes TOML support for pyproject.toml configs +coverage[toml]==7.6.0 # pytest-cov dep. This is here to ensure that it includes TOML support for pyproject.toml configs coverage-conditional-plugin==0.9.0 From 3831ad8a94c95d43f4ea77ecc2a380d92e17a52d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 17:29:45 +0000 Subject: [PATCH 376/425] Bump setuptools from 70.0.0 to 72.1.0 Bumps [setuptools](https://github.com/pypa/setuptools) from 70.0.0 to 72.1.0. - [Release notes](https://github.com/pypa/setuptools/releases) - [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst) - [Commits](https://github.com/pypa/setuptools/compare/v70.0.0...v72.1.0) --- updated-dependencies: - dependency-name: setuptools dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 49d21562..0bbb7638 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -5,7 +5,7 @@ wheel # We can't rely on just picking this up from either the base (not venv), # or venv-init-time version. Specify here so that dependabot will prod us # about new versions. -setuptools==70.0.0 +setuptools==72.1.0 # Static analysis tools flake8==7.1.0 From f44fa2489fa8c75d27b38a3923cf82e4a89e13c5 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 4 Aug 2024 21:52:30 -0400 Subject: [PATCH 377/425] [RELEASE] 5.11.3 --- ChangeLog.md | 3 +-- config/__init__.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index e8f4d1c7..9fa00bfb 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,9 +6,8 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- -Release 5.11.3-beta0 +Release 5.11.3 === -This is a release candidate for 5.11.3. This release fixes a bug where an incomplete hand-over from ordereddict to dict types would cause a sender failure. diff --git a/config/__init__.py b/config/__init__.py index a8545ea9..51305c8d 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -52,7 +52,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.11.3-beta0' +_static_appversion = '5.11.3' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From ef24641431b1015238cbcccda3f7a0da06faab8a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Aug 2024 03:08:05 +0000 Subject: [PATCH 378/425] Bump safety from 3.2.0 to 3.2.5 Bumps [safety](https://github.com/pyupio/safety) from 3.2.0 to 3.2.5. - [Release notes](https://github.com/pyupio/safety/releases) - [Changelog](https://github.com/pyupio/safety/blob/main/CHANGELOG.md) - [Commits](https://github.com/pyupio/safety/compare/3.2.0...3.2.5) --- updated-dependencies: - dependency-name: safety dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 87acbfc3..22d8a507 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -20,7 +20,7 @@ flake8-use-fstring==1.4 mypy==1.10.0 pep8-naming==0.14.1 -safety==3.2.0 +safety==3.2.5 types-requests==2.32.0.20240712 types-pkg-resources==0.1.3 From 00989a840790b1d448d02668cd7a9d4aad5a7877 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 12 Aug 2024 23:13:56 -0400 Subject: [PATCH 379/425] [Minor] Add Type8 Ship List Armor details to come Soon(tm) --- edmc_data.py | 1 + 1 file changed, 1 insertion(+) diff --git a/edmc_data.py b/edmc_data.py index e8c9518b..7286305e 100644 --- a/edmc_data.py +++ b/edmc_data.py @@ -507,6 +507,7 @@ ship_name_map = { 'testbuggy': 'Scarab', 'type6': 'Type-6 Transporter', 'type7': 'Type-7 Transporter', + 'type8': 'Type-8 Transporter', 'type9': 'Type-9 Heavy', 'type9_military': 'Type-10 Defender', 'typex': 'Alliance Chieftain', From e917d40f4fc0df43b8ed1d91afa9ce56961242e8 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 13 Aug 2024 16:50:06 -0400 Subject: [PATCH 380/425] [Fix] Revert bad clarification in fe8818d --- EDMarketConnector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EDMarketConnector.py b/EDMarketConnector.py index 0c347b36..80a958e1 100755 --- a/EDMarketConnector.py +++ b/EDMarketConnector.py @@ -456,7 +456,7 @@ class AppWindow: else: image_path = config.respath_path / 'io.edcd.EDMarketConnector.png' - self.w.tk.call('wm', 'iconphoto', self.w, '-default', image=tk.PhotoImage(file=image_path)) + self.w.tk.call('wm', 'iconphoto', self.w, '-default', tk.PhotoImage(file=image_path)) # TODO: Export to files and merge from them in future ? self.theme_icon = tk.PhotoImage( From b8a2f48333fc748c6582c34ae3911fc04cadf0ef Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Fri, 23 Aug 2024 15:42:28 -0400 Subject: [PATCH 381/425] [1057] Fix License Records --- build.py | 7 + docs/Licenses/WiXtoolset/LICENSE.TXT | 28 -- docs/Licenses/python-packages/pillow/LICENSE | 30 ++ docs/Licenses/python-packages/psutil/LICENSE | 29 ++ .../simplesystray/legalcode.txt | 396 ++++++++++++++++++ requirements-dev.txt | 2 +- 6 files changed, 463 insertions(+), 29 deletions(-) delete mode 100644 docs/Licenses/WiXtoolset/LICENSE.TXT create mode 100644 docs/Licenses/python-packages/pillow/LICENSE create mode 100644 docs/Licenses/python-packages/psutil/LICENSE create mode 100644 docs/Licenses/python-packages/simplesystray/legalcode.txt diff --git a/build.py b/build.py index 224de56f..9094ac66 100644 --- a/build.py +++ b/build.py @@ -65,6 +65,7 @@ def generate_data_files( """Create the required datafiles to build.""" l10n_dir = "L10n" fdevids_dir = pathlib.Path("FDevIDs") + license_dir = pathlib.Path("docs/Licenses") data_files = [ ( "", @@ -98,6 +99,12 @@ def generate_data_files( ), ("plugins", plugins), ] + # Add all files recursively from license directories + for root, dirs, files in os.walk(license_dir): + file_list = [os.path.join(root, f) for f in files] + dest_dir = os.path.join(license_dir, os.path.relpath(root, license_dir)) + data_files.append((dest_dir, file_list)) + return data_files diff --git a/docs/Licenses/WiXtoolset/LICENSE.TXT b/docs/Licenses/WiXtoolset/LICENSE.TXT deleted file mode 100644 index d4d316ef..00000000 --- a/docs/Licenses/WiXtoolset/LICENSE.TXT +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) .NET Foundation and contributors. -This software is released under the Microsoft Reciprocal License (MS-RL) (the "License"); you may not use the software except in compliance with the License. - -The text of the Microsoft Reciprocal License (MS-RL) can be found online at: - http://opensource.org/licenses/ms-rl - - -Microsoft Reciprocal License (MS-RL) - -This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. - -1. Definitions - The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. - A "contribution" is the original software, or any additions or changes to the software. - A "contributor" is any person that distributes its contribution under this license. - "Licensed patents" are a contributor's patent claims that read directly on its contribution. - -2. Grant of Rights - (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. - (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. - -3. Conditions and Limitations - (A) Reciprocal Grants- For any file you distribute that contains code from the software (in source code or binary format), you must provide recipients the source code to that file along with a copy of this license, which license will govern that file. You may license other files that are entirely your own work and do not contain code from the software under any terms you choose. - (B) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. - (C) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. - (D) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. - (E) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. - (F) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. diff --git a/docs/Licenses/python-packages/pillow/LICENSE b/docs/Licenses/python-packages/pillow/LICENSE new file mode 100644 index 00000000..7990a6e5 --- /dev/null +++ b/docs/Licenses/python-packages/pillow/LICENSE @@ -0,0 +1,30 @@ +The Python Imaging Library (PIL) is + + Copyright © 1997-2011 by Secret Labs AB + Copyright © 1995-2011 by Fredrik Lundh and contributors + +Pillow is the friendly PIL fork. It is + + Copyright © 2010-2024 by Jeffrey A. Clark and contributors + +Like PIL, Pillow is licensed under the open source HPND License: + +By obtaining, using, and/or copying this software and/or its associated +documentation, you agree that you have read, understood, and will comply +with the following terms and conditions: + +Permission to use, copy, modify and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appears in all copies, and that +both that copyright notice and this permission notice appear in supporting +documentation, and that the name of Secret Labs AB or the author not be +used in advertising or publicity pertaining to distribution of the software +without specific, written prior permission. + +SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS +SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR ANY SPECIAL, +INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. diff --git a/docs/Licenses/python-packages/psutil/LICENSE b/docs/Licenses/python-packages/psutil/LICENSE new file mode 100644 index 00000000..cff5eb74 --- /dev/null +++ b/docs/Licenses/python-packages/psutil/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2009, Jay Loden, Dave Daeschler, Giampaolo Rodola +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the psutil authors nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/docs/Licenses/python-packages/simplesystray/legalcode.txt b/docs/Licenses/python-packages/simplesystray/legalcode.txt new file mode 100644 index 00000000..da6ab6cc --- /dev/null +++ b/docs/Licenses/python-packages/simplesystray/legalcode.txt @@ -0,0 +1,396 @@ +Attribution 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution 4.0 International Public License ("Public License"). To the +extent this Public License may be interpreted as a contract, You are +granted the Licensed Rights in consideration of Your acceptance of +these terms and conditions, and the Licensor grants You such rights in +consideration of benefits the Licensor receives from making the +Licensed Material available under these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + d. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + g. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + i. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's + License You apply must not prevent recipients of the Adapted + Material from complying with this Public License. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. + diff --git a/requirements-dev.txt b/requirements-dev.txt index 1ba43524..31017681 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -5,7 +5,7 @@ wheel # We can't rely on just picking this up from either the base (not venv), # or venv-init-time version. Specify here so that dependabot will prod us # about new versions. -setuptools==72.1.0 +setuptools==70.0.0 # Static analysis tools flake8==7.1.0 From d250fa3014b6516dfb87d18c53fd035533838541 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 25 Aug 2024 23:17:56 -0400 Subject: [PATCH 382/425] [Minor] Update Translations --- L10n/cs.strings | 3 --- L10n/de.strings | 32 ++++++++++---------------------- L10n/es.strings | 3 --- L10n/fi.strings | 3 --- L10n/fr.strings | 3 --- L10n/hu.strings | 3 --- L10n/it.strings | 32 ++++++++++---------------------- L10n/ja.strings | 32 ++++++++++---------------------- L10n/ko.strings | 3 --- L10n/lv.strings | 3 --- L10n/nl.strings | 15 +++------------ L10n/pl.strings | 12 ------------ L10n/pt-BR.strings | 32 ++++++++++---------------------- L10n/pt-PT.strings | 32 ++++++++++---------------------- L10n/ru.strings | 32 ++++++++++---------------------- L10n/sr-Latn-BA.strings | 32 ++++++++++---------------------- L10n/sr-Latn.strings | 13 +------------ L10n/sv-SE.strings | 3 --- L10n/tr.strings | 32 ++++++++++---------------------- L10n/uk.strings | 32 ++++++++++---------------------- L10n/zh-Hans.strings | 12 ------------ 21 files changed, 94 insertions(+), 270 deletions(-) diff --git a/L10n/cs.strings b/L10n/cs.strings index d432effe..f4d1bcea 100644 --- a/L10n/cs.strings +++ b/L10n/cs.strings @@ -346,9 +346,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Složka pluginů"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Otevřít"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Tip: Plugin můžete vypnout přidáním{CR}'{EXT}' do názvu jeho složky"; diff --git a/L10n/de.strings b/L10n/de.strings index a5da5f81..313f893e 100644 --- a/L10n/de.strings +++ b/L10n/de.strings @@ -1,15 +1,3 @@ -/* prefs.py: Catch & Record Profiler Errors; */ -"Error in System Profiler" = "Fehler im System Profiler"; - -/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleet Carrier data incomplete" = "CAPI: Carrier-Daten unvollständig"; - -/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No Fleet Carrier data returned" = "CAPI: Keine Carrier-Daten erhalten"; - -/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleet Carrier CAPI Queries" = "Carrier-CAPI-Anfragen aktivieren"; - /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Sende Fluglog und CMDR-Status an EDSM"; @@ -189,12 +177,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "CAPI Fleet Carrier durch Killswitch deaktiviert"; +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: Keine Carrier-Daten erhalten"; -/* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No fleetcarrier data returned" = "CAPI: Keine Fleet Carrier-Daten erhalten"; +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: Carrier-Daten unvollständig"; -/* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleetcarrier data incomplete" = "CAPI: Fleet Carrier-Daten unvollständig"; /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Keine Kommandanten-Daten erhalten"; @@ -399,9 +387,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "CAPI-Einstellungen"; - /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleetcarrier CAPI Queries" = "Fleet Carrier CAPI-Anfragen aktivieren"; +"Enable Fleet Carrier CAPI Queries" = "Carrier-CAPI-Anfragen aktivieren"; + /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Hotkey"; @@ -480,9 +468,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Plugin-Ordner"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Öffnen"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Tipp: Du kannst ein Plugin deaktivieren, indem{CR}du '{EXT}' zu seinem Ordnernamen hinzufügst"; @@ -501,6 +486,9 @@ /* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:977; */ "Disabled Plugins" = "Deaktivierte Plugins"; +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Fehler im System Profiler"; + /* stats.py: Cmdr stats; In files: stats.py:58; */ "Balance" = "Kontostand"; @@ -792,7 +780,6 @@ /* EDMarketConnector.py: Inform the user the Update Track has changed; */ "Update Track Changed to {TRACK}" = "Update-Kanal geändert auf {TRACK}"; - /* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ "Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Update-Kanal von Beta auf Stabil geändert. Du wirst keine weiteren Beta-Updates erhalten. Du wirst bis zum nächsten stabilen Release auf der aktuellen Beta-Version bleiben.\n\nDu kannst manuell zur aktuellen stabilen Version zurückkehren. Um dies zu tun, musst du die aktuelle stabile Version manuell herunterladen und installieren. Beachte, dass dies Fehler verursachen oder gar nicht funktionieren könnte, wenn du von einem größeren Versionssprung mit signifikanten Änderungen downgradest.\n\nMöchtest du GitHub öffnen, um den neuesten Release herunterzuladen?"; @@ -801,3 +788,4 @@ /* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ "Open in {URL}" = "Öffnen in {URL}"; + diff --git a/L10n/es.strings b/L10n/es.strings index 96bb83bc..9cdfa007 100644 --- a/L10n/es.strings +++ b/L10n/es.strings @@ -361,9 +361,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Carpeta de Plugins"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Abrir"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Puedes desactivar un plugin añadiendo{CR}'{EXT}' al nombre de su carpeta"; diff --git a/L10n/fi.strings b/L10n/fi.strings index 198a0eba..2893f2d2 100644 --- a/L10n/fi.strings +++ b/L10n/fi.strings @@ -319,9 +319,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Lisäosien hakemistosijainti"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Avaa"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Vihje: Voit poistaa lisäosan käytöstä{CR}lisäämällä '{EXT}' sen hakemistonimeen"; diff --git a/L10n/fr.strings b/L10n/fr.strings index d8e54ca0..3922bbbc 100644 --- a/L10n/fr.strings +++ b/L10n/fr.strings @@ -291,9 +291,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Répertoire des plugins"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Ouvrir"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Astuce : Vous pouvez désactiver un plugin en{CR}ajoutant '{EXT}' à son nom de répertoire"; diff --git a/L10n/hu.strings b/L10n/hu.strings index cf141709..face43a5 100644 --- a/L10n/hu.strings +++ b/L10n/hu.strings @@ -235,9 +235,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Plugin mappa"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Nyisd ki"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Tipp:a pluginokat kikapcsolhatod hozzà{CR}adsz a mappa nevében egy '{EXT}'"; diff --git a/L10n/it.strings b/L10n/it.strings index 3431df2e..0d0cb39e 100644 --- a/L10n/it.strings +++ b/L10n/it.strings @@ -1,15 +1,3 @@ -/* prefs.py: Catch & Record Profiler Errors; */ -"Error in System Profiler" = "Errore nel Sistema di Profilazione"; - -/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleet Carrier data incomplete" = "CAPI: dati della Fleet Carrier incompleti"; - -/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No Fleet Carrier data returned" = "CAPI: nessun dato della Fleet Carrier ottenuto"; - -/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleet Carrier CAPI Queries" = "Abilita le query CAPI per le Fleet Carrier"; - /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Invia il registro di volo e lo stato del CMDR a EDSM"; @@ -189,12 +177,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "Fleetcarrier CAPI disabilitato dal killswitch"; +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: nessun dato della Fleet Carrier ottenuto"; -/* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No fleetcarrier data returned" = "CAPI: Nessun dato della fleetcarrier ricevuto"; +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: dati della Fleet Carrier incompleti"; -/* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleetcarrier data incomplete" = "CAPI: Dati della Fleetcarrier incompleti"; /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Nessun dato sul commandante"; @@ -399,9 +387,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "Impostazioni CAPI"; - /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleetcarrier CAPI Queries" = "Abilita le query CAPI della Fleetcarrier"; +"Enable Fleet Carrier CAPI Queries" = "Abilita le query CAPI per le Fleet Carrier"; + /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Hotkey"; @@ -480,9 +468,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Cartella dei plugins"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Sfoglia"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Suggerimento: è possibile disabilitare un plugin {CR}aggiungendo '{EXT}' nel nome della sua cartella"; @@ -501,6 +486,9 @@ /* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:977; */ "Disabled Plugins" = "Plugin disabilitati"; +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Errore nel Sistema di Profilazione"; + /* stats.py: Cmdr stats; In files: stats.py:58; */ "Balance" = "Saldo"; @@ -813,7 +801,6 @@ /* EDMarketConnector.py: Inform the user the Update Track has changed; */ "Update Track Changed to {TRACK}" = "Canale di aggiornamento cambiato in {TRACK}"; - /* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ "Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Il canale di aggiornamento è cambiato da Beta a Stabile. Non riceverai più aggiornamenti Beta. Rimarrai sulla tua attuale versione Beta fino alla prossima release Stabile.\n\nPuoi tornare manualmente all'ultima versione Stabile. Per farlo, devi scaricare e installare manualmente l'ultima versione Stabile. Nota che questo potrebbe introdurre bug o causare malfunzionamenti se si esegue il downgrade tra versioni principali con cambiamenti significativi.\n\nVuoi aprire GitHub per scaricare l'ultima release?"; @@ -822,3 +809,4 @@ /* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ "Open in {URL}" = "Apri {URL}"; + diff --git a/L10n/ja.strings b/L10n/ja.strings index b0e2cb68..9ef405c1 100644 --- a/L10n/ja.strings +++ b/L10n/ja.strings @@ -1,15 +1,3 @@ -/* prefs.py: Catch & Record Profiler Errors; */ -"Error in System Profiler" = "システムプロファイラーでエラー"; - -/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleet Carrier data incomplete" = "CAPI: フリートキャリアデータが不完全"; - -/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No Fleet Carrier data returned" = "CAPI: フリートキャリアデータの返信なし"; - -/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleet Carrier CAPI Queries" = "フリートキャリアCAPIクエリを有効にする"; - /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "フライトログとCMDRステータスをEDSMへ送信する"; @@ -189,12 +177,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "CAPIフリートキャリアはkillswitchによって無効にされています"; +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: フリートキャリアデータの返信なし"; -/* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No fleetcarrier data returned" = "CAPI: フリートキャリアデータの返信なし"; +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: フリートキャリアデータが不完全"; -/* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleetcarrier data incomplete" = "CAPI: フリートキャリアデータが不完全"; /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: コマンダーのデータが返ってきませんでした"; @@ -399,9 +387,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "CAPI設定"; - /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleetcarrier CAPI Queries" = "フリートキャリアCAPIクエリを有効にする"; +"Enable Fleet Carrier CAPI Queries" = "フリートキャリアCAPIクエリを有効にする"; + /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "ホットキー"; @@ -480,9 +468,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "プラグインフォルダ"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "開く"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "ヒント: プラグインを無効にするには{CR}フォルダ名に '{EXT}' を追加してください"; @@ -501,6 +486,9 @@ /* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:977; */ "Disabled Plugins" = "無効なプラグイン"; +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "システムプロファイラーでエラー"; + /* stats.py: Cmdr stats; In files: stats.py:58; */ "Balance" = "口座残高"; @@ -813,7 +801,6 @@ /* EDMarketConnector.py: Inform the user the Update Track has changed; */ "Update Track Changed to {TRACK}" = "アップデートトラックを {TRACK} に変更します"; - /* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ "Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "アップデートトラックをベータから安定版に変更しました。今後ベータ版のアップデートを受け取ることはありません。次の安定版がリリースされるまでこのベータ版をご利用いただけます。\n\n手動で最新の安定版に戻すことができます。そのためには、最新の安定版を手動でダウンロードしてインストールする必要があります。大きな変更を伴うメジャーバージョン間のダウングレードの場合、バグが発生したり、完全に壊れたりする可能性があることに注意してください。\n\nGitHubを開いて最新リリースをダウンロードしますか?"; @@ -822,3 +809,4 @@ /* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ "Open in {URL}" = "{URL} で開く"; + diff --git a/L10n/ko.strings b/L10n/ko.strings index 58e43ba4..63f4c613 100644 --- a/L10n/ko.strings +++ b/L10n/ko.strings @@ -388,9 +388,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "플러그인 폴더"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "열기"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "팁: 플러그인을 비활성화하려면{CR} '{EXT}'를 폴더명 뒤에 추가하면 됨"; diff --git a/L10n/lv.strings b/L10n/lv.strings index a99cfd44..c89e16de 100644 --- a/L10n/lv.strings +++ b/L10n/lv.strings @@ -220,9 +220,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Spraudņu mape"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Atvērt"; - /* prefs.py: Label on list of enabled plugins; In files: prefs.py:934; */ "Enabled Plugins" = "Iespējoti Spraudņi"; diff --git a/L10n/nl.strings b/L10n/nl.strings index 3586645a..677236bc 100644 --- a/L10n/nl.strings +++ b/L10n/nl.strings @@ -1,6 +1,3 @@ -/* prefs.py: Catch & Record Profiler Errors; */ -"Error in System Profiler" = "Fout in systeemprofiler"; - /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Stuur logboek en CMDR-status naar EDSM"; @@ -162,12 +159,6 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "CAPI fleetcarrier uitgeschakeld door killswitch"; - -/* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No fleetcarrier data returned" = "CAPI: geen fleet carrier data verkregen"; - -/* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleetcarrier data incomplete" = "CAPI: data fleet carrier incompleet"; /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: geen commander data verkregen"; @@ -375,9 +366,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Plugins map"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Openen"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Tip: Je kan een plugin deactiveren door '{EXT}'{CR}toe te voegen aan de map naam"; @@ -393,6 +381,9 @@ /* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:977; */ "Disabled Plugins" = "Gedeactiveerde plugins"; +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Fout in systeemprofiler"; + /* stats.py: Cmdr stats; In files: stats.py:58; */ "Balance" = "Balans"; diff --git a/L10n/pl.strings b/L10n/pl.strings index 4b88c8b4..dd092529 100644 --- a/L10n/pl.strings +++ b/L10n/pl.strings @@ -159,12 +159,6 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "Fleetcarier CAPI wyłączony \"kill switchem\""; - -/* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No fleetcarrier data returned" = "CAPI: Nie zwrócono danych dotyczących lotniskowca"; - -/* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleetcarrier data incomplete" = "CAPI: Niekompletne dane lotniskowca"; /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Nie zwrócono danych dowódcy"; @@ -369,9 +363,6 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "Ustawienia CAPI"; - -/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleetcarrier CAPI Queries" = "Włącz zapytania CAPI dla lotniskowca"; /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Skr. Klaw."; @@ -450,9 +441,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Folder pluginów"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Otwórz"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Wskazówka: Możesz wyłączyć pluginy{CR}dodając '{EXT}' do nazwy folderu"; diff --git a/L10n/pt-BR.strings b/L10n/pt-BR.strings index b145dd04..4a2aff31 100644 --- a/L10n/pt-BR.strings +++ b/L10n/pt-BR.strings @@ -1,15 +1,3 @@ -/* prefs.py: Catch & Record Profiler Errors; */ -"Error in System Profiler" = "Erro no Perfil de Sistema"; - -/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleet Carrier data incomplete" = "CAPI: Dados de porta-frotas incompletos"; - -/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No Fleet Carrier data returned" = "CAPI: Nenhum dado de porta-frotas retornado"; - -/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleet Carrier CAPI Queries" = "Ativar requisições CAPI para porta-frotas"; - /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Enviar registro de voo e status do CMDT para o EDSM"; @@ -189,12 +177,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "CAPI para porta-frotas desativado pelo botão de interrupção."; +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: Nenhum dado de porta-frotas retornado"; -/* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No fleetcarrier data returned" = "CAPI: Nenhum dado de porta-fortas retornado"; +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: Dados de porta-frotas incompletos"; -/* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleetcarrier data incomplete" = "CAPI: Dados de porta-frota incompletos"; /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Nenhum dado de comandante retornado"; @@ -399,9 +387,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "Configurações de CAPI"; - /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleetcarrier CAPI Queries" = "Ativar requisições CAPI para porta-frotas"; +"Enable Fleet Carrier CAPI Queries" = "Ativar requisições CAPI para porta-frotas"; + /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Tecla de atalho"; @@ -480,9 +468,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Pasta dos plugins"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Abrir"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Dica: Você pode desativar um plugin{CR}adicionando '{EXT}' ao nome da pasta"; @@ -501,6 +486,9 @@ /* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:977; */ "Disabled Plugins" = "Plugins desabilitados"; +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Erro no Perfil de Sistema"; + /* stats.py: Cmdr stats; In files: stats.py:58; */ "Balance" = "Balanço"; @@ -813,7 +801,6 @@ /* EDMarketConnector.py: Inform the user the Update Track has changed; */ "Update Track Changed to {TRACK}" = "Caminho de Atualizações modificado para {TRACK}"; - /* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ "Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Caminho de atualizações modificado de Estável para Beta. Você não receberá mais atualizações Beta. Você seguirá na versão Beta atual até a próxima atualização Estável.\n\nVocê pode reverter manualmente para a última versão Estável. Para fazer isso, faça download e instale a última versão Estável manualmente. Fique atento: isto pode introduzir bugs ou quebrar completamente a aplicação caso você o retorno volte para uma versão principal com mudanças significativas.\n\nGostaria de abrir o GitHub para fazer download da última versão?"; @@ -822,3 +809,4 @@ /* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ "Open in {URL}" = "Abrir em {URL}"; + diff --git a/L10n/pt-PT.strings b/L10n/pt-PT.strings index 1851155c..c9834977 100644 --- a/L10n/pt-PT.strings +++ b/L10n/pt-PT.strings @@ -1,15 +1,3 @@ -/* prefs.py: Catch & Record Profiler Errors; */ -"Error in System Profiler" = "Erro nas Informações do Sistema"; - -/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleet Carrier data incomplete" = "CAPI: Dados de Transportador de Frota incompletos"; - -/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No Fleet Carrier data returned" = "CAPI: Sem dados de Transportador de Frota"; - -/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleet Carrier CAPI Queries" = "Ligar Consultas CAPI de Transportador de Frota"; - /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Enviar registos de voo e estado de CMDR para o EDSM"; @@ -189,12 +177,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "Consulta à CAPI de Transportador de Frota cancelada por botão"; +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: Sem dados de Transportador de Frota"; -/* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No fleetcarrier data returned" = "CAPI: Sem dados de Transportador de Frota"; +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: Dados de Transportador de Frota incompletos"; -/* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleetcarrier data incomplete" = "CAPI: Dados de Transportador de Frota incompletos"; /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Dados do Comandante não recebidos"; @@ -399,9 +387,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "Definições CAPI"; - /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleetcarrier CAPI Queries" = "Ligar Consultas CAPI de Transportador de Frota"; +"Enable Fleet Carrier CAPI Queries" = "Ligar Consultas CAPI de Transportador de Frota"; + /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Tecla Rápida"; @@ -480,9 +468,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Pasta dos Plugins"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Abrir"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Dica: Pode desactivar um plugin{CR}ao adicionar '{EXT}' ao nome da sua pasta"; @@ -501,6 +486,9 @@ /* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:977; */ "Disabled Plugins" = "Plugins Desactivados"; +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Erro nas Informações do Sistema"; + /* stats.py: Cmdr stats; In files: stats.py:58; */ "Balance" = "Balanço"; @@ -813,7 +801,6 @@ /* EDMarketConnector.py: Inform the user the Update Track has changed; */ "Update Track Changed to {TRACK}" = "Caminho de Actualizações alterado para {TRACK}"; - /* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ "Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Caminho de Actualizações alterado de Estável para Beta. Deixará de receber actualizações Beta. Irá continuar na versão Beta até à próxima actualização Estável.\n\nPode, manualmente, reverter para a última versão Estável. Para isso, faça download e instale a última versão Estável manualmente. Note que o retrocesso para versões anteriores com diferenças significativas poderá introduzir bugs ou danificar a instalação.\n\nDeseja abrir o GitHub para fazer download da última versão?"; @@ -822,3 +809,4 @@ /* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ "Open in {URL}" = "Abrir em {URL}"; + diff --git a/L10n/ru.strings b/L10n/ru.strings index e90f3e3b..7cbdf9d4 100644 --- a/L10n/ru.strings +++ b/L10n/ru.strings @@ -1,15 +1,3 @@ -/* prefs.py: Catch & Record Profiler Errors; */ -"Error in System Profiler" = "Ошибка в системном профайлере"; - -/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleet Carrier data incomplete" = "CAPI: Неполная информация о корабле-носителе"; - -/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No Fleet Carrier data returned" = "CAPI: Нет данных о корабле-носителе"; - -/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleet Carrier CAPI Queries" = "Включить запросы к CAPI о корабле-носителе"; - /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Отправить журнал полетов и статус командира в EDSM"; @@ -189,12 +177,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "CAPI кораблей-носителей отключен с помощью killswitch"; +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: Нет данных о корабле-носителе"; -/* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No fleetcarrier data returned" = "CAPI: Нет данных о флотоносце"; +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: Неполная информация о корабле-носителе"; -/* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleetcarrier data incomplete" = "CAPI: Неполная информация о флотоносце"; /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Нет данных пилота"; @@ -399,9 +387,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "Настройки CAPI"; - /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleetcarrier CAPI Queries" = "Включить запросы к CAPI о флотоносце"; +"Enable Fleet Carrier CAPI Queries" = "Включить запросы к CAPI о корабле-носителе"; + /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Горячая клавиша"; @@ -480,9 +468,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Папка плагинов"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Открыть"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Подсказка: Отключить конкретный плагин можно {CR} добавив '{EXT}' к названию папки"; @@ -501,6 +486,9 @@ /* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:977; */ "Disabled Plugins" = "Отключенные плагины"; +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Ошибка в системном профайлере"; + /* stats.py: Cmdr stats; In files: stats.py:58; */ "Balance" = "Баланс"; @@ -813,7 +801,6 @@ /* EDMarketConnector.py: Inform the user the Update Track has changed; */ "Update Track Changed to {TRACK}" = "Обновить маршрут. Изменено на {TRACK}"; - /* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ "Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Изменен путь обновления с \"Бета\" на \"Стабильный\". Вы больше не будете получать обновления \"Бета\". Вы останетесь на текущей бета-версии до следующего стабильного релиза.\n\nВы можете вручную вернуться к последней версии \"Стабильная\". Для этого необходимо загрузить и установить последнюю версию \"Стабильная\" вручную. Обратите внимание, что при переходе между основными версиями со значительными изменениями могут возникнуть ошибки или полная поломка.\n\nХотите открыть GitHub, чтобы загрузить последнюю версию?"; @@ -822,3 +809,4 @@ /* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ "Open in {URL}" = "Открыть через {URL}"; + diff --git a/L10n/sr-Latn-BA.strings b/L10n/sr-Latn-BA.strings index 85b7e5aa..46cc4632 100644 --- a/L10n/sr-Latn-BA.strings +++ b/L10n/sr-Latn-BA.strings @@ -1,15 +1,3 @@ -/* prefs.py: Catch & Record Profiler Errors; */ -"Error in System Profiler" = "Greša u System Profileru"; - -/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleet Carrier data incomplete" = "CAPI: Fleet Carrier podaci nisu kompletni"; - -/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No Fleet Carrier data returned" = "CAPI: Fleet Carrier podaci nisu dobijeni"; - -/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleet Carrier CAPI Queries" = "Omogući Fleet Carrier CAPI upite"; - /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Pošalji log leta i CMDR status na EDSM"; @@ -189,12 +177,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "CAPI fleetcarrier onemogućen putem sistemskog prekidača"; +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: Fleet Carrier podaci nisu dobijeni"; -/* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No fleetcarrier data returned" = "CAPI: Fleetcarrier podaci nisu dobijeni"; +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: Fleet Carrier podaci nisu kompletni"; -/* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleetcarrier data incomplete" = "CAPI: Fleetcarrier podaci nisu potpuni"; /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Nema podataka o komandantu"; @@ -399,9 +387,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "CAPI Podešavanja"; - /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleetcarrier CAPI Queries" = "Omogući Fleetcarrier CAPI Upite"; +"Enable Fleet Carrier CAPI Queries" = "Omogući Fleet Carrier CAPI upite"; + /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Prečica"; @@ -480,9 +468,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Folder za dodatke (plugins)"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Otvori"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Savjet: Možete da deaktivirate dodatak (plugin){CR}dodavanjem '{EXT}' na ime njegovog foldera"; @@ -501,6 +486,9 @@ /* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:977; */ "Disabled Plugins" = "Deaktivirani dodaci (plugins)"; +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Greša u System Profileru"; + /* stats.py: Cmdr stats; In files: stats.py:58; */ "Balance" = "Balans"; @@ -813,7 +801,6 @@ /* EDMarketConnector.py: Inform the user the Update Track has changed; */ "Update Track Changed to {TRACK}" = "Kanal za osvježavanje je promijenjen u {TRACK}"; - /* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ "Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Kanal za osvježavanje je promijenjen iz Beta u Stabilni. Više nećete primati Beta osvježavanja. Ostaćete na trenutnoj Beta verziji do sljedeće Stabilne verzije.\n\nMožete se ručno vratiti na posljednju Stabilnu verziju. Da biste to učinili morate da skinete i ručno instališete posljednju Stabilnu verziju. Ova procedura može da uvede nove bugove ili da potpuno onesposobi program ako prelazite između verzija sa mnogo značajnih promjena.\n\nDa li želite da otvorite GitHub stranicu za download posljednje verzije?"; @@ -822,3 +809,4 @@ /* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ "Open in {URL}" = "Otvori u {URL}"; + diff --git a/L10n/sr-Latn.strings b/L10n/sr-Latn.strings index 7aee7f41..6fb8b7db 100644 --- a/L10n/sr-Latn.strings +++ b/L10n/sr-Latn.strings @@ -168,12 +168,6 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "CAPI fleetcarrier deaktiviran preko sistemskog prekidača"; - -/* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No fleetcarrier data returned" = "CAPI: Podaci o fleetcarrier-u nisu dobijeni"; - -/* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleetcarrier data incomplete" = "CAPI: Podaci o fleetcarrier-u su nepotpuni"; /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Nema podataka o komandiru"; @@ -378,9 +372,6 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "CAPI Podešavanja"; - -/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleetcarrier CAPI Queries" = "Aktiviraj Fleetcarrier CAPIU Upite"; /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Skraćenica"; @@ -459,9 +450,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Folder za dodatke (plugins)"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Otvori"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Tip: Možete deaktivirati dodatak (plugin) dodavanjem{CR}'{EXT}' na ime njegovog foldera"; @@ -788,3 +776,4 @@ /* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ "Open in {URL}" = "Otvori na {URL}"; + diff --git a/L10n/sv-SE.strings b/L10n/sv-SE.strings index e0f63e0c..4bcce399 100644 --- a/L10n/sv-SE.strings +++ b/L10n/sv-SE.strings @@ -241,9 +241,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Mapp för plugins"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Öppna"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Tips: du kan avaktivera en plugin genom{CR}att lägga till '{EXT}' på slutet av mappens namn"; diff --git a/L10n/tr.strings b/L10n/tr.strings index d99bb562..80a4375c 100644 --- a/L10n/tr.strings +++ b/L10n/tr.strings @@ -1,15 +1,3 @@ -/* prefs.py: Catch & Record Profiler Errors; */ -"Error in System Profiler" = "Sistem Profilcisinde Hata oluştu"; - -/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleet Carrier data incomplete" = "CAPI: Filo Taşıyıcısı verileri eksik"; - -/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No Fleet Carrier data returned" = "CAPI: Filo Taşıyıcısı verisi bulunamadı"; - -/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleet Carrier CAPI Queries" = "Filo Taşıyıcı CAPI Sorgularını Etkinleştir"; - /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Uçuş günlüğünü ve CMDR durumunu EDSM'e gönder"; @@ -189,12 +177,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "CAPI filo taşıyıcısı killswitch tarafından devre dışı bırakıldı"; +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: Filo Taşıyıcısı verisi bulunamadı"; -/* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No fleetcarrier data returned" = "CAPI: Filo taşıyıcı verisi gelmedi."; +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: Filo Taşıyıcısı verileri eksik"; -/* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleetcarrier data incomplete" = "CAPI: Filo taşıyıcı verileri eksik"; /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Cmdr verisi döndürülmedi"; @@ -399,9 +387,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "CAPI ayarları"; - /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleetcarrier CAPI Queries" = "Filo Taşıyıcı CAPI sorgulamalarını etkinleştir"; +"Enable Fleet Carrier CAPI Queries" = "Filo Taşıyıcı CAPI Sorgularını Etkinleştir"; + /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Kısayoltuşu"; @@ -480,9 +468,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Eklentiler klasörü"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Aç"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "İpucu: Bir eklentiyi, klasör adına{CR}'{EXT}' ekleyerek devre dışı bırakabilirsiniz"; @@ -501,6 +486,9 @@ /* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:977; */ "Disabled Plugins" = "Devre Dışı Eklentiler"; +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Sistem Profilcisinde Hata oluştu"; + /* stats.py: Cmdr stats; In files: stats.py:58; */ "Balance" = "Bakiye"; @@ -813,7 +801,6 @@ /* EDMarketConnector.py: Inform the user the Update Track has changed; */ "Update Track Changed to {TRACK}" = "Aktif Takip {TRACK} olarak güncellendi."; - /* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ "Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Güncelleme takibi Beta'dan Kararlı olarak değiştirildi. Artık Beta güncellemelerini almayacaksınız. Bir sonraki Kararlı sürüme kadar mevcut Beta sürümünüzde kalacaksınız.\n\nEn son Stabil sürüme manuel olarak geri dönebilirsiniz. Bunu yapmak için en son Stabil sürümünü manuel olarak indirip yüklemeniz gerekir. Önemli değişiklikler içeren ana sürümler arasında sürüm düşürme durumunda bunun hatalara yol açabileceğini veya tamamen bozulabileceğini unutmayın.\n\nEn son sürümü indirmek için GitHub'u açmak istiyor musunuz?"; @@ -822,3 +809,4 @@ /* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ "Open in {URL}" = "Şurada aç {URL}"; + diff --git a/L10n/uk.strings b/L10n/uk.strings index 3729f7c0..12de0788 100644 --- a/L10n/uk.strings +++ b/L10n/uk.strings @@ -1,15 +1,3 @@ -/* prefs.py: Catch & Record Profiler Errors; */ -"Error in System Profiler" = "Помилка у Профайлері Систем"; - -/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleet Carrier data incomplete" = "CAPI: Дані корабля-носія неповні"; - -/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No Fleet Carrier data returned" = "CAPI: Немає даних корабля-носія"; - -/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleet Carrier CAPI Queries" = "Ввімкнути запити CAPI кораблів-носіїв"; - /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Відправляти дані бортового журналу до EDSM"; @@ -189,12 +177,12 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "Запит CAPI корабля-носія скасований функцією аварійного відключення"; +/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ +"CAPI: No Fleet Carrier data returned" = "CAPI: Немає даних корабля-носія"; -/* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No fleetcarrier data returned" = "CAPI: Немає даних корабля-носія"; +/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ +"CAPI: Fleet Carrier data incomplete" = "CAPI: Дані корабля-носія неповні"; -/* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleetcarrier data incomplete" = "CAPI: Дані корабля-носія неповні"; /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI: Не отримано данних пілота"; @@ -399,9 +387,9 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "Налаштування CAPI"; - /* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleetcarrier CAPI Queries" = "Ввімкнути запити CAPI кораблів-носіїв"; +"Enable Fleet Carrier CAPI Queries" = "Ввімкнути запити CAPI кораблів-носіїв"; + /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "Гаряча клавіша"; @@ -480,9 +468,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Сховище плагінів"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "Відкрити"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Підказка: Ви можете відключити плагін через {CR} додання '{EXT}' до назви папки"; @@ -501,6 +486,9 @@ /* prefs.py: Lable on list of user-disabled plugins; In files: prefs.py:977; */ "Disabled Plugins" = "Вимкнені плагіни"; +/* prefs.py: Catch & Record Profiler Errors; */ +"Error in System Profiler" = "Помилка у Профайлері Систем"; + /* stats.py: Cmdr stats; In files: stats.py:58; */ "Balance" = "Баланс"; @@ -813,7 +801,6 @@ /* EDMarketConnector.py: Inform the user the Update Track has changed; */ "Update Track Changed to {TRACK}" = "Шлях оновлень змінено на {TRACK}"; - /* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ "Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Шлях оновлень змінено з \"Бета\" на \"Стабільний\". Ви більше не будете отримувати бета оновлень. Ви залишитеся на версії бета до наступного стабільного релізу.\n\nВи можете вручну вернутися до останньої стабільної версії. Щоб це зробити, вам необхідно завантажити останню стабільну версію вручну. Зауважте що заниження версії між релізами з багатьма змінами може спричинити помилки чи повністю унеможливити роботу програми.\n\nБажаєте відкрити сторінку GitHub для завантаження останнього релізу?"; @@ -822,3 +809,4 @@ /* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ "Open in {URL}" = "Відкрити у {URL}"; + diff --git a/L10n/zh-Hans.strings b/L10n/zh-Hans.strings index 0b13a5a1..0aee0b8b 100644 --- a/L10n/zh-Hans.strings +++ b/L10n/zh-Hans.strings @@ -151,12 +151,6 @@ /* EDMarketConnector.py: CAPI fleetcarrier query aborted because of killswitch; In files: EDMarketConnector.py:1157; */ "CAPI fleetcarrier disabled by killswitch" = "CAPI 舰队母舰 (fleet carrier) 被 killswitch 禁用"; - -/* EDMarketConnector.py: No data was returned for the fleetcarrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No fleetcarrier data returned" = "CAPI:无舰队母舰 (fleet carrier) 数据"; - -/* EDMarketConnector.py: We didn't have the fleetcarrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleetcarrier data incomplete" = "CAPI:舰队母舰 (fleet carrier) 数据不完整"; /* EDMarketConnector.py: No data was returned for the commander from the Frontier CAPI; In files: EDMarketConnector.py:1242; */ "CAPI: No commander data returned" = "CAPI:没有指挥官数据"; @@ -343,9 +337,6 @@ /* prefs.py: Settings > Configuration - Label for CAPI section; In files: prefs.py:469; */ "CAPI Settings" = "CAPI 设置"; - -/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleetcarrier CAPI Queries" = "开启舰队母舰 (fleet carrier) CAPI 访问"; /* prefs.py: Hotkey/Shortcut settings prompt on Windows; In files: prefs.py:492; */ "Hotkey" = "快捷键"; @@ -424,9 +415,6 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "插件文件夹"; -/* prefs.py: Label on button used to open a filesystem folder; In files: prefs.py:915; */ -"Open" = "打开"; - /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "提示:想要禁用某一项插件,{CR}你可以添加 {EXT} 到其文件夹名称中"; From c0071bbb6ed921d4a32f1369eca9db904a1629ca Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 26 Aug 2024 19:05:08 -0400 Subject: [PATCH 383/425] [RELEASE] 5.12.0-beta1 --- ChangeLog.md | 33 +++++++++++++++++++++++++++++++++ config/__init__.py | 2 +- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 07768262..d752695c 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,6 +6,39 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- +Release 5.12.0-beta1 +=== + +This public beta is designed to allow for volunteer testing of coming updates and allow plugin +developers to prepare for upcoming code changes. **BUGS ARE EXPECTED** in this build, as under-the-hood +inline code changes have been made in this update which may have unintended consequences. + +**Changes and Enhancements** +* Added the ability to export a ship's loadout to Inara SLEF notation +* Added the ability for EDMC to restart itself if required after settings changes +* Added the ability to change the custom plugins directory to allow for multiple plugin profiles +* Added Basic Type 8 Support +* Updated the default logging directory from $TEMPDIR or %TEMP% and to the current app data directory +* Updated a number of direct win32API calls to use proper prototyped library calls +* Updated a number of translations +* Updated a number of dependencies +* Updated included and bundled licenses to comply with dependency requirements +* Updated the game_running check to be more efficient on Windows to reduce program hangs +* Minor logic enhancements +* Retired most usages of os.path in favor of the preferred PathLib + +**Bug Fixes** +* Fixed a bug that would result in Horizons and Odyssey flags not being passed to EDDN + +**Plugin Developers** +* nb.Entry is deprecated, and is slated for removal in 6.0 or later. Please migrate to nb.EntryMenu +* nb.ColoredButton is deprecated, and is slated for removal in 6.0 or later. Please migrate to tk.Button +* Calling internal translations with `_()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to importing `translations` and calling `translations.translate` or `translations.tl` directly +* `Translations` as the translate system singleton is deprecated, and is slated for removal in 6.0 or later. Please migrate to the `translations` singleton +* `help_open_log_folder()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to open_folder() +* `update_feed` is deprecated, and is slated for removal in 6.0 or later. Please migrate to `get_update_feed()`. + + Release 5.11.3 === diff --git a/config/__init__.py b/config/__init__.py index e171e0d3..65f469be 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -52,7 +52,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.11.3' +_static_appversion = '5.12.0-beta1' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From 5183c7933fcf8f7c9384ec834fd706e1bad375aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Sep 2024 17:35:07 +0000 Subject: [PATCH 384/425] Bump pillow from 10.3.0 to 10.4.0 Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.3.0 to 10.4.0. - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/10.3.0...10.4.0) --- updated-dependencies: - dependency-name: pillow dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 7aac47d1..e3296d4a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ requests==2.32.3 -pillow==10.3.0 +pillow==10.4.0 watchdog==4.0.1 simplesystray==0.1.0; sys_platform == 'win32' semantic-version==2.10.0 From a108ab302894fac1578de2a67fee16416be191b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Sep 2024 17:35:17 +0000 Subject: [PATCH 385/425] Bump pytest from 8.2.2 to 8.3.2 Bumps [pytest](https://github.com/pytest-dev/pytest) from 8.2.2 to 8.3.2. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/8.2.2...8.3.2) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 31017681..290e4ab4 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -38,7 +38,7 @@ mistune==3.0.2 py2exe==0.13.0.1; sys_platform == 'win32' # Testing -pytest==8.2.2 +pytest==8.3.2 pytest-cov==5.0.0 # Pytest code coverage support coverage[toml]==7.6.0 # pytest-cov dep. This is here to ensure that it includes TOML support for pyproject.toml configs coverage-conditional-plugin==0.9.0 From 6e845761d3703340e0733023e49b5371cced6f6f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Sep 2024 17:35:20 +0000 Subject: [PATCH 386/425] Bump pre-commit from 3.7.1 to 3.8.0 Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 3.7.1 to 3.8.0. - [Release notes](https://github.com/pre-commit/pre-commit/releases) - [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md) - [Commits](https://github.com/pre-commit/pre-commit/compare/v3.7.1...v3.8.0) --- updated-dependencies: - dependency-name: pre-commit dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 31017681..bc1e7a2c 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -28,7 +28,7 @@ types-pkg-resources==0.1.3 autopep8==2.3.1 # Git pre-commit checking -pre-commit==3.7.1 +pre-commit==3.8.0 # HTML changelogs mistune==3.0.2 From c5371bc57c11b63b5f04e741950ecf26b2b33b7e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Sep 2024 23:05:34 +0000 Subject: [PATCH 387/425] Bump coverage[toml] from 7.6.0 to 7.6.1 Bumps [coverage[toml]](https://github.com/nedbat/coveragepy) from 7.6.0 to 7.6.1. - [Release notes](https://github.com/nedbat/coveragepy/releases) - [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst) - [Commits](https://github.com/nedbat/coveragepy/compare/7.6.0...7.6.1) --- updated-dependencies: - dependency-name: coverage[toml] dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 40e7c024..a56b70e3 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -40,7 +40,7 @@ py2exe==0.13.0.1; sys_platform == 'win32' # Testing pytest==8.3.2 pytest-cov==5.0.0 # Pytest code coverage support -coverage[toml]==7.6.0 # pytest-cov dep. This is here to ensure that it includes TOML support for pyproject.toml configs +coverage[toml]==7.6.1 # pytest-cov dep. This is here to ensure that it includes TOML support for pyproject.toml configs coverage-conditional-plugin==0.9.0 From b9dced7da321d2e416284ff3486ed2c0986d74bd Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 24 Sep 2024 19:20:15 -0400 Subject: [PATCH 388/425] [Lang] Update Translations --- L10n/it.strings | 26 ++++++++++++++------------ L10n/ja.strings | 13 +------------ L10n/pt-BR.strings | 14 ++++++++++++++ L10n/pt-PT.strings | 12 ------------ L10n/ru.strings | 14 ++++++++++++++ L10n/uk.strings | 14 ++++++++++++++ 6 files changed, 57 insertions(+), 36 deletions(-) diff --git a/L10n/it.strings b/L10n/it.strings index 91b507f0..4d948883 100644 --- a/L10n/it.strings +++ b/L10n/it.strings @@ -1,15 +1,3 @@ -/* prefs.py: Catch & Record Profiler Errors; */ -"Error in System Profiler" = "Errore nel Sistema di Profilazione"; - -/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleet Carrier data incomplete" = "CAPI: dati della Fleet Carrier incompleti"; - -/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No Fleet Carrier data returned" = "CAPI: nessun dato della Fleet Carrier ottenuto"; - -/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleet Carrier CAPI Queries" = "Abilita le query CAPI per le Fleet Carrier"; - /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Invia il registro di volo e lo stato del CMDR a EDSM"; @@ -480,6 +468,12 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Cartella dei plugins"; +/* prefs.py: Label on button used to open the Plugin Folder; */ +"Open Plugins Folder" = "Apri la cartella dei plugin"; + +/* prefs.py: Selecting the Location of the Plugin Directory on the Filesystem; */ +"Plugin Directory Location" = "Posizione della Cartella del Plugin"; + /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Suggerimento: è possibile disabilitare un plugin {CR}aggiungendo '{EXT}' nel nome della sua cartella"; @@ -816,9 +810,17 @@ /* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ "Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Il canale di aggiornamento è cambiato da Beta a Stabile. Non riceverai più aggiornamenti Beta. Rimarrai sulla tua attuale versione Beta fino alla prossima release Stabile.\n\nPuoi tornare manualmente all'ultima versione Stabile. Per farlo, devi scaricare e installare manualmente l'ultima versione Stabile. Nota che questo potrebbe introdurre bug o causare malfunzionamenti se si esegue il downgrade tra versioni principali con cambiamenti significativi.\n\nVuoi aprire GitHub per scaricare l'ultima release?"; +/* EDMarketConnector.py: Title of Notification Popup for EDMC Restart; */ +"Restart Required" = "Riavvio necessario"; + +/* EDMarketConnector.py: Text of Notification Popup for EDMC Restart; */ +"A restart of EDMC is required. EDMC will now restart." = "È necessario riavviare EDMC. EDMC si riavvierà ora."; + /* myNotebook.py: Can't Paste Images or Files in Text; */ "Cannot paste non-text content." = "Non si può incollare contenuto non testuale"; /* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ "Open in {URL}" = "Apri {URL}"; +/* ttkHyperlinkLabel.py: Copy the Inara SLEF Format of the active ship to the clipboard; */ +"Copy Inara SLEF" = "Copia Inara SLEF"; diff --git a/L10n/ja.strings b/L10n/ja.strings index 22ff4158..9ef405c1 100644 --- a/L10n/ja.strings +++ b/L10n/ja.strings @@ -1,15 +1,3 @@ -/* prefs.py: Catch & Record Profiler Errors; */ -"Error in System Profiler" = "システムプロファイラーでエラー"; - -/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleet Carrier data incomplete" = "CAPI: フリートキャリアデータが不完全"; - -/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No Fleet Carrier data returned" = "CAPI: フリートキャリアデータの返信なし"; - -/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleet Carrier CAPI Queries" = "フリートキャリアCAPIクエリを有効にする"; - /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "フライトログとCMDRステータスをEDSMへ送信する"; @@ -821,3 +809,4 @@ /* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ "Open in {URL}" = "{URL} で開く"; + diff --git a/L10n/pt-BR.strings b/L10n/pt-BR.strings index 4a2aff31..187a0627 100644 --- a/L10n/pt-BR.strings +++ b/L10n/pt-BR.strings @@ -468,6 +468,12 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Pasta dos plugins"; +/* prefs.py: Label on button used to open the Plugin Folder; */ +"Open Plugins Folder" = "Abrir pasta dos plugins"; + +/* prefs.py: Selecting the Location of the Plugin Directory on the Filesystem; */ +"Plugin Directory Location" = "Localização da pasta dos plugins"; + /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Dica: Você pode desativar um plugin{CR}adicionando '{EXT}' ao nome da pasta"; @@ -804,9 +810,17 @@ /* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ "Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Caminho de atualizações modificado de Estável para Beta. Você não receberá mais atualizações Beta. Você seguirá na versão Beta atual até a próxima atualização Estável.\n\nVocê pode reverter manualmente para a última versão Estável. Para fazer isso, faça download e instale a última versão Estável manualmente. Fique atento: isto pode introduzir bugs ou quebrar completamente a aplicação caso você o retorno volte para uma versão principal com mudanças significativas.\n\nGostaria de abrir o GitHub para fazer download da última versão?"; +/* EDMarketConnector.py: Title of Notification Popup for EDMC Restart; */ +"Restart Required" = "Reinicialização necessária"; + +/* EDMarketConnector.py: Text of Notification Popup for EDMC Restart; */ +"A restart of EDMC is required. EDMC will now restart." = "É necessário reinicializar o EDMC. Isso será realizado agora."; + /* myNotebook.py: Can't Paste Images or Files in Text; */ "Cannot paste non-text content." = "Só é possível colar texto."; /* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ "Open in {URL}" = "Abrir em {URL}"; +/* ttkHyperlinkLabel.py: Copy the Inara SLEF Format of the active ship to the clipboard; */ +"Copy Inara SLEF" = "Copiar formato SLEF"; diff --git a/L10n/pt-PT.strings b/L10n/pt-PT.strings index 976bfeaf..c9834977 100644 --- a/L10n/pt-PT.strings +++ b/L10n/pt-PT.strings @@ -1,15 +1,3 @@ -/* prefs.py: Catch & Record Profiler Errors; */ -"Error in System Profiler" = "Erro nas Informações do Sistema"; - -/* EDMarketConnector.py: We didn't have the Fleet Carrier callsign when we should have; In files: EDMarketConnector.py:1223; */ -"CAPI: Fleet Carrier data incomplete" = "CAPI: Dados de Transportador de Frota incompletos"; - -/* EDMarketConnector.py: No data was returned for the Fleet Carrier from the Frontier CAPI; In files: EDMarketConnector.py:1219; */ -"CAPI: No Fleet Carrier data returned" = "CAPI: Sem dados de Transportador de Frota"; - -/* prefs.py: Configuration - Enable or disable the Fleet Carrier CAPI calls; In files: prefs.py:475; */ -"Enable Fleet Carrier CAPI Queries" = "Ligar Consultas CAPI de Transportador de Frota"; - /* edsm.py:Settings>EDSM - Label on checkbox for 'send data'; In files: edsm.py:316; */ "Send flight log and CMDR status to EDSM" = "Enviar registos de voo e estado de CMDR para o EDSM"; diff --git a/L10n/ru.strings b/L10n/ru.strings index 7cbdf9d4..d302d445 100644 --- a/L10n/ru.strings +++ b/L10n/ru.strings @@ -468,6 +468,12 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Папка плагинов"; +/* prefs.py: Label on button used to open the Plugin Folder; */ +"Open Plugins Folder" = "Открыть папку плагинов"; + +/* prefs.py: Selecting the Location of the Plugin Directory on the Filesystem; */ +"Plugin Directory Location" = "Месторасположение директории плагинов"; + /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Подсказка: Отключить конкретный плагин можно {CR} добавив '{EXT}' к названию папки"; @@ -804,9 +810,17 @@ /* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ "Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Изменен путь обновления с \"Бета\" на \"Стабильный\". Вы больше не будете получать обновления \"Бета\". Вы останетесь на текущей бета-версии до следующего стабильного релиза.\n\nВы можете вручную вернуться к последней версии \"Стабильная\". Для этого необходимо загрузить и установить последнюю версию \"Стабильная\" вручную. Обратите внимание, что при переходе между основными версиями со значительными изменениями могут возникнуть ошибки или полная поломка.\n\nХотите открыть GitHub, чтобы загрузить последнюю версию?"; +/* EDMarketConnector.py: Title of Notification Popup for EDMC Restart; */ +"Restart Required" = "Требуется перезапуск"; + +/* EDMarketConnector.py: Text of Notification Popup for EDMC Restart; */ +"A restart of EDMC is required. EDMC will now restart." = "Требуется перезапуск EDMC. EDMC сейчас перезапустится."; + /* myNotebook.py: Can't Paste Images or Files in Text; */ "Cannot paste non-text content." = "Невозможно добавить нетекстовое содержимое."; /* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ "Open in {URL}" = "Открыть через {URL}"; +/* ttkHyperlinkLabel.py: Copy the Inara SLEF Format of the active ship to the clipboard; */ +"Copy Inara SLEF" = "Скопировать данные SLEF Inara"; diff --git a/L10n/uk.strings b/L10n/uk.strings index 12de0788..23febdef 100644 --- a/L10n/uk.strings +++ b/L10n/uk.strings @@ -468,6 +468,12 @@ /* prefs.py: Label for location of third-party plugins folder; In files: prefs.py:908; */ "Plugins folder" = "Сховище плагінів"; +/* prefs.py: Label on button used to open the Plugin Folder; */ +"Open Plugins Folder" = "Відкрити папку плагінів"; + +/* prefs.py: Selecting the Location of the Plugin Directory on the Filesystem; */ +"Plugin Directory Location" = "Місцезнаходження папки плагінів"; + /* prefs.py: Tip/label about how to disable plugins; In files: prefs.py:923; */ "Tip: You can disable a plugin by{CR}adding '{EXT}' to its folder name" = "Підказка: Ви можете відключити плагін через {CR} додання '{EXT}' до назви папки"; @@ -804,9 +810,17 @@ /* EDMarketConnector.py: Inform User of Beta -> Stable Transition Risks; */ "Update track changed to Stable from Beta. You will no longer receive Beta updates. You will stay on your current Beta version until the next Stable release.\r\n\r\nYou can manually revert to the latest Stable version. To do so, you must download and install the latest Stable version manually. Note that this may introduce bugs or break completely if downgrading between major versions with significant changes.\r\n\r\nDo you want to open GitHub to download the latest release?" = "Шлях оновлень змінено з \"Бета\" на \"Стабільний\". Ви більше не будете отримувати бета оновлень. Ви залишитеся на версії бета до наступного стабільного релізу.\n\nВи можете вручну вернутися до останньої стабільної версії. Щоб це зробити, вам необхідно завантажити останню стабільну версію вручну. Зауважте що заниження версії між релізами з багатьма змінами може спричинити помилки чи повністю унеможливити роботу програми.\n\nБажаєте відкрити сторінку GitHub для завантаження останнього релізу?"; +/* EDMarketConnector.py: Title of Notification Popup for EDMC Restart; */ +"Restart Required" = "Необхідно перезавантаження"; + +/* EDMarketConnector.py: Text of Notification Popup for EDMC Restart; */ +"A restart of EDMC is required. EDMC will now restart." = "Необхідно перезавантажити EDMC. EDMC буде зараз перезавантажений."; + /* myNotebook.py: Can't Paste Images or Files in Text; */ "Cannot paste non-text content." = "Неможливо вставити нетекстовий вміст буфера обміну."; /* ttkHyperlinkLabel.py: Open Element In Selected Provider; */ "Open in {URL}" = "Відкрити у {URL}"; +/* ttkHyperlinkLabel.py: Copy the Inara SLEF Format of the active ship to the clipboard; */ +"Copy Inara SLEF" = "Копіювати Inara SLEF"; From cc6e2003457edf211a77022ffc9d4d08943a0692 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 24 Sep 2024 19:28:42 -0400 Subject: [PATCH 389/425] [Release] 5.13.0 --- ChangeLog.md | 10 ++++++---- config/__init__.py | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index d752695c..7d289839 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,12 +6,14 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- -Release 5.12.0-beta1 +Release 5.12.0 === -This public beta is designed to allow for volunteer testing of coming updates and allow plugin -developers to prepare for upcoming code changes. **BUGS ARE EXPECTED** in this build, as under-the-hood -inline code changes have been made in this update which may have unintended consequences. +This release brings a number of performance enhancements and functionality updates requested by the community to EDMC. +Notably, integration with Inara's SLEF notation, custom pugin directories, streamlined logging locations, and +performance enhancements are included. + +This release also fixes a few administrative issues regarding licenses to ensure compliance with included libraries. **Changes and Enhancements** * Added the ability to export a ship's loadout to Inara SLEF notation diff --git a/config/__init__.py b/config/__init__.py index 65f469be..ec5a345c 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -52,7 +52,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.12.0-beta1' +_static_appversion = '5.12.0' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From 7f47c19d1bb230dfc78cb21364bb29c5022fc77e Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 24 Sep 2024 19:54:22 -0400 Subject: [PATCH 390/425] [Minor] Spelling is Hard --- ChangeLog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 7d289839..5ff403ae 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -10,7 +10,7 @@ Release 5.12.0 === This release brings a number of performance enhancements and functionality updates requested by the community to EDMC. -Notably, integration with Inara's SLEF notation, custom pugin directories, streamlined logging locations, and +Notably, integration with Inara's SLEF notation, custom plugin directories, streamlined logging locations, and performance enhancements are included. This release also fixes a few administrative issues regarding licenses to ensure compliance with included libraries. From 348ad1d75fcdd15bdcfaba8f75681fc7e87f6c8e Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 29 Sep 2024 11:03:33 -0400 Subject: [PATCH 391/425] [#2297] Temporary Fix for max() arg empty --- EDMC.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/EDMC.py b/EDMC.py index ce0db95b..743bda5d 100755 --- a/EDMC.py +++ b/EDMC.py @@ -228,9 +228,9 @@ def main(): # noqa: C901, CCR001 # Get state from latest Journal file logger.debug('Getting state from latest journal file') try: - monitor.currentdir = Path(config.get_str('journaldir', default=config.default_journal_dir)) + monitor.currentdir = config.get_str('journaldir', default=config.default_journal_dir) if not monitor.currentdir: - monitor.currentdir = config.default_journal_dir_path + monitor.currentdir = config.default_journal_dir logger.debug(f'logdir = "{monitor.currentdir}"') logfile = monitor.journal_newest_filename(monitor.currentdir) From 5ad7fcfa622fc4d93f453df7d858c3db4fb194b4 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 30 Sep 2024 18:42:09 -0400 Subject: [PATCH 392/425] [2303] Attempt Reversion --- EDMC.py | 7 ++----- EDMCSystemProfiler.py | 17 ++++++++--------- monitor.py | 36 ++++++++++++++++++------------------ prefs.py | 10 +++++----- 4 files changed, 33 insertions(+), 37 deletions(-) diff --git a/EDMC.py b/EDMC.py index 743bda5d..6b72c7d1 100755 --- a/EDMC.py +++ b/EDMC.py @@ -14,7 +14,6 @@ import locale import os import queue import sys -from pathlib import Path from time import sleep, time from typing import TYPE_CHECKING, Any @@ -213,16 +212,14 @@ def main(): # noqa: C901, CCR001 # system, chances are its the current locale, and not utf-8. Otherwise if it was copied, its probably # utf8. Either way, try the system FIRST because reading something like cp1251 in UTF-8 results in garbage # but the reverse results in an exception. - json_file = Path(args.j).resolve() + json_file = os.path.abspath(args.j) try: with open(json_file) as file_handle: data = json.load(file_handle) except UnicodeDecodeError: with open(json_file, encoding='utf-8') as file_handle: data = json.load(file_handle) - file_path = Path(args.j) - modification_time = file_path.stat().st_mtime - config.set('querytime', int(modification_time)) + config.set('querytime', int(os.path.getmtime(args.j))) else: # Get state from latest Journal file diff --git a/EDMCSystemProfiler.py b/EDMCSystemProfiler.py index 77212db7..92502cc8 100644 --- a/EDMCSystemProfiler.py +++ b/EDMCSystemProfiler.py @@ -11,7 +11,7 @@ import locale import webbrowser import platform import sys -from os import chdir, environ +from os import chdir, environ, path import pathlib import logging from journal_lock import JournalLock @@ -19,10 +19,10 @@ from journal_lock import JournalLock if getattr(sys, "frozen", False): # Under py2exe sys.path[0] is the executable name if sys.platform == "win32": - chdir(pathlib.Path(sys.path[0]).parent) + chdir(path.dirname(sys.path[0])) # Allow executable to be invoked from any cwd - environ['TCL_LIBRARY'] = str(pathlib.Path(sys.path[0]).parent / 'lib' / 'tcl') - environ['TK_LIBRARY'] = str(pathlib.Path(sys.path[0]).parent / 'lib' / 'tk') + environ["TCL_LIBRARY"] = path.join(path.dirname(sys.path[0]), "lib", "tcl") + environ["TK_LIBRARY"] = path.join(path.dirname(sys.path[0]), "lib", "tk") else: # We still want to *try* to have CWD be where the main script is, even if @@ -44,12 +44,11 @@ def get_sys_report(config: config.AbstractConfig) -> str: plt = platform.uname() locale.setlocale(locale.LC_ALL, "") lcl = locale.getlocale() - monitor.currentdir = pathlib.Path(config.get_str( + monitor.currentdir = config.get_str( "journaldir", default=config.default_journal_dir - ) ) if not monitor.currentdir: - monitor.currentdir = config.default_journal_dir_path + monitor.currentdir = config.default_journal_dir try: logfile = monitor.journal_newest_filename(monitor.currentdir) if logfile is None: @@ -116,12 +115,12 @@ def main() -> None: root.withdraw() # Hide the window initially to calculate the dimensions try: icon_image = tk.PhotoImage( - file=cur_config.respath_path / "io.edcd.EDMarketConnector.png" + file=path.join(cur_config.respath_path, "io.edcd.EDMarketConnector.png") ) root.iconphoto(True, icon_image) except tk.TclError: - root.iconbitmap(cur_config.respath_path / "EDMarketConnector.ico") + root.iconbitmap(path.join(cur_config.respath_path, "EDMarketConnector.ico")) sys_report = get_sys_report(cur_config) diff --git a/monitor.py b/monitor.py index ce6b6075..e19d6ad5 100644 --- a/monitor.py +++ b/monitor.py @@ -8,7 +8,7 @@ See LICENSE file. from __future__ import annotations import json -from pathlib import Path +import pathlib import queue import re import sys @@ -16,6 +16,7 @@ import threading from calendar import timegm from collections import defaultdict from os import SEEK_END, SEEK_SET, listdir +from os.path import basename, expanduser, getctime, isdir, join from time import gmtime, localtime, mktime, sleep, strftime, strptime, time from typing import TYPE_CHECKING, Any, BinaryIO, MutableMapping import psutil @@ -67,7 +68,7 @@ class EDLogs(FileSystemEventHandler): # TODO(A_D): A bunch of these should be switched to default values (eg '' for strings) and no longer be Optional FileSystemEventHandler.__init__(self) # futureproofing - not need for current version of watchdog self.root: 'tkinter.Tk' = None # type: ignore # Don't use Optional[] - mypy thinks no methods - self.currentdir: Path | None = None # The actual logdir that we're monitoring + self.currentdir: str | None = None # The actual logdir that we're monitoring self.logfile: str | None = None self.observer: BaseObserver | None = None self.observed = None # a watchdog ObservedWatch, or None if polling @@ -190,9 +191,9 @@ class EDLogs(FileSystemEventHandler): if journal_dir == '' or journal_dir is None: journal_dir = config.default_journal_dir - logdir = Path(journal_dir).expanduser() + logdir = expanduser(journal_dir) - if not logdir or not Path.is_dir(logdir): + if not logdir or not isdir(logdir): logger.error(f'Journal Directory is invalid: "{logdir}"') self.stop() return False @@ -265,10 +266,9 @@ class EDLogs(FileSystemEventHandler): # Odyssey Update 11 has, e.g. Journal.2022-03-15T152503.01.log # Horizons Update 11 equivalent: Journal.220315152335.01.log # So we can no longer use a naive sort. - journals_dir_path = Path(journals_dir) - journal_files = (journals_dir_path / Path(x) for x in journal_files) - latest_file = max(journal_files, key=lambda f: Path(f).stat().st_ctime) - return str(latest_file) + journals_dir_path = pathlib.Path(journals_dir) + journal_files = (journals_dir_path / pathlib.Path(x) for x in journal_files) + return str(max(journal_files, key=getctime)) return None @@ -337,7 +337,7 @@ class EDLogs(FileSystemEventHandler): def on_created(self, event: 'FileSystemEvent') -> None: """Watchdog callback when, e.g. client (re)started.""" - if not event.is_directory and self._RE_LOGFILE.search(Path(event.src_path).name): + if not event.is_directory and self._RE_LOGFILE.search(basename(event.src_path)): self.logfile = event.src_path @@ -1076,7 +1076,7 @@ class EDLogs(FileSystemEventHandler): self.state['Cargo'] = defaultdict(int) # From 3.3 full Cargo event (after the first one) is written to a separate file if 'Inventory' not in entry: - with open(self.currentdir / 'Cargo.json', 'rb') as h: # type: ignore + with open(join(self.currentdir, 'Cargo.json'), 'rb') as h: # type: ignore entry = json.load(h) self.state['CargoJSON'] = entry @@ -1103,7 +1103,7 @@ class EDLogs(FileSystemEventHandler): # Always attempt loading of this, but if it fails we'll hope this was # a startup/boarding version and thus `entry` contains # the data anyway. - currentdir_path = Path(str(self.currentdir)) + currentdir_path = pathlib.Path(str(self.currentdir)) shiplocker_filename = currentdir_path / 'ShipLocker.json' shiplocker_max_attempts = 5 shiplocker_fail_sleep = 0.01 @@ -1172,7 +1172,7 @@ class EDLogs(FileSystemEventHandler): # TODO: v31 doc says this is`backpack.json` ... but Howard Chalkley # said it's `Backpack.json` - backpack_file = Path(str(self.currentdir)) / 'Backpack.json' + backpack_file = pathlib.Path(str(self.currentdir)) / 'Backpack.json' backpack_data = None if not backpack_file.exists(): @@ -1548,7 +1548,7 @@ class EDLogs(FileSystemEventHandler): entry = fcmaterials elif event_type == 'moduleinfo': - with open(self.currentdir / 'ModulesInfo.json', 'rb') as mf: # type: ignore + with open(join(self.currentdir, 'ModulesInfo.json'), 'rb') as mf: # type: ignore try: entry = json.load(mf) @@ -2259,14 +2259,14 @@ class EDLogs(FileSystemEventHandler): oldfiles = sorted((x for x in listdir(config.get_str('outdir')) if regexp.match(x))) if oldfiles: try: - with open(config.get_str('outdir') / Path(oldfiles[-1]), encoding='utf-8') as h: + with open(join(config.get_str('outdir'), oldfiles[-1]), encoding='utf-8') as h: if h.read() == string: return # same as last time - don't write except UnicodeError: logger.exception("UnicodeError reading old ship loadout with utf-8 encoding, trying without...") try: - with open(config.get_str('outdir') / Path(oldfiles[-1])) as h: + with open(join(config.get_str('outdir'), oldfiles[-1])) as h: if h.read() == string: return # same as last time - don't write @@ -2285,7 +2285,7 @@ class EDLogs(FileSystemEventHandler): # Write ts = strftime('%Y-%m-%dT%H.%M.%S', localtime(time())) - filename = config.get_str('outdir') / Path(f'{ship}.{ts}.txt') + filename = join(config.get_str('outdir'), f'{ship}.{ts}.txt') try: with open(filename, 'wt', encoding='utf-8') as h: @@ -2372,7 +2372,7 @@ class EDLogs(FileSystemEventHandler): try: - with open(self.currentdir / 'NavRoute.json') as f: + with open(join(self.currentdir, 'NavRoute.json')) as f: raw = f.read() except Exception as e: @@ -2398,7 +2398,7 @@ class EDLogs(FileSystemEventHandler): try: - with open(self.currentdir / 'FCMaterials.json') as f: + with open(join(self.currentdir, 'FCMaterials.json')) as f: raw = f.read() except Exception as e: diff --git a/prefs.py b/prefs.py index 29e1e7b1..95f29e7f 100644 --- a/prefs.py +++ b/prefs.py @@ -4,7 +4,7 @@ from __future__ import annotations import contextlib import logging -from os.path import expandvars +from os.path import expandvars, join, normpath from pathlib import Path import subprocess import sys @@ -1100,7 +1100,7 @@ class PreferencesDialog(tk.Toplevel): if sys.platform == 'win32': start = len(config.home.split('\\')) if pathvar.get().lower().startswith(config.home.lower()) else 0 display = [] - components = Path(pathvar.get()).resolve().parts + components = normpath(pathvar.get()).split('\\') buf = ctypes.create_unicode_buffer(MAX_PATH) pidsRes = ctypes.c_int() # noqa: N806 # Windows convention for i in range(start, len(components)): @@ -1253,7 +1253,7 @@ class PreferencesDialog(tk.Toplevel): config.set( 'outdir', - str(config.home_path / self.outdir.get()[2:]) if self.outdir.get().startswith('~') else self.outdir.get() + join(config.home_path, self.outdir.get()[2:]) if self.outdir.get().startswith('~') else self.outdir.get() ) logdir = self.logdir.get() @@ -1296,8 +1296,8 @@ class PreferencesDialog(tk.Toplevel): if self.plugdir.get() != config.get('plugin_dir'): config.set( 'plugin_dir', - str(Path(config.home_path, self.plugdir.get()[2:])) if self.plugdir.get().startswith('~') else - str(Path(self.plugdir.get())) + join(config.home_path, self.plugdir.get()[2:]) if self.plugdir.get().startswith( + '~') else self.plugdir.get() ) self.req_restart = True From 9db7e9b2dacff1dd757c49ff83de0c7d411e7371 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 30 Sep 2024 22:46:05 -0400 Subject: [PATCH 393/425] [PRE-RELEASE] 5.12.1-rc1 --- ChangeLog.md | 23 +++++++++++++++++++++++ config/__init__.py | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 5ff403ae..1f1d11fd 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,6 +6,29 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- +Pre-Release 5.12.1-rc1 +=== + +This is a release candidate for 5.12.1. It has been pushed to the "Beta" track for updates! + +This release fixes a pair of widely-reported bugs with EDMC authentication. + +**Changes and Enhancements** +* Fixed a typo in the prior release notes + +**Bug Fixes** +* Fixed a bug where the EDMC System Profiler wouldn't load details properly +* Reverted a number of usages of Pathlib back to os.path for further validation testing +* Fixed a bug where EDMC would error out with a max() ValueError + +**Plugin Developers** +* nb.Entry is deprecated, and is slated for removal in 6.0 or later. Please migrate to nb.EntryMenu +* nb.ColoredButton is deprecated, and is slated for removal in 6.0 or later. Please migrate to tk.Button +* Calling internal translations with `_()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to importing `translations` and calling `translations.translate` or `translations.tl` directly +* `Translations` as the translate system singleton is deprecated, and is slated for removal in 6.0 or later. Please migrate to the `translations` singleton +* `help_open_log_folder()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to open_folder() +* `update_feed` is deprecated, and is slated for removal in 6.0 or later. Please migrate to `get_update_feed()`. + Release 5.12.0 === diff --git a/config/__init__.py b/config/__init__.py index ec5a345c..79897984 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -52,7 +52,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.12.0' +_static_appversion = '5.12.1-beta1' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From 0cfc4873c6644d26f12770aa4042be53517754d7 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 30 Sep 2024 22:58:16 -0400 Subject: [PATCH 394/425] [RELEASE] 5.12.1-rc2 --- ChangeLog.md | 2 +- config/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 1f1d11fd..151d4376 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,7 +6,7 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- -Pre-Release 5.12.1-rc1 +Pre-Release 5.12.1-rc2 === This is a release candidate for 5.12.1. It has been pushed to the "Beta" track for updates! diff --git a/config/__init__.py b/config/__init__.py index 79897984..d9ff3b79 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -52,7 +52,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.12.1-beta1' +_static_appversion = '5.12.1-rc2' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From ab02f49aba16808511c1ede676306e54871515bb Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 1 Oct 2024 17:55:54 -0400 Subject: [PATCH 395/425] [#2303] Revert Prototyping for Protocol --- protocol.py | 75 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 56 insertions(+), 19 deletions(-) diff --git a/protocol.py b/protocol.py index a0f02f15..f1c1e0c7 100644 --- a/protocol.py +++ b/protocol.py @@ -69,11 +69,11 @@ if (config.auth_force_edmc_protocol # noqa: C901 # This could be false if you use auth_force_edmc_protocol, but then you get to keep the pieces assert sys.platform == 'win32' # spell-checker: words HBRUSH HICON WPARAM wstring WNDCLASS HMENU HGLOBAL - from ctypes import ( - windll, WINFUNCTYPE, Structure, byref, c_long, c_void_p, create_unicode_buffer, wstring_at + from ctypes import ( # type: ignore + windll, POINTER, WINFUNCTYPE, Structure, byref, c_long, c_void_p, create_unicode_buffer, wstring_at ) from ctypes.wintypes import ( - ATOM, HBRUSH, HICON, HINSTANCE, HWND, INT, LPARAM, LPCWSTR, LPWSTR, + ATOM, BOOL, DWORD, HBRUSH, HGLOBAL, HICON, HINSTANCE, HMENU, HWND, INT, LPARAM, LPCWSTR, LPMSG, LPVOID, LPWSTR, MSG, UINT, WPARAM ) import win32gui @@ -101,8 +101,40 @@ if (config.auth_force_edmc_protocol # noqa: C901 ('lpszClassName', LPCWSTR) ] - TranslateMessage = windll.user32.TranslateMessage + CW_USEDEFAULT = 0x80000000 + CreateWindowExW = windll.user32.CreateWindowExW + CreateWindowExW.argtypes = [DWORD, LPCWSTR, LPCWSTR, DWORD, INT, INT, INT, INT, HWND, HMENU, HINSTANCE, LPVOID] + CreateWindowExW.restype = HWND + RegisterClassW = windll.user32.RegisterClassW + RegisterClassW.argtypes = [POINTER(WNDCLASS)] + # DefWindowProcW + # Ref: + # LRESULT DefWindowProcW([in] HWND hWnd,[in] UINT Msg,[in] WPARAM wParam,[in] LPARAM lParam); + # As per example at + + prototype = WINFUNCTYPE(c_long, HWND, UINT, WPARAM, LPARAM) + paramflags = (1, "hWnd"), (1, "Msg"), (1, "wParam"), (1, "lParam") + + GetParent = windll.user32.GetParent + SetForegroundWindow = windll.user32.SetForegroundWindow + + # + # NB: Despite 'BOOL' return type, it *can* be >0, 0 or -1, so is actually + # c_long + prototype = WINFUNCTYPE(c_long, LPMSG, HWND, UINT, UINT) + paramflags = (1, "lpMsg"), (1, "hWnd"), (1, "wMsgFilterMin"), (1, "wMsgFilterMax") + GetMessageW = prototype(("GetMessageW", windll.user32), paramflags) + + TranslateMessage = windll.user32.TranslateMessage + DispatchMessageW = windll.user32.DispatchMessageW + PostThreadMessageW = windll.user32.PostThreadMessageW + SendMessageW = windll.user32.SendMessageW + SendMessageW.argtypes = [HWND, UINT, WPARAM, LPARAM] + PostMessageW = windll.user32.PostMessageW + PostMessageW.argtypes = [HWND, UINT, WPARAM, LPARAM] + + WM_QUIT = 0x0012 # https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-dde-initiate WM_DDE_INITIATE = 0x03E0 WM_DDE_TERMINATE = 0x03E1 @@ -118,6 +150,12 @@ if (config.auth_force_edmc_protocol # noqa: C901 GlobalGetAtomNameW = windll.kernel32.GlobalGetAtomNameW GlobalGetAtomNameW.argtypes = [ATOM, LPWSTR, INT] GlobalGetAtomNameW.restype = UINT + GlobalLock = windll.kernel32.GlobalLock + GlobalLock.argtypes = [HGLOBAL] + GlobalLock.restype = LPVOID + GlobalUnlock = windll.kernel32.GlobalUnlock + GlobalUnlock.argtypes = [HGLOBAL] + GlobalUnlock.restype = BOOL # Windows Message handler stuff (IPC) # https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms633573(v=vs.85) @@ -160,7 +198,7 @@ if (config.auth_force_edmc_protocol # noqa: C901 if target_is_valid and topic_is_valid: # if everything is happy, send an acknowledgement of the DDE request - win32gui.SendMessage( + SendMessageW( wParam, WM_DDE_ACK, hwnd, PackDDElParam(WM_DDE_ACK, GlobalAddAtomW(appname), GlobalAddAtomW('System')) ) @@ -193,7 +231,7 @@ if (config.auth_force_edmc_protocol # noqa: C901 thread = self.thread if thread: self.thread = None - win32api.PostThreadMessage(thread.ident, win32con.WM_QUIT, 0, 0) + PostThreadMessageW(thread.ident, WM_QUIT, 0, 0) thread.join() # Wait for it to quit def worker(self) -> None: @@ -203,25 +241,24 @@ if (config.auth_force_edmc_protocol # noqa: C901 wndclass.lpfnWndProc = WndProc wndclass.cbClsExtra = 0 wndclass.cbWndExtra = 0 - wndclass.hInstance = win32gui.GetModuleHandle(0) + wndclass.hInstance = windll.kernel32.GetModuleHandleW(0) wndclass.hIcon = None wndclass.hCursor = None wndclass.hbrBackground = None wndclass.lpszMenuName = None wndclass.lpszClassName = 'DDEServer' - if not win32gui.RegisterClass(byref(wndclass)): + if not RegisterClassW(byref(wndclass)): print('Failed to register Dynamic Data Exchange for cAPI') return # https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-createwindowexw - hwnd = win32gui.CreateWindowEx( + hwnd = CreateWindowExW( 0, # dwExStyle wndclass.lpszClassName, # lpClassName "DDE Server", # lpWindowName 0, # dwStyle - # X, Y, nWidth, nHeight - win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, # X, Y, nWidth, nHeight self.master.winfo_id(), # hWndParent # Don't use HWND_MESSAGE since the window won't get DDE broadcasts None, # hMenu wndclass.hInstance, # hInstance @@ -241,13 +278,13 @@ if (config.auth_force_edmc_protocol # noqa: C901 # # But it does actually work. Either getting a non-0 value and # entering the loop, or getting 0 and exiting it. - while win32gui.GetMessage(byref(msg), None, 0, 0) != 0: + while GetMessageW(byref(msg), None, 0, 0) != 0: logger.trace_if('frontier-auth.windows', f'DDE message of type: {msg.message}') if msg.message == WM_DDE_EXECUTE: # GlobalLock does some sort of "please dont move this?" # https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-globallock - args = wstring_at(win32gui.GlobalLock(msg.lParam)).strip() - win32gui.GlobalUnlock(msg.lParam) # Unlocks the GlobalLock-ed object + args = wstring_at(GlobalLock(msg.lParam)).strip() + GlobalUnlock(msg.lParam) # Unlocks the GlobalLock-ed object if args.lower().startswith('open("') and args.endswith('")'): logger.trace_if('frontier-auth.windows', f'args are: {args}') @@ -256,20 +293,20 @@ if (config.auth_force_edmc_protocol # noqa: C901 logger.debug(f'Message starts with {self.redirect}') self.event(url) - win32gui.SetForegroundWindow(win32gui.GetParent(self.master.winfo_id())) # raise app window + SetForegroundWindow(GetParent(self.master.winfo_id())) # raise app window # Send back a WM_DDE_ACK. this is _required_ with WM_DDE_EXECUTE - win32gui.PostMessage(msg.wParam, WM_DDE_ACK, hwnd, PackDDElParam(WM_DDE_ACK, 0x80, msg.lParam)) + PostMessageW(msg.wParam, WM_DDE_ACK, hwnd, PackDDElParam(WM_DDE_ACK, 0x80, msg.lParam)) else: # Send back a WM_DDE_ACK. this is _required_ with WM_DDE_EXECUTE - win32gui.PostMessage(msg.wParam, WM_DDE_ACK, hwnd, PackDDElParam(WM_DDE_ACK, 0, msg.lParam)) + PostMessageW(msg.wParam, WM_DDE_ACK, hwnd, PackDDElParam(WM_DDE_ACK, 0, msg.lParam)) elif msg.message == WM_DDE_TERMINATE: - win32gui.PostMessage(msg.wParam, WM_DDE_TERMINATE, hwnd, 0) + PostMessageW(msg.wParam, WM_DDE_TERMINATE, hwnd, 0) else: TranslateMessage(byref(msg)) # "Translates virtual key messages into character messages" ??? - win32gui.DispatchMessage(byref(msg)) + DispatchMessageW(byref(msg)) else: # Linux / Run from source From dab510bb213f89cd8d4fcac136e28004c64be283 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 1 Oct 2024 18:23:06 -0400 Subject: [PATCH 396/425] [PRE-RELEASE] .12.1-rc4 --- ChangeLog.md | 25 +++++++++++++++++++++++++ config/__init__.py | 2 +- protocol.py | 11 +---------- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 151d4376..14461b1b 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,6 +6,31 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- +Pre-Release 5.12.1-rc4 +=== + +This is a release candidate for 5.12.1. It has been pushed to the "Beta" track for updates! + +This release continues to refine fixes for with EDMC authentication. + +**Changes and Enhancements** +* Fixed a typo in the prior release notes + +**Bug Fixes** +* Fixed a bug where the EDMC System Profiler wouldn't load details properly +* Reverted a number of usages of Pathlib back to os.path for further validation testing +* Fixed a bug where EDMC would error out with a max() ValueError +* Fixed an issue where the EDMC protocol wouldn't be processed properly via prototyping + +**Plugin Developers** +* nb.Entry is deprecated, and is slated for removal in 6.0 or later. Please migrate to nb.EntryMenu +* nb.ColoredButton is deprecated, and is slated for removal in 6.0 or later. Please migrate to tk.Button +* Calling internal translations with `_()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to importing `translations` and calling `translations.translate` or `translations.tl` directly +* `Translations` as the translate system singleton is deprecated, and is slated for removal in 6.0 or later. Please migrate to the `translations` singleton +* `help_open_log_folder()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to open_folder() +* `update_feed` is deprecated, and is slated for removal in 6.0 or later. Please migrate to `get_update_feed()`. + + Pre-Release 5.12.1-rc2 === diff --git a/config/__init__.py b/config/__init__.py index d9ff3b79..c896b2f8 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -52,7 +52,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.12.1-rc2' +_static_appversion = '5.12.1-rc4' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' diff --git a/protocol.py b/protocol.py index f1c1e0c7..01be09de 100644 --- a/protocol.py +++ b/protocol.py @@ -77,8 +77,6 @@ if (config.auth_force_edmc_protocol # noqa: C901 MSG, UINT, WPARAM ) import win32gui - import win32con - import win32api class WNDCLASS(Structure): """ @@ -108,13 +106,6 @@ if (config.auth_force_edmc_protocol # noqa: C901 CreateWindowExW.restype = HWND RegisterClassW = windll.user32.RegisterClassW RegisterClassW.argtypes = [POINTER(WNDCLASS)] - # DefWindowProcW - # Ref: - # LRESULT DefWindowProcW([in] HWND hWnd,[in] UINT Msg,[in] WPARAM wParam,[in] LPARAM lParam); - # As per example at - - prototype = WINFUNCTYPE(c_long, HWND, UINT, WPARAM, LPARAM) - paramflags = (1, "hWnd"), (1, "Msg"), (1, "wParam"), (1, "lParam") GetParent = windll.user32.GetParent SetForegroundWindow = windll.user32.SetForegroundWindow @@ -385,7 +376,7 @@ else: # Linux / Run from source if self.parse(): self.send_header('Content-Type', 'text/html') self.end_headers() - self.wfile.write(self._generate_auth_response().encode('utf-8')) + self.wfile.write(self._generate_auth_response().encode()) else: self.send_response(404) self.end_headers() From 11d4c0cca1b8a333e8b54b47e8100b85561063ea Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Wed, 2 Oct 2024 19:49:46 -0400 Subject: [PATCH 397/425] [RELEASE] 5.12.1 --- ChangeLog.md | 29 ++--------------------------- config/__init__.py | 2 +- 2 files changed, 3 insertions(+), 28 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 14461b1b..d354c662 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,12 +6,10 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- -Pre-Release 5.12.1-rc4 +Release 5.12.1 === -This is a release candidate for 5.12.1. It has been pushed to the "Beta" track for updates! - -This release continues to refine fixes for with EDMC authentication. +This release fixes a handful of bugs reported with 5.12.0, notably a widely-reported bug with EDMC CAPI Authentication. **Changes and Enhancements** * Fixed a typo in the prior release notes @@ -31,29 +29,6 @@ This release continues to refine fixes for with EDMC authentication. * `update_feed` is deprecated, and is slated for removal in 6.0 or later. Please migrate to `get_update_feed()`. -Pre-Release 5.12.1-rc2 -=== - -This is a release candidate for 5.12.1. It has been pushed to the "Beta" track for updates! - -This release fixes a pair of widely-reported bugs with EDMC authentication. - -**Changes and Enhancements** -* Fixed a typo in the prior release notes - -**Bug Fixes** -* Fixed a bug where the EDMC System Profiler wouldn't load details properly -* Reverted a number of usages of Pathlib back to os.path for further validation testing -* Fixed a bug where EDMC would error out with a max() ValueError - -**Plugin Developers** -* nb.Entry is deprecated, and is slated for removal in 6.0 or later. Please migrate to nb.EntryMenu -* nb.ColoredButton is deprecated, and is slated for removal in 6.0 or later. Please migrate to tk.Button -* Calling internal translations with `_()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to importing `translations` and calling `translations.translate` or `translations.tl` directly -* `Translations` as the translate system singleton is deprecated, and is slated for removal in 6.0 or later. Please migrate to the `translations` singleton -* `help_open_log_folder()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to open_folder() -* `update_feed` is deprecated, and is slated for removal in 6.0 or later. Please migrate to `get_update_feed()`. - Release 5.12.0 === diff --git a/config/__init__.py b/config/__init__.py index c896b2f8..18d3d941 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -52,7 +52,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.12.1-rc4' +_static_appversion = '5.12.1' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From 27ec8300061b445772cbef53971c26888611d93f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Nov 2024 17:02:26 +0000 Subject: [PATCH 398/425] Bump types-requests from 2.32.0.20240712 to 2.32.0.20241016 Bumps [types-requests](https://github.com/python/typeshed) from 2.32.0.20240712 to 2.32.0.20241016. - [Commits](https://github.com/python/typeshed/commits) --- updated-dependencies: - dependency-name: types-requests dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index a56b70e3..d0bcec70 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -21,7 +21,7 @@ flake8-use-fstring==1.4 mypy==1.10.0 pep8-naming==0.14.1 safety==3.2.5 -types-requests==2.32.0.20240712 +types-requests==2.32.0.20241016 types-pkg-resources==0.1.3 # Code formatting tools From dc34230a8a5d363db8f78383517c5e56169f29a2 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 26 Nov 2024 12:36:44 +0000 Subject: [PATCH 399/425] updating submodules --- coriolis-data | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coriolis-data b/coriolis-data index 651aab5a..c59e4b79 160000 --- a/coriolis-data +++ b/coriolis-data @@ -1 +1 @@ -Subproject commit 651aab5af6a22980a1f88dcbb9ed256244cd6dff +Subproject commit c59e4b79dc48d581f9c5936d66a7f8bf533e8e6c From 214bed27ee3eb5fd484ee0693c55ab89f27a098b Mon Sep 17 00:00:00 2001 From: Athanasius Date: Mon, 9 Dec 2024 21:43:47 +0000 Subject: [PATCH 400/425] .github: workflows: Guard any shell $VAR with "..." This is with regards to what happened to another project, ref: Basically, do NOT trust that things like branch names don't contain any attempt at executing shell code if referenced in a workflow segment that runs a shell command. --- .github/workflows/pr-checks.yml | 6 +++--- .github/workflows/push-checks.yml | 2 +- .github/workflows/submodule-update.yml | 2 +- .github/workflows/windows-build.yml | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml index 843592a3..5c9872f1 100644 --- a/.github/workflows/pr-checks.yml +++ b/.github/workflows/pr-checks.yml @@ -19,7 +19,7 @@ jobs: # Debug show the info we have to work with - name: Show github context - run: cat $GITHUB_EVENT_PATH + run: cat "$GITHUB_EVENT_PATH" #################################################################### # Checkout the necessary commits @@ -44,9 +44,9 @@ jobs: echo "BASE_REPO_URL: ${BASE_REPO_URL}" echo "BASE_REPO_OWNER: ${BASE_REPO_OWNER}" # Add the 'base' repo as a new remote - git remote add ${BASE_REPO_OWNER} ${BASE_REPO_URL} + git remote add "${BASE_REPO_OWNER}" "${BASE_REPO_URL}" # And then fetch its references - git fetch ${BASE_REPO_OWNER} + git fetch "${BASE_REPO_OWNER}" #################################################################### #################################################################### diff --git a/.github/workflows/push-checks.yml b/.github/workflows/push-checks.yml index e238ad8f..7c762dcc 100644 --- a/.github/workflows/push-checks.yml +++ b/.github/workflows/push-checks.yml @@ -43,7 +43,7 @@ jobs: env: ROOT_SHA: ${{github.base_ref}} run: | - DATA=$(jq --raw-output .before $GITHUB_EVENT_PATH) + DATA=$(jq --raw-output .before "$GITHUB_EVENT_PATH") echo "DATA: ${DATA}" ####################################################################### diff --git a/.github/workflows/submodule-update.yml b/.github/workflows/submodule-update.yml index f794bdeb..74213c29 100644 --- a/.github/workflows/submodule-update.yml +++ b/.github/workflows/submodule-update.yml @@ -54,7 +54,7 @@ jobs: - name: Create submodules changes branch if: steps.check_for_changes.outputs.changes == 'true' run: | - git checkout -b "submodule-change/$GITHUB_RUN_ID" $CHECKOUT_BRANCH + git checkout -b "submodule-change/$GITHUB_RUN_ID" "$CHECKOUT_BRANCH" git commit -am "updating submodules" git push --set-upstream origin "submodule-change/$GITHUB_RUN_ID" diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index 9ed4e5ca..cecf941a 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -39,7 +39,7 @@ jobs: # For 'tar' we can only specify filename/glob exclusions, not any # directory location tar -c -v -z \ - -f ../EDMarketConnector-release-${{ needs.variables.outputs.sem_ver }}.tar.gz \ + -f "../EDMarketConnector-release-${{ needs.variables.outputs.sem_ver }}.tar.gz" \ -C .. \ --exclude=EDMarketConnector-release-*.* \ --exclude=.editorconfig \ @@ -59,7 +59,7 @@ jobs: --exclude=scripts \ --exclude=tests \ EDMarketConnector - mv ../EDMarketConnector-release-${{ needs.variables.outputs.sem_ver }}.tar.gz . + mv "../EDMarketConnector-release-${{ needs.variables.outputs.sem_ver }}.tar.gz" . - name: Upload build files uses: actions/upload-artifact@v4 From 22fef61e77beea026ca2716a60480dcad0197e72 Mon Sep 17 00:00:00 2001 From: CMDR-WDX <83889860+CMDR-WDX@users.noreply.github.com> Date: Fri, 27 Dec 2024 17:47:08 +0100 Subject: [PATCH 401/425] fix: Update coriolis-data to current master Ref, Regenerate Modules.json / Ships.json This resolves some errors being thrown by monitor.py - Errors are still thrown for Cobra MkV, but this data is not yet present in coriolis-data Also, removed hpt_multicannon_fixed_small_advanced and hpt_multicannon_fixed_medium_advanced from manual entry in coriolis-update-files.py as they are now present in the JSON generated by coriolis-data --- coriolis-data | 2 +- coriolis-update-files.py | 4 -- edmc_data.py | 2 + modules.json | 121 +++++++++++++++++++++++++++++++++++++++ ships.json | 8 +++ 5 files changed, 132 insertions(+), 5 deletions(-) diff --git a/coriolis-data b/coriolis-data index 651aab5a..c59e4b79 160000 --- a/coriolis-data +++ b/coriolis-data @@ -1 +1 @@ -Subproject commit 651aab5af6a22980a1f88dcbb9ed256244cd6dff +Subproject commit c59e4b79dc48d581f9c5936d66a7f8bf533e8e6c diff --git a/coriolis-update-files.py b/coriolis-update-files.py index 6dfcc0c9..729d2ef6 100755 --- a/coriolis-update-files.py +++ b/coriolis-update-files.py @@ -87,10 +87,6 @@ if __name__ == "__main__": add(modules, 'int_stellarbodydiscoveryscanner_intermediate', {'mass': 2}) add(modules, 'int_stellarbodydiscoveryscanner_advanced', {'mass': 2}) - # Missing - add(modules, 'hpt_multicannon_fixed_small_advanced', {'mass': 2}) - add(modules, 'hpt_multicannon_fixed_medium_advanced', {'mass': 4}) - modules = {k: modules[k] for k in sorted(modules)} with open("modules.json", "w") as modules_file: json.dump(modules, modules_file, indent=4) diff --git a/edmc_data.py b/edmc_data.py index 7286305e..abf08660 100644 --- a/edmc_data.py +++ b/edmc_data.py @@ -477,6 +477,7 @@ ship_name_map = { 'belugaliner': 'Beluga Liner', 'cobramkiii': 'Cobra MkIII', 'cobramkiv': 'Cobra MkIV', + 'cobramkv': 'Cobra MkV', 'clipper': 'Panther Clipper', 'cutter': 'Imperial Cutter', 'diamondback': 'Diamondback Scout', @@ -499,6 +500,7 @@ ship_name_map = { 'krait_mkii': 'Krait MkII', 'krait_light': 'Krait Phantom', 'mamba': 'Mamba', + 'mandalay': 'Mandalay', 'orca': 'Orca', 'python': 'Python', 'python_nx': 'Python Mk II', diff --git a/modules.json b/modules.json index e9e444d6..459ee883 100644 --- a/modules.json +++ b/modules.json @@ -332,27 +332,63 @@ "hpt_atdumbfiremissile_fixed_large": { "mass": 8 }, + "hpt_atdumbfiremissile_fixed_large_v2": { + "mass": 8 + }, "hpt_atdumbfiremissile_fixed_medium": { "mass": 4 }, + "hpt_atdumbfiremissile_fixed_medium_v2": { + "mass": 4 + }, "hpt_atdumbfiremissile_turret_large": { "mass": 8 }, + "hpt_atdumbfiremissile_turret_large_v2": { + "mass": 8 + }, "hpt_atdumbfiremissile_turret_medium": { "mass": 4 }, + "hpt_atdumbfiremissile_turret_medium_v2": { + "mass": 4 + }, "hpt_atmulticannon_fixed_large": { "mass": 8 }, + "hpt_atmulticannon_fixed_large_v2": { + "mass": 8 + }, "hpt_atmulticannon_fixed_medium": { "mass": 4 }, + "hpt_atmulticannon_fixed_medium_v2": { + "mass": 4 + }, + "hpt_atmulticannon_gimbal_large": { + "mass": 8 + }, + "hpt_atmulticannon_gimbal_medium": { + "mass": 4 + }, "hpt_atmulticannon_turret_large": { "mass": 8 }, + "hpt_atmulticannon_turret_large_v2": { + "mass": 8 + }, "hpt_atmulticannon_turret_medium": { "mass": 4 }, + "hpt_atmulticannon_turret_medium_v2": { + "mass": 4 + }, + "hpt_atventdisruptorpylon_fixed_large": { + "mass": 5 + }, + "hpt_atventdisruptorpylon_fixed_medium": { + "mass": 3 + }, "hpt_basicmissilerack_fixed_large": { "mass": 8 }, @@ -419,6 +455,9 @@ "hpt_cannon_gimbal_medium": { "mass": 4 }, + "hpt_cannon_gimbal_medium_burst": { + "mass": 4 + }, "hpt_cannon_gimbal_small": { "mass": 2 }, @@ -614,6 +653,12 @@ "hpt_mininglaser_turret_small": { "mass": 2 }, + "hpt_missing_hardpoint": { + "mass": 0 + }, + "hpt_missing_utility": { + "mass": 0 + }, "hpt_mrascanner_size0_class1": { "mass": 1.3 }, @@ -914,6 +959,12 @@ "int_corrosionproofcargorack_size4_class1": { "mass": 0 }, + "int_corrosionproofcargorack_size5_class1": { + "mass": 0 + }, + "int_corrosionproofcargorack_size6_class1": { + "mass": 0 + }, "int_detailedsurfacescanner_tiny": { "mass": 0 }, @@ -2370,6 +2421,34 @@ "int_metaalloyhullreinforcement_size5_class2": { "mass": 16 }, + "int_missing_engine": { + "mass": 0 + }, + "int_missing_fueltank": { + "mass": 0 + }, + "int_missing_hyperdrive": { + "mass": 0, + "optmass": 0, + "maxfuel": 0, + "fuelmul": 0, + "fuelpower": 0 + }, + "int_missing_lifesupport": { + "mass": 0 + }, + "int_missing_module": { + "mass": 0 + }, + "int_missing_powerdistributor": { + "mass": 0 + }, + "int_missing_powerplant": { + "mass": 0 + }, + "int_missing_sensors": { + "mass": 0 + }, "int_modulereinforcement_size1_class1": { "mass": 2 }, @@ -2475,6 +2554,9 @@ "int_planetapproachsuite": { "mass": 0 }, + "int_planetapproachsuite_advanced": { + "mass": 0 + }, "int_powerdistributor_size1_class1": { "mass": 1.3 }, @@ -3120,6 +3202,15 @@ "int_shieldcellbank_size8_class5": { "mass": 160 }, + "int_shieldgenerator_size1_class1": { + "mass": 1.3 + }, + "int_shieldgenerator_size1_class2": { + "mass": 0.5 + }, + "int_shieldgenerator_size1_class3": { + "mass": 1.3 + }, "int_shieldgenerator_size1_class3_fast": { "mass": 1.3 }, @@ -3333,6 +3424,21 @@ "mamba_armour_reactive": { "mass": 38 }, + "mandalay_armour_grade1": { + "mass": 0 + }, + "mandalay_armour_grade2": { + "mass": 32 + }, + "mandalay_armour_grade3": { + "mass": 63 + }, + "mandalay_armour_mirrored": { + "mass": 63 + }, + "mandalay_armour_reactive": { + "mass": 63 + }, "orca_armour_grade1": { "mass": 0 }, @@ -3423,6 +3529,21 @@ "type7_armour_reactive": { "mass": 63 }, + "type8_armour_grade1": { + "mass": 0 + }, + "type8_armour_grade2": { + "mass": 32 + }, + "type8_armour_grade3": { + "mass": 63 + }, + "type8_armour_mirrored": { + "mass": 63 + }, + "type8_armour_reactive": { + "mass": 63 + }, "type9_armour_grade1": { "mass": 0 }, diff --git a/ships.json b/ships.json index ac05d5d8..363cd561 100644 --- a/ships.json +++ b/ships.json @@ -111,6 +111,10 @@ "hullMass": 250, "reserveFuelCapacity": 0.5 }, + "Mandalay": { + "hullMass": 230, + "reserveFuelCapacity": 0.52 + }, "Orca": { "hullMass": 290, "reserveFuelCapacity": 0.79 @@ -139,6 +143,10 @@ "hullMass": 350, "reserveFuelCapacity": 0.52 }, + "Type-8 Transporter": { + "hullMass": 400, + "reserveFuelCapacity": 0.52 + }, "Type-9 Heavy": { "hullMass": 850, "reserveFuelCapacity": 0.77 From 18d71776b38b800eda749314199291a8f2f1c56f Mon Sep 17 00:00:00 2001 From: Connor Date: Fri, 27 Dec 2024 20:29:31 +0000 Subject: [PATCH 402/425] Update monitor.py Added properties of the loadout event which are missing from state: UnladenMass, CargoCapacity, MaxJumpRange, and FuelCapacity --- monitor.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/monitor.py b/monitor.py index e19d6ad5..ff7f0985 100644 --- a/monitor.py +++ b/monitor.py @@ -141,6 +141,10 @@ class EDLogs(FileSystemEventHandler): 'ShipType': None, 'HullValue': None, 'ModulesValue': None, + 'UnladenMass': None, + 'CargoCapacity': None, + 'MaxJumpRange': None, + 'FuelCapacity': None, 'Rebuy': None, 'Modules': None, 'CargoJSON': None, # The raw data from the last time cargo.json was read @@ -680,6 +684,12 @@ class EDLogs(FileSystemEventHandler): self.state['ShipType'] = self.canonicalise(entry['Ship']) self.state['HullValue'] = entry.get('HullValue') # not present on exiting Outfitting self.state['ModulesValue'] = entry.get('ModulesValue') # not present on exiting Outfitting + self.state['UnladenMass'] = entry.get('UnladenMass') + self.state['CargoCapacity'] = entry.get('CargoCapacity') + self.state['MaxJumpRange'] = entry.get('MaxJumpRange') + self.state['FuelCapacity'] = {} + self.state['FuelCapacity']['Main'] = entry.get('FuelCapacity')['Main'] + self.state['FuelCapacity']['Reserve'] = entry.get('FuelCapacity')['Reserve'] self.state['Rebuy'] = entry.get('Rebuy') # Remove spurious differences between initial Loadout event and subsequent self.state['Modules'] = {} From 583ee4fa505392fa217a272d61ddc33c6aa2ace5 Mon Sep 17 00:00:00 2001 From: Connor Date: Fri, 27 Dec 2024 20:40:41 +0000 Subject: [PATCH 403/425] Update PLUGINS.md update state table to match newly added values from loadout events --- PLUGINS.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PLUGINS.md b/PLUGINS.md index eee376c0..69f7934e 100644 --- a/PLUGINS.md +++ b/PLUGINS.md @@ -655,6 +655,10 @@ Content of `state` (updated to the current journal entry): | `ShipType` | `str` | Internal name for the current ship type | | `HullValue` | `int` | Current ship value, excluding modules | | `ModulesValue` | `int` | Value of the current ship's modules | +| `UnladenMass` | `float` | Unladen mass of current ship | +| `CargoCapacity` | `int` | Max cargo capacity of current ship | +| `MaxJumpRange` | `float` | Unladen jump range of current ship | +| `FuelCapacity` | `dict[str,float]` | Current max capacity of Main & Reserve tanks | | `Rebuy` | `int` | Current ship's rebuy cost | | `Modules` | `dict` | Currently fitted modules | | `NavRoute` | `dict` | Last plotted multi-hop route[1] | From e91ff21570b14e75d625982e680c986bfa34c7fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jan 2025 17:11:35 +0000 Subject: [PATCH 404/425] Bump pytest-cov from 5.0.0 to 6.0.0 Bumps [pytest-cov](https://github.com/pytest-dev/pytest-cov) from 5.0.0 to 6.0.0. - [Changelog](https://github.com/pytest-dev/pytest-cov/blob/master/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest-cov/compare/v5.0.0...v6.0.0) --- updated-dependencies: - dependency-name: pytest-cov dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index d0bcec70..80ae8687 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -39,7 +39,7 @@ py2exe==0.13.0.1; sys_platform == 'win32' # Testing pytest==8.3.2 -pytest-cov==5.0.0 # Pytest code coverage support +pytest-cov==6.0.0 # Pytest code coverage support coverage[toml]==7.6.1 # pytest-cov dep. This is here to ensure that it includes TOML support for pyproject.toml configs coverage-conditional-plugin==0.9.0 From f8e3ac006ec5958e88d51a1333ca470fa3d15352 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jan 2025 17:12:04 +0000 Subject: [PATCH 405/425] Bump mypy from 1.10.0 to 1.14.1 Bumps [mypy](https://github.com/python/mypy) from 1.10.0 to 1.14.1. - [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md) - [Commits](https://github.com/python/mypy/compare/v1.10.0...v1.14.1) --- updated-dependencies: - dependency-name: mypy dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index d0bcec70..3cb76975 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -18,7 +18,7 @@ flake8-noqa==1.4.0 flake8-polyfill==1.0.2 flake8-use-fstring==1.4 -mypy==1.10.0 +mypy==1.14.1 pep8-naming==0.14.1 safety==3.2.5 types-requests==2.32.0.20241016 From 7d3d09f60b0ed0ec9014e33662c223c0596b6d9b Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 6 Jan 2025 15:42:55 -0500 Subject: [PATCH 406/425] [#2324] Update Watchdog --- dashboard.py | 2 +- monitor.py | 4 ++-- requirements.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dashboard.py b/dashboard.py index a57264c0..cae2cc96 100644 --- a/dashboard.py +++ b/dashboard.py @@ -87,7 +87,7 @@ class Dashboard(FileSystemEventHandler): if not self.observed and sys.platform == 'win32': logger.debug('Starting observer...') - self.observed = cast(BaseObserver, self.observer).schedule(self, self.currentdir) + self.observed = cast(BaseObserver, self.observer).schedule(self, self.currentdir) # type: ignore logger.debug('Done') logger.info(f'{(sys.platform != "win32") and "Polling" or "Monitoring"} Dashboard "{self.currentdir}"') diff --git a/monitor.py b/monitor.py index e19d6ad5..53832a61 100644 --- a/monitor.py +++ b/monitor.py @@ -337,9 +337,9 @@ class EDLogs(FileSystemEventHandler): def on_created(self, event: 'FileSystemEvent') -> None: """Watchdog callback when, e.g. client (re)started.""" - if not event.is_directory and self._RE_LOGFILE.search(basename(event.src_path)): + if not event.is_directory and self._RE_LOGFILE.search(str(basename(event.src_path))): - self.logfile = event.src_path + self.logfile = event.src_path # type: ignore def worker(self) -> None: # noqa: C901, CCR001 """ diff --git a/requirements.txt b/requirements.txt index e3296d4a..b409af63 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ requests==2.32.3 pillow==10.4.0 -watchdog==4.0.1 +watchdog==6.0.0 simplesystray==0.1.0; sys_platform == 'win32' semantic-version==2.10.0 # For manipulating folder permissions and the like. From adc8a8377d3c4286eee25af4722a7fe2824300df Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 6 Jan 2025 15:55:44 -0500 Subject: [PATCH 407/425] [2351] Update Dependencies --- requirements-dev.txt | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 9a9a2be4..ce197c85 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -20,7 +20,7 @@ flake8-use-fstring==1.4 mypy==1.14.1 pep8-naming==0.14.1 -safety==3.2.5 +safety==3.2.14 types-requests==2.32.0.20241016 types-pkg-resources==0.1.3 diff --git a/requirements.txt b/requirements.txt index b409af63..19c015cd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,4 @@ simplesystray==0.1.0; sys_platform == 'win32' semantic-version==2.10.0 # For manipulating folder permissions and the like. pywin32==306; sys_platform == 'win32' -psutil==6.0.0 +psutil==6.1.1 From 4bfb5b48293e8ffd656cdeb8e32eb5b26cf1ce7d Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 6 Jan 2025 16:03:37 -0500 Subject: [PATCH 408/425] Update requirements.txt --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 19c015cd..b4d02a4b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,8 @@ requests==2.32.3 -pillow==10.4.0 +pillow==11.1.0 watchdog==6.0.0 simplesystray==0.1.0; sys_platform == 'win32' semantic-version==2.10.0 # For manipulating folder permissions and the like. -pywin32==306; sys_platform == 'win32' +pywin32==308; sys_platform == 'win32' psutil==6.1.1 From 6abdaf1537744806f7d5df7177b5b3c5580367e4 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Mon, 6 Jan 2025 16:11:08 -0500 Subject: [PATCH 409/425] [2320] Update Hull Get --- EDMCSystemProfiler.py | 2 +- edmc_data.py | 2 ++ monitor.py | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/EDMCSystemProfiler.py b/EDMCSystemProfiler.py index 92502cc8..873282b8 100644 --- a/EDMCSystemProfiler.py +++ b/EDMCSystemProfiler.py @@ -149,7 +149,7 @@ def main() -> None: # Buttons sys_report_btn = ttk.Button( root, - text="Copy System Report", + text="Copy System Report \U0001F5D0", command=lambda: copy_sys_report(root, sys_report), ) sys_report_btn.grid(row=3, column=0, padx=20, pady=10, sticky="w") diff --git a/edmc_data.py b/edmc_data.py index abf08660..1f68dd77 100644 --- a/edmc_data.py +++ b/edmc_data.py @@ -213,7 +213,9 @@ outfitting_weaponrating_map = { 'hpt_mininglaser_turret_small': 'D', 'hpt_mininglaser_turret_medium': 'D', 'hpt_multicannon_fixed_small': 'F', + 'hpt_multicannon_fixed_small_advanced': 'F', 'hpt_multicannon_fixed_medium': 'E', + 'hpt_multicannon_fixed_medium_advanced': 'E', 'hpt_multicannon_fixed_large': 'C', 'hpt_multicannon_fixed_huge': 'A', 'hpt_multicannon_gimbal_small': 'G', diff --git a/monitor.py b/monitor.py index 53832a61..e9fd7428 100644 --- a/monitor.py +++ b/monitor.py @@ -710,8 +710,8 @@ class EDLogs(FileSystemEventHandler): 'Ship': entry["Ship"], 'ShipName': entry['ShipName'], 'ShipIdent': entry['ShipIdent'], - 'HullValue': entry['HullValue'], - 'ModulesValue': entry['ModulesValue'], + 'HullValue': entry.get('HullValue'), + 'ModulesValue': entry.get('ModulesValue'), 'Rebuy': entry['Rebuy'], 'MaxJumpRange': entry['MaxJumpRange'], 'UnladenMass': entry['UnladenMass'], @@ -2151,7 +2151,7 @@ class EDLogs(FileSystemEventHandler): try: with p.oneshot(): if p.status() not in [psutil.STATUS_RUNNING, psutil.STATUS_SLEEPING]: - raise psutil.NoSuchProcess + raise psutil.NoSuchProcess(p.pid) except psutil.NoSuchProcess: # Process likely expired self.running_process = None From 9eb8bf51ae66118b0f6d9bdc8d5d027a6c82b43f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Feb 2025 17:05:37 +0000 Subject: [PATCH 410/425] Bump autopep8 from 2.3.1 to 2.3.2 Bumps [autopep8](https://github.com/hhatto/autopep8) from 2.3.1 to 2.3.2. - [Release notes](https://github.com/hhatto/autopep8/releases) - [Commits](https://github.com/hhatto/autopep8/compare/v2.3.1...v2.3.2) --- updated-dependencies: - dependency-name: autopep8 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index ce197c85..7677a6a5 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -25,7 +25,7 @@ types-requests==2.32.0.20241016 types-pkg-resources==0.1.3 # Code formatting tools -autopep8==2.3.1 +autopep8==2.3.2 # Git pre-commit checking pre-commit==3.8.0 From 2d8ab8a2bb6ec50e7d6127299ea10042050bec88 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Feb 2025 17:05:40 +0000 Subject: [PATCH 411/425] Bump mistune from 3.0.2 to 3.1.1 Bumps [mistune](https://github.com/lepture/mistune) from 3.0.2 to 3.1.1. - [Release notes](https://github.com/lepture/mistune/releases) - [Changelog](https://github.com/lepture/mistune/blob/master/docs/changes.rst) - [Commits](https://github.com/lepture/mistune/compare/v3.0.2...v3.1.1) --- updated-dependencies: - dependency-name: mistune dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index ce197c85..1b4cba92 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -31,7 +31,7 @@ autopep8==2.3.1 pre-commit==3.8.0 # HTML changelogs -mistune==3.0.2 +mistune==3.1.1 # Packaging # We only need py2exe on windows. From 336d1920c2e431ae88fad2e11aa43ecb1a414260 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Feb 2025 17:05:44 +0000 Subject: [PATCH 412/425] Bump py2exe from 0.13.0.1 to 0.13.0.2 Bumps [py2exe](https://github.com/py2exe/py2exe) from 0.13.0.1 to 0.13.0.2. - [Release notes](https://github.com/py2exe/py2exe/releases) - [Changelog](https://github.com/py2exe/py2exe/blob/master/ChangeLog) - [Commits](https://github.com/py2exe/py2exe/compare/v0.13.0.1...v0.13.0.2) --- updated-dependencies: - dependency-name: py2exe dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index ce197c85..b69f9057 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -35,7 +35,7 @@ mistune==3.0.2 # Packaging # We only need py2exe on windows. -py2exe==0.13.0.1; sys_platform == 'win32' +py2exe==0.13.0.2; sys_platform == 'win32' # Testing pytest==8.3.2 From 3cedc98ca151c01905a89f9044f5840320ecacfe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Feb 2025 17:05:55 +0000 Subject: [PATCH 413/425] Bump flake8 from 7.1.0 to 7.1.1 Bumps [flake8](https://github.com/pycqa/flake8) from 7.1.0 to 7.1.1. - [Commits](https://github.com/pycqa/flake8/compare/7.1.0...7.1.1) --- updated-dependencies: - dependency-name: flake8 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index ce197c85..3b641c73 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -8,7 +8,7 @@ wheel setuptools==70.0.0 # Static analysis tools -flake8==7.1.0 +flake8==7.1.1 flake8-annotations-coverage==0.0.6 flake8-cognitive-complexity==0.1.0 flake8-comprehensions==3.15.0 From b30eca7979e64901f52bbb820b4516a12999dbdd Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sat, 8 Feb 2025 12:15:28 -0500 Subject: [PATCH 414/425] [Fix] Ignore Typing of Potential Null --- monitor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/monitor.py b/monitor.py index e9fd7428..9323f71d 100644 --- a/monitor.py +++ b/monitor.py @@ -710,8 +710,8 @@ class EDLogs(FileSystemEventHandler): 'Ship': entry["Ship"], 'ShipName': entry['ShipName'], 'ShipIdent': entry['ShipIdent'], - 'HullValue': entry.get('HullValue'), - 'ModulesValue': entry.get('ModulesValue'), + 'HullValue': entry.get('HullValue'), # type: ignore + 'ModulesValue': entry.get('ModulesValue'), # type: ignore 'Rebuy': entry['Rebuy'], 'MaxJumpRange': entry['MaxJumpRange'], 'UnladenMass': entry['UnladenMass'], From 9a3240d8145854a7ea66cd293cdcce1ba210c8df Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sat, 8 Feb 2025 12:28:02 -0500 Subject: [PATCH 415/425] [Fix] More MyPy Suppression --- monitor.py | 4 ++-- scripts/build_changelog.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/monitor.py b/monitor.py index 4fd3a86f..f32a3eff 100644 --- a/monitor.py +++ b/monitor.py @@ -688,8 +688,8 @@ class EDLogs(FileSystemEventHandler): self.state['CargoCapacity'] = entry.get('CargoCapacity') self.state['MaxJumpRange'] = entry.get('MaxJumpRange') self.state['FuelCapacity'] = {} - self.state['FuelCapacity']['Main'] = entry.get('FuelCapacity')['Main'] - self.state['FuelCapacity']['Reserve'] = entry.get('FuelCapacity')['Reserve'] + self.state['FuelCapacity']['Main'] = entry.get('FuelCapacity')['Main'] # type: ignore + self.state['FuelCapacity']['Reserve'] = entry.get('FuelCapacity')['Reserve'] # type: ignore self.state['Rebuy'] = entry.get('Rebuy') # Remove spurious differences between initial Loadout event and subsequent self.state['Modules'] = {} diff --git a/scripts/build_changelog.py b/scripts/build_changelog.py index 6b050774..42157947 100644 --- a/scripts/build_changelog.py +++ b/scripts/build_changelog.py @@ -42,7 +42,7 @@ def get_changelog() -> tuple[str, str]: def build_html(md_changelog: str, version: str) -> str: """Convert markdown changelog to HTML.""" html_out = f"

Release {version}

\n" - html_out += mistune.html(md_changelog) + html_out += mistune.html(md_changelog) # type: ignore html_out = re.sub(r"h1", "h2", html_out) + "\n
" with open("script_output/html_changelog.txt", "w", encoding="utf-8") as html_file: From 8bbc26d42de2a12151262a90d76d9cc505d9b9ff Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sat, 8 Feb 2025 12:35:14 -0500 Subject: [PATCH 416/425] [Fix] Actually Not Ignorable Co-Authored-By: A_D --- monitor.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/monitor.py b/monitor.py index f32a3eff..badc4c71 100644 --- a/monitor.py +++ b/monitor.py @@ -687,9 +687,8 @@ class EDLogs(FileSystemEventHandler): self.state['UnladenMass'] = entry.get('UnladenMass') self.state['CargoCapacity'] = entry.get('CargoCapacity') self.state['MaxJumpRange'] = entry.get('MaxJumpRange') - self.state['FuelCapacity'] = {} - self.state['FuelCapacity']['Main'] = entry.get('FuelCapacity')['Main'] # type: ignore - self.state['FuelCapacity']['Reserve'] = entry.get('FuelCapacity')['Reserve'] # type: ignore + self.state["FuelCapacity"] = {name: entry.get("FuelCapacity", {}).get(name) for name in + ("Main", "Reserve")} self.state['Rebuy'] = entry.get('Rebuy') # Remove spurious differences between initial Loadout event and subsequent self.state['Modules'] = {} From 5c3a05d42a5ae45e1aa2cc10ef4589f2e86296b0 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sat, 8 Feb 2025 12:57:21 -0500 Subject: [PATCH 417/425] [5.12.2-rc1] Update Changelog --- ChangeLog.md | 26 ++++++++++++++++++++++++++ config/__init__.py | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index d354c662..7de50139 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,6 +6,32 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are in the source (not distributed with the Windows installer) for the currently used version. --- + +Pre-Release 5.12.2-rc1 +=== +This is a pre-release to test a number of bugfixes and security improvements in EDMC. + +**Changes and Enhancements** +* Adds a guard against workflow shell execution vulnerabilities in GitHub Actions +* Adds a "Copy" icon in the EDMC System Profiler +* Includes additional Loadout event properties in the "State" context +* Updates Dependencies and Submodules + +**Bug Fixes** +* Removes Duplicate Coriolis Definitions Included In Submodules +* Adds Context Support for Mandalay and Cobra Mk IV, and Type-8 Transporter +* Adds a number of missing modules to modules.json +* Fixes a widely-reported bug where missing HullValue or ModuleValue entries would cause parsing to crash +* Fixes a bug where PSUtils exception handling was not processed + +**Plugin Developers** +* nb.Entry is deprecated, and is slated for removal in 6.0 or later. Please migrate to nb.EntryMenu +* nb.ColoredButton is deprecated, and is slated for removal in 6.0 or later. Please migrate to tk.Button +* Calling internal translations with `_()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to importing `translations` and calling `translations.translate` or `translations.tl` directly +* `Translations` as the translate system singleton is deprecated, and is slated for removal in 6.0 or later. Please migrate to the `translations` singleton +* `help_open_log_folder()` is deprecated, and is slated for removal in 6.0 or later. Please migrate to open_folder() +* `update_feed` is deprecated, and is slated for removal in 6.0 or later. Please migrate to `get_update_feed()`. + Release 5.12.1 === diff --git a/config/__init__.py b/config/__init__.py index 18d3d941..6ba2bede 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -52,7 +52,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.12.1' +_static_appversion = '5.12.2-rc1' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From 001dc70f7807ceaaccec2d3035fcc0a0f56af183 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sat, 8 Feb 2025 13:19:07 -0500 Subject: [PATCH 418/425] [Typo] I'm Blind! --- ChangeLog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 7de50139..548d76f7 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -19,7 +19,7 @@ This is a pre-release to test a number of bugfixes and security improvements in **Bug Fixes** * Removes Duplicate Coriolis Definitions Included In Submodules -* Adds Context Support for Mandalay and Cobra Mk IV, and Type-8 Transporter +* Adds Context Support for Mandalay and Cobra Mk V, and Type-8 Transporter * Adds a number of missing modules to modules.json * Fixes a widely-reported bug where missing HullValue or ModuleValue entries would cause parsing to crash * Fixes a bug where PSUtils exception handling was not processed From edf5e5c4efdf8bd1eef5fbdca919b13de2d339b0 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 11 Feb 2025 16:07:28 -0500 Subject: [PATCH 419/425] [2367] Remove pkg_resources --- .pre-commit-config.yaml | 2 +- build.py | 1 - requirements-dev.txt | 4 ++-- scripts/pip_rev_deps.py | 34 ---------------------------------- 4 files changed, 3 insertions(+), 38 deletions(-) delete mode 100644 scripts/pip_rev_deps.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5b534279..51702e14 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -51,7 +51,7 @@ repos: - id: mypy # verbose: true # log_file: 'pre-commit_mypy.log' - additional_dependencies: [ types-pkg-resources, types-requests, types-urllib3 ] + additional_dependencies: [ types-setuptools, types-requests, types-urllib3 ] # args: [ "--follow-imports", "skip", "--ignore-missing-imports", "--scripts-are-modules" ] ### # pydocstyle.exe diff --git a/build.py b/build.py index 9094ac66..d14b4f62 100644 --- a/build.py +++ b/build.py @@ -129,7 +129,6 @@ def build() -> None: "packages": [ "asyncio", "multiprocessing", - "pkg_resources._vendor.platformdirs", "sqlite3", "util", ], diff --git a/requirements-dev.txt b/requirements-dev.txt index 2a20d476..a81a5c3b 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -5,7 +5,7 @@ wheel # We can't rely on just picking this up from either the base (not venv), # or venv-init-time version. Specify here so that dependabot will prod us # about new versions. -setuptools==70.0.0 +setuptools==75.8.0 # Static analysis tools flake8==7.1.1 @@ -22,7 +22,7 @@ mypy==1.14.1 pep8-naming==0.14.1 safety==3.2.14 types-requests==2.32.0.20241016 -types-pkg-resources==0.1.3 +types-setuptools==75.8.0.20250210 # Code formatting tools autopep8==2.3.2 diff --git a/scripts/pip_rev_deps.py b/scripts/pip_rev_deps.py deleted file mode 100644 index 1956f5d0..00000000 --- a/scripts/pip_rev_deps.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python3 -"""Search for dependencies given a package.""" -import sys - -import pkg_resources - - -def find_reverse_deps(package_name: str) -> list[str]: - """ - Find the packages that depend on the named one. - - :param package_name: Target package. - :return: List of packages that depend on this one. - """ - return [ - pkg.project_name for pkg in pkg_resources.WorkingSet() - if package_name in {req.project_name for req in pkg.requires()} - ] - - -if __name__ == '__main__': - if len(sys.argv) != 2: - print("Usage: python reverse_deps.py ") - sys.exit(1) - - package_name = sys.argv[1] - reverse_deps = find_reverse_deps(package_name) - - if reverse_deps: - print(f"Reverse dependencies of '{package_name}':") - for dep in reverse_deps: - print(dep) - else: - print(f"No reverse dependencies found for '{package_name}'.") From b3bfd0d18085870b30c81c499b77a01d47348495 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Tue, 11 Feb 2025 16:16:39 -0500 Subject: [PATCH 420/425] [2368] Remove Wheel References Per SetupTools v70.1, wheel is no longer required. --- .github/workflows/pr-checks.yml | 2 +- .github/workflows/push-checks.yml | 2 +- .github/workflows/windows-build.yml | 1 - requirements-dev.txt | 4 ---- 4 files changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml index 5c9872f1..17841159 100644 --- a/.github/workflows/pr-checks.yml +++ b/.github/workflows/pr-checks.yml @@ -60,7 +60,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install wheel flake8 + pip install flake8 if [ -f requirements-dev.txt ]; then pip install -r requirements-dev.txt; elif [ -f requirements.txt ]; then pip install -r requirements.txt ; fi #################################################################### diff --git a/.github/workflows/push-checks.yml b/.github/workflows/push-checks.yml index 7c762dcc..3e83fbfb 100644 --- a/.github/workflows/push-checks.yml +++ b/.github/workflows/push-checks.yml @@ -33,7 +33,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install wheel flake8 pytest + pip install flake8 pytest if [ -f requirements-dev.txt ]; then pip install -r requirements-dev.txt; fi - name: Setup flake8 annotations diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index cecf941a..8a4d115a 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -109,7 +109,6 @@ jobs: - name: Install python tools run: | - pip install wheel pip install -r requirements-dev.txt - name: Download winsparkle diff --git a/requirements-dev.txt b/requirements-dev.txt index a81a5c3b..81e36d88 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,7 +1,3 @@ -# So that you don't get warnings like: -# Using legacy 'setup.py install' for flake8-annotations-coverage, since package 'wheel' is not installed. -wheel - # We can't rely on just picking this up from either the base (not venv), # or venv-init-time version. Specify here so that dependabot will prod us # about new versions. From 310cf9f87571254189dbbd1e60f035febe3c0f06 Mon Sep 17 00:00:00 2001 From: David Sangrey Date: Sun, 16 Feb 2025 19:55:52 -0500 Subject: [PATCH 421/425] [RELEASE] 5.12.2 --- ChangeLog.md | 4 +++- config/__init__.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 548d76f7..2d7c9423 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -7,7 +7,7 @@ This is the master changelog for Elite Dangerous Market Connector. Entries are currently used version. --- -Pre-Release 5.12.2-rc1 +Release 5.12.2 === This is a pre-release to test a number of bugfixes and security improvements in EDMC. @@ -16,6 +16,8 @@ This is a pre-release to test a number of bugfixes and security improvements in * Adds a "Copy" icon in the EDMC System Profiler * Includes additional Loadout event properties in the "State" context * Updates Dependencies and Submodules +* Removes an outdated development script that was no longer in use and prevented dependency updates +* Replaces types-pkg-resources with types-setuptools per PyPi documentation **Bug Fixes** * Removes Duplicate Coriolis Definitions Included In Submodules diff --git a/config/__init__.py b/config/__init__.py index 6ba2bede..adf3e47f 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -52,7 +52,7 @@ appcmdname = 'EDMC' # # Major.Minor.Patch(-prerelease)(+buildmetadata) # NB: Do *not* import this, use the functions appversion() and appversion_nobuild() -_static_appversion = '5.12.2-rc1' +_static_appversion = '5.12.2' _cached_version: semantic_version.Version | None = None copyright = '© 2015-2019 Jonathan Harris, 2020-2024 EDCD' From 9ff3327ff738310a801302521448fb4603c7a2cc Mon Sep 17 00:00:00 2001 From: David Muckle Date: Thu, 20 Feb 2025 19:17:50 -0500 Subject: [PATCH 422/425] Add code to track PP2.0 rank, merits, etc --- monitor.py | 14 ++++++++++++++ plugins/inara.py | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/monitor.py b/monitor.py index badc4c71..e37e77c1 100644 --- a/monitor.py +++ b/monitor.py @@ -179,6 +179,13 @@ class EDLogs(FileSystemEventHandler): 'StationName': None, 'NavRoute': None, + 'Powerplay': { + 'Power': None, + 'Rank': None, + 'Merits': None, + 'Votes': None, + 'TimePledged': None, + }, } def start(self, root: 'tkinter.Tk') -> bool: # noqa: CCR001 @@ -1839,6 +1846,13 @@ class EDLogs(FileSystemEventHandler): # There should be a `Backpack` event as you 'come to' in the # new location, so no need to zero out BackPack here. + elif event_type == 'powerplay': + self.state['Powerplay']['Power'] = entry.get('Power', '') + self.state['Powerplay']['Rank'] = entry.get('Rank', 0) + self.state['Powerplay']['Merits'] = entry.get('Merits', 0) + self.state['Powerplay']['Votes'] = entry.get('Votes', 0) + self.state['Powerplay']['TimePledged'] = entry.get('TimePledged', 0) + return entry except Exception as ex: diff --git a/plugins/inara.py b/plugins/inara.py index f2c9830e..b48609f0 100644 --- a/plugins/inara.py +++ b/plugins/inara.py @@ -548,6 +548,10 @@ def journal_entry( # noqa: C901, CCR001 power_defect_data = {'powerName': entry["ToPower"], 'rankValue': 1} new_add_event('setCommanderRankPower', entry['timestamp'], power_defect_data) + elif event_name == 'Powerplay': + power_data = {'powerName': entry["Power"], 'rankValue': entry["Rank"], 'meritsValue': entry["Merits"]} + new_add_event('setCommanderRankPower', entry['timestamp'], power_data) + # Ship change if event_name == 'Loadout' and this.shipswap: this.loadout = make_loadout(state) From 3c22aad2542fcfbaa87c8feb450203551c8e382c Mon Sep 17 00:00:00 2001 From: David Muckle Date: Sat, 22 Feb 2025 17:52:22 -0500 Subject: [PATCH 423/425] Update PLUGINS.md with new info about Powerplay in `state` --- PLUGINS.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/PLUGINS.md b/PLUGINS.md index 69f7934e..da7303f4 100644 --- a/PLUGINS.md +++ b/PLUGINS.md @@ -688,6 +688,7 @@ Content of `state` (updated to the current journal entry): | `StationName`[3] | `Optional[str]` | Name of the station we're docked at, if applicable | | `MarketID`[3] | `Optional[str]` | MarketID of the station we're docked at, if applicable | | `StationType`[3] | `Optional[str]` | Type of the station we're docked at, if applicable | +| `Powerplay` | `dict` | `dict` of information on Powerplay [1] - Contents of `NavRoute` not changed if a `NavRouteClear` event is seen, but plugins will see the `NavRouteClear` event. @@ -836,6 +837,12 @@ the 'Body' name value. `StationName`, `MarketID`, and `StationType` added to the `state` dictionary. +New in version 5.13.0: + +`state` now has `Powerplay`, a `dict` including `Rank`, `Merits`, `Power`, +`TimePledged`, and `Votes`. `Votes` should only be populated if playing in +legacy mode, as it is no longer a concept in the current version of the game. + ___ ##### Synthetic Events From 529cf68db0825373762691ed100ef417790028ff Mon Sep 17 00:00:00 2001 From: David Muckle Date: Sun, 23 Feb 2025 10:57:09 -0500 Subject: [PATCH 424/425] Remove extra newline --- PLUGINS.md | 1 - 1 file changed, 1 deletion(-) diff --git a/PLUGINS.md b/PLUGINS.md index da7303f4..f84e9444 100644 --- a/PLUGINS.md +++ b/PLUGINS.md @@ -842,7 +842,6 @@ New in version 5.13.0: `state` now has `Powerplay`, a `dict` including `Rank`, `Merits`, `Power`, `TimePledged`, and `Votes`. `Votes` should only be populated if playing in legacy mode, as it is no longer a concept in the current version of the game. - ___ ##### Synthetic Events From 317d9fa32b1faa50b4830772dd9936ef5ca9cc49 Mon Sep 17 00:00:00 2001 From: David Muckle Date: Sun, 23 Feb 2025 11:31:11 -0500 Subject: [PATCH 425/425] Revert "Remove extra newline" This reverts commit 529cf68db0825373762691ed100ef417790028ff. --- PLUGINS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/PLUGINS.md b/PLUGINS.md index f84e9444..da7303f4 100644 --- a/PLUGINS.md +++ b/PLUGINS.md @@ -842,6 +842,7 @@ New in version 5.13.0: `state` now has `Powerplay`, a `dict` including `Rank`, `Merits`, `Power`, `TimePledged`, and `Votes`. `Votes` should only be populated if playing in legacy mode, as it is no longer a concept in the current version of the game. + ___ ##### Synthetic Events