mame/plugins/data/data_marp.lua
2018-01-15 21:30:59 -06:00

151 lines
3.5 KiB
Lua

-- get marp high score file from http://replay.marpirc.net/txt/scores3.htm
local dat = {}
local db = require("data/database")
local ver, info
local function init()
local filepath
local dbver
local fh
local file = "scores3.htm"
for path in mame_manager:ui():options().entries.historypath:value():gmatch("([^;]+)") do
filepath = lfs.env_replace(path) .. "/" .. file
fh = io.open(filepath, "r")
if fh then
break
end
end
local stmt = db.prepare("SELECT version FROM version WHERE datfile = ?")
db.check("reading marp version")
stmt:bind_values(file)
if stmt:step() == db.ROW then
dbver = stmt:get_value(0)
end
stmt:finalize()
if not fh and dbver then
-- data in database but missing file, just use what we have
ver = dbver
return
elseif not fh then
return
elseif not dbver then
db.exec("CREATE TABLE \"" .. file .. [[" (
romset VARCHAR NOT NULL,
data CLOB NOT NULL)]])
db.check("creating marp table")
db.exec("CREATE INDEX \"romset_" .. file .. "\" ON \"" .. file .. "_idx\"(romset)")
db.check("creating marp index")
end
for line in fh:lines() do
local match = line:match("Top Scores from the MAME Action Replay Page %(([%w :]+)%)")
if match then
ver = match
break
end
end
if not ver then
fh:close()
return
end
if ver == dbver then
fh:close()
return
end
if dbver then
db.exec("DELETE FROM \"" .. file .. "\"")
db.check("deleting marp")
db.exec("DELETE FROM \"" .. file .. "_idx\"")
db.check("deleting marp index")
stmt = db.prepare("UPDATE version SET version = ? WHERE datfile = ?")
db.check("updating marp version")
else
stmt = db.prepare("INSERT INTO version VALUES (?, ?)")
db.check("inserting marp version")
end
stmt:bind_values(ver, file)
stmt:step()
stmt:finalize()
fh:seek("set")
local buffer = fh:read("a")
db.exec("BEGIN TRANSACTION")
db.check("beginning marp transation")
local function gmatchpos()
local pos = 1
local set, data = ""
local function iter()
local lastset = set
while true do
local spos, scr, plyr, stype, ltype
local url = ""
spos, pos, set, stype, scr, plyr, ltype = buffer:find("\n%s*([%w_]*)%-?(%w-) :%s*(%d+) [;:] ([^:]+): [^%[\n]*%[?([%w ]*)[^\n]*", pos)
if not spos then
return nil
end
if set ~= "" then
if ltype ~= "" then
url = ltype .. "\t\n"
else
url = ""
end
url = url .. "http://replay.marpirc.net/r/" .. set .. ((stype ~= "") and ("-" .. stype) or "") .. "\t\n"
end
if set ~= "" and lastset and lastset ~= set then
local lastdata = data
data = url .. plyr .. "\t" .. scr .. "\n"
return lastset, lastdata
end
data = data .. ((url ~= "") and ("\n" .. url) or "") .. plyr .. "\t" .. scr .. "\n"
end
end
return iter
end
for set, data in gmatchpos() do
stmt = db.prepare("INSERT INTO \"" .. file .. "\" VALUES (?, ?)")
db.check("inserting marp values")
stmt:bind_values(set, data)
stmt:step()
stmt:finalize()
end
fh:close()
db.exec("END TRANSACTION")
db.check("ending marp transation")
end
if db then
init()
end
function dat.check(set, softlist)
if softlist or not ver or not db then
return nil
end
info = nil
local stmt = db.prepare("SELECT data FROM \"scores3.htm\" AS f WHERE romset = ?")
db.check("reading marp data")
stmt:bind_values(set)
if stmt:step() == db.ROW then
info = "#j2\n" .. stmt:get_value(0)
end
stmt:finalize()
return info and _("MARPScore") or nil
end
function dat.get()
return info
end
function dat.ver()
return ver
end
return dat