Wir laden dich herzlich auf den Star Citizen Wiki Discord Server ein! Du kannst uns auch auf unserem neuen YouTube-Chanel finden!
Modul:Commodity
From Star Citizen Wiki
Modulinfo
Dieses Modul ist ein Grundmodul für Handelswaren aller Art.
Öffentliche Methoden
Das Modul stellt folgende öffentliche Methoden bereit:
addShop( shop )
- Speichert alle Items eines Shops als Subobjekte in der aktuellen Seite. Daten müssen aus der Star Citizen Wiki API kommen.
addShopData( data )
- Speichert alle Shops eines Items ins Semantic Wiki. Ruft automatisch
addShop
auf. Daten müssen aus der Star Citizen Wiki API kommen.
- Speichert alle Shops eines Items ins Semantic Wiki. Ruft automatisch
Commodity.formatOffset( offset )
- Formartiert ein Offset
Commodity.calcPrice( price, offset, power )
- Berechnet einen finalen Preis anhand Basispreis, Offset. Power entspricht der Anzahl von Nachkommastellen.
Commodity.calcPricePP( price, percentage, isPremium, power )
- Berechnet einen Preis Plus, oder Minus einer bestimmten Prozentzahl
Tests
✔ Alle Tests bestanden.
Name | Expected | Actual | |
---|---|---|---|
✔ | testCalcPriceFloat | ||
✔ | testCalcPriceInt | ||
✔ | testCalcPricePPFloat | ||
✔ | testCalcPricePPInt | ||
✔ | testFormatOffset | ||
✔ | testFormatOffsetSpan |
local Commodity = {}
local metatable = {}
local methodtable = {}
local common = require('Module:Common')
metatable.__index = methodtable
local function round( number, decimals )
local power = 10^decimals
return math.floor( number * power ) / power
end
--- Removes the Manufacturer Prefix from vehicle entries
---
--- @param commodity table
--- @return table
local function fixVehicleName( commodity )
if commodity == nil or commodity.type == nil then
return commodity
end
if ( commodity.type == 'Vehicle' or commodity.type == 'GroundVehicle' ) and commodity.name ~= nil and commodity.fixed == nil then
local exploded = mw.text.split( commodity.name, ' ', true )
table.remove( exploded, 1 )
commodity.name = mw.text.trim( table.concat( exploded, ' ' ) )
commodity.fixed = true
end
return commodity
end
--- Updates the type for vehicles
---
--- @param commodity table
--- @return table
local function fixType( commodity )
if commodity == nil or commodity.type == nil then
return commodity
end
if commodity.type == 'Vehicle' or commodity.type == 'GroundVehicle' then
if commodity.sub_type == 'Vehicle_Spaceship' then
commodity.type = {
'[email protected]',
'[email protected]',
}
else
commodity.type = {
'[email protected]',
'[email protected]',
}
end
else
commodity.type = {
commodity.type .. '@en',
commodity.type .. '@de',
}
end
return commodity
end
--- Adds a rental subobejct, if the commodity can be rented
---
--- @param commodity table
--- @param shop table
local function addRentalSubObject( commodity, shop )
if commodity.rentable == false or type( commodity.rental_price_days ) ~= 'table' then
return
end
mw.smw.subobject( {
[ 'Name' ] = commodity.name,
[ 'UUID' ] = commodity.uuid,
[ 'Typ' ] = commodity.type,
[ 'Händler' ] = shop.name,
[ 'Ort' ] = shop.position,
[ '1 Tag' ] = common.formatNum( commodity.rental_price_days[ 1 ], 0 ) .. ' aUEC',
[ '3 Tage' ] = common.formatNum( commodity.rental_price_days[ 3 ], 0 ) .. ' aUEC',
[ '7 Tage' ] = common.formatNum( commodity.rental_price_days[ 7 ], 0 ) .. ' aUEC',
[ '30 Tage' ] = common.formatNum( commodity.rental_price_days[ 30 ], 0 ) .. ' aUEC',
[ 'Spielversion' ] = commodity.version,
} )
end
--- Adds a buy subobejct, if the commodity can be bought
---
--- @param commodity table
--- @param shop table
local function addBuySubObject( commodity, shop )
if commodity.buyable == false then
return
end
mw.smw.subobject( {
[ 'UUID' ] = commodity.uuid,
[ 'Name' ] = commodity.name,
[ 'Basispreis' ] = common.formatNum( commodity.base_price or nil, nil ),
[ 'Preis' ] = common.formatNum( commodity.price_calculated or nil, nil ),
[ 'Minimalpreis' ] = common.formatNum( commodity.price_range.min or nil, nil ),
[ 'Maximalpreis' ] = common.formatNum( commodity.price_range.max or nil, nil ),
[ 'Preisoffset' ] = common.formatNum( commodity.base_price_offset or nil, nil ),
[ 'Rabatt' ] = common.formatNum( commodity.max_discount or nil, nil ),
[ 'Premium' ] = common.formatNum( commodity.max_premium or nil, nil ),
[ 'Bestand' ] = common.formatNum( commodity.inventory or nil, nil ),
[ 'Maximalbestand' ] = common.formatNum( commodity.max_inventory or nil, nil ),
[ 'Wiederauffüllungsrate' ] = common.formatNum( commodity.refresh_rate or nil, nil ),
[ 'Kaufbar' ] = commodity.buyable,
[ 'Verkaufbar' ] = commodity.sellable,
[ 'Mietbar' ] = type( commodity.rental_price_days ) == 'table',
[ 'Typ' ] = commodity.type,
[ 'Händler' ] = shop.name,
[ 'Ort' ] = shop.position,
[ 'Spielversion' ] = commodity.version,
} )
end
--- Adds all available commodities from a shop to the page
---
--- @param shop table
--- @return void
function methodtable.addShop( self, shop )
if type( shop ) ~= 'table' or shop.items == nil or type( shop.items.data ) ~= 'table' then
return
end
for _, commodity in pairs( shop.items.data ) do
commodity = fixVehicleName( commodity )
commodity = fixType( commodity )
addBuySubObject( commodity, shop )
addRentalSubObject( commodity, shop )
end
end
--- Adds all available shop data to the page
---
--- @param data table
--- @return void
function methodtable.addShopData( self, data )
if type( data ) ~= 'table' or data.shops == nil or type( data.shops.data ) ~= 'table' then
return
end
for _, shop in pairs( data.shops.data ) do
self:addShop( shop )
end
end
function Commodity.formatOffset( offset )
if offset == nil or offset == 0 or offset == '0' then
return '0%'
end
return '<span title="' .. offset .. '%">' .. math.floor( offset ) .. '%</span>'
end
--- Calculates the price based on the items offset
--- price * ( 1 + ( offset / 100 ) )
---
--- @param price string|number base price
--- @param offset string|number|nil offset
--- @return string
function Commodity.calcPrice( price, offset, power )
power = power or 0
offset = common.toNumber( offset, false )
if type( price ) == 'table' then
price = price[ 1 ]
end
local priceNum = common.toNumber( price, false )
if offset == nil or offset == false or offset == 0 or offset == -100 then
return mw.getContentLanguage():formatNum( priceNum )
end
if priceNum == false then
-- Failsafe
return price
end
priceNum = round( priceNum * ( 1 + ( offset / 100 ) ), power )
local formatted = mw.getContentLanguage():formatNum( priceNum )
if formatted == nil then
return priceNum
end
return formatted
end
--- Calculates a price plus or minus a given percentage
---
--- @param price string|number price
--- @param range string|number|nil range call as whole percent (e.g. 25 for 25% etc.)
--- @param isPremium boolean True to add percentage
--- @return number
function Commodity.calcPricePP( price, percentage, isPremium, power )
power = power or 0
local priceNum = common.toNumber( price, false )
percentage = common.toNumber( percentage, false )
if percentage == false or priceNum == false then
return price
end
if isPremium == true then
percentage = percentage * -1
end
return round( priceNum * ( 1 - ( percentage / 100 ) ), power )
end
--- New Instance
--- Library entrance
function Commodity.new( self )
local instance = {}
setmetatable( instance, metatable )
return instance
end
return Commodity