Files
dotfiles/waybar/.config/waybar/scripts/mako-notifications.sh

136 lines
3.0 KiB
Bash
Executable File

#!/usr/bin/env sh
set -eu
dnd_mode="do-not-disturb"
json_string() {
if command -v jq >/dev/null 2>&1; then
printf '%s' "$1" | jq -Rs .
return
fi
printf '%s' "$1" | awk '
BEGIN { ORS = "" }
{
gsub(/\\/, "\\\\")
gsub(/"/, "\\\"")
gsub(/\t/, "\\t")
if (NR > 1) {
printf "\\n"
}
printf "%s", $0
}
END { printf "\n" }
'
}
refresh_waybar() {
pkill -RTMIN+8 waybar >/dev/null 2>&1 || true
}
notification_count() {
if ! command -v jq >/dev/null 2>&1; then
printf '0'
return
fi
makoctl list -j 2>/dev/null \
| jq '[.. | objects | select(has("id"))] | length' 2>/dev/null \
|| printf '0'
}
is_dnd() {
makoctl mode 2>/dev/null | grep -qx "$dnd_mode"
}
status() {
if ! modes="$(makoctl mode 2>/dev/null)"; then
text="$(json_string " n/a")"
class="$(json_string "disabled")"
tooltip="$(json_string "Mako is unavailable")"
printf '{"text":%s,"class":%s,"tooltip":%s}\n' "$text" "$class" "$tooltip"
return
fi
count="$(notification_count)"
count="${count:-0}"
if printf '%s\n' "$modes" | grep -qx "$dnd_mode"; then
state="dnd"
icon=""
label="Do Not Disturb is on"
elif [ "$count" -gt 0 ] 2>/dev/null; then
state="active"
icon=""
label="Do Not Disturb is off"
else
state="normal"
icon=""
label="Do Not Disturb is off"
fi
text="$(json_string "$icon $count")"
class="$(json_string "$state")"
tooltip="$(json_string "$label
$count pending notifications
Left click toggles DND
Right click opens the notification list")"
printf '{"text":%s,"class":%s,"tooltip":%s}\n' "$text" "$class" "$tooltip"
}
toggle() {
makoctl mode -t "$dnd_mode" >/dev/null 2>&1 || true
refresh_waybar
}
list_notifications() {
title="Notifications"
if command -v jq >/dev/null 2>&1; then
list="$(
makoctl list -j 2>/dev/null \
| jq -r '
[.. | objects | select(has("id"))]
| if length == 0 then
"No pending notifications"
else
.[]
| [
(."app-name" // .app_name // "app"),
(.summary // ""),
(.body // "")
]
| map(select(. != ""))
| join(" - ")
end
' 2>/dev/null
)"
else
list="$(makoctl list 2>/dev/null || printf 'No pending notifications')"
fi
if [ -z "$list" ]; then
list="No pending notifications"
fi
if command -v wofi >/dev/null 2>&1; then
printf '%s\n' "$list" | wofi --dmenu --prompt "$title" >/dev/null 2>&1 || true
elif command -v alacritty >/dev/null 2>&1; then
tmp="${TMPDIR:-/tmp}/mako-notifications.$$"
printf '%s\n' "$list" > "$tmp"
alacritty -e sh -c 'printf "%s\n\n" "$1"; cat "$2"; printf "\nPress Enter to close."; read -r _' sh "$title" "$tmp"
rm -f "$tmp"
else
printf '%s\n' "$list"
fi
}
case "${1:-status}" in
status) status ;;
toggle) toggle ;;
list) list_notifications ;;
*) status ;;
esac