データストアのバックアップモジュール
はじめまして!初投稿です!
昨日、私の運営する仮想空間「ガチャラボ」にて大規模なデータ災害が発生しました!
当然データのバックアップなんてとっていなかったためプレイヤーの皆さんはもうカンカンでした😇
なので、需要があるのかはわかりませんが、さっき作ったデータストアバックアップモジュールを共有します!
データストアの容量はわかんないので(有識者の方いましたらぜひ教えてください!)とりあえず一日の午前午後で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
回答
- トピックに返信するにはログインしてください