summaryrefslogtreecommitdiff
path: root/src/data.lua
diff options
context:
space:
mode:
Diffstat (limited to 'src/data.lua')
-rw-r--r--src/data.lua111
1 files changed, 111 insertions, 0 deletions
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