Модуль: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