sc>FoXFTW KKeine Bearbeitungszusammenfassung |
(kein Unterschied)
|
Version vom 8. Juni 2023, 11:08 Uhr
Die Dokumentation für dieses Modul kann unter Modul:Item/Doku erstellt werden
local Item = {}
local metatable = {}
local methodtable = {}
metatable.__index = methodtable
-- Extensions
local common = require( 'Module:Common' )
local api = require( 'Module:Common/Api' )
local localized = require( 'Module:Localized' )
local TNT = require( 'Module:Translate' ):new()
local log = require( 'Module:Log' )
local commodity = require( 'Module:Commodity' )
local componentData = mw.loadData( 'Module:VehicleComponent/Data' )
--- Request Api Data
--- Using current subpage name
--- @return table
function methodtable.getApiDataForCurrentPage( self )
local name = self.frameArgs[ 'uuid' ] or self.frameArgs[ 'name' ] or mw.title.getCurrentTitle().text
local json = mw.text.jsonDecode( mw.ext.Apiunto.get_raw( 'v2/items/' .. name, {
include = {
'shops.items'
},
} ) )
local success, message = pcall( api.checkResponseStructure, json, true, true )
if not success then
return log:error( message )
end
self.apiData = json[ 'data' ]
api.makeAccessSafe( self.apiData )
return self.apiData
end
--- Queries the SMW Store
--- @return table
function methodtable.getSmwData( self )
-- Cache multiple calls
if self.smwData ~= nil then
return self.smwData
end
-- name from args or current page
local queryName = self.frameArgs[ 'name' ] or localized.getMainTitle()
local data = mw.smw.ask( {
'[[' .. queryName .. ']][[Hersteller::+]]',
'?#-=page',
'?Name#-',
'?Größe=size',
'?Hersteller#-',
'?Beschreibung', '+lang=' .. common.getLocaleForPage(),
'?SP',
'?Länge',
'?Breite',
'?Höhe',
'?Volumen',
'?Grad=grade',
'?Typ=type', '+lang=' .. common.getLocaleForPage(),
'?Typ=type_de', '+lang=de',
'?Klasse=class', '+lang=' .. common.getLocaleForPage(),
'?Klasse=class_de', '+lang=de',
'?Infrarotstrahlung#-=ir',
'?Elektromagnetische Strahlung#-=em',
'?Spielversion#-=version',
'mainlabel=-'
} )
if data == nil or data[ 1 ] == nil then
return TNT.formatInLanguage( self.lang, 'Item', 'msg_smw_loading' )
end
self.smwData = data[ 1 ]
self.smwData.price = commodity.getPrice( queryName )
if self.smwData.price ~= nil then
self.smwData.price = self.smwData.price[ 1 ].price
end
return self.smwData
end
--- Creates a base item object settable to SMW
--- @return table|nil
function methodtable.makeSmwObject( self )
-- Api Error, don't set anything
if self.apiData == nil then
return nil
end
api.makeAccessSafe( self.apiData )
-- Base data found on any v2/items/* output
local setObj = {
[ 'UUID' ] = self.apiData.uuid,
[ 'Name' ] = self.apiData.name,
[ 'Beschreibung' ] = api.mapTranslation( self.apiData.description ),
[ 'Größe' ] = self.apiData.size,
[ 'Hersteller' ] = api.getManufacturerName( self.apiData ),
[ 'SP' ] = api.getFormattedCarryingCapacity( self.apiData ),
[ 'Länge' ] = common.formatNum( self.apiData:get( 'dimension.length' ), nil ),
[ 'Breite' ] = common.formatNum( self.apiData:get( 'dimension.width' ), nil ),
[ 'Höhe' ] = common.formatNum( self.apiData:get( 'dimension.height' ), nil ),
[ 'Volumen' ] = common.formatNum( api.getVolume( self.apiData ) or nil, nil ),
[ 'Spielversion' ] = self.apiData.version,
}
self:setHeatData( setObj )
self:setPowerData( setObj )
self:setDistortionData( setObj )
self:setDurabilityData( setObj )
self:setVehicleItemData( setObj )
setObj = api.setBaseObject( self.apiData, setObj )
return setObj
end
---
--- @return table SMW Result
function methodtable.setSemanticProperties( self )
-- Api Error, don't set anything
if self.apiData == nil then
return
end
local setObj = self:makeSmwObject()
local result = mw.smw.set( setObj )
commodity:new():addShopData( self.apiData )
return result
end
function methodtable.setHeatData( self, setObj )
if self.apiData == nil or type( self.apiData.heat ) ~= 'table' then
return
end
local heat = self.apiData.heat
setObj[ 'Masse' ] = common.formatNum( heat.mass, nil )
setObj[ 'Infrarotstrahlung' ] = common.formatNum( heat.ir_emission, nil )
local energyBase = common.formatNum( heat.thermal_energy_base, nil )
local energyDraw = common.formatNum( heat.thermal_energy_draw, nil )
setObj[ 'Kühllast' ] = { energyBase, energyDraw }
--[[
setObj[ '' ] = common.formatNum( heat.overpower_heat, nil )
setObj[ '' ] = common.formatNum( heat.overclock_threshold_min, nil )
setObj[ '' ] = common.formatNum( heat.overclock_threshold_max, nil )
setObj[ '' ] = common.formatNum( heat.thermal_energy_base, nil )
setObj[ '' ] = common.formatNum( heat.thermal_energy_draw, nil )
setObj[ '' ] = common.formatNum( heat.thermal_conductivity, nil )
setObj[ '' ] = common.formatNum( heat.specific_heat_capacity, nil )
setObj[ '' ] = common.formatNum( heat.surface_area, nil )
setObj[ '' ] = common.formatNum( heat.start_cooling_temperature, nil )
setObj[ '' ] = common.formatNum( heat.max_cooling_rate, nil )
setObj[ '' ] = common.formatNum( heat.max_temperature, nil )
setObj[ '' ] = common.formatNum( heat.min_temperature, nil )
setObj[ '' ] = common.formatNum( heat.overheat_temperature, nil )
setObj[ '' ] = common.formatNum( heat.recovery_temperature, nil )
setObj[ '' ] = common.formatNum( heat.misfire_min_temperature, nil )
setObj[ '' ] = common.formatNum( heat.misfire_max_temperature, nil )
]]--
end
function methodtable.setPowerData( self, setObj )
if self.apiData == nil or type( self.apiData.power ) ~= 'table' then
return
end
local power = self.apiData.power
setObj[ 'Grundverbrauch' ] = common.formatNum( power.power_base, nil )
setObj[ 'Leistungsaufnahme' ] = common.formatNum( power.power_draw, nil )
local emMin = common.formatNum( power.em_min, nil )
local emMax = common.formatNum( power.em_max, nil )
setObj[ 'Elektromagnetische Strahlung' ] = { emMin, emMax }
--[[
setObj[ '' ] = common.formatNum( power.throttleable, nil )
setObj[ '' ] = common.formatNum( power.overclockable, nil )
setObj[ '' ] = common.formatNum( power.overclock_threshold_min, nil )
setObj[ '' ] = common.formatNum( power.overclock_threshold_max, nil )
setObj[ '' ] = common.formatNum( power.overclock_performance, nil )
setObj[ '' ] = common.formatNum( power.overpower_performance, nil )
setObj[ '' ] = common.formatNum( power.decay_rate_em, nil )
]]--
end
function methodtable.setDistortionData( self, setObj )
if self.apiData == nil or type( self.apiData.distortion ) ~= 'table' then
return
end
local distortion = self.apiData.distortion
--[[
setObj[ '' ] = common.formatNum( distortion.decay_rate, nil )
setObj[ '' ] = common.formatNum( distortion.maximum, nil )
setObj[ '' ] = common.formatNum( distortion.overload_ratio, nil )
setObj[ '' ] = common.formatNum( distortion.recovery_ratio, nil )
setObj[ '' ] = common.formatNum( distortion.recovery_time, nil )
]]--
end
function methodtable.setDurabilityData( self, setObj )
if self.apiData == nil or type( self.apiData.durability ) ~= 'table' then
return
end
local durability = self.apiData.durability
setObj[ 'Schadenspunkte' ] = common.formatNum( durability.health, nil )
setObj[ 'Reparierbar' ] = durability.repairable
setObj[ 'Bergbar' ] = durability.salvageable
--setObj[ '' ] = common.formatNum( durability.max_lifetime, nil )
end
function methodtable.setVehicleItemData( self, setObj )
if self.apiData == nil and self.apiData.class == nil and componentData.mappings[ self.apiData.type or '' ] == nil then
return
end
local grade = self.apiData.grade
if grade ~= nil and grade == 'Bespoke' then
grade = 'Sonderanfertigung'
end
setObj[ 'Grad' ] = grade
setObj[ 'Typ' ] = {
( componentData.mappings[ self.apiData.type or '' ] or self.apiData.type ) .. '@de',
( self.apiData.type ) .. '@en'
}
if self.apiData.class ~= nil then
setObj[ 'Klasse' ] = {
( componentData.classMaps[ self.apiData.class or '' ] or self.apiData.class ) .. '@de',
( self.apiData.class ) .. '@en'
}
end
end
--- Sets the main categories for this object
function methodtable.setCategories( self, smwData )
if smwData.Hersteller == nil then
table.insert( self.categories, '[[Category:Seiten mit Skriptfehlern]]' )
return
end
if self.lang == 'de' then
table.insert( self.categories, '[[Category:' .. smwData.Hersteller .. '|' .. smwData.Name .. ' ]]' )
table.insert( self.categories, '[[Category:Item|' .. smwData.Name .. ' ]]' )
if smwData.type ~= nil then
table.insert( self.categories, '[[Category:' .. smwData.type_de .. '|' .. smwData.Name .. ' ]]' )
end
if smwData.class ~= nil then
table.insert( self.categories, '[[Category:' .. smwData.class_de .. ' Komponente' .. '|' .. smwData.Name .. ' ]]' )
end
if smwData.grade ~= nil then
table.insert( self.categories, '[[Category:Grad ' .. smwData.grade .. ' Komponente' .. '|' .. smwData.Name .. ' ]]' )
end
else
table.insert( self.categories, '[[Category:' .. smwData.Name ..'|' .. smwData.Name .. ' ]]' )
end
end
--- Entrypoint for {{#seo:}}
function methodtable.setSeoData( self )
--[[
local data = self:getSmwData()
if nil == data.Hersteller then
-- Faulty SMW data, don't call #seo
return
end
require( 'Module:SEO' ).set(
TNT.formatInLanguage( self.lang, 'I18n/Module:Item', 'seo_section' ),
data.page,
table.concat({
data.Name,
data.Hersteller,
self.currentFrame:preprocess( '{{SITENAME}}' )
}, ' - '),
'replace',
{
data.Name,
data.type or '',
data.class or '',
data.Hersteller,
require( 'Module:Hersteller' ).getCodeFromName( data.Hersteller ),
TNT.formatInLanguage( self.lang, 'I18n/Module:Item', 'seo_section' ),
},
nil,
self.frameArgs[ 'image' ],
data.page
)]]--
end
--- Creates the infobox
function methodtable.getInfoBox( self )
local data = self:getSmwData()
if type( data ) == 'string' then
return log.info( data )
end
if nil == data.Hersteller then
data.Hersteller = 'Unbekannter Hersteller'
end
-- Set Title
common.setDisplayTitle( self.currentFrame, data.Name )
local box = require( 'Module:InfoboxNeue' ):new( {
removeEmpty = true,
emptyString = '-',
} )
local nameNormalized, _ = mw.ustring.gsub( data.Name, "[^%w-]", ' ' )
nameNormalized, _ = mw.ustring.gsub( nameNormalized, "%s+", ' ' )
local nameCleaned, _ = mw.ustring.gsub( nameNormalized, "%(", '' )
nameCleaned, _ = mw.ustring.gsub( nameCleaned, "%)", '' )
box:renderImage( common.getImage( {
self.frameArgs[ 'image' ],
mw.text.trim( nameNormalized ) .. '.jpg',
mw.text.trim( nameCleaned ) .. '.jpg',
} ) )
box:renderHeader( {
title = data.Name,
subtitle = '[[' .. data.Hersteller .. ']]' .. api.getVersionInfoRef( data.version, self.lang )
} )
local itemType = data.type
if itemType ~= nil then
itemType = string.format('[[:Kategorie:%s|%s]]', data.type_de, itemType)
end
local sectionTable = {}
local itemClass = data.class
if itemClass ~= nil then
itemClass = string.format('[[:Kategorie:%s Komponente|%s]]', data.class_de, itemClass)
if data.grade ~= nil then
itemClass = itemClass .. string.format(' ([[:Kategorie:Grad %s Komponente|%s]])', data.grade, data.grade)
end
end
box:renderSection( {
content = {
box:renderItem( { label = TNT.formatInLanguage( self.lang, 'Item', 'lbl_type' ), data = itemType } ),
box:renderItem( { label = TNT.formatInLanguage( self.lang, 'Item', 'lbl_class' ), data = itemClass } ),
box:renderItem( { label = TNT.formatInLanguage( self.lang, 'Item', 'lbl_price' ), data = data.price or TNT.formatInLanguage( self.lang, 'Item', 'txt_cant_buy' ) } ),
box:renderItem( { label = TNT.formatInLanguage( self.lang, 'Item', 'lbl_carrying_capacity' ), data = data[ 'SP' ] or '-' } ),
box:renderItem( { label = TNT.formatInLanguage( self.lang, 'Item', 'lbl_weight' ), data = data.Volumen } ),
box:renderItem( { label = TNT.formatInLanguage( self.lang, 'VehicleComponent', 'lbl_ir' ), data = data.ir or '-' } ),
box:renderItem( { label = TNT.formatInLanguage( self.lang, 'VehicleComponent', 'lbl_em' ), data = data.em or '-' } ),
},
col = 2
} )
return tostring( box )
end
--- Set the frame and load args
--- @param frame table
function methodtable.setFrame( self, frame )
self.currentFrame = frame
self.frameArgs = require( 'Module:Arguments' ).getArgs( frame )
if type( self.frameArgs[ 'Bild' ] ) == 'string' then
self.frameArgs[ 'image' ] = self.frameArgs[ 'Bild' ]
end
if type( self.frameArgs[ 'Name' ] ) == 'string' then
self.frameArgs[ 'name' ] = self.frameArgs[ 'name' ]
end
end
--- Get categories
function methodtable.getCategories( self )
return tostring( table.concat( self.categories ) )
end
--- Save Api Data to SMW store
function methodtable.saveApiData( self )
if self.currentFrame == nil then
error( 'No frame set. Call "setFrame" first.', 0 )
end
local data = self:getApiDataForCurrentPage()
self:setSemanticProperties()
return data
end
--- Template entry
function Item.main( frame )
local instance = Item:new()
instance:setFrame( frame )
if not localized.isLanguagePage() then
if instance.frameArgs[ 'Manuell' ] ~= nil then
instance:addManual()
else
local message = instance:saveApiData()
if type( message ) == 'string' then
instance.categories = {
'[[Category:Seiten mit Skriptfehlern]]',
}
-- Could not retrieve API data, show an error and set the error category
return message .. instance:getCategories()
end
end
end
instance:setCategories( instance:getSmwData() )
instance:setSeoData()
return tostring( instance:getInfoBox() ) .. instance:getCategories()
end
--- New Instance
function Item.new( self, name, apiData )
local instance = {
categories = {},
frameArgs = {
[ 'name' ] = name
},
apiData = apiData or nil,
lang = require( 'Module:Template translation' )._getLanguageSubpage( mw.title.getCurrentTitle() )
}
setmetatable( instance, metatable )
return instance
end
return Item