From babe2eca3683a8c5332a0bad0466739e4e6d885d Mon Sep 17 00:00:00 2001 From: <> Date: Sun, 31 May 2026 00:25:30 +0000 Subject: [PATCH] Deployed e6e950f with MkDocs version: 1.6.1 --- .nojekyll | 0 404.html | 1247 +++ FEEDS/index.html | 1668 ++++ assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.79ae519e.min.js | 16 + assets/javascripts/bundle.79ae519e.min.js.map | 7 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.el.min.js | 1 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.he.min.js | 1 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.hy.min.js | 1 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.kn.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + assets/javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.te.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.2c215733.min.js | 42 + .../workers/search.2c215733.min.js.map | 7 + assets/stylesheets/main.484c7ddc.min.css | 1 + assets/stylesheets/main.484c7ddc.min.css.map | 1 + assets/stylesheets/palette.ab4e12ef.min.css | 1 + .../stylesheets/palette.ab4e12ef.min.css.map | 1 + checkin-api/index.html | 1618 ++++ command-reference-website/index.html | 1301 ++++ command-reference/index.html | 2835 +++++++ config-validation/index.html | 1534 ++++ configuration/index.html | 1744 +++++ data-retention/index.html | 1440 ++++ discord-bridge/index.html | 1733 +++++ docker/index.html | 2241 ++++++ earthquake-service/index.html | 1365 ++++ faq/index.html | 1556 ++++ getting-started/index.html | 1490 ++++ index.html | 1501 ++++ installation/index.html | 1396 ++++ .../kg7qin-pr-integration-log/index.html | 1371 ++++ local-plugins/index.html | 1542 ++++ map-uploader/index.html | 1688 +++++ packet-capture/index.html | 1879 +++++ path-command-config/index.html | 1765 +++++ repeater-commands/index.html | 1745 +++++ repeater-prefix-collision-service/index.html | 1318 ++++ search/search_index.json | 1 + service-installation/index.html | 1927 +++++ service-plugins/index.html | 1396 ++++ sitemap.xml | 111 + sitemap.xml.gz | Bin 0 -> 450 bytes telegram-bridge/index.html | 1450 ++++ upgrade/index.html | 1663 ++++ weather-service/index.html | 1747 +++++ web-viewer/index.html | 1796 +++++ 75 files changed, 53345 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 FEEDS/index.html create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.79ae519e.min.js create mode 100644 assets/javascripts/bundle.79ae519e.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.el.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.he.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.2c215733.min.js create mode 100644 assets/javascripts/workers/search.2c215733.min.js.map create mode 100644 assets/stylesheets/main.484c7ddc.min.css create mode 100644 assets/stylesheets/main.484c7ddc.min.css.map create mode 100644 assets/stylesheets/palette.ab4e12ef.min.css create mode 100644 assets/stylesheets/palette.ab4e12ef.min.css.map create mode 100644 checkin-api/index.html create mode 100644 command-reference-website/index.html create mode 100644 command-reference/index.html create mode 100644 config-validation/index.html create mode 100644 configuration/index.html create mode 100644 data-retention/index.html create mode 100644 discord-bridge/index.html create mode 100644 docker/index.html create mode 100644 earthquake-service/index.html create mode 100644 faq/index.html create mode 100644 getting-started/index.html create mode 100644 index.html create mode 100644 installation/index.html create mode 100644 integration/kg7qin-pr-integration-log/index.html create mode 100644 local-plugins/index.html create mode 100644 map-uploader/index.html create mode 100644 packet-capture/index.html create mode 100644 path-command-config/index.html create mode 100644 repeater-commands/index.html create mode 100644 repeater-prefix-collision-service/index.html create mode 100644 search/search_index.json create mode 100644 service-installation/index.html create mode 100644 service-plugins/index.html create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz create mode 100644 telegram-bridge/index.html create mode 100644 upgrade/index.html create mode 100644 weather-service/index.html create mode 100644 web-viewer/index.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..365ab45 --- /dev/null +++ b/404.html @@ -0,0 +1,1247 @@ + + + +
+ + + + + + + + + + + + + + + + + + + +The Feed Management system allows the bot to subscribe to RSS feeds and REST APIs, automatically polling for new content and posting updates to specified mesh channels.
+The feed manager supports two feed types: +- RSS Feeds: Standard RSS/Atom feeds +- API Feeds: REST API endpoints returning JSON data
+Both feed types support: +- Configurable polling intervals +- Custom message formatting +- Item filtering +- Sorting +- Automatic deduplication +- Rate limiting
+Configure feed manager behavior in config.ini:
[Feed_Manager]
+# Enable/disable feed manager
+feed_manager_enabled = true
+
+# Default check interval (seconds)
+default_check_interval_seconds = 300
+
+# Maximum items to process per check
+max_items_per_check = 10
+
+# HTTP request timeout (seconds)
+feed_request_timeout = 30
+
+# User agent for HTTP requests
+feed_user_agent = MeshCoreBot/1.0 FeedManager
+
+# Rate limit between requests to same domain (seconds)
+feed_rate_limit_seconds = 5.0
+
+# Maximum message length (characters)
+max_message_length = 130
+
+# Default output format
+default_output_format = {emoji} {body|truncate:100} - {date}\n{link|truncate:50}
+
+# Default interval between sending queued messages (seconds)
+default_message_send_interval_seconds = 2.0
+
+# Shorten item link URLs via [External_Data] short_url_website (v.gd / is.gd)
+shorten_urls = false
+
+# Or shorten only where the format says {link|shorten} (see placeholders below)
+Per-output-format URL shortening: use {link|shorten} for a single shortened link, or {link|shorten|truncate:N} to shorten then cap length. shorten_urls = true shortens every plain {link}.
The web interface provides separate input fields for each configuration option. Below are examples showing the values to enter in each field.
+Feed Type: rss
+Feed URL: https://example.com/rss.xml
+Channel: #alerts
+Feed Name (Optional): Example RSS Feed
+Check Interval (seconds): 300
+Output Format: (leave empty to use default)
+Message Send Interval (seconds): 2.0
+Filter Configuration: (leave empty)
+Sort Configuration: (leave empty)
Feed Type: rss
+Feed URL: https://example.com/rss.xml
+Channel: #alerts
+Feed Name (Optional): Emergency Alerts
+Check Interval (seconds): 60
+Output Format:
+
2.0Feed Type: api
+Feed URL: https://api.example.com/alerts
+Channel: #alerts
+Feed Name (Optional): API Alerts
+Check Interval (seconds): 300
+Output Format: (leave empty to use default)
+Message Send Interval (seconds): 2.0
+API Configuration (JSON):
+
{
+ "method": "GET",
+ "headers": {},
+ "params": {
+ "api_key": "your-api-key"
+ },
+ "response_parser": {
+ "items_path": "data.alerts",
+ "id_field": "id",
+ "title_field": "title",
+ "description_field": "description",
+ "timestamp_field": "created_at"
+ }
+}
+Feed Type: api
+Feed URL: https://wsdot.wa.gov/Traffic/api/HighwayAlerts/HighwayAlertsREST.svc/GetAlertsAsJson
+Channel: #traffic
+Feed Name (Optional): WSDOT Highway Alerts
+Check Interval (seconds): 300
+Output Format:
+
{emoji} [{raw.Priority|switch:highest:🔴:high:🟠:medium:🟡:⚪}] {title|truncate:80}
+{raw.EventCategory} | {raw.Region} | {raw.EventStatus}
+{body|truncate:70}
+2.0{
+ "method": "GET",
+ "headers": {},
+ "params": {
+ "AccessCode": "your-access-code"
+ },
+ "response_parser": {
+ "items_path": "",
+ "id_field": "AlertID",
+ "title_field": "HeadlineDescription",
+ "description_field": "ExtendedDescription",
+ "timestamp_field": "LastUpdatedTime"
+ }
+}
+{
+ "conditions": [
+ {
+ "field": "raw.EventCategory",
+ "operator": "in",
+ "values": ["Alert", "Closure"]
+ }
+ ],
+ "logic": "OR"
+}
+The output format string controls how feed items are formatted before sending to channels.
+{title} - Item title{body} - Item description/body text{date} - Relative time (e.g., "5m ago", "2h 30m ago"){link} - Item URL{emoji} - Auto-selected emoji based on feed name (📢, 🚨, ⚠️, ℹ️){raw.field} - Access raw API data fields (API feeds only){raw.nested.field} - Access nested API fields (e.g., {raw.StartRoadwayLocation.RoadName})Apply functions to placeholders using the pipe operator:
+{field|auto} - Use the remaining characters up to max_message_length (from [Feed_Manager]). The format string is read left to right: every placeholder before {field|auto} is rendered, then every placeholder after it; the space left in the message is filled with that field’s text. If the text is longer than that space, it is cut with ... (same idea as truncate:N). Use at most one {field|auto} per format. If more than one appears, the bot logs a warning, only the first expands, and any extra {field|auto} render empty. If the fixed prefix and suffix already exceed max_message_length, the auto segment is empty and the normal end-of-message truncation may still run.
{field|truncate:N} - Truncate to N characters
{field|word_wrap:N} - Wrap at N characters, breaking at word boundaries{field|first_words:N} - Take first N wordsExamples: +
+Extract specific content using regex patterns:
+{field|regex:pattern} - Extract using regex (uses first capture group){field|regex:pattern:group} - Extract specific capture group (0 = whole match, 1 = first group, etc.)Examples: +
+{field|if_regex:pattern:then:else} - If pattern matches, return "then", else return "else"{field|switch:value1:result1:value2:result2:...:default} - Multi-value conditionalExamples: +
{raw.Priority|switch:highest:🔴:high:🟠:medium:🟡:⚪}
+{body|if_regex:No restrictions:👍:Restrictions apply}
+{field|regex_cond:extract_pattern:check_pattern:then:group} - Extract text, check if it matches pattern, return "then" if match, else return extracted textExample: +
+Filter configuration determines which items are sent to channels.
+{
+ "conditions": [
+ {
+ "field": "raw.Priority",
+ "operator": "in",
+ "values": ["highest", "high"]
+ },
+ {
+ "field": "raw.EventStatus",
+ "operator": "equals",
+ "value": "open"
+ }
+ ],
+ "logic": "AND"
+}
+equals - Exact matchnot_equals - Not equalin - Value in listnot_in - Value not in listmatches - Regex matchnot_matches - Regex does not matchcontains - String contains valuenot_contains - String does not contain valuewithin_days - Item timestamp is within the last N calendar days (rolling window from now, UTC)within_weeks - Same as within_days with N × 7 days (e.g. four weeks ≈ within_weeks 4 or within_days 28)within_days / within_weeks require a field pointing at a date (same paths as sort: published for RSS, or raw.SomeTimeField for APIs). They also require days or weeks respectively.
If the date is missing or cannot be parsed, the condition fails (item is excluded). Set "include_if_missing": true on that condition to treat missing/unparseable dates as a pass instead.
Examples:
+{
+ "conditions": [
+ {
+ "field": "published",
+ "operator": "within_days",
+ "days": 28
+ }
+ ],
+ "logic": "AND"
+}
+{
+ "conditions": [
+ {
+ "field": "raw.LastUpdatedTime",
+ "operator": "within_weeks",
+ "weeks": 4
+ }
+ ],
+ "logic": "AND"
+}
+Date parsing for filters matches sorting: ISO strings, Microsoft /Date(...)/, Unix timestamps (seconds or milliseconds), and common string formats.
AND - All conditions must match (default)OR - Any condition matchesFor API feeds, use raw.field or raw.nested.field to access API response fields:
+- raw.Priority
+- raw.EventStatus
+- raw.StartRoadwayLocation.RoadName
For RSS feeds, use published for the item publication time in within_days / within_weeks conditions.
Sort items before processing:
+ +field - Field path to sort by (e.g., raw.LastUpdatedTime, raw.Priority, published)order - asc (ascending) or desc (descending)The sort function supports:
+- ISO format dates
+- Microsoft JSON date format: /Date(timestamp-offset)/ (e.g., WSDOT API)
+- Unix timestamps
+- Common date string formats
Messages are queued and sent at configured intervals to prevent rate limiting:
+message_send_interval_seconds - Time between sending messages from the same feed (default: 2.0 seconds)The system automatically prevents duplicate posts:
+The feed manager implements rate limiting:
+feed_rate_limit_secondsThe feed management system includes a web interface accessible at /feeds:
Feeds can be managed via mesh commands. The feed command requires admin access and must be sent as a direct message (DM) to the bot. The command is enabled by default.
+Command Format: feed <subcommand> [arguments] (DM only)
feed subscribe <rss|api> <url> <channel> [name] [api_config] - Subscribe to a feedfeed unsubscribe <id|url> [channel] - Unsubscribe from a feed (by ID or URL)feed list [channel] - List all feed subscriptions (optionally filtered by channel)feed status <id> - Show detailed status for a feedfeed enable <id> - Enable a feed subscriptionfeed disable <id> - Disable a feed subscriptionfeed update <id> [interval_seconds] - Update feed settingsfeed test <url> - Test/validate a feed URLfeed subscribe rss https://alerts.example.com/rss emergency "Emergency Alerts"
+feed subscribe api https://api.example.com/alerts emergency "API Alerts" '{"headers": {"Authorization": "Bearer TOKEN"}}'
+feed list
+feed list #alerts
+feed status 1
+feed enable 1
+feed disable 1
+feed unsubscribe 1
+feed update 1 60
+Note: The feed command requires admin access. API feeds require JSON configuration as the last argument when subscribing.
+Check Intervals: Set appropriate intervals based on feed update frequency (60-300 seconds typical)
+Message Formatting: Keep messages under 130 characters for mesh compatibility
+Filtering: Use filters to reduce noise and only send relevant items
+Rate Limiting: Respect feed source rate limits by configuring appropriate intervals
+Error Handling: Monitor feed errors in the web interface and adjust configuration as needed
+Testing: Use the preview feature in the web interface to test output formats before enabling feeds
+feed_manager_enabled = true in configlast_item_id is being updated correctlyfeed_rate_limit_seconds in configmessage_send_interval_seconds for specific feedscheck_interval_seconds to poll less frequently0&&i[i.length-1])&&(p[0]===6||p[0]===2)){r=0;continue}if(p[0]===3&&(!i||p[1]>i[0]&&p[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function K(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],s;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(a){s={error:a}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(s)throw s.error}}return i}function B(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o