mirror of
https://github.com/agessaman/meshcore-bot.git
synced 2026-09-16 12:52:37 +00:00
Integration fixes on top of the merge, in three groups. Regressions in the shared shortener, which is not opt-in — weather alerts call it unconditionally whenever an alert carries a link: - Restore the `response.ok` guard on the v.gd path. Without it a 503 whose body happens to start with `http` (a captive portal, a CDN error page) was returned as the short URL. The test that covered this still passed because it never set `.text`, so `MagicMock.startswith()` answered truthily; it now supplies a body that would be accepted on a 200, so only the status check can make it pass. - Add the same guard to the shlink path, where a rejected API key is a 401 with a problem-details body and was indistinguishable from an empty result. - Restore debug-level logging for `Timeout`/`ConnectionError`. A mesh node's uplink drops out routinely and this had become `logger.error`. - Drop the `shortUrlSlug` fallback. Shlink's create response carries `shortUrl` and `shortCode`; `shortUrlSlug` is not in its schema, and a bare slug is not a link — emitting one would have put `abc123` in a message. The `shorten_url` filter did blocking HTTP inside the synchronous render path (`process_message` → `check_keywords` → `format_response`), so a 5 s shortener timeout stalled the radio transport along with everything else. Making `check_keywords` async would touch 27 call sites, so instead the network work moves ahead of the render: - `resolve_template_async()` renders once with the filter in collection mode, which walks the real chain so a clause already suppressed by `hops_min` costs no request, then shortens what survived concurrently off-thread. - The filter itself now only reads that mapping and never calls out. Asked to render without a pre-pass it warns and drops the clause rather than block. - On failure the clause is dropped rather than sent unshortened. A v.gd link is ~19 bytes where the analyzer URL is ~59, against a ~158-byte budget the prefix is subtracted from, so falling back would have turned one transmission into two whenever the shortener was unreachable. Smaller: rename `if_notempty` to `if_nonempty` to match the existing `prefix_if_nonempty` (nothing ships using it yet, so there is no config to migrate); `_build_create_shlink_url` no longer takes the long URL and API key it never used; move the CHANGELOG entry from Fixed to Added and name the filter it actually added; ungate the render debug log from `config`; document that `shorten_url` is supported in `path`'s `reply_prefix` only. Every template shipped in config.ini.example still renders identically to the regex parser it replaced.