v0.9.1
Highlights
This release has improvements to regions handling, fixes for a couple of deadlock issues in the scheduler that might cause the bot to become unresponsive, and bugfixes in various areas.
- Regions flood scope end-to-end: per-service config, scheduled messages, webhook body override, and correct scope on keyword/RandomLine replies.
- Scheduler overhaul: 5-field cron and
@presets (HHMM deprecated), optional per-job#scope, stagger for colliding jobs, better concurrency. - DARC MoWaS reliability: bit-identical retransmits with stable timestamps; ascending timestamps on multi-chunk sends.
- Path & test commands: optional reply prefix, gated repeater naming by bytes/hop, customizable
test/ttemplates with pipe filters.
Features
Scheduling
[Scheduled_Messages]supports cron (0 8 * * *), presets (@daily,@hourly, …); legacyHHMMstill works with a warning. (Note: APScheduler Day of Week starts on Monday unlike Vixie cron, so Monday = 0.)- Per-job regional scope:
channel:#scope:message(middle field must start with#). - Added optional
scheduled_message_max_stagger_secondsto spread out jobs that fire at the same time; scheduled sends skip globalrate_limit_seconds(channel andbot_tx_rate_limitstill apply).
Flood scope
CommandManager.resolve_channel_send_scope()with precedence: explicit arg →message.reply_scope→ sectionflood_scope→[Channels] outgoing_flood_scope_override.- Optional
flood_scopeon Weather, Earthquake, Webhook, DARC MoWaS, and related services; webhook JSON may include"flood_scope": "#scope". - Keyword and RandomLine channel replies use
send_responseso incoming regional scope is honored. #178
Commands
- Path:
reply_prefix(first chunk only when split) allows you to add@[{sender}]or similar to first reply.minimum_path_bytes(2/3) defers DB name lookup on paths with single byte path hashes, this is useful to avoid returning inaccurate information in dense meshes with highly duplicated single-byte prefixes. - Test:
[Test_Command] response_formatoverrides[Keywords] test; pipe filters (pathbytes_min,prefix_if_nonempty). This enables things like not returning values unless conditions are met. Example that only returns path distance if multibyte paths are used:
response_format = ack @[{sender}]{phrase_part} | {path}{path_distance|pathbytes_min:2|prefix_if_nonempty: | Path Dist: } | F/L Dist: {firstlast_distance} | Rec: {timestamp}Packet capture / MQTT
- Added global
jwt_ttl_secondsand per-brokermqttN_jwt_ttl_seconds/mqttN_jwt_renewal_intervalfor token lifetime vs refresh cadence. This enables JWTs with a TTL shorter than 24 hours.
DARC MoWaS
- Retransmissions reuse the original timestamp for network deduplication; chunk sends get
base + indexsecond timestamps.
Other
send_channel_message(..., timestamp=...)for bit-identical channel replays.- Service display names strip trailing underscores (e.g.
foo_Service→foo, notfoo_).
Fixes
- DM routing: responses use
sender_pubkeywhen available (avoids misrouting when display names collide). Thanks for raising this @Tigro14 in #180 - Scheduler / feeds: fire-and-forget scheduled processing; feed send lock avoids coroutine pileup; per-feed last-send tracking.
- Mesh graph:
flush_neededflag reduces redundant flush calls and a deadlock risk. - Contact adverts:
track_contact_advertisementreturns structured success/duplicate status for clearer handler logic. - DARC MoWaS / webhook: chunk timestamp ordering; webhook scope resolution cleanup.
Configuration notes
| Area | Action |
|---|---|
| Scheduled messages | Prefer cron over HHMM; use channel:#scope:body for regional sends. |
| MQTT brokers with short-lived tokens | Set jwt_ttl_seconds and renewal interval below TTL per broker. |
| Service Plugins | Add flood_scope = #region under the service plugin configuration or use [Channels] outgoing_flood_scope_override to set a global outgoing flood scope. |
| Path / test | See config.ini.example for reply_prefix, minimum_path_bytes, and response_format. |
Contributors
Thanks to @fmoessbauer for improvements to DARC MoWaS retransmits, channel timestamps, and service name parsing.