waybar: tidy up scripts

This commit is contained in:
thomasabishop 2024-03-02 17:37:50 +00:00
parent 79f7e8729b
commit b1da46dcb0
3 changed files with 167 additions and 7 deletions

View file

@ -0,0 +1,166 @@
#! /usr/local/bin/python3
import requests
import os
from textwrap import dedent
import logging
import base64
import json
import pytz
from datetime import datetime, timedelta
from tabulate import tabulate # third-party module, must be installed on system
TOGGL_API_URL = "https://api.track.toggl.com/api/v9/"
TOGGL_API_KEY = os.getenv("TOGGL_API_KEY")
TOGGL_WORKSPACE_ID = os.getenv("TOGGL_WORKSPACE_ID")
ENCODED_TOGGL_API_KEY = str(base64.b64encode(TOGGL_API_KEY.encode("utf-8")), "utf-8")
HEADERS = {
"content-type": "application/json",
"Authorization": "Basic %s" % ENCODED_TOGGL_API_KEY,
}
def get_data(endpoint):
response = requests.get(
f"https://api.track.toggl.com/api/v9/{endpoint}",
headers={
"content-type": "application/json",
"Authorization": "Basic %s" % ENCODED_TOGGL_API_KEY,
},
)
if response.status_code == 200:
return response.json()
else:
raise Exception(
f"Failed to fetch data from API. Status code: {response.status_code}"
)
def get_project_name(project_id: int) -> str:
try:
projects = get_data(f"workspaces/{TOGGL_WORKSPACE_ID}/projects")
project = [project for project in projects if project["id"] == project_id][0]
return project["name"]
except Exception as e:
logging.warning(f"Error. Could not retrieve project name: {e}")
def get_human_date(timestamp):
return datetime.strptime(timestamp, "%Y-%m-%dT%H:%M:%S%z").strftime(
"%a %d %b (%H:%M)"
)
def get_time_difference(start, end):
format = "%Y-%m-%dT%H:%M:%S%z"
datetime1 = datetime.strptime(start, format)
datetime2 = datetime.strptime(end, format)
difference = datetime2 - datetime1
return get_hms(int(difference.total_seconds()))
def get_hms(unix_seconds):
return str(timedelta(seconds=unix_seconds))
def timer_is_running():
active_session = get_data("me/time_entries/current")
if not active_session:
return False
else:
return True
# def get_active_time_entry():
# active_session = get_data("me/time_entries/current")
# if not active_session:
# return "No timer running"
# else:
# current_time = datetime.now(pytz.utc).strftime("%Y-%m-%dT%H:%M:%S%z")
# entry = {
# "project_id": get_project_name(active_session["project_id"]),
# "duration": get_time_difference(active_session["start"], current_time),
# "start": get_human_date(active_session["start"]),
# "description": active_session["description"],
# }
# return print_table([entry])
def process_active_entry(entry):
time_now = datetime.now(pytz.utc).strftime("%Y-%m-%dT%H:%M:%S%z")
return {
"project_id": get_project_name(entry["project_id"]),
"duration": get_time_difference(entry["start"], time_now),
"start": get_human_date(entry["start"]),
"description": entry["description"],
}
def list_recent_time_entries():
try:
recent_entries = get_data("me/time_entries")
properties = ["project_id", "duration", "start", "description"]
transformers = {
"project_id": get_project_name,
"start": get_human_date,
"duration": get_hms,
}
processed_entries = []
first_entry = recent_entries[0]
if not first_entry["stop"]:
active_entry = process_active_entry(first_entry)
print(active_entry)
for entry in recent_entries[:5]:
processed_entry = {}
for prop in properties:
if prop in transformers:
processed_entry[prop] = transformers[prop](entry[prop]) or "null"
else:
processed_entry[prop] = entry[prop] or "null"
processed_entries.append(processed_entry)
processed_entries[0] = active_entry
return dedent(
tabulate(processed_entries, headers="keys", tablefmt="simple_outline")
)
except Exception as e:
return f"Error. Could not retrieve recent time entries: {e}"
def stop_running_timer(entry_id):
patch_url = (
f"{TOGGL_API_URL}workspaces/{TOGGL_WORKSPACE_ID}/time_entries/{entry_id}/stop"
)
response = requests.patch(patch_url, headers=HEADERS)
if response.status_code != 200:
print("Error: timer not stopped")
print(response.content)
else:
return
def main():
output = {}
try:
if timer_is_running():
output["text"] = " Tracker: active"
output["class"] = "active"
else:
output["text"] = " Tracker: inactive"
output["class"] = "inactive"
output["tooltip"] = list_recent_time_entries()
except Exception as e:
output["text"] = "Error"
print(json.dumps(output))
if __name__ == "__main__":
main()
print(list_recent_time_entries())
# print(get_project_name(193325937))
# print(list_recent_time_entries())
# print(get_active_time_entry())
# print(get_active_session())
# stop_running_timer(3318296941)

View file

@ -1,7 +1,4 @@
#! /usr/local/bin/python3 #! /usr/local/bin/python3
# Retrieve status bar data from WakaTime API and present in Waybar widget
import requests import requests
import os import os
import json import json
@ -47,7 +44,7 @@ def main():
tooltip = generate_tooltip( tooltip = generate_tooltip(
human_time, format_metric(langs), format_metric(projects) human_time, format_metric(langs), format_metric(projects)
) )
output["text"] = digital_time or "No data" output["text"] = digital_time
output["tooltip"] = tooltip output["tooltip"] = tooltip
except Exception as e: except Exception as e:

View file

@ -86,9 +86,6 @@ button {
margin-bottom: 6px; margin-bottom: 6px;
} }
#custom-wakatime {
}
#custom-logout { #custom-logout {
margin-right: 8px; margin-right: 8px;
background-color: #ebdbb2; background-color: #ebdbb2;