CanaryDataService v1 | Managing Data Simplified

What is CanaryDataService?

CanaryDataService is a data management module I made for my framework, it’s easy to use and very straight-forward.


Videos and Screenshots


Why is this useful and better than other modules?

Well first of all, this uses ProfileService, which is the best data storing method at the time of writing this.

Why not Datastore 2?

Datastore 2 never gets updated, and does not prevent item duplication or data loss. When using my module, item duplication and data loss is fixed and should never happen.

Why not just use ProfileService by itself?

Though ProfileService is simple, and easy to learn, it still can be hard to learn. Personally, it took me a while to completely understand it.

Why should I use it overall?

There’s no need to set up your data and all of that, you get instant access to getter and setter functions. It also reduces how much code your actually writing, which can save tons of time.


Settings Module

First off, the default player key is located here. You need to fill it in in order for this to work. Example:

DefaultPlayerKeys = {
     ["Money"] = 50; -- key name, default key value
}

The other settings below are self-explanitory.


Documentation (coming soon) & Update Log


Quick Poll(s)

Would you this? Why or Why Not
  • Good job! I will use this in my game!
  • Very good, though I have no use for it.
  • It’s alright, could be better. (Reply please!)
  • This needs serious improvement. (Reply please!)

0 voters

Does this need more features?
  • More API (What kind?)
  • Better speed
  • Something else (Reply)
  • It’s already perfect!

0 voters

Out of 10, how good is this?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

0 voters

Fill out this survey please: https://forms.gle/kwX8WkASs6BkqN1a6


Code Sample (Creates a leaderboard):

local DataService = require(game:GetService("ServerStorage").CanaryDataService)
local Part = workspace.Part
local Prompt = Part.ProximityPrompt

DataService.DataLoaded:Connect(function(player)
	local Leaderstats = Instance.new("Folder")
	
	Leaderstats.Name = "leaderstats"
	Leaderstats.Parent = player
	
	local MoneyValue = Instance.new("NumberValue")
	
	MoneyValue.Name = "Money"
	MoneyValue.Parent = Leaderstats
	MoneyValue.Value = DataService:getKey(player, "Money")
	
	DataService.KeyChanged:Connect(function(_, key, newValue)
		if key == "Money" then
			MoneyValue.Value = newValue
		end
	end)
end)

local PromptDebounce = true

Prompt.Triggered:Connect(function(player)
	if PromptDebounce then
		PromptDebounce = false
		DataService:setKey(player, "Money", DataService:getKey(player, "Money") + 50)
		print(player.Name .. " now has " .. DataService:getKey(player, "Money") .. " money!")
		task.wait(1.5)
		PromptDebounce = true
	end
end)

Thanks!


Credits

Credit to @stravant for his signal module.

I 100% recommend you use all of these external resources, I personally have had great experience with them.


I might be including global updates soon, but the ProfileService docs are terrible at explaining it.

3 Likes

i speedran my way to the newest community resource post

really should’ve created documentation with the post

2 Likes

It should be fine for now, I have already documented the code in the script itself.

This is a wrapper for a wrapper for DataStores? That’s ridiculous…


Well first of all, this uses ProfileService, which is the best data storing method at the time of writing this.

Is it? I would argue not since there are proprietary data systems which are a lot more efficient and secure?

Datastore 2 never gets updated, and does not prevent item duplication or data loss. When using my module, item duplication and data loss is fixed and should never happen.

It’s open sourced? Make a PR to request changes to DataStore2?

Though ProfileService is simple, and easy to learn, it still can be hard to learn. Personally, it took me a while to completely understand it.

Then learn datastore by itself? It’s simple and offers a better standard to manipulating cloud state?

That being said, the solution to this problem isn’t to make a wrapper for a wrapper, but to just take a better look at profile service?

There’s no need to set up your data and all of that, you get instant access to getter and setter functions. It also reduces how much code your actually writing, which can save tons of time.

That is meant to be managed by the scripts bringing in the data from ProfileService?

1 Like

your form is collecting email information. why?

Not really. There’s no reason a wrapper can’t be wrapped to enhance what’s already going on. My current project wraps ProfileService (for a variety of specific use cases, e.g., sanitizing data before it saves to prevent either myself or another developer on the team accidentally saving the wrong types o of data).

That being said, it kind of seems like your reply is just to pick a bone with OP (there’s no reason that your entire reply needs to be completely [nine different times] composed of sarcastic question responses to the topic)

If you don’t like it, then don’t use it and move on. That isn’t to say “don’t comment on stuff unless you’re going to use it”, but there are way more civil and tactful ways to go about this.

2 Likes

This is so I can email you back about your feedback. If you don’t want to fill it out, then don’t, and only participate in the polls here.

Source please.

Not everyone has the time or skills to do this.

Again, data stores don’t have built in data loss prevention.

What’s wrong with making a wrapper to a wrapper? No one ever said it was a bad practice…

I give enough control already, if you want to edit the module, then edit it, no one is stopping you.

If your only gonna nitpick, then don’t do it on the dev forum.

Edit: Realized this was on Creations Feedback and not community resources, my apologies.

Not really. There’s no reason a wrapper can’t be wrapped to enhance what’s already going on.

Yeah, there is no reason, but this is why I’d avoid it

  • Magical errors ~ You might have XYZ error from line 2000 on script XYZ, and you wont have any idea how to fix it.
  • This’ll lead to wrapped wrapped wrapped datastores, which will lead to more wrapped things, the point of a wrapper is to simplify things, you dont then make a wrapper on a wrapper, you instead simplify the initial wrapper?
  • You need to update wrappers to the updated wrapper, which can lead to issues
  • What if the initial project dies, then all wrappers following that wrapper dies?

And, what kind of annoys me is this;

  • I feel like calling this a service is more a less a lie, it’s like making a lemonade stand outside of a store and buying that stores lemonade to sell with a touch of added ingredients?

(for a variety of specific use cases, e.g., sanitizing data before it saves to prevent either myself or another developer on the team accidentally saving the wrong types o of data).

Then could you look into using tools like Git?

That being said, it kind of seems like your reply is just to pick a bone with OP

I’ll admit fault - I didn’t check the channel and it looked like it was a release of a tool which other developers used, I didn’t know it was for asking feedback on this tool.

But, that being said I wouldn’t like to see developers standardizing such a practice, even though it implements layers of issues with the above points, so in a way I am responding with negative feedback, because I believe this shouldn’t be an idea people should consider…

But this is my own opinion, and like you said above ~ if I don’t like it, don’t use it.

but there are way more civil and tactful ways to go about this.

Sorry if I came off mean :sweat_smile: I try to bonk the nail on the head.
I do also want to apologize for my initial post, It was mostly negative feedback which I dont tend to post often :frowning:

2 Likes

Source please.

My own datastore system? I’m not quite sure what you mean by Source, I said there are proprietary data systems which are better? And the scale of ROBLOX, I would think that their is.

Not everyone has the time or skills to do this.

Then make the time and gain the skills? Why would you inefficiently use a system instead of just learning about what that system is.

And if that system is too complicated, make a wrapper for it, but by no means do you make a wrapper for a wrapper.

Again, data stores don’t have built in data loss prevention.

Was this said previously? If so then I apologize, but I still think its standard to implement a way to securely set and get data?

If you choose to not take this factor in, that’s like creating a calculator but always incrementing a random amount to the end result, your choosing to have the system not work efficiently.

I give enough control already, if you want to edit the module, then edit it, no one is stopping you.

The roblox website doesn’t allow me to suggest or make edits to someone elses code, thats not how that works?

If your only gonna nitpick, then don’t do it on the dev forum.

The point of DevForum is to have a discussion regarding these types of releases, In short this resource is useless and creates a resource to manage a resource to manage a resource, but the short version needs to be explained.


I do come off harsh, but I firmly believe that this isn’t a good implementation :frowning:

1 Like

ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio ratio

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.