Newer
Older
GVM / backend.py
import platform
import requests
from os import popen
from time import sleep
import re
import pathlib

def getArch() -> str :
    arch = platform.machine()

    if arch in ['x86_64','AMD64'] :
        return 'x86_64'
    elif arch in ['arm64','aarch64'] :
        return 'arm64'

APP_PATH: str

TOKEN: str

OS = platform.system()

ARCH = getArch()

def requestGitHubInfo() -> list :
    if len(TOKEN) > 0 :
        response = requests.get("https://api.github.com/repos/godotengine/godot/releases?per_page=100",headers={"Accept":"application/vnd.github+json","Authorization":f"Bearer {TOKEN}","X-GitHub-Api-Version":"2022-11-28"})
    else :
        return []

    return response.json()

# Get the versions of the Godot Engine and sort them from latest to oldest

def verOptions() -> list:
    tag_list = []
    response = requestGitHubInfo()

    for i in response :
       tag_list.append(i['tag_name'])
    
    tag_list.sort(reverse=True)

    tag_list.pop()

    return tag_list

def downloadGodot(cur_version: str) -> None :

    response = requestGitHubInfo()

    VERSION = cur_version

    response.sort(key=lambda x: x['tag_name'],reverse=True)

    ASSETS = getAssets(response, VERSION)

    if ASSETS != [] :
        for asset in ASSETS :
            if OS == 'Linux' :
                regex = re.findall("linux|x11",asset['name']) + re.findall("x86_64|64",asset['name'])
                if re.findall("server|headless",asset['name']) == [] and regex in [['linux','x86_64'],['x11','64']] :#(asset['name'].find('linux') > 0 or asset['name'].find('x11') > 0) and (asset['name'].find(ARCH) > 0 or asset['name'].find('64') > 0) and asset['name'].find('server') == -1:
                    popen(f"curl -Lo {APP_PATH}/Godot.zip {asset['browser_download_url']}")
                    sleep(10)
                    popen(f"unzip -d {APP_PATH} {APP_PATH}/Godot.zip")
                    sleep(10)
                    popen(f"rm -f {APP_PATH}/Godot.zip")
            elif OS == 'Windows' :
                if 'arm64' in re.findall('win',asset['name']) + re.findall('arm64',asset['name']) :
                    popen(f"curl -Lo {APP_PATH}/Godot.zip {asset['browser_download_url']}")
                    popen(f"tar -xf {APP_PATH}/Godot.zip -C {APP_PATH}")
                    popen(f"DEL {APP_PATH}/Godot.zip")
                else :
                    popen(f"curl -Lo {APP_PATH}/Godot.zip {asset['browser_download_url']}")
                    popen(f"tar -xf {APP_PATH}/Godot.zip -C {APP_PATH}")
                    popen(f"DEL {APP_PATH}/Godot.zip")
            else :
                raise Exception("Incompatible OS.")
    else :
        raise Exception("No fitting assets found.")

def getAssets(response: list, tag: str) -> list :

    for i in response :
        if i['tag_name'] == tag :
            return i['assets']
        else :
            continue
    
    return []

def launch(cur_version: str) -> int :

    VERSION = cur_version.split('-')[0]

    appDir = pathlib.Path(APP_PATH)

    for i in appDir.iterdir() :
        if re.findall(VERSION,i.name) == [VERSION] :
            popen(f"{APP_PATH}/{i.name}")
            return 0
    
    return 1