diff --git a/lua/wikis/commons/Widget/EmptyPagePreview.lua b/lua/wikis/commons/Widget/EmptyPagePreview.lua new file mode 100644 index 00000000000..697fdb99c71 --- /dev/null +++ b/lua/wikis/commons/Widget/EmptyPagePreview.lua @@ -0,0 +1,36 @@ +--- +-- @Liquipedia +-- page=Module:Widget/EmptyPagePreview +-- +-- Please see https://github.com/Liquipedia/Lua-Modules to contribute +-- + +local Lua = require('Module:Lua') + +local Class = Lua.import('Module:Class') +local Namespace = Lua.import('Module:Namespace') +local TeamTemplate = Lua.import('Module:TeamTemplate') + +local EmptyTeamPagePreview = Lua.import('Module:Widget/EmptyPagePreview/Team') +local EmptyPersonPagePreview = Lua.import('Module:Widget/EmptyPagePreview/Person') +local Widget = Lua.import('Module:Widget') + +---@class EmptyPagePreview: Widget +---@operator call(table): EmptyPagePreview +local EmptyPagePreview = Class.new(Widget) + + +---@return Widget? +function EmptyPagePreview:render() + if not Namespace.isMain() then + return + end + + if TeamTemplate.exists(self.props.pageName or mw.title.getCurrentTitle().prefixedText) then + return EmptyTeamPagePreview(self.props) + end + + return EmptyPersonPagePreview(self.props) +end + +return EmptyPagePreview diff --git a/lua/wikis/commons/Widget/EmptyPagePreview/Person.lua b/lua/wikis/commons/Widget/EmptyPagePreview/Person.lua new file mode 100644 index 00000000000..1fa237d8da4 --- /dev/null +++ b/lua/wikis/commons/Widget/EmptyPagePreview/Person.lua @@ -0,0 +1,250 @@ +--- +-- @Liquipedia +-- page=Module:Widget/EmptyPagePreview/Person +-- +-- Please see https://github.com/Liquipedia/Lua-Modules to contribute +-- + +local Lua = require('Module:Lua') + +local Array = Lua.import('Module:Array') +local BroadcasterTable = Lua.import('Module:BroadcastTalentTable') +local Class = Lua.import('Module:Class') +local DateExt = Lua.import('Module:Date/Ext') +local Info = Lua.import('Module:Info', {loadData = true}) +local Infobox = Lua.import('Module:Infobox/Person/Player/Custom') +local Logic = Lua.import('Module:Logic') +local MatchTable = Lua.import('Module:MatchTable/Custom') +local Namespace = Lua.import('Module:Namespace') +local Opponent = Lua.import('Module:Opponent/Custom') +local Page = Lua.import('Module:Page') +local ResultsTable = Lua.import('Module:ResultsTable/Custom') +local Table = Lua.import('Module:Table') +local Tabs = Lua.import('Module:Tabs') +local Variables = Lua.import('Module:Variables') + +local PlayerAutoTeamNavBox = Lua.import('Module:Widget/NavBox/AutoTeam/Player') +local HtmlWidgets = Lua.import('Module:Widget/Html/All') +local Widget = Lua.import('Module:Widget') +local WidgetUtil = Lua.import('Module:Widget/Util') + +local Condition = Lua.import('Module:Condition') +local ConditionTree = Condition.Tree +local ConditionNode = Condition.Node +local Comparator = Condition.Comparator +local BooleanOperator = Condition.BooleanOperator +local ColumnName = Condition.ColumnName + +local DEFAULT_MAX_PLAYERS_PER_PLACEMENT = Info.config.defaultMaxPlayersPerPlacement or 10 + +---@class EmptyPersonPagePreview: Widget +---@operator call(table): EmptyPersonPagePreview +local EmptyPersonPagePreview = Class.new(Widget) +EmptyPersonPagePreview.defaultProps = {pageName = mw.title.getCurrentTitle().prefixedText} + +---@return Widget? +function EmptyPersonPagePreview:render() + if not Namespace.isMain() then + return + end + + --disable storage ... just to be sure ... + Variables.varDefine('disable_LPDB_storage', 'true') + + self.person = Page.applyUnderScoresIfEnforced(self.props.pageName) + + return HtmlWidgets.Div{ + children = WidgetUtil.collect( + self:_infobox(), + HtmlWidgets.H2{children = {'Overview'}}, + self:_results(), + self:_matches(), + HtmlWidgets.Br{}, + PlayerAutoTeamNavBox{} + ), + } +end + +---@private +---@return Widget +function EmptyPersonPagePreview:_infobox() + local infoboxArgsFromSquadInfo = self:_backfillInformationFromSquadInfo() + + local infoboxArgs = Table.merge( + { + default = 'Infobox player NoImage.png', + defaultDark = 'Infobox player NoImage darkmode.png', + }, + infoboxArgsFromSquadInfo, + self:_backfillInformationFromPlacements() + ) + table.insert(infoboxArgs.idsArray, infoboxArgsFromSquadInfo.id) + infoboxArgs.idsArray = Array.unique(infoboxArgs.idsArray) + infoboxArgs.idsArray = Array.filter(infoboxArgs.idsArray, function(id) + return id ~= infoboxArgs.id + end) + infoboxArgs.ids = table.concat(infoboxArgs.idsArray, ', ') + infoboxArgs.id = infoboxArgs.id or self.props.pageName + + return Infobox.run(infoboxArgs) +end + +---@private +---@return Widget[] +function EmptyPersonPagePreview:_matches() + return { + HtmlWidgets.H3{children = 'Most Recent Matches'}, + MatchTable.results{ + tableMode = 'solo', + player = self.person, + showType = true, + limit = 10, + } + } +end + +---@private +---@return (Widget|Html)[] +function EmptyPersonPagePreview:_results() + ---@type table + local tabArgs = { + suppressHeader = true, + name1 = 'Achievements', + content1 = ResultsTable.results{ + player = self.person, + showType = true, + gameIcons = true, + awards = false, + achievements = true, + querytype = 'solo', + } + } + local index = 2 + + local awardsAchievements = ResultsTable.awards{ + player = self.person, + showType = true, + gameIcons = true, + awards = true, + achievements = true, + querytype = 'solo', + } + if Logic.isNotEmpty(awardsAchievements) then + tabArgs['name' .. index] = 'Awards Achievements' + tabArgs['content' .. index] = awardsAchievements + index = index + 1 + end + + local talentAchievements = BroadcasterTable.run{ + broadcaster = self.person, + achievements = true, + useTickerNames = true, + } + if Logic.isNotEmpty(talentAchievements) then + tabArgs['name' .. index] = 'Talent Achievements' + tabArgs['content' .. index] = talentAchievements + end + + return { + HtmlWidgets.H3{children = 'Achievements'}, + Tabs.dynamic(tabArgs) + } +end + +--- checks the last 100 placements for the wanted data +---@private +---@return table +function EmptyPersonPagePreview:_backfillInformationFromPlacements() + local personConditions = ConditionTree(BooleanOperator.any) + -- players + :add(Array.map(Array.range(1, DEFAULT_MAX_PLAYERS_PER_PLACEMENT), function(index) + return ConditionNode(ColumnName('p' .. index, 'opponentplayers'), Comparator.eq, self.person) + end)) + -- coaches (etc) + :add(Array.map(Array.range(1, 5), function(index) + return ConditionNode(ColumnName('c' .. index, 'opponentplayers'), Comparator.eq, self.person) + end)) + + local conditions = ConditionTree(BooleanOperator.all):add{ + ConditionNode(ColumnName('date'), Comparator.neq, DateExt.defaultDateTime), + ConditionNode(ColumnName('opponentplayers'), Comparator.neq, ''), + ConditionNode(ColumnName('opponentplayers'), Comparator.neq, '[]'), + ConditionNode(ColumnName('liquipediatier'), Comparator.neq, -1), + personConditions + } + + local placements = mw.ext.LiquipediaDB.lpdb('placement', { + conditions = tostring(conditions), + query = 'opponenttype, opponentname, opponenttemplate, opponentplayers', + order = 'date desc', + limit = 100, + }) + + local infoboxArgs = {idsArray = {}} + + if #placements == 0 then + return infoboxArgs + end + + ---@param personData table + ---@return standardPlayer? + local getPerson = function(personData) + local index = 1 + while personData['p' .. index] or personData['c' .. index] do + if personData['p' .. index] == self.person then + return Opponent.playerFromLpdbStruct(personData, index) + end + if personData['c' .. index] == self.person then + return Opponent.staffFromLpdbStruct(personData, index) + end + index = index + 1 + end + end + + Array.forEach(Array.reverse(placements), function(placement) + local person = getPerson(placement.opponentplayers) + if not person then + return + end + + local id = Logic.nilIfEmpty(person.displayName) + table.insert(infoboxArgs.idsArray, id) + Table.mergeInto(infoboxArgs, { + id = id, + country = person.flag, + faction = person.faction, + }) + end) + + return infoboxArgs +end + +---@private +---@return table +function EmptyPersonPagePreview:_backfillInformationFromSquadInfo() + local squadEntry = mw.ext.LiquipediaDB.lpdb('squadplayer', { + conditions = tostring(ConditionNode(ColumnName('link'), Comparator.eq, self.person)), + query = 'name, id, nationality, leavedate, inactivedate, pagename, extradata', + order = 'joindate desc', + limit = 1, + })[1] + + if not squadEntry then + return {} + end + + local infoboxArgs = { + id = Logic.nilIfEmpty(squadEntry.id), + country = Logic.nilIfEmpty(squadEntry.nationality), + faction = Logic.nilIfEmpty((squadEntry.extradata or {}).faction), + name = Logic.nilIfEmpty(squadEntry.name), + } + + if DateExt.isDefaultTimestamp(squadEntry.leavedate) and DateExt.isDefaultTimestamp(squadEntry.inactivedate) then + infoboxArgs.team = squadEntry.pagename + end + + return infoboxArgs +end + +return EmptyPersonPagePreview diff --git a/lua/wikis/commons/Widget/EmptyPagePreview/Team.lua b/lua/wikis/commons/Widget/EmptyPagePreview/Team.lua index 8a4d2e1dac1..0735b5b76a2 100644 --- a/lua/wikis/commons/Widget/EmptyPagePreview/Team.lua +++ b/lua/wikis/commons/Widget/EmptyPagePreview/Team.lua @@ -246,7 +246,7 @@ function EmptyTeamPagePreview:_rosterFromTransfers() end ---@private ----@return (Widget|Html)[] +---@return Widget[] function EmptyTeamPagePreview:_matches() return { HtmlWidgets.H3{children = 'Most Recent Matches'}, @@ -260,7 +260,7 @@ function EmptyTeamPagePreview:_matches() end ---@private ----@return (Widget|Html)[] +---@return Widget[] function EmptyTeamPagePreview:_results() return { HtmlWidgets.H3{children = 'Achievements'}, diff --git a/lua/wikis/starcraft/Infobox/Person/Player/Custom.lua b/lua/wikis/starcraft/Infobox/Person/Player/Custom.lua index cfb47b91b25..80c526b2b52 100644 --- a/lua/wikis/starcraft/Infobox/Person/Player/Custom.lua +++ b/lua/wikis/starcraft/Infobox/Person/Player/Custom.lua @@ -94,7 +94,7 @@ function CustomInjector:parse(id, widgets) return { Cell{ name = 'Race', - children = {CustomPlayer._getRaceDisplay(args.race)} + children = {CustomPlayer._getRaceDisplay(args.race or args.faction)} } } elseif id == 'role' then return {} @@ -148,7 +148,7 @@ end ---@param args table ---@return string function CustomPlayer:nameDisplay(args) - local factions = Faction.readMultiFaction(args.race or Faction.defaultFaction, {alias = false}) + local factions = Faction.readMultiFaction(args.race or args.faction or Faction.defaultFaction, {alias = false}) local raceIcons = table.concat(Array.map(factions, function(faction) return Faction.Icon{faction = faction, size = 'medium'} @@ -176,7 +176,7 @@ end function CustomPlayer:adjustLPDB(lpdbData, args, personType) local extradata = lpdbData.extradata or {} - local factions = Faction.readMultiFaction(args.race, {alias = false}) + local factions = Faction.readMultiFaction(args.race or args.faction, {alias = false}) extradata.race = factions[1] extradata.faction = Faction.toName(factions[1]) @@ -517,7 +517,7 @@ function CustomPlayer:getWikiCategories(categories) table.insert(categories, 'Foreign Players') end - for _, faction in pairs(Faction.readMultiFaction(args.race, {alias = false})) do + for _, faction in pairs(Faction.readMultiFaction(args.race or args.faction, {alias = false})) do table.insert(categories, Faction.toName(faction) .. ' Players') end diff --git a/lua/wikis/starcraft2/Infobox/Person/Custom.lua b/lua/wikis/starcraft2/Infobox/Person/Custom.lua index 766b0ce7a2c..0baf65839a1 100644 --- a/lua/wikis/starcraft2/Infobox/Person/Custom.lua +++ b/lua/wikis/starcraft2/Infobox/Person/Custom.lua @@ -55,7 +55,7 @@ end ---@param args table ---@return string function CustomPerson:nameDisplay(args) - local raceData = self:readFactions(args.race or Faction.defaultFaction) + local raceData = self:readFactions(args.race or args.faction or Faction.defaultFaction) local raceIcons if raceData.isAll then @@ -109,7 +109,7 @@ end function CustomPerson:adjustLPDB(lpdbData, args, personType) local extradata = lpdbData.extradata or {} - local raceData = self:readFactions(args.race) + local raceData = self:readFactions(args.race or args.faction) extradata.race = raceData.isAll and RACE_ALL_SHORT or raceData.factions[1] extradata.faction = raceData.isAll and RACE_ALL or raceData.factions[1] diff --git a/lua/wikis/starcraft2/Infobox/Person/MapMaker/Custom.lua b/lua/wikis/starcraft2/Infobox/Person/MapMaker/Custom.lua index 887cfef37fb..02eb1263731 100644 --- a/lua/wikis/starcraft2/Infobox/Person/MapMaker/Custom.lua +++ b/lua/wikis/starcraft2/Infobox/Person/MapMaker/Custom.lua @@ -45,7 +45,7 @@ function CustomInjector:parse(id, widgets) return { Cell{ name = 'Race', - children = {self.caller:getRaceData(args.race)} + children = {self.caller:getRaceData(args.race or args.faction)} } } elseif id == 'role' then return {} diff --git a/lua/wikis/starcraft2/Infobox/Person/Player/Custom.lua b/lua/wikis/starcraft2/Infobox/Person/Player/Custom.lua index d51f87b334c..6ef06a72fe3 100644 --- a/lua/wikis/starcraft2/Infobox/Person/Player/Custom.lua +++ b/lua/wikis/starcraft2/Infobox/Person/Player/Custom.lua @@ -113,7 +113,7 @@ function CustomInjector:parse(id, widgets) return { Cell{ name = 'Race', - children = {caller:getRaceData(args.race, RACE_FIELD_AS_CATEGORY_LINK)} + children = {caller:getRaceData(args.race or args.faction, RACE_FIELD_AS_CATEGORY_LINK)} } } elseif id == 'role' then return {} @@ -455,7 +455,7 @@ end ---@param categories string[] ---@return string[] function CustomPlayer:getWikiCategories(categories) - for _, faction in pairs(self:readFactions(self.args.race).factions) do + for _, faction in pairs(self:readFactions(self.args.race or self.args.faction).factions) do table.insert(categories, faction .. ' Players') end diff --git a/lua/wikis/warcraft/Infobox/Person/Player/Custom.lua b/lua/wikis/warcraft/Infobox/Person/Player/Custom.lua index 156da2d1b4f..553cb14bb95 100644 --- a/lua/wikis/warcraft/Infobox/Person/Player/Custom.lua +++ b/lua/wikis/warcraft/Infobox/Person/Player/Custom.lua @@ -65,7 +65,7 @@ function CustomInjector:parse(id, widgets) elseif id == 'role' then -- WC doesn't show any roles, but rather shows the Race/Faction instead return { - Cell{name = 'Race', children = {Faction.toName(args.race)}} + Cell{name = 'Race', children = {Faction.toName(args.race or args.faction)}} } end return widgets @@ -76,7 +76,7 @@ end ---@param personType string ---@return table function CustomPlayer:adjustLPDB(lpdbData, args, personType) - lpdbData.extradata.faction = Faction.toName(args.race) + lpdbData.extradata.faction = Faction.toName(args.race or args.faction) lpdbData.extradata.factionhistorical = Variables.varDefault('racecount') and 'true' or 'false' return lpdbData @@ -85,7 +85,7 @@ end ---@param args table ---@return string function CustomPlayer:nameDisplay(args) - local factionIcon = Faction.Icon{faction = args.race} + local factionIcon = Faction.Icon{faction = args.race or args.faction} return (factionIcon and (factionIcon .. NON_BREAKING_SPACE) or '') .. (args.id or self.pagename)