summaryrefslogtreecommitdiff
path: root/src/termux-sms-pipe
diff options
context:
space:
mode:
authorAndrew Cady <d@jerkface.net>2024-09-02 11:40:53 -0400
committerAndrew Cady <d@jerkface.net>2024-09-02 11:41:27 -0400
commitd8362e66ccbfdd6d2378363c0f82de9b2d005a68 (patch)
tree8564aeab268e61d8c5d2fede03dfabba96f1183c /src/termux-sms-pipe
parent2db546a062606f280376cc5c7c0ae528d0121cab (diff)
termux-sms-pipeHEADmaster
Diffstat (limited to 'src/termux-sms-pipe')
-rwxr-xr-xsrc/termux-sms-pipe129
1 files changed, 129 insertions, 0 deletions
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 @@
1#!/bin/bash
2set -e
3shopt -s lastpipe
4
5PS4=$'+\t${LINENO@A}\t'
6
7# Usage: termux-sms-list [-d] [-l limit] [-n] [-o offset] [-t type] [-c] [-f number]
8# List SMS messages.
9# -l limit limit in retrieved sms list (default: 10)
10# -o offset offset in sms list (default: 0)
11# -t type the type of messages to list (default: all):
12# all|inbox|sent|draft|outbox
13# -c conversation list (unique item per conversation)
14# -f number the number for locate messages
15# -n (obsolete) show phone numbers
16# -d (obsolete) show dates when messages were created
17
18poll_sms()
19{
20 declare -g new=
21 declare -i r=0 i
22 declare finished= restarted=
23 for (( i=10 ; ; i*=10 ))
24 do
25 termux-sms-list -l $i | jq -rc '.[] | "\(._id) \(.)"' |
26 while read -t 5 -r id json || r=$?
27 do
28 if (( r > 128 ))
29 then
30 if [ ! "$restarted" ]
31 then
32 restarted=y
33 termux-api-start
34 continue
35 else
36 break 2
37 fi
38 elif (( r != 0 ))
39 then
40 break
41 fi
42 if ! [ "$last_seen_id" ]
43 then
44 last_seen_id=$(( $id - 1 ))
45 finished=y
46 fi
47 if (( id <= last_seen_id + 1 ))
48 then
49 finished=y
50 fi
51 if (( id > last_seen_id ))
52 then
53 sms[$id]=$json
54 new=y
55 fi
56 done
57 if [ "$finished" ]
58 then
59 break
60 fi
61 done
62}
63
64poller_loop()
65{
66 longer=60
67 while true
68 do
69 echo -n '*' >&2
70 poll_sms
71 echo -ne '\b' >&2
72 if [ "$new" ]
73 then
74 echo >&2
75 for (( i=$last_seen_id + 1; ; ++i ))
76 do
77 [ "${sms[$i]}" ] || break
78 printf '%d ' "$i" >&2
79 printf '%s\n' "${sms[$i]}"
80 last_seen_id=$i
81 if [ "$USE_LAST_SEEN_FILE" ]
82 then
83 echo "$last_seen_id" >"$last_seen_file"
84 fi
85 done
86 Sleep 5
87 longer=5
88 else
89 Sleep $longer
90 if (( longer < 60 ))
91 then
92 let longer++
93 fi
94 fi
95 done
96}
97
98Sleep()
99{
100 echo -n . >&2
101 sleep "$@" &&
102 echo -ne '\b'
103}
104
105if ! [ "$NO_LAST_SEEN_FILE" ]
106then
107 USE_LAST_SEEN_FILE=y
108fi
109
110libdir=~/.local/lib/termux-sms-pipe
111mkdir -p "$libdir"
112
113last_seen_file=$libdir/last-seen-sms-id
114
115if (( $# == 0 ))
116then
117 if [ "$USE_LAST_SEEN_FILE" -a -e "$last_seen_file" ]
118 then
119 exec {LAST_SEEN_FILE_FD}< "$last_seen_file"
120 flock -n $LAST_SEEN_FILE_FD
121 read last_seen_id < "$last_seen_file"
122 else
123 last_seen_id=
124 fi
125else
126 last_seen_id=$1
127fi
128
129poller_loop