<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://nbittrpgwiki.pynappo.xyz/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-RecentChangesSidebar.js</id>
	<title>MediaWiki:Gadget-RecentChangesSidebar.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://nbittrpgwiki.pynappo.xyz/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-RecentChangesSidebar.js"/>
	<link rel="alternate" type="text/html" href="https://nbittrpgwiki.pynappo.xyz/index.php?title=MediaWiki:Gadget-RecentChangesSidebar.js&amp;action=history"/>
	<updated>2026-11-07T00:36:50Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://nbittrpgwiki.pynappo.xyz/index.php?title=MediaWiki:Gadget-RecentChangesSidebar.js&amp;diff=3247&amp;oldid=prev</id>
		<title>CStatic: Created page with &quot;// From https://dev.miraheze.org/wiki/Recent_changes_sidebar mw.loader.using([ &#039;mediawiki.api&#039;, &#039;mediawiki.util&#039; ], function () {     const scriptPath = mw.config.get(&#039;wgScriptPath&#039;);     const skin = mw.config.get(&#039;skin&#039;);      function articleUrl(title) {         return mw.util.getUrl(title);     }      function contributionsUrl(user) {         return mw.util.getUrl(&#039;Special:Contributions/&#039; + user);     }      function recentChangesUrl() {         return mw.util.getUrl...&quot;</title>
		<link rel="alternate" type="text/html" href="https://nbittrpgwiki.pynappo.xyz/index.php?title=MediaWiki:Gadget-RecentChangesSidebar.js&amp;diff=3247&amp;oldid=prev"/>
		<updated>2026-10-05T00:19:58Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;// From https://dev.miraheze.org/wiki/Recent_changes_sidebar mw.loader.using([ &amp;#039;mediawiki.api&amp;#039;, &amp;#039;mediawiki.util&amp;#039; ], function () {     const scriptPath = mw.config.get(&amp;#039;wgScriptPath&amp;#039;);     const skin = mw.config.get(&amp;#039;skin&amp;#039;);      function articleUrl(title) {         return mw.util.getUrl(title);     }      function contributionsUrl(user) {         return mw.util.getUrl(&amp;#039;Special:Contributions/&amp;#039; + user);     }      function recentChangesUrl() {         return mw.util.getUrl...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// From https://dev.miraheze.org/wiki/Recent_changes_sidebar&lt;br /&gt;
mw.loader.using([ &amp;#039;mediawiki.api&amp;#039;, &amp;#039;mediawiki.util&amp;#039; ], function () {&lt;br /&gt;
    const scriptPath = mw.config.get(&amp;#039;wgScriptPath&amp;#039;);&lt;br /&gt;
    const skin = mw.config.get(&amp;#039;skin&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    function articleUrl(title) {&lt;br /&gt;
        return mw.util.getUrl(title);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function contributionsUrl(user) {&lt;br /&gt;
        return mw.util.getUrl(&amp;#039;Special:Contributions/&amp;#039; + user);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function recentChangesUrl() {&lt;br /&gt;
        return mw.util.getUrl(&amp;#039;Special:RecentChanges&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function message(key, fallback) {&lt;br /&gt;
        const msg = mw.message(key);&lt;br /&gt;
&lt;br /&gt;
        return msg.exists() ? msg.text() : fallback;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function formatAge(timestamp) {&lt;br /&gt;
        const timeDelta = Date.now() - Date.parse(timestamp);&lt;br /&gt;
        let timeString = Math.round(timeDelta / 60000) + &amp;#039;m&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        if (timeDelta &amp;gt;= 3600000) {&lt;br /&gt;
            timeString = Math.round(timeDelta / 3600000) + &amp;#039;h&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
        if (timeDelta &amp;gt;= 86400000) {&lt;br /&gt;
            timeString = Math.round(timeDelta / 86400000) + &amp;#039;d&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return timeString;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function recentChangeItem(entry) {&lt;br /&gt;
        const user = entry.user;&lt;br /&gt;
        const userText = entry.anon === &amp;#039;&amp;#039; ? message(&amp;#039;anonymous&amp;#039;, &amp;#039;anonymous&amp;#039;) : user;&lt;br /&gt;
        const $timeLink = $(&amp;#039;&amp;lt;a&amp;gt;&amp;#039;, {&lt;br /&gt;
            href: scriptPath + `?diff=${entry.revid}`&lt;br /&gt;
        }).append(&lt;br /&gt;
            document.createTextNode(formatAge(entry.timestamp) + &amp;#039; &amp;#039;),&lt;br /&gt;
            $(&amp;#039;&amp;lt;span&amp;gt;&amp;#039;, {&lt;br /&gt;
                class: &amp;#039;rc-sidebar-ago&amp;#039;,&lt;br /&gt;
                text: &amp;#039;ago&amp;#039;&lt;br /&gt;
            })&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        return $(&amp;#039;&amp;lt;li&amp;gt;&amp;#039;, {&lt;br /&gt;
            class: &amp;#039;mw-list-item rc-sidebar-item&amp;#039;&lt;br /&gt;
        }).append(&lt;br /&gt;
            $(&amp;#039;&amp;lt;a&amp;gt;&amp;#039;, {&lt;br /&gt;
                class: &amp;#039;rc-sidebar-page&amp;#039;,&lt;br /&gt;
                href: articleUrl(entry.title),&lt;br /&gt;
                text: entry.title&lt;br /&gt;
            }),&lt;br /&gt;
            $(&amp;#039;&amp;lt;p&amp;gt;&amp;#039;, {&lt;br /&gt;
                class: &amp;#039;rc-sidebar-user&amp;#039;&lt;br /&gt;
            }).append(&lt;br /&gt;
                $timeLink,&lt;br /&gt;
                document.createTextNode(&amp;#039; - &amp;#039;),&lt;br /&gt;
                $(&amp;#039;&amp;lt;a&amp;gt;&amp;#039;, {&lt;br /&gt;
                    href: contributionsUrl(user),&lt;br /&gt;
                    text: userText&lt;br /&gt;
                })&lt;br /&gt;
            )&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function citizenShowMoreItem(body) {&lt;br /&gt;
        const $showMore = $(&amp;#039;&amp;lt;li&amp;gt;&amp;#039;, {&lt;br /&gt;
            class: &amp;#039;mw-list-item&amp;#039;&lt;br /&gt;
        }).append(&lt;br /&gt;
            $(&amp;#039;&amp;lt;a&amp;gt;&amp;#039;, {&lt;br /&gt;
                &amp;#039;data-mw&amp;#039;: &amp;#039;interface&amp;#039;,&lt;br /&gt;
                href: recentChangesUrl(),&lt;br /&gt;
                rel: &amp;#039;nofollow&amp;#039;,&lt;br /&gt;
                title: &amp;#039;A list of recent changes in the wiki&amp;#039;&lt;br /&gt;
            }).append(&lt;br /&gt;
                $(&amp;#039;&amp;lt;span&amp;gt;&amp;#039;, {&lt;br /&gt;
                    text: &amp;#039;Show more...&amp;#039;&lt;br /&gt;
                })&lt;br /&gt;
            )&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        $(body).append(&lt;br /&gt;
            $(&amp;#039;&amp;lt;ul&amp;gt;&amp;#039;, {&lt;br /&gt;
                class: &amp;#039;rc-sidebar-list&amp;#039;&lt;br /&gt;
            }).append($showMore)&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        return $showMore;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function populateRecentChanges($showMore, changes) {&lt;br /&gt;
        $showMore&lt;br /&gt;
            .children(&amp;#039;a&amp;#039;)&lt;br /&gt;
            .children(&amp;#039;span&amp;#039;)&lt;br /&gt;
            .last()&lt;br /&gt;
            .text(&amp;#039;Show more...&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        $showMore.before(changes.map(function (entry) {&lt;br /&gt;
            return recentChangeItem(entry)[0];&lt;br /&gt;
        }));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // At this point the DOM might not be ready, so we don&amp;#039;t know if we need&lt;br /&gt;
    // RC sidebar yet. We can still send an API request early since it&amp;#039;s cached.&lt;br /&gt;
    const rcPromise = new mw.Api().get({&lt;br /&gt;
        action: &amp;#039;query&amp;#039;,&lt;br /&gt;
        list: &amp;#039;recentchanges&amp;#039;,&lt;br /&gt;
        rcprop: &amp;#039;title|timestamp|user|ids&amp;#039;,&lt;br /&gt;
        rcnamespace: &amp;#039;0&amp;#039;,&lt;br /&gt;
        rclimit: &amp;#039;4&amp;#039;,&lt;br /&gt;
        rctype: &amp;#039;edit|new&amp;#039;,&lt;br /&gt;
        rcshow: &amp;#039;!bot&amp;#039;,&lt;br /&gt;
        rctoponly: &amp;#039;1&amp;#039;,&lt;br /&gt;
        format: &amp;#039;json&amp;#039;,&lt;br /&gt;
        maxage: &amp;#039;120&amp;#039;,&lt;br /&gt;
        smaxage: &amp;#039;120&amp;#039;&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function showRecentChanges($showMore) {&lt;br /&gt;
        if (!$showMore.length) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function handleError(msg) {&lt;br /&gt;
            console.error(msg);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        rcPromise.done(function (data) {&lt;br /&gt;
            const changes = data.query &amp;amp;&amp;amp; data.query.recentchanges ? data.query.recentchanges : [];&lt;br /&gt;
&lt;br /&gt;
            if (changes.length === 0) {&lt;br /&gt;
                handleError(&amp;quot;No recent change(s) found.&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            populateRecentChanges($showMore, changes);&lt;br /&gt;
        }).fail(function (msg) {&lt;br /&gt;
            handleError(msg);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (skin === &amp;#039;citizen&amp;#039;) {&lt;br /&gt;
        mw.hook(&amp;#039;citizen.pageAside.register&amp;#039;).add(function (data) {&lt;br /&gt;
            const body = data.register({&lt;br /&gt;
                id: &amp;#039;rcsidebar&amp;#039;,&lt;br /&gt;
                label: message(&amp;#039;recentchanges&amp;#039;, &amp;#039;Recent changes&amp;#039;),&lt;br /&gt;
                placement: &amp;#039;flow&amp;#039;,&lt;br /&gt;
                order: 15&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            if (body) {&lt;br /&gt;
                showRecentChanges(citizenShowMoreItem(body));&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Wait for DOM ready&lt;br /&gt;
    $(function () {&lt;br /&gt;
        showRecentChanges($(&amp;#039;#p-Recent_changes #n-recentchanges&amp;#039;).first());&lt;br /&gt;
    });&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>CStatic</name></author>
	</entry>
</feed>