モジュール:サンドボックス/Frozen-mikan/Scheduled

モジュールの解説[作成]
local DEFAULT_TZ_OFFSET = 9 --JST
local externalData = mw.loadData('モジュール:サンドボックス/Frozen-mikan/Scheduled/data')

function parseTextList(text)
	local list = mw.text.split(mw.text.trim(text), '\n')
	return list
end

function CJD(timestamp, tzOffset)
	local jd = timestamp / 86400 + 2440587.5
	return jd + 0.5 + tzOffset / 24
end

local rotation = {}

--[[
rotation.dailyIndex() - periodで指定した周期のインデックスを日替わりで返す
(optionのパラメータは下記 Scheduled.daily() を参照)
]]
rotation.dailyIndex = function(period, option)
	local adjuster = tonumber(option.adjuster or 0)
	local tzOffset = tonumber(option.tzOffset or DEFAULT_TZ_OFFSET)
	local step = tonumber(option.step or 1)
	local span = tonumber(option.span or 1)
	local spanAdjuster = tonumber(option.spanAdjuster or 0)
	local timestamp = tonumber(option.timestamp or os.time())

	local dateValue = CJD(timestamp, tzOffset) + spanAdjuster

	return (math.floor(dateValue / span) * step + adjuster) % period + 1
end

-----------
--interface
local p = {}

--[[
Scheduled.daily() - リストから日替わりで候補を取得する

必須パラメータ:
	data: 改行区切りの候補リスト
オプション:
	adjuster: 任意の候補を表示させるための調整値。初期値: 0
	tzOffset: 日付が切り替わるタイムゾーンのオフセット値。初期値: 9 (JST)
	step: 1回の更新で候補リストをいくつ進めるか。step=2とすると1,3,5番目...の順。初期値: 1
	span: 何日単位で結果を更新するか。初期値: 1
	spanAdjuster: spanに2以上を指定する場合、任意のタイミングで更新させるための調整値。初期値: 0
	timestamp: UNIX時刻。特定の日時での実行結果を見たいときに指定。初期値: 現在時刻
]]

p.daily = function(frame)
	local name = frame.args.name
	local dataList
	local length = 0
	if not name then
		local data = frame.args.data
		if not data then
			error('引数 "name" または "data" は必須です。')
		else
			dataList = parseTextList(data)
			length = #dataList
		end
	else
		dataList = externalData[name]
		length = externalData[name .. "Length"]
	end

	local option = frame.args


	local index = rotation.dailyIndex(length, option)
	return dataList[index]
end

return p