Unlike SXMO, I have opted to use rofi to prompt for an incoming call. This allows me to have accept and decline buttons easily rather than multiple notifications.
142 lines
3.2 KiB
Bash
Executable file
142 lines
3.2 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
|
|
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
|
source "$DIR/common"
|
|
|
|
usage(){
|
|
echo "checkCall [options] [message|-]"
|
|
echo "Options:"
|
|
echo " -h|--help Display this help text"
|
|
echo " -m|--modem Specify a modem"
|
|
echo " --dry-run Don't actually send the message"
|
|
}
|
|
|
|
|
|
# Stolen from sxmo
|
|
lookupnumberfromcallid() {
|
|
local id=$1
|
|
mmcli -m "$modem" --voice-list-calls -o "$id" -K |
|
|
grep call.properties.number |
|
|
cut -d ':' -f 2 |
|
|
tr -d ' '
|
|
}
|
|
|
|
lookupcontact(){
|
|
echo "$1" |
|
|
# Remove the +44 and replace with 0
|
|
sed 's/^\+44/0/'
|
|
# This will eventually work with abook but for now just return the number
|
|
}
|
|
|
|
answer-call(){
|
|
export DISPLAY=:0.0
|
|
echo "answer call $1" > /dev/tty
|
|
mmcli -m "$modem" -o "$1" --accept
|
|
}
|
|
|
|
reject-call(){
|
|
mmcli -m "$modem" -o "$1" --hangup
|
|
}
|
|
|
|
prompt-incoming(){
|
|
export DISPLAY=:0.0
|
|
|
|
local answer=""
|
|
local reject=""
|
|
|
|
local choice=''
|
|
# Used for testing
|
|
local contact="${1:-01234 567890}"
|
|
|
|
local prompt="$(echo -en "Incoming Call\n$contact")"
|
|
|
|
choice="$(echo -e "$answer\n$reject" | rofi -dmenu -i \
|
|
-theme themes/incoming-call.rasi -a 0 -u 1 \
|
|
-p "$prompt" \
|
|
-window-title "call-from-$contact" \
|
|
-me-select-entry '' -me-accept-entry MousePrimary)"
|
|
|
|
case "$choice" in
|
|
"$answer") echo "accept" ;;
|
|
"$reject") echo "reject" ;;
|
|
esac
|
|
}
|
|
|
|
mkdir -p "$CALL_DIR"
|
|
|
|
dryrun="false"
|
|
|
|
# Assume we want the first modem
|
|
# can be overwritten by the -m option
|
|
modem="$(mmcli -L | grep -oE 'Modem\/[0-9]+' | head -n 1 | cut -d'/' -f2)"
|
|
|
|
|
|
|
|
# Read the options and set stuff
|
|
while [[ $1 = -?* ]]; do
|
|
case $1 in
|
|
-h|--help) usage; exit;;
|
|
-m|--modem) modem="$2"; shift ;;
|
|
--dry-run) dryrun="true" ;;
|
|
--) shift; break ;;
|
|
*) die "invalid option: '$1'." ;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
|
|
checkIncoming(){
|
|
export DISPLAY=:0.0
|
|
local id="$( mmcli -m "$modem" --voice-list-calls |
|
|
grep -Eo '[0-9]+ incoming \(ringing-in\)' | grep -Eo '[0-9]+' )"
|
|
|
|
local count="$(echo "$id" | deleteEmptyLines | wc -l)"
|
|
|
|
[ "$count" -eq 0 ] && return
|
|
|
|
local number="$(lookupnumberfromcallid "$id")"
|
|
local contact="$(lookupcontact "$number")"
|
|
|
|
local action=""
|
|
while mmcli -m "$modem" --voice-list-calls | grep -Eoq "$id"' incoming \(ringing-in\)' && [ -z "$action" ]; do
|
|
action="$(prompt-incoming "$contact")"
|
|
done
|
|
case "$action" in
|
|
"accept") answer-call "$id"; break ;;
|
|
"reject") reject-call "$id"; break ;;
|
|
esac
|
|
|
|
}
|
|
|
|
checkFinished(){
|
|
local ids="$( mmcli -m "$modem" --voice-list-calls |
|
|
grep -Eo '[0-9]+ incoming \(terminated\)' | grep -Eo '[0-9]+' )"
|
|
|
|
local count="$(echo "$ids" | deleteEmptyLines | wc -l)"
|
|
|
|
[ "$count" -eq 0 ] && return
|
|
|
|
|
|
echo "$ids" | while read -r id; do
|
|
# Delete from the modem
|
|
local number="$(lookupnumberfromcallid "$id")"
|
|
local contact="$(lookupcontact "$number")"
|
|
|
|
# If there is a rofi process with the title of "call-from-number", then
|
|
# it hasn't been answerd yet.
|
|
# Treat as a missed call
|
|
if ps aux | grep -E '\Wrofi' | grep -q "call-from-$number"; then
|
|
echo "Missed call from $contact" >> "$CALL_DIR/missed-calls"
|
|
mmcli -m "$modem" --voice-delete-call "$id"
|
|
ps aux | grep -E '\Wrofi' | grep "call-from-$number" |
|
|
awk '{print $2}' | xargs kill
|
|
fi
|
|
|
|
|
|
|
|
done
|
|
}
|
|
|
|
checkIncoming &
|
|
checkFinished &
|