Advertisement
Guest User

Datastore with cache

a guest
Apr 6th, 2020
476
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 1.49 KB | None | 0 0
  1. local PlayerStore = game:GetService("DataStoreService"):GetDataStore("Data")
  2. local Players = game:GetService("Players")
  3.  
  4. local saved = {}
  5. local datastore = {}
  6. datastore.__index = datastore
  7.  
  8. function datastore.new(player)
  9.     if saved[player] then return saved[player] end
  10.     local self = setmetatable({}, datastore)
  11.    
  12.     self.Name = player.Name
  13.     self.UserID = player.UserId
  14.     self.FirstRetrieve = true
  15.     self.Cache = {}
  16.    
  17.     Players.PlayerRemoving:Connect(function(_player)
  18.         if player == _player then
  19.             xpcall(function()
  20.                 PlayerStore:SetAsync(self.UserID, self.Cache)
  21.             end, function(err)
  22.                 warn("Data could not be set for player", self.Name)
  23.             end)
  24.         end
  25.     end)
  26.    
  27.     saved[player] = self
  28.     return self
  29. end
  30.  
  31. function datastore:SaveData(key, value)
  32.     local success, result = xpcall(function()
  33.         PlayerStore:UpdateAsync(self.UserID, function(current)
  34.             current[key] = value
  35.             return current
  36.         end)
  37.     end, function(err)
  38.         print("Data could not be set for player", self.Name)
  39.     end)
  40.    
  41.     self.Cache[key] = value
  42. end
  43.  
  44. function datastore:GetData(key)
  45.     if self.FirstRetrieve then
  46.         local success, result = xpcall(function()
  47.             local data = PlayerStore:GetAsync(self.UserID)
  48.             self.Cache = data
  49.            
  50.             return data
  51.         end, function(err)
  52.             print("Data could not be retrieved for player", self.Name)
  53.         end)
  54.        
  55.         if not success then
  56.             return self.Cache[key] or nil
  57.         end
  58.        
  59.         self.FirstRetrieve = false
  60.         return result[key]
  61.     end
  62.    
  63.     return self.Cache[key]
  64. end
  65.  
  66. return datastore
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement