From dbb9fb5977a1a13e928b68f4176e415fd30c11a5 Mon Sep 17 00:00:00 2001 From: Carlo Costanzo Date: Mon, 23 Feb 2026 09:21:38 -0500 Subject: [PATCH] Refactor Telegram message sending logic to support resilient plain-text messages with chunking and fallback mechanisms. Enhance error handling for message delivery failures. --- config/packages/telegram_bot.yaml | 64 ++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 5 deletions(-) diff --git a/config/packages/telegram_bot.yaml b/config/packages/telegram_bot.yaml index ffc5b7e2..ede94498 100644 --- a/config/packages/telegram_bot.yaml +++ b/config/packages/telegram_bot.yaml @@ -7,19 +7,73 @@ # Script wrappers for Telegram messaging using UI-configured integration. # ------------------------------------------------------------------- # Notes: Do not add `telegram_bot:` YAML here; integration is UI-only. +# Notes: Joanna transport sends as plain_text to avoid Telegram parse-entity failures. ###################################################################### script: joanna_send_telegram: alias: Joanna Send Telegram - description: Sends a Telegram message to Carlo's allowed chat id. + description: Sends resilient plain-text Telegram messages with chunking + fallback. mode: queued fields: message: description: Message body to send. example: Joanna is online. sequence: - - service: telegram_bot.send_message - data: - target: !secret telegram_allowed_chat_id_carlo - message: "{{ message }}" + - variables: + chunk_size: 3400 + normalized_message: >- + {% set raw = message | default('', true) | string %} + {{ raw | replace('\r\n', '\n') | replace('\r', '\n') | trim }} + safe_message: >- + {% if normalized_message | length > 0 %} + {{ normalized_message }} + {% else %} + Joanna: (empty message) + {% endif %} + total_chunks: >- + {% set size = chunk_size | int(3400) %} + {% set length = safe_message | length %} + {{ ((length + size - 1) // size) if length > 0 else 1 }} + - repeat: + count: "{{ total_chunks | int(1) }}" + sequence: + - variables: + start: "{{ repeat.index0 * (chunk_size | int(3400)) }}" + stop: "{{ start + (chunk_size | int(3400)) }}" + chunk_body: "{{ safe_message[start:stop] }}" + chunk_message: >- + {% if (total_chunks | int(1)) > 1 %} + [{{ repeat.index }}/{{ total_chunks }}] + {{ chunk_body }} + {% else %} + {{ chunk_body }} + {% endif %} + fallback_message: >- + {{ chunk_message + | regex_replace(find='[\x00-\x08\x0B\x0C\x0E-\x1F]', replace=' ') + | trim }} + telegram_send_response: null + - action: telegram_bot.send_message + continue_on_error: true + data: + target: !secret telegram_allowed_chat_id_carlo + message: "{{ chunk_message }}" + parse_mode: plain_text + disable_web_page_preview: true + response_variable: telegram_send_response + - choose: + - conditions: + - condition: template + value_template: >- + {{ telegram_send_response is none + or telegram_send_response.chats is not defined + or (telegram_send_response.chats | count) == 0 }} + sequence: + - action: telegram_bot.send_message + continue_on_error: true + data: + target: !secret telegram_allowed_chat_id_carlo + message: "{{ fallback_message if fallback_message | length > 0 else 'Joanna: message delivery fallback (content omitted)' }}" + parse_mode: plain_text + disable_web_page_preview: true