SyntaxGameServer/RCCService2018/content/internal/AppShell/Modules/Shell/PackageItem.lua

179 lines
3.9 KiB
Lua

local PlatformService;
pcall(function() PlatformService = game:GetService("PlatformService") end)
local EventHub = require(script.Parent.EventHub)
local Http = require(script.Parent.Http)
local Utility = require(script.Parent.Utility)
-- xbox product items for starter packs
local XboxProductIds = {
['807301633'] = '899a379d-0a66-4b07-8bcd-29b1e38699ba'; --Boy Avatar
['807340263'] = '7dba5b02-02be-4442-814e-9b9ebf6d66bf'; --Girl Avatar
}
-- This queues additional wear and purchase request. This is a work around to work with
-- the current implementation. Ideally the business logic and presentation would not be
-- so tightly coupled. See CLIXBOX-1974 for the follow up ticket
local requestingWearAsset = false
local function awaitRequestWearAsset()
while requestingWearAsset do
wait(0.1)
end
end
local requestingBuyAsset = false
local function awaitRequestBuyAsset()
while requestingBuyAsset do
wait(0.1)
end
end
local PackageItem = {}
PackageItem.__index = PackageItem
function PackageItem.new(data)
local self = {}
setmetatable(self, PackageItem)
self.data = data
self.partIds = {}
self.wearing = false
self.owned = false
self.isPurchasing = false
self.isEquipping = false
self.OwnershipChanged = Utility.Signal()
self.IsWearingChanged = Utility.Signal()
return self
end
function PackageItem:GetAssetId()
return self.data.assetId
end
function PackageItem:OpenAvatarDetailInXboxStore()
if PlatformService then
local xboxProductId = XboxProductIds[tostring(self:GetAssetId())]
if xboxProductId then
PlatformService:OpenProductDetail(xboxProductId)
end
end
end
function PackageItem:IsXboxAddOn()
if XboxProductIds[tostring(self:GetAssetId())] then
return true
end
return false
end
-- TODO: Function name changed, update any calls
function PackageItem:GetPartIds()
return self.data.partIds
end
function PackageItem:IsWearing()
return self.wearing
end
function PackageItem:SetWearing(value)
if value ~= self.wearing then
self.wearing = value
self.IsWearingChanged:fire(self.wearing)
end
end
function PackageItem:IsOwned()
return self.owned
end
function PackageItem:SetOwned(value)
if value ~= self.owned then
self.owned = value
self.OwnershipChanged:fire(self.owned)
end
end
function PackageItem:GetRobuxPrice()
return self.data.priceInRobux
end
function PackageItem:GetFullName()
return self.data.name or "Unknonwn"
end
function PackageItem:GetName()
local name = self:GetFullName()
local colonPosition = string.find(name, ":")
if colonPosition then
name = string.sub(name, 1, colonPosition - 1)
end
return name
end
-- TODO: Function name changed, update any calls
function PackageItem:GetDescription()
return self.data.description
end
function PackageItem:WearAsync()
if self.isEquipping then
return
end
if self.data.assetId then
self.isEquipping = true
awaitRequestWearAsset()
requestingWearAsset = true
EventHub:dispatchEvent(EventHub.Notifications["AvatarEquipBegin"], self.data.assetId)
local result = Http.SetWearingAssetsAsync(self.data.partIds)
if result then
local success = result.success
if success then
EventHub:dispatchEvent(EventHub.Notifications["AvatarEquipSuccess"], self.data.assetId)
end
end
requestingWearAsset = false
self.isEquipping = false
return result
end
end
function PackageItem:BuyAsync()
if self.isPurchasing then
return
end
self.isPurchasing = true
awaitRequestBuyAsset()
requestingBuyAsset = true
EventHub:dispatchEvent(EventHub.Notifications["AvatarPurchaseBegin"], self:GetAssetId())
local result = Http.PurchaseProductAsync(self.data.productId, self.data.priceInRobux, self.data.creatorId, 1)
if result then
local didBuy = result["TransactionVerb"] == "bought"
if didBuy then
EventHub:dispatchEvent(EventHub.Notifications["AvatarPurchaseSuccess"], self:GetAssetId(), true)
end
end
requestingBuyAsset = false
self.isPurchasing = false
return result
end
return PackageItem