2015-02-16 22:10:38 +00:00
|
|
|
local folder = ({...})[1]:gsub('%.init$', '')
|
2015-02-06 13:42:52 +00:00
|
|
|
local md5 = require(folder .. ".md5" )
|
|
|
|
local http = require("socket.http")
|
2015-02-05 14:02:36 +00:00
|
|
|
|
|
|
|
local GJ = {
|
|
|
|
gameID, gameKey,
|
|
|
|
isLoggedIn = false,
|
2015-02-16 22:10:38 +00:00
|
|
|
username, userToken,
|
|
|
|
trophies = {}
|
2015-02-05 14:02:36 +00:00
|
|
|
}
|
|
|
|
|
2015-02-05 14:39:36 +00:00
|
|
|
local BASE_URL = "http://gamejolt.com/api/game/v1/"
|
2015-02-05 14:02:36 +00:00
|
|
|
|
2015-02-16 22:10:38 +00:00
|
|
|
local escape = function (a)
|
|
|
|
return tostring(a):gsub("([^%w%-%.%_])",function (a)
|
|
|
|
return string.format("%%%02X",string.byte(a))
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
|
|
|
|
local function req(s, f, pu, pt, data)
|
2015-02-05 14:39:36 +00:00
|
|
|
local url = BASE_URL .. s .. "&game_id=" .. tostring(GJ.gameID) .. "&format=" .. f
|
2015-02-05 14:02:36 +00:00
|
|
|
if pu then url = url .. "&username=" .. GJ.username end
|
|
|
|
if pt then url = url .. "&user_token=" .. GJ.userToken end
|
|
|
|
|
|
|
|
local b = md5.sumhexa(url .. GJ.gameKey)
|
|
|
|
url = url .. "&signature=" .. b
|
|
|
|
|
2015-02-16 22:10:38 +00:00
|
|
|
local r, e = http.request(url, data)
|
2015-02-05 14:02:36 +00:00
|
|
|
return r
|
|
|
|
end
|
|
|
|
|
2015-02-05 16:27:44 +00:00
|
|
|
local function parseKeypair(s, on)
|
2015-02-05 15:05:48 +00:00
|
|
|
local c, len = 0, string.len(s)
|
|
|
|
local b, k, v
|
|
|
|
|
|
|
|
while c < len do
|
|
|
|
b = string.find(s, ":", c)
|
|
|
|
if b == nil then break end
|
|
|
|
k = string.sub(s, c, b - 1)
|
|
|
|
c = b + 2
|
|
|
|
b = string.find(s, '"', c)
|
|
|
|
v = string.sub(s, c, b - 1)
|
2015-02-05 16:27:44 +00:00
|
|
|
c = b + 3
|
2015-02-05 15:05:48 +00:00
|
|
|
on(k, v)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-02-05 16:27:44 +00:00
|
|
|
local function handleTrophies(str)
|
|
|
|
local d = req("trophies/?" .. str, "keypair", true, true)
|
|
|
|
local t, f = {}
|
|
|
|
|
|
|
|
parseKeypair(d, function(k, v)
|
|
|
|
if k ~= "success" then
|
|
|
|
if k == "id" then
|
|
|
|
f = {}
|
|
|
|
table.insert(t, f)
|
|
|
|
end
|
|
|
|
f[k] = v
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
return t
|
|
|
|
end
|
|
|
|
|
2015-02-16 22:10:38 +00:00
|
|
|
function GJ.init(id, key, args)
|
2015-02-05 14:02:36 +00:00
|
|
|
GJ.gameID = id
|
|
|
|
GJ.gameKey = key
|
2015-02-16 22:10:38 +00:00
|
|
|
|
|
|
|
if args and type(args)=="table" then
|
|
|
|
for k,v in pairs(args) do
|
|
|
|
local a = v:match("^gjapi_(.*)")
|
|
|
|
|
|
|
|
if a then
|
|
|
|
key, value = a:match("^(.-)=(.-)$")
|
|
|
|
|
|
|
|
if key == "username" then
|
|
|
|
GJ.username = value
|
|
|
|
elseif key == "token" then
|
|
|
|
GJ.userToken = value
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
function GJ.getCredentials(dir)
|
|
|
|
local f = io.open(dir.."gjapi-credentials.txt")
|
|
|
|
|
|
|
|
if f then
|
|
|
|
GJ.username = f:read()
|
|
|
|
GJ.userToken = f:read()
|
|
|
|
end
|
|
|
|
|
|
|
|
if GJ.username and GJ.userToken then
|
|
|
|
return true, GJ.username, GJ.userToken
|
|
|
|
else
|
|
|
|
return false, "Couldn't find, open or read the \"gjapi-credentials.txt\" file"
|
|
|
|
end
|
2015-02-05 14:02:36 +00:00
|
|
|
end
|
|
|
|
|
2015-02-05 14:39:36 +00:00
|
|
|
-- users
|
|
|
|
function GJ.authUser(name, token)
|
2015-02-16 22:10:38 +00:00
|
|
|
GJ.username = name or GJ.username or ""
|
|
|
|
GJ.userToken = token or GJ.userToken or ""
|
2015-02-05 14:39:36 +00:00
|
|
|
|
|
|
|
local s = string.find(req("users/auth/?", "dump", true, true), "SUCCESS") ~= nil
|
|
|
|
GJ.isLoggedIn = s
|
|
|
|
return s
|
|
|
|
end
|
|
|
|
|
2015-02-05 15:14:22 +00:00
|
|
|
function GJ.fetchUserByName(name)
|
|
|
|
local r = req("users/?username=" .. name, "keypair", false, false)
|
|
|
|
|
|
|
|
local t = {}
|
|
|
|
parseKeypair(r, function(k, v)
|
|
|
|
t[k] = v
|
|
|
|
end)
|
2015-02-06 13:42:52 +00:00
|
|
|
|
2015-02-05 15:14:22 +00:00
|
|
|
return t
|
|
|
|
end
|
|
|
|
|
|
|
|
function GJ.fetchUserByID(id)
|
|
|
|
local r = req("users/?user_id=" .. id, "keypair", false, false)
|
|
|
|
|
|
|
|
local t = {}
|
|
|
|
parseKeypair(r, function(k, v)
|
|
|
|
t[k] = v
|
|
|
|
end)
|
2015-02-06 13:42:52 +00:00
|
|
|
|
2015-02-05 15:14:22 +00:00
|
|
|
return t
|
|
|
|
end
|
|
|
|
|
2015-02-05 14:43:06 +00:00
|
|
|
-- sessions
|
|
|
|
function GJ.openSession()
|
|
|
|
return string.find(req("sessions/open/?", "dump", true, true), "SUCCESS") ~= nil
|
|
|
|
end
|
|
|
|
|
2015-02-05 14:48:26 +00:00
|
|
|
function GJ.pingSession(active)
|
|
|
|
local status = "idle"
|
|
|
|
if active then status = "active" end
|
|
|
|
|
|
|
|
return string.find(req("sessions/open/?status=" .. status, "dump", true, true), "SUCCESS") ~= nil
|
|
|
|
end
|
|
|
|
|
2015-02-05 14:49:42 +00:00
|
|
|
function GJ.closeSession()
|
|
|
|
return string.find(req("sessions/close/?", "dump", true, true), "SUCCESS") ~= nil
|
|
|
|
end
|
|
|
|
|
2015-02-05 15:27:47 +00:00
|
|
|
-- data store
|
|
|
|
function GJ.fetchData(key, isGlobal)
|
|
|
|
local pu, pt = true, true
|
|
|
|
if isGlobal then pu, pt = false, false end
|
|
|
|
|
2015-02-16 22:10:38 +00:00
|
|
|
local d = req("data-store/?key=" .. escape(key), "dump", pu, pt)
|
|
|
|
|
2015-02-05 15:27:47 +00:00
|
|
|
return string.sub(d, string.find(d, "\n"), string.len(d))
|
|
|
|
end
|
|
|
|
|
2015-02-05 15:32:01 +00:00
|
|
|
function GJ.setData(key, data, isGlobal)
|
|
|
|
local pu, pt = true, true
|
|
|
|
if isGlobal then pu, pt = false, false end
|
|
|
|
|
2015-02-16 22:10:38 +00:00
|
|
|
return string.find(req("data-store/set/?key=" .. escape(key) .. '&data=' .. escape(data), "dump", pu, pt), "SUCCESS") ~= nil
|
|
|
|
end
|
|
|
|
|
|
|
|
function GJ.setBigData(key, data, isGlobal)
|
|
|
|
local pu, pt = true, true
|
|
|
|
if isGlobal then pu, pt = false, false end
|
|
|
|
|
|
|
|
return string.find(req("data-store/set/?key=" .. escape(key), "dump", pu, pt, "data="..escape(data)), "SUCCESS") ~= nil
|
2015-02-05 15:32:01 +00:00
|
|
|
end
|
|
|
|
|
2015-02-05 15:36:44 +00:00
|
|
|
function GJ.updateData(key, value, operation, isGlobal)
|
|
|
|
local pu, pt = true, true
|
|
|
|
if isGlobal then pu, pt = false, false end
|
|
|
|
|
2015-02-16 22:10:38 +00:00
|
|
|
local d = req("data-store/update/?key=" .. escape(key) .. "&operation=" .. operation .. "&value=" .. escape(value), "dump", pu, pt)
|
2015-02-05 15:36:44 +00:00
|
|
|
return string.sub(d, string.find(d, "\n"), string.len(d))
|
|
|
|
end
|
|
|
|
|
2015-02-05 15:39:52 +00:00
|
|
|
function GJ.removeData(key, isGlobal)
|
|
|
|
local pu, pt = true, true
|
|
|
|
if isGlobal then pu, pt = false, false end
|
|
|
|
|
2015-02-16 22:10:38 +00:00
|
|
|
return string.find(req("data-store/remove/?key=" .. escape(key), "dump", pu, pt), "SUCCESS") ~= nil
|
2015-02-05 15:39:52 +00:00
|
|
|
end
|
|
|
|
|
2015-02-05 15:46:40 +00:00
|
|
|
function GJ.fetchStorageKeys(isGlobal)
|
|
|
|
local pu, pt = true, true
|
|
|
|
if isGlobal then pu, pt = false, false end
|
|
|
|
|
|
|
|
local d = req("data-store/get-keys/?", "keypair", pu, pt)
|
|
|
|
|
|
|
|
local t = {}
|
|
|
|
parseKeypair(d, function(k, v)
|
|
|
|
if k ~= "success" then table.insert(t, v) end
|
|
|
|
end)
|
|
|
|
|
|
|
|
return t
|
|
|
|
end
|
|
|
|
|
2015-02-05 15:54:35 +00:00
|
|
|
-- trophies
|
|
|
|
function GJ.giveTrophy(id)
|
2015-02-16 22:10:38 +00:00
|
|
|
local s = string.find(req("trophies/add-achieved/?trophy_id=" .. id, "dump", true, true), "SUCCESS") ~= nil
|
|
|
|
GJ.fetchAllTrophies(true)
|
2015-03-01 13:33:29 +00:00
|
|
|
return s
|
2015-02-05 15:54:35 +00:00
|
|
|
end
|
|
|
|
|
2015-02-05 16:27:44 +00:00
|
|
|
function GJ.fetchTrophy(id)
|
|
|
|
local d = req("trophies/?trophy_id=" .. tostring(id), "keypair", true, true)
|
|
|
|
|
|
|
|
local t = {}
|
|
|
|
parseKeypair(d, function(k, v)
|
|
|
|
if k ~= "success" then t[k] = v end
|
|
|
|
end)
|
|
|
|
return t
|
|
|
|
end
|
|
|
|
|
|
|
|
function GJ.fetchTrophiesByStatus(achieved)
|
2015-02-16 22:10:38 +00:00
|
|
|
return handleTrophies("achieved=" .. (achieved and "true" or "false"))
|
2015-02-05 16:27:44 +00:00
|
|
|
end
|
|
|
|
|
2015-02-16 22:10:38 +00:00
|
|
|
function GJ.fetchAllTrophies(f)
|
|
|
|
if f then
|
|
|
|
GJ.trophies = handleTrophies("")
|
|
|
|
end
|
|
|
|
return GJ.trophies
|
2015-02-05 16:27:44 +00:00
|
|
|
end
|
|
|
|
|
2015-02-05 16:49:01 +00:00
|
|
|
-- scores
|
|
|
|
function GJ.addScore(score, desc, tableID, guestName, extraData)
|
|
|
|
local pu, pt, s = true, true, ""
|
2015-02-16 22:10:38 +00:00
|
|
|
if guestName then pu, pt = false, false, s .. "&guest=" .. escape(guestName) end
|
2015-02-05 16:49:01 +00:00
|
|
|
|
2015-02-16 22:10:38 +00:00
|
|
|
if extraData then s = s .. "&extra_data=" .. escape(extraData) end
|
|
|
|
if tableID then s = s .. "&table_id=" .. escape(tableID) end
|
2015-02-05 16:49:01 +00:00
|
|
|
|
2015-02-16 22:10:38 +00:00
|
|
|
return string.find(req("scores/add/?score=" .. escape(desc) .. "&sort=" .. score .. s, "dump", pu, pt), "SUCCESS") ~= nil
|
2015-02-05 16:49:01 +00:00
|
|
|
end
|
|
|
|
|
2015-02-05 16:57:26 +00:00
|
|
|
function GJ.fetchScores(limit, tableID)
|
|
|
|
local pu, pt, s = true, true, ""
|
2015-02-16 22:10:38 +00:00
|
|
|
if tableID then pu, pt, s = false, false, "&table_id=" .. escape(tableID) end
|
2015-02-05 16:57:26 +00:00
|
|
|
|
2015-02-16 22:10:38 +00:00
|
|
|
local d = req("scores/?limit=" .. (tonumber(limit or "") or 10) .. s, "keypair", pu, pt)
|
2015-02-05 16:57:26 +00:00
|
|
|
local t, f = {}
|
|
|
|
|
|
|
|
parseKeypair(d, function(k, v)
|
|
|
|
if k ~= "success" then
|
|
|
|
if k == "score" then
|
|
|
|
f = {}
|
|
|
|
table.insert(t, f)
|
|
|
|
end
|
|
|
|
f[k] = v
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
return t
|
|
|
|
end
|
|
|
|
|
2015-02-05 17:02:01 +00:00
|
|
|
function GJ.fetchTables()
|
|
|
|
local d = req("scores/tables/?", "keypair", false, false)
|
|
|
|
local t, f = {}
|
|
|
|
|
|
|
|
parseKeypair(d, function(k, v)
|
|
|
|
if k ~= "success" then
|
|
|
|
if k == "id" then
|
|
|
|
f = {}
|
|
|
|
table.insert(t, f)
|
|
|
|
end
|
|
|
|
f[k] = v
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
return t
|
|
|
|
end
|
|
|
|
|
2015-02-06 13:42:52 +00:00
|
|
|
return GJ
|