CapsAdmin

Untitled

Jul 5th, 2012
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.86 KB | None | 0 0
  1. --[[
  2.     luadata by CapsAdmin (fuck copyright, do what you want with this)
  3.  
  4.     -- encodes table to string
  5.         string  luadata.Encode(tbl)
  6.  
  7.     -- decodes string to table
  8.     -- it will throw an error if there's a syntax error in the table
  9.         table   luadata.Decode(str)
  10.  
  11.     -- writes the table to file ( it's just "file.Write(path, luadata.Encode(str))" )
  12.         nil     luadata.WriteFile(path, tbl)
  13.         table   luadata.ReadFile(path)
  14.  
  15.     -- returns a string of how the variable is typically initialized
  16.         string  luadata.ToString(var)
  17.  
  18.     -- will let you add your own tostring function for a custom type
  19.     -- if you have made a custom data object, you can do this "mymatrix.LuaDataType = "Matrix33""
  20.     -- and it will make luadata.Type return that instead
  21.         nil     luadata.SetModifier(type, callback)
  22.  
  23. ]]
  24. luadata = luadata or {} local s = luadata
  25.  
  26. luadata.EscapeSequences = {
  27.     [("\a"):byte()] = [[\a]],
  28.     [("\b"):byte()] = [[\b]],
  29.     [("\f"):byte()] = [[\f]],
  30.     [("\t"):byte()] = [[\t]],
  31.     [("\r"):byte()] = [[\r]],
  32.     [("\v"):byte()] = [[\v]],
  33. }
  34.  
  35. local tab = 0
  36.  
  37. luadata.Types = {
  38.     ["number"] = function(var)
  39.         return ("%s"):format(var)
  40.     end,
  41.     ["string"] = function(var)
  42.  
  43.         local str = ""
  44.  
  45.         for char in var:gmatch(".") do
  46.             str = str  .. (s.EscapeSequences[str:byte()] or char)
  47.         end
  48.  
  49.         if str:find('"', nil, true) then
  50.             str = "'" .. str .. "'"
  51.         else
  52.             str = '"' .. str .. '"'
  53.         end
  54.  
  55.         return str
  56.     end,
  57.     ["boolean"] = function(var)
  58.         return ("%s"):format(var and "true" or "false")
  59.     end,
  60.     ["Vector"] = function(var)
  61.         return ("Vector(%s, %s, %s)"):format(var.x, var.y, var.z)
  62.     end,
  63.     ["Angle"] = function(var)
  64.         return ("Angle(%s, %s, %s)"):format(var.p, var.y, var.r)
  65.     end,
  66.  
  67. --[[    -- comment these out if you don't want shit like this to be storeable
  68.     ["Entity"] = function(var)
  69.         if var:IsPlayer() then
  70.             return ("player.GetByUniqueID(%q)"):format(var:UniqueID())
  71.         end
  72.  
  73.         return ("Entity(%i)"):format(var:EntIndex())
  74.     end,
  75.     ["Panel"] = function(var)
  76.         return "NULL"
  77.     end,
  78.     ["NULL"] = function(var)
  79.         return "NULL"
  80.     end, ]]
  81.  
  82.     ["table"] = function(var)
  83.         if
  84.             type(var.r) == "number" and
  85.             type(var.g) == "number" and
  86.             type(var.b) == "number" and
  87.             type(var.a) == "number"
  88.         then
  89.             return ("Color(%s, %s, %s, %s)"):format(var.r, var.g, var.b, var.a)
  90.         end
  91.  
  92.         tab = tab + 1
  93.         local str = luadata.Encode(var, true)
  94.         tab = tab - 1
  95.         return str
  96.     end,
  97. }
  98.  
  99. function luadata.SetModifier(type, callback)
  100.     luadata.Types[type] = callback
  101. end
  102.  
  103. function luadata.Type(var)
  104.     local t
  105.  
  106.     if IsEntity(var) then
  107.         if var:IsValid() then
  108.             t = "Entity"
  109.         else
  110.             t = "NULL"
  111.         end
  112.     else
  113.         t = type(var)
  114.     end
  115.  
  116.     if t == "table" then
  117.         if var.LuaDataType then
  118.             t = var.LuaDataType
  119.         end
  120.     end
  121.  
  122.     return t
  123. end
  124.  
  125. function luadata.ToString(var)
  126.     local func = s.Types[s.Type(var)]
  127.     return func and func(var)
  128. end
  129.  
  130. function luadata.Encode(tbl, __brackets)
  131.     if luadata.Hushed then return end
  132.  
  133.     local str = __brackets and "{\n" or ""
  134.  
  135.     for key, value in pairs(tbl) do
  136.         value = s.ToString(value)
  137.         key = s.ToString(key)
  138.  
  139.         if key and value and key ~= "__index" then
  140.             str = str .. ("\t"):rep(tab) ..  ("[%s] = %s,\n"):format(key, value)
  141.         end
  142.     end
  143.  
  144.     str = str .. ("\t"):rep(tab-1) .. (__brackets and "}" or "")
  145.  
  146.     return str
  147. end
  148.  
  149. function luadata.Decode(str)
  150.     return CompileString("return {\n" .. str .. "\n}", "luadata")()
  151. end
  152.  
  153. do -- file extension
  154.  
  155.     function luadata.WriteFile(path, tbl)
  156.         if luadata.Hushed then return end
  157.  
  158.         file.Write(path, luadata.Encode(tbl))
  159.     end
  160.  
  161.     function luadata.ReadFile(path)
  162.         return luadata.Decode(file.Read(path) or "")
  163.     end
  164.  
  165.     function luadata.SetKeyValueInFile(path, key, value)
  166.         if luadata.Hushed then return end
  167.  
  168.         local tbl = luadata.ReadFile(path)
  169.         tbl[key] = value
  170.         luadata.WriteFile(path, tbl)
  171.     end
  172.  
  173.     function luadata.AppendValueToFile(path, value)
  174.         if luadata.Hushed then return end
  175.  
  176.         local tbl = luadata.ReadFile(path)
  177.         table.insert(tbl, value)
  178.         luadata.WriteFile(path, tbl)
  179.     end
  180.  
  181.     function luadata.Hush(bool)
  182.         print("aaa")
  183.         luadata.Hushed = bool
  184.     end
  185.  
  186. end
  187.  
  188. do -- option extension
  189.     function luadata.AccessorFunc(tbl, func_name, var_name, nw, def)
  190.         tbl["Set" .. func_name] = function(self, val)
  191.             self[nw and "SetLuaDataNWOption" or "SetLuaDataOption"](self, var_name, val or def)
  192.         end
  193.  
  194.         tbl["Get" .. func_name] = function(self, val)
  195.             return self[nw and "GetLuaDataNWOption" or "GetLuaDataOption"](self, var_name, def)
  196.         end
  197.     end
  198.  
  199.     local meta = FindMetaTable("Player")
  200.  
  201.     function meta:LoadLuaDataOptions()
  202.         self.LuaDataOptions = luadata.ReadFile("luadata_options/" .. self:UniqueID() .. ".txt")
  203.  
  204.         for key, value in pairs(self.LuaDataOptions) do
  205.             if key:sub(0, 3) == "_nw" then
  206.                 self:SetNWString("ld_" .. key:sub(4), glon.encode(value))
  207.             end
  208.         end
  209.     end
  210.  
  211.     if SERVER then
  212.         hook.Add("OnEntityCreated", "luadata_player_spawn", function(ply)
  213.             if ply:IsValid() and _R.Player == getmetatable(ply) then
  214.                 ply:LoadLuaDataOptions()
  215.             end
  216.         end)
  217.     end
  218.  
  219.     function meta:SaveLuaDataOptions()
  220.         luadata.WriteFile("luadata_options/" .. self:UniqueID() .. ".txt", self.LuaDataOptions)
  221.     end
  222.  
  223.     function meta:SetLuaDataOption(key, value)
  224.         if not self.LuaDataOptions then self:LoadLuaDataOptions() end
  225.         self.LuaDataOptions[key] = value
  226.         self:SaveLuaDataOptions()
  227.     end
  228.  
  229.     function meta:GetLuaDataOption(key, def)
  230.         if not self.LuaDataOptions then self:LoadLuaDataOptions() end
  231.         return self.LuaDataOptions[key] or def
  232.     end
  233.  
  234.     function meta:SetLuaDataNWOption(key, value)
  235.         self:SetLuaDataOption("_nw"..key, value)
  236.         self:SetNWString("ld_" .. key, glon.encode(value))
  237.     end
  238.  
  239.     function meta:GetLuaDataNWOption(key, def)
  240.         local value
  241.  
  242.         if SERVER then
  243.             value = self:GetLuaDataOption("_nw"..key)
  244.  
  245.             if value then
  246.                 return value
  247.             end
  248.         end
  249.  
  250.         value = self:GetNWString("ld_" .. key, false)
  251.  
  252.         return type(value) == "string" and glon.decode(value) or def
  253.     end
  254. end
Add Comment
Please, Sign In to add comment