SyntaxGameServer/RCCService2020/ExtraContent/scripts/CoreScripts/Modules/PlayerPermissionsModule.lua

97 lines
3.2 KiB
Lua

local PlayerPermissionsModule = {}
local PlayersService = game:GetService("Players")
local PlayerGroupInfoMap = {}
local PlayerGroupInfoMapChanged = Instance.new("BindableEvent")
local PlayerCanManageInfoMap = {}
local PlayerCanManageInfoMapChanged = Instance.new("BindableEvent")
spawn(function()
local RobloxReplicatedStorage = game:GetService("RobloxReplicatedStorage")
local RemoveEvent_NewPlayerGroupDetails = RobloxReplicatedStorage:WaitForChild("NewPlayerGroupDetails", math.huge)
RemoveEvent_NewPlayerGroupDetails.OnClientEvent:Connect(function(userIdStr, groupDetails)
local player = PlayersService:GetPlayerByUserId(tonumber(userIdStr))
if player then
PlayerGroupInfoMap[player] = groupDetails
PlayerGroupInfoMapChanged:Fire()
end
end)
end)
coroutine.wrap(function()
local RobloxReplicatedStorage = game:GetService("RobloxReplicatedStorage")
local RemoveEvent_NewPlayerCanManageDetails = RobloxReplicatedStorage:WaitForChild("NewPlayerCanManageDetails", math.huge)
RemoveEvent_NewPlayerCanManageDetails.OnClientEvent:Connect(function(userIdStr, canManage)
local player = PlayersService:GetPlayerByUserId(tonumber(userIdStr))
if player then
PlayerCanManageInfoMap[player] = canManage
PlayerCanManageInfoMapChanged:Fire()
end
end)
end)()
PlayersService.PlayerRemoving:Connect(function(player)
PlayerGroupInfoMap[player] = nil
PlayerGroupInfoMapChanged:Fire()
end)
local function NewInGroupFunctionFactory(groupKey)
return function(player)
while not PlayerGroupInfoMap[player] and player.Parent do
PlayerGroupInfoMapChanged.Event:wait()
end
local groupInfo = PlayerGroupInfoMap[player]
if groupInfo and groupInfo[groupKey] then
return true
end
return false
end
end
local function NewIsLocalizationExpertFunctionFactory()
local localizationCheckFunctions = {
NewInGroupFunctionFactory("SpanishLocalizationExpert"),
NewInGroupFunctionFactory("BrazilianLocalizationExpert"),
NewInGroupFunctionFactory("FrenchLocalizationExpert"),
NewInGroupFunctionFactory("GermanLocalizationExpert"),
}
return function(player)
for i = 1, #localizationCheckFunctions do
if localizationCheckFunctions[i](player) then
return true
end
end
return false
end
end
local function IsPlaceOwnerFunctionFactory()
if game.CreatorType == Enum.CreatorType.Group then
return NewInGroupFunctionFactory("PlaceCreator")
end
return function(player)
return player.UserId == game.CreatorId
end
end
local function CanPlayerManagePlace(player)
while PlayerCanManageInfoMap[player] == nil and player.Parent do
PlayerCanManageInfoMapChanged.Event:Wait()
end
if PlayerCanManageInfoMap[player] ~= nil then
return PlayerCanManageInfoMap[player]
end
return false
end
PlayerPermissionsModule.IsPlayerAdminAsync = NewInGroupFunctionFactory("Admin")
PlayerPermissionsModule.IsPlayerInternAsync = NewInGroupFunctionFactory("Intern")
PlayerPermissionsModule.IsPlayerStarAsync = NewInGroupFunctionFactory("Star")
PlayerPermissionsModule.IsPlayerLocalizationExpertAsync = NewIsLocalizationExpertFunctionFactory()
PlayerPermissionsModule.IsPlayerPlaceOwnerAsync = IsPlaceOwnerFunctionFactory()
PlayerPermissionsModule.CanPlayerManagePlaceAsync = CanPlayerManagePlace
return PlayerPermissionsModule