forked from Liquipedia/Lua-Modules
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgame.lua
More file actions
171 lines (139 loc) · 4.63 KB
/
Copy pathgame.lua
File metadata and controls
171 lines (139 loc) · 4.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
---
-- @Liquipedia
-- wiki=commons
-- page=Module:Game
--
-- Please see https://github.com/Liquipedia/Lua-Modules to contribute
--
local Class = require('Module:Class')
local FnUtil = require('Module:FnUtil')
local Logic = require('Module:Logic')
local Lua = require('Module:Lua')
local String = require('Module:StringUtils')
local Table = require('Module:Table')
local Info = Lua.import('Module:Info', {requireDevIfEnabled = true})
local GamesData = Info.games
local ICON_STRING = '[[File:${icon}|link=${link}|class=${class}|${size}]]'
local DEFAULT_SIZE = '25x25px'
local ICON_PLACEHOLDER = 'LeaguesPlaceholder.png'
local Game = {}
Game.getIdentifierByAbbreviation = FnUtil.memoize(function()
return Table.map(GamesData, function(gameIdentifier, gameData)
return gameData.abbreviation:lower(), gameIdentifier end)
end)
Game.getIdentifierByName = FnUtil.memoize(function()
return Table.map(GamesData, function(gameIdentifier, gameData) return gameData.name:lower(), gameIdentifier end)
end)
---Get the identifier of a entered game. Checks against identifiers, full names and abbreviations.
---@param args? {game: string?, useDefault: boolean?}
---@return string?
function Game.toIdentifier(args)
args = args or {}
local gameInput = args.game
if String.isEmpty(gameInput) and Logic.nilOr(Logic.readBoolOrNil(args.useDefault), true) then
return Info.defaultGame
elseif String.isEmpty(gameInput) then
return
end
gameInput = gameInput:lower()
return Game.getIdentifierByAbbreviation()[gameInput]
or Game.getIdentifierByName()[gameInput]
or GamesData[gameInput] and gameInput
or nil
end
---Check if a given game is a valid game.
---@param game string?
---@return boolean
function Game.isValid(game)
return Table.isNotEmpty(Game.raw{game = game})
end
---Fetches the raw data for a given game
---@param args? {game: string?, useDefault: boolean?}
---@return table
function Game.raw(args)
local identifier = Game.toIdentifier(args)
if not identifier then
return {}
end
return GamesData[identifier] or {}
end
---Fetches the abbreviation for a given game
---@param args? {game: string?, useDefault: boolean?}
---@return string?
function Game.abbreviation(args)
return Game.raw(args).abbreviation
end
---Fetches the name for a given game
---@param args? {game: string?, useDefault: boolean?}
---@return string?
function Game.name(args)
return Game.raw(args).name
end
---Fetches the link for a given game
---@param args? {game: string?, useDefault: boolean?}
---@return string?
function Game.link(args)
return Game.raw(args).link
end
---Fetches the defaultTeamLogos (light & dark) for a given game
---@param args? {game: string?, useDefault: boolean?}
---@return table?
function Game.defaultTeamLogoData(args)
return Game.raw(args).defaultTeamLogo
end
---Builds the icon for a given game
---@param args? {game: string?, useDefault: boolean?, size: string?, noLink: boolean?, link: string?}
---@return string
function Game.icon(args)
args = args or {}
local gameData = Game.raw(args)
if Table.isEmpty(gameData) then
return Game._createIcon{icon = ICON_PLACEHOLDER, size = args.size}
end
local link = Logic.readBool(args.noLink) and '' or args.link or gameData.link
if gameData.logo.lightMode == gameData.logo.darkMode then
return Game._createIcon{icon = gameData.logo.lightMode, size = args.size, link = link}
end
return Game._createIcon{size = args.size, link = link, mode = 'light', icon = gameData.logo.lightMode}
.. Game._createIcon{size = args.size, link = link, mode = 'dark', icon = gameData.logo.darkMode}
end
---@param args {mode: string?, icon: string?, size: string?, link: string?}
---@return string
function Game._createIcon(args)
return String.interpolate(
ICON_STRING,
{
icon = args.icon,
size = args.size or DEFAULT_SIZE,
class = args.mode and ('show-when-' .. args.mode .. '-mode') or '',
link = args.link or '',
}
)
end
Game.defaultTeamLogos = FnUtil.memoize(function()
local defaultTeamLogos = {}
for _, gameData in pairs(GamesData) do
local teamLogos = gameData.defaultTeamLogo
defaultTeamLogos[teamLogos.darkMode] = true
defaultTeamLogos[teamLogos.lightMode] = true
end
return defaultTeamLogos
end)
---@param args {logo: string?, game: string?, useDefault: boolean?}
---@return boolean
function Game.isDefaultTeamLogo(args)
local logo = args.logo
if String.isEmpty(logo) then
return false
end
logo = logo:gsub('_', ' ')
if String.isEmpty(args.game) then
return Game.defaultTeamLogos()[logo] ~= nil
end
local defaultLogos = Game.raw(args).defaultTeamLogo
if not defaultLogos then
error('Invalid game input "' .. args.game .. '"')
end
return Table.includes(defaultLogos, logo)
end
return Class.export(Game)