scripts/other/habitica/habitica.py

118 lines
2.8 KiB
Python

import os
import json
from time import sleep
from quests import quests, notes
import requests
base_url = "https://habitica.com/api/v3/"
r = requests.get(base_url + "status")
if r.status_code == 200:
data = r.json()["data"]
if data and "status" in data and data["status"] == "up":
print("Habitica API is up")
else:
print(data)
raise ValueError
else:
print("Habitica API is down")
raise ValueError
HEADERS = {}
def login():
global HEADERS
username = input("username: ")
password = input("password: ")
r = requests.post(
base_url + "user/auth/local/login",
json={"username": username, "password": password},
)
if r.status_code != 200:
print("Incorrect login")
raise ValueError
inner_data = r.json()["data"]
api_id = inner_data["id"]
api_token = inner_data["apiToken"]
data = {"id": api_id, "token": api_token}
with open(".session", "w") as f:
json.dump(data, f)
HEADERS = {
"x-client": data["id"] + " - " + "sanspie's party manager",
"x-api-user": data["id"],
"x-api-key": data["token"],
}
if not os.path.isfile(".session"):
login()
else:
with open(".session") as f:
data = json.load(f)
HEADERS = {
"x-client": data["id"] + " - " + "sanspie's party manager",
"x-api-user": data["id"],
"x-api-key": data["token"],
}
r = requests.get(base_url + "user", headers=HEADERS)
if r.status_code != 200:
print("Incorrect token")
login()
user = r.json()["data"]
party = user["party"]
if "_id" not in party:
print("No party found")
raise ValueError
party_id = party["_id"]
party = requests.get(base_url + f"/groups/{party_id}", headers=HEADERS).json()["data"]
print(f"party: {party['name']}")
usernames = {}
def get_username(id: str):
if id in usernames:
return usernames[id]
r = requests.get(base_url + f"/members/{id}")
if r.status_code != 200:
raise ValueError
username = r.json()["data"]["profile"]["name"]
usernames[id] = username
return username
def get_quest_status():
r = requests.get(base_url + f"/groups/{party_id}", headers=HEADERS)
if r.status_code != 200:
raise ValueError
party = r.json()["data"]
quest = party["quest"]
if quest["active"]:
key = quest["key"]
note = ""
if key in notes:
note = notes[key]
if key in quests:
name = quests[key]
else:
name = key
return {
"key": key,
"name": name,
"description": note,
"members": [
get_username(x) for x, active in quest["members"].items() if active
],
}
while True:
print(get_quest_status())
sleep(1 * 60)