mirror of
https://github.com/sky-systems/sky_phone.git
synced 2026-08-29 01:01:31 +00:00
3eae2b8d30
Compare the fxmanifest version against the latest published sky_phone release tag and report update, current, ahead, and failure states without blocking resource startup. Document the startup check and cover the HTTP and version comparison behavior with a focused Lua test.
92 lines
3.3 KiB
Lua
92 lines
3.3 KiB
Lua
local RELEASE_API_URL = "https://api.github.com/repos/sky-systems/sky_phone/releases/latest"
|
|
local RELEASE_PAGE_URL = "https://github.com/sky-systems/sky_phone/releases/latest"
|
|
|
|
local function parse_version(version)
|
|
if type(version) ~= "string" then
|
|
return nil
|
|
end
|
|
|
|
local major, minor, patch = version:match("^v?(%d+)%.(%d+)%.(%d+)$")
|
|
if not major then
|
|
return nil
|
|
end
|
|
|
|
return tonumber(major), tonumber(minor), tonumber(patch)
|
|
end
|
|
|
|
local function compare_versions(installed_version, release_version)
|
|
local installed_major, installed_minor, installed_patch = parse_version(installed_version)
|
|
local release_major, release_minor, release_patch = parse_version(release_version)
|
|
if not installed_major or not release_major then
|
|
return nil
|
|
end
|
|
|
|
if installed_major ~= release_major then
|
|
return installed_major < release_major and -1 or 1
|
|
end
|
|
|
|
if installed_minor ~= release_minor then
|
|
return installed_minor < release_minor and -1 or 1
|
|
end
|
|
|
|
if installed_patch ~= release_patch then
|
|
return installed_patch < release_patch and -1 or 1
|
|
end
|
|
|
|
return 0
|
|
end
|
|
|
|
local function print_update_notice(installed_version, release_version)
|
|
local border = "======================================================================"
|
|
print(([[
|
|
^1%s^0
|
|
^1 SKY PHONE UPDATE AVAILABLE ^0
|
|
^1%s^0
|
|
^3 Installed version: ^1%s^0
|
|
^3 Latest release: ^2%s^0
|
|
|
|
^5 Download: %s^0
|
|
^1%s^0]]):format(border, border, installed_version, release_version, RELEASE_PAGE_URL, border))
|
|
end
|
|
|
|
local function check_for_update()
|
|
local resource_name = GetCurrentResourceName()
|
|
local installed_version = GetResourceMetadata(resource_name, "version", 0)
|
|
if not parse_version(installed_version) then
|
|
print(("^3[sky_phone] Update check skipped because fxmanifest.lua has an invalid version: %s.^0")
|
|
:format(tostring(installed_version)))
|
|
return
|
|
end
|
|
|
|
PerformHttpRequest(RELEASE_API_URL, function(status_code, response_body)
|
|
if status_code ~= 200 then
|
|
print(("^3[sky_phone] GitHub update check failed with HTTP %s.^0"):format(tostring(status_code)))
|
|
return
|
|
end
|
|
|
|
local decoded, release = pcall(json.decode, response_body)
|
|
local release_version = decoded and type(release) == "table" and release.tag_name or nil
|
|
local comparison = compare_versions(installed_version, release_version)
|
|
if not comparison then
|
|
print(("^3[sky_phone] GitHub update check returned an invalid release tag: %s.^0")
|
|
:format(tostring(release_version)))
|
|
return
|
|
end
|
|
|
|
if comparison < 0 then
|
|
print_update_notice(installed_version, release_version)
|
|
elseif comparison > 0 then
|
|
print(("^3[sky_phone] Installed version %s is newer than the latest GitHub release %s.^0")
|
|
:format(installed_version, release_version))
|
|
else
|
|
print(("^2[sky_phone] Version %s is up to date.^0"):format(installed_version))
|
|
end
|
|
end, "GET", "", {
|
|
["Accept"] = "application/vnd.github+json",
|
|
["User-Agent"] = "sky_phone-update-check",
|
|
["X-GitHub-Api-Version"] = "2022-11-28",
|
|
})
|
|
end
|
|
|
|
CreateThread(check_for_update)
|