Much of the code that interfaces with the modem was taken from SXMO. Calling now works for both incoming and outgoing calls
265 lines
5.6 KiB
Bash
Executable file
265 lines
5.6 KiB
Bash
Executable file
#!/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 "Missed call from $contact" >> "$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
|
|
|
|
|
|
|