* [Explorer] Default + Custom Criteria improvements
For Custom Criteria:
* If a custom criteria throws an error or fails to parse/load, Core no longer disables custom criteria entirely -- it now disables the problematic criteria until you update the custom criteria file and trigger a new journal/re-read (which reloads the source file).
For Default Criteria:
* Adds landable status of the body triggering the Close Ring/Belt proximity. (Requested in Discord somewhere.)
* Adds the triggering ring name to the Wide Ring criteria. (I believe also requested, can't remember now.)
Adds new functions to the Lua environment available to custom criteria for handling rings and belts:
- the existing `rings(scan.Rings)` function behavior is unchanged
- NEW: `ringsOnly(scan.Rings)` and `beltsOnly(scan.Rings)` functions return ONLY rings or belts, respectively, and shortcuts the `scan.Rings` check
- NEW: `hasRings(scan.Rings)` and `hasBelts(scan.Rings)` functions return true if there are one or more proper rings or belts, respectively, in scan.Rings and shortcuts the check, too
Furthermore, this adds a debugging aid that identifies what custom criteria caused an error/crash. For simple criteria, ie:
`::Hot Landable::`
... the description "Hot Landable" is used. For complex criteria, you can now annotate the `::Criteria::` line with a description used for debugging like so:
`::Criteria=Hot Landable::`. Criteria errors are logged like this:
```
Error encountered in Elite Observatory from plugin Explorer while processing custom criteria 'Criteria14=I just crash' on scan:
```
Duplicates are avoided by prepending the user-provided description with a generated name (ie. `Criteria14`, in the example above).
Finally, the Detail expression for simple criteria can now safely reference values checked as part of the criteria condition. In particular, the Detail expression is now conditionally evaluated if the result is true. So the following will now work (previously it failed for non-star bodies when StarType was nil):
```
::Ringed Star::
scan.StarType and hasRings(scan.Rings)
::Detail::
'Star type: ' .. scan.StarType
```
* Expose core error logger to plugins and report custom criteria errors
Fixes#77
This adds an error logging method on the IObservatoryCore interface that writes the exception details to ObservatoryCore's central error log (found in `${Documents}/ObservatoryErrorLog.txt`). In addition, added a timestamp to each error log.
Also updates the Explorer to report Custom Criteria file load errors and execution errors to the log. Also updates HeraldNotifier to report CacheIndex.json parse failures to the error log as well.
* Expand debugging/error logging in Herald; cleanup empty mp3 files
Herald crashes if attempting to play 0-byte mp3s so if detected, delete, re-request (empty files can occur in some azure failure cases (ie. out of quota). Trap and log errors in other places in HeraldQueue to avoid hard crashes due to weird and wonderful unexpected stuff.
* chore: move all observatory repos to core
* only save journal folder on change, don't constantly re-check during monitoring
* chore: monorepo project changes
* chore: monorepo migration