Module:ExternalContentQueryAbstract

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

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

local util_args = require('Module:ArgsUtil')
local util_cargo = require('Module:CargoUtil')
local util_esports = require('Module:EsportsUtil')
local util_game = require('Module:GameUtil')
local util_html = require('Module:HtmlUtil')
local util_map = require('Module:MapUtil')
local util_news = require("Module:NewsUtil")
local util_table = require('Module:TableUtil')
local util_text = require('Module:TextUtil')
local util_time = require('Module:TimeUtil')
local util_title = require('Module:TitleUtil')
local util_vars = require('Module:VarsUtil')
local i18n = require('Module:i18nUtil')

local LCS = require('Module:LuaClassSystem')

local TabsDynamic = require('Module:TabsDynamic').constructor

local YEAR

local h = {}

local p = LCS.class.abstract()

function p:init()
	i18n.init('ExternalContentQuery')
end

function p:run(args)
	h.setYear(args.year)
	local data = self:makeAndRunQuery(args)
	util_map.rowsInPlace(data, h.castDataRow)
	local dataByTab = self:groupDataByTab(data, args)
	return h.makeOutput(dataByTab, args)
end

function h.setYear(year)
	if year then
		YEAR = tonumber(year)
		return
	end
	local title = mw.title.getCurrentTitle().text
	for _, y in ipairs(util_game.years) do
		if title:find(y) then
			YEAR = tonumber(y)
			return
		end
	end
end

function p:makeAndRunQuery(args)
	return util_cargo.queryAndCast(self:getQuery(args))
end

function p:getQuery(args)
	local ret = {
		tables = {
			'ExternalContent=EC',
			'ExternalContent__Players=ECP',
			'PlayerRedirects=PR',
			'ExternalContent__Teams=ECT',
			'TeamRedirects=TRed',
			'Teams=Tms',
		},
		join = {
			'EC._ID=ECP._rowID',
			'ECP._value=PR.AllName',
			'EC._ID=ECT._rowID',
			'ECT._value=TRed.AllName',
			'TRed._pageName=Tms._pageName',
		},
		fields = {
			'EC.Title=Title',
			'EC.URL=URL',
			'EC.Date=Date',
			'EC.ContentType=ContentType',
			'EC.Publication=Publication',
			'EC.Authors=Authors',
			'EC.MediaType=MediaType',
			'EC._pageName=_pageName',
			'EC.Series=Series',
			'EC.SeriesSeason=Season',
			'EC.SeriesSeasonNumber=SeasonN',
		},
		where = h.getWhere(args),
		orderBy = 'EC.Date ASC',
		groupBy = 'EC.Date, COALESCE(EC.N_ItemInDate, 1), EC._pageName',
		limit = 9999,
		types = {
			SeasonN = 'number',
		},
	}
	return ret
end

function h.getWhere(args)
	local tbl = {
		util_cargo.whereFromArg('EC.Publication="%s"', args.publication),
		h.getTournamentWhere(args),
		util_cargo.whereFromArg('PR.OverviewPage = "%s"', util_title.target(args.player)),
		args.player and 'EC.Players__full IS NOT NULL',
		util_cargo.whereFromArg('TRed._pageName="%s"', args.team),
		util_cargo.whereFromArg('Tms.OrganizationPage="%s"', args.organization),
	}
	return util_cargo.concatWhere(tbl)
end

function h.getTournamentWhere(args)
	if args.type == 'tournament' or args.tournament then
		return util_cargo.whereFromArg('EC.Tournaments HOLDS "%s"', util_esports.getOverviewPage(args.tournament))
	end
	return nil
end

function h.castDataRow(row)
	row.Date = util_time.strToDate(row.Date)
	row.Authors = util_text.split(row.Authors)
	if not row.Title then
		error(('No title for url %s on page %s'):format(row.URL, row._pageName))
	end
	row.Link = util_text.extLink(row.URL, mw.text.nowiki(row.Title))
end

function p:groupDataByTab(data, args)
	-- abstract
end

function h.makeOutput(dataByTab, args)
	h.concatTabData(dataByTab)
	util_table.removeFalseEntries(dataByTab, #dataByTab)
	return TabsDynamic(dataByTab, h.getThis(args, dataByTab), args.right)
end

function h.concatTabData(dataByTab)
	for k, tab in ipairs(dataByTab) do
		tab.content = h.makeTabOutput(tab)
		if not tab.content then
			dataByTab[k] = false
		end
	end
end

function h.makeTabOutput(tab)
	if not tab[1] then return end
	local ul = mw.html.create('ul')
		:addClass('external-content')
	local includeYear = h.doWeIncludeYear(tab)
	for _, row in ipairs(tab) do
		local li = ul:tag('li')
		h.printRow(li, row, includeYear)
	end
	return tostring(ul)
end

function h.doWeIncludeYear(tab)
	if tostring(tab.name):match('%d%d%d%d') then return false end
	return not (h.isThisYear(tab[1].Date.year) and h.isThisYear(tab[#tab].Date.year))
end

function h.isThisYear(y)
	return tonumber(y) == YEAR
end

function h.printRow(li, row, includeYear)
	li:wikitext(h.makeSentence(row, includeYear))
	if row.MediaType == 'Video' then
		li:addClass('content-video')
	end
	li:addClass('content-' .. row.ContentType:lower())
	util_news.printEditButton(li, row._pageName)
end

function h.makeSentence(row, includeYear)
	if not row.Link then
		util_vars.log(row)
	end
	return ("%s, %s ''%s''"):format(
		h.makeDate(row, includeYear),
		row.Link,
		h.makeAuthorAndPublication(row)
	)
end

function h.makeDate(row, includeYear)
	if includeYear then
		return util_time.strFromTable(row.Date, 'F j, Y')
	else
		return util_time.strFromTable(row.Date, 'F j')
	end
end

function h.makeAuthorAndPublication(row)
	if not row.Authors then return h.makePublication(row) end
	local tbl = {
		row.ContentType == 'Interview' and 'with' or 'by',
		util_table.printList(row.Authors),
		h.makePublication(row),
	}
	return util_table.concat(tbl, ' ')
end

function h.makePublication(row)
	if not row.Publication then return '' end
	return ('on %s'):format(row.Publication)
end

function h.getThis(args, dataByTab)
	if args.This then
		return tonumber(args.This)
	elseif util_args.castAsBool(args.last) then
		return #dataByTab
	end
	return 1
end

return p