diff --git a/.luacheckrc b/.luacheckrc index 744763a23ad..63516824adf 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -1,4 +1,7 @@ std = { + globals = { + "mw", + }, read_globals = { "arg", "assert", @@ -7,7 +10,6 @@ std = { "getmetatable", "ipairs", "math", - "mw", "next", "os", "package", diff --git a/standard/mock/mock_lpdb.lua b/standard/mock/mock_lpdb.lua new file mode 100644 index 00000000000..698c39cbdfd --- /dev/null +++ b/standard/mock/mock_lpdb.lua @@ -0,0 +1,143 @@ +--- +-- @Liquipedia +-- wiki=commons +-- page=Module:Mock/Lpdb +-- +-- Please see https://github.com/Liquipedia/Lua-Modules to contribute +-- + +local Array = require('Module:Array') +local Lua = require('Module:Lua') +local String = require('Module:StringUtils') +local Table = require('Module:Table') + +-- Parses a single condition into it's three components, +-- Eg. `[[field::!value]]` is parsed into `field`, `!`, `value` +local CONDITION_REGEX = '%[%[(%a+)::([!><]?)([%a%s%d]+)]]' + +local mockLpdb = {} + +local DEFAULTS = { + limit = 20, + offset = 0, +} + +local _lpdb = { + lpdb = mw.ext.LiquipediaDB.lpdb +} + +function mockLpdb.setUp() + mw.ext.LiquipediaDB.lpdb = mockLpdb.lpdb +end + +function mockLpdb.tearDown() + mw.ext.LiquipediaDB.lpdb = _lpdb.lpdb +end + +--- Not yet supported in Mock is: +---- conditions with `OR` or `_` +---- query with `::` +---- order +---- groupby +---@param dbTable string +---@param parameters table +---@return table +function mockLpdb.lpdb(dbTable, parameters) + local lpdbData = mockLpdb._getMockData(dbTable) + + lpdbData = mockLpdb._applyConditions(lpdbData, parameters.conditions) + + lpdbData = mockLpdb._applyLimitOffset(lpdbData, parameters.limit, parameters.offset) + + lpdbData = mockLpdb._applyQuery(lpdbData, parameters.query) + + return lpdbData +end + +---Fetches mock lpdb data from store +---@param dbTable string +---@return table +function mockLpdb._getMockData(dbTable) + local data = Lua.import('Module:TestAssets/Lpdb/' .. dbTable, {requireDevIfEnabled = true}) + + if not data then + error(mw.message.new('liquipediadb-error-invalid-datatype')) + end + + return data +end + +---Filters the mock data based on an lpdb conditions string. +---@param data table +---@param conditions string? +---@return table +function mockLpdb._applyConditions(data, conditions) + if String.isNotEmpty(conditions) then + ---@cast conditions -nil ---Since the engine cannot determine that isNotEmpty checks for nil, we remove the nil + local condition = mockLpdb._parseConditions(conditions) + return Array.filter(data, condition) + end + + return data +end + +---Applies limit and offset to mock data +---@param data table +---@param inputLimit number? +---@param inputOffset number? +---@return table +function mockLpdb._applyLimitOffset(data, inputLimit, inputOffset) + local limit = tonumber(inputLimit) or DEFAULTS.limit + local offset = tonumber(inputOffset) or DEFAULTS.offset + + return Array.sub(data, offset + 1, (offset + limit)) +end + +---Applies the field selectors (query) to the mock data +---@param data table +---@param query string? +---@return table +function mockLpdb._applyQuery(data, query) + if String.isNotEmpty(query) then + local fields = Table.mapValues(mw.text.split(query, ','), mw.text.trim) + + return Array.map(data, function(entry) + return Table.map(entry, function(field, value) + -- Use map as a filter since there's no applicable filter function in either Array or Table yet + return field, Table.includes(fields, field) and value or nil + end) + end) + end + + return data +end + +---Parse a condition string into a function +---@param conditions string +---@return function +function mockLpdb._parseConditions(conditions) + ---@type {comparator:string, name:string, value:string}[] + local criterias = {} + + for name, comparator, value in string.gmatch(conditions, CONDITION_REGEX) do + table.insert(criterias, {name = name, comparator = comparator, value = value}) + end + + return function (entry) + return Array.all(criterias, function (criteria) + if criteria.comparator == '' then + return entry[criteria.name] == criteria.value + elseif criteria.comparator == '!' then + return entry[criteria.name] ~= criteria.value + elseif criteria.comparator == '>' then + return entry[criteria.name] > criteria.value + elseif criteria.comparator == '<' then + return entry[criteria.name] < criteria.value + else + error('Unknown comparator: '.. tostring(criteria.comparator)) + end + end) + end +end + +return mockLpdb diff --git a/test_assets/lpdb_player.lua b/test_assets/lpdb_player.lua new file mode 100644 index 00000000000..2cb138adc1b --- /dev/null +++ b/test_assets/lpdb_player.lua @@ -0,0 +1,828 @@ +--- +-- @Liquipedia +-- wiki=commons +-- page=Module:TestAssets/Lpdb/player +-- +-- Please see https://github.com/Liquipedia/Lua-Modules to contribute +-- + +-- The following code can be used to generate data: +--- local Formatter = require('Module:Format/Table') +--- Formatter.toLuaCode(mw.ext.LiquipediaDB.lpdb('player', {})) + +-- luacheck: ignore +return { + { + ['alternateid'] = 'suprmane, supr2turnt, suprSayian, suprWRLD', + ['birthdate'] = '1989-03-16', + ['deathdate'] = '1970-01-01', + ['earnings'] = '74410', + ['extradata'] = { + ['earningsin2017'] = 900, + ['earningsin2018'] = 5700, + ['earningsin2019'] = 6600, + ['earningsin2020'] = 2000, + ['earningsin2021'] = 29410, + ['earningsin2022'] = 29800, + ['role'] = 'In-game leader', + ['role2'] = 'Support', + ['signatureOperator1'] = 'smoke', + ['signatureOperator2'] = 'gridlock', + }, + ['id'] = 'supr', + ['image'] = 'Soniqs Supr.jpg', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/a/ab/Soniqs_Supr.jpg/320px-Soniqs_Supr.jpg', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/10033345', + ['faceit'] = 'https://www.faceit.com/en/players/suprmane', + ['home'] = 'http://supr.gg/', + ['siege-gg'] = 'https://siege.gg/players/134', + ['twitch'] = 'https://www.twitch.tv/supr', + ['twitter'] = 'https://twitter.com/suprSeth', + }, + ['localizedname'] = '', + ['name'] = 'Seth Hoffman', + ['namespace'] = '0', + ['nationality'] = 'United States', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10211_player_supr', + ['pageid'] = '10211', + ['pagename'] = 'Supr', + ['region'] = 'North America', + ['romanizedname'] = 'Seth Hoffman', + ['status'] = 'Retired', + ['team'] = 'Soniqs', + ['teampagename'] = 'Soniqs', + ['teamtemplate'] = 'soniqs 2021', + ['type'] = 'player', + }, + { + ['alternateid'] = '', + ['birthdate'] = '1993-05-07', + ['deathdate'] = '1970-01-01', + ['earnings'] = '18038', + ['extradata'] = { + ['earningsin2017'] = 10988, + ['earningsin2018'] = 4400, + ['earningsin2019'] = 2650, + }, + ['id'] = 'yuuk', + ['image'] = 'Yuuk at Six Invitational 2018.jpg', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/5/54/Yuuk_at_Six_Invitational_2018.jpg/400px-Yuuk_at_Six_Invitational_2018.jpg', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/9877455', + ['facebook'] = 'https://facebook.com/LucasYuukRodrigues', + ['instagram'] = 'https://www.instagram.com/LucasYuuk', + ['twitch'] = 'https://www.twitch.tv/tigeryuuk', + ['twitter'] = 'https://twitter.com/LucasYuuk', + ['youtube'] = 'https://www.youtube.com/yuukfps', + }, + ['localizedname'] = '', + ['name'] = 'Lucas Rodrigues', + ['namespace'] = '0', + ['nationality'] = 'Brazil', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10402_player_yuuk', + ['pageid'] = '10402', + ['pagename'] = 'Yuuk', + ['region'] = 'South America', + ['romanizedname'] = 'Lucas Rodrigues', + ['status'] = 'Active', + ['team'] = 'Ninjas in Pyjamas', + ['teampagename'] = 'Ninjas_in_Pyjamas', + ['teamtemplate'] = 'ninjas in pyjamas 2021', + ['type'] = 'player', + }, + { + ['alternateid'] = '', + ['birthdate'] = '1999-08-03', + ['deathdate'] = '1970-01-01', + ['earnings'] = '225491', + ['extradata'] = { + ['earningsin2017'] = 1352, + ['earningsin2018'] = 19360, + ['earningsin2019'] = 28694, + ['earningsin2020'] = 35300, + ['earningsin2021'] = 72396, + ['earningsin2022'] = 68390, + ['signatureOperator1'] = 'twitch', + }, + ['id'] = 'Bullet1', + ['image'] = 'Bullet1 SI20.jpg', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/0/01/Bullet1_SI20.jpg/400px-Bullet1_SI20.jpg', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/9884488', + ['facebook'] = 'https://facebook.com/bullet1r6', + ['instagram'] = 'https://www.instagram.com/bullet1r6', + ['siege-gg'] = 'https://siege.gg/players/98', + ['twitch'] = 'https://www.twitch.tv/bullet1v', + ['twitter'] = 'https://twitter.com/bullet1r6', + ['youtube'] = 'https://www.youtube.com/bullet1r6', + }, + ['localizedname'] = '', + ['name'] = 'José Victor', + ['namespace'] = '0', + ['nationality'] = 'Brazil', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10405_player_Bullet1', + ['pageid'] = '10405', + ['pagename'] = 'Bullet1', + ['region'] = 'South America', + ['romanizedname'] = 'José Victor', + ['status'] = 'Active', + ['team'] = 'FaZe Clan', + ['teampagename'] = 'FaZe_Clan', + ['teamtemplate'] = 'faze clan nov 2021', + ['type'] = 'player', + }, + { + ['alternateid'] = '', + ['birthdate'] = '1999-05-08', + ['deathdate'] = '1970-01-01', + ['earnings'] = '222124', + ['extradata'] = { + ['earningsin2017'] = 3524, + ['earningsin2018'] = 19560, + ['earningsin2019'] = 43694, + ['earningsin2020'] = 42200, + ['earningsin2021'] = 111200, + ['earningsin2022'] = 1947, + ['role'] = 'Support', + ['role2'] = 'In-game leader', + ['signatureOperator1'] = 'Maverick', + }, + ['id'] = 'xS3xyCake', + ['image'] = 'S3xycake DHMTL19.jpg', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/6/6d/S3xycake_DHMTL19.jpg/400px-S3xycake_DHMTL19.jpg', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/10196794', + ['facebook'] = 'https://facebook.com/xsexycake', + ['faceit'] = 'https://www.faceit.com/en/players/xS3xyCake', + ['instagram'] = 'https://www.instagram.com/xsexycake', + ['siege-gg'] = 'https://siege.gg/players/101', + ['twitch'] = 'https://www.twitch.tv/SmexyCake', + ['twitter'] = 'https://twitter.com/xSexyCake', + ['youtube'] = 'https://www.youtube.com/xSexyCake', + }, + ['localizedname'] = '', + ['name'] = 'Thiago Reis', + ['namespace'] = '0', + ['nationality'] = 'Brazil', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10407_player_xS3xyCake', + ['pageid'] = '10407', + ['pagename'] = 'XS3xyCake', + ['region'] = 'South America', + ['romanizedname'] = 'Thiago Reis', + ['status'] = 'Active', + ['team'] = '00 Nation', + ['teampagename'] = '00_Nation', + ['teamtemplate'] = '00 nation', + ['type'] = 'player', + }, + { + ['alternateid'] = 'BBooAF', + ['birthdate'] = '1997-02-21', + ['deathdate'] = '1970-01-01', + ['earnings'] = '56737', + ['extradata'] = { + ['earningsin2016'] = 4750, + ['earningsin2017'] = 4641, + ['earningsin2018'] = 13480, + ['earningsin2019'] = 7767, + ['earningsin2020'] = 6642, + ['earningsin2021'] = 8801, + ['earningsin2022'] = 10656, + ['signatureOperator1'] = 'Zofia', + }, + ['id'] = 'BiBoo', + ['image'] = 'BiBoo Wolves 2022.png', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/c/c0/BiBoo_Wolves_2022.png/222px-BiBoo_Wolves_2022.png', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/7171663', + ['faceit'] = 'https://www.faceit.com/en/players/BiBooAF', + ['siege-gg'] = 'https://siege.gg/players/19', + ['twitch'] = 'https://www.twitch.tv/bibooaf', + ['twitter'] = 'https://twitter.com/BiBoo_R6', + ['youtube'] = 'https://www.youtube.com/channel/UCYIT9FXFE2ylxM8FnV6Ml0Q', + }, + ['localizedname'] = '', + ['name'] = 'Bastien Dulac', + ['namespace'] = '0', + ['nationality'] = 'France', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10412_player_BiBoo', + ['pageid'] = '10412', + ['pagename'] = 'BiBoo', + ['region'] = 'Europe', + ['romanizedname'] = 'Bastien Dulac', + ['status'] = 'Active', + ['team'] = 'Wolves Esports', + ['teampagename'] = 'Wolves_Esports', + ['teamtemplate'] = 'wolves esports', + ['type'] = 'player', + }, + { + ['alternateid'] = '', + ['birthdate'] = '1995-05-09', + ['deathdate'] = '1970-01-01', + ['earnings'] = '354870', + ['extradata'] = { + ['earningsin2016'] = 1750, + ['earningsin2017'] = 11600, + ['earningsin2018'] = 6870, + ['earningsin2019'] = 44250, + ['earningsin2020'] = 225200, + ['earningsin2021'] = 32800, + ['earningsin2022'] = 32400, + ['role'] = 'Support', + ['signatureOperator1'] = 'smoke', + }, + ['id'] = 'Bosco', + ['image'] = 'Bosco Six Invitational 2019.jpg', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/f/f2/Bosco_Six_Invitational_2019.jpg/400px-Bosco_Six_Invitational_2019.jpg', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/10083685', + ['faceit'] = 'https://www.faceit.com/en/players/Bosco-', + ['siege-gg'] = 'https://siege.gg/players/67', + ['twitch'] = 'https://www.twitch.tv/Bosco', + ['twitter'] = 'https://twitter.com/DBosco_', + }, + ['localizedname'] = '', + ['name'] = 'Dylan Bosco', + ['namespace'] = '0', + ['nationality'] = 'United States', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10655_player_Bosco', + ['pageid'] = '10655', + ['pagename'] = 'Bosco', + ['region'] = 'North America', + ['romanizedname'] = 'Dylan Bosco', + ['status'] = 'Active', + ['team'] = 'Spacestation Gaming', + ['teampagename'] = 'Spacestation_Gaming', + ['teamtemplate'] = 'spacestation gaming 2021', + ['type'] = 'player', + }, + { + ['alternateid'] = 'Psycho0', + ['birthdate'] = '1999-02-02', + ['deathdate'] = '1970-01-01', + ['earnings'] = '392682', + ['extradata'] = { + ['earningsin2017'] = 12481, + ['earningsin2018'] = 13500, + ['earningsin2019'] = 15548, + ['earningsin2020'] = 109900, + ['earningsin2021'] = 226073, + ['earningsin2022'] = 15180, + ['role'] = 'In-game leader', + ['signatureOperator1'] = 'glaz', + ['signatureOperator2'] = 'montagne', + ['signatureOperator3'] = 'clash', + ['signatureOperator4'] = 'valkyrie', + }, + ['id'] = 'Psycho', + ['image'] = 'Psycho BR6 2021 S1.jpg', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/a/ac/Psycho_BR6_2021_S1.jpg/400px-Psycho_BR6_2021_S1.jpg', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/9579997', + ['faceit'] = 'https://www.faceit.com/en/players/PsychoR6', + ['instagram'] = 'https://www.instagram.com/psychor6', + ['siege-gg'] = 'https://siege.gg/players/92', + ['twitch'] = 'https://www.twitch.tv/nippsycho', + ['twitter'] = 'https://twitter.com/PsychoR6', + ['youtube'] = 'https://www.youtube.com/UCUfPJq8REvuw8gNFAnbm2Lw', + }, + ['localizedname'] = '', + ['name'] = 'Gustavo Rigal', + ['namespace'] = '0', + ['nationality'] = 'Brazil', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10657_player_Psycho', + ['pageid'] = '10657', + ['pagename'] = 'Psycho', + ['region'] = 'South America', + ['romanizedname'] = 'Gustavo Rigal', + ['status'] = 'Active', + ['team'] = 'Ninjas in Pyjamas', + ['teampagename'] = 'Ninjas_in_Pyjamas', + ['teamtemplate'] = 'ninjas in pyjamas 2021', + ['type'] = 'player', + }, + { + ['alternateid'] = '', + ['birthdate'] = '1970-01-01', + ['deathdate'] = '1970-01-01', + ['earnings'] = '39346', + ['extradata'] = { + ['earningsin2017'] = 12481, + ['earningsin2018'] = 13500, + ['earningsin2019'] = 9408, + ['earningsin2020'] = 3200, + ['earningsin2021'] = 579, + ['earningsin2022'] = 178, + }, + ['id'] = 'pzd', + ['image'] = 'Pzd Malvinas Gaming 2022.png', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/b/bd/Pzd_Malvinas_Gaming_2022.png/188px-Pzd_Malvinas_Gaming_2022.png', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/8055975', + ['facebook'] = 'https://facebook.com/pzddr6', + ['siege-gg'] = 'https://siege.gg/players/95', + ['twitch'] = 'https://www.twitch.tv/pzddr6', + ['twitter'] = 'https://twitter.com/pzddr6', + ['youtube'] = 'https://www.youtube.com/pzdd', + }, + ['localizedname'] = '', + ['name'] = 'Pedro Dutra', + ['namespace'] = '0', + ['nationality'] = 'Brazil', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10659_player_pzd', + ['pageid'] = '10659', + ['pagename'] = 'Pzd', + ['region'] = 'South America', + ['romanizedname'] = 'Pedro Dutra', + ['status'] = 'Active', + ['team'] = '', + ['teampagename'] = '', + ['teamtemplate'] = '', + ['type'] = 'player', + }, + { + ['alternateid'] = 'wagao, waaaaaaaag', + ['birthdate'] = '1970-01-01', + ['deathdate'] = '1970-01-01', + ['earnings'] = '39316', + ['extradata'] = { + ['earningsin2017'] = 9618, + ['earningsin2018'] = 13500, + ['earningsin2019'] = 12598, + ['earningsin2020'] = 3600, + ['signatureOperator1'] = 'Smoke', + ['signatureOperator2'] = 'Ace', + }, + ['id'] = 'wag', + ['image'] = 'wag DH Valencia 2018.jpg', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/c/cf/Wag_DH_Valencia_2018.jpg/400px-Wag_DH_Valencia_2018.jpg', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/8039261', + ['facebook'] = 'https://facebook.com/wagaofps', + ['twitter'] = 'https://twitter.com/wagaofps', + ['youtube'] = 'https://www.youtube.com/wagaofps', + }, + ['localizedname'] = '', + ['name'] = 'Wagner Alfaro', + ['namespace'] = '0', + ['nationality'] = 'Brazil', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10661_player_wag', + ['pageid'] = '10661', + ['pagename'] = 'Wag', + ['region'] = 'South America', + ['romanizedname'] = 'Wagner Alfaro', + ['status'] = 'Active', + ['team'] = '', + ['teampagename'] = '', + ['teamtemplate'] = '', + ['type'] = 'player', + }, + { + ['alternateid'] = '', + ['birthdate'] = '1970-01-01', + ['deathdate'] = '1970-01-01', + ['earnings'] = '5645', + ['extradata'] = { + ['earningsin2017'] = 5645, + ['role'] = 'Flex', + ['role2'] = 'Analyst', + }, + ['id'] = 'Thyy', + ['image'] = '', + ['imageurl'] = '', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/9819674', + }, + ['localizedname'] = '', + ['name'] = 'Thiago Nicézio', + ['namespace'] = '0', + ['nationality'] = 'Brazil', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10663_player_Thyy', + ['pageid'] = '10663', + ['pagename'] = 'Thyy', + ['region'] = 'South America', + ['romanizedname'] = 'Thiago Nicézio', + ['status'] = 'Inactive', + ['team'] = '', + ['teampagename'] = '', + ['teamtemplate'] = '', + ['type'] = 'player', + }, + { + ['alternateid'] = '', + ['birthdate'] = '1970-01-01', + ['deathdate'] = '1970-01-01', + ['earnings'] = '9796', + ['extradata'] = { + ['earningsin2017'] = 3446, + ['earningsin2018'] = 3950, + ['earningsin2019'] = 2400, + ['role'] = 'In-game leader', + }, + ['id'] = 'SpawNsss', + ['image'] = 'SpawNsss at Six Invitational 2018.jpg', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/6/60/SpawNsss_at_Six_Invitational_2018.jpg/400px-SpawNsss_at_Six_Invitational_2018.jpg', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/8377849', + ['facebook'] = 'https://facebook.com/1SpawNsss', + ['instagram'] = 'https://www.instagram.com/spwnsss', + ['twitter'] = 'https://twitter.com/davidbcouto', + ['youtube'] = 'https://www.youtube.com/spawnfps', + }, + ['localizedname'] = '', + ['name'] = 'David Couto', + ['namespace'] = '0', + ['nationality'] = 'Brazil', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10665_player_SpawNsss', + ['pageid'] = '10665', + ['pagename'] = 'SpawNsss', + ['region'] = 'South America', + ['romanizedname'] = 'David Couto', + ['status'] = 'Inactive', + ['team'] = '', + ['teampagename'] = '', + ['teamtemplate'] = '', + ['type'] = 'player', + }, + { + ['alternateid'] = '', + ['birthdate'] = '1997-11-22', + ['deathdate'] = '1970-01-01', + ['earnings'] = '261091', + ['extradata'] = { + ['earningsin2016'] = 4750, + ['earningsin2017'] = 4641, + ['earningsin2018'] = 13936, + ['earningsin2019'] = 4400, + ['earningsin2020'] = 71138, + ['earningsin2021'] = 67962, + ['earningsin2022'] = 94264, + ['signatureOperator1'] = 'nomad', + ['signatureOperator2'] = 'maverick', + ['signatureOperator3'] = 'clash', + ['signatureOperator4'] = 'Jäger', + }, + ['id'] = 'RaFaLe', + ['image'] = 'RaFaLe.jpg', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/4/4b/RaFaLe.jpg/314px-RaFaLe.jpg', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/7127557', + ['siege-gg'] = 'https://siege.gg/players/18', + ['twitter'] = 'https://twitter.com/RaFaLe_R6', + ['youtube'] = 'https://www.youtube.com/SEBADRI92', + }, + ['localizedname'] = '', + ['name'] = 'Adrien Rutik', + ['namespace'] = '0', + ['nationality'] = 'France', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10667_player_RaFaLe', + ['pageid'] = '10667', + ['pagename'] = 'RaFaLe', + ['region'] = 'Europe', + ['romanizedname'] = 'Adrien Rutik', + ['status'] = 'Active', + ['team'] = 'Team BDS', + ['teampagename'] = 'Team_BDS', + ['teamtemplate'] = 'team bds 2021', + ['type'] = 'player', + }, + { + ['alternateid'] = '', + ['birthdate'] = '1970-01-01', + ['deathdate'] = '1970-01-01', + ['earnings'] = '23573', + ['extradata'] = { + ['earningsin2016'] = 4750, + ['earningsin2017'] = 4641, + ['earningsin2018'] = 13956, + ['earningsin2019'] = 226, + ['signatureOperator1'] = 'glaz', + }, + ['id'] = 'ZephiR', + ['image'] = 'zephir dhv19.jpg', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/2/21/Zephir_dhv19.jpg/400px-Zephir_dhv19.jpg', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/7318557', + ['instagram'] = 'https://www.instagram.com/zephir6s', + ['twitch'] = 'https://www.twitch.tv/ZephiR6S', + ['twitter'] = 'https://twitter.com/ZephiR6S', + }, + ['localizedname'] = '', + ['name'] = 'Florian Perrot', + ['namespace'] = '0', + ['nationality'] = 'France', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10669_player_ZephiR', + ['pageid'] = '10669', + ['pagename'] = 'ZephiR', + ['region'] = 'Europe', + ['romanizedname'] = 'Florian Perrot', + ['status'] = 'Active', + ['team'] = '', + ['teampagename'] = '', + ['teamtemplate'] = '', + ['type'] = 'player', + }, + { + ['alternateid'] = '', + ['birthdate'] = '1995-04-01', + ['deathdate'] = '1970-01-01', + ['earnings'] = '31509', + ['extradata'] = { + ['earningsin2016'] = 3000, + ['earningsin2017'] = 4641, + ['earningsin2018'] = 13936, + ['earningsin2019'] = 7545, + ['earningsin2021'] = 2388, + }, + ['id'] = 'Spark', + ['image'] = 'Spark 2.jpg', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/0/05/Spark_2.jpg/321px-Spark_2.jpg', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/6871996', + ['instagram'] = 'https://www.instagram.com/sparkr6s', + ['twitch'] = 'https://www.twitch.tv/sparkr6s', + ['twitter'] = 'https://twitter.com/SparkR6S', + }, + ['localizedname'] = '', + ['name'] = 'Martin Eberhard', + ['namespace'] = '0', + ['nationality'] = 'France', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10671_player_Spark', + ['pageid'] = '10671', + ['pagename'] = 'Spark', + ['region'] = 'Europe', + ['romanizedname'] = 'Martin Eberhard', + ['status'] = 'Active', + ['team'] = '', + ['teampagename'] = '', + ['teamtemplate'] = '', + ['type'] = 'player', + }, + { + ['alternateid'] = '', + ['birthdate'] = '1994-02-19', + ['deathdate'] = '1970-01-01', + ['earnings'] = '19179', + ['extradata'] = { + ['earningsin2017'] = 2416, + ['earningsin2018'] = 6522, + ['earningsin2019'] = 676, + ['earningsin2020'] = 8626, + ['earningsin2021'] = 939, + ['signatureOperator1'] = 'Valkyrie', + ['signatureOperator2'] = 'Iq', + ['signatureOperator3'] = 'Smoke', + }, + ['id'] = 'Voy', + ['image'] = 'Voy at Six Invitational 2018.jpg', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/3/3d/Voy_at_Six_Invitational_2018.jpg/400px-Voy_at_Six_Invitational_2018.jpg', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/7237814', + ['faceit'] = 'https://www.faceit.com/en/players/Voy_', + ['twitch'] = 'https://www.twitch.tv/VoyR6S', + ['twitter'] = 'https://twitter.com/ValentinCh_', + }, + ['localizedname'] = '', + ['name'] = 'Valentin Cheron', + ['namespace'] = '0', + ['nationality'] = 'France', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10695_player_Voy', + ['pageid'] = '10695', + ['pagename'] = 'Voy', + ['region'] = 'Europe', + ['romanizedname'] = 'Valentin Cheron', + ['status'] = 'Active', + ['team'] = '', + ['teampagename'] = '', + ['teamtemplate'] = '', + ['type'] = 'player', + }, + { + ['alternateid'] = '', + ['birthdate'] = '1970-01-01', + ['deathdate'] = '1970-01-01', + ['earnings'] = '9661', + ['extradata'] = { + ['earningsin2017'] = 2111, + ['earningsin2018'] = 3950, + ['earningsin2019'] = 3600, + }, + ['id'] = 'gCR', + ['image'] = 'gCR at Six Invitational 2018.jpg', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/2/2d/GCR_at_Six_Invitational_2018.jpg/400px-GCR_at_Six_Invitational_2018.jpg', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/10536788', + ['facebook'] = 'https://facebook.com/gcrfps', + ['twitch'] = 'https://www.twitch.tv/gcr_r6', + ['twitter'] = 'https://twitter.com/gcrr6', + ['youtube'] = 'https://www.youtube.com/UCvis520OF_te9Bkree_O6hg', + }, + ['localizedname'] = '', + ['name'] = 'Gabriel Teixeira', + ['namespace'] = '0', + ['nationality'] = 'Brazil', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10700_player_gCR', + ['pageid'] = '10700', + ['pagename'] = 'GCR', + ['region'] = 'South America', + ['romanizedname'] = 'Gabriel Teixeira', + ['status'] = 'Retired', + ['team'] = '', + ['teampagename'] = '', + ['teamtemplate'] = '', + ['type'] = 'player', + }, + { + ['alternateid'] = 'Faker, fk', + ['birthdate'] = '1998-11-28', + ['deathdate'] = '1970-01-01', + ['earnings'] = '8861', + ['extradata'] = { + ['earningsin2017'] = 2361, + ['earningsin2018'] = 3950, + ['earningsin2019'] = 2550, + }, + ['id'] = 'fk1', + ['image'] = 'Fk1 Brasileirao 2017 Season 2.jpg', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/3/34/Fk1_Brasileirao_2017_Season_2.jpg/400px-Fk1_Brasileirao_2017_Season_2.jpg', + ['links'] = { + ['facebook'] = 'https://facebook.com/fkrainbow6', + ['instagram'] = 'https://www.instagram.com/fk1_r6', + ['twitch'] = 'https://www.twitch.tv/fk1_r6', + ['twitter'] = 'https://twitter.com/fk1_r6', + }, + ['localizedname'] = '', + ['name'] = 'Gabriel Bailer', + ['namespace'] = '0', + ['nationality'] = 'Brazil', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10705_player_fk1', + ['pageid'] = '10705', + ['pagename'] = 'Fk1', + ['region'] = 'South America', + ['romanizedname'] = 'Gabriel Bailer', + ['status'] = 'Inactive', + ['team'] = '', + ['teampagename'] = '', + ['teamtemplate'] = '', + ['type'] = 'player', + }, + { + ['alternateid'] = 'geoolicious, geoo, sleepygeo, senpapigeo, geoometrics, geonidas', + ['birthdate'] = '1995-08-10', + ['deathdate'] = '1970-01-01', + ['earnings'] = '396760', + ['extradata'] = { + ['earningsin2017'] = 2500, + ['earningsin2018'] = 8810, + ['earningsin2019'] = 34800, + ['earningsin2020'] = 80450, + ['earningsin2021'] = 53400, + ['earningsin2022'] = 216800, + ['role'] = 'Support', + ['signatureOperator1'] = 'castle', + }, + ['id'] = 'Geometrics', + ['image'] = 'Geoo DH Montreal 2018.jpg', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/1/11/Geoo_DH_Montreal_2018.jpg/400px-Geoo_DH_Montreal_2018.jpg', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/9919890', + ['faceit'] = 'https://www.faceit.com/en/players/geoolicious', + ['instagram'] = 'https://www.instagram.com/tsm_geometrics', + ['siege-gg'] = 'https://siege.gg/players/54', + ['steam'] = 'https://steamcommunity.com/id/SENPAPIGEO', + ['twitch'] = 'https://www.twitch.tv/geoolicious', + ['twitter'] = 'https://twitter.com/TSM_Geometrics', + }, + ['localizedname'] = '', + ['name'] = 'Emilio Leynez', + ['namespace'] = '0', + ['nationality'] = 'Mexico', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10780_player_Geometrics', + ['pageid'] = '10780', + ['pagename'] = 'Geometrics', + ['region'] = 'North America', + ['romanizedname'] = 'Emilio Leynez', + ['status'] = 'Active', + ['team'] = 'Soniqs', + ['teampagename'] = 'Soniqs', + ['teamtemplate'] = 'soniqs 2021', + ['type'] = 'player', + }, + { + ['alternateid'] = 'ShuttleAK, ShuttleMK, Shutt', + ['birthdate'] = '1999-06-11', + ['deathdate'] = '1970-01-01', + ['earnings'] = '74140', + ['extradata'] = { + ['earningsin2017'] = 6900, + ['earningsin2018'] = 14240, + ['earningsin2019'] = 19500, + ['earningsin2020'] = 1400, + ['earningsin2021'] = 9100, + ['earningsin2022'] = 23000, + }, + ['id'] = 'Shuttle', + ['image'] = 'Shuttle Astralis.png', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/2/2d/Shuttle_Astralis.png/353px-Shuttle_Astralis.png', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/11332895', + ['faceit'] = 'https://www.faceit.com/en/players/shuttle-', + ['siege-gg'] = 'https://siege.gg/players/55', + ['twitch'] = 'https://www.twitch.tv/shuttle', + ['twitter'] = 'https://twitter.com/AaronJBD', + }, + ['localizedname'] = '', + ['name'] = 'Aaron Dugger', + ['namespace'] = '0', + ['nationality'] = 'United States', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10782_player_Shuttle', + ['pageid'] = '10782', + ['pagename'] = 'Shuttle', + ['region'] = 'North America', + ['romanizedname'] = 'Aaron Dugger', + ['status'] = 'Active', + ['team'] = 'Astralis', + ['teampagename'] = 'Astralis', + ['teamtemplate'] = 'astralis', + ['type'] = 'player', + }, + { + ['alternateid'] = 'Whiteshark, Wshark', + ['birthdate'] = '1994-08-30', + ['deathdate'] = '1970-01-01', + ['earnings'] = '7095', + ['extradata'] = { + ['earningsin2017'] = 116, + ['earningsin2019'] = 3535, + ['earningsin2020'] = 3206, + ['earningsin2021'] = 238, + ['signatureOperator1'] = 'hibana', + }, + ['id'] = 'Whiteshark67', + ['image'] = 'Whiteskark sixcup2017.jpg', + ['imageurl'] = 'https://liquipedia.net/commons/images/thumb/6/64/Whiteskark_sixcup2017.jpg/311px-Whiteskark_sixcup2017.jpg', + ['links'] = { + ['esl'] = 'https://play.eslgaming.com/player/10797046', + ['facebook'] = 'https://facebook.com/Whiteshark67', + ['twitch'] = 'https://www.twitch.tv/whiteshark67', + ['twitter'] = 'https://twitter.com/Wshark67', + ['youtube'] = 'https://www.youtube.com/LastImpulse1', + }, + ['localizedname'] = '', + ['name'] = 'Kévin Henriques', + ['namespace'] = '0', + ['nationality'] = 'France', + ['nationality2'] = '', + ['nationality3'] = '', + ['objectname'] = '10788_player_Whiteshark67', + ['pageid'] = '10788', + ['pagename'] = 'Whiteshark67', + ['region'] = 'Europe', + ['romanizedname'] = 'Kévin Henriques', + ['status'] = 'Active', + ['team'] = '', + ['teampagename'] = '', + ['teamtemplate'] = '', + ['type'] = 'player', + }, +}