diff options
Diffstat (limited to '')
| -rw-r--r-- | .config/timewarrior/extensions/__pycache__/common.cpython-313.pyc | bin | 0 -> 1735 bytes | |||
| -rw-r--r-- | .config/timewarrior/extensions/common.py | 30 | ||||
| -rwxr-xr-x | .config/timewarrior/extensions/total | 38 | ||||
| -rwxr-xr-x | .config/timewarrior/extensions/waybar | 52 |
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() |