巴哈姆特哈啦區顯示板務名稱

在巴哈姆特哈啦區令板務列表顯示個別板務暱稱, 並可以按鈕切換顯示行為

  1. // ==UserScript==
  2. // @name 巴哈姆特哈啦區顯示板務名稱
  3. // @namespace 巴哈姆特哈啦區顯示板務上線狀態
  4. // @author johnny860726
  5. // @match *forum.gamer.com.tw/*
  6. // @run-at document-end
  7. // @description 在巴哈姆特哈啦區令板務列表顯示個別板務暱稱, 並可以按鈕切換顯示行為
  8. // @version 20190606
  9. // ==/UserScript==
  10.  
  11. // 0: 顯示, 1: 折疊
  12. var isOnOnly = 0;
  13.  
  14. // 自訂哈啦板編號, 與自訂哈啦板板務名單配合用, 不必修改
  15. var bsn = 60076;
  16.  
  17. // 自訂哈啦板之板務名單
  18. var list = 'yunski,a1998307,ab91516,DarkPerson,edfrmpc44ic,fired00002,johnny860726,oscar123400,peter8964,s1989122s,seanlau708,TofuTM,we1230332';
  19.  
  20. // 為防衝突需要, 不必修改
  21. var s = 50;
  22.  
  23. // 以下為腳本
  24.  
  25. var i;
  26. function add_area(id,od){
  27.  
  28. // 人員個人區塊
  29. var area = document.createElement("div");
  30. if(isOnOnly){
  31. area.style = "display: none;";
  32. }
  33. area.className = "FM-rbox14-master " + id + '-is-on';
  34. outerArea.insertBefore(area, outerArea.childNodes[od+2]);
  35.  
  36. // 頭像及連結
  37. var img_link = document.createElement("a");
  38. img_link.href = "https://home.gamer.com.tw/homeindex.php?owner=" + id;
  39. area.appendChild(img_link);
  40. var img = document.createElement("img");
  41. img.src = "https://avatar2.bahamut.com.tw/avataruserpic/" + id[0] + "/" + id[1] + "/" + id + "/" + id + "_s.png";
  42. img.style = "margin-left: 16px; border-radius: 50%;";
  43. img.setAttribute("data-gamercard-userid", id);
  44. img_link.appendChild(img);
  45.  
  46. // 暱稱連結文字
  47. var link = document.createElement("a");
  48. link.className = id + "-nickname";
  49. link.href = "https://home.gamer.com.tw/homeindex.php?owner=" + id;
  50. link.style = "margin-left: 4px;";
  51. link.innerText = id;
  52. area.appendChild(link);
  53.  
  54. // 在線狀態區塊
  55. var ison = document.createElement("span");
  56. ison.style = "margin-left: 4px;";
  57. ison.id = "BMW_" + (od+s);
  58. ison.className = "is-on-bmw";
  59. area.appendChild(ison);
  60. }
  61.  
  62. function ajax_nickname(id){
  63. $.get("/ajax/gamercard.php","u="+id,function f(d){
  64. var jd = JSON.parse(d);
  65. var elems = document.getElementsByClassName(id + "-nickname");
  66. for(i=0; i<elems.length; i++){
  67. elems[i].innerText = jd.nickname;
  68. }
  69. });
  70. }
  71.  
  72. // 調整在線標籤
  73. var css = document.createElement("style");
  74. css.type = "text/css";
  75. css.innerHTML = '.FM-rbox14-master > span[id^="BMW_"] > a > img { width: 42px; height: 15px; margin-left: 4px;}';
  76. document.body.appendChild(css);
  77. var display = isOnOnly;
  78.  
  79. try{
  80. var org = document.getElementsByClassName("FM-rbox14-master")[0];
  81. var outerArea = org.parentNode;
  82. // 若非場外休憩區就從網頁上的板務人員名單讀取並覆蓋原先自定義的名單
  83. if(location.href.split("bsn=")[1].split("&")[0] != bsn){
  84. var ids = document.querySelectorAll(".FM-rbox14-master > a > img");
  85. list = "";
  86. for(i=0; i<ids.length; i++){
  87. list += ids[i].getAttribute("data-gamercard-userid");
  88. if(i != ids.length - 1){
  89. list += ",";
  90. }
  91. }
  92. }
  93. list = list.replace(" ", "").toLowerCase();
  94.  
  95. if(list !== ""){
  96. // 讀取中
  97. if(isOnOnly){
  98. var area = document.createElement("div");
  99. area.className = "FM-rbox14-master is-on-loading";
  100. var ld_text = document.createElement("span");
  101. ld_text.style = "margin-left: 16px;";
  102. ld_text.innerText = "讀取中……";
  103. area.appendChild(ld_text);
  104. outerArea.insertBefore(area, outerArea.childNodes[1]);
  105. }
  106.  
  107. // 產生個人區塊、刪除原版區塊
  108. var ls = list.split(',');
  109. for(i=0; i<ls.length; i++){
  110. add_area(ls[i],i);
  111. }
  112. outerArea.removeChild(org);
  113.  
  114. // 板務人員標題區塊
  115. var title = document.createElement("div");
  116. title.setAttribute("class", "BH-rbox FM-rbox14 is-on-title");
  117. title.style = "margin-bottom: 0px;";
  118. var text = document.createElement("span");
  119. text.innerText = "板務人員";
  120. text.style = "margin-left: 4px; font-weight: bold;";
  121. title.appendChild(text);
  122. var bt = document.createElement("button");
  123. bt.className = "display-switch";
  124. if(isOnOnly){
  125. bt.innerText = "顯示全部";
  126. }else{
  127. bt.innerText = "顯示在線";
  128. }
  129. bt.style = "float: right; font-family: 微軟正黑體; margin-top: 3px; margin-right: 4px; opacity: 0.6; background-color: #0D6073; color: #FFFFFF; border: 1px; border-radius: 2px;";
  130. bt.onclick = function(){
  131. try{
  132. var o_elems = document.getElementsByClassName("is-off");
  133. for(i=0; i<o_elems.length; i++){
  134. var mode;
  135. if(o_elems[i].getAttribute("style").search("display: none;") != -1){
  136. o_elems[i].style = "";
  137. mode = 0;
  138. }else{
  139. o_elems[i].style = "display:none";
  140. mode = 1;
  141. }
  142. if(mode === 0){
  143. document.getElementsByClassName("display-switch")[0].innerText = "顯示在線";
  144. }else{
  145. document.getElementsByClassName("display-switch")[0].innerText = "顯示全部";
  146. }
  147. }
  148. }catch (e){
  149. alert(e);
  150. }
  151. };
  152. title.appendChild(bt);
  153. outerArea.parentNode.insertBefore(title, outerArea);
  154. ls.forEach(function(e){
  155. ajax_nickname(e);
  156. });
  157.  
  158. // 讀取在線狀態
  159. var sc = document.createElement("script");
  160. sc.src = "https://im.gamer.com.tw/bmw/jsIson.php?u=" + ','.repeat(s) + list;
  161. sc.async = false;
  162. outerArea.appendChild(sc);
  163. sc.onload = function() {
  164. var area = document.getElementsByClassName("is-on-bmw");
  165. var count = 0;
  166. for(i=0; i<area.length; i++){
  167. if(area[i].innerHTML.search('/on.gif') != -1){
  168. area[i].parentNode.style = "";
  169. count++;
  170. }else{
  171. area[i].parentNode.className += ' is-off';
  172. if(isOnOnly){
  173. area[i].parentNode.style = "display: none";
  174. }else{
  175. area[i].parentNode.style = "";
  176. }
  177. }
  178. }
  179. text.innerText = "板務人員 (" + count + "/" + ls.length + ")";
  180. };
  181. document.getElementsByClassName("is-on-loading")[0].style = "display: none;";
  182. }
  183. }catch (err){
  184. }