summary refs log tree commit diff
path: root/.config/timewarrior/extensions
diff options
context:
space:
mode:
Diffstat (limited to '.config/timewarrior/extensions')
-rw-r--r--.config/timewarrior/extensions/__pycache__/common.cpython-313.pycbin0 -> 1735 bytes
-rw-r--r--.config/timewarrior/extensions/common.py30
-rwxr-xr-x.config/timewarrior/extensions/total38
-rwxr-xr-x.config/timewarrior/extensions/waybar52
4 files changed, 120 insertions, 0 deletions
diff --git a/.config/timewarrior/extensions/__pycache__/common.cpython-313.pyc b/.config/timewarrior/extensions/__pycache__/common.cpython-313.pyc
new file mode 100644
index 0000000..eafdadc
--- /dev/null
+++ b/.config/timewarrior/extensions/__pycache__/common.cpython-313.pyc
Binary files differdiff --git a/.config/timewarrior/extensions/common.py b/.config/timewarrior/extensions/common.py
new file mode 100644
index 0000000..19467cb
--- /dev/null
+++ b/.config/timewarrior/extensions/common.py
@@ -0,0 +1,30 @@
+import fileinput, json, sys
+import datetime
+
+def loadstdin() -> (any, any):
+	meta = {}
+	data = []
+
+	for line in fileinput.input(encoding='utf-8'):
+		mp = line.removesuffix('\n').split(': ')
+		if len(mp) == 2:
+			meta[mp[0]] = mp[1]
+
+		if line == "[\n" or len(data) != 0:
+			data.append(line)
+
+		pass
+
+	return (meta, json.loads("".join(data)))
+
+
+def dumpstdout(output) -> None:
+	print(json.dumps(output), end='')
+
+
+def parse_timedelta(s: str) -> datetime.timedelta:
+	t = datetime.datetime.strptime(s, '%H:%M')
+	return datetime.timedelta(hours=t.hour, minutes=t.minute)
+
+if __name__ == "__main__":
+	sys.exit(1)
diff --git a/.config/timewarrior/extensions/total b/.config/timewarrior/extensions/total
new file mode 100755
index 0000000..8742b68
--- /dev/null
+++ b/.config/timewarrior/extensions/total
@@ -0,0 +1,38 @@
+#!/bin/env python3
+
+from common import loadstdin, dumpstdout, parse_timedelta
+from datetime import datetime, timezone, timedelta
+from os import getenv
+from math import ceil
+
+RATE = int(getenv('REPORT_RATE', '0'))
+BILL = parse_timedelta(getenv('REPORT_BILL', '1:00'))
+
+def timedelta_ceil(dur: timedelta, diff: timedelta) -> timedelta:
+	delta = ceil(dur.total_seconds() / diff.total_seconds()) * diff.total_seconds() - dur.total_seconds()
+	return timedelta(seconds=(dur.total_seconds() + delta))
+
+
+def main() -> None:
+	# parse stdin json
+	meta, data = loadstdin()
+
+	# calc total
+	total = timedelta(0)
+	for e in data:
+		startt = datetime.fromisoformat(e['start'])
+		endt = datetime.fromisoformat(e['end'])
+		total += endt - startt
+
+	# calc amount
+	total_billable = timedelta_ceil(total, BILL)
+	total_amount = (total_billable.total_seconds() / 3600) * RATE
+
+	# presentation
+	print(f"total => {total}")
+	print(f"bill  => {total_billable}")
+	print(f"{total_billable} @ {RATE} EUR => {total_amount} EUR")
+
+
+if __name__ == "__main__":
+	main()
diff --git a/.config/timewarrior/extensions/waybar b/.config/timewarrior/extensions/waybar
new file mode 100755
index 0000000..45e3f03
--- /dev/null
+++ b/.config/timewarrior/extensions/waybar
@@ -0,0 +1,52 @@
+#!/bin/env python3
+
+import fileinput, json
+from datetime import datetime, timezone, timedelta
+
+ICO="󰔚"
+CLS="timew"
+ALT="timew"
+
+def main() -> None:
+	# only read actual json
+	input = []
+	for line in fileinput.input(encoding='utf-8'):
+		if len(input) != 0:
+			input.append(line)
+
+		if line == "[\n":
+			input = [line]
+
+		pass
+	
+	# parse json
+	input = json.loads("".join(input))
+
+	# filter for active trackers
+	input = list(filter(lambda x: not "end" in x, list(input)))
+
+	# exit early if no tracker is running
+	if len(input) == 0:
+		output = {}
+	else:
+		# pick first
+		input = input[0]
+		# parse start
+		startt = datetime.fromisoformat(input['start'])
+		# get now
+		nowt = datetime.now(timezone.utc);
+		# round away microseconds
+		nowt = nowt.replace(microsecond=0)
+		# calc diff
+		diff = nowt - startt.astimezone(timezone.utc)
+		# make output
+		output = {
+			'text': f"{ICO} {diff} {",".join(input['tags'])}",
+			'class': CLS,
+			'alt': ALT,
+		}
+
+	print(json.dumps(output), end='')
+
+if __name__ == "__main__":
+	main()