<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Modul%3APinging</id>
	<title>Modul:Pinging - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Modul%3APinging"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Modul:Pinging&amp;action=history"/>
	<updated>2026-05-25T09:00:18Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Modul:Pinging&amp;diff=2921723&amp;oldid=prev</id>
		<title>imported&gt;PerfektesChaos: 2022-11-14</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Modul:Pinging&amp;diff=2921723&amp;oldid=prev"/>
		<updated>2022-11-16T20:26:48Z</updated>

		<summary type="html">&lt;p&gt;2022-11-14&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local Pinging = { suite   = &amp;quot;Pinging&amp;quot;,&lt;br /&gt;
                  serial  = &amp;quot;2022-11-14&amp;quot;,&lt;br /&gt;
                  item    = 108829575,&lt;br /&gt;
                  maxEcho = 50,    -- currently permitted number of recipients&lt;br /&gt;
                  maxName = 99,    -- length of a user name&lt;br /&gt;
                  start   = &amp;quot;@&amp;quot;,&lt;br /&gt;
                  suffix  = &amp;quot;:&amp;quot; }&lt;br /&gt;
--[==[&lt;br /&gt;
Support templates for pings and user lists&lt;br /&gt;
]==]&lt;br /&gt;
local Failsafe = Pinging&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fair( analyse, add )&lt;br /&gt;
    -- Create link target or link title&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     analyse  -- string with page name or nick&lt;br /&gt;
    --     add      -- true, if user namespace to be added&lt;br /&gt;
    --                 false, if user namespace to be stripped&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string&lt;br /&gt;
    local ns = false&lt;br /&gt;
    local r  = analyse&lt;br /&gt;
    local space, spec = r:match( &amp;quot;^([^:]+):(.+)$&amp;quot; )&lt;br /&gt;
    if space then&lt;br /&gt;
        local tns = mw.site.namespaces[ space ]&lt;br /&gt;
        if type( tns ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            ns = tns.id&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if add then&lt;br /&gt;
        if not ns then&lt;br /&gt;
            r = string.format( &amp;quot;%s:%s&amp;quot;, mw.site.namespaces.User.name, r )&lt;br /&gt;
        end&lt;br /&gt;
    elseif ns then&lt;br /&gt;
        if ns == 2  or  ns == 3 then&lt;br /&gt;
            r = spec&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- fair()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fault( alert )&lt;br /&gt;
    -- Format error message by class=error&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     alert  -- string, error message&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string, HTML span&lt;br /&gt;
    local e = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                     :addClass( &amp;quot;error&amp;quot; )&lt;br /&gt;
                     :css( &amp;quot;white-space&amp;quot;, &amp;quot;nowrap&amp;quot; )&lt;br /&gt;
                     :wikitext( alert )&lt;br /&gt;
    return tostring( e )&lt;br /&gt;
end -- fault()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fetch( analyse, alt )&lt;br /&gt;
    -- Retrieve target table&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     analyse  -- string with page content&lt;br /&gt;
    --     alt      -- string with additional nick pattern, or not&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     sequence of targets, might be empty&lt;br /&gt;
    local i    = 1&lt;br /&gt;
    local loop = true&lt;br /&gt;
    local r    = { }&lt;br /&gt;
    local s    = analyse&lt;br /&gt;
    local j, k&lt;br /&gt;
    while ( loop ) do&lt;br /&gt;
        loop = false&lt;br /&gt;
        j    = s:find( &amp;quot;&amp;lt;!--&amp;quot;, i, true )&lt;br /&gt;
        if j then&lt;br /&gt;
            k = s:find( &amp;quot;--&amp;gt;&amp;quot;,  j + 4,  true )&lt;br /&gt;
            if k then&lt;br /&gt;
                loop = true&lt;br /&gt;
                s    = s:sub( 1,  j )  ..  s:sub( k + 3 )&lt;br /&gt;
                i    = j&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end -- while loop&lt;br /&gt;
    i    = 1&lt;br /&gt;
    loop = true&lt;br /&gt;
    while ( loop ) do&lt;br /&gt;
        loop = false&lt;br /&gt;
        j    = s:find( &amp;quot;{{#target:&amp;quot;, i, true )&lt;br /&gt;
        if j then&lt;br /&gt;
            j = j + 10&lt;br /&gt;
            k = s:find( &amp;quot;}}&amp;quot;, j, true )&lt;br /&gt;
            if k then&lt;br /&gt;
                loop = true&lt;br /&gt;
                table.insert( r,  s:sub( j,  k - 1 ) )&lt;br /&gt;
                i = k + 1&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end -- while loop&lt;br /&gt;
    if alt then&lt;br /&gt;
        local n, sn, sns, st, sub, tns&lt;br /&gt;
        i    = 1&lt;br /&gt;
        loop = true&lt;br /&gt;
        while ( loop ) do&lt;br /&gt;
            j, i = mw.ustring.find( s, alt, i )&lt;br /&gt;
            if j then&lt;br /&gt;
                loop   = true&lt;br /&gt;
                sub    = mw.ustring.sub( s, j, i )&lt;br /&gt;
                st, sn = mw.ustring.match( sub, alt )&lt;br /&gt;
                if st then&lt;br /&gt;
                    st = mw.text.trim( st )&lt;br /&gt;
                    if st == &amp;quot;&amp;quot; then&lt;br /&gt;
                        st = false&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                if st then&lt;br /&gt;
                    n = 2&lt;br /&gt;
                    if sn then&lt;br /&gt;
                        sn = mw.text.trim( sn )&lt;br /&gt;
                        if sn == &amp;quot;-&amp;quot; then&lt;br /&gt;
                            n = false&lt;br /&gt;
                        elseif sn ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                            sns = sn:match( &amp;quot;^(%d+)$&amp;quot; )&lt;br /&gt;
                            if sns then&lt;br /&gt;
                                n = tonumber( sns )&lt;br /&gt;
                            else&lt;br /&gt;
                                tns = mw.site.namespaces[ sns ]&lt;br /&gt;
                                if tns then&lt;br /&gt;
                                    n = tns.id&lt;br /&gt;
                                end&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                    if n then&lt;br /&gt;
                        st = string.format( &amp;quot;%s:%s&amp;quot;,&lt;br /&gt;
                                            mw.site.namespaces[ n ].name,&lt;br /&gt;
                                            st )&lt;br /&gt;
                    end&lt;br /&gt;
                    table.insert( r, st )&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                loop = false&lt;br /&gt;
            end&lt;br /&gt;
        end -- while loop&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- fetch()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function friend( assign, abroad, area, another, alter )&lt;br /&gt;
    -- Format single link&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     assign   -- user or page name&lt;br /&gt;
    --     abroad   -- page names came from #target&lt;br /&gt;
    --     area     -- true: always wide area = URL&lt;br /&gt;
    --     another  -- display alternative link title&lt;br /&gt;
    --     alter    -- link is hidden&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     1. string or false,&lt;br /&gt;
    --     2. true: string is internal&lt;br /&gt;
    --     3. true: error occurred&lt;br /&gt;
    local long = area&lt;br /&gt;
    local r    = assign&lt;br /&gt;
    local site = false&lt;br /&gt;
    local lapsus&lt;br /&gt;
    if abroad then&lt;br /&gt;
        local s&lt;br /&gt;
        s, site = assign:match( &amp;quot;^%s*(.+)%s*|%s*(.*)%s*$&amp;quot; )&lt;br /&gt;
        if s then&lt;br /&gt;
            site = mw.text.trim( site )&lt;br /&gt;
            if site == &amp;quot;&amp;quot; then&lt;br /&gt;
                site = false&lt;br /&gt;
            else&lt;br /&gt;
                long = true&lt;br /&gt;
            end&lt;br /&gt;
            r = s&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if r then&lt;br /&gt;
        r = mw.text.trim( r )&lt;br /&gt;
        if r == &amp;quot;&amp;quot; then&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if r then&lt;br /&gt;
        local live = not alter&lt;br /&gt;
        local show&lt;br /&gt;
        if r:find( &amp;quot;[#&amp;lt;&amp;gt;%[%]%{%}]&amp;quot; )    or&lt;br /&gt;
           ( not abroad   and&lt;br /&gt;
             ( r:find( &amp;quot;[/@]&amp;quot; )   or&lt;br /&gt;
               mw.ustring.len( r ) &amp;gt;  Pinging.maxName ) ) then&lt;br /&gt;
            lapsus = true&lt;br /&gt;
        end&lt;br /&gt;
        if not lapsus then&lt;br /&gt;
            if another then&lt;br /&gt;
                show = mw.text.trim( another )&lt;br /&gt;
                if show == &amp;quot;&amp;quot; then&lt;br /&gt;
                    show = false&lt;br /&gt;
                end&lt;br /&gt;
            elseif live then&lt;br /&gt;
                show = fair( r, false )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if not show then&lt;br /&gt;
            show = r&lt;br /&gt;
        end&lt;br /&gt;
        if abroad then&lt;br /&gt;
            if site then&lt;br /&gt;
                show = string.format( &amp;quot;%s@%s&amp;quot;, show, site )&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            r = fair( r, true )&lt;br /&gt;
        end&lt;br /&gt;
        if show:find( &amp;quot;%s&amp;quot; )  and  live then&lt;br /&gt;
            show = mw.text.trim( show )&lt;br /&gt;
            if show:find( &amp;quot;%s&amp;quot; ) then&lt;br /&gt;
                local e = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                                 :css( &amp;quot;white-space&amp;quot;, &amp;quot;nowrap&amp;quot; )&lt;br /&gt;
                                 :wikitext( show )&lt;br /&gt;
                show = tostring( e )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if lapsus then&lt;br /&gt;
            r    = fault( show )&lt;br /&gt;
            long = true&lt;br /&gt;
        elseif long then&lt;br /&gt;
            if site then&lt;br /&gt;
                r = string.format( &amp;quot;//%s/wiki/%s&amp;quot;,&lt;br /&gt;
                                   site,&lt;br /&gt;
                                   mw.uri.encode( r, &amp;quot;WIKI&amp;quot; ) )&lt;br /&gt;
            else&lt;br /&gt;
                r = tostring( mw.uri.canonicalUrl( r ) )&lt;br /&gt;
            end&lt;br /&gt;
            r = string.format( &amp;quot;[%s %s]&amp;quot;, r, show )&lt;br /&gt;
            if live then&lt;br /&gt;
                local e = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                                 :addClass( &amp;quot;plainlinks&amp;quot; )&lt;br /&gt;
                                 :wikitext( r )&lt;br /&gt;
                r = tostring( e )&lt;br /&gt;
            end&lt;br /&gt;
        elseif alter  or  r == show then&lt;br /&gt;
            r = string.format( &amp;quot;[[%s]]&amp;quot;, r )&lt;br /&gt;
        else&lt;br /&gt;
            r = string.format( &amp;quot;[[%s|%s]]&amp;quot;, r, show )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r,  not long,  lapsus&lt;br /&gt;
end -- friend()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function friends( assigned, abroad, area, assume, active, alter )&lt;br /&gt;
    -- Make list of entries&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     assigned  -- table with pages or users&lt;br /&gt;
    --     abroad    -- true: page names came from #target&lt;br /&gt;
    --     area      -- true: always wide area = URL&lt;br /&gt;
    --     assume    -- table with default options&lt;br /&gt;
    --     active    -- table with current options&lt;br /&gt;
    --     alter     -- string: hide result, show this&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string&lt;br /&gt;
    local limit  = ( not area  and&lt;br /&gt;
                     active.max ~= &amp;quot;0&amp;quot;  and  assume.max ~= &amp;quot;0&amp;quot; )&lt;br /&gt;
    local max    = Pinging.maxEcho&lt;br /&gt;
    local n      = 0&lt;br /&gt;
    local lapsus, light, lost, r, s, stick&lt;br /&gt;
    if alter then&lt;br /&gt;
        stick = &amp;quot; &amp;quot;&lt;br /&gt;
    elseif active[ &amp;quot;/&amp;quot; ] then&lt;br /&gt;
        stick = active[ &amp;quot;/&amp;quot; ]&lt;br /&gt;
    elseif assume[ &amp;quot;/&amp;quot; ] then&lt;br /&gt;
        stick = assume[ &amp;quot;/&amp;quot; ]&lt;br /&gt;
    else&lt;br /&gt;
        if Pinging.stick then&lt;br /&gt;
            stick = Pinging.stick&lt;br /&gt;
        else&lt;br /&gt;
            local ltr = not mw.language.getContentLanguage():isRTL()&lt;br /&gt;
            local e   = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                               :wikitext( &amp;quot;&amp;amp;#124;&amp;quot; )&lt;br /&gt;
            local s&lt;br /&gt;
            if ltr then&lt;br /&gt;
                s = &amp;quot;left&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                s = &amp;quot;right&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
            e:css( &amp;quot;margin-&amp;quot; .. s,  &amp;quot;0.5em&amp;quot; )&lt;br /&gt;
            stick = tostring( e ) .. &amp;quot; &amp;quot;&lt;br /&gt;
            Pinging.stick = stick&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if limit  and  ( active.max or assume.max ) then&lt;br /&gt;
        if tonumber( assume.max ) then&lt;br /&gt;
            max = tonumber( assume.max )&lt;br /&gt;
        end&lt;br /&gt;
        if tonumber( active.max ) then&lt;br /&gt;
            max = tonumber( active.max )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    stick = stick:gsub( &amp;quot;^_&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
                 :gsub( &amp;quot;_$&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
    for k, v in pairs( assigned ) do&lt;br /&gt;
        if type( k ) == &amp;quot;number&amp;quot; then&lt;br /&gt;
            s = assigned[ &amp;quot;label&amp;quot; .. tostring( k ) ]&lt;br /&gt;
            s, light, lost = friend( v, abroad, area, s, alter )&lt;br /&gt;
            if s then&lt;br /&gt;
                if r then&lt;br /&gt;
                    r = r .. stick&lt;br /&gt;
                else&lt;br /&gt;
                    r = &amp;quot;&amp;quot;&lt;br /&gt;
                end&lt;br /&gt;
                if lost then&lt;br /&gt;
                    lapsus = true&lt;br /&gt;
                elseif limit and light then&lt;br /&gt;
                    n = n + 1&lt;br /&gt;
                    if n &amp;gt; max then&lt;br /&gt;
                        local scream = &amp;quot;Echo-notification-count&amp;quot;&lt;br /&gt;
                        local tell   = mw.message.new( scream )&lt;br /&gt;
                        if tell:exists() then&lt;br /&gt;
                            scream = tell:numParams( max ):plain()&lt;br /&gt;
                        else&lt;br /&gt;
                            scream = string.format( &amp;quot;count %d &amp;amp;gt; %d&amp;quot;,&lt;br /&gt;
                                                    n, max )&lt;br /&gt;
                        end&lt;br /&gt;
                        scream = string.format( &amp;quot;&amp;amp;#32;!! %s !!&amp;amp;#32;&amp;quot;,&lt;br /&gt;
                                                scream )&lt;br /&gt;
                        r      = r .. fault( scream )&lt;br /&gt;
                        lapsus = true&lt;br /&gt;
                        limit  = false&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                r = r .. s&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end -- for k&lt;br /&gt;
    if r then&lt;br /&gt;
        local start  = Pinging.start&lt;br /&gt;
        local suffix = Pinging.suffix&lt;br /&gt;
        if active[ &amp;quot;@&amp;quot; ] then&lt;br /&gt;
            start = active[ &amp;quot;@&amp;quot; ]&lt;br /&gt;
        elseif assume[ &amp;quot;@&amp;quot; ] then&lt;br /&gt;
            start = assume[ &amp;quot;@&amp;quot; ]&lt;br /&gt;
        elseif active.a then&lt;br /&gt;
            start = active.a&lt;br /&gt;
        end&lt;br /&gt;
        if active[ &amp;quot;:&amp;quot; ] then&lt;br /&gt;
            suffix = active[ &amp;quot;:&amp;quot; ]&lt;br /&gt;
        elseif active.p then&lt;br /&gt;
            suffix = active.p&lt;br /&gt;
        elseif assume[ &amp;quot;:&amp;quot; ] then&lt;br /&gt;
            suffix = assume[ &amp;quot;:&amp;quot; ]&lt;br /&gt;
        end&lt;br /&gt;
        start = start:gsub( &amp;quot;^_&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
                     :gsub( &amp;quot;_$&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
        suffix = suffix:gsub( &amp;quot;^_&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
                       :gsub( &amp;quot;_$&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
        if alter  and  not lapsus then&lt;br /&gt;
            local e = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                             :css( &amp;quot;display&amp;quot;, &amp;quot;none&amp;quot; )&lt;br /&gt;
                             :wikitext( r )&lt;br /&gt;
            r = tostring( e ) .. alter&lt;br /&gt;
        end&lt;br /&gt;
        r = string.format( &amp;quot;%s%s%s&amp;quot;, start, r, suffix )&lt;br /&gt;
    else&lt;br /&gt;
        r = fault( &amp;quot;? . ? . ? . ?&amp;quot; )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- friends()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function massmessage( assume, active )&lt;br /&gt;
    -- Create text from massmessage distribution page&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     assume  -- table with default options&lt;br /&gt;
    --                [ 1 ]  -- page specification&lt;br /&gt;
    --                [ 2 ]  -- title; none for &amp;quot;_&amp;quot;, list if omitted&lt;br /&gt;
    --     active  -- table with current options&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string&lt;br /&gt;
    local source = assume[ 1 ]&lt;br /&gt;
    local page, r, targets&lt;br /&gt;
    if source then&lt;br /&gt;
        local id, story&lt;br /&gt;
        id = source:match( &amp;quot;^%s*#(%d+)%s*$&amp;quot; )&lt;br /&gt;
        if id then&lt;br /&gt;
            page = tonumber( id )&lt;br /&gt;
        else&lt;br /&gt;
            page = source&lt;br /&gt;
        end&lt;br /&gt;
        page = mw.title.new( page )&lt;br /&gt;
        if page then&lt;br /&gt;
            story = page:getContent()&lt;br /&gt;
        end&lt;br /&gt;
        if story then&lt;br /&gt;
            targets = fetch( story, assume.pattern )&lt;br /&gt;
        else&lt;br /&gt;
            r = fault( source )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if targets then&lt;br /&gt;
        --  if   =0&lt;br /&gt;
        local show = assume[ 2 ]&lt;br /&gt;
        if show then&lt;br /&gt;
            show = mw.text.trim( show )&lt;br /&gt;
            if show == &amp;quot;&amp;quot; then&lt;br /&gt;
                show = false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if show == &amp;quot;_&amp;quot; then&lt;br /&gt;
            show = &amp;quot;&amp;quot;&lt;br /&gt;
        elseif show then&lt;br /&gt;
            show = string.format( &amp;quot;[[%s|%s]]&amp;quot;, page.prefixedText, show )&lt;br /&gt;
        end&lt;br /&gt;
        r = friends( targets, true, false, assume, active, show )&lt;br /&gt;
    elseif not r then&lt;br /&gt;
        r = fault( source or &amp;quot;massmessage|namespace:title&amp;quot; )&lt;br /&gt;
    end&lt;br /&gt;
    if assume.subst  and  not mw.isSubsting() then&lt;br /&gt;
        local s = string.format( &amp;quot;&amp;amp;#123;&amp;amp;#123;subst:%s&amp;amp;#125;&amp;amp;#125;&amp;quot;,&lt;br /&gt;
                                 assume.subst )&lt;br /&gt;
        r = fault( s )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- massmessage()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function userlist( assume, active, area )&lt;br /&gt;
    -- Create text from template transclusion&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     assume  -- table with default options&lt;br /&gt;
    --     active  -- table with current options&lt;br /&gt;
    --     area    -- true: always wide area = URL&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string&lt;br /&gt;
    return friends( active, false, area, assume, active, false )&lt;br /&gt;
end -- userlist()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pinging.f = function ( assigned, area, assume, active )&lt;br /&gt;
    -- Make list of entries&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     assigned  -- table with pages or users&lt;br /&gt;
    --     area      -- true: always wide area = URL&lt;br /&gt;
    --     assume    -- table with default options&lt;br /&gt;
    --     active    -- table with current options&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string&lt;br /&gt;
    local defaults = assume  or  { }&lt;br /&gt;
    local current  = active  or  { }&lt;br /&gt;
    local r&lt;br /&gt;
    if type( assigned ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
       type( defaults ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
       type( current ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        r = friends( assigned, false, area, defaults, current, false )&lt;br /&gt;
    else&lt;br /&gt;
        local s&lt;br /&gt;
        if type( assigned ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
            s = &amp;quot;assigned&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if type( defaults ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
            if s then&lt;br /&gt;
                s = s .. &amp;quot;, assume&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                s = &amp;quot;assume&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if type( current ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
            if s then&lt;br /&gt;
                s = s .. &amp;quot;, active&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                s = &amp;quot;active&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        s = s .. &amp;quot; not &amp;#039;table&amp;#039;&amp;quot;&lt;br /&gt;
        r = fault( s )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Pinging.f()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Failsafe.failsafe = function ( atleast )&lt;br /&gt;
    -- Retrieve versioning and check for compliance&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     atleast  -- string, with required version&lt;br /&gt;
    --                         or wikidata|item|~|@ or false&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string  -- with queried version/item, also if problem&lt;br /&gt;
    --              false   -- if appropriate&lt;br /&gt;
    -- 2020-08-17&lt;br /&gt;
    local since  = atleast&lt;br /&gt;
    local last   = ( since == &amp;quot;~&amp;quot; )&lt;br /&gt;
    local linked = ( since == &amp;quot;@&amp;quot; )&lt;br /&gt;
    local link   = ( since == &amp;quot;item&amp;quot; )&lt;br /&gt;
    local r&lt;br /&gt;
    if last  or  link  or  linked  or  since == &amp;quot;wikidata&amp;quot; then&lt;br /&gt;
        local item = Failsafe.item&lt;br /&gt;
        since = false&lt;br /&gt;
        if type( item ) == &amp;quot;number&amp;quot;  and  item &amp;gt; 0 then&lt;br /&gt;
            local suited = string.format( &amp;quot;Q%d&amp;quot;, item )&lt;br /&gt;
            if link then&lt;br /&gt;
                r = suited&lt;br /&gt;
            else&lt;br /&gt;
                local entity = mw.wikibase.getEntity( suited )&lt;br /&gt;
                if type( entity ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                    local seek = Failsafe.serialProperty or &amp;quot;P348&amp;quot;&lt;br /&gt;
                    local vsn  = entity:formatPropertyValues( seek )&lt;br /&gt;
                    if type( vsn ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
                       type( vsn.value ) == &amp;quot;string&amp;quot;  and&lt;br /&gt;
                       vsn.value ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                        if last  and  vsn.value == Failsafe.serial then&lt;br /&gt;
                            r = false&lt;br /&gt;
                        elseif linked then&lt;br /&gt;
                            if mw.title.getCurrentTitle().prefixedText&lt;br /&gt;
                               ==  mw.wikibase.getSitelink( suited ) then&lt;br /&gt;
                                r = false&lt;br /&gt;
                            else&lt;br /&gt;
                                r = suited&lt;br /&gt;
                            end&lt;br /&gt;
                        else&lt;br /&gt;
                            r = vsn.value&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if type( r ) == &amp;quot;nil&amp;quot; then&lt;br /&gt;
        if not since  or  since &amp;lt;= Failsafe.serial then&lt;br /&gt;
            r = Failsafe.serial&lt;br /&gt;
        else&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Failsafe.failsafe()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Export&lt;br /&gt;
local p = { }&lt;br /&gt;
&lt;br /&gt;
function p.massmessage( a1, a2 )&lt;br /&gt;
    local r&lt;br /&gt;
    if type( a1 ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local p1, p2&lt;br /&gt;
        if type( a1.getParent ) == &amp;quot;function&amp;quot; then&lt;br /&gt;
            -- a1 is supposed to be a frame&lt;br /&gt;
            p1 = a1.args&lt;br /&gt;
            p2 = a1:getParent().args&lt;br /&gt;
        else&lt;br /&gt;
            p1 = a1&lt;br /&gt;
            if type( a2 ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                p2 = a2&lt;br /&gt;
            else&lt;br /&gt;
                p2 = { }&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        r = massmessage( p1, p2 )&lt;br /&gt;
    else&lt;br /&gt;
        r = fault( &amp;quot;Pinging::massmessage()&amp;quot; )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.maxecho()&lt;br /&gt;
    return tostring( Pinging.maxEcho )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.noping( frame )&lt;br /&gt;
    return userlist( frame.args, frame:getParent().args, true )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.ping( frame )&lt;br /&gt;
    return userlist( frame.args, frame:getParent().args, false )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.failsafe = function ( frame )&lt;br /&gt;
    -- Versioning interface&lt;br /&gt;
    local s = type( frame )&lt;br /&gt;
    local since&lt;br /&gt;
    if s == &amp;quot;table&amp;quot; then&lt;br /&gt;
        since = frame.args[ 1 ]&lt;br /&gt;
    elseif s == &amp;quot;string&amp;quot; then&lt;br /&gt;
        since = frame&lt;br /&gt;
    end&lt;br /&gt;
    if since then&lt;br /&gt;
        since = mw.text.trim( since )&lt;br /&gt;
        if since == &amp;quot;&amp;quot; then&lt;br /&gt;
            since = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return Failsafe.failsafe( since )  or  &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.failsafe&lt;br /&gt;
&lt;br /&gt;
setmetatable( p,  { __call = function ( func, ... )&lt;br /&gt;
                                 setmetatable( p, nil )&lt;br /&gt;
                                 return Failsafe&lt;br /&gt;
                             end } )&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;PerfektesChaos</name></author>
	</entry>
</feed>