Difference between revisions of "Module:Rotations"
Jump to navigation
Jump to search
(Created page with "local p = {} function p.time(frame) return os.date("%A %d/%m/%Y %H:%M:%S") end return p") |
m |
||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
| − | function p. | + | local seconds_in_day = 24 * 60 * 60 |
| − | + | ||
| + | function p.simple_rotation(interval, rotation_count, offset) | ||
| + | local days_after_utc = math.floor(os.time() / seconds_in_day) | ||
| + | local days_into_period = (days_after_utc + offset) % (interval * rotation_count) | ||
| + | |||
| + | local rotation = math.floor(days_into_period / interval) + 1 | ||
| + | local days_until_next_rotation = interval - days_into_period % interval | ||
| + | |||
| + | return rotation, days_until_next_rotation | ||
| + | end | ||
| + | |||
| + | function p.on_off(on_time, total_time, offset, unit_seconds) | ||
| + | local units_after_utc = math.floor(os.time() / unit_seconds) | ||
| + | local units_into_start = (units_after_utc + offset) % total_time | ||
| + | |||
| + | local on = units_into_start < on_time | ||
| + | |||
| + | local units_until_change | ||
| + | if on then | ||
| + | units_until_change = on_time - units_into_start | ||
| + | else | ||
| + | units_until_change = total_time - units_into_start | ||
| + | end | ||
| + | |||
| + | return on, units_until_change | ||
| + | end | ||
| + | |||
| + | function p.plural(word, n, plural) | ||
| + | if n == 1 then | ||
| + | return word | ||
| + | else | ||
| + | return plural or (word .. 's') | ||
| + | end | ||
| + | end | ||
| + | |||
| + | function p.castaways(frame) | ||
| + | local args = frame:getParent().args | ||
| + | |||
| + | local bottle = args.bottle | ||
| + | if (bottle == nil) then | ||
| + | bottle = 1 | ||
| + | end | ||
| + | |||
| + | local offset = 7 | ||
| + | |||
| + | local starttext = "" | ||
| + | |||
| + | if (bottle == "3") then | ||
| + | offset = 6 | ||
| + | end | ||
| + | if (bottle == "5") then | ||
| + | offset = 5 | ||
| + | end | ||
| + | if (bottle == "6") then | ||
| + | offset = 3 | ||
| + | end | ||
| + | if (bottle == "7") then | ||
| + | offset = 8 | ||
| + | end | ||
| + | if (bottle == "9") then | ||
| + | offset = 9 | ||
| + | end | ||
| + | if (bottle == "10") then | ||
| + | offset = 5 | ||
| + | end | ||
| + | |||
| + | local on, change_time = p.on_off(1, bottle, offset, seconds_in_day) | ||
| + | |||
| + | local text | ||
| + | if on then | ||
| + | text = "<b>Available now</b>" | ||
| + | else | ||
| + | local last = bottle - change_time | ||
| + | |||
| + | local date_format = "%e %B" | ||
| + | local last_date = os.date(date_format, os.time() - last * seconds_in_day) | ||
| + | local next_date = os.date(date_format, os.time() + change_time * seconds_in_day) | ||
| + | |||
| + | text = "Available in " .. change_time .. " " .. p.plural('day', change_time) | ||
| + | end | ||
| + | |||
| + | return text | ||
end | end | ||
return p | return p | ||
Latest revision as of 16:36, 20 May 2020
Documentation for this module may be created at Module:Rotations/doc
local p = {}
local seconds_in_day = 24 * 60 * 60
function p.simple_rotation(interval, rotation_count, offset)
local days_after_utc = math.floor(os.time() / seconds_in_day)
local days_into_period = (days_after_utc + offset) % (interval * rotation_count)
local rotation = math.floor(days_into_period / interval) + 1
local days_until_next_rotation = interval - days_into_period % interval
return rotation, days_until_next_rotation
end
function p.on_off(on_time, total_time, offset, unit_seconds)
local units_after_utc = math.floor(os.time() / unit_seconds)
local units_into_start = (units_after_utc + offset) % total_time
local on = units_into_start < on_time
local units_until_change
if on then
units_until_change = on_time - units_into_start
else
units_until_change = total_time - units_into_start
end
return on, units_until_change
end
function p.plural(word, n, plural)
if n == 1 then
return word
else
return plural or (word .. 's')
end
end
function p.castaways(frame)
local args = frame:getParent().args
local bottle = args.bottle
if (bottle == nil) then
bottle = 1
end
local offset = 7
local starttext = ""
if (bottle == "3") then
offset = 6
end
if (bottle == "5") then
offset = 5
end
if (bottle == "6") then
offset = 3
end
if (bottle == "7") then
offset = 8
end
if (bottle == "9") then
offset = 9
end
if (bottle == "10") then
offset = 5
end
local on, change_time = p.on_off(1, bottle, offset, seconds_in_day)
local text
if on then
text = "<b>Available now</b>"
else
local last = bottle - change_time
local date_format = "%e %B"
local last_date = os.date(date_format, os.time() - last * seconds_in_day)
local next_date = os.date(date_format, os.time() + change_time * seconds_in_day)
text = "Available in " .. change_time .. " " .. p.plural('day', change_time)
end
return text
end
return p