1
0
Fork 0
mirror of synced 2024-06-02 18:54:41 +12:00
Rare/rare/utils/steam_grades.py
2021-12-27 00:37:13 +01:00

146 lines
4 KiB
Python

import difflib
import json
import os
from datetime import date
import requests
from PyQt5.QtCore import pyqtSignal, QRunnable, QObject, QCoreApplication
from legendary.core import LegendaryCore
from rare import data_dir, cache_dir, shared
replace_chars = ",;.:-_ "
file = os.path.join(cache_dir, "game_list.json")
url = "https://api.steampowered.com/ISteamApps/GetAppList/v2/"
class SteamSignals(QObject):
rating_signal = pyqtSignal(str)
class SteamWorker(QRunnable):
app_name = ""
def __init__(self, core: LegendaryCore):
super(SteamWorker, self).__init__()
self.signals = SteamSignals()
self.core = core
_tr = QCoreApplication.translate
self.ratings = {
"platinum": _tr("SteamWorker", "Platinum"),
"gold": _tr("SteamWorker", "Gold"),
"silver": _tr("SteamWorker", "Silver"),
"bronze": _tr("SteamWorker", "Bronze"),
"fail": _tr("SteamWorker", "Could not get grade"),
"borked": _tr("SteamWorker", "unplayable"),
"pending": _tr("SteamWorker", "Could not get grade"),
}
def set_app_name(self, app_name: str):
self.app_name = app_name
def run(self) -> None:
self.signals.rating_signal.emit(
self.ratings.get(get_rating(self.app_name), self.ratings["fail"])
)
def get_rating(app_name: str):
if os.path.exists(p := os.path.join(data_dir, "steam_ids.json")):
grades = json.load(open(p))
else:
grades = {}
if not grades.get(app_name):
if shared.args.offline:
return "pending"
game = shared.core.get_game(app_name)
steam_id = get_steam_id(game.app_title)
grade = get_grade(steam_id)
grades[app_name] = {"steam_id": steam_id, "grade": grade}
with open(os.path.join(data_dir, "steam_ids.json"), "w") as f:
f.write(json.dumps(grades))
f.close()
return grade
else:
return grades[app_name].get("grade")
# you should iniciate the module with the game's steam code
def get_grade(steam_code):
if steam_code == 0:
return "fail"
steam_code = str(steam_code)
url = "https://www.protondb.com/api/v1/reports/summaries/"
res = requests.get(url + steam_code + ".json")
try:
lista = json.loads(res.text)
except json.decoder.JSONDecodeError:
return "fail"
return lista["tier"]
def load_json() -> dict:
if not os.path.exists(file):
response = requests.get(url)
steam_ids = json.loads(response.text)["applist"]["apps"]
ids = {}
for game in steam_ids:
ids[game["name"]] = game["appid"]
with open(file, "w") as f:
f.write(json.dumps(ids))
f.close()
return ids
else:
return json.loads(open(file, "r").read())
def get_steam_id(title: str):
# workarounds for satisfactory
title = title.replace("Early Access", "").replace("Experimental", "").strip()
if not os.path.exists(file):
response = requests.get(url)
ids = {}
steam_ids = json.loads(response.text)["applist"]["apps"]
for game in steam_ids:
ids[game["name"]] = game["appid"]
with open(file, "w") as f:
f.write(json.dumps(ids))
f.close()
else:
ids = json.loads(open(file, "r").read())
if title in ids.keys():
steam_name = [title]
else:
steam_name = difflib.get_close_matches(title, ids.keys(), n=1)
if steam_name:
return ids[steam_name[0]]
else:
return 0
def check_time(): # this function check if it's time to update
global file
text = open(file, "r")
json_table = json.load(text)
text.close()
today = date.today()
day = 0 # it controls how many days it's necessary for an update
for i in "ymd":
if i == "d":
day = 7
else:
day = 0
if int(today.strftime("%" + i)) > int(json_table["data"][i]) + day:
return 1
else:
return 0