summaryrefslogtreecommitdiff
path: root/src/termux-sms-pipe
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