GDPR Request, what do I do?

I just checked my messages and a few days ago Roblox sent this message for a user’s data to be removed?

I searched this topic on the dev forums and nothing seems to work. I installed crazyman32’s datastore editor plugin and nothing happened. I’m relatively new to scripting so I don’t know what to do here. I just want to make a game on my free time I don’t want legal issues. Can somebody help me please? Thanks

4 Likes

This means you need to remove all the data you hold about the player in your game. If all you using are data stores to store players data you can simply use the DataStore:RemoveAsync(Key) function to remove any data you hold about the player in your data stores.

For more information about removing data from data stores can be found on the data store page on the developers hub:


Here is a post on a similar topic explaining what to do with GDPR take down requests:

And remove any data on third party websites like Google Sheets, Trello, etc.

2 Likes

How do I use that line of code? Do I just make a new script inside serverscriptservice and paste that line in with the ID?

Do you know what data stores are being used in your game? Do you use any public models (e.g. admin commands) that might use their own data stores?

local sampleDataStore = game:GetService("DataStoreService"):GetDataStore("MyDataStore")
 
game.Players.PlayerRemoving:Connect(function(player)
	local playerKey = "Player_" .. player.UserId
 
	local success, val = pcall(function()
		return sampleDataStore:RemoveAsync(playerKey)
	end)
 
	if success then
		print(val)
	end
end)

Here is an example from developer.roblox.com following what waterrunner said

I used a youtuber’s datastore tutorial for mine.
image

Are these the datastores?

That information is all kept on the client. Is there a script saving the data? If you know the key then maybe use a data remover plugin if you can not figure out how to use the command.

Data stores are accessed using DataStoreService. If that script uses it, you should figure out how it stores data so you can figure out what to delete. If this is a public script you could also share it here too.

Provided two things:

  • You have Studio API access enabled
  • You are using a simple DataStore solution

You can ran the thing that water gave you, RemoveAsync, in the command bar. If the command bar isn’t on your view, you can enable it from the Studio ribbon bar menu.

With whatever UserId is given to you in the PM, paste in the command bar:

local DataStoreService = game:GetService("DataStoreService")
local DataStore = DataStoreService:GetDataStore("PUT THE NAME HERE")
DataStore:RemoveAsync(PUT THE USER ID HERE)

This must be done for any and all DataStores that exist in your game. Once that has been taken care of and you confirm that there’s no data (you can run a quick GetAsync and print the result if you’re really visual about it), you should be good.

For games that integrate more tracking features than just DataStores, they will have to clear records manually on that service.

1 Like

What do I put for “Put the name here”. Do i put the name of the datastore?
image

Is the name of the values what I need to put in the parenthesis?

image

Is this the script saving the data? I’m not experienced with datastore at all I just used a kit so I have no clue if this it what you’re referring to

I tried entering it in the command bar and it printed this in the output

image [ID] image

Can you search for any instances of “DataStoreService” in your game? Press Ctrl+Shift+F on Windows (Command+Shift+F on Mac) and search for DataStoreService (make sure “Look in” is set to “All Scripts”). If any scripts appear, look inside them for calls to GetDataStore, GetGlobalDataStore, or GetOrderedDataStore. These would be loading data stores where keys can be added, modified, and deleted.

1 Like

Ok there’s one script with that inside. It has “GetDataStore” inside. Now how would I delete or modify the key for the specific userID with this information?

local DataStore = game:GetService("DataStoreService")
local gameData = DataStore:GetDataStore("data 2")--When making a Data Store, DOOOOO NOTTTTT!!!!! Change this name unless you want to make new data for the game!

local Storage = script.Storage:GetChildren()

local maxLevel = 100

local function saveData(plr, folder)
	warn("Saving Data...")
	local dataToSave = {}
	
	for i, folders in pairs(folder:GetChildren()) do
		--Making SubTables or Tables inside the main table
		dataToSave[i] = {}
		
		for j, data in pairs(folders:GetChildren()) do
			dataToSave[i][j] = data.Value
			print(data.Name, dataToSave[i][j])
		end
	end
	
	gameData:SetAsync(plr.UserId, dataToSave)
	warn("Data Saved!")
end

game.Players.PlayerAdded:Connect(function(newPlr)
	local PlrStats = Instance.new("Folder",newPlr)
	PlrStats.Name = "PlrStats"
	
	--Generating new Data
	for i, folders in pairs(Storage) do
		local newFold = folders:Clone()
		newFold.Parent = PlrStats
	end
	
	--Looking for saved Data
	local saves = gameData:GetAsync(newPlr.UserId)
	
	--If the player has saved data
	if saves then
		warn("Player Data Found!")
		
		--Loading data 
		for i, folders in pairs(PlrStats:GetChildren()) do
			for j, data in pairs(folders:GetChildren()) do
				data.Value = saves[i][j]
				print(i,j,data.Name,data.Value)
			end
		end
		
	--If the player doesn't have saved data
	else
		warn("Player Doesn't have Data...")
		
	end
	
	while wait() do
		local exp = PlrStats:WaitForChild("PlrInfo"):WaitForChild("Exp")
		local level = PlrStats:WaitForChild("PlrInfo"):WaitForChild("Level")
		local Points = PlrStats:WaitForChild("PlrInfo"):WaitForChild("Points")
		local needExp = PlrStats:WaitForChild("PlrInfo"):WaitForChild("ExpNeed")
		
		local extraLevel = level.Value
		local expNeed = ((extraLevel * 2)-1) * 5
		needExp.Value = expNeed
		
		if level.Value < maxLevel then
			if exp.Value >= expNeed then
				
				--Increase level by 1
				level.Value = level.Value + 1
				
				--Remove needed exp
				exp.Value = exp.Value - expNeed
				
				--Add points based on every level
				Points.Value = Points.Value + 2
			end
		end
	end
end)

game.Players.PlayerRemoving:Connect(function(oldPlr)
	local PlrStats = oldPlr:WaitForChild("PlrStats")
	saveData(oldPlr,PlrStats)
end)

This script seems to only save one key per player to one data store. Based on this, you should run this in the command bar with Studio API access enabled, or put it in a new Script and run it in a live server:

-- replace 123 with the proper ID
game:GetService('DataStoreService'):GetDataStore('data 2'):RemoveAsync(123)

This one-line script will get DataStoreService, then the specific data store that has the data, and remove the key based on the user’s ID.

That should be all you need to do data store wise. If you have any other info elsewhere off Roblox you need to manually remove it.

Ok, I ran it inside the command bar. Does this seem like the right output?
image

Looks fine since there wasn’t any errors. If you really want to be sure, try running this. It should print “nil” if the data was removed. If it prints anything else then it wasn’t removed.

print(game:GetService('DataStoreService'):GetDataStore('data 2'):GetAsync(123))

image

I think it prints the entire command itself

You might want to hide the ID better in your screenshots, or copy the output and paste here with it removed instead. I personally wouldn’t want to risk anything by even partial reveals.

This command is supposed to print the value to the key of the user’s ID. Is it printing nothing at all?