Implements callback fir 5.9.0

This commit is contained in:
AliasAlreadyTaken 2024-07-24 20:25:59 +02:00
parent 654e63cbc5
commit d9fce0231c
3 changed files with 67 additions and 30 deletions

View File

@ -4,9 +4,10 @@ local chatcommand_definition = {
description = yl_skinsdb_addon.t("chatcommand_import_skins_description"),
privs = {[yl_skinsdb_addon.settings.admin_priv] = true},
func = function(name, param)
local success, message = yl_skinsdb_addon.load_skins(
yl_skinsdb_addon.settings.path_textures,
yl_skinsdb_addon.callback_dam)
local success, message = yl_skinsdb_addon.load_skins(name,
yl_skinsdb_addon.settings
.path_textures,
true)
if success then
return true, message
else

View File

@ -1,7 +1,7 @@
-- Use this file to initialize variables once after server start and check everything is in place
local function run_each_serverstart()
yl_skinsdb_addon.data = {}
yl_skinsdb_addon.load_skins(yl_skinsdb_addon.settings.path_textures)
yl_skinsdb_addon.load_skins("", yl_skinsdb_addon.settings.path_textures)
end
run_each_serverstart()

View File

@ -11,7 +11,10 @@ end
function yl_skinsdb_addon.log(text) return log(text) end
local function load_skins(path_textures, callback_dam)
local delivered = {} -- delivered[filename][receiver] = true
local requested = {} -- requested[filename] = sender
local function load_skins(name, path_textures, callback_available)
-- Load skins from the current mod directory
local path_skins = yl_skinsdb_addon.worldpath .. path_textures
local dir_list = minetest.get_dir_list(path_skins)
@ -27,45 +30,42 @@ local function load_skins(path_textures, callback_dam)
for _, filename in pairs(dir_list) do
if (yl_skinsdb_addon.data[filename] == nil) then
local dam_options = {filepath = path_skins .. DIR_DELIM .. filename}
yl_skinsdb_addon.data[filename] = true
delivered[filename] = {}
requested[filename] = name
local do_callback
if (callback_available == true) then
do_callback = function(p_name)
yl_skinsdb_addon.callback_dam(p_name, path_skins, filename)
end
else
yl_skinsdb_addon.callback_dam(name, path_skins, filename)
end
local success_dam = minetest.dynamic_add_media(dam_options,
callback_dam)
-- TODO: Either move everything below to the callback OR
-- evne worse, only go on after each file was delivered to each player
-- That means having a file of players and marking each as "received"
-- only after the last player got the file, make the skin happen
local success_rs, message_rs =
skins.register_skin(path_skins, filename)
if success_rs == true then
imported_skins_list[filename] = "import"
log("Added skin " .. dump(filename))
do_callback)
if (success_dam == true) then
yl_skinsdb_addon.data[filename] = true
imported_skins_list[filename] = true
good = good + 1
else
imported_skins_list[filename] = "noimport"
log("Cannot add skin " .. dump(filename) .. " Reason: " ..
dump(message_rs))
imported_skins_list[filename] = false
bad = bad + 1
end
else
imported_skins_list[filename] = "exists"
log("Cannot add skin " .. dump(filename) .. " already exists.")
bad = bad + 1
total = total + 1
end
total = total + 1
end
local return_message = "Total: " .. tostring(total) .. ", good: " ..
tostring(good) .. ", bad: " .. tostring(bad) ..
"\n"
for k, state in pairs(imported_skins_list) do
if (state == "import") then
if (state == true) then
return_message = return_message .. "Import success: " .. k .. "\n"
elseif (state == "noimport") then
elseif (state == false) then
return_message = return_message .. "Import failed: " .. k .. "\n"
end
end
if (good > 0) then
if (bad == 0) then
success = true
else
success = false
@ -74,8 +74,44 @@ local function load_skins(path_textures, callback_dam)
return success, return_message
end
function yl_skinsdb_addon.load_skins(path_textures, callback)
return load_skins(path_textures, callback)
function yl_skinsdb_addon.load_skins(name, path_textures, callback)
return load_skins(name, path_textures, callback)
end
function yl_skinsdb_addon.callback_dam(name) log("Adds skin for " .. dump(name)) end
function yl_skinsdb_addon.callback_dam(name, path_skins, filename)
delivered[filename][name] = true
local players = minetest.get_connected_players()
for _, player in ipairs(players) do
local playername = player:get_player_name()
local can_receive = (minetest.get_player_information(playername)
.protocol_version >= 40)
local not_delivered = (delivered[filename][player:get_player_name()] ~=
true)
if (can_receive and not_delivered) then return false end
end
delivered[filename] = nil
-- Now every connected player received the file.
-- Let's register the skin and tell the person who imported
local sender = requested[filename] or ""
local success_rs, message_rs = skins.register_skin(path_skins, filename)
local return_message
if (success_rs == true) then
return_message = "Added skin " .. dump(filename)
else
return_message = "Cannot add skin " .. dump(filename) .. " Reason: " ..
dump(message_rs)
end
log(return_message)
minetest.chat_send_player(sender, return_message)
requested[filename] = nil
end