Модуль:RatingFIDE
GetRating
Возвращает актуальный рейтинг. Данные берутся с викисклада, если отсутствуют там — то с Викиданных, из свойства P1087. Используется в шаблоне {{Рейтинг ЭЛО}}.
GetMaxRating
Возвращает лучший рейтинг за карьеру. Данные берутся с Викиданных, из свойства P1087. Используется в шаблоне {{Максимальный рейтинг ЭЛО}}.
local p = {}
local mwlang = mw.getContentLanguage()
function p.GetRating(frame)
local args = frame:getParent().args
local PlayerIDstr = args['ID'] or frame.args['ID']
local NeedSource = args['Ссылка']=='да' or frame.args['Ссылка']=='да'
if PlayerIDstr == nil then return "Введите id шахматиста" end
local PlayerID = tonumber(PlayerIDstr)
local tabular = mw.ext.data.get("FIDE Standard rating.tab")
if tabular == nil then return "Нет таблицы с данными" end
local Rating = nil
for k,v in pairs(tabular.data) do
--do return v[1].." ".. v[2] .." ".. PlayerID end
if v[1] == PlayerID then
Rating = v[2]
break
end
end
if Rating == nil then
if args[1]==nil then
CallSite = mw.wikibase.getEntity()
else
CallSite = mw.wikibase.getEntity(string.match( args[1], "Q%d+"))
end
if (CallSite == nil) or (CallSite.claims.P1087 == nil) then
Rating = "Нет данных"
else
local latest, latestTime
latestTime = "+1900-01-01T00:00:00Z"
for k, v in ipairs(CallSite.claims.P1087) do
--do return v.qualifiers.P585[1].datavalue.value.time end
if v.qualifiers.P585[1].datavalue.value.time > latestTime then
latest = CallSite.claims.P1087[k].mainsnak.datavalue.value.amount
latestTime = v.qualifiers.P585[1].datavalue.value.time
end
end
Rating = string.sub(latest, 2) .. " <small>(" .. mwlang:formatDate("F Y", latestTime) .. ")</small>"
end
else
if NeedSource then Rating = Rating .. frame:callParserFunction{name = '#tag:ref', args = {'['.. tabular.sources ..']'}} end
end
return Rating
end
function p.GetMaxRating(frame)
local args = frame:getParent().args
if args[1] == nil then
CallSite = mw.wikibase.getEntity()
else
CallSite = mw.wikibase.getEntity(string.match( args[1], "Q%d+" ))
end
if (CallSite == nil) or (CallSite.claims.P1087 == nil) then
return ""
end
local max_rating = 0
local timestamp = nil
for key, value in ipairs(CallSite.claims.P1087) do
if (value.mainsnak ~= nil) and (value.qualifiers ~= nil) then
local current_rating = tonumber(value.mainsnak.datavalue.value.amount)
local current_timestamp = value.qualifiers.P585[1].datavalue.value.time
if (max_rating < current_rating) or ((max_rating == current_rating) and (timestamp > current_timestamp)) then
max_rating = current_rating
timestamp = current_timestamp
end
end
end
if timestamp == nil then
return ""
else
return max_rating .. " <small>(" .. mwlang:formatDate("F Y", timestamp) .. ")</small>"
end
end
return p