This repository has been archived on 2024-09-19. You can view files and clone it, but cannot push or open issues or pull requests.
gamejoltlua/gamejolt.lua
2015-02-05 19:57:26 +03:00

207 lines
4.8 KiB
Lua

local md5 = require "md5"
local http = require "socket.http"
local GJ = {
gameID, gameKey,
isLoggedIn = false,
username, userToken
}
local BASE_URL = "http://gamejolt.com/api/game/v1/"
local function req(s, f, pu, pt)
local url = BASE_URL .. s .. "&game_id=" .. tostring(GJ.gameID) .. "&format=" .. f
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
local r, e = http.request(url)
return r
end
local function parseKeypair(s, on)
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)
c = b + 3
on(k, v)
end
end
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
function GJ.init(id, key)
GJ.gameID = id
GJ.gameKey = key
end
-- users
function GJ.authUser(name, token)
GJ.username = name
GJ.userToken = token
local s = string.find(req("users/auth/?", "dump", true, true), "SUCCESS") ~= nil
GJ.isLoggedIn = s
return s
end
function GJ.fetchUserByName(name)
local r = req("users/?username=" .. name, "keypair", false, false)
local t = {}
parseKeypair(r, function(k, v)
t[k] = v
end)
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)
return t
end
-- sessions
function GJ.openSession()
return string.find(req("sessions/open/?", "dump", true, true), "SUCCESS") ~= nil
end
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
function GJ.closeSession()
return string.find(req("sessions/close/?", "dump", true, true), "SUCCESS") ~= nil
end
-- data store
function GJ.fetchData(key, isGlobal)
local pu, pt = true, true
if isGlobal then pu, pt = false, false end
local d = req("data-store/?key=" .. key, "dump", pu, pt)
return string.sub(d, string.find(d, "\n"), string.len(d))
end
function GJ.setData(key, data, isGlobal)
local pu, pt = true, true
if isGlobal then pu, pt = false, false end
return string.find(req("data-store/set/?key=" .. key .. "&data=" .. tostring(data), "dump", pu, pt), "SUCCESS") ~= nil
end
function GJ.updateData(key, value, operation, isGlobal)
local pu, pt = true, true
if isGlobal then pu, pt = false, false end
local d = req("data-store/update/?key=" .. key .. "&operation=" .. operation .. "&value=" .. tostring(value), "dump", pu, pt)
return string.sub(d, string.find(d, "\n"), string.len(d))
end
function GJ.removeData(key, isGlobal)
local pu, pt = true, true
if isGlobal then pu, pt = false, false end
return string.find(req("data-store/remove/?key=" .. key, "dump", pu, pt), "SUCCESS") ~= nil
end
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
-- trophies
function GJ.giveTrophy(id)
return string.find(req("trophies/add-achieved/?trophy_id=" .. tostring(id), "dump", true, true), "SUCCESS") ~= nil
end
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)
return handleTrophies("achieved=" .. tostring(achieved))
end
function GJ.fetchAllTrophies()
return handleTrophies("")
end
-- scores
function GJ.addScore(score, desc, tableID, guestName, extraData)
local pu, pt, s = true, true, ""
if guestName then pu, pt = false, false, s .. "&guest=" .. guestName end
if extraData then s = s .. "&extra_data=" .. tostring(extraData) end
if tableID then s = s .. "&table_id=" .. tostring(tableID) end
return string.find(req("scores/add/?score=" .. tostring(desc) .. "&sort=" .. score .. s, "dump", pu, pt), "SUCCESS") ~= nil
end
function GJ.fetchScores(limit, tableID)
local pu, pt, s = true, true, ""
if tableID then pu, pt, s = false, false, "&table_id=" .. tostring(tableID) end
local d = req("scores/?limit=" .. tostring(limit) .. s, "keypair", pu, pt)
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
return GJ