From 29a1b97b3849daaf07e2d3789b54817101e9061c Mon Sep 17 00:00:00 2001
From: rubenwardy <rw@rubenwardy.com>
Date: Thu, 13 Sep 2018 17:31:58 +0100
Subject: Improve code structure and awards formspec size

---
 src/data.lua | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 111 insertions(+)
 create mode 100644 src/data.lua

(limited to 'src/data.lua')

diff --git a/src/data.lua b/src/data.lua
new file mode 100644
index 0000000..27ae5e3
--- /dev/null
+++ b/src/data.lua
@@ -0,0 +1,111 @@
+
+local storage = minetest.get_mod_storage()
+local __player_data
+
+-- Table Save Load Functions
+function awards.save()
+	storage:set_string("player_data", minetest.write_json(__player_data))
+end
+
+local function convert_data()
+	minetest.log("warning", "Importing awards data from previous version")
+
+	local old_players = __player_data
+	__player_data = {}
+	for name, data in pairs(old_players) do
+		while name.name do
+			name = name.name
+		end
+		data.name = name
+		print("Converting data for " .. name)
+
+		-- Just rename counted
+		local counted = {
+			chats  = "chat",
+			deaths = "death",
+			joins  = "join",
+		}
+		for from, to in pairs(counted) do
+			data[to]   = data[from]
+			data[from] = nil
+		end
+
+		data.death = {
+			unknown = data.death,
+			__total = data.death,
+		}
+
+		-- Convert item db to new format
+		local counted_items = {
+			count = "dig",
+			place = "place",
+			craft = "craft",
+		}
+		for from, to in pairs(counted_items) do
+			local ret = {}
+
+			local count = 0
+			if data[from] then
+				for modname, items in pairs(data[from]) do
+					for itemname, value in pairs(items) do
+						itemname = modname .. ":" .. itemname
+						local key = minetest.registered_aliases[itemname] or itemname
+						ret[key] = value
+						count = count + value
+					end
+				end
+			end
+
+			ret.__total = count
+			data[from] = nil
+			data[to] = ret
+		end
+
+		__player_data[name] = data
+	end
+end
+
+function awards.load()
+	local old_save_path = minetest.get_worldpath().."/awards.txt"
+	local file = io.open(old_save_path, "r")
+	if file then
+		local table = minetest.deserialize(file:read("*all"))
+		if type(table) == "table" then
+			__player_data = table
+			convert_data()
+		else
+			__player_data = {}
+		end
+		file:close()
+		os.rename(old_save_path, minetest.get_worldpath().."/awards.bk.txt")
+		awards.save()
+	else
+		__player_data = minetest.parse_json(storage:get_string("player_data")) or {}
+	end
+end
+
+function awards.player(name)
+	assert(type(name) == "string")
+	local data = __player_data[name] or {}
+	__player_data[name] = data
+
+	data.name     = data.name or name
+	data.unlocked = data.unlocked or {}
+	return data
+end
+
+function awards.player_or_nil(name)
+	return __player_data[name]
+end
+
+function awards.enable(name)
+	awards.player(name).disabled = nil
+end
+
+function awards.disable(name)
+	awards.player(name).disabled = true
+end
+
+function awards.clear_player(name)
+	__player_data[name] = {}
+end
-- 
cgit v1.2.3