You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
3.0 KiB

#!/usr/bin/env bash
# This is where sms messages will be stored
SMS_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/SMS/"
FILE="$(mktemp)"
die(){
echo "$@" > /dev/stderr
rm "$FILE"
exit 1
}
usage(){
echo "sendSMS [options] [message|-]"
echo "Options:"
echo " -e|--edit Edit the message"
echo " -h|--help Display this help text"
echo " -m|--modem Specify a modem"
echo " -n|--number Specify a number"
echo " --dry-run Don't actually send the message"
}
mkdir -p "$SMS_DIR"
number=""
dryrun="false"
edit="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)"
# Iterate over options breaking -ab into -a -b when needed and --foo=bar into
# --foo bar
optstring=h
unset options
while (($#)); do
case $1 in
# If option is of type -ab
-[!-]?*)
# Loop over each character starting with the second
for ((i=1; i < ${#1}; i++)); do
c=${1:i:1}
# Add current char to options
options+=("-$c")
# If option takes a required argument, and it's not the last char make
# the rest of the string its argument
if [[ $optstring = *"$c:"* && ${1:i+1} ]]; then
options+=("${1:i+1}")
break
fi
done
;;
# If option is of type --foo=bar
--?*=*) options+=("${1%%=*}" "${1#*=}") ;;
# add --endopts for --
--) options+=(--endopts) ;;
# Otherwise, nothing special
*) options+=("$1") ;;
esac
shift
done
set -- "${options[@]}"
unset options
# Read the options and set stuff
while [[ $1 = -?* ]]; do
case $1 in
-e|--edit) edit="true" ;;
-h|--help) usage; exit;;
-m|--modem) modem="$2"; shift ;;
-n|--number) number="$2"; shift ;;
--dry-run) dryrun="true" ;;
--) shift; break ;;
*) die "invalid option: '$1'." ;;
esac
shift
done
# Store the remaining part as arguments.
args+=("$@")
# If the remaining argement is -, use stdin
if [ "${args[0]}" = "-" ]; then
cat - > "$FILE"
else
echo "${args[*]}" > "$FILE"
fi
# Die if no number
[ -z "$number" ] && die "No number provided"
# Die if no modem
[ -z "$modem" ] && [ "$dryrun" = "false" ] && die "No modem found"
if [ "$edit" = "true" ]; then
"$EDITOR" "$FILE"
fi
if [ "$dryrun" = "false" ]; then
# Creates the message using the text from file
messageNumber=$(
mmcli -m "$modem" --messaging-create-sms="number=$number,\
text='$(cat "$FILE" | sed "s/'/\\\'/g")'" | grep -o "[0-9]*$"
)
# Send the message
mmcli -s "$messageNumber" --send || die "Can't send message"
# If the messaeg is too long, the previous command will split it up (i think)
# The following loop will delete all sent messages from the modem storage
for i in $(mmcli -m "$modem" --messaging-list-sms | grep " (sent)" |
cut -f5 -d' ') ; do
mmcli -m "$modem" --messaging-delete-sms="$i"
done
fi
mkdir -p "$SMS_DIR/$number"
log="$SMS_DIR/$number/sms.log"
echo "SENT"
echo "RECIPIENT: $number" >> $log
echo "TIME: $(date)" >> $log
echo "----" >> $log
cat "$FILE" >> $log
# I assume nobody will be sending me messages with null bytes in them
printf '\00\n' >> $log