-- 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