MediaWiki:Common.js

From Minehut Wiki
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/* Any JavaScript here will be loaded for all users on every page load. */

mw.loader.load("https://commons.wiki.gg/wiki/MediaWiki:DiscordIntegrator.js?action=raw\u0026ctype=text/javascript");

/* DRUID */
$(function () {
  $(".druid-main-images-label").off("click");
  $(".druid-main-images-label").click(function () {
    var $parent = $(this).closest(".druid-container");
    $parent.find(".druid-toggleable").removeClass("focused");
    var i = $(this).attr("data-druid");
    $parent.find(".druid-toggleable[data-druid=" + i + "]").addClass("focused");
  });

  $(".druid-collapsible").off("click");
  $(".druid-collapsible").click(function () {
    var kind = $(this).attr("data-druid-section");
    $(this).toggleClass("druid-collapsible-collapsed");
    $(this)
      .closest(".druid-container")
      .find("[data-druid-section-row=" + kind + "]")
      .toggleClass("druid-collapsed");
  });
});

$(function () {
  $(".druid-title-tab").off("click")
    .on('click', function () {
      var $parent = $(this).closest(".druid-container");
      $parent.find(".druid-toggleable").removeClass("focused");
      var i = $(this).attr("data-druid");
      $parent.find(".druid-toggleable[data-druid=" + i + "]").addClass("focused");
  });
    
  $(".druid-section-tab").off("click")
    .on('click', function () {
      var $parent = $(this).closest(".druid-section-container");
      $parent.find(".druid-toggleable").removeClass("focused");
      var i = $(this).attr("data-druid");
      $parent.find(".druid-toggleable[data-druid=" + i + "]").addClass("focused");
  });

  $(".druid-collapsible").off("click")
    .on('click', function () {
      var kind = $(this).attr("data-druid-section");
      $(this).toggleClass("druid-collapsible-collapsed");
      $(this)
        .closest(".druid-container")
        .find("[data-druid-section-row=" + kind + "]")
        .toggleClass("druid-collapsed");
  });
});
/* End DRUID */

/* [[Template:Spoiler]] */
$(function () {
	$('.spoiler-content')
	.off('click') // in case this code is loaded twice
	.on('click', function(e){
		$(this).toggleClass('show');
	}).find('a').on('click', function(e){
		e.stopPropagation();
	});

});

/* Timestamp Format */
function formatTimestamp(element) {
    var timestamp = element.dataset.timestamp;
    if (timestamp) {
        var date = new Date(parseInt(timestamp) * 1000);
        
        var formattedDate = new Intl.DateTimeFormat('en-US', {
            month: '2-digit',
            day: '2-digit',
            year: 'numeric',
            hour: '2-digit',
            minute: '2-digit',
            hour12: true
        }).format(date);

        element.innerText = formattedDate;
    }
}

mw.hook("wikipage.content").add(function ($content) {
    var page = $content[0];
    
    /* Check if timestamps need to be formatted */
    if (!page.querySelector('.timestamp')) { return; }
    
    /* Format each timestamp */
    page.querySelectorAll('.timestamp').forEach(formatTimestamp);
});


function loadLatestPages(id, category) {
    var baseURL = 'https://minehut.wiki.gg/api.php';

    // Step 1: Fetch pages in the "Notable Servers" category
    var categoryParams = new URLSearchParams({
        action: 'query',
        list: 'categorymembers',
        cmtitle: 'Category:' + category,
        cmlimit: '50', // Fetch more pages to ensure we have enough for sorting
        format: 'json'
    });

    fetch(baseURL + '?' + categoryParams.toString())
        .then(function(response) {
            return response.json();
        })
        .then(function(categoryData) {
            var pages = categoryData.query.categorymembers;

            // Step 2: Fetch the last revision for each page
            var revisionPromises = pages.map(function(page) {
                var revisionParams = new URLSearchParams({
                    action: 'query',
                    prop: 'revisions',
                    titles: page.title,
                    rvprop: 'timestamp',
                    rvlimit: '1',
                    format: 'json'
                });

                return fetch(baseURL + '?' + revisionParams.toString())
                    .then(function(response) {
                        return response.json();
                    })
                    .then(function(revisionData) {
                        var pageId = Object.keys(revisionData.query.pages)[0];
                        var lastRevision = revisionData.query.pages[pageId].revisions[0];

                        return {
                            title: page.title,
                            timestamp: lastRevision.timestamp
                        };
                    });
            });

            return Promise.all(revisionPromises);
        })
        .then(function(pageRevisions) {
            // Step 3: Sort pages by last updated timestamp (descending order)
            pageRevisions.sort(function(a, b) {
                return new Date(b.timestamp) - new Date(a.timestamp);
            });

            // Step 4: Generate the list format with MediaWiki-style links
            var listItems = pageRevisions.slice(0, 5).map(function(page) {
                //return '<li>' + '[[' + page.title + ']]' + '</li>';
                return "<li>" + mw.html.element('a', {href: page.title}, page.title) + "</li>";
            }).join('\n');

            // Step 5: Replace the content of the div with class "notable_servers"
            $('.' + id).html('<ul>' + listItems + '</ul>');
        })
        .catch(function(error) {
            console.error('Error fetching pages:', error);
        });
}

$(document).ready(function() {
	if (mw.config.get('wgIsMainPage')) {
	    loadLatestPages("notable_servers", "Notable_Servers");
	    loadLatestPages("server_types", "Server_Types");
	}
});