mirror of
https://github.com/luanti-org/luanti.git
synced 2025-08-01 17:38:41 +00:00
Add updating to online content browser
This commit is contained in:
parent
45e48295d2
commit
3eb363f813
11 changed files with 196 additions and 107 deletions
|
@ -15,6 +15,30 @@
|
|||
--with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
local store = {}
|
||||
local package_dialog = {}
|
||||
|
||||
local search_string = ""
|
||||
local cur_page = 1
|
||||
local num_per_page = 5
|
||||
local filter_type = 1
|
||||
local filter_types_titles = {
|
||||
fgettext("All packages"),
|
||||
fgettext("Games"),
|
||||
fgettext("Mods"),
|
||||
fgettext("Texture packs"),
|
||||
}
|
||||
|
||||
local filter_types_type = {
|
||||
nil,
|
||||
"game",
|
||||
"mod",
|
||||
"txp",
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
local function download_package(param)
|
||||
if core.download_file(param.package.url, param.filename) then
|
||||
return {
|
||||
|
@ -39,7 +63,9 @@ local function start_install(calling_dialog, package)
|
|||
|
||||
local function callback(result)
|
||||
if result.successful then
|
||||
local path, msg = pkgmgr.install(result.package.type, result.filename, result.package.name)
|
||||
local path, msg = pkgmgr.install(result.package.type,
|
||||
result.filename, result.package.name,
|
||||
result.package.path)
|
||||
if not path then
|
||||
gamedata.errormessage = msg
|
||||
else
|
||||
|
@ -69,6 +95,7 @@ local function start_install(calling_dialog, package)
|
|||
end
|
||||
set_def("description", result.package.short_description)
|
||||
set_def("author", result.package.author)
|
||||
conf:set("release", result.package.release)
|
||||
conf:write()
|
||||
end
|
||||
end
|
||||
|
@ -85,7 +112,7 @@ local function start_install(calling_dialog, package)
|
|||
end
|
||||
|
||||
if not core.handle_async(download_package, params, callback) then
|
||||
minetest.log("error", "ERROR: async event failed")
|
||||
core.log("error", "ERROR: async event failed")
|
||||
gamedata.errormessage = fgettext("Failed to download $1", package.name)
|
||||
end
|
||||
|
||||
|
@ -111,19 +138,35 @@ local function start_install(calling_dialog, package)
|
|||
end
|
||||
|
||||
|
||||
local package_dialog = {}
|
||||
|
||||
function package_dialog.get_formspec()
|
||||
local package = package_dialog.package
|
||||
|
||||
store.update_paths()
|
||||
|
||||
local formspec = {
|
||||
"size[8,4;true]",
|
||||
"size[9,4;true]",
|
||||
"label[2.5,0.2;", core.formspec_escape(package.title), "]",
|
||||
"textarea[0.2,1;8,3;;;", core.formspec_escape(package.short_description), "]",
|
||||
"textarea[0.2,1;9,3;;;", core.formspec_escape(package.short_description), "]",
|
||||
"button[0,0;2,1;back;", fgettext("Back"), "]",
|
||||
"button[6,0;2,1;install;", fgettext("Install"), "]",
|
||||
}
|
||||
|
||||
if not package.path then
|
||||
formspec[#formspec + 1] = "button[7,0;2,1;install;"
|
||||
formspec[#formspec + 1] = fgettext("Install")
|
||||
formspec[#formspec + 1] = "]"
|
||||
elseif package.installed_release < package.release then
|
||||
formspec[#formspec + 1] = "button[7,0;2,1;install;"
|
||||
formspec[#formspec + 1] = fgettext("Update")
|
||||
formspec[#formspec + 1] = "]"
|
||||
formspec[#formspec + 1] = "button[7,1;2,1;uninstall;"
|
||||
formspec[#formspec + 1] = fgettext("Uninstall")
|
||||
formspec[#formspec + 1] = "]"
|
||||
else
|
||||
formspec[#formspec + 1] = "button[7,0;2,1;uninstall;"
|
||||
formspec[#formspec + 1] = fgettext("Uninstall")
|
||||
formspec[#formspec + 1] = "]"
|
||||
end
|
||||
|
||||
-- TODO: screenshots
|
||||
|
||||
return table.concat(formspec, "")
|
||||
|
@ -136,7 +179,15 @@ function package_dialog.handle_submit(this, fields, tabname, tabdata)
|
|||
end
|
||||
|
||||
if fields.install then
|
||||
start_install(package_dialog.package)
|
||||
start_install(this, package_dialog.package)
|
||||
return true
|
||||
end
|
||||
|
||||
if fields.uninstall then
|
||||
local dlg_delmod = create_delete_content_dlg(package_dialog.package)
|
||||
dlg_delmod:set_parent(this)
|
||||
this:hide()
|
||||
dlg_delmod:show()
|
||||
return true
|
||||
end
|
||||
|
||||
|
@ -151,28 +202,6 @@ function package_dialog.create(package)
|
|||
nil)
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
local store = {}
|
||||
local search_string = ""
|
||||
local cur_page = 1
|
||||
local num_per_page = 5
|
||||
local filter_type = 1
|
||||
local filter_types_titles = {
|
||||
fgettext("All packages"),
|
||||
fgettext("Games"),
|
||||
fgettext("Mods"),
|
||||
fgettext("Texture packs"),
|
||||
}
|
||||
|
||||
local filter_types_type = {
|
||||
nil,
|
||||
"game",
|
||||
"mod",
|
||||
"txp",
|
||||
}
|
||||
|
||||
function store.load()
|
||||
store.packages_full = core.get_package_list()
|
||||
store.packages = store.packages_full
|
||||
|
@ -209,6 +238,7 @@ function store.update_paths()
|
|||
|
||||
if content and content.author == package.author then
|
||||
package.path = content.path
|
||||
package.installed_release = content.release
|
||||
else
|
||||
package.path = nil
|
||||
end
|
||||
|
@ -301,18 +331,24 @@ function store.get_formspec()
|
|||
formspec[#formspec + 1] = "]"
|
||||
|
||||
-- buttons
|
||||
if package.path then
|
||||
formspec[#formspec + 1] = "button[6,0;1.5,1;uninstall_"
|
||||
formspec[#formspec + 1] = tostring(i)
|
||||
formspec[#formspec + 1] = ";"
|
||||
formspec[#formspec + 1] = fgettext("Uninstall")
|
||||
formspec[#formspec + 1] = "]"
|
||||
else
|
||||
if not package.path then
|
||||
formspec[#formspec + 1] = "button[6,0;1.5,1;install_"
|
||||
formspec[#formspec + 1] = tostring(i)
|
||||
formspec[#formspec + 1] = ";"
|
||||
formspec[#formspec + 1] = fgettext("Install")
|
||||
formspec[#formspec + 1] = "]"
|
||||
elseif package.installed_release < package.release then
|
||||
formspec[#formspec + 1] = "button[6,0;1.5,1;install_"
|
||||
formspec[#formspec + 1] = tostring(i)
|
||||
formspec[#formspec + 1] = ";"
|
||||
formspec[#formspec + 1] = fgettext("Update")
|
||||
formspec[#formspec + 1] = "]"
|
||||
else
|
||||
formspec[#formspec + 1] = "button[6,0;1.5,1;uninstall_"
|
||||
formspec[#formspec + 1] = tostring(i)
|
||||
formspec[#formspec + 1] = ";"
|
||||
formspec[#formspec + 1] = fgettext("Uninstall")
|
||||
formspec[#formspec + 1] = "]"
|
||||
end
|
||||
formspec[#formspec + 1] = "button[7.5,0;1.5,1;view_"
|
||||
formspec[#formspec + 1] = tostring(i)
|
||||
|
|
|
@ -32,6 +32,7 @@ function get_mods(path,retval,modpack)
|
|||
|
||||
toadd.name = name
|
||||
toadd.author = mod_conf.author
|
||||
toadd.release = tonumber(mod_conf.release or "0")
|
||||
toadd.path = prefix
|
||||
toadd.type = "mod"
|
||||
|
||||
|
@ -74,6 +75,7 @@ function pkgmgr.get_texture_packs()
|
|||
retval[#retval + 1] = {
|
||||
name = item,
|
||||
author = conf:get("author"),
|
||||
release = tonumber(conf:get("release") or "0"),
|
||||
list_name = name,
|
||||
type = "txp",
|
||||
path = path,
|
||||
|
@ -336,90 +338,113 @@ function pkgmgr.get_worldconfig(worldpath)
|
|||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function pkgmgr.install_dir(type, path, basename)
|
||||
function pkgmgr.install_dir(type, path, basename, targetpath)
|
||||
local basefolder = pkgmgr.get_base_folder(path)
|
||||
|
||||
local targetpath
|
||||
-- There's no good way to detect a texture pack, so let's just assume
|
||||
-- it's correct for now.
|
||||
if type == "txp" then
|
||||
if basefolder and basefolder.type ~= "invalid" and basefolder.type ~= "txp" then
|
||||
return nil, fgettext("Unable to install a $1 as a texture pack", basefolder.type)
|
||||
end
|
||||
|
||||
local from = basefolder and basefolder.path or path
|
||||
targetpath = core.get_texturepath() .. DIR_DELIM .. basename
|
||||
core.copy_dir(from, targetpath)
|
||||
if targetpath then
|
||||
core.delete_dir(targetpath)
|
||||
core.create_dir(targetpath)
|
||||
else
|
||||
targetpath = core.get_texturepath() .. DIR_DELIM .. basename
|
||||
end
|
||||
if not core.copy_dir(from, targetpath) then
|
||||
return nil,
|
||||
fgettext("Failed to install $1 to $2", basename, targetpath)
|
||||
end
|
||||
return targetpath, nil
|
||||
|
||||
elseif not basefolder then
|
||||
return nil, fgettext("Unable to find a valid mod or modpack")
|
||||
end
|
||||
|
||||
--
|
||||
-- Get destination
|
||||
--
|
||||
if basefolder.type == "modpack" then
|
||||
if type ~= "mod" then
|
||||
return nil, fgettext("Unable to install a modpack as a $1", type)
|
||||
end
|
||||
local clean_path = nil
|
||||
|
||||
if basename ~= nil then
|
||||
clean_path = "mp_" .. basename
|
||||
end
|
||||
|
||||
if clean_path == nil then
|
||||
clean_path = get_last_folder(cleanup_path(basefolder.path))
|
||||
end
|
||||
|
||||
if clean_path ~= nil then
|
||||
targetpath = core.get_modpath() .. DIR_DELIM .. clean_path
|
||||
if not core.copy_dir(basefolder.path,targetpath) then
|
||||
return nil,
|
||||
fgettext("Failed to install $1 to $2", basename, targetpath)
|
||||
end
|
||||
-- Get destination name for modpack
|
||||
if targetpath then
|
||||
core.delete_dir(targetpath)
|
||||
core.create_dir(targetpath)
|
||||
else
|
||||
return nil,
|
||||
fgettext("Install Mod: unable to find suitable foldername for modpack $1",
|
||||
modfilename)
|
||||
local clean_path = nil
|
||||
if basename ~= nil then
|
||||
clean_path = "mp_" .. basename
|
||||
end
|
||||
if not clean_path then
|
||||
clean_path = get_last_folder(cleanup_path(basefolder.path))
|
||||
end
|
||||
if clean_path then
|
||||
targetpath = core.get_modpath() .. DIR_DELIM .. clean_path
|
||||
else
|
||||
return nil,
|
||||
fgettext("Install Mod: unable to find suitable foldername for modpack $1",
|
||||
modfilename)
|
||||
end
|
||||
end
|
||||
|
||||
pkgmgr.refresh_globals()
|
||||
|
||||
elseif basefolder.type == "mod" then
|
||||
if type ~= "mod" then
|
||||
return nil, fgettext("Unable to install a mod as a $1", type)
|
||||
end
|
||||
local targetfolder = basename
|
||||
|
||||
if targetfolder == nil then
|
||||
targetfolder = pkgmgr.identify_modname(basefolder.path,"init.lua")
|
||||
end
|
||||
|
||||
--if heuristic failed try to use current foldername
|
||||
if targetfolder == nil then
|
||||
targetfolder = get_last_folder(basefolder.path)
|
||||
end
|
||||
|
||||
if targetfolder ~= nil and pkgmgr.isValidModname(targetfolder) then
|
||||
targetpath = core.get_modpath() .. DIR_DELIM .. targetfolder
|
||||
core.copy_dir(basefolder.path, targetpath)
|
||||
if targetpath then
|
||||
core.delete_dir(targetpath)
|
||||
core.create_dir(targetpath)
|
||||
else
|
||||
return nil, fgettext("Install Mod: unable to find real modname for: $1", modfilename)
|
||||
end
|
||||
local targetfolder = basename
|
||||
if targetfolder == nil then
|
||||
targetfolder = pkgmgr.identify_modname(basefolder.path, "init.lua")
|
||||
end
|
||||
|
||||
pkgmgr.refresh_globals()
|
||||
-- If heuristic failed try to use current foldername
|
||||
if targetfolder == nil then
|
||||
targetfolder = get_last_folder(basefolder.path)
|
||||
end
|
||||
|
||||
if targetfolder ~= nil and pkgmgr.isValidModname(targetfolder) then
|
||||
targetpath = core.get_modpath() .. DIR_DELIM .. targetfolder
|
||||
else
|
||||
return nil, fgettext("Install Mod: unable to find real modname for: $1", modfilename)
|
||||
end
|
||||
end
|
||||
|
||||
elseif basefolder.type == "game" then
|
||||
if type ~= "game" then
|
||||
return nil, fgettext("Unable to install a game as a $1", type)
|
||||
end
|
||||
|
||||
targetpath = core.get_gamepath() .. DIR_DELIM .. basename
|
||||
core.copy_dir(basefolder.path, targetpath)
|
||||
if targetpath then
|
||||
core.delete_dir(targetpath)
|
||||
core.create_dir(targetpath)
|
||||
else
|
||||
targetpath = core.get_gamepath() .. DIR_DELIM .. basename
|
||||
end
|
||||
end
|
||||
|
||||
-- Copy it
|
||||
if not core.copy_dir(basefolder.path, targetpath) then
|
||||
return nil,
|
||||
fgettext("Failed to install $1 to $2", basename, targetpath)
|
||||
end
|
||||
|
||||
pkgmgr.refresh_globals()
|
||||
|
||||
return targetpath, nil
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
function pkgmgr.install(type, modfilename, basename)
|
||||
function pkgmgr.install(type, modfilename, basename, dest)
|
||||
local archive_info = pkgmgr.identify_filetype(modfilename)
|
||||
local path = pkgmgr.extract(archive_info)
|
||||
|
||||
|
@ -430,7 +455,7 @@ function pkgmgr.install(type, modfilename, basename)
|
|||
archive_info.type)
|
||||
end
|
||||
|
||||
local targetpath, msg = pkgmgr.install_dir(type, path, basename)
|
||||
local targetpath, msg = pkgmgr.install_dir(type, path, basename, dest)
|
||||
core.delete_dir(path)
|
||||
return targetpath, msg
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue