diff --git a/dots/.local/share/task/hooks/on-add.limit.py b/dots/.local/share/task/hooks/on-add.limit.py new file mode 100755 index 0000000..5e7659b --- /dev/null +++ b/dots/.local/share/task/hooks/on-add.limit.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +import sys +import json + +SLOTS_FILE = "/home/h/.local/share/task/add_slots" + +def get_slots(): + try: + with open(SLOTS_FILE, "r") as f: + return int(f.read().strip()) + except: + return 0 + +slots = get_slots() + +if slots <= 0: + print(f"Cannot add task: No slots available (0/{slots}).") + print("Delete or complete a task first to earn an add slot.") + sys.exit(1) + +with open(SLOTS_FILE, "w") as f: + f.write(str(slots - 1)) + +print(f"Task added. Slots remaining: {slots - 1}") + +for line in sys.stdin: + task = json.loads(line) + print(json.dumps(task)) + sys.exit(0) diff --git a/dots/.local/share/task/hooks/on-modify.limit.py b/dots/.local/share/task/hooks/on-modify.limit.py new file mode 100755 index 0000000..f26e104 --- /dev/null +++ b/dots/.local/share/task/hooks/on-modify.limit.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +import sys +import json + +SLOTS_FILE = "/home/h/.local/share/task/add_slots" + +def get_slots(): + try: + with open(SLOTS_FILE, "r") as f: + return int(f.read().strip()) + except: + return 0 + +data = sys.stdin.read().strip().split("\n") +if len(data) < 2: + for line in data: + if line: + print(line) + sys.exit(0) + +old_task = json.loads(data[0]) +new_task = json.loads(data[1]) + +was_pending = old_task.get("status") == "pending" +is_not_pending = new_task.get("status") in ("completed", "deleted") + +if was_pending and is_not_pending: + slots = get_slots() + 1 + with open(SLOTS_FILE, "w") as f: + f.write(str(slots)) + print(f"Slot earned! Total slots: {slots}") + +print(json.dumps(new_task)) +sys.exit(0) diff --git a/home/modules/taskwarrior.nix b/home/modules/taskwarrior.nix index bdc2798..c202bbf 100644 --- a/home/modules/taskwarrior.nix +++ b/home/modules/taskwarrior.nix @@ -39,6 +39,14 @@ in ".local/share/task/hooks/on-exit.sync.py" = { source = dotsPath + "/.local/share/task/hooks/on-exit.sync.py"; }; + ".local/share/task/hooks/on-add.limit.py" = { + source = dotsPath + "/.local/share/task/hooks/on-add.limit.py"; + executable = true; + }; + ".local/share/task/hooks/on-modify.limit.py" = { + source = dotsPath + "/.local/share/task/hooks/on-modify.limit.py"; + executable = true; + }; ".local/share/task/scripts/sync-and-notify.sh" = { source = dotsPath + "/.local/share/task/scripts/sync-and-notify.sh"; executable = true;