Admin Panel
- So I created a admin panel with in-game logs and discord logs.
Here is how I save the data in a table:
local saveSuccess, saveError = pcall(function()
BanDataStore:SetAsync(tostring(userId), {
Banned = true,
ExpirationTime = expirationTime,
AdminName = admin.Name or "Unknown Admin",
TargetPlayer = targetPlayer.Name,
Reason = reason,
TargetID = targetPlayer.UserId,
})
end)
I’m using this to get the data
local function getBanData(player)
local success, pages = pcall(BanDataStore.ListKeysAsync, BanDataStore)
if success then
local banData = {}
while true do
local items = pages:GetCurrentPage()
for _, dataStoreKey in ipairs(items) do
local success, value = pcall(BanDataStore.GetAsync, BanDataStore, dataStoreKey)
if success and type(value) == "table" and value.TargetPlayer and value.AdminName and value.Reason and value.ExpirationTime then
table.insert(banData, {
TargetPlayer = value.TargetPlayer,
AdminName = value.AdminName,
Reason = value.Reason,
ExpirationTime = value.ExpirationTime
})
else
warn("Invalid or incomplete data in DataStore for key:", dataStoreKey)
warn("Value:", value)
end
end
if pages.IsFinished then break end
pages:AdvanceToNextPageAsync()
end
RefreshEvent:FireClient(player, "RefreshBanData", banData)
else
warn("Error listing keys:", pages)
end
end
So I pass the bandata through this
RefreshEvent:FireClient(player, "RefreshBanData", banData)
Local script:
local function updateBanLogs(banData)
for _, banInfo in ipairs(banData) do
local newLog = Template:Clone()
newLog.Parent = BanLogsScrollingFrame
newLog.Name = banInfo.TargetPlayer
newLog.TargetUsername.Text = "Target: " .. banInfo.TargetPlayer
newLog.AdminUsername.Text = "Admin: " .. banInfo.AdminName
newLog.BanReason.Text = "Reason: " .. banInfo.Reason
newLog.Select.MouseButton1Click:Connect(function()
targetPlayer = banInfo.TargetPlayer
UnBanFrame.Visible = true
UnBanFrame.Reason.Text = "Unban reason for " .. targetPlayer
end)
end
end```
local Refreshbutton = script.Parent.RefreshButton
Refreshbutton.MouseButton1Click:Connect(function()
RefreshEvent:FireServer("RefreshBanData")
end)
RefreshEvent.OnClientEvent:Connect(function(eventType, data)
if eventType == "RefreshBanData" then
for _, logFrame in ipairs(BanLogsScrollingFrame:GetChildren()) do
if logFrame:IsA("Frame") then
logFrame:Destroy()
end
end
for _, banInfo in ipairs(data) do
updateBanLogs(banInfo.targetPlayer, banInfo.adminUsername, banInfo.banReason, banInfo.banLength)
end
elseif eventType == "LogBan" then
local targetPlayer = data.targetPlayer
local adminUsername = data.adminUsername
local banReason = data.banReason
local banLength = data.banLength
updateBanLogs(targetPlayer, adminUsername, banReason, banLength)
print("Logged.")
end
end)
So it creates a template with the information from each key in the datastore but it just doesn’t work.