Module:NewsQueryPlayer

From Call of Duty Esports Wiki
Jump to: navigation, search

Documentation for this module may be created at Module:NewsQueryPlayer/doc

local util_args = require('Module:ArgsUtil')
local util_cargo = require("Module:CargoUtil")
local util_esports = require("Module:EsportsUtil")
local util_html = require("Module:HtmlUtil")
local util_news = require("Module:NewsUtil")
local util_source = require("Module:SourceUtil")
local util_table = require("Module:TableUtil")
local util_text = require("Module:TextUtil")
local util_time = require("Module:TimeUtil")
local util_vars = require("Module:VarsUtil")
local i18n = require('Module:i18nUtil')

local m_team = require('Module:Team')

local NewsQueryAbstract = require('Module:NewsQueryAbstract')
local NewsQuery = NewsQueryAbstract:extends()

local THRESHOLD_TO_TAB = 10

NewsQuery.SUBJECT_SIZE = 45

local PRELOADS_TO_IGNORE = {
	
}

local lang = mw.getLanguage('en')

local h = {}

local p = {}

function p.main(frame)
	local args = util_args.merge()
	return p._main(args)
end

function p._main(args)
	return NewsQuery(args):run()
end

function NewsQuery:init(args)
	self:super('init', args)
	util_table.mergeArrays(self.PRELOADS_TO_IGNORE, PRELOADS_TO_IGNORE)
end

function NewsQuery:getQuery(args)
	local query = self:super('getQuery', args)
	local new = {
		tables = { 'NewsItems__Players=NP', 'PlayerRedirects=PR' },
		join = { 'News._ID=NP._rowID', 'NP._value = PR.AllName' },
		fields = { 'NP._value=ThisPlayer' },
		where = self:getWhere(args, query.where),
		orderBy = 'News.Date_Sort ASC, N_LineInDate ASC, News.Date_Display, News.IsApproxDate',
	}
	return util_cargo.concatQueriesAnd(query, new)
end

function NewsQuery:getWhere(args, where)
	local tbl = {
		where,
		('PR._pageName="%s"'):format(h.getPlayer(args.player)),
		util_news.getExcludedNewsPreloadsWhereCondition(self.PRELOADS_TO_IGNORE),
	}
	return util_cargo.concatWhere(tbl)
end

function h.getPlayer(player)
	return player or mw.title.getCurrentTitle().baseText
end

function NewsQuery:groupDataByDate(data)
	local byDate = self:super('groupDataByDate', data)
	local byYear = {}
	for _, date in ipairs(byDate) do
		util_table.initDict(byYear, byDate[date].year)
		util_table.pushDict(byYear[byDate[date].year], date, byDate[date])
	end
	return byYear
end

function NewsQuery:getDateKey(row)
	return (row.Date_Display or row.Date) .. tostring(row.IsApproxDate) .. row.Subject
end

-- print
function NewsQuery:makeOutput(byDate, args)
	local tabs = {}
	for _, year in ipairs(byDate) do
		tabs[#tabs+1] = {
			name = year,
			content = h.getYearContent(byDate[year])
		}
	end
	return util_news.sectionsOrTabs(byDate, THRESHOLD_TO_TAB, tabs)
end

function h.getYearContent(byDate)
	local tbl = mw.html.create('table')
		:addClass('news-table')
		:addClass('news-player-table')
		:addClass('hoverable-rows')
	for _, date in ipairs(byDate) do
		h.printDateAndContent(tbl, byDate[date])
	end
	return tostring(tbl)
end

function h.printDateAndContent(tbl, lines)
	local tr = tbl:tag('tr')
	tr:tag('td')
		:wikitext(lines.region)
	tr:tag('td')
		:wikitext(lines.subject)
		:addClass('news-player-subject')
	local td = tr:tag('td')
		:addClass('news-player-content')
	for i, line in ipairs(lines) do
		h.printLine(td, i, line)
		if i < #lines then
			td:wikitext(' ')
		end
	end
	util_news.printEditButton(td, lines.page)
end

function h.printLine(td, i, line)
	td:wikitext(util_esports.boldLinksToThisPlayer(
		h.getSentenceVersion(line, i),
		line.ThisPlayer
	))
	if DEBUG then td:wikitext(line.Preload) end
	h.printRef(td, line)
end

function h.getSentenceVersion(line, i)
	if i == 1 then return line.SentenceWithDate end
	return line.Sentence
end

function h.printRef(td, line)
	if not line.Source then return end
	td:wikitext(util_source.makeRef(line.Source))
end

return p