92 lines
5.3 KiB
Bash
Executable File
92 lines
5.3 KiB
Bash
Executable File
#!/nix/store/x12lw455sq6qy2wcya85d7rb88ybc3df-bash-interactive-5.3p9/bin/bash
|
|
|
|
# Simple Taskwarrior Notification Script
|
|
# Just checks: if time_until_due <= reminder_time, send notification
|
|
|
|
NTFY_URL="https://ntfy.lab.audasmedia.com.au/tasks"
|
|
NOW=$(date -u +%s)
|
|
|
|
# Auto-add +notify to tasks with due dates or remind tags
|
|
task status:pending '( due.any: or tags.has:remindMins or tags.has:remindHours or tags.has:remindDays or tags.has:remindWeeks or tags.has:remindMonths )' -notify export 2>/dev/null | \
|
|
/nix/store/qnaw7i777j52fpgbl5pgmzkq85znp083-jq-1.8.1-bin/bin/jq -r '.[].uuid' 2>/dev/null | \
|
|
while read -r uuid; do
|
|
/nix/store/syqlfcifpih00fknzailx8xxn4cnv42d-taskwarrior-3.4.2/bin/task "$uuid" modify +notify 2>/dev/null
|
|
done
|
|
|
|
# Process tasks with +notify
|
|
task status:pending +notify export 2>/dev/null | \
|
|
/nix/store/qnaw7i777j52fpgbl5pgmzkq85znp083-jq-1.8.1-bin/bin/jq -c '.[] | select(.due) | {uuid: .uuid, description: .description, due: .due, tags: .tags}' 2>/dev/null | \
|
|
while read -r task_json; do
|
|
|
|
uuid=$(echo "$task_json" | /nix/store/qnaw7i777j52fpgbl5pgmzkq85znp083-jq-1.8.1-bin/bin/jq -r '.uuid')
|
|
desc=$(echo "$task_json" | /nix/store/qnaw7i777j52fpgbl5pgmzkq85znp083-jq-1.8.1-bin/bin/jq -r '.description')
|
|
due_date=$(echo "$task_json" | /nix/store/qnaw7i777j52fpgbl5pgmzkq85znp083-jq-1.8.1-bin/bin/jq -r '.due')
|
|
tags=$(echo "$task_json" | /nix/store/qnaw7i777j52fpgbl5pgmzkq85znp083-jq-1.8.1-bin/bin/jq -r '.tags[]? // empty' 2>/dev/null)
|
|
|
|
# Convert due date (UTC) to epoch
|
|
formatted_date=$(echo "$due_date" | /nix/store/ryz8kcrm2bxpccllfqlb7qldsfnqp5c2-gnused-4.9/bin/sed 's/T/ /; s/Z$//; s/^\(....\)\(..\)\(..\)/\1-\2-\3/; s/ \(..\)\(..\)\(..\)$/ \1:\2:\3/')
|
|
due_epoch=$(/nix/store/i2vmgx46q9hd3z6rigaiman3wl3i2gc4-coreutils-9.9/bin/date -d "$formatted_date UTC" +%s 2>/dev/null || echo 0)
|
|
|
|
if [ "$due_epoch" = "0" ]; then
|
|
continue
|
|
fi
|
|
|
|
time_until_due=$((due_epoch - NOW))
|
|
|
|
# Check reminder tags
|
|
echo "$tags" | /nix/store/02vv0r262agf9j5n2y1gmbjvdf12zkl0-gnugrep-3.12/bin/grep -E '^remind(Mins|Hours|Days|Weeks|Months)' 2>/dev/null | \
|
|
while read -r remind_tag; do
|
|
|
|
# Parse: remindMins2, remindHours1, etc
|
|
if [[ "$remind_tag" =~ ^remind(Mins|Hours|Days|Weeks|Months)([0-9]+)$ ]]; then
|
|
unit="${BASH_REMATCH[1]}"
|
|
num="${BASH_REMATCH[2]}"
|
|
|
|
# Convert to seconds
|
|
case "$unit" in
|
|
Mins) remind_secs=$((num * 60)); time_str="$num minutes" ;;
|
|
Hours) remind_secs=$((num * 3600)); time_str="$num hours" ;;
|
|
Days) remind_secs=$((num * 86400)); time_str="$num days" ;;
|
|
Weeks) remind_secs=$((num * 604800)); time_str="$num weeks" ;;
|
|
Months) remind_secs=$((num * 2592000)); time_str="$num months" ;;
|
|
esac
|
|
|
|
# SIMPLE: If time until due <= reminder time AND still in future, send it
|
|
if [ $time_until_due -le $remind_secs ] && [ $time_until_due -gt 0 ]; then
|
|
/nix/store/xgdl4gzjzwj7ixs83f17sqppd08lfd03-libnotify-0.8.7/bin/notify-send -u normal "Reminder" "🔔 $desc - Due in $time_str"
|
|
/nix/store/jqfr3p49g3lch84y45jfzw9fshlv8jyp-curl-8.17.0-bin/bin/curl -s -d "Reminder: $desc - Due in $time_str" "$NTFY_URL" >/dev/null 2>&1 &
|
|
/nix/store/syqlfcifpih00fknzailx8xxn4cnv42d-taskwarrior-3.4.2/bin/task "$uuid" modify -"$remind_tag" 2>/dev/null
|
|
fi
|
|
fi
|
|
done
|
|
|
|
# Check if task is due (overdue)
|
|
if [ $time_until_due -le 0 ] && ! echo "$tags" | /nix/store/02vv0r262agf9j5n2y1gmbjvdf12zkl0-gnugrep-3.12/bin/grep -q "^notified$"; then
|
|
/nix/store/xgdl4gzjzwj7ixs83f17sqppd08lfd03-libnotify-0.8.7/bin/notify-send -u critical "Task Due" "⚠️ $desc"
|
|
/nix/store/jqfr3p49g3lch84y45jfzw9fshlv8jyp-curl-8.17.0-bin/bin/curl -s -d "Task due: $desc" "$NTFY_URL" >/dev/null 2>&1 &
|
|
/nix/store/syqlfcifpih00fknzailx8xxn4cnv42d-taskwarrior-3.4.2/bin/task "$uuid" modify +notified 2>/dev/null
|
|
fi
|
|
done
|
|
|
|
# Cleanup: Remove notification tags from completed/deleted tasks
|
|
task '( status:completed or status:deleted )' '( +notify or +notified or tags.has:remindMins or tags.has:remindHours or tags.has:remindDays or tags.has:remindWeeks or tags.has:remindMonths )' export 2>/dev/null | \
|
|
/nix/store/qnaw7i777j52fpgbl5pgmzkq85znp083-jq-1.8.1-bin/bin/jq -r '.[].uuid' 2>/dev/null | \
|
|
while read -r uuid; do
|
|
tags=$(/nix/store/syqlfcifpih00fknzailx8xxn4cnv42d-taskwarrior-3.4.2/bin/task "$uuid" export 2>/dev/null | /nix/store/qnaw7i777j52fpgbl5pgmzkq85znp083-jq-1.8.1-bin/bin/jq -r '.[0].tags[]? // empty' 2>/dev/null)
|
|
|
|
remove_args=""
|
|
echo "$tags" | /nix/store/02vv0r262agf9j5n2y1gmbjvdf12zkl0-gnugrep-3.12/bin/grep -q "^notify$" && remove_args="$remove_args -notify"
|
|
echo "$tags" | /nix/store/02vv0r262agf9j5n2y1gmbjvdf12zkl0-gnugrep-3.12/bin/grep -q "^notified$" && remove_args="$remove_args -notified"
|
|
|
|
remind_tags=$(echo "$tags" | /nix/store/02vv0r262agf9j5n2y1gmbjvdf12zkl0-gnugrep-3.12/bin/grep "^remind(Mins|Hours|Days|Weeks|Months)" 2>/dev/null || true)
|
|
if [ -n "$remind_tags" ]; then
|
|
while read -r tag; do
|
|
remove_args="$remove_args -$tag"
|
|
done <<< "$remind_tags"
|
|
fi
|
|
|
|
if [ -n "$remove_args" ]; then
|
|
/nix/store/syqlfcifpih00fknzailx8xxn4cnv42d-taskwarrior-3.4.2/bin/task "$uuid" modify $remove_args 2>/dev/null
|
|
fi
|
|
done
|