95 lines
3.1 KiB
Lua
95 lines
3.1 KiB
Lua
local argumentsTable = ...
|
|
|
|
-- This flag enables local debugging. Debug mode will do the following:
|
|
-- Expects gameserver.txt to contain an assetId instead of assetHash + checksum
|
|
-- Provides output information for the result
|
|
local FFlagDebugUGCServerValidation = game:DefineFastFlag("DebugUGCServerValidation", false)
|
|
|
|
local ScriptContext = game:GetService("ScriptContext")
|
|
local HttpService = game:GetService("HttpService")
|
|
local CorePackages = game:GetService("CorePackages")
|
|
local ContentProvider = game:GetService("ContentProvider")
|
|
|
|
pcall(function() ContentProvider:SetBaseUrl(argumentsTable.BaseUrl) end)
|
|
ScriptContext.ScriptsDisabled = true
|
|
|
|
assert(CorePackages, "CorePackages is not loaded!")
|
|
local UGCValidation = require(CorePackages.UGCValidation)
|
|
|
|
local function parseBaseUrlInformation(baseUrl)
|
|
-- keep a copy of the base url (https://www.roblox.com/)
|
|
-- append a trailing slash if there isn't one
|
|
if baseUrl:sub(#baseUrl) ~= "/" then
|
|
baseUrl = baseUrl .. "/"
|
|
end
|
|
|
|
-- parse out scheme (http, https)
|
|
local _, schemeEnd = baseUrl:find("://")
|
|
|
|
-- parse out the prefix (www, kyle, ying, etc.)
|
|
local prefixIndex, prefixEnd = baseUrl:find("%.", schemeEnd + 1)
|
|
local basePrefix = baseUrl:sub(schemeEnd + 1, prefixIndex - 1)
|
|
|
|
-- parse out the domain (roblox.com/, sitetest1.robloxlabs.com/, etc.)
|
|
local baseDomain = baseUrl:sub(prefixEnd + 1)
|
|
|
|
return baseUrl, basePrefix, baseDomain
|
|
end
|
|
|
|
local function createAssetGameUrl(baseDomain)
|
|
return "https://assetgame." .. baseDomain
|
|
end
|
|
|
|
local _, _, BASE_DOMAIN = parseBaseUrlInformation(argumentsTable.BaseUrl)
|
|
local ASSET_GAME = createAssetGameUrl(BASE_DOMAIN)
|
|
|
|
local ASSET_TYPE_MAP = {
|
|
Hat = Enum.AssetType.Hat,
|
|
HairAccessory = Enum.AssetType.HairAccessory,
|
|
FaceAccessory = Enum.AssetType.FaceAccessory,
|
|
NeckAccessory = Enum.AssetType.NeckAccessory,
|
|
ShoulderAccessory = Enum.AssetType.ShoulderAccessory,
|
|
FrontAccessory = Enum.AssetType.FrontAccessory,
|
|
BackAccessory = Enum.AssetType.BackAccessory,
|
|
WaistAccessory = Enum.AssetType.WaistAccessory,
|
|
}
|
|
|
|
local function validateAsset(assetInfo)
|
|
local assetUrl
|
|
if FFlagDebugUGCServerValidation then
|
|
assetUrl = ASSET_GAME .. string.format("asset/?id=%s", assetInfo.assetId)
|
|
else
|
|
assetUrl = ASSET_GAME .. string.format("asset/?marAssetHash=%s&marChecksum=%s", assetInfo.assetHash, assetInfo.checksum)
|
|
end
|
|
local objects = game:GetObjects(assetUrl)
|
|
|
|
local assetTypeEnum = assert(ASSET_TYPE_MAP[assetInfo.assetType], "Invalid Asset Type")
|
|
|
|
local success, reasons = UGCValidation.validate(objects, assetTypeEnum, true)
|
|
if success then
|
|
return true, "Success"
|
|
else
|
|
return false, table.concat(reasons, "\n")
|
|
end
|
|
end
|
|
|
|
local assetsToValidate = argumentsTable.Assets
|
|
local resultData = {}
|
|
|
|
for i, assetInfo in ipairs(assetsToValidate) do
|
|
local isValid, validationResult = validateAsset(assetInfo)
|
|
|
|
resultData[i] = {
|
|
assetHash = assetInfo.assetHash,
|
|
isValid = isValid,
|
|
validationResult = validationResult
|
|
}
|
|
end
|
|
|
|
local resultJson = HttpService:JSONEncode(resultData)
|
|
|
|
if FFlagDebugUGCServerValidation then
|
|
print("DEBUG", "resultData", resultJson)
|
|
end
|
|
|
|
return resultJson |