aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README5
-rwxr-xr-xsrc/sb_nueve136
-rw-r--r--work/sb_nueve.txt48
3 files changed, 187 insertions, 2 deletions
diff --git a/README b/README
index 1481e00..b57355e 100644
--- a/README
+++ b/README
@@ -17,10 +17,11 @@ roadmap
[ ] report generation
(x) number of keypresses
(x) work time vs idle time
- ( ) per-key statistics
- ( ) per-keyboard statistics
+ ( ) per-key statistics?
+ ( ) per-keyboard statistics?
(~) new report per day
(~) report processing
+ ( ) sb python rewrite
[x?] security
(n/a) drop privs (add user to input group)
(x) where to store reports (~~/var dir?~~ ~/.local/stroke_buddy)
diff --git a/src/sb_nueve b/src/sb_nueve
new file mode 100755
index 0000000..0c3fa0d
--- /dev/null
+++ b/src/sb_nueve
@@ -0,0 +1,136 @@
+#!/usr/bin/env python3
+
+import argparse
+import time
+import sys
+import os
+
+STROKE_BUDDY_DIR = "/home/spv/.local/stroke_buddy"
+
+def parse_hourly_report(report_fn):
+ report_f = open(report_fn, "r")
+ report = report_f.read()
+ report_f.close()
+
+ ret = {}
+
+ for line in report.split("\n")[:-1]:
+ key, val = line.split(',')
+ if key == "total keypresses": val = int(val)
+ if key == "work time": val = float(val)
+ if key == "avg keys/sec": val = float(val) if val != "-nan" else None
+ if key == "idle time": val = float(val)
+ ret[key] = val
+
+ return ret
+
+def parse_for_day(day):
+ all_logs = os.listdir(STROKE_BUDDY_DIR)
+
+ daily_report = {}
+ total_keys = 0
+ work_time = 0
+ idle_time = 0
+
+ per_hour = {}
+
+ for log in all_logs:
+ if not day in log:
+ continue
+ hourly_report = parse_hourly_report(STROKE_BUDDY_DIR + '/' + log)
+ hour = log.split('@')[1].split('.')[0]
+
+ keys = 0
+ hourly_work = 0
+ hourly_idle = 0
+
+ for key in hourly_report:
+ if key == "total keypresses":
+ keys = hourly_report[key]
+
+ if key == "work time":
+ hourly_work = hourly_report[key]
+
+ if key == "idle time":
+ hourly_idle = hourly_report[key]
+
+ hourly_idle = hourly_idle if hourly_idle > 0.0 else 3600.0
+
+ total_keys += keys
+ work_time += hourly_work
+ idle_time += hourly_idle if hourly_idle > 0.0 else 3600.0
+
+ per_hour[hour] = {"total keypresses": keys, "work time": hourly_work, "idle time": hourly_idle}
+
+# print(log, daily_report)
+
+ top_hour = '0'
+ top_hourly_keys = 0
+
+ for hour in per_hour:
+ if per_hour[hour]["total keypresses"] > top_hourly_keys:
+ top_hourly_keys = per_hour[hour]["total keypresses"]
+ top_hour = hour
+
+ daily_report["total keypresses"] = total_keys
+ daily_report["work time"] = work_time
+ daily_report["idle time"] = idle_time
+ daily_report["top hour"] = [top_hour, top_hourly_keys]
+
+ return daily_report
+
+def parse_for_week(day):
+ tm = time.strptime(day, '%Y-%m-%d')
+ since_epoch = time.mktime(tm)
+ weekday = tm.tm_wday + 1
+
+ weekly_report = {}
+
+ for x in range(weekday, -1, -1):
+ this_one = time.localtime(since_epoch - (x * 86400))
+ this_one_iso = time.strftime('%Y-%m-%d', this_one)
+ parse_for_day(this_one_iso)
+
+def main():
+ parser = argparse.ArgumentParser(description='stroke_buddy statistics')
+
+# parser.add_argument('-r', '--report', type=str, default="today", help='(today|week|month|year|all', choices=["today", "week", "month", "year", "all"])
+
+ cmd_group = parser.add_mutually_exclusive_group()
+ cmd_group.add_argument('-r', '--report', action='store_const', dest='action', const='r')
+ cmd_group.add_argument('-c', '--count', action='store_const', dest='action', const='c')
+
+ timeframe_group = parser.add_mutually_exclusive_group()
+ timeframe_group.add_argument('-t', '--today', action='store_const', dest='timeframe', const='t')
+ timeframe_group.add_argument('-w', '--week', action='store_const', dest='timeframe', const='w')
+ timeframe_group.add_argument('-m', '--month', action='store_const', dest='timeframe', const='m')
+ timeframe_group.add_argument('-y', '--year', action='store_const', dest='timeframe', const='y')
+ timeframe_group.add_argument('-a', '--all', action='store_const', dest='timeframe', const='a')
+
+ parser.set_defaults(action='c', timeframe='t')
+
+ args = parser.parse_args()
+
+# print(args)
+
+# print(parse_hourly_report('/home/spv/.local/stroke_buddy/2025-12-05@9.log'))
+# print(parse_for_day("2025-12-05"))
+
+ report = None
+
+ if args.action == 'r':
+ if args.timeframe == 't':
+ report = parse_for_day(time.strftime('%Y-%m-%d'))
+ if args.timeframe == 'w':
+ report = parse_for_week(time.strftime('%Y-%m-%d'))
+
+ if args.action == 'c':
+ if args.timeframe == 't':
+ report = parse_for_day(time.strftime('%Y-%m-%d'))
+
+ print(report["total keypresses"])
+
+ return 0
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/work/sb_nueve.txt b/work/sb_nueve.txt
new file mode 100644
index 0000000..d338f13
--- /dev/null
+++ b/work/sb_nueve.txt
@@ -0,0 +1,48 @@
+$ sb # legacy
+%d
+$ sb -r # defaults to today
+ report for %d-%d-%d
+=================================
+total keypresses: %d
+most active hour: %s (%d presses)
+work time: %s
+idle time: %s
+$ sb -rw [specify day]
+ report for week of %d-%d-%d
+=================================
+total keypresses: %d
+most active day: %s (%d presses)
+most active hour: %s (%d presses)
+work time: %s
+idle time: %s
+$ sb -rm [specify month]
+ report for %s
+====================================
+total keypresses: %d
+most active weekday: %s (%d presses)
+most active day: %s (%d presses)
+most active hour: %s (%d presses)
+work time: %s
+idle time: %s
+$ sb -ry [specify year]
+ report for %d
+====================================
+total keypresses: %d
+most active weekday: %s (%d presses)
+most active month: %s (%d presses)
+most active day: %s (%d presses)
+most active hour: %s (%d presses)
+work time: %s
+idle time: %s
+$ sb -ra
+ all-time report
+====================================
+total keypresses: %d
+most active weekday: %s (%d presses)
+most active month: %s (%d presses)
+most active year: %d (%d presses)
+most active day: %s (%d presses)
+most active hour: %s (%d presses)
+work time: %s
+idle time: %s
+$