itchy.lua | ||
itchy.moon | ||
Jenkinsfile | ||
LICENSE.txt | ||
ReadMe.md | ||
usage.lua |
itchy
A super simple version checker for use with LÖVE games published on itch.io.
Installation
Copy itchy.lua
to where you want in your source. It is recommended that you
install luajit-request as it
allows for itchy to use HTTPS connections.
Usage
Start it as a thread with a configuration table. Wait for "itchy" channel to respond with a table of version information.
Require itchy, and run check_version
with a configuration table. Periodically
run new_version
to see if data has been returned yet.
local itchy = require "lib.itchy" -- or wherever you saved it
local game = {
target = "guard13007/asteroid-dodge", -- target or url must be defined
version = "1.0.0" -- optional, config options listed below
}
itchy:check_version(game)
-- somewhere where this will be called periodically
local data = itchy:new_version(game) -- passing the game table is not necessary
if data then
-- easiest usage, just print the message to the user
love.graphics.print("Version: 1.0.0 Latest: " .. data.message)
end
You can cancel it with itchy:kill_version_checker(game)
, and start a new
version checker with itchy:check_version({})
any time you like.
Version Information Example
Returned data example:
{
status = 200, -- nil or status code of an HTTP request
body = '{"latest":"0.2.0"}', -- raw result body from the HTTP request
version = "0.2.0", -- number/string (if body was parsed correctly)
latest = true, -- nil/boolean: your version == latest version?
message = "0.2.0, you have the latest version" -- an error or status message
}
Errors from LuaSocket will be returned as "socket.http.request error: " .. err
The library tries to parse a response body for valid JSON of the format
{"latest":"VERSION"}
(itch.io's format) and will do basic version comparisons
based on this value. If it is unable to extract it or compare, version
and
latest
will be nil
.
If HTTP status 200 (OK) is encountered or a version is successfully parsed from a response, the script terminates (or moves on to checking on an interval.) Otherwise, it will keep trying with an exponential back-off starting at a 1 second delay, capped at retrying every 10 minutes.
Configuration Options
At minimum a url
or target
must be specified.
url
(string) If you have a different URL to check for the latest version from, you can specify it here.target
(string) The target string of your game on itch.io (username/game-slug).channel
(string) If you do not specify the channel name to look for on itch.io, it will useosx
for Mac OS / OS X,win32
for Windows,linux
for Linux,android
for Android,ios
for iOS, and if any other OS is returned bylove.system.getOS()
it will use that string as-is.version
(string/number) Version of the game running right now.interval
(number) If specified, a check for the latest version will happen again everyinterval
seconds.luajit_request
(string) luajit-request is checked for in.
andlib/.
, if you have it elsewhere, specify its location here.
The following options are available, but generally should be left for itchy to handle itself:
proxy
(string) An HTTP proxy is used if luajit-request is unavailable, unlessproxy == false
. By default,https://104.236.139.220:16343
is used, which is running on a DigitalOcean VPS I own. You can specify a different proxy here.thread_channel
(string) itchy uses a channel nameditchy
for version checking. You can call itchy's functions with different data tables and it will use different threads & channels for each. You can also specify a channel name here.