98 lines
2.4 KiB
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
|