blob: 3d87726f20da528dcd0e59ee4d2fc692eaaa9617 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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
|