| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 | 
							- #!/usr/bin/env bash
 
- # notify-send.sh - drop-in replacement for notify-send with more features
 
- # Copyright (C) 2015 Vyacheslav Levit <dev@vlevit.org>
 
- # This program is free software: you can redistribute it and/or modify
 
- # it under the terms of the GNU General Public License as published by
 
- # the Free Software Foundation, either version 3 of the License, or
 
- # (at your option) any later version.
 
- # This program is distributed in the hope that it will be useful,
 
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
 
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
- # GNU General Public License for more details.
 
- # You should have received a copy of the GNU General Public License
 
- # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
- # Desktop Notifications Specification
 
- # https://developer.gnome.org/notification-spec/
 
- VERSION=0.1
 
- NOTIFY_ARGS=(--session
 
-              --dest org.freedesktop.Notifications
 
-              --object-path /org/freedesktop/Notifications)
 
- EXPIRE_TIME=-1
 
- APP_NAME="${0##*/}"
 
- REPLACE_ID=0
 
- URGENCY=1
 
- HINTS=()
 
- help() {
 
-     cat <<EOF
 
- Usage:
 
-   notify-send.sh [OPTION...] <SUMMARY> [BODY] - create a notification
 
- Help Options:
 
-   -?|--help                         Show help options
 
- Application Options:
 
-   -u, --urgency=LEVEL               Specifies the urgency level (low, normal, critical).
 
-   -t, --expire-time=TIME            Specifies the timeout in milliseconds at which to expire the notification.
 
-   -a, --app-name=APP_NAME           Specifies the app name for the icon
 
-   -i, --icon=ICON[,ICON...]         Specifies an icon filename or stock icon to display.
 
-   -c, --category=TYPE[,TYPE...]     Specifies the notification category.
 
-   -h, --hint=TYPE:NAME:VALUE        Specifies basic extra data to pass. Valid types are int, double, string and byte.
 
-   -p, --print-id                    Print the notification ID to the standard output.
 
-   -r, --replace=ID                  Replace existing notification.
 
-   -R, --replace-file=FILE           Store and load notification replace ID to/from this file.
 
-   -s, --close=ID                    Close notification.
 
-   -v, --version                     Version of the package.
 
- EOF
 
- }
 
- convert_type() {
 
-     case "$1" in
 
-         int) echo int32 ;;
 
-         double|string|byte) echo "$1" ;;
 
-         *) echo error; return 1 ;;
 
-     esac
 
- }
 
- make_hint() {
 
-     type=$(convert_type "$1")
 
-     [[ ! $? = 0 ]] && return 1
 
-     name="$2"
 
-     [[ "$type" = string ]] && value="\"$3\"" || value="$3"
 
-     echo "\"$name\": <$type $value>"
 
- }
 
- concat_hints() {
 
-     local result="$1"
 
-     shift
 
-     for s in "$@"; do
 
-         result="$result, $s"
 
-     done
 
-     echo "{$result}"
 
- }
 
- handle_output() {
 
-     if [[ -n "$STORE_ID" ]] ; then
 
-         sed 's/(uint32 \([0-9]\+\),)/\1/g' > $STORE_ID
 
-     elif [[ -z "$PRINT_ID" ]] ; then
 
-         cat > /dev/null
 
-     else
 
-         sed 's/(uint32 \([0-9]\+\),)/\1/g'
 
-     fi
 
- }
 
- notify () {
 
-     gdbus call "${NOTIFY_ARGS[@]}"  --method org.freedesktop.Notifications.Notify \
 
-           "$APP_NAME" "$REPLACE_ID" "$ICON" "$SUMMARY" "$BODY" \
 
-           [] "$(concat_hints "${HINTS[@]}")" "int32 $EXPIRE_TIME" | handle_output
 
- }
 
- notify_close () {
 
-     gdbus call "${NOTIFY_ARGS[@]}"  --method org.freedesktop.Notifications.CloseNotification "$1" >/dev/null
 
- }
 
- process_urgency() {
 
-     case "$1" in
 
-         low) URGENCY=0 ;;
 
-         normal) URGENCY=1 ;;
 
-         critical) URGENCY=2 ;;
 
-         *) echo "Unknown urgency $URGENCY specified. Known urgency levels: low, normal, critical."
 
-            exit 1
 
-            ;;
 
-     esac
 
- }
 
- process_category() {
 
-     IFS=, read -a categories <<< "$1"
 
-     for category in "${categories[@]}"; do
 
-         hint="$(make_hint string category "$category")"
 
-         HINTS=("${HINTS[@]}" "$hint")
 
-     done
 
- }
 
- process_hint() {
 
-     IFS=: read type name value <<< "$1"
 
-     if [[ -z "$name" ]] || [[ -z "$value" ]] ; then
 
-         echo "Invalid hint syntax specified. Use TYPE:NAME:VALUE."
 
-         exit 1
 
-     fi
 
-     hint="$(make_hint "$type" "$name" "$value")"
 
-     if [[ ! $? = 0 ]] ; then
 
-         echo "Invalid hint type \"$type\". Valid types are int, double, string and byte."
 
-         exit 1
 
-     fi
 
-     HINTS=("${HINTS[@]}" "$hint")
 
- }
 
- process_posargs() {
 
-     if [[ "$1" = -* ]] && ! [[ "$positional" = yes ]] ; then
 
-         echo "Unknown option $1"
 
-         exit 1
 
-     else
 
-         [[ -z "$SUMMARY" ]] && SUMMARY="$1" || BODY="$1"
 
-     fi
 
- }
 
- while (( $# > 0 )) ; do
 
-     case "$1" in
 
-         -\?|--help)
 
-             help
 
-             exit 0
 
-             ;;
 
-         -v|--version)
 
-             echo "${0##*/} $VERSION"
 
-             exit 0
 
-             ;;
 
-         -u|--urgency|--urgency=*)
 
-             [[ "$1" = --urgency=* ]] && urgency="${1#*=}" || { shift; urgency="$1"; }
 
-             process_urgency "$urgency"
 
-             ;;
 
-         -t|--expire-time|--expire-time=*)
 
-             [[ "$1" = --expire-time=* ]] && EXPIRE_TIME="${1#*=}" || { shift; EXPIRE_TIME="$1"; }
 
-             ;;
 
-         -a|--app-name|--app-name=*)
 
-             [[ "$1" = --app-name=* ]] && APP_NAME="${1#*=}" || { shift; APP_NAME="$1"; }
 
-             ;;
 
-         -i|--icon|--icon=*)
 
-             [[ "$1" = --icon=* ]] && ICON="${1#*=}" || { shift; ICON="$1"; }
 
-             ;;
 
-         -c|--category|--category=*)
 
-             [[ "$1" = --category=* ]] && category="${1#*=}" || { shift; category="$1"; }
 
-             process_category "$category"
 
-             ;;
 
-         -h|--hint|--hint=*)
 
-             [[ "$1" = --hint=* ]] && hint="${1#*=}" || { shift; hint="$1"; }
 
-             process_hint "$hint"
 
-             ;;
 
-         -p|--print-id)
 
-             PRINT_ID=yes
 
-             ;;
 
-         -r|--replace|--replace=*)
 
-             [[ "$1" = --replace=* ]] && REPLACE_ID="${1#*=}" || { shift; REPLACE_ID="$1"; }
 
-             ;;
 
-         -R|--replace-file|--replace-file=*)
 
-             [[ "$1" = --replace-file=* ]] && filename="${1#*=}" || { shift; filename="$1"; }
 
-             if [[ -s "$filename" ]]; then
 
-                 REPLACE_ID="$(< $filename)"
 
-             fi
 
-             STORE_ID="$filename"
 
-             ;;
 
-         -s|--close|--close=*)
 
-             [[ "$1" = --close=* ]] && close_id="${1#*=}" || { shift; close_id="$1"; }
 
-             notify_close "$close_id"
 
-             exit $?
 
-             ;;
 
-         --)
 
-             positional=yes
 
-             ;;
 
-         *)
 
-             process_posargs "$1"
 
-             ;;
 
-     esac
 
-     shift
 
- done
 
- # urgency is always set
 
- HINTS=("$(make_hint byte urgency "$URGENCY")" "${HINTS[@]}")
 
- if [[ -z "$SUMMARY" ]] ; then
 
-     help
 
-     exit 1
 
- else
 
-     notify
 
- fi
 
 
  |