Module:Song datatable

From Sekaipedia


To generate {{Song datatable}}, invoke using the main function.


local getArgs          = require('Module:Arguments').getArgs
local DatatableBuilder = require('Module:DatatableBuilder')
local QueryBuilder     = require('Module:QueryBuilder')
local Yesno            = require('Module:Yesno')

local DisplayFns    = require('Module:DisplayFunctions')
local ProcessingFns = require('Module:ProcessingFunctions')

local p = {}


local function formatName(pageName, songName)
	return string.format('[[%s|%s]]', pageName, songName)
end

local function formatBoolean(value)
	return DisplayFns.yesAndNo(Yesno(value))
end

local function formatStringToList(delim)
	return function(str)
		local arr = ProcessingFns.stringToArray(delim)(str)
		return DisplayFns.list('unbulleted')(arr)
	end
end


function p.main(frame)
	local args = getArgs(frame)
	
	local columns = args['columns']
	
	local qb = QueryBuilder.new()
	qb:setTables('songs')
		:setFields([[
			_pageName,
			song_id,
			jacket,
			song_name,
			producers,
			units,
			bpm,
			game_duration,
			release_date,
			song_type,
			3d_mv,
			2d_mv,
			original_mv,
			easy_difficulty,
			normal_difficulty,
			hard_difficulty,
			expert_difficulty,
			master_difficulty,
			easy_notes,
			normal_notes,
			hard_notes,
			expert_notes,
			master_notes
		]])
		:addWhere('songs.song_id', '>', '0')
		:setGroupBy('songs.song_id')
		:setOrderBy('songs.song_id ASC')
		:setLimit(args['limit'] or 500)
		:setOffset(args['offset'] or 0)
	qb
		:addWhereList(
			'songs.units',
			'HOLDS',
			args['units'],
			';',
			'OR'
		)
		:addWhere('songs.3d_mv', '=', args['3d mv'])
		:addWhere('songs.2d_mv', '=', args['2d mv'])
		:addWhere('songs.original_mv', '=', args['original mv'])
		:addWhere('songs.song_type', '=', args['type'])
		:addWhere('songs.game_duration', '>=', args['min length'])
		:addWhere('songs.game_duration', '<=', args['max length'])
		:addWhere('songs.release_date', '>=', args['released after'])
		:addWhere('songs.release_date', '<=', args['released before'])
		:addWhereList(
			'songs.easy_difficulty',
			'=',
			args['easy difficulties'],
			',',
			'OR'
		)
		:addWhereList(
			'songs.normal_difficulty',
			'=',
			args['normal difficulties'],
			',',
			'OR'
		)
		:addWhereList(
			'songs.hard_difficulty',
			'=',
			args['hard difficulties'],
			',',
			'OR'
		)
		:addWhereList(
			'songs.expert_difficulty',
			'=',
			args['expert difficulties'],
			',',
			'OR'
		)
		:addWhereList(
			'songs.master_difficulty',
			'=',
			args['master difficulties'],
			',',
			'OR'
		)
	
	local datatable = DatatableBuilder.new()
	
	datatable
		:setColumns{
			{ 
				name = 'id',
				header = 'ID',
				dataFields = { 'song_id' }
			},
			{
				name = 'jacket',
				header = 'Jacket art',
				dataFields = { 'jacket' },
				fn = DisplayFns.image('64px'),
				css = { ['width'] = '64px' },
				sortable = false
			},
			{
				name = 'name',
				header = 'Song name',
				dataFields = { '_pageName', 'song_name' },
				fn = formatName
			},
			{ 
				name = 'producers',
				header = 'Producer(s)',
				dataFields = { 'producers' },
				fn = formatStringToList(','),
				visible = false
			},
			{ 
				name = 'units',
				header = 'Unit(s)',
				dataFields = { 'units' },
				fn = formatStringToList(';'),
				visible = false
			},
			{ 
				name = 'bpm',
				header = 'BPM',
				dataFields = { 'bpm' },
				visible = false
			},
			{ 
				name = 'game duration',
				header = 'Duration (game-size)',
				dataFields = { 'game_duration' },
				fn = DisplayFns.minutesAndSeconds,
				visible = false
			},
			{ 
				name = 'release date',
				header = 'Release date',
				dataFields = { 'release_date' },
				visible = false
			},
			{ 
				name = 'type',
				header = 'Type',
				dataFields = { 'song_type' },
				visible = false
			},
			{ 
				name = '3d mv',
				header = '3D MV?', 
				dataFields = { '3d_mv' },
				fn = formatBoolean,
				visible = false
			},
			{ 
				name = '2d mv',
				header = '2D MV?',
				dataFields = { '2d_mv' },
				fn = formatBoolean,
				visible = false
			},
			{ 
				name = 'original mv',
				header = 'Original MV?',
				dataFields = { 'original_mv' },
				fn = formatBoolean,
				visible = false
			},
			{ 
				name = 'easy difficulty',
				header = 'Easy difficulty',
				dataFields = { 'easy_difficulty' },
				visible = false
			},
			{ 
				name = 'normal difficulty',
				header = 'Normal difficulty',
				dataFields = { 'normal_difficulty' },
				visible = false
			},
			{ 
				name = 'hard difficulty',
				header = 'Hard difficulty',
				dataFields = { 'hard_difficulty' },
				visible = false
			},
			{ 
				name = 'expert difficulty',
				header = 'Expert difficulty',
				dataFields = { 'expert_difficulty' },
				visible = false
			},
			{ 
				name = 'master difficulty',
				header = 'Master difficulty',
				dataFields = { 'master_difficulty' },
				visible = false
			},
					{ 
				name = 'easy notes',
				header = 'Easy notes',
				dataFields = { 'easy_notes' },
				visible = false
			},
			{ 
				name = 'normal notes',
				header = 'Normal notes',
				dataFields = { 'normal_notes' },
				visible = false
			},
			{ 
				name = 'hard notes',
				header = 'Hard notes',
				dataFields = { 'hard_notes' },
				visible = false
			},
			{ 
				name = 'expert notes',
				header = 'Expert notes',
				dataFields = { 'expert_notes' },
				visible = false
			},
			{ 
				name = 'master notes',
				header = 'Master notes',
				dataFields = { 'master_notes' },
				visible = false
			},
		}
		:setData(qb:query())
	
	columns = ProcessingFns.stringToArray(',')(columns)
	if columns and #columns > 0 then
		for _, column in ipairs(columns) do
			datatable:setColumnVisibility(column, true)
		end
	end
	
	return datatable:tostring()
end

return p
Cookies help us deliver our services. By using our services, you agree to our use of cookies.