diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/termux-sms-pipe | 129 |
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 | ||
2 | set -e | ||
3 | shopt -s lastpipe | ||
4 | |||
5 | PS4=$'+\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 | |||
18 | poll_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 | |||
64 | poller_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 | |||
98 | Sleep() | ||
99 | { | ||
100 | echo -n . >&2 | ||
101 | sleep "$@" && | ||
102 | echo -ne '\b' | ||
103 | } | ||
104 | |||
105 | if ! [ "$NO_LAST_SEEN_FILE" ] | ||
106 | then | ||
107 | USE_LAST_SEEN_FILE=y | ||
108 | fi | ||
109 | |||
110 | libdir=~/.local/lib/termux-sms-pipe | ||
111 | mkdir -p "$libdir" | ||
112 | |||
113 | last_seen_file=$libdir/last-seen-sms-id | ||
114 | |||
115 | if (( $# == 0 )) | ||
116 | then | ||
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 | ||
125 | else | ||
126 | last_seen_id=$1 | ||
127 | fi | ||
128 | |||
129 | poller_loop | ||