#!/usr/bin/env bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" source "$DIR/common" export DISPLAY=:0.0 usage(){ echo "checkCall [options]" 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 ' ' } # Stolen from sxmo toggleflag() { TOGGLEFLAG=$1 shift FLAGS="$*" echo -- "$FLAGS" | grep -- "$TOGGLEFLAG" >&2 && NEWFLAGS="$(echo -- "$FLAGS" | sed "s/$TOGGLEFLAG//g")" || NEWFLAGS="$(echo -- "$FLAGS $TOGGLEFLAG")" NEWFLAGS="$(echo -- "$NEWFLAGS" | sed "s/--//g; s/ / /g")" # shellcheck disable=SC2086 megiaudioroute $NEWFLAGS echo -- "$NEWFLAGS" } # Stolen from sxmo toggleflagset() { FLAGS="$(toggleflag "$1" "$FLAGS")" } lookupcontact(){ local contact="$(contact-numbers "$1" | cut -d ' ' -f 1)" if [ -n "$contact" ]; then echo "$contact" else echo "$1" | # Remove the +44 and replace with 0 sed 's/^\+44/0/' fi } dtmf(){ local id="$1" svkbd-numbers & local choice="$( ( echo "Exit" ) | rofi -dmenu -i -me-accept-entry '!MousePrimary' -p "Tones" -normal-window -font 'Iosevka 20' )" if [ "$choice" = "Exit" ]; then return fi echo "$choice" | grep -o '.' | while read -r tone; do sleep 0.5 mmcli -m "$modem" -o "$id" --send-dtmf="$tone" done pkill svkbd-numbers } ongoingCall(){ local id="$1" # Stolen from sxmo FLAGS=" " toggleflagset "-e" toggleflagset "-m" toggleflagset "-2" toggleflagset "-2" toggleflagset "-2" notify-send "I get here" while : ; do choice="$( ( echo "Hang Up" echo "DTMF Tones" echo "Volume Up" echo "Volume Down" ) | trofi)" case "$choice" in "Hang Up") rejectCall "$1"; break ;; "DTMF Tones") dtmf "$1" ;; "Volume"*) notify-send "Still need to implement" ;; esac done } answerCall(){ pkill mpv sleep 0.2 echo "answer call $1" > /dev/tty mmcli -m "$modem" -o "$1" --accept ongoingCall "$1" } rejectCall(){ pkill mpv echo "reject call $1" > /dev/tty mmcli -m "$modem" -o "$1" --hangup mmcli -m "$modem" --voice-delete-call="$1" mmcli -m "$modem" --voice-hangup-all for CALLID in $( mmcli -m "$modem" --voice-list-calls | grep -oE "Call\/[0-9]+" | cut -d'/' -f2); do echo mmcli -m "$modem" --voice-delete-call "$CALLID" > ~/.hangup.log done # Not sure why but sometimes the modem changes # To be sure, re-check the modem and delete all calls local tmpmodem="$(mmcli -L | grep -oE 'Modem\/[0-9]+' | head -n 1 | cut -d'/' -f2)" mmcli -m "$tmpmodem" --voice-hangup-all for CALLID in $( mmcli -m "$tmpmodem" --voice-list-calls | grep -oE "Call\/[0-9]+" | cut -d'/' -f2); do echo mmcli -m "$tmpmodem" --voice-delete-call "$CALLID" > ~/.hangup.log done alsactl --file "$ALSA_CONF_DIR/default_alsa_sound.conf" restore } promptIncoming(){ export DISPLAY=:0.0 local answer="" local reject="" local choice='' local contact="$1" 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 } checkOutgoing(){ export DISPLAY=:0.0 if [ "$dryrun" = "true" ]; then return fi notify-send "outgoing call" "$1" mmcli -m "$modem" -o "$1" --start ongoingCall "$1" } checkIncoming(){ export DISPLAY=:0.0 if [ "$dryrun" = "true" ]; then promptIncoming "+441234567890" return fi 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 mpv "$HOME/.local/share/soundeffects/ringtone" --loop & action="$(promptIncoming "$contact")" done case "$action" in "accept") answerCall "$id"; ;; "reject") rejectCall "$id"; ;; 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)" echo "Finished Count: $count" [ "$count" -eq 0 ] && return echo "$ids" | while read -r id; do # Delete from the modem local number="$(lookupnumberfromcallid "$id")" local contact="$(lookupcontact "$number")" echo "I get here" # 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-$contact"; then echo -e "$(date '+%s')\t$contact\t$number" >> "$CALL_DIR/missed-calls" pkill mpv mmcli -m "$modem" --voice-delete-call "$id" ps aux | grep -E '\Wrofi' | grep "call-from-$contact" | awk '{print $2}' | xargs kill fi done } 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 if [ -n "$1" ]; then checkOutgoing "$1" & else checkIncoming & checkFinished & fi