EasyProfile - A Simple Way to Store Player Data

Everything looks great and very easy to understand but I have a quick question, is there a way to easily check if the players data has been changed? I see that there is __index but not __newindex so I’m not entirely sure. Another question is how do I override the data if they’re offline? Like how do I change it? I saw it in the documentation and it didn’t mention anything about how to do it.

There’s no way to check if it has been changed; to change it when they are offline use the function returned from :GetProfileAsync() (in a tuple #2) which when run will override it with the edited table from tuple #1

Also if you ever want to add it to yours, this is how you can detect value change (does not detect tables)

local function PlayerAdded(player : Player)
	ServerDataStore:LoadProfileAsync(player, true):After(function(success, playerProfile)
		if not success then
			player:Kick(DataErrorMessage)
			return
		end
		
		--/ Create Leaderstats
		playerProfile:CreateProfileLeaderstats(player, {"Coins"})
		
		local profile = playerProfile.Profile
		
		local dummy = {
			Data = {}
		}
		local callbacks = {}
		
		--/ Value Changing
		dummy.Data.__index = function(_,index)
			return profile.Data[index]
		end
		dummy.__index = function(_,index)
			if (index ~= "Data") then
				return profile[index]
			end
		end
		
		dummy.Data.__newindex = function(_,index,value)
			profile.Data[index] = value

			local callback = callbacks[index]
			if not callback or typeof(callback) ~= "table" then return end

			for _, callback in callback do
				coroutine.wrap(callback)(value)
			end
		end
		dummy.__newindex = function(_,index,value)
			profile[index] = value
		end

		setmetatable(dummy.Data,dummy.Data)
		setmetatable(dummy,dummy)
		
		function dummy:OnDataValueChanged(index, callback)
			if (not callbacks[index]) then
				callbacks[index] = {}
			end
			table.insert(callbacks[index],callback)

			local Connection = {}
			function Connection:Disconnect()
				table.remove(callbacks[index],table.find(callbacks[index],callback))
			end
			return Connection
		end
		
		dummy:OnDataValueChanged("Coins", function(new)
			print("Coins:", new, "Data:", playerProfile:GetProfileData().Coins)
		end)
		
		LoadedProfiles[player] = dummy
	end)
end

So this will change their data? I’m not sure what you exactly mean by tuple #2, etc.

ServerDataStore:GetProfileAsync(1):After(function(success, data)
	data.Cash += 100
end)

My bad, it would be success, data, overwrite in that order where overwrite is a function you can run.

1 Like

Hey! Been using the old DataService module you created, and stumbled upon this. Would love to be able to view the github for better documentation but it seems the page is down. Hopefully you’re able to revive it? I genuinely enjoyed your DataService module but want to see what this project itself entails!

The documentation site isn’t working

1 Like
1 Like

Hello, nice release and work :slight_smile: You should add in your documentation how to update data and how to change data so it’s more easily understable for everyone :+1:

1 Like

Yes, I agree - I can’t seem to figure out how to use GetProfileAsync(). I’m trying to edit a profile outside of the player added function, and the documentation is very unhelpful.

Hi! Sorry to see many people struggling but we actually discontinued EasyProfile a while back.

Again, the documentation is still hosted here. But if many people still use this resource then I’ll probably ask the OP to update the post.

The main reason EasyProfile was discontinued was in favour of data store v2.

Post is locked; use alternatives such as DocumentService or the new datastore APIs coming soon.