Livetube Handle Cleaner

Livetube配信での目障りな緑コテによるコメントの表示/非表示設定機能を提供する

  1. // ==UserScript==
  2. // @name Livetube Handle Cleaner
  3. // @namespace https://greasyfork.org/ja/users/8279-nistim
  4. // @version 0.21
  5. // @description Livetube配信での目障りな緑コテによるコメントの表示/非表示設定機能を提供する
  6. // @author nistim
  7. // @match *://livetube.cc/*/*
  8. // @match *://*.livetube.cc/*/*
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. (function()
  13. {
  14. // ライブフラグ
  15. var liveFlag = false;
  16. // 配信画面へコテ選択セレクトボックスとボタンを追加する
  17. $("#comment_form").after("緑コテ名<select id='handleList'><option value='invalid'>コテ選択</option></select><button id='toggleVisible' disabled='disabled'>コテ選択</button>");
  18. // 配信がライブ状態の場合
  19. if($("#breadcrumbs .xright").html().indexOf("Live") != -1)
  20. {
  21. // ライブフラグを立てる
  22. liveFlag = true;
  23. }
  24. // コテ選択セレクトボックスの選択時処理
  25. $("#handleList").change(function()
  26. {
  27. // 表示状態コテ選択の場合
  28. if($("#handleList option:selected").val() == "visible")
  29. {
  30. // ボタンのテキストを「非表示」に設定し、有効化する
  31. $("#toggleVisible").text("非表示").removeAttr("disabled");
  32. }
  33. // 非表示状態コテ選択の場合
  34. else if($("#handleList option:selected").val() == "invisible")
  35. {
  36. // ボタンのテキストを「表示」に設定し、有効化する
  37. $("#toggleVisible").text("表示").removeAttr("disabled");
  38. }
  39. // その他の場合
  40. else
  41. {
  42. // ボタンのテキストを「コテ選択」に設定し、無効化する
  43. $("#toggleVisible").text("コテ選択").attr("disabled", "disabled");
  44. }
  45. });
  46. // コテ選択ボタンのクリック時処理
  47. $("#toggleVisible").click(function()
  48. {
  49. // 選択中コテが表示状態の場合
  50. if($("#handleList option:selected").val() == "visible")
  51. {
  52. // オプションの値を「非表示」、文字色を「赤色」に設定する
  53. $("#handleList option:selected").val("invisible").css("color", "red");
  54. // ボタンのテキストを「表示」に設定する
  55. $("#toggleVisible").text("表示");
  56. }
  57. // 選択中コテが非表示状態の場合
  58. else
  59. {
  60. // オプションの値を「表示」、文字色を「緑色」に設定する
  61. $("#handleList option:selected").val("visible").css("color", "green");
  62. // ボタンのテキストを「表示」に設定する
  63. $("#toggleVisible").text("非表示");
  64. }
  65. // コテの表示状態を変更する
  66. changeVisible($("#handleList option:selected").text(), null);
  67. // 自動でスクロールする場合
  68. if($("#auto_scroll_check").is(":checked"))
  69. {
  70. // スクロール処理を実行する
  71. SmoothScroll($("#right_pane"), $("#right_pane_bottom"));
  72. }
  73. });
  74. // #comments直下div要素からのコテ取得
  75. // target:コテ文字列
  76. function getHandle(target)
  77. {
  78. // Liveの場合
  79. if(liveFlag === true)
  80. {
  81. // 取得したコテを返す
  82. return(target.find("div:has(a) > a:first").text());
  83. }
  84. // 録画の場合
  85. else
  86. {
  87. // 取得したコテを返す
  88. return(target.find("div:has(a) > span:first > a:first").text());
  89. }
  90. }
  91. // コテの表示/非表示状態変更処理
  92. // handle:コテ文字列
  93. // target:#comments直下のdiv要素
  94. function changeVisible(handle, target)
  95. {
  96. // 一時取得用コテ
  97. var tmpHandle = null;
  98. // 表示状態値(「継承」)
  99. var displayValue = "inherit";
  100. // コテ選択セレクトボックス内のオプション要素分のループ処理
  101. $("#handleList option").each(function()
  102. {
  103. // テキストとコテが一致する場合
  104. if($(this).text() == handle)
  105. {
  106. // 表示状態が非表示の場合
  107. if($(this).val() == "invisible")
  108. {
  109. // 表示状態値を「非表示」に設定する
  110. displayValue = "none";
  111. }
  112. // 引数に対象が設定されている場合
  113. if(target)
  114. {
  115. // 対象の表示状態を設定する
  116. target.css("display", displayValue);
  117. }
  118. // 引数に対象が設定されていない場合
  119. else
  120. {
  121. // #comments直下のdiv要素分のループ処理
  122. $("#comments > div").each(function()
  123. {
  124. // コメントのdiv要素からコテを取得する
  125. tmpHandle = getHandle($(this));
  126. // コテが一致する場合
  127. if(handle == tmpHandle)
  128. {
  129. // 一致したdiv要素の表示状態を設定する
  130. $(this).css("display", displayValue);
  131. }
  132. });
  133. }
  134. // ループ処理を終了する
  135. return false;
  136. }
  137. });
  138. }
  139. // コメント確認処理
  140. // commentOBJ:#comments直下のdiv要素群
  141. function checkComment(commentOBJ)
  142. {
  143. // コテ
  144. var handle = "";
  145. // コテの登録有無
  146. var handleExist = false;
  147. // コメントオブジェクト分のループ処理
  148. $.each(commentOBJ, function()
  149. {
  150. // コメントからコテを取得する
  151. handle = getHandle($(this));
  152. // コメントにコテが含まれている場合
  153. if(handle)
  154. {
  155. // コテの登録有無を無しで初期化する
  156. handleExist = false;
  157. // コテ選択セレクトボックス内のオプション要素分のループ処理
  158. $("#handleList option").each(function()
  159. {
  160. // コテ選択セレクトボックスにコテが登録済みの場合
  161. if($(this).text() == handle)
  162. {
  163. // コテ登録有りに設定する
  164. handleExist = true;
  165. // ループ処理を終了する
  166. return false;
  167. }
  168. });
  169.  
  170. // コテ選択セレクトボックスにコテが登録されていない場合
  171. if(handleExist === false)
  172. {
  173. // コテ選択セレクトボックスにコテを登録する
  174. $("#handleList").append($("<option>").val("visible").html(handle).css("color", "green"));
  175. }
  176.  
  177. // コテの表示状態を変更する
  178. changeVisible(handle, $(this));
  179. }
  180. });
  181. }
  182. // LoadComments()を上書きするためのwindowを取得する
  183. var root = typeof unsafeWindow == "undefined" ? window : unsafeWindow ;
  184. // Livetubeコメントロード関数を一部改変
  185. root.LoadComments = function()
  186. {
  187. var http = $.ajax(
  188. {
  189. url: comment_shard_host + "/stream/" + comment_entry_id + ".comments." + $("#comments").children().length,
  190. type: "GET",
  191. cache: false
  192. })
  193. .done(function(data, text_status, xhr)
  194. {
  195. var comment_index = $("#comments").children().length;
  196. var initial_load = comment_index == 0;
  197. var header_json = $.parseJSON(xhr.getResponseHeader("X-JSON"));
  198. if(data != null && data.length > 0 && header_json.n == comment_index)
  199. {
  200. /* 追加箇所 **********************************************/
  201. // コメントのデータをDOM要素に変換する
  202. var dataOBJ = $.parseHTML(data);
  203. // 追加されるコメントを確認する
  204. checkComment(dataOBJ);
  205. /*********************************************************/
  206.  
  207. /* 変更箇所 **********************************************/
  208. //$("#comments").append(data);
  209. // コメントのデータを追加する
  210. $("#comments").append(dataOBJ);
  211. /*********************************************************/
  212. if(!$("#display_all_comments_check").is(":checked"))
  213. {
  214. ProcessDisplayAllComment();
  215. }
  216. if(!initial_load && $("#auto_scroll_check").is(":checked"))
  217. {
  218. SmoothScroll($("#right_pane"), $("#right_pane_bottom"));
  219. }
  220. /* 変更箇所 **********************************************/
  221. //$("#comments_num").text(comment_index + $.parseHTML(data).length);
  222. // コメント数を更新する
  223. $("#comments_num").text(comment_index + dataOBJ.length);
  224. /*********************************************************/
  225. if(!$("#display_user_image_check").is(":checked"))
  226. {
  227. ToggleUserImage();
  228. }
  229. if(header_json.vi && $("#viewing"))
  230. {
  231. $("#viewing").text(header_json.vi);
  232. }
  233. if(header_json.v && $("#view"))
  234. {
  235. $("#view").text(header_json.v);
  236. }
  237. if(header_json.cc)
  238. {
  239. if(header_json.marks)
  240. {
  241. DisplayMarks(header_json.marks, header_json.cc);
  242. if(header_json.mark_thresh)
  243. {
  244. DisplayMarkThresh(header_json.mark_thresh);
  245. }
  246. }
  247. else
  248. {
  249. CoolComment(header_json.cc);
  250. }
  251. }
  252. if(header_json.m && $("#mirrors_num"))
  253. {
  254. $("#mirrors_num").text(header_json.m);
  255. }
  256. if(header_json.b && $("#bands"))
  257. {
  258. $("#bands").text(header_json.b);
  259. }
  260. if(header_json.r && $("#mirrors"))
  261. {
  262. RenderRoutes(header_json.r);
  263. }
  264. }
  265. LoadComments();
  266. })
  267. .fail(function(xhr, text_status, error)
  268. {
  269. setTimeout(LoadComments, 4000);
  270. });
  271. };
  272. // 改変前のコメントロード関数で読み込んだコメントを確認する
  273. // 以降のコメントは改変後のコメントロード関数で確認される
  274. checkComment($("#comments").children());
  275. })();