/
signal-to-inbox
executable file
·125 lines (108 loc) · 3.76 KB
/
signal-to-inbox
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
#! /bin/sh
. $HOME/scripts/personal/signal_number.sh
INBOX=$HOME/org/0_inbox
XDG_DATA_HOME=${XDG_DATA_HOME:-$HOME/.local/share}
CACHE_DIR=$XDG_DATA_HOME/signal-cli
ERROR_LOG=$CACHE_DIR/error.log
ATTACHMENT_DIR="$CACHE_DIR/attachments"
NUMBERS_WHITELIST=$HOME/scripts/personal/signal-numbers-whitelist
if [ "$1" = "--help" ] || [ "$1" = "-h" ] || [ "$1" = "help" ]; then
cat <<EOF
$ signal-to-inbox
Receive signal messages and sort them into the inbox
Prerequisite is to register the number with signal
EOF
exit
fi
command -v signal-cli >/dev/null || { echo "signal-cli is not installed" 1>&2; exit 127; }
CACHE_FILE="$CACHE_DIR/received-messages-$(date +%s)"
is_whitelisted() {
local number="$1"
if grep "$number" $NUMBERS_WHITELIST >/dev/null; then
true
else
false
fi
}
receive() {
signal-cli -a $SIGNAL_NUMBER receive --ignore-stories --send-read-receipts >$CACHE_FILE 2>/tmp/signal-cli-errors ||
echo "Receiving signal messages failed!\nRun the script manually or consult /tmp/signal-cli-errors" >$INBOX/signal-cli-errors
}
parseMessages() {
if [ -z "$(cat $CACHE_FILE)" ]; then
rm $CACHE_FILE
else
N=0
BODY=""
ATTACHMENT=""
ignore_message=0
attachment_count=1
is_multiline=0
multiline_body_done=0
while read line; do
if [ -n "$BODY" ] && [ "$multiline_body_done" -eq 0 ]; then
if echo $line | grep -ve "^Expires in:" >/dev/null; then
BODY="${BODY}\n$line"
is_multiline=1
else
multiline_body_done=1
fi
fi
has_envelope=`echo $line | grep -Po "^Envelope from: .+?\K\+\d+"`
if [ -n "$has_envelope" ] && ! is_whitelisted "$has_envelope"; then
ignore_message=1
fi
has_body=`echo $line | grep -Po "^Body: \K.+"`
if [ -n "$has_body" ]; then
BODY="$has_body"
fi
has_filename=`echo $line | grep -Po "Filename: \K.+"`
if [ -n "$ATTACHMENT" ] && [ -n "$has_filename" ] && [ "$ignore_message" -eq 0 ]; then
cp "$ATTACHMENT_DIR/$ATTACHMENT" "$INBOX/$has_filename"
ATTACHMENT=""
attachment_count=$((${attachment_count}+1))
fi
has_attachement=`echo $line | grep -Po "Id: \K.+"`
if [ -n "$has_attachement" ] && [ "$ignore_message" -eq 0 ]; then
if [ -n "$ATTACHMENT" ]; then
if [ -n "$BODY" ]; then
cp "$ATTACHMENT_DIR/$ATTACHMENT" "$INBOX/$BODY-$attachment_count.${ATTACHMENT##*.}" 2>$ERROR_LOG
else
cp "$ATTACHMENT_DIR/$ATTACHMENT" $INBOX/ 2>$ERROR_LOG
fi
ATTACHMENT=""
fi
ATTACHMENT="$has_attachement"
fi
if [ -z "$line" ] && ([ "$is_multiline" -eq 0 ] || [ "$multiline_body_done" -eq 1 ]); then # reset
if [ -n "$BODY" ] && [ -z "$ATTACHMENT" ] && [ "$ignore_message" -eq 0 ]; then
body_shortend=`echo $BODY | tr "\n" " " | cut -c-50`
filename=$body_shortend
if echo $body_shortend | grep ":" >/dev/null; then
filename=`echo $body_shortend | cut -d: -f1`
fi
# write text contents to file
echo "$BODY" | grep -v "generated by https://otter.ai" >"$INBOX/${filename}.norg"
fi
if [ -n "$ATTACHMENT" ] && [ "$ignore_message" -eq 0 ]; then
if [ -n "$BODY" ]; then
cp "$ATTACHMENT_DIR/$ATTACHMENT" "$INBOX/$BODY-$attachment_count.${ATTACHMENT##*.}" 2>$ERROR_LOG
else
cp "$ATTACHMENT_DIR/$ATTACHMENT" $INBOX/ 2>$ERROR_LOG
fi
fi
N=$((${N}+1))
BODY=""
ATTACHMENT=""
attachment_count=1
multiline_body_done=0
is_multiline=0
ignore_message=0
fi
done <$CACHE_FILE
fi
}
~/scripts/cron/waitforinternet
~/scripts/cron/cron-notify-send "Receiving notes from signal"
receive
parseMessages