diff options
Diffstat (limited to 'dotfiles/common/.local/bin/notify')
| -rwxr-xr-x | dotfiles/common/.local/bin/notify | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/dotfiles/common/.local/bin/notify b/dotfiles/common/.local/bin/notify new file mode 100755 index 0000000..a89a3ff --- /dev/null +++ b/dotfiles/common/.local/bin/notify @@ -0,0 +1,138 @@ +#!/bin/bash +# +# notify - Display notifications with icons and sounds +# +# Usage: +# notify <type> "title" "body" [--persist] +# +# Types: +# success - Green checkmark, pleasant chime +# fail - Red X, warning tone +# alert - Yellow exclamation, attention tone +# question - Blue question mark, contemplative tone +# alarm - Alarm clock icon, alarm sound +# info - Blue info icon, confident tone +# security - Shield icon, security tone +# bug - Bug icon, error tone +# +# Options: +# --persist Don't auto-dismiss (stays until manually closed) +# +# Examples: +# notify success "Job Complete" "Download finished in 12 minutes" +# notify fail "Job Failed" "Connection refused" --persist +# notify alert "Warning" "Network speed reduced" +# notify question "Input Needed" "Continue or abort?" + +set -euo pipefail + +ICON_DIR="$HOME/.local/share/icons/notify" +SOUND_DIR="$HOME/.local/share/sounds/notify" + +usage() { + cat <<EOF +Usage: notify <type> "title" "body" [--persist] + +Types: + success Green checkmark, pleasant chime + fail Red X, warning tone + alert Yellow exclamation, attention tone + question Blue question mark, contemplative tone + alarm Alarm clock, alarm sound + info Blue info icon, confident tone + security Shield icon, security tone + bug Bug icon, error tone + +Options: + --persist Don't auto-dismiss notification + +Examples: + notify success "Job Complete" "Download finished" + notify fail "Build Failed" "Test errors" --persist +EOF + exit 1 +} + +# Require at least type, title, body +if [[ $# -lt 3 ]]; then + usage +fi + +TYPE="$1" +TITLE="$2" +BODY="$3" +PERSIST="${4:-}" + +# Validate type and set icon/sound +case "$TYPE" in + success) + ICON="$ICON_DIR/success.png" + SOUND="$SOUND_DIR/success.ogg" + ;; + fail) + ICON="$ICON_DIR/fail.png" + SOUND="$SOUND_DIR/fail.ogg" + ;; + alert) + ICON="$ICON_DIR/alert.png" + SOUND="$SOUND_DIR/alert.ogg" + ;; + question) + ICON="$ICON_DIR/question.png" + SOUND="$SOUND_DIR/question.ogg" + ;; + alarm) + ICON="$ICON_DIR/alarm.png" + SOUND="$SOUND_DIR/alarm.ogg" + ;; + info) + ICON="$ICON_DIR/info.png" + SOUND="$SOUND_DIR/info.ogg" + ;; + security) + ICON="$ICON_DIR/security.png" + SOUND="$SOUND_DIR/security.ogg" + ;; + bug) + ICON="$ICON_DIR/bug.png" + SOUND="$SOUND_DIR/bug.ogg" + ;; + *) + echo "Error: Unknown type '$TYPE'" >&2 + echo "Valid types: success, fail, alert, question, alarm, info, security, bug" >&2 + exit 1 + ;; +esac + +# Check assets exist +if [[ ! -f "$ICON" ]]; then + echo "Warning: Icon not found: $ICON" >&2 +fi + +if [[ ! -f "$SOUND" ]]; then + echo "Warning: Sound not found: $SOUND" >&2 +fi + +# Build notify-send arguments +NOTIFY_ARGS=( + --app-name="" + --urgency=normal +) + +# Add persist flag if requested +if [[ "$PERSIST" == "--persist" ]]; then + NOTIFY_ARGS+=(--expire-time=0) +fi + +# Add icon if it exists +if [[ -f "$ICON" ]]; then + NOTIFY_ARGS+=(--icon="$ICON") +fi + +# Play sound in background (if it exists) +if [[ -f "$SOUND" ]]; then + paplay "$SOUND" & +fi + +# Send notification +notify-send "${NOTIFY_ARGS[@]}" "$TITLE" "$BODY" |
