How would I do a tempban script?

I’m fine with the command lol, I don’t want you to script everything.

Basically. You would create a timestamp for when they were banned, add it to their datastore, and every time they try to rejoin you check if they have a ban timestamp or whatever and do some math (timestamp - current time) to check the difference between when they were banned and when they’re rejoining the game. If enough time hasn’t passed, kick them. Otherwise, remove the timestamp and let them play.

The problem is that I don’t know how to script it…

I am done in 1 minute. I will teach you how I did it after.

not really. iirc, os.time() returns the amount of seconds since the epoch (January 1st 1970 00:00:00). It isn’t the date that’s set on the computer.

os | Roblox Creator Documentation (oh hey look, there’s a dedicated function os.difftime for checking difference between two times)

This is pretty much all you need.

Its jan 1st not 7th okkkkkkkkkk

Isn’t that tick()? Ok never mind

I am done. Try this out I also gave you a function to ban player.


local globaldatastore = game:GetService("DataStoreService")

local bans = globaldatastore:GetDataStore("TempBans")

local players = game:GetService("Players")

players.PlayerAdded:Connect(function(player)
	local banData
	local good, bad = pcall(function()
		banData = bans:GetAsync("plr_"..tostring(player.UserId))
	end)
	if bad then
		warn("Error getting datastore: "..bad)
	end
	if banData ~= {} then
		local prevtime = banData[1]
		local reason = banData[2]
		local banlength = banData[3]
		if os.time() < (prevtime+banlength) then
			local timeleft = (prevtime+banlength)-os.time()
			
			local hours = math.floor(timeleft/3600)

			local hs = timeleft % 3600

			local mins = math.floor(hs/60)

			local secsleft = hs%60

			player:Kick(reason.. " for: "..hours.." Hours, "..mins.." Mins, "..math.floor(secsleft).. " Seconds")
		else
			local g,b = pcall(function()
				bans:SetAsync("plr_"..tostring(player.UserId),{})
			end)
			if g then
				print("player waited their time and got unbanned succesfully.")
			else
				warn("error setting datastore: ".. b)
				bans:SetAsync("plr_"..tostring(player.UserId),{})
			end
		end
	end
end)


function BanPlayer(userid,timeinseconds,reason)
	if game.Players:GetPlayerByUserId(userid) then
		local timeleft = timeinseconds

		local hours = math.floor(timeleft/3600)

		local hs = timeleft % 3600

		local mins = math.floor(hs/60)

		local secsleft = hs%60
		
		game.Players:GetPlayerByUserId(userid):Kick(reason.. " for: "..hours.." Hours, "..mins.." Mins, "..math.floor(secsleft).. " Seconds")
		
		local g,b = pcall(function()
			bans:SetAsync("plr_"..tostring(userid),{os.time(),reason,timeinseconds})
		end)
		if g then
			print("succesfully banned player.")
		else
			warn("error setting ban datastore: "..b)
			bans:SetAsync("plr_"..tostring(userid),{os.time(),reason,timeinseconds}) -- attempt agian.
		end
	else
		local g,b = pcall(function()
			bans:SetAsync("plr_"..tostring(userid),{os.time(),reason,timeinseconds})
		end)
		if g then
			print("succesfully banned player.")
		else
			warn("error setting ban datastore: "..b)
			bans:SetAsync("plr_"..tostring(userid),{os.time(),reason,timeinseconds}) -- attempt agian.
		end
	end
end

Thanks. I’ve the updated post.

I am not sure if that will work or not, we could try it out in a test place?

Yes, but os.time() is (apparently) more precise. Which one should I use? time - #2 by Jrelvas

tick() is deprecated and less precise. Should not be used for new work.

How could I place your script in this:


local moderation = {}
local BanDDS = game:GetService("DataStoreService"):GetDataStore("ban-key-A54")
local TempBanDDS = game:GetService("DataStoreService"):GetDataStore("tempban-key-B64")

function moderation:PlrKick(plr, reason)
	local plr = game:GetService("Players"):FindFirstChild(plr)
	if plr then
		if reason ~= nil or reason ~= "" then
			plr:Kick(reason)
		else
			plr:Kick("You have been kicked from the game, no reasons where specified.")
		end
	end
end

function moderation:ShadowBan(plr)
	local plr = game:GetService("Players"):FindFirstChild(plr)
	BanDDS:SetAsync(plr.UserId.."-SBAN",true)
	if plr then
		local char = workspace:WaitForChild(plr.Name)
		char.Humanoid.WalkSpeed = 0.012 and char.Humanoid.JumpPower == 0.012
		local darkframe = Instance.new("ScreenGui")
		darkframe.Parent = plr.PlayerGui
		darkframe.Name = "ShadowBan"
		local main = Instance.new("Frame")
		main.Name = "main"
		main.Parent = darkframe
		main.BackgroundColor3 = Color3.new(0,0,0)
		main.BorderColor3 = Color3.new(0,0,0)
		main.Size = UDim2.new(1,0,1,0)
		main.BackgroundTransparency = UDim.new(0.5)
		darkframe.IgnoreGuiInset = true
		darkframe.ResetOnSpawn = false
		darkframe.Archivable = false
		task.wait(10)
		plr:Kick("Error\nInternal Server Error (500)\nAn unexpected error occured")
	end
end

function moderation:PermBan(plr, reason)
	local plr = game:GetService("Players"):FindFirstChild(plr)
		
	BanDDS:SetAsync(plr.UserId.."-PBAN",true)
	if reason ~= nil or reason ~= "" then
		plr:Kick("[PERM BAN]\nYou have been permanently banned.\nReason: "..reason)
	else
		BanDDS:SetAsync(plr.UserId.."-PBAN",true)
			plr:Kick("[PERM BAN]\nYou have been permanently banned.")
	end
end

function moderation:ServerBan(plr, reason)
	local plr = game:GetService("Players"):FindFirstChild(plr)
	BanDDS:SetAsync(plr.UserId.."-SERVBAN",true)
	if reason ~= nil or reason ~= "" then
		plr:Kick("[SERVER BAN]\nYou have been banned from this server.\nReason: "..reason)
	else
		BanDDS:SetAsync(plr.UserId.."-SERVBAN",true)
		plr:Kick("[SERVER BAN]\nYou have been banned from this server.")
	end
end

function moderation:RevokeBan(plr)
	local plr = game:GetService("Players"):FindFirstChild(plr)
	if BanDDS:GetAsync(plr.UserId.."-PBAN",true) then
		BanDDS:SetAsync(plr.UserId.."-PBAN",false)
	elseif BanDDS:GetAsync(plr.UserId.."-SERVBAN",true) then
		BanDDS:SetAsync(plr.UserId.."-SERVBAN",false)
	elseif BanDDS:GetAsync(plr.UserId.."-SBAN",true) then
		BanDDS:SetAsync(plr.UserId.."-SBAN",false)
	elseif BanDDS:GetAsync(plr.UserId.."-TBAN",true) then
		BanDDS:SetAsync(plr.UserId.."-TBAN",false)
	end
end

game.Players.PlayerAdded:Connect(function(plr)
	if BanDDS:GetAsync(plr.UserId.."-PBAN",true) then
		plr:Kick("[PERM BAN]\nYou are currently permanently banned.")
	elseif BanDDS:GetAsync(plr.UserId.."-SBAN",true) then
		moderation:ShadowBan(plr.Name)
	end
end)


game:BindToClose(function()
	local plr = game:GetService("Players")
	if BanDDS:GetAsync(plr.UserId.."-SERVBAN",true) then
		BanDDS:SetAsync(plr.UserId.."-SERVBAN",false)
	end
end)

return moderation

Like a new function, moderation:TempBan() then just link the already put in function side the other function.

1 Like

Please don’t give people entire scripts like this. Instead, teach them how to do it. You can include a code sample if you want, but you should explain what your code is doing.
See some quote about fish.