#!/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 &