localwaka/goalctl

81 lines
2.3 KiB
Python
Executable File

#!/usr/bin/env python3
# kinds of goals:
# - overall
# "i want to code at least {time} per {interval}"
# - in a project
# - in a language
# - in an editor
from datetime import timedelta, date, datetime, time
import sys
import json
import sqlite3
from config import timeout
import utils
conn = sqlite3.connect("data.db")
if len(sys.argv) < 2:
print("provide a file", file=sys.stderr)
sys.exit(1)
filename = sys.argv[1]
with open(filename) as f:
data = json.load(f)
goal_type = data["type"]
if goal_type == "overall":
# in seconds
goal_min = int(data["goal_min"])
# figure out what timestamps to pull from
if data["interval"] == "day":
# except!
def convert_weekday(s):
s = s.lower()
return dict(
sunday=0,
monday=1,
tuesday=2,
wednesday=3,
thursday=4,
friday=5,
saturday=6,
).get(s)
excepts = list(map(convert_weekday, data["except"]))
if len(sys.argv) > 2:
# if a day is given, print that day
d = datetime.strptime(sys.argv[2], "%Y-%m-%d").date()
start_time = datetime.combine(d, time(hour=0, minute=0, second=0))
end_time = datetime.combine(d, time(hour=23, minute=59, second=59))
else:
# find the current day!
today = date.today()
start_time = datetime.combine(today, time(hour=0, minute=0, second=0))
end_time = datetime.now()
coded_secs = utils.get_seconds_coded(conn, start_time, end_time, timeout)
print("minutes coded:", (coded_secs/60))
# get all the entries
c = conn.cursor()
curs = c.execute("""
select time from heartbeats where time > ? and time < ? order by time;
""", [start_stamp, end_stamp])
coded_secs = 0
for (first, second) in window(curs, 2):
diff = second[0] - first[0]
if diff < timeout:
coded_secs += diff
print("coded: {}:{:02d} min".format(int(coded_secs)//60, int(coded_secs)%60))
elif data["interval"] == "week":
# start of the week
today = date.today()
last_monday = today - timedelta(days=today.weekday())
print(last_monday)
# vim: set ft=python: