mirror of
https://github.com/csd4ni3l/siege-calendar.git
synced 2026-01-01 12:33:47 +01:00
Initial commit with features and everything.
This commit is contained in:
56
utils/hackatime.py
Normal file
56
utils/hackatime.py
Normal file
@@ -0,0 +1,56 @@
|
||||
import os, requests, configparser
|
||||
from datetime import date, datetime, timedelta
|
||||
from utils.constants import HACKATIME_URL
|
||||
|
||||
class Client:
|
||||
def __init__(self):
|
||||
self.config = configparser.ConfigParser()
|
||||
self.config.read(os.path.expanduser("~/.wakatime.cfg"))
|
||||
|
||||
self.api_url = HACKATIME_URL
|
||||
self.api_key = self.config["settings"]["api_key"]
|
||||
self.headers = {"Authorization": f"Bearer {self.api_key}"}
|
||||
|
||||
def get_date(self):
|
||||
return date.today().strftime("%Y-%m-%d")
|
||||
|
||||
def add_day(self, date_str):
|
||||
dt = datetime.strptime(date_str, "%Y-%m-%d")
|
||||
next_day = dt + timedelta(days=1)
|
||||
return next_day.strftime("%Y-%m-%d")
|
||||
|
||||
def request(self, path):
|
||||
response = requests.get(f"{self.api_url}{path}", headers=self.headers)
|
||||
|
||||
if response.status_code == 200:
|
||||
return response.json()
|
||||
else:
|
||||
return response.status_code
|
||||
|
||||
def get_stats(self, start_date="2025-09-01", end_date="2025-12-01"):
|
||||
response = self.request(f"/users/my/stats?start_date={start_date}&end_date={end_date}&features=projects,languages")["data"]
|
||||
|
||||
if not response.get("languages"): # no time for range, prevent crash
|
||||
return None, 0
|
||||
|
||||
top_language = response["languages"][0]["name"]
|
||||
top_project = response["projects"][0]["name"]
|
||||
total_time = response["human_readable_total"]
|
||||
total_time_seconds = response["total_seconds"]
|
||||
daily_average = response["human_readable_daily_average"]
|
||||
daily_average_seconds = response["daily_average"]
|
||||
|
||||
return top_language, \
|
||||
[(language_dict["name"], language_dict["text"], language_dict["percent"]) for language_dict in response["languages"]], \
|
||||
top_project, \
|
||||
[(language_dict["name"], language_dict["text"], language_dict["percent"]) for language_dict in response["projects"]], \
|
||||
total_time, \
|
||||
total_time_seconds, \
|
||||
daily_average, \
|
||||
daily_average_seconds
|
||||
|
||||
def get_stats_for_day(self, date="2025-09-01"):
|
||||
return self.get_stats(date, self.add_day(date))
|
||||
|
||||
def get_stats_for_today(self):
|
||||
return self.get_stats_for_day(self.get_date())
|
||||
Reference in New Issue
Block a user