SyntaxGameServer/RCCService2021/ExtraContent/LuaPackages/UGCValidationImpl/validation/validateModeration.lua

98 lines
2.4 KiB
Lua

local root = script.Parent.Parent
local Constants = require(root.Constants)
local getAssetCreationDetails = require(root.util.getAssetCreationDetails)
local function parseContentId(contentIds, contentIdMap, object, fieldName)
local contentId = object[fieldName]
-- map to ending digits
-- rbxassetid://1234 -> 1234
-- http://www.roblox.com/asset/?id=1234 -> 1234
local id = tonumber(string.match(contentId, "%d+$"))
if id == nil then
return false, {
"Could not parse ContentId",
contentId,
}
end
contentIdMap[id] = {
fieldName = fieldName,
instance = object,
}
table.insert(contentIds, id)
return true
end
local function parseDescendantContentIds(contentIds, contentIdMap, object)
for _, descendant in pairs(object:GetDescendants()) do
if descendant:IsA("SpecialMesh") then
local success, reasons
success, reasons = parseContentId(contentIds, contentIdMap, descendant, "MeshId")
if not success then
return false, reasons
end
success, reasons = parseContentId(contentIds, contentIdMap, descendant, "TextureId")
if not success then
return false, reasons
end
end
end
return true
end
-- ensures accessory content ids have all passed moderation review
local function validateModeration(isAsync, instance)
local contentIdMap = {}
local contentIds = {}
local parseSuccess, parseReasons = parseDescendantContentIds(contentIds, contentIdMap, instance)
if not parseSuccess then
return false, parseReasons
end
local moderatedIds = {}
local success, response = getAssetCreationDetails(isAsync, contentIds)
if not success or #response ~= #contentIds then
return false, { "Could not fetch details for assets" }
end
for _, details in pairs(response) do
if details.status == Constants.ASSET_STATUS.UNKNOWN
or details.status == Constants.ASSET_STATUS.REVIEW_PENDING
or details.status == Constants.ASSET_STATUS.MODERATED
then
table.insert(moderatedIds, details.assetId)
end
end
if #moderatedIds > 0 then
local moderationMessages = {}
for idx, id in pairs(moderatedIds) do
local mapped = contentIdMap[id]
if mapped then
moderationMessages[idx] = string.format(
"%s.%s ( %s )",
mapped.instance:GetFullName(),
mapped.fieldName,
id
)
else
moderationMessages[idx] = id
end
end
return false, {
"The following asset IDs have not passed moderation:",
unpack(moderationMessages),
}
end
return true
end
return validateModeration