User:一位史蒂夫/JS/UserStatus.js

萌娘百科,萬物皆可萌的百科全書!轉載請標註來源頁面的網頁連結,並聲明引自萌娘百科。內容不可商用。
貢獻者:

注意:在您儲存之後您必須清除瀏覽器快取才可看到最新的變動。

  • Firefox / Safari:按住「Shift」時點選「重新整理」,或按「Ctrl-F5」或「Ctrl-R」 (Mac則為「⌘-R」)
  • Google Chrome:按「Ctrl-Shift-R」 (Mac 則為「⌘-Shift-R」)
  • Internet Explorer:按住「Ctrl」時點選「重新整理」,或按「Ctrl-F5」
  • Opera:進入「工具→偏好設定」中清除快取。
  • 如果您已登入但該頁面出現未登入狀態,請嘗試在網址列的URL最後新增代碼?_=1來訪問最新頁面。
  1. /*
  2. UserStatus.js
  3. by User:AnnAngela
  4. Modified by User:一位史蒂夫
  5. Original script: http://zh.moegirl.tw/User:AnnAngela/js/userStatus.js
  6. */
  7. /* eslint-disable require-atomic-updates */
  8. // <pre>
  9. "use strict";
  10. $(() => (async () => {
  11. if (location.hostname.startsWith("mzh.")) {
  12. return;
  13. }
  14. await mw.loader.using(["ext.gadget.LocalObjectStorage"]);
  15. const localObjectStorage = new LocalObjectStorage("UserStatus");
  16. try {
  17. const builtinStatus = {
  18. online: '<span style="height:1em;width:1em;background-color:green;border-radius:50%;display:inline-block;"></span><b style="color:green;">在線</b>',
  19. busy: '<span style="height:1em;width:1em;background-color:steelblue;border-radius:50%;display:inline-block;"></span><b style="color:steelblue;">忙碌</b>',
  20. offline: '<span style="height:1em;width:1em;background-color:red;border-radius:50%;display:inline-block;"></span><b style="color:red;">離線</b>',
  21. away: '<span style="height:1em;width:1em;background-color:mediumaquamarine;border-radius:50%;display:inline-block;"></span><b style="color:mediumaquamarine;">已離開</b>',
  22. sleeping: '<span style="height:1em;width:1em;background-color:lightsteelblue;border-radius:50%;display:inline-block;"></span><b style="color:lightsteelblue;">在睡覺</b>',
  23. wikibreak: '<span style="height:1em;width:1em;background-color:brown;border-radius:50%;display:inline-block;"></span><b style="color:brown;">正在放萌百假期</b>',
  24. holiday: '<span style="height:1em;width:1em;background-color:cadetblue;border-radius:50%;display:inline-block;"></span><b style="color:cadetblue;">處於假期中</b>',
  25. died: '<span style="height:1em;width:1em;background-color:black;border-radius:50%;display:inline-block;"></span><b style="color:black;">已去世</b>',
  26. studying: '<span style="height:1em;width:1em;background-color:gold;border-radius:50%;display:inline-block;"></span><b style="color:gold;">在學習</b>',
  27. left: '<span style="height:1em;width:1em;background-color:grey;border-radius:50%;display:inline-block;"></span><b style="color:grey;">暫時退站</b>',
  28. exam: '<span style="height:1em;width:1em;background-color:paleturquoise;border-radius:50%;display:inline-block;"></span><b style="color:paleturquoise;">正在備考</b>',
  29. noupdate: '<span style="height:1em;width:1em;background-color:seagreen;border-radius:50%;display:inline-block;"></span><b style="color:seagreen;">已停更</b>',
  30. lazy: '<span style="height:1em;width:1em;background-color:salmon;border-radius:50%;display:inline-block;"></span><b style="color:salmon;">咕咕咕</b>',
  31. onbutbusy: '<span style="height:1em;width:1em;background-color:teal;border-radius:50%;display:inline-block;"></span><b style="color:teal;">正在進行大工程</b>',
  32. dorm: '<span style="height:1em;width:1em;background-color:darkgrey;border-radius:50%;display:inline-block;"></span><b style="color:darkgrey;">已開學</b>',
  33. _unknown: '<span style="height:1em;width:1em;background-color:gray;border-radius:50%;display:inline-block;"></span><i style="color:gray;">狀態不詳</i>',
  34. };
  35. const originalBuiltinStatusIndex = Object.keys(builtinStatus);
  36. mw.loader.addStyleTag("#pt-userstatus { margin-top: 0.75em !important; margin-bottom: 0px !important; } .pt-userstatus-img { width: 25px; margin-top: -0.25em; }");
  37. builtinStatus.on = builtinStatus.online;
  38. builtinStatus.off = builtinStatus.offline;
  39. builtinStatus.break = builtinStatus.wikibreak;
  40. builtinStatus.sleep = builtinStatus.sleeping;
  41. const userName = mw.config.get("wgUserName");
  42. if (userName === null) {
  43. return;
  44. }
  45. const statusPage = `User:${userName}/Status`;
  46. const now = new Date().getTime();
  47. let rawStatus;
  48. try {
  49. const localStatus = await localObjectStorage.getItem("localStatus");
  50. if (mw.config.get("wgPageName") !== statusPage
  51. && typeof localStatus.timestamp === "number" && localStatus.timestamp > now - 10 * 60 * 1000
  52. && localStatus.status in builtinStatus) {
  53. rawStatus = localStatus.status;
  54. } else {
  55. throw new Error();
  56. }
  57. } catch {
  58. try {
  59. rawStatus = (await $.ajax({
  60. url: `${mw.config.get("wgServer")}${mw.config.get("wgScriptPath")}/index.php`,
  61. type: "GET",
  62. data: {
  63. title: statusPage,
  64. action: "raw",
  65. },
  66. cache: false,
  67. })).trim();
  68. if (rawStatus in builtinStatus) {
  69. await localObjectStorage.setItem("localStatus", {
  70. timestamp: now,
  71. status: rawStatus,
  72. });
  73. }
  74. } catch {
  75. rawStatus = "_unknown";
  76. await localObjectStorage.removeItem("localStatus");
  77. }
  78. }
  79. const currentStatus = rawStatus in builtinStatus ? builtinStatus[rawStatus] : (() => {
  80. const div = $("<div/>").html(rawStatus);
  81. div.find("script, style, link, iframe, frame, object, param, audio, video, base, head, meta, title, body, h1, h2, h3, h4, h5, h6, blockquote, dd, dl, dir, dt, hr, li, ul, ol, pre, a, abbr, br, cite, code, data, em, rb, rp, rt, rtc, ruby, samp, time, tt, var, wbr, area, map, track, applet, embed, noembed, picture, source, canvas, noscript, caption, col, colgroup, table, tbody, thead, tfoot, td, th, tr, button, datalist, fieldset, form, input, label, legend, meter, optgroup, option, output, progress, select, textarea, details, dialog, menu, menuitem, summary, shadow, element, content, slot, template, bgsound, blink, center, command, frameset").remove();
  82. div.find("img").attr("class", "pt-userstatus-img");
  83. return div.html();
  84. })();
  85. const pt = $("<li id=\"pt-userstatus\"><a id=\"pt-userpage-link\" href=\"javascript:void(0);\" dir=\"auto\" title=\"您的狀態\"></a></li>");
  86. pt.find("#pt-userpage-link").html(currentStatus).on("click", async () => {
  87. await mw.loader.using(["oojs-ui", "mw.Api"]);
  88. const messageDialog = new OO.ui.MessageDialog();
  89. const windowManager = new OO.ui.WindowManager();
  90. $("body").append(windowManager.$element);
  91. windowManager.addWindows([messageDialog]);
  92. messageDialog.title.$label.html("修改自己的狀態");
  93. const container = $("<div/>");
  94. container.append(`<p>修改<a href="${mw.config.get("wgServer")}${mw.config.get("wgScriptPath")}/${statusPage}">自己的狀態</a>為:</p>`);
  95. const builtinStatusList = originalBuiltinStatusIndex.map((data, i) => data === "_unknown" ? undefined : { data, label: `${i}`, html: builtinStatus[data] }).filter(n => !!n);
  96. const builtinStatusSelector = new OO.ui.RadioSelectInputWidget({
  97. value: rawStatus,
  98. options: builtinStatusList.map(({ data, label }) => ({ data, label })),
  99. });
  100. builtinStatusSelector.$element.find(".oo-ui-radioSelectWidget > .oo-ui-radioOptionWidget > .oo-ui-labelElement-label").each((_, labelEle) => {
  101. $(labelEle).css("overflow", "visible").html((builtinStatusList.filter(({ label }) => $(labelEle).text() === label)[0] || { html: $(labelEle).html() }).html);
  102. });
  103. container.append(builtinStatusSelector.$element);
  104. container.append(`<p>本工具在獲取狀態信息後有10分鐘的緩存,您可以通過直接打開<a href="${mw.config.get("wgServer")}${mw.config.get("wgScriptPath")}/${statusPage}">自己的狀態頁</a>來強制獲取最新狀態信息。`);
  105. messageDialog.message.$label.append(container);
  106. const action = new OO.ui.ActionWidget({
  107. action: "confirm",
  108. label: "提交",
  109. flags: "primary",
  110. });
  111. const cAction = new OO.ui.ActionWidget({
  112. action: "cancel",
  113. label: "取消",
  114. flags: "primary",
  115. });
  116. cAction.$element[0].addEventListener("click", () => {
  117. windowManager.closeWindow(messageDialog);
  118. }, {
  119. capture: true,
  120. });
  121. action.$element[0].addEventListener("click", async () => {
  122. windowManager.closeWindow(messageDialog);
  123. const fMessageDialog = new OO.ui.MessageDialog();
  124. windowManager.addWindows([fMessageDialog]);
  125. const cAction = new OO.ui.ActionWidget({
  126. action: "accept",
  127. label: "我知道了",
  128. flags: "primary",
  129. });
  130. cAction.$element[0].addEventListener("click", () => {
  131. windowManager.closeWindow(fMessageDialog);
  132. }, {
  133. capture: true,
  134. });
  135. try {
  136. const status = builtinStatusSelector.getValue();
  137. await new mw.Api().postWithToken("csrf", {
  138. action: "edit",
  139. title: statusPage,
  140. text: status,
  141. summary: `修改狀態為 - ${status}`,
  142. tags: "Automation tool",
  143. minor: true,
  144. });
  145. await localObjectStorage.setItem("localStatus", {
  146. timestamp: new Date().getTime(),
  147. status: status,
  148. });
  149. pt.find("#pt-userpage-link").html(builtinStatus[status]);
  150. rawStatus = status;
  151. fMessageDialog.title.$label.html("狀態修改完成!");
  152. fMessageDialog.message.$label.html(`<p>你的狀態已修改為:${builtinStatus[status]}</p>`);
  153. const action = new OO.ui.ActionWidget({
  154. action: "confirm",
  155. label: "確定",
  156. flags: "primary",
  157. });
  158. action.$element[0].addEventListener("click", () => {
  159. windowManager.closeWindow(fMessageDialog);
  160. }, {
  161. capture: true,
  162. });
  163. windowManager.openWindow(fMessageDialog, {
  164. actions: [action],
  165. });
  166. } catch (e) {
  167. fMessageDialog.title.$label.html("狀態修改發生錯誤……");
  168. fMessageDialog.message.$label.html(`錯誤信息為:${e}`);
  169. windowManager.openWindow(fMessageDialog, {
  170. actions: [cAction],
  171. });
  172. }
  173. }, {
  174. capture: true,
  175. });
  176. windowManager.openWindow(messageDialog, {
  177. actions: [action, cAction],
  178. });
  179. return false;
  180. });
  181. $("#pt-userpage").after(pt);
  182. mw.loader.using(["oojs-ui", "mw.Api"]);
  183. } catch (reason) {
  184. console.error(reason);
  185. const lastError = sessionStorage.getItem("AnnTools-userstatus-img-Error");
  186. if (lastError !== reason.toString()) {
  187. alert(`顯示用戶狀態工具發生錯誤:\n${reason}`);
  188. sessionStorage.setItem("AnnTools-userstatus-img-Error", reason);
  189. }
  190. }
  191. })());
  192. // </pre>
此頁面最後編輯於 2021年6月25日 (週五) 02:28。
搜尋萌娘百科 (按"/"快速搜尋)
有新的未讀公告