feat: enhanced mute system to allow for tag-specific mute/unmuting
This commit is contained in:
parent
9a39e22d52
commit
f68a92323c
2 changed files with 148 additions and 20 deletions
122
nag
122
nag
|
|
@ -44,7 +44,7 @@ NAG_CMD="${NAG_CMD:-notify-send}"
|
||||||
|
|
||||||
# Sound file to play when an alarm fires. Empty or missing file = no sound.
|
# Sound file to play when an alarm fires. Empty or missing file = no sound.
|
||||||
NAG_SOUND="${NAG_SOUND-/usr/share/sounds/freedesktop/stereo/bell.oga}"
|
NAG_SOUND="${NAG_SOUND-/usr/share/sounds/freedesktop/stereo/bell.oga}"
|
||||||
_MUTED_FILE="${NAG_DIR}/muted"
|
_MUTE_FILE="${NAG_DIR}/mute"
|
||||||
|
|
||||||
# The default subcommand if no args are passed.
|
# The default subcommand if no args are passed.
|
||||||
NAG_DEFAULT="${NAG_DEFAULT:-list}"
|
NAG_DEFAULT="${NAG_DEFAULT:-list}"
|
||||||
|
|
@ -375,12 +375,14 @@ _main() {
|
||||||
_ALARMS=()
|
_ALARMS=()
|
||||||
|
|
||||||
# Usage:
|
# Usage:
|
||||||
# _play_sound
|
# _play_sound [<tags>]
|
||||||
#
|
#
|
||||||
# Description:
|
# Description:
|
||||||
# Play the alarm sound if NAG_SOUND exists and not muted.
|
# Play the alarm sound if NAG_SOUND exists and not muted.
|
||||||
_play_sound() {
|
_play_sound() {
|
||||||
[[ -n "${NAG_SOUND}" ]] && [[ -f "${NAG_SOUND}" ]] && [[ ! -f "${_MUTED_FILE}" ]] || return 0
|
local _tags="${1:-}"
|
||||||
|
[[ -n "${NAG_SOUND}" ]] && [[ -f "${NAG_SOUND}" ]] || return 0
|
||||||
|
_is_muted "${_tags}" && return 0
|
||||||
|
|
||||||
if _command_exists pw-play; then
|
if _command_exists pw-play; then
|
||||||
pw-play "${NAG_SOUND}"
|
pw-play "${NAG_SOUND}"
|
||||||
|
|
@ -551,6 +553,67 @@ _alarm_has_tag() {
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Usage:
|
||||||
|
# _is_muted <tags_field>
|
||||||
|
#
|
||||||
|
# Description:
|
||||||
|
# Check whether an alarm should be muted based on the mute file entries.
|
||||||
|
# Entries: "*" (global mute), "tag" (mute that tag), "!tag" (unmute that tag).
|
||||||
|
# Explicit unmute (!tag) beats global mute (*); tag mute beats default.
|
||||||
|
#
|
||||||
|
# Exit / Error Status:
|
||||||
|
# 0 (success, true) If the alarm is muted.
|
||||||
|
# 1 (error, false) If the alarm is not muted.
|
||||||
|
_is_muted() {
|
||||||
|
local _tags_field="${1:-}"
|
||||||
|
[[ -f "${_MUTE_FILE}" ]] || return 1
|
||||||
|
|
||||||
|
local -a _mute_entries=()
|
||||||
|
local _entry
|
||||||
|
while IFS= read -r _entry || [[ -n "${_entry}" ]]
|
||||||
|
do
|
||||||
|
[[ -n "${_entry}" ]] && _mute_entries+=("${_entry}")
|
||||||
|
done < "${_MUTE_FILE}"
|
||||||
|
|
||||||
|
(( ${#_mute_entries[@]} > 0 )) || return 1
|
||||||
|
|
||||||
|
if [[ -n "${_tags_field}" ]]
|
||||||
|
then
|
||||||
|
local IFS=","
|
||||||
|
local _tag
|
||||||
|
for _tag in ${_tags_field}
|
||||||
|
do
|
||||||
|
local _e
|
||||||
|
for _e in "${_mute_entries[@]}"
|
||||||
|
do
|
||||||
|
[[ "${_e}" == "!${_tag}" ]] && return 1
|
||||||
|
done
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "${_tags_field}" ]]
|
||||||
|
then
|
||||||
|
local IFS=","
|
||||||
|
local _tag
|
||||||
|
for _tag in ${_tags_field}
|
||||||
|
do
|
||||||
|
local _e
|
||||||
|
for _e in "${_mute_entries[@]}"
|
||||||
|
do
|
||||||
|
[[ "${_e}" == "${_tag}" ]] && return 0
|
||||||
|
done
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
local _e
|
||||||
|
for _e in "${_mute_entries[@]}"
|
||||||
|
do
|
||||||
|
[[ "${_e}" == "*" ]] && return 0
|
||||||
|
done
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
# Usage:
|
# Usage:
|
||||||
# _tag_list <tag>
|
# _tag_list <tag>
|
||||||
#
|
#
|
||||||
|
|
@ -1405,7 +1468,7 @@ check() {
|
||||||
if (( _should_fire ))
|
if (( _should_fire ))
|
||||||
then
|
then
|
||||||
${NAG_CMD} "nag" "${_message}" || _warn printf "Failed to notify: %s\\n" "${_message}"
|
${NAG_CMD} "nag" "${_message}" || _warn printf "Failed to notify: %s\\n" "${_message}"
|
||||||
_play_sound
|
_play_sound "${_tags}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -n "${_rule}" ]]
|
if [[ -n "${_rule}" ]]
|
||||||
|
|
@ -1545,34 +1608,67 @@ every() {
|
||||||
|
|
||||||
describe "mute" <<HEREDOC
|
describe "mute" <<HEREDOC
|
||||||
Usage:
|
Usage:
|
||||||
${_ME} mute
|
${_ME} mute [<tag>]
|
||||||
|
|
||||||
Description:
|
Description:
|
||||||
Mute alarm sounds. Notifications still fire, but no sound is played.
|
Mute alarm sounds. With no argument, mutes all alarms globally.
|
||||||
|
With a tag, mutes only alarms with that tag.
|
||||||
HEREDOC
|
HEREDOC
|
||||||
mute() {
|
mute() {
|
||||||
_ensure_nag_dir
|
_ensure_nag_dir
|
||||||
: > "${_MUTED_FILE}"
|
local _tag="${1:-}"
|
||||||
printf "Sound muted.\\n"
|
|
||||||
|
if [[ -z "${_tag}" ]]
|
||||||
|
then
|
||||||
|
printf "*\\n" > "${_MUTE_FILE}"
|
||||||
|
printf "Muted all.\\n"
|
||||||
|
else
|
||||||
|
if [[ -f "${_MUTE_FILE}" ]] && grep -Fxq '*' "${_MUTE_FILE}"
|
||||||
|
then
|
||||||
|
printf "Muted [%s].\\n" "${_tag}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
if ! [[ -f "${_MUTE_FILE}" ]] || ! grep -Fxq "${_tag}" "${_MUTE_FILE}"
|
||||||
|
then
|
||||||
|
printf "%s\\n" "${_tag}" >> "${_MUTE_FILE}"
|
||||||
|
fi
|
||||||
|
printf "Muted [%s].\\n" "${_tag}"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# unmute ######################################################################
|
# unmute ######################################################################
|
||||||
|
|
||||||
describe "unmute" <<HEREDOC
|
describe "unmute" <<HEREDOC
|
||||||
Usage:
|
Usage:
|
||||||
${_ME} unmute
|
${_ME} unmute [<tag>]
|
||||||
|
|
||||||
Description:
|
Description:
|
||||||
Unmute alarm sounds.
|
Unmute alarm sounds. With no argument, unmutes everything.
|
||||||
|
With a tag, unmutes only that tag.
|
||||||
HEREDOC
|
HEREDOC
|
||||||
unmute() {
|
unmute() {
|
||||||
if [[ -f "${_MUTED_FILE}" ]]
|
local _tag="${1:-}"
|
||||||
|
|
||||||
|
if [[ -z "${_tag}" ]]
|
||||||
then
|
then
|
||||||
rm -f "${_MUTED_FILE}"
|
if [[ -f "${_MUTE_FILE}" ]]
|
||||||
printf "Sound unmuted.\\n"
|
then
|
||||||
|
rm -f "${_MUTE_FILE}"
|
||||||
|
printf "Unmuted all.\\n"
|
||||||
else
|
else
|
||||||
printf "Sound is not muted.\\n"
|
printf "Sound is not muted.\\n"
|
||||||
fi
|
fi
|
||||||
|
else
|
||||||
|
_ensure_nag_dir
|
||||||
|
if [[ -f "${_MUTE_FILE}" ]] && grep -Fxq "${_tag}" "${_MUTE_FILE}"
|
||||||
|
then
|
||||||
|
{ grep -Fxv "${_tag}" "${_MUTE_FILE}" || true; } > "${_MUTE_FILE}.tmp"
|
||||||
|
mv -f "${_MUTE_FILE}.tmp" "${_MUTE_FILE}"
|
||||||
|
else
|
||||||
|
printf "!%s\\n" "${_tag}" >> "${_MUTE_FILE}"
|
||||||
|
fi
|
||||||
|
printf "Unmuted [%s].\\n" "${_tag}"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# edit ########################################################################
|
# edit ########################################################################
|
||||||
|
|
|
||||||
|
|
@ -2,19 +2,35 @@
|
||||||
|
|
||||||
load test_helper
|
load test_helper
|
||||||
|
|
||||||
@test "mute creates muted file" {
|
@test "mute with no args creates mute file with global entry" {
|
||||||
run_nag mute
|
run_nag mute
|
||||||
[ "${status}" -eq 0 ]
|
[ "${status}" -eq 0 ]
|
||||||
[[ "${output}" =~ "muted" ]]
|
[[ "${output}" =~ "Muted all." ]]
|
||||||
[ -f "${NAG_DIR}/muted" ]
|
[ -f "${NAG_DIR}/mute" ]
|
||||||
|
grep -q "^\*$" "${NAG_DIR}/mute"
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "unmute removes muted file" {
|
@test "mute tag adds tag to mute file" {
|
||||||
|
run_nag mute work
|
||||||
|
[ "${status}" -eq 0 ]
|
||||||
|
[[ "${output}" =~ "Muted [work]." ]]
|
||||||
|
grep -q "^work$" "${NAG_DIR}/mute"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "mute tag skips if global mute already set" {
|
||||||
|
run_nag mute
|
||||||
|
run_nag mute work
|
||||||
|
[ "${status}" -eq 0 ]
|
||||||
|
[[ "${output}" =~ "Muted [work]." ]]
|
||||||
|
[ "$(wc -l < "${NAG_DIR}/mute")" -eq 1 ]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "unmute with no args deletes mute file" {
|
||||||
run_nag mute
|
run_nag mute
|
||||||
run_nag unmute
|
run_nag unmute
|
||||||
[ "${status}" -eq 0 ]
|
[ "${status}" -eq 0 ]
|
||||||
[[ "${output}" =~ "unmuted" ]]
|
[[ "${output}" =~ "Unmuted all." ]]
|
||||||
[ ! -f "${NAG_DIR}/muted" ]
|
[ ! -f "${NAG_DIR}/mute" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "unmute when not muted says so" {
|
@test "unmute when not muted says so" {
|
||||||
|
|
@ -22,3 +38,19 @@ load test_helper
|
||||||
[ "${status}" -eq 0 ]
|
[ "${status}" -eq 0 ]
|
||||||
[[ "${output}" =~ "not muted" ]]
|
[[ "${output}" =~ "not muted" ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@test "unmute tag adds !tag when global mute is set" {
|
||||||
|
run_nag mute
|
||||||
|
run_nag unmute work
|
||||||
|
[ "${status}" -eq 0 ]
|
||||||
|
[[ "${output}" =~ "Unmuted [work]." ]]
|
||||||
|
grep -q "^!work$" "${NAG_DIR}/mute"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "unmute tag removes tag entry when individually muted" {
|
||||||
|
run_nag mute work
|
||||||
|
run_nag unmute work
|
||||||
|
[ "${status}" -eq 0 ]
|
||||||
|
[[ "${output}" =~ "Unmuted [work]." ]]
|
||||||
|
! grep -q "^work$" "${NAG_DIR}/mute"
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue