モジュール:Scheduled

2020年5月5日 (火) 17:40時点におけるTriple-Zeta (トーク | 投稿記録)による版 (1版 をインポートしました)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

local DEFAULT_TZ_OFFSET = 9 --JST

local function split(text) local lines = {} for line in text:gmatch("[^\t\r\n\f ][^\n]*") do lines[#lines+1] = line end return lines end

local 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 data = frame.args.data if not data then error('引数 "data" は必須です。') end

local dataList = split(data)

local option = frame.args


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

return p