データストアのバックアップモジュール

はじめまして!初投稿です!

昨日、私の運営する仮想空間「ガチャラボ」にて大規模なデータ災害が発生しました!
当然データのバックアップなんてとっていなかったためプレイヤーの皆さんはもうカンカンでした😇
なので、需要があるのかはわかりませんが、さっき作ったデータストアバックアップモジュールを共有します!

データストアの容量はわかんないので(有識者の方いましたらぜひ教えてください!)とりあえず一日の午前午後で5日分のデータが保存できるようになってます。5日分のデータが満杯になると古いほうから消されます
また、同じ日の同じ時間帯の同じ種類のデータは常に上書きされ続けます。
データごとに容量を管理したい場合には改良が必要です!

説明下手でごめんなさい!普段使ってるデータストアに後付けできます!
欠陥等あれば各自で修正お願いします!

--[[
2023/08/18 @KenmanYT
メモ

引数
userId - データをバックアップしたいプレイヤーのユーザーid
DatastoreName - バックアップしたいデータストアの名前. GetDatastoreするやつ
data - 保存したいデータ(テーブルとか)

]]--


local module = {}
local MaxItems = 41 -- 辞書のインデックス用テーブル分で余分に1増やす 4種のデータ×午前午後×5日+IndexOfDic = 41
local Data = game:GetService("DataStoreService"):GetDataStore("BackUpSatst") 

function module.BackUpDatastore(userId, DatastoreName, data)
	
	local NowDate = os.date("%Y-%m-%d-%p") -- 今の "YYYY-MM-DD-(AorP)M" の形式
	
	local success, saveditems = pcall(function() -- プレイヤーのバックアップデータ呼び出し
		return Data:GetAsync(userId)
	end)
	
	if success then -- 呼び出し成功なら
		
		if not(saveditems) then -- 呼び出しデータの中がなかったら
			saveditems = { -- 中は辞書形式
				IndexOfDic = {} -- 中はテーブル形式
			}
		end
		
	else --呼び出し失敗なら
		print("backup fail")
		return false
	end
	
	if userId and saveditems and NowDate and DatastoreName then -- 引数とかの値がちゃんとあれば
		
		local dataName = NowDate.."-"..DatastoreName -- "YYYY-MM-DD-(AorP)M-DatastoreName" みたいになる
		if saveditems[dataName] == nil then -- バックアップにdataNameのデータがなければ
			table.insert(saveditems["IndexOfDic"], dataName) -- インデックス管理用テーブルの先頭にdataNameをぶちこむ
		end
		saveditems[dataName] = data -- 「バックアップデータ」に「バックアップしたいデータ」をぶちこむ
		
		if #saveditems["IndexOfDic"] >= MaxItems then -- バックアップ数が規定量を超えたら
			local oldestDataName = saveditems["IndexOfDic"][MaxItems] -- 一番後ろのバックアップデータ名を持ってくる
			saveditems[oldestDataName] = nil -- 古いバックアップデータを削除
			saveditems["IndexOfDic"][MaxItems] = nil -- バックアップデータ名も消す
			print("olddata deleted")
		end
		
		print(saveditems)
		
		local success2, msg = pcall(function()
			return Data:SetAsync(userId, saveditems) -- バックアップデータを保存
		end)
		
		if success2 then --成功
			print("backup suc")
			return true
		else --失敗
			print("backup fail")
			print(msg)
			return false
		end
		
	else-- 引数とかの値が無ければ
		print("backup fail")
		return false
	end
	
end


return module

 

けんまん

こんにちは

Robloxアカウント:

https://www.roblox.com/users/1990370372/profile

回答

けんまん
2023年 08⽉ 18⽇

はじめまして!初投稿です!

昨日、私の運営する仮想空間「ガチャラボ」にて大規模なデータ災害が発生しました!
当然データのバックアップなんてとっていなかったためプレイヤーの皆さんはもうカンカンでした😇
なので、需要があるのかはわかりませんが、さっき作ったデータストアバックアップモジュールを共有します!

データストアの容量はわかんないので(有識者の方いましたらぜひ教えてください!)とりあえず一日の午前午後で5日分のデータが保存できるようになってます。5日分のデータが満杯になると古いほうから消されます
また、同じ日の同じ時間帯の同じ種類のデータは常に上書きされ続けます。
データごとに容量を管理したい場合には改良が必要です!

説明下手でごめんなさい!普段使ってるデータストアに後付けできます!
欠陥等あれば各自で修正お願いします!

--[[
2023/08/18 @KenmanYT
メモ

引数
userId - データをバックアップしたいプレイヤーのユーザーid
DatastoreName - バックアップしたいデータストアの名前. GetDatastoreするやつ
data - 保存したいデータ(テーブルとか)

]]--


local module = {}
local MaxItems = 41 -- 辞書のインデックス用テーブル分で余分に1増やす 4種のデータ×午前午後×5日+IndexOfDic = 41
local Data = game:GetService("DataStoreService"):GetDataStore("BackUpSatst") 

function module.BackUpDatastore(userId, DatastoreName, data)
	
	local NowDate = os.date("%Y-%m-%d-%p") -- 今の "YYYY-MM-DD-(AorP)M" の形式
	
	local success, saveditems = pcall(function() -- プレイヤーのバックアップデータ呼び出し
		return Data:GetAsync(userId)
	end)
	
	if success then -- 呼び出し成功なら
		
		if not(saveditems) then -- 呼び出しデータの中がなかったら
			saveditems = { -- 中は辞書形式
				IndexOfDic = {} -- 中はテーブル形式
			}
		end
		
	else --呼び出し失敗なら
		print("backup fail")
		return false
	end
	
	if userId and saveditems and NowDate and DatastoreName then -- 引数とかの値がちゃんとあれば
		
		local dataName = NowDate.."-"..DatastoreName -- "YYYY-MM-DD-(AorP)M-DatastoreName" みたいになる
		if saveditems[dataName] == nil then -- バックアップにdataNameのデータがなければ
			table.insert(saveditems["IndexOfDic"], dataName) -- インデックス管理用テーブルの先頭にdataNameをぶちこむ
		end
		saveditems[dataName] = data -- 「バックアップデータ」に「バックアップしたいデータ」をぶちこむ
		
		if #saveditems["IndexOfDic"] >= MaxItems then -- バックアップ数が規定量を超えたら
			local oldestDataName = saveditems["IndexOfDic"][MaxItems] -- 一番後ろのバックアップデータ名を持ってくる
			saveditems[oldestDataName] = nil -- 古いバックアップデータを削除
			saveditems["IndexOfDic"][MaxItems] = nil -- バックアップデータ名も消す
			print("olddata deleted")
		end
		
		print(saveditems)
		
		local success2, msg = pcall(function()
			return Data:SetAsync(userId, saveditems) -- バックアップデータを保存
		end)
		
		if success2 then --成功
			print("backup suc")
			return true
		else --失敗
			print("backup fail")
			print(msg)
			return false
		end
		
	else-- 引数とかの値が無ければ
		print("backup fail")
		return false
	end
	
end


return module

 

  • トピックに返信するにはログインしてください
2023年 08⽉ 18⽇
キャンセル

        

この機能を利⽤するには
ログインする必要があります。