<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://attuproject.org/wiki?action=history&amp;feed=atom&amp;title=Module%3ARandomLine</id>
	<title>Module:RandomLine - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://attuproject.org/wiki?action=history&amp;feed=atom&amp;title=Module%3ARandomLine"/>
	<link rel="alternate" type="text/html" href="https://attuproject.org/wiki?title=Module:RandomLine&amp;action=history"/>
	<updated>2026-10-03T18:41:17Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.5</generator>
	<entry>
		<id>https://attuproject.org/wiki?title=Module:RandomLine&amp;diff=28816&amp;oldid=prev</id>
		<title>DoomBot: load_modules: sync</title>
		<link rel="alternate" type="text/html" href="https://attuproject.org/wiki?title=Module:RandomLine&amp;diff=28816&amp;oldid=prev"/>
		<updated>2026-05-31T20:42:47Z</updated>

		<summary type="html">&lt;p&gt;load_modules: sync&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Module:RandomLine&lt;br /&gt;
-- Returns one line from a page, rotating every 12 hours.&lt;br /&gt;
-- Usage: {{#invoke:RandomLine|line|Page name}}&lt;br /&gt;
&lt;br /&gt;
local M = {}&lt;br /&gt;
&lt;br /&gt;
-- 12-hour window index (changes at 00:00 and 12:00 UTC).&lt;br /&gt;
local function window()&lt;br /&gt;
    return math.floor(os.time() / 43200)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function M.line(frame)&lt;br /&gt;
    local page_name = mw.text.trim(frame.args[1] or &amp;quot;&amp;quot;)&lt;br /&gt;
    if page_name == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;RandomLine: page name required&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local title = mw.title.new(page_name)&lt;br /&gt;
    if not title then&lt;br /&gt;
        return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;RandomLine: invalid page name&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local content = title:getContent()&lt;br /&gt;
    if not content or content == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;RandomLine: page not found or empty&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local lines = {}&lt;br /&gt;
    for line in content:gmatch(&amp;quot;[^\n]+&amp;quot;) do&lt;br /&gt;
        local trimmed = mw.text.trim(line)&lt;br /&gt;
        if trimmed ~= &amp;quot;&amp;quot; and not trimmed:match(&amp;quot;^==&amp;quot;) then&lt;br /&gt;
            table.insert(lines, trimmed)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #lines == 0 then&lt;br /&gt;
        return &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;RandomLine: no non-empty lines found&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    math.randomseed(window())&lt;br /&gt;
    math.random()  -- discard first value; Lua LCG has weak low bits on seed&lt;br /&gt;
    return lines[math.random(#lines)]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return M&lt;/div&gt;</summary>
		<author><name>DoomBot</name></author>
	</entry>
</feed>