summary refs log tree commit diff
path: root/bin/notifmenu
blob: abee22955a47193fba75b836330af567520a192f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/bin/sh

set -e
[ -n "$DEBUG" ] && set -x

manual_actions_handling=
[ "${1}" = "-m" ] && manual_actions_handling=1

# check requirements
for tool in makoctl jq bemenu; do
	if ! command -v "$tool" >/dev/null; then
		printf "%s: %s not installed but required\n" "$(basename "$0")" "$tool" >&2
		exit 1
	fi
done

export MENU_PROMPT="󰡟 notif"

_menu() {
	menu -l10 --ifne "$@"
}

select_notification() {
	while read -r line; do # actually only supports 1
		id=$(printf "%s" "${line}" | awk -F'\t' '{print $1}')
		makoctl list | jq -r ".. | select(.id?.data==${id}) | @text"
	done
}

handle() {
	while read -r json; do
		[ -n "$DEBUG" ] && printf "%s" "${json}" | jq
		printf "dismiss\nactions\n" |
			MENU_PROMPT="${MENU_PROMPT}: $(printf "%s" "${json}" | jq -r '.summary.data')" _menu |
			{
				read -r line
				case ${line} in
				dismiss) handle_dismiss "${json}" ;;
				actions) handle_actions "${json}" ;;
				esac
			}
	done
}

handle_dismiss() {
	id=$(printf "%s" "${1}" | jq -r '.id.data')
	makoctl dismiss -n "${id}"
}

handle_actions() {
	id=$(printf "%s" "${1}" | jq -r '.id.data')

	if [ -n "${manual_actions_handling}" ]; then
		printf "%s" "${1}" | jq -r '.actions.data | to_entries | .[] | @text' |
			_menu |
			jq -r '.key' |
			handle_action_manually "${id}"
	else
		exec makoctl menu -n "${id}" menu -l10
	fi
}

handle_action_manually() {
	id="$1"
	while read -r action; do
		printf "print\ninvoke (using makoctl)\n" |
			_menu --prefix "${action} >" |
			{
				read -r line
				case ${line} in
				print) printf "%s\n" "${action}" ;;
				invoke*) exec makoctl invoke -n "${id}" "${action}" ;;
				esac
			}
	done
}

makoctl list |
	jq -r '.data[][] | [.id.data, ."app-name".data, .summary.data, .body.data] | @tsv' |
	_menu |
	select_notification |
	handle