Quick actions

cmd+k|ctrl+k

Navigation

Languages

trust alg

Snippet info

Language

Lua

Visibility

public

Author

lazarovalkyrie

Created

2024-02-25T22:38:03.795598Z

Updated

2024-07-15T23:28:27.660606Z

--[[

= TRUST ALG =

Made by Lazaro Valkyrie

This is used to prevent bots and alts
Very useful but sometimes it is not friendly to new Roblox players
The board is not required, this can be used silently in the background and can be used to let players have a good time without trolls, bots, etc.

]]

local proxy = 'roproxy.com' -- api proxy to replace roblox
local base_trust = 0
local board = nil
local title = nil
local funcs = {}
local kick = false -- kick if the player is not trusted
local list = true -- to see players trust (disable if using for game anti cheat)
local tmin = 0 -- minimum trust factor (this really matters)
local tmax = 3 -- max trust for warning icon (just visual)

local HS = game:GetService("HttpService")
local BS = game:GetService("BadgeService")
local MPS = game:GetService("MarketplaceService")

function afunc(f) -- adds functions that determine the players trust
	table.insert(funcs,1,f)
end

function wrap(f)
	return coroutine.wrap(f)()
end

local req = 0
local failed_req = 0
local success_req = 0

local http_codes = {
	['Too Many Requests'] = 1,
	['Forbidden'] = 2,
	['Bad Request'] = 3,
}

function http(l)
	local result
	local attempts = 0
	local pass = true
	local st = os.clock()
	local error_code = nil
	
	local function att()
		local success,ret = pcall(function()
			return HS:GetAsync(l)
		end)
		if success then
			success_req = success_req + 1
			result = HS:JSONDecode(ret)
		else
			for i,v in pairs(http_codes) do
				if string.find(ret,i) then
					error_code = v
					break
				end
			end
			pass = false
		end
	end
	
	while true do
		att()
		if result then
			req = req + 1
			break
		end
		if error_code == 1 then
			if os.clock()-st > 65 then
				failed_req = failed_req + 1
				req = req + 1
				return
			end
			task.wait(6)
		else
			--print(error_code,l)
			failed_req = failed_req + 1
			req = req + 1
			return
		end
	end
	
	return result
end

afunc(function(plr)
	if plr.MembershipType == Enum.MembershipType.None then
		return 0, 'premium'
	else
		return 2, 'premium'
	end
end)

-- unreliable (people can have overpriced ugc items)
--afunc(function(plr)
--	local info = game:GetService("Players"):GetCharacterAppearanceInfoAsync(plr.UserId)
--	local items = info.assets
--	local t = 0
	
--	for x,v in pairs(items) do
--		local ProductInfo = game:GetService("MarketplaceService"):GetProductInfo(v.id,Enum.InfoType.Asset)
--		if ProductInfo.IsForSale then
--			t += ProductInfo.PriceInRobux
--		end
--	end
	
--	local org = t
	
--	t = math.sqrt(t)/50
--	t = math.clamp(t,0,50)
	
--	return t, 'avatar cost: ' .. org
--end)

afunc(function(plr)
	local y = os.date('!*t').year-2006
	local age = plr.AccountAge
	age = age/365
	
	local m = 3
	if m >= age then
		age = (1-age/m)*-3
	else
		age = age/y*3
	end
	
	return age, 'age'
end)

afunc(function(plr)
	local groups = { -- set this for trusted groups the player could be in
		--{
		--	id = 3256759, -- vsb
		--	ranks = {
		--		['Owner'] = 10,
		--		['Co-Owner'] = 10,
		--		['Admin'] = 7,
		--		['Group Mod'] = 5,
		--		['Sb Mod'] = 5,
		--		['Advance Scripter'] = 2,
		--		['Scripter'] = 1,
		--		['Builder'] = 1,
		--	},
		--},
		{
			id = 16281178, -- lua sandbox
			--min_rank = 50,
			min_trust = 1,
			ranks = {
				['Owner'] = 10,
				['Ew'] = 10,
				['Admin'] = 10,
				['Head Developer'] = 5,
				['Developer'] = 5,
				['SB & Community Mod'] = 4,
				['SB Mod'] = 4,
				['Community Mod'] = 4,
				['Scripter + Place 1 require permissions'] = 2,
				['Builder + Place 1 require permissions'] = 2,
				['Builder'] = 2,
				['Scripter'] = 2,
				['Member'] = 1,
			},
		},
		{
			id = 2574296, -- bleu pigs
			ranks = {
				['Group Holder'] = 4,
				['Bot'] = 4,
				['Arbitrator'] = 4,
				['Elite Pig'] = 1,
				['Bleu Pig'] = 1,
				['New Member'] = 0.5,
			},
		},
		{
			id = 33487332, -- lua assembling
			ranks = {
				['Group Owner'] = 5,
				['Owners'] = 5,
				['Moderator'] = 2,
				['Scripter'] = 2,
				['Member'] = 1,
			},
		},
		{
			id = 2627479, -- hidden devs
			ranks = {
				['Owner'] = 10,
				['Administrator'] = 10,
				['Developer'] = 10,
				['Department Leaders'] = 10,
				['Moderators'] = 7,
				['Application Readers'] = 7,
				['Staff Members'] = 7,
				['Contributers'] = 5,
				['Youtubers'] = 5,
				['Streamers'] = 5,
				['Community Creator'] = 5,
				['Game Producers'] = 5,
				['Music Composers'] = 1,
				['Voice Actors'] = 1,
				['Sound Effects'] = 1,
				['Game Designers'] = 1,
				['Clothing Designer'] = 1,
				['Modelers'] = 1,
				['Animators'] = 1,
				['Game Testers'] = 1,
				['Studio Builders'] = 1,
				['Off-site Programmers'] = 1,
				['Lua Programmers'] = 1,
				['UI Designers'] = 1,
				['Graphics'] = 1,
			},
		},
		{
			id = 6380707, -- roblox beta program
			ranks = {
				['Roblox QA Tester'] = 10,
				['Honoured'] = 10,
				['Beta Tester'] = 5,
			},
		},
		{
			id = 2868472, -- roblox interns
			ranks = {
				['Former Accelerator'] = 10,
				['Former Incubator'] = 10,
				['Former Intern'] = 10,
				['Accelerator'] = 10,
				['Incubator'] = 10,
				['Intern'] = 10,
				['Employee'] = 10,
				['Manager'] = 10,
				['Owner'] = 10,
			},
		},
		--{
		--	id = 650266, -- Trade. Group
		--	ranks = {
		--		['Aspiring Trader'] = 1,
		--		['Trader'] = 2,
		--		['Active Trade'] = 3,
		--		['Experienced Trader'] = 4,
		--		['Advanced Trader'] = 4,
		--		['Expert Trader'] = 4,
		--		['Master Trader'] = 4,
		--		['Rich Trader'] = 5,
		--		['Wealthy Trader'] = 5,
		--		['Outrageous Trader'] = 5,
		--		['Top Trader'] = 10,
		--		['Millionaire Trader'] = 10,
		--		['Multi-Millionaire'] = 10,
		--		['Trade Legend'] = 10,
		--		['Name Level'] = 10,
		--		['Trade Champion'] = 10,
		--		['Honorary Member'] = 10,
		--		['Contributor'] = 10,
		--		['Staff'] = 10,
		--		['Game Developers'] = 10,
		--		['zlib'] = 10,
		--		['owner'] = 10,
		--	},
		--},
		{
			id = 1200769, -- Roblox Staff Group
			min_rank = 1,
			min_trust = 10,
			ranks = {},
		}
	}
	
	local t = 0
	
	for i,v in pairs(groups) do
		local rank = plr:GetRoleInGroup(v.id)
		for name,point in pairs(v.ranks) do
			if rank == name then
				t = t + point
				break
			end
		end
		if v.min_rank then
			local id = plr:GetRankInGroup(v.id)
			if id >= v.min_rank then
				t = t + v.min_trust
			end
		end
	end
	
	if 1 > t then
		t = -1
	end
	
	return t, 'groups'
end)

afunc(function(plr)
	local function iterPageItems(pages)
		return coroutine.wrap(function()
			local pagenum = 1
			while true do
				for _, item in ipairs(pages:GetCurrentPage()) do
					coroutine.yield(item, pagenum)
				end
				if pages.IsFinished then
					break
				end
				pages:AdvanceToNextPageAsync()
				pagenum = pagenum + 1
			end
		end)
	end

	local friendPages = game:GetService("Players"):GetFriendsAsync(plr.UserId)
	local result = 0
	for item, _pageNo in iterPageItems(friendPages) do
		result = result + 1
	end

	if result then
		result = -1 + math.sqrt(math.clamp(result,0,200))/7
	else
		result = -1
	end
	
	return result, 'friends'
end)

-- taking up too many failed requests
--afunc(function(plr)
--	local result = http("https://inventory." .. proxy .. "/v1/users/" .. tostring(plr.UserId) .. "/assets/collectibles?limit=100")
--	if result then else -- private inventory
--		return 0, 'rap (private inv)'
--	end
	
--	local rap = 0
	
--	for i,v in pairs(result.data) do
--		rap = rap + v.recentAveragePrice
--	end
	
--	rap = math.sqrt(rap)/50
--	rap = math.clamp(rap,0,50)
	
--	return rap, 'rap'
--end)

afunc(function(plr)
	local result
	local t = 0
	result = http("https://devforum." .. proxy .. "/u/" .. plr.Name .. ".json")
	if result then
		if result.user.trust_level >= 1 then
			t = t + result.user.trust_level
		end
		if result.user.admin == true then
			t = t + 10
		end
		if result.user.moderator == true then
			t = t + 5
		end
		if result.badges then
			for i,v in pairs(result.badges) do
				if v.id == 24 then -- Active member, posted atleast once
					t = t + 0.5
				end
			end
		end
	else
		t = t - 1
	end
	return t, 'devforum'
end)

--afunc(function(plr)
--	local t = 0

--	local wl = {
--		'Hat',
--		'Face Accessory',
--		'Neck Accessory',
--		'Face',
--	}
--	-- check cost of avatar
--	local info = game:GetService("Players"):GetCharacterAppearanceInfoAsync(plr.UserId)
--	for i,v in pairs(info.assets) do
--		if table.find(wl,v.assetType.name) then else
--			continue
--		end

--		local rap = http('https://economy.roproxy.com/v1/assets/' .. v.id .. '/resale-data')

--		if rap then
--			rap = rap.recentAveragePrice
--			t = t + rap
--		end
--	end

--	t = math.sqrt(t)/50
--	t = math.clamp(t,0,50)

--	return t, 'avatar rap'
--end)

--afunc(function(plr)
--	local t = 0
--	local badges = {
--		[2124537858] = 5,
--		[2124537857] = 15,
--		[2124537856] = 25,
--		[2124705156] = 50,
--	}
--	for id,trust in pairs(badges) do
--		if BS:UserHasBadgeAsync(plr.UserId,id) then
--			if trust > t then
--				t = trust
--			end
--		end
--	end
--	return t, 'badges'
--end)

afunc(function(plr)
	local result = http("https://users." .. proxy .. "/v1/users/" .. tostring(plr.UserId) .. "/username-history?limit=100")
	
	if result then else
		return 0, 'name changes'
	end
	
	result = #result.data
	result = result - 1 -- to remove your starter name
	result = result/5
	
	return result, 'name changes'
end)

--afunc(function(plr)
--	local result = http("https://games." .. proxy .. "/v2/users/279462171/games?sortOrder=Asc&limit=50")
	
--	if result then else
--		return 0, 'visits'
--	end
	
--	result = result.data
	
--	local t = 0
	
--	for i,v in pairs(result) do
--		t = t + v.placeVisits
--	end
	
--	t = math.sqrt(t)/1000
--	t = math.clamp(t,0,10)
	
--	return t, 'visits'
--end)

afunc(function(plr)
	local result = http("https://users." .. proxy .. "/v1/users/" .. tostring(plr.UserId))
	
	if result then else
		return 0, 'profile'
	end
	
	result = result.description
	
	local t = 0
	
	local blacklist = {
		'hacked',
		'pwned',
		'pawned',
		'stolen',
		'breeched',
		'leaked',
		'taken by',
		'phished by',
	}
	
	for i,v in pairs(blacklist) do
		if string.match(result,v) then
			t = t - 10
		end
	end
	
	if result == '' then
		t = t - 1
	end
	
	if plr.HasVerifiedBadge then
		t = 10
	end
	
	return t, 'profile'
end)

afunc(function(plr,remote)
	local verified = plr:IsVerified() -- phone/id verified
	local t = 0
	if verified then
		t = t + 5
	end
	return t, 'phone/id verified'
end)

afunc(function(plr,remote)
	local verified = MPS:PlayerOwnsAsset(plr,102611803) -- verified email hat
	local t = 0
	if verified then
		t = t + 1
	else
		t = t - 5
	end
	return t, 'verified hat'
end)

afunc(function(plr,remote)
	local hats = { -- builders club
		bc = 1080951,
		tbc = 11844853,
		obc = 17408283,
	}
	local t = 0
	for i,v in pairs(hats) do
		if MPS:PlayerOwnsAsset(plr,v) then
			t = t + 1
		end
	end
	return t, 'builders club'
end)

function color_trust(t)
	local c = Color3.new()
	local r = t/tmin
	local g = tmin-r
	c = Color3.new(r,g,0)
	local id = 0
	if tmin >= t then
		c = Color3.new(1,0,0)
		id = 1
	elseif t >= tmin and tmax > t then
		c = Color3.new(1,1,0)
		id = 2
	elseif t >= tmax then
		c = Color3.new(0,1,0)
		id = 3
	end
	return c,id
end

function plr_exists(p) -- checks if the player exists in the server
	if p and p.Parent and game:GetService("Players"):FindFirstChild(p.Name) then
		return true
	end
end

local cache_trust = {}

function get_trust(plr)
	if cache_trust[plr.UserId] then
		return cache_trust[plr.UserId][1], cache_trust[plr.UserId][2]
	end
	
	local trust = base_trust
	local total = 0
	local count = 0
	
	for i,v in pairs(funcs) do
		total = total + 1
	end
	
	local results = ''
	
	for i,v in pairs(funcs) do
		if plr_exists(plr) then else break end
		
		local result, id = v(plr)
		
		if not result then
			result = 0
		end
		
		results = results .. id .. ': ' .. result .. '\n'
		
		if result then
			trust = trust + result
		end
		
		count = count + 1
		--task.wait(1/2)
	end
	
	repeat task.wait() until count >= total or not plr_exists(plr)
	
	if not plr_exists(plr) then
		return
	end
	
	cache_trust[plr.UserId] = {
		trust,
		results
	}
	
	return trust,results
end

local connect_tag = {}

function connect(plr) -- connects player with the script
	if not connect_tag[plr.UserId] then
		connect_tag[plr.UserId] = 0
	else
		connect_tag[plr.UserId] = connect_tag[plr.UserId] + 1
	end
	
	local ctid = connect_tag[plr.UserId]
	local trust = get_trust(plr)
	
	if ((tmin > trust) and plr_exists(plr)) and kick then -- checks if the player has low trust and then kicks them if they do
		local t = math.floor(trust*100)/100
		plr:Kick("Low trust factor. (" .. tmin .. " > " .. t .. ')')
		return
	end
	
	if plr_exists(plr) and ctid == connect_tag[plr.UserId] then
		add_plr(plr)
	end
end

function disconnect(plr) -- disconnects player from the script
	remove_plr(plr)
end

function make_board()
	pcall(function()
		local Part0 = Instance.new("Part")
		local SurfaceGui1 = Instance.new("SurfaceGui")
		local TextLabel2 = Instance.new("TextLabel")
		Part0.Parent = script
		Part0.CFrame = CFrame.new(-22.2600002, 11.8900003, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1)
		Part0.Position = Vector3.new(-22.2600002, 11.8900003, 0)
		Part0.Size = Vector3.new(0.460000008, 2, 15)
		Part0.Anchored = true
		Part0.CanCollide = true
		Part0.Locked = true
		Part0.CanQuery = false
		Part0.CanTouch = false
		Part0.TopSurface = Enum.SurfaceType.Smooth
		Part0.BottomSurface = Enum.SurfaceType.Smooth
		SurfaceGui1.Parent = Part0
		SurfaceGui1.LightInfluence = 1
		SurfaceGui1.Face = Enum.NormalId.Right
		SurfaceGui1.ClipsDescendants = true
		SurfaceGui1.SizingMode = Enum.SurfaceGuiSizingMode.PixelsPerStud
		SurfaceGui1.PixelsPerStud = 50
		SurfaceGui1.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
		TextLabel2.Parent = SurfaceGui1
		TextLabel2.Size = UDim2.new(1, 0, 1, 0)
		TextLabel2.BackgroundColor = BrickColor.new("Silver flip/flop")
		TextLabel2.BackgroundColor3 = Color3.new(0.505882, 0.505882, 0.505882)
		TextLabel2.Font = Enum.Font.Arial
		TextLabel2.FontSize = Enum.FontSize.Size14
		TextLabel2.Text = "Trust ALG"
		TextLabel2.TextColor = BrickColor.new("Institutional white")
		TextLabel2.TextColor3 = Color3.new(1, 1, 1)
		TextLabel2.TextScaled = true
		TextLabel2.TextSize = 14
		TextLabel2.TextStrokeTransparency = 0
		TextLabel2.TextWrap = true
		TextLabel2.TextWrapped = true
		
		title = TextLabel2
	end)
	
	board = Instance.new("Part")
	local SurfaceGui1 = Instance.new("SurfaceGui")
	local ScrollingFrame2 = Instance.new("ScrollingFrame")
	local UIGridLayout3 = Instance.new("UIGridLayout")
	board.Parent = script
	board.CFrame = CFrame.new(-22.2600002, 5.88999987, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1)
	board.Position = Vector3.new(-22.2600002, 5.88999987, 0)
	board.Size = Vector3.new(0.460000008, 10, 15)
	board.Anchored = true
	board.CastShadow = false
	board.CanCollide = false
	board.Locked = true
	board.CanQuery = false
	board.CanTouch = false
	SurfaceGui1.Parent = board
	SurfaceGui1.LightInfluence = 1
	SurfaceGui1.Face = Enum.NormalId.Right
	SurfaceGui1.ClipsDescendants = true
	SurfaceGui1.SizingMode = Enum.SurfaceGuiSizingMode.PixelsPerStud
	SurfaceGui1.PixelsPerStud = 50
	SurfaceGui1.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
	ScrollingFrame2.Parent = SurfaceGui1
	ScrollingFrame2.Size = UDim2.new(1, 0, 1, 0)
	ScrollingFrame2.Active = true
	ScrollingFrame2.BackgroundColor = BrickColor.new("Dark grey")
	ScrollingFrame2.BackgroundColor3 = Color3.new(0.458824, 0.458824, 0.458824)
	ScrollingFrame2.CanvasSize = UDim2.new(0, 0, 0, 0)
	UIGridLayout3.Parent = ScrollingFrame2
	UIGridLayout3.SortOrder = Enum.SortOrder.LayoutOrder
	UIGridLayout3.CellSize = UDim2.new(1, 0, 0, 75)
	
	game:GetService("RunService").Heartbeat:Connect(function()
		board.Anchored = true
		board.CastShadow = false
		board.CanCollide = true
		board.Locked = true
	end)
end

function remove_plr(plr)
	if board then else return end

	local scroll = board:FindFirstChildOfClass("SurfaceGui"):FindFirstChildOfClass("ScrollingFrame")
	local grid = scroll:FindFirstChildOfClass("UIGridLayout")
	
	local pui = scroll:FindFirstChild(plr.UserId)
	
	if pui then
		pui:Destroy()
		
		task.delay(0.25,function()
			local total_plrs = #game:GetService("Players"):GetPlayers()
			scroll.CanvasSize = UDim2.new(0,0,0,(grid.CellSize.Y.Offset+grid.CellPadding.Y.Offset) * total_plrs)
		end)
	end
end

function add_plr(plr)
	if board then else return end

	local scroll = board:FindFirstChildOfClass("SurfaceGui"):FindFirstChildOfClass("ScrollingFrame")
	local grid = scroll:FindFirstChildOfClass("UIGridLayout")
	
	local trust = get_trust(plr)
	
	do
		local Frame0 = Instance.new("Frame")
		local TextLabel1 = Instance.new("TextLabel")
		local TextLabel2 = Instance.new("TextLabel")
		local ImageLabel6 = Instance.new("ImageLabel")
		Frame0.Size = UDim2.new(0, 100, 0, 100)
		Frame0.BackgroundColor = BrickColor.new("Institutional white")
		Frame0.BackgroundColor3 = Color3.new(1, 1, 1)
		TextLabel1.Name = "name"
		TextLabel1.Parent = Frame0
		TextLabel1.Position = UDim2.new(0, 0, 0, 0)
		TextLabel1.Size = UDim2.new(0.7, 0, 1, 0)
		TextLabel1.BackgroundColor = BrickColor.new("Institutional white")
		TextLabel1.BackgroundColor3 = Color3.new(1, 1, 1)
		TextLabel1.BackgroundTransparency = 1
		TextLabel1.BorderSizePixel = 0
		TextLabel1.Font = Enum.Font.SourceSans
		TextLabel1.FontSize = Enum.FontSize.Size14
		TextLabel1.Text = "Roblox"
		TextLabel1.TextColor = BrickColor.new("Institutional white")
		TextLabel1.TextColor3 = Color3.new(1, 1, 1)
		TextLabel1.TextScaled = true
		TextLabel1.TextSize = 14
		TextLabel1.TextStrokeTransparency = 0
		TextLabel1.TextWrap = true
		TextLabel1.TextWrapped = true
		TextLabel2.Name = "trust"
		TextLabel2.Parent = Frame0
		TextLabel2.Position = UDim2.new(0.800000012, 0, 0, 0)
		TextLabel2.Size = UDim2.new(0.200000003, 0, 1, 0)
		TextLabel2.BackgroundColor = BrickColor.new("Institutional white")
		TextLabel2.BackgroundColor3 = Color3.new(1, 1, 1)
		TextLabel2.BorderSizePixel = 0
		TextLabel2.Font = Enum.Font.SourceSans
		TextLabel2.FontSize = Enum.FontSize.Size14
		TextLabel2.Text = "0"
		TextLabel2.TextColor = BrickColor.new("Institutional white")
		TextLabel2.TextColor3 = Color3.new(1, 1, 1)
		TextLabel2.TextScaled = true
		TextLabel2.TextSize = 14
		TextLabel2.TextStrokeTransparency = 0
		TextLabel2.TextWrap = true
		TextLabel2.TextWrapped = true
		ImageLabel6.Name = "icon"
		ImageLabel6.Parent = Frame0
		ImageLabel6.Position = UDim2.new(0.699999988, 0, 0, 0)
		ImageLabel6.BackgroundTransparency = 1
		ImageLabel6.Visible = true
		ImageLabel6.Size = UDim2.new(0.100000001, 0, 1, 0)
		ImageLabel6.BackgroundColor = BrickColor.new("Institutional white")
		ImageLabel6.BackgroundColor3 = Color3.new(1, 1, 1)
		ImageLabel6.BorderSizePixel = 0
		ImageLabel6.Image = "rbxassetid://125764489"
		--
		local pui = Frame0
		local name_t = pui:FindFirstChild('name')
		local trust_t = pui:FindFirstChild('trust')
		local icon_t = pui:FindFirstChild('icon')
		local c1,id = color_trust(trust)

		name_t.Text = plr.Name
		pui.Name = plr.UserId
		pui.LayoutOrder = -(trust*1000)
		pui.BackgroundColor3 = c1
		trust_t.Text = math.floor(trust*100)/100
		trust_t.BackgroundColor3 = c1

		if icon_t then
			if id == 1 then -- not trusted
				icon_t.Image = 'rbxassetid://125764489'
			elseif id == 2 then -- suspicious
				icon_t.Image = 'rbxassetid://910579996'
			elseif id == 3 then -- trusted
				icon_t.Image = 'rbxassetid://419589574'
			end
		end

		pui.Parent = scroll
	end
	
	local total_plrs = #game:GetService("Players"):GetPlayers()
	scroll.CanvasSize = UDim2.new(0,0,0,(grid.CellSize.Y.Offset+grid.CellPadding.Y.Offset) * total_plrs)
end

if list then
	make_board()
end

local cons = {}

table.insert(cons,game:GetService("Players").PlayerAdded:Connect(function(plr)
	connect(plr)
end))

table.insert(cons,game:GetService("Players").PlayerRemoving:Connect(function(plr)
	disconnect(plr)
end))

for _,plr in pairs(game:GetService("Players"):GetPlayers()) do
	wrap(function()
		connect(plr)
	end)
end

local function getplrs(name)
	local t = {}

	for i,v in pairs(game:GetService("Players"):GetPlayers()) do
		if string.sub(string.lower(v.Name),1,#name) == name then
			table.insert(t,v)
		end
	end

	return t
end

owner.Chatted:Connect(function(msg)
	msg = string.lower(msg)
	
	if string.sub(msg,1,6) == 'trust/' then
		local plrs = getplrs(string.sub(msg,7))
		
		for i,v in pairs(plrs) do
			warn(v.Name)
			if cache_trust[v.UserId] then
				print(cache_trust[v.UserId][2])
			end
			warn('============')
		end
	elseif string.sub(msg,1,4) == 'req/' then
		print('requests: ' .. req .. '	Players: ' .. #game:GetService("Players"):GetPlayers() .. '	Avg: ' .. math.floor(req/#game:GetService("Players"):GetPlayers()))
		print('successful requests: ' .. success_req .. '	Players: ' .. #game:GetService("Players"):GetPlayers() .. '	Avg: ' .. math.floor(success_req/#game:GetService("Players"):GetPlayers()))
		warn('failed requests: ' .. failed_req)
	end
end)

local rp = Instance.new("Weld")
rp.Name = 'trust v2.1'
rp.Parent = game:GetService("Lighting")

task.delay(0.5,function()
	rp:Destroy()

	game:GetService("Lighting").ChildAdded:Connect(function(o)
		if o ~= rp and o.Name == 'trust v2.1' then
			for i,v in pairs(cons) do
				v:Disconnect()
			end
		end
	end)
end)
INFO