全站通知:

模块:FilterWidget

来自失落的龙约WIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索

This Lua module provides handling of complex data to be input into respective filter widgets. For instance, getting the list of all unique ability icons for Wyrmprints or all unique affinity icons.

Currently supported widgets


-- <includeonly> (prevents literal interpretation of links or categories within the module code)
-- Lua Templating for Filter Widget related logic
local p = {}
local cargo = mw.ext.cargo

-- Filter header for wyrmrprint lists
-- Usage: {{#invoke:FilterWidget|Wyrmprints}}
-- Test in console with: `=p.Wyrmprints(mw.getCurrentFrame())`
function p.Wyrmprints(frame)
  local abFilterValues = 'abilities=%s|abilityIcons=%s'
  local affinityFilterValues = 'affinityIds=%s|affinityIcons=%s|affinityNames=%s'

  local result = {}
  local abilities = cargo.query('Wyrmprints,Abilities', 'AbilityIconName', {
    join    = 'Wyrmprints.Abilities13=Abilities.Id',
    where   = 'Abilities13>0',
    groupBy = 'AbilityIconName',
    orderBy = 'AbilityIconName',
  })
  for i, ability in ipairs(abilities) do
    -- Ability Icon
    local abIcon = ability['AbilityIconName']
    local abIconPath = frame:callParserFunction('filepath', abIcon..'.png')
    result[#result+1] = string.format(abFilterValues, abIcon, abIconPath)
  end

  local affinities = cargo.query('Wyrmprints,AffinityBonus',
    'UnionAbilityGroupId,AffinityBonus.Name=AffinityName', {
    join    = 'Wyrmprints.UnionAbilityGroupId=AffinityBonus.Id',
    where   = 'UnionAbilityGroupId>0',
    groupBy = 'UnionAbilityGroupId',
    orderBy = 'AffinityBonus.SortId',
  })
  for i, aff in ipairs(affinities) do
    local affinityId = aff['UnionAbilityGroupId']
    local affinityIcon = 'Icon_Union_'..string.format("%02d",affinityId)..'.png'
    local affinityName = aff['AffinityName']
    local affinityIconPath = frame:callParserFunction('filepath', affinityIcon)
    result[#result+1] = string.format(affinityFilterValues,
        affinityId, affinityIconPath, affinityName)
  end

  return frame:preprocess(string.format('{{#widget:WyrmprintListFilter|%s}}', table.concat(result, '|')))
end

-- Filter header for Dragon lists
-- Usage: {{#invoke:FilterWidget|Dragons}}
-- Test in console with: `=p.Dragons(mw.getCurrentFrame())`
function p.Dragons(frame)
  local abFilterValues = 'abilities=%s|abilityIcons=%s'

  local result = {}
  local abilityIds = {}
  local abilityFields = {'Abilities15', 'Abilities25', 'Abilities16', 'Abilities26'}
  local dragonAbilities = cargo.query(
    'Dragons', table.concat(abilityFields, ',')
  )
  for _, dragon in ipairs(dragonAbilities) do
    for _, abilityField in ipairs(abilityFields) do
      abilityIds[dragon[abilityField]] = 1
    end
  end

  abilityIds[''] = nil
  abilityIds['0'] = nil
  local uniqueAbilityIds = {}
  for id in pairs(abilityIds) do
    uniqueAbilityIds[#uniqueAbilityIds + 1] = id
  end

  local abilities = cargo.query('Abilities', 'AbilityIconName', {
    where   = ('Id IN (%s)'):format(table.concat(uniqueAbilityIds, ',')),
    groupBy = 'AbilityIconName',
    orderBy = 'COUNT(AbilityIconName) DESC, Id',
  })
  for i, ability in ipairs(abilities) do
    -- Ability Icon
    local abIcon = ability['AbilityIconName']
    local abIconPath = frame:callParserFunction('filepath', abIcon..'.png')
    result[#result+1] = string.format(abFilterValues, abIcon, abIconPath)
  end
  return frame:preprocess(string.format('{{#widget:DragonListFilter|%s}}', table.concat(result, '|')))
end

return p
--</includeonly>