From d8362e66ccbfdd6d2378363c0f82de9b2d005a68 Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Mon, 2 Sep 2024 11:40:53 -0400 Subject: termux-sms-pipe --- src/termux-sms-pipe | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100755 src/termux-sms-pipe diff --git a/src/termux-sms-pipe b/src/termux-sms-pipe new file mode 100755 index 0000000..3d87726 --- /dev/null +++ b/src/termux-sms-pipe @@ -0,0 +1,129 @@ +#!/bin/bash +set -e +shopt -s lastpipe + +PS4=$'+\t${LINENO@A}\t' + +# Usage: termux-sms-list [-d] [-l limit] [-n] [-o offset] [-t type] [-c] [-f number] +# List SMS messages. +# -l limit limit in retrieved sms list (default: 10) +# -o offset offset in sms list (default: 0) +# -t type the type of messages to list (default: all): +# all|inbox|sent|draft|outbox +# -c conversation list (unique item per conversation) +# -f number the number for locate messages +# -n (obsolete) show phone numbers +# -d (obsolete) show dates when messages were created + +poll_sms() +{ + declare -g new= + declare -i r=0 i + declare finished= restarted= + for (( i=10 ; ; i*=10 )) + do + termux-sms-list -l $i | jq -rc '.[] | "\(._id) \(.)"' | + while read -t 5 -r id json || r=$? + do + if (( r > 128 )) + then + if [ ! "$restarted" ] + then + restarted=y + termux-api-start + continue + else + break 2 + fi + elif (( r != 0 )) + then + break + fi + if ! [ "$last_seen_id" ] + then + last_seen_id=$(( $id - 1 )) + finished=y + fi + if (( id <= last_seen_id + 1 )) + then + finished=y + fi + if (( id > last_seen_id )) + then + sms[$id]=$json + new=y + fi + done + if [ "$finished" ] + then + break + fi + done +} + +poller_loop() +{ + longer=60 + while true + do + echo -n '*' >&2 + poll_sms + echo -ne '\b' >&2 + if [ "$new" ] + then + echo >&2 + for (( i=$last_seen_id + 1; ; ++i )) + do + [ "${sms[$i]}" ] || break + printf '%d ' "$i" >&2 + printf '%s\n' "${sms[$i]}" + last_seen_id=$i + if [ "$USE_LAST_SEEN_FILE" ] + then + echo "$last_seen_id" >"$last_seen_file" + fi + done + Sleep 5 + longer=5 + else + Sleep $longer + if (( longer < 60 )) + then + let longer++ + fi + fi + done +} + +Sleep() +{ + echo -n . >&2 + sleep "$@" && + echo -ne '\b' +} + +if ! [ "$NO_LAST_SEEN_FILE" ] +then + USE_LAST_SEEN_FILE=y +fi + +libdir=~/.local/lib/termux-sms-pipe +mkdir -p "$libdir" + +last_seen_file=$libdir/last-seen-sms-id + +if (( $# == 0 )) +then + if [ "$USE_LAST_SEEN_FILE" -a -e "$last_seen_file" ] + then + exec {LAST_SEEN_FILE_FD}< "$last_seen_file" + flock -n $LAST_SEEN_FILE_FD + read last_seen_id < "$last_seen_file" + else + last_seen_id= + fi +else + last_seen_id=$1 +fi + +poller_loop -- cgit v1.2.3