summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--accounts/gkleen@sif/niri/waybar.nix12
-rwxr-xr-xoverlays/worktime/worktime/__main__.py35
2 files changed, 37 insertions, 10 deletions
diff --git a/accounts/gkleen@sif/niri/waybar.nix b/accounts/gkleen@sif/niri/waybar.nix
index c3820508..56a1b648 100644
--- a/accounts/gkleen@sif/niri/waybar.nix
+++ b/accounts/gkleen@sif/niri/waybar.nix
@@ -122,12 +122,14 @@ in {
122 }; 122 };
123 "custom/worktime" = { 123 "custom/worktime" = {
124 interval = 60; 124 interval = 60;
125 exec = lib.getExe pkgs.worktime; 125 exec = "${lib.getExe pkgs.worktime} time --waybar";
126 return-type = "json";
126 tooltip = false; 127 tooltip = false;
127 }; 128 };
128 "custom/worktime-today" = { 129 "custom/worktime-today" = {
129 interval = 60; 130 interval = 60;
130 exec = "${lib.getExe pkgs.worktime} today"; 131 exec = "${lib.getExe pkgs.worktime} today --waybar";
132 return-type = "json";
131 tooltip = false; 133 tooltip = false;
132 }; 134 };
133 "niri/workspaces" = { 135 "niri/workspaces" = {
@@ -323,6 +325,12 @@ in {
323 #idle_inhibitor.activated { 325 #idle_inhibitor.activated {
324 color: @white; 326 color: @white;
325 } 327 }
328 #custom-worktime.running, #custom-worktime-today.running {
329 color: @white;
330 }
331 #custom-worktime.over, #custom-worktime-today.over {
332 color: @orange;
333 }
326 334
327 #idle_inhibitor { 335 #idle_inhibitor {
328 padding-top: 1px; 336 padding-top: 1px;
diff --git a/overlays/worktime/worktime/__main__.py b/overlays/worktime/worktime/__main__.py
index 4c623acd..9b556850 100755
--- a/overlays/worktime/worktime/__main__.py
+++ b/overlays/worktime/worktime/__main__.py
@@ -23,7 +23,7 @@ import argparse
23from copy import deepcopy 23from copy import deepcopy
24 24
25import sys 25import sys
26from sys import stderr 26from sys import stderr, stdout
27 27
28from tabulate import tabulate 28from tabulate import tabulate
29 29
@@ -38,6 +38,7 @@ from collections import defaultdict
38 38
39import jsonpickle 39import jsonpickle
40from hashlib import blake2s 40from hashlib import blake2s
41import json
41 42
42class TogglAPISection(Enum): 43class TogglAPISection(Enum):
43 TOGGL = '/api/v9' 44 TOGGL = '/api/v9'
@@ -518,7 +519,7 @@ def format_days(worktime, days, date_format=None):
518 return ', '.join(map(lambda group: ','.join(map(format_group, group)), groups)) 519 return ', '.join(map(lambda group: ','.join(map(format_group, group)), groups))
519 520
520 521
521def worktime(pull_forward_cutoff, **args): 522def worktime(pull_forward_cutoff, waybar, **args):
522 worktime = Worktime(**args) 523 worktime = Worktime(**args)
523 524
524 def format_worktime(worktime): 525 def format_worktime(worktime):
@@ -562,6 +563,7 @@ def worktime(pull_forward_cutoff, **args):
562 else: 563 else:
563 return f"({difference_string})" 564 return f"({difference_string})"
564 565
566 out_class = "running" if worktime.running_entry else "stopped"
565 if worktime.time_pulled_forward >= pull_forward_cutoff: 567 if worktime.time_pulled_forward >= pull_forward_cutoff:
566 worktime_no_pulled_forward = deepcopy(worktime) 568 worktime_no_pulled_forward = deepcopy(worktime)
567 worktime_no_pulled_forward.time_to_work -= worktime_no_pulled_forward.time_pulled_forward 569 worktime_no_pulled_forward.time_to_work -= worktime_no_pulled_forward.time_pulled_forward
@@ -570,11 +572,16 @@ def worktime(pull_forward_cutoff, **args):
570 difference_string = format_worktime(worktime) 572 difference_string = format_worktime(worktime)
571 difference_string_no_pulled_forward = format_worktime(worktime_no_pulled_forward) 573 difference_string_no_pulled_forward = format_worktime(worktime_no_pulled_forward)
572 574
573 print(f"{difference_string_no_pulled_forward}…{difference_string}") 575 out_text = f"{difference_string_no_pulled_forward}…{difference_string}"
574 else: 576 else:
575 print(format_worktime(worktime)) 577 out_text = format_worktime(worktime)
576 578
577def time_worked(now, **args): 579 if waybar:
580 json.dump({"text": out_text, "class": out_class}, stdout)
581 else:
582 print(out_text)
583
584def time_worked(now, waybar, **args):
578 then = now.replace(hour = 0, minute = 0, second = 0, microsecond = 0) 585 then = now.replace(hour = 0, minute = 0, second = 0, microsecond = 0)
579 if now.time() == time(): 586 if now.time() == time():
580 now = now + timedelta(days = 1) 587 now = now + timedelta(days = 1)
@@ -584,6 +591,8 @@ def time_worked(now, **args):
584 591
585 worked = now.time_worked - then.time_worked 592 worked = now.time_worked - then.time_worked
586 593
594 out_text = None
595 out_class = "stopped"
587 if args['do_round']: 596 if args['do_round']:
588 total_minutes_difference = 5 * ceil(worked / timedelta(minutes = 5)) 597 total_minutes_difference = 5 * ceil(worked / timedelta(minutes = 5))
589 (hours_difference, minutes_difference) = divmod(abs(total_minutes_difference), 60) 598 (hours_difference, minutes_difference) = divmod(abs(total_minutes_difference), 60)
@@ -606,11 +615,19 @@ def time_worked(now, **args):
606 clockout_time = clockout_time.replace(second = 0, microsecond = 0) 615 clockout_time = clockout_time.replace(second = 0, microsecond = 0)
607 616
608 if now.running_entry and clockout_time and clockout_difference >= 0: 617 if now.running_entry and clockout_time and clockout_difference >= 0:
609 print(f"{difference_string}/{clockout_time:%H:%M}") 618 out_class = "running"
619 out_text = f"{difference_string}/{clockout_time:%H:%M}"
610 else: 620 else:
611 print(difference_string) 621 if now.running_entry:
622 out_class = "over"
623 out_text = difference_string
624 else:
625 out_text = str(worked)
626
627 if waybar:
628 json.dump({"text": out_text, "class": out_class}, stdout)
612 else: 629 else:
613 print(worked) 630 print(out_text)
614 631
615def diff(now, **args): 632def diff(now, **args):
616 now = now.replace(hour = 0, minute = 0, second = 0, microsecond = 0) 633 now = now.replace(hour = 0, minute = 0, second = 0, microsecond = 0)
@@ -841,9 +858,11 @@ def main():
841 subparsers = parser.add_subparsers(help = 'Subcommands') 858 subparsers = parser.add_subparsers(help = 'Subcommands')
842 worktime_parser = subparsers.add_parser('time_worked', aliases = ['time', 'worked']) 859 worktime_parser = subparsers.add_parser('time_worked', aliases = ['time', 'worked'])
843 worktime_parser.add_argument('--pull-forward-cutoff', dest = 'pull_forward_cutoff', metavar = 'MINUTES', type = duration_minutes, default = timedelta(minutes = 15)) 860 worktime_parser.add_argument('--pull-forward-cutoff', dest = 'pull_forward_cutoff', metavar = 'MINUTES', type = duration_minutes, default = timedelta(minutes = 15))
861 worktime_parser.add_argument('--waybar', action='store_true')
844 worktime_parser.set_defaults(cmd = worktime) 862 worktime_parser.set_defaults(cmd = worktime)
845 time_worked_parser = subparsers.add_parser('today') 863 time_worked_parser = subparsers.add_parser('today')
846 time_worked_parser.add_argument('--no-round', dest = 'do_round', action = 'store_false') 864 time_worked_parser.add_argument('--no-round', dest = 'do_round', action = 'store_false')
865 time_worked_parser.add_argument('--waybar', action='store_true')
847 time_worked_parser.set_defaults(cmd = time_worked) 866 time_worked_parser.set_defaults(cmd = time_worked)
848 diff_parser = subparsers.add_parser('diff') 867 diff_parser = subparsers.add_parser('diff')
849 diff_parser.set_defaults(cmd = diff) 868 diff_parser.set_defaults(cmd = diff)