itchy/itchy.lua
2018-05-26 13:22:39 -07:00

182 lines
5.3 KiB
Lua

local thread
thread = function(...)
require("love.thread")
require("love.timer")
local timer
do
local _obj_0 = love
thread, timer = _obj_0.thread, _obj_0.timer
end
local http = require("socket.http")
local ok, libcurl = pcall(function()
return require("luajit-request")
end)
if not (ok) then
ok, libcurl = pcall(function()
return require("lib.luajit-request")
end)
if not (ok) then
libcurl = nil
end
end
local request
request = function(data)
local result = { }
if not (libcurl) then
if data.luajit_request then
ok, libcurl = pcall(function()
return require(data.luajit_request)
end)
if not (ok) then
libcurl = nil
end
end
end
if libcurl then
local response = libcurl.send(data.url or "https://api.itch.io/wharf/latest?target=" .. tostring(data.target) .. "&channel_name=" .. tostring(data.channel))
result.body = response.body
result.status = response.code
else
if not (data.proxy) then
result.message = "Could not load libcurl."
return nil, result
end
result.body, result.status = http.request(data.url or tostring(data.proxy) .. "/get/https://api.itch.io/wharf/latest?target=" .. tostring(data.target) .. "&channel_name=" .. tostring(data.channel))
if not (result.body) then
result.message = "socket.http.request error: " .. tostring(result.status)
result.status = nil
return nil, result
end
end
return true, result
end
local check
check = function(data)
local send = thread.getChannel(data.thread_channel or "itchy")
local exponential_backoff = 1
while true do
local _continue_0 = false
repeat
do
local result = { }
if not (data.url or data.target) then
result.message = "'target' or 'url' be must be defined!"
send:push(result)
return false
end
ok, result = request(data)
if not (ok) then
send:push(result)
return false
end
result.version = result.body:match('%s*{%s*"latest"%s*:%s*"(.+)"%s*}%s*')
result.version = tonumber(result.version) or result.version
if data.version then
result.latest = result.version == data.version
end
if result.status ~= 200 and (not result.version) then
result.message = "unknown, error getting latest version: HTTP " .. tostring(result.status) .. ", trying again in " .. tostring(exponential_backoff) .. " seconds..."
send:push(result)
timer.sleep(exponential_backoff)
exponential_backoff = exponential_backoff * 2
if exponential_backoff > 10 * 60 then
exponential_backoff = 10 * 60
end
_continue_0 = true
break
elseif result.latest ~= nil then
if result.latest then
result.message = tostring(result.version) .. ", you have the latest vesion"
else
result.message = tostring(result.version) .. ", there is a newer version available!"
end
else
result.message = result.version
end
send:push(result)
return true
end
_continue_0 = true
until true
if not _continue_0 then
break
end
end
end
local start
start = function(data)
if data.proxy == nil and (not data.url) then
data.proxy = "http://45.55.113.149:16343"
end
if not (data.channel) then
require("love.system")
local os = love.system.getOS()
local _exp_0 = os
if "OS X" == _exp_0 then
data.channel = "osx"
elseif "Windows" == _exp_0 then
data.channel = "win32"
elseif "Linux" == _exp_0 then
data.channel = "linux"
elseif "Android" == _exp_0 then
data.channel = "android"
elseif "iOS" == _exp_0 then
data.channel = "ios"
else
data.channel = os
end
end
check(data)
if data.interval then
while true do
timer.sleep(data.interval)
check(data)
end
end
end
return start(...)
end
if arg == nil then
return thread(...)
end
local thread_data = love.filesystem.newFileData(string.dump(thread), "itchy version checker")
local counter = 1
local configs, results = { }, { }
local default_data
local itchy = {
check_version = function(self, data)
if not (default_data) then
default_data = data
end
if (not data.thread_channel) and next(configs) then
data.thread_channel = "itchy-" .. tostring(counter)
counter = counter + 1
end
configs[data] = data
return love.thread.newThread(thread_data):start(data)
end,
new_version = function(self, data)
if data == nil then
data = default_data
end
if data and configs[data] then
local channel = love.thread.getChannel(data.thread_channel or "itchy")
if channel:getCount() > 0 then
results[data] = channel:demand()
end
return results[data]
end
end,
kill_version_checker = function(self, data)
if data == nil then
data = default_data
end
configs[data] = nil
results[data] = nil
if data == default_data then
default_data = nil
end
end
}
return itchy