Add HTTP API to main menu (#9998)

This commit is contained in:
rubenwardy 2020-06-06 17:17:08 +01:00 committed by Nils Dagsson Moskopp
parent 6837571319
commit 72b9ac6b36
Signed by: erle
GPG Key ID: A3BC671C35191080
4 changed files with 47 additions and 24 deletions

View File

@ -67,3 +67,22 @@ function dialog_create(name,get_formspec,buttonhandler,eventhandler)
ui.add(self) ui.add(self)
return self return self
end end
function messagebox(name, message)
return dialog_create(name,
function()
return ([[
formspec_version[3]
size[8,3]
textarea[0.375,0.375;7.25,1.2;;;%s]
button[3,1.825;2,0.8;ok;%s]
]]):format(message, fgettext("OK"))
end,
function(this, fields)
if fields.ok then
this:delete()
return true
end
end,
nil)
end

View File

@ -85,7 +85,7 @@ function ui.update()
"box[0.5,1.2;13,5;#000]", "box[0.5,1.2;13,5;#000]",
("textarea[0.5,1.2;13,5;;%s;%s]"):format( ("textarea[0.5,1.2;13,5;;%s;%s]"):format(
error_title, error_message), error_title, error_message),
"button[5,6.6;4,1;btn_error_confirm;" .. fgettext("Ok") .. "]" "button[5,6.6;4,1;btn_error_confirm;" .. fgettext("OK") .. "]"
} }
else else
local active_toplevel_ui_elements = 0 local active_toplevel_ui_elements = 0

View File

@ -36,6 +36,7 @@ dofile(commonpath .. "misc_helpers.lua")
if INIT == "game" then if INIT == "game" then
dofile(gamepath .. "init.lua") dofile(gamepath .. "init.lua")
assert(not core.get_http_api)
elseif INIT == "mainmenu" then elseif INIT == "mainmenu" then
local mm_script = core.settings:get("main_menu_script") local mm_script = core.settings:get("main_menu_script")
if mm_script and mm_script ~= "" then if mm_script and mm_script ~= "" then

View File

@ -1,5 +1,5 @@
--Minetest --Minetest
--Copyright (C) 2018 rubenwardy --Copyright (C) 2018-20 rubenwardy
-- --
--This program is free software; you can redistribute it and/or modify --This program is free software; you can redistribute it and/or modify
--it under the terms of the GNU Lesser General Public License as published by --it under the terms of the GNU Lesser General Public License as published by
@ -15,8 +15,18 @@
--with this program; if not, write to the Free Software Foundation, Inc., --with this program; if not, write to the Free Software Foundation, Inc.,
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. --51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
if not minetest.get_http_api then
function create_store_dlg()
return messagebox("store",
fgettext("ContentDB is not available when Minetest was compiled without cURL"))
end
return
end
local store = { packages = {}, packages_full = {} } local store = { packages = {}, packages_full = {} }
local http = minetest.get_http_api()
-- Screenshot -- Screenshot
local screenshot_dir = core.get_cache_path() .. DIR_DELIM .. "cdb" local screenshot_dir = core.get_cache_path() .. DIR_DELIM .. "cdb"
assert(core.create_dir(screenshot_dir)) assert(core.create_dir(screenshot_dir))
@ -171,11 +181,6 @@ local function get_screenshot(package)
end end
function store.load() function store.load()
local tmpdir = os.tempfolder()
local target = tmpdir .. DIR_DELIM .. "packages.json"
assert(core.create_dir(tmpdir))
local version = core.get_version() local version = core.get_version()
local base_url = core.settings:get("contentdb_url") local base_url = core.settings:get("contentdb_url")
local url = base_url .. local url = base_url ..
@ -189,31 +194,29 @@ function store.load()
end end
end end
core.download_file(url, target) local timeout = tonumber(minetest.settings:get("curl_file_download_timeout"))
local response = http.fetch_sync({ url = url, timeout = timeout })
if not response.succeeded then
return
end
local file = io.open(target, "r") store.packages_full = core.parse_json(response.data) or {}
if file then
store.packages_full = core.parse_json(file:read("*all")) or {}
file:close()
for _, package in pairs(store.packages_full) do for _, package in pairs(store.packages_full) do
package.url = base_url .. "/packages/" .. package.url = base_url .. "/packages/" ..
package.author .. "/" .. package.name .. package.author .. "/" .. package.name ..
"/releases/" .. package.release .. "/download/" "/releases/" .. package.release .. "/download/"
local name_len = #package.name local name_len = #package.name
if package.type == "game" and name_len > 5 and package.name:sub(name_len - 4) == "_game" then if package.type == "game" and name_len > 5 and package.name:sub(name_len - 4) == "_game" then
package.id = package.author:lower() .. "/" .. package.name:sub(1, name_len - 5) package.id = package.author:lower() .. "/" .. package.name:sub(1, name_len - 5)
else else
package.id = package.author:lower() .. "/" .. package.name package.id = package.author:lower() .. "/" .. package.name
end
end end
store.packages = store.packages_full
store.loaded = true
end end
core.delete_dir(tmpdir) store.packages = store.packages_full
store.loaded = true
end end
function store.update_paths() function store.update_paths()