mirror of
https://github.com/docwho76/sendmsg.git
synced 2026-08-31 01:41:10 -07:00
5.8 KiB
5.8 KiB
Changelog
All notable changes to sendmsg are documented here.
5.1.0
Added
- Multiple recipients per Signal send:
--recipientsnow accepts more than one value, and--toaccepts multiple numbers, so a single invocation can fan out to several groups and/or direct recipients. Each target is sent independently and reported individually; the command exits non-zero if any target fails. --jsonCSV summary: Emits a machine-readable JSON summary (totals, per-bucket counts, and notes) for unattended runs, as an alternative to the formatted text summary.- SMS timeout and retry:
imsginvocations now run with a 60-second timeout and are retried up to 3 times with backoff on timeout or transient failure, matching the resilience of the Signal REST path. Previously a hung Messages app could stall an entire batch and SMS sends had no retry. - Startup configuration warnings: A
signal_rest_urlthat is not a well-formedhttp(s)://URL now warns at startup, and attempting a Signal send from the built-in placeholder account (+1234567890) warns that no real account is configured.
Changed
- Skip vs. fail accounting corrected. Intentional skips — unknown
method, missing/invalid SMSservice,voiceon an SMS row, and empty messages — are now counted under Skipped rather than Failed. The process exit code is1only when a genuine send fails, so deliberate skips no longer cause unattended runs to report failure. - Dry runs no longer report sends as successful. A
--dry-runnow reports a separate "would send" count instead of incrementing the success total for rows that were never sent. - Empty-message skip notes now distinguish SMS rows (which always require text) from Signal rows (which may be attachment- or voice-only).
Fixed
--link-signalfalse success: The account snapshot used for new-link detection now tolerates all response shapes returned by the REST API (bare list,{"accounts": [...]}, and{"number": ...}). Previously a dict-shaped response produced an empty baseline, so any pre-existing account could be misreported as a newly linked device. Account listing and link detection now share one shape-tolerant helper.- The
--helpepilog and module docstring CSV column lists now include thevoicecolumn, matching the documented CSV format and the code.
5.0.0
Added
- Voice messages:
--voice <audio>sends an audio file (.m4a,.aac,.ogg,.opus,.mp3,.wav) as a Signal voice note. Delivered with the REST API'svoiceflag so it renders as a playable voice note rather than a file attachment. Also supported in CSV bulk sends via a newvoicecolumn (Signal rows only; voice-only rows with no message text are allowed). --dry-run: Preview a CSV batch — every row is reported (group/file/service noted) without anything being sent.- Large-batch confirmation: CSV sends of more than 50 rows now prompt for confirmation.
--yes/-yskips the prompt for unattended runs. - Retry with backoff: Transient Signal REST failures (HTTP 429/500/502/503/504 and network errors) are retried up to 3 times with increasing delay.
- Attachment size guard: Attachments larger than 100 MB are rejected before encoding, with a warning.
Changed
- SMS service is now explicit. The
autoservice option has been removed.--serviceaccepts onlyimessageorsms, and is required for--sms. CSVsmsrows must specify a validserviceor they are skipped and reported. - CSV
signalrows may now be attachment-only (no message text). Previously any row without amessagewas skipped, which silently dropped valid attachment-only Signal sends. SMS rows still require text. - Signal attachments can now be sent multiple at a time from any path, including CSV.
- The CSV summary now distinguishes skipped rows from failed rows.
Fixed
- Bare (no
+) phone numbers are no longer mis-detected as Signal group IDs; group detection and phone-number detection now agree. - Recipients are consistently normalized with a leading
+on both the direct--topath and CSV rows. - Multi-attachment Signal sends now report overall success/failure correctly instead of reflecting only the last file's result.
- Choosing more than one action (e.g.
--list-signal --link-signal) is now rejected instead of silently running the first. --link-signalsnapshots existing accounts and only reports success when a genuinely new account appears, fixing the false "Device linked!" when a primary account was already present.imsgpresence is checked before invocation, producing a clean error instead of an uncaughtFileNotFoundError.- Removed a redundant internal assignment in the REST POST helper.
4.3.0
- Fixed: Signal attachments now send correctly. Files are base64-encoded and delivered in the JSON request body via
base64_attachments; the previous multipart upload was rejected by the Signal REST API with HTTP 400. - Attachment filename and MIME type are now preserved using a data-URI form.
4.2.0
- Added:
--show-configto report resolved settings and their sources (-valso checks REST API reachability). - Config resolution rewritten to correctly source-track values and avoid empty values silently falling through to defaults.
4.1.0
- Fixed: CSV attachment paths using
~are now expanded, so Signal/SMS attachments from CSV rows are no longer silently dropped. - Fixed (issue #3): Group messages are detected robustly; raw (non-
group.) group IDs are no longer mis-sent down the direct-message path. - Fixed: Multipart text/bytes join crash; consistent
+normalization of account numbers; global--delaynow applies between rows; missing files are skipped with a warning instead of being passed to the sender; duplicate/dead Signal send branches collapsed.
4.0.0
- First public release, MVP status. Earlier versions were internal only builds.