No edit summary
No edit summary
Line 108: Line 108:
}
}
/* Jake */
/* Jake */
(function () {
  function jakeTimeAgo(date) {
    var s = Math.floor((Date.now() - date.getTime()) / 1000);
    if (s < 60) return s + "s ago";
    var m = Math.floor(s / 60);
    if (m < 60) return m + "m ago";
    var h = Math.floor(m / 60);
    if (h < 24) return h + "h ago";
    var d = Math.floor(h / 24);
    return d + "d ago";
  }
  function jakeBuildPortlet() {
    var menu =
      document.getElementById("vector-main-menu") ||
      document.getElementById("mw-panel");
    if (!menu) return null;
    if (document.getElementById("p-jake-recentchanges")) return null;
    var portlet = document.createElement("div");
    portlet.id = "p-jake-recentchanges";
    portlet.className = "vector-menu mw-portlet";
    var heading = document.createElement("div");
    heading.className = "vector-menu-heading";
    heading.textContent = "Recent changes";
    var content = document.createElement("div");
    content.className = "vector-menu-content";
    var ul = document.createElement("ul");
    ul.className = "vector-menu-content-list";
    ul.id = "jake-rc-list";
    var moreWrap = document.createElement("div");
    moreWrap.className = "jake-rc-more";
    var moreLink = document.createElement("a");
    moreLink.href = mw.util.getUrl("Special:RecentChanges");
    moreLink.textContent = "Show more…";
    moreWrap.appendChild(moreLink);
    content.appendChild(ul);
    content.appendChild(moreWrap);
    portlet.appendChild(heading);
    portlet.appendChild(content);
    var discordPortlet = menu.querySelector("#p-Community");
    if (discordPortlet && discordPortlet.parentNode) {
      discordPortlet.parentNode.insertBefore(portlet, discordPortlet.nextSibling);
    } else {
      var navPortlet = menu.querySelector("#p-navigation");
      if (navPortlet && navPortlet.parentNode) {
        navPortlet.parentNode.insertBefore(portlet, navPortlet.nextSibling);
      } else {
        menu.appendChild(portlet);
      }
    }
    return ul;
  }
  function jakeLoadRecentChanges(ul) {
    if (!ul) return;
    var api = new mw.Api();
    api
      .get({
        action: "query",
        list: "recentchanges",
        rcnamespace: 0,
        rclimit: 5,
        rcprop: "title|timestamp|user",
        rcshow: "!bot",
        formatversion: 2
      })
      .then(function (data) {
        var items =
          data && data.query && data.query.recentchanges
            ? data.query.recentchanges
            : [];
        ul.textContent = "";
        for (var i = 0; i < items.length; i++) {
          var rc = items[i];
          var li = document.createElement("li");
          li.className = "mw-list-item jake-rc-item";
          var a = document.createElement("a");
          a.href = mw.util.getUrl(rc.title);
          a.textContent = rc.title;
          var meta = document.createElement("div");
          meta.className = "jake-rc-meta";
          meta.textContent = jakeTimeAgo(new Date(rc.timestamp)) + " · " + (rc.user || "");
          li.appendChild(a);
          li.appendChild(meta);
          ul.appendChild(li);
        }
      })
      .catch(function () {
        ul.textContent = "";
        var li = document.createElement("li");
        li.className = "mw-list-item jake-rc-item";
        var a = document.createElement("a");
        a.href = mw.util.getUrl("Special:RecentChanges");
        a.textContent = "View recent changes";
        li.appendChild(a);
        ul.appendChild(li);
      });
  }
  function jakeInitRecentChanges() {
    if (!window.mw || !mw.util || !mw.Api) return;
    var ul = jakeBuildPortlet();
    if (!ul) ul = document.getElementById("jake-rc-list");
    if (!ul) return;
    jakeLoadRecentChanges(ul);
    setInterval(function () {
      jakeLoadRecentChanges(ul);
    }, 60000);
  }
  function jakeWaitForMenu() {
    var tries = 0;
    var timer = setInterval(function () {
      var menu =
        document.getElementById("vector-main-menu") ||
        document.getElementById("mw-panel");
      if (menu) {
        clearInterval(timer);
        jakeInitRecentChanges();
        return;
      }
      tries++;
      if (tries > 50) clearInterval(timer);
    }, 200);
  }
  jakeWaitForMenu();
})();