|
|
| Line 108: |
Line 108: |
| } | | } |
| /* Jake */ | | /* Jake */ |
| (function () {
| |
| function jakeTimeAgo(d) {
| |
| var s = Math.floor((Date.now() - d.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 days = Math.floor(h / 24);
| |
| return days + "d ago";
| |
| }
| |
|
| |
| function jakeBuildRecentChangesPortlet() {
| |
| var jakeMenu = document.getElementById("vector-main-menu") || document.getElementById("mw-panel");
| |
| if (!jakeMenu) return null;
| |
|
| |
| if (document.getElementById("p-jake-recentchanges")) return null;
| |
|
| |
| var jakePortlet = document.createElement("div");
| |
| jakePortlet.id = "p-jake-recentchanges";
| |
| jakePortlet.className = "vector-menu mw-portlet";
| |
|
| |
| var jakeHeading = document.createElement("div");
| |
| jakeHeading.className = "vector-menu-heading";
| |
| jakeHeading.textContent = "Recent changes";
| |
|
| |
| var jakeContent = document.createElement("div");
| |
| jakeContent.className = "vector-menu-content";
| |
|
| |
| var jakeList = document.createElement("ul");
| |
| jakeList.className = "vector-menu-content-list";
| |
| jakeList.id = "jake-rc-list";
| |
|
| |
| var jakeMoreWrap = document.createElement("div");
| |
| jakeMoreWrap.className = "jake-rc-more";
| |
|
| |
| var jakeMoreLink = document.createElement("a");
| |
| jakeMoreLink.href = mw.util.getUrl("Special:RecentChanges");
| |
| jakeMoreLink.textContent = "Show more…";
| |
|
| |
| jakeMoreWrap.appendChild(jakeMoreLink);
| |
|
| |
| jakeContent.appendChild(jakeList);
| |
| jakeContent.appendChild(jakeMoreWrap);
| |
|
| |
| jakePortlet.appendChild(jakeHeading);
| |
| jakePortlet.appendChild(jakeContent);
| |
|
| |
| var jakeAfter = jakeMenu.querySelector("#p-navigation") || jakeMenu.firstElementChild;
| |
| if (jakeAfter && jakeAfter.parentNode) {
| |
| jakeAfter.parentNode.insertBefore(jakePortlet, jakeAfter.nextSibling);
| |
| } else {
| |
| jakeMenu.appendChild(jakePortlet);
| |
| }
| |
|
| |
| return jakeList;
| |
| }
| |
|
| |
| function jakeLoadRecentChanges(jakeListEl) {
| |
| if (!jakeListEl) return;
| |
|
| |
| var jakeApi = new mw.Api();
| |
| jakeApi.get({
| |
| action: "query",
| |
| list: "recentchanges",
| |
| rcnamespace: 0,
| |
| rclimit: 5,
| |
| rcprop: "title|timestamp|user",
| |
| rcshow: "!bot",
| |
| formatversion: 2
| |
| }).then(function (res) {
| |
| var jakeItems = (res && res.query && res.query.recentchanges) ? res.query.recentchanges : [];
| |
| jakeListEl.textContent = "";
| |
|
| |
| for (var i = 0; i < jakeItems.length; i++) {
| |
| var rc = jakeItems[i];
| |
|
| |
| var li = document.createElement("li");
| |
| li.className = "mw-list-item jake-rc-item";
| |
|
| |
| var link = document.createElement("a");
| |
| link.href = mw.util.getUrl(rc.title);
| |
| link.textContent = rc.title;
| |
|
| |
| var meta = document.createElement("div");
| |
| meta.className = "jake-rc-meta";
| |
| meta.textContent = jakeTimeAgo(new Date(rc.timestamp)) + " · " + (rc.user || "");
| |
|
| |
| li.appendChild(link);
| |
| li.appendChild(meta);
| |
| jakeListEl.appendChild(li);
| |
| }
| |
| }).catch(function () {
| |
| jakeListEl.textContent = "";
| |
|
| |
| var li = document.createElement("li");
| |
| li.className = "mw-list-item jake-rc-item";
| |
|
| |
| var link = document.createElement("a");
| |
| link.href = mw.util.getUrl("Special:RecentChanges");
| |
| link.textContent = "View recent changes";
| |
|
| |
| li.appendChild(link);
| |
| jakeListEl.appendChild(li);
| |
| });
| |
| }
| |
|
| |
| function jakeInitRecentChanges() {
| |
| if (!mw || !mw.util || !mw.Api) return;
| |
|
| |
| var jakeListEl = jakeBuildRecentChangesPortlet();
| |
| if (!jakeListEl) jakeListEl = document.getElementById("jake-rc-list");
| |
| if (!jakeListEl) return;
| |
|
| |
| jakeLoadRecentChanges(jakeListEl);
| |
| setInterval(function () {
| |
| jakeLoadRecentChanges(jakeListEl);
| |
| }, 60000);
| |
| }
| |
|
| |
| if (document.readyState === "loading") {
| |
| document.addEventListener("DOMContentLoaded", jakeInitRecentChanges);
| |
| } else {
| |
| jakeInitRecentChanges();
| |
| }
| |
| })();
| |