feat: snooze command with basic ID support

This commit is contained in:
Lewis Wynne 2026-04-02 18:55:15 +01:00
parent 6a3f354cb7
commit e2d5329276
2 changed files with 94 additions and 0 deletions

66
nag
View file

@ -45,6 +45,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}"
_MUTE_FILE="${NAG_DIR}/mute" _MUTE_FILE="${NAG_DIR}/mute"
_SNOOZED_FILE="${NAG_DIR}/snoozed"
# 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}"
@ -1236,6 +1237,7 @@ Usage:
${_ME} tag <id> <tags...> add tags to an alarm ${_ME} tag <id> <tags...> add tags to an alarm
${_ME} tag <tag> list alarms with a tag ${_ME} tag <tag> list alarms with a tag
${_ME} untag <id> <tags...> remove tags from an alarm ${_ME} untag <id> <tags...> remove tags from an alarm
${_ME} snooze <all|id|tag> [<duration>] snooze alarms
${_ME} check check and fire due alarms ${_ME} check check and fire due alarms
${_ME} mute <all|tag> mute alarm sounds ${_ME} mute <all|tag> mute alarm sounds
${_ME} unmute <all|tag> unmute alarm sounds ${_ME} unmute <all|tag> unmute alarm sounds
@ -1947,6 +1949,70 @@ unmute() {
fi fi
} }
# snooze ######################################################################
describe "snooze" <<HEREDOC
Usage:
${_ME} snooze <all|id|tag> [<duration>]
Description:
Snooze alarms to prevent them from firing. Snoozed alarms stay in the
alarm file but are skipped by check. With "all", snoozes every alarm.
With an ID, snoozes that alarm. With a tag, snoozes all alarms with
that tag. Optional duration sets an automatic expiry.
Examples:
${_ME} snooze all snooze everything
${_ME} snooze 3 snooze alarm 3
${_ME} snooze work snooze all [work] alarms
${_ME} snooze 3 "2 weeks" snooze alarm 3 for 2 weeks
${_ME} snooze all "July 15" snooze everything until July 15
HEREDOC
snooze() {
local _target="${1:-}"
[[ -n "${_target}" ]] || _exit_1 printf "Usage: %s snooze <all|id|tag> [<duration>]\\n" "${_ME}"
# "all" and tag: placeholder for Task 5.
if [[ "${_target}" == "all" ]]
then
_exit_1 printf "Not yet implemented.\\n"
fi
if [[ ! "${_target}" =~ ^[0-9]+$ ]]
then
_exit_1 printf "Not yet implemented.\\n"
fi
# Numeric: snooze by ID.
_acquire_lock
_read_alarms
local _found=0 _message="" _line
for _line in "${_ALARMS[@]:-}"
do
[[ -n "${_line}" ]] || continue
local _id
_id="${_line%%$'\t'*}"
if [[ "${_id}" == "${_target}" ]]
then
_found=1
_message="$(_get_alarm_field "${_line}" 5)"
break
fi
done
if (( ! _found ))
then
_release_lock
_exit_1 printf "No alarm with ID %s.\\n" "${_target}"
fi
_ensure_nag_dir
printf "%s\\n" "${_target}" >> "${_SNOOZED_FILE}"
_release_lock
printf "Snoozed [%s] %s.\\n" "${_target}" "${_message}"
}
# edit ######################################################################## # edit ########################################################################
describe "edit" <<HEREDOC describe "edit" <<HEREDOC

28
test/snooze.bats Normal file
View file

@ -0,0 +1,28 @@
#!/usr/bin/env bats
load test_helper
@test "snooze by ID creates entry in snoozed file" {
run_nag at "tomorrow 3pm" "take a break"
run_nag snooze 1
[ "${status}" -eq 0 ]
[[ "${output}" =~ "Snoozed [1]" ]]
[ -f "${NAG_DIR}/snoozed" ]
grep -q "^1$" "${NAG_DIR}/snoozed"
}
@test "snooze by ID shows alarm message in output" {
run_nag at "tomorrow 3pm" "take a break"
run_nag snooze 1
[[ "${output}" =~ "take a break" ]]
}
@test "snooze with nonexistent ID fails" {
run_nag snooze 99
[ "${status}" -eq 1 ]
}
@test "snooze with no args fails" {
run_nag snooze
[ "${status}" -eq 1 ]
}