Files
wnsrc/gamemodes/helix/gamemode/core/sh_data.lua
lifestorm 6a58f406b1 Upload
2024-08-04 23:54:45 +03:00

129 lines
4.3 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
--- Helper library for reading/writing files to the data folder.
-- @module ix.data
ix.data = ix.data or {}
ix.data.stored = ix.data.stored or {}
-- Create a folder to store data in.
file.CreateDir("helix")
--- Populates a file in the `data/helix` folder with some serialized data.
-- @realm shared
-- @string key Name of the file to save
-- @param value Some sort of data to save
-- @bool[opt=false] bGlobal Whether or not to write directly to the `data/helix` folder, or the `data/helix/schema` folder,
-- where `schema` is the name of the current schema.
-- @bool[opt=false] bIgnoreMap Whether or not to ignore the map and save in the schema folder, rather than
-- `data/helix/schema/map`, where `map` is the name of the current map.
function ix.data.Set(key, value, bGlobal, bIgnoreMap)
-- Get the base path to write to.
local path = "helix/" .. (bGlobal and "" or Schema.folder .. "/") .. (bIgnoreMap and "" or game.GetMap() .. "/")
-- Create the schema folder if the data is not global.
if (!bGlobal) then
file.CreateDir("helix/" .. Schema.folder .. "/")
end
-- If we're not ignoring the map, create a folder for the map.
file.CreateDir(path)
-- Write the data using JSON encoding.
file.Write(path .. key .. ".txt", util.TableToJSON({value}))
-- Cache the data value here.
ix.data.stored[key] = value
return path
end
--- Retrieves the contents of a saved file in the `data/helix` folder.
-- @realm shared
-- @string key Name of the file to load
-- @param default Value to return if the file could not be loaded successfully
-- @bool[opt=false] bGlobal Whether or not the data is in the `data/helix` folder, or the `data/helix/schema` folder,
-- where `schema` is the name of the current schema.
-- @bool[opt=false] bIgnoreMap Whether or not to ignore the map and load from the schema folder, rather than
-- `data/helix/schema/map`, where `map` is the name of the current map.
-- @bool[opt=false] bRefresh Whether or not to skip the cache and forcefully load from disk.
-- @return Value associated with the key, or the default that was given if it doesn't exists
function ix.data.Get(key, default, bGlobal, bIgnoreMap, bRefresh)
-- If it exists in the cache, return the cached value so it is faster.
if (!bRefresh) then
local stored = ix.data.stored[key]
if (stored != nil) then
return stored
end
end
-- Get the path to read from.
local path = "helix/" .. (bGlobal and "" or Schema.folder .. "/") .. (bIgnoreMap and "" or game.GetMap() .. "/")
-- Read the data from a local file.
local contents = file.Read(path .. key .. ".txt", "DATA")
if (contents and contents != "") then
local status, decoded = pcall(util.JSONToTable, contents)
if (status and decoded) then
local value = decoded[1]
if (value != nil) then
return value
end
end
-- Backwards compatibility.
-- This may be removed in the future.
status, decoded = pcall(pon.decode, contents)
if (status and decoded) then
local value = decoded[1]
if (value != nil) then
return value
end
end
end
return default
end
--- Deletes the contents of a saved file in the `data/helix` folder.
-- @realm shared
-- @string key Name of the file to delete
-- @bool[opt=false] bGlobal Whether or not the data is in the `data/helix` folder, or the `data/helix/schema` folder,
-- where `schema` is the name of the current schema.
-- @bool[opt=false] bIgnoreMap Whether or not to ignore the map and delete from the schema folder, rather than
-- `data/helix/schema/map`, where `map` is the name of the current map.
-- @treturn bool Whether or not the deletion has succeeded
function ix.data.Delete(key, bGlobal, bIgnoreMap)
-- Get the path to read from.
local path = "helix/" .. (bGlobal and "" or Schema.folder .. "/") .. (bIgnoreMap and "" or game.GetMap() .. "/")
-- Read the data from a local file.
local contents = file.Read(path .. key .. ".txt", "DATA")
if (contents and contents != "") then
file.Delete(path .. key .. ".txt")
ix.data.stored[key] = nil
return true
end
return false
end
if (SERVER) then
timer.Create("ixSaveData", 600, 0, function()
hook.Run("SaveData")
end)
end