NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Block Bad Guys on Bangumi.tv (Alpha) // @description You can (not) see me (bgm38). // @copyright gyakkun // @license MIT // @version 0.1.4 // @match *://bangumi.tv/* // @match *://bgm.tv/* // @match *://chii.in/* // @updateURL https://openuserjs.org/meta/gyakkun/Block_Bad_Guys_on_Bangumi.tv_(Alpha).meta.js // @grant none // ==/UserScript== (function () { //'use strict'; var PATH = window.location.pathname; var BLOCK_USERNAME_LIST = []; var BLOCK_UID_LIST = []; try { if (!!localStorage["blockUsernameList"]) { BLOCK_USERNAME_LIST = JSON.parse(localStorage["blockUsernameList"]); } else { localStorage["blockUsernameList"] = []; } if (!!localStorage["blockUidList"]) { BLOCK_UID_LIST = JSON.parse(localStorage["blockUidList"]); } else { localStorage["blockUidList"] = []; } } catch (err) { console.error(err); } //URLs var INDEX_URL = /^\/$/; var TIMELINE_URL = /\/timeline/; var THREAD_URL = /\/(ep|blog|subject|group)/; var CATEGORY_URL = /\/(anime|book|music|real)/; var SETTINGS_URL = /^\/settings$/; var GROUP_INDEX_URL = /^\/group$/; var GROUP_THREAD_LIST_URL = /^\/group\/(\w+)$/; var GROUP_THREAD_FORUM_URL = /^\/group\/(\w+)\/forum/; var USER_HOMEPAGE_URL = /^\/user\/(\w+)$/; //Selectors var INDEX_TIMELINE_AVATAR_SELECTOR = "#timeline > ul > li > span > a > span"; var INDEX_THREAD_AVATAR_SELECTOR = "div > ul > li > a > img"; var INDEX_TIMELINE_USERNAME_SELECTOR = "#timeline > ul > li > span > a"; var THREAD_AVATAR_SELECTOR = "div[id^='post_'] > a.avatar "; var SUBJECT_BLOG_USERNAME_SELECTOR = "#entry_list > div > div > div.time > span > a"; var SUBJECT_THREAD_USERNAME_SELECTOR = "#columnSubjectHomeB > div > table > tbody > tr > td > a"; var SUBJECT_COLLECT_USERNAME_SELECTOR = "#subjectPanelCollect > ul > li > div > a"; var SUBJECT_INDEX_USERNAME_SELECTOR = "#subjectPanelIndex > ul > li > a"; var SUBJECT_INDEX_DETAIL_PAGE_USERNAME_SELECTOR = "#timeline > ul > li > span.info.clearit > span > a"; var SUBJECT_RATING_USERNAME_SELECTOR = "#memberUserList > li > div > strong > a"; var SUBJECT_COMMENT_DETAIL_PAGE_USERNAME_SELECTOR = "#comment_box > div > a"; var CATEGORY_DOING_USERNAME_SELECTOR = "#columnA > div.section > div > ul.coversSmall > li > p > a"; var CATEGORY_BLOG_USERNAME_SELECTOR = "#news_list > div > div > div.time > small.blue > a"; var CATEGORY_THREAD_USERNAME_SELECTOR = "#columnA > div > table > tbody > tr > td > a"; var GROUP_INDEX_USERNAME_SELECTOR = "#columnA > table > tbody > tr > td > small.sub_title > a"; var GROUP_THREAD_LIST_USERNAME_SELECTOR = "#columnA > table > tbody > tr > td.author > a"; var GROUP_FORUM_USERNAME_SELECTOR = "#columnA > table > tbody > tr > td.author > a"; var USER_HOMEPAGE_HEADER_BUTTON_DIV = "#headerProfile > div > div.headerContainer > h1 > div.inner > div.actions"; var USER_HOMEPAGE_USER_AVATAR_SPAN = "#headerProfile > div > div.headerContainer > h1 > div.headerAvatar > a > span"; //Regexes var USERNAME_REG = /user\/(.+)/; var AVATAR_UID_REG = /pic\/user\/.+\/\d+\/\d+\/\d+\/(\d+)\.jpg/; var GetFuntionSelfName = function () { return arguments.callee.name; }; var GetFinalCallerName = function (functionSelf) { var finalCaller = functionSelf.caller.name; while (finalCaller == "" || finalCaller == "each") { functionSelf = functionSelf.caller.arguments.callee; finalCaller = functionSelf.caller.name; } return finalCaller; }; var RemoveByUsername = function (obj, selectorToRemove) { try { var username = obj.attr("href").match(USERNAME_REG)[1]; console.debug("[gyakkun] username " + username) if ($.inArray(username, BLOCK_USERNAME_LIST) >= 0) { obj.closest(selectorToRemove).hide(); console.warn(username + " was removed by username, " + "called by function " + RemoveByUsername.caller.name + "."); return true; } } catch (err) { console.error("[gyakkun] err: " + err) } return false; }; var RemoveByUid = function (obj, selectorToRemove, targetAttr) { try { var userIdNotNumber = obj.attr(targetAttr); if (!!userIdNotNumber) { var isMatch = !!userIdNotNumber.match(AVATAR_UID_REG) && userIdNotNumber.match(AVATAR_UID_REG).length > 0; if (isMatch) { userIdNotNumber = userIdNotNumber.match(AVATAR_UID_REG)[1] } } else { userIdNotNumber = "-1" } var userId = Number(userIdNotNumber); console.debug("[gyakkun] userId " + userId) var usernameInDataUserAttr = obj.attr("data-user"); var dataUser = new Date().toISOString() // Give it an invalid default value console.debug("[gyakkun] usernameInDataUserAttr " + usernameInDataUserAttr); if (!!usernameInDataUserAttr) { dataUser = usernameInDataUserAttr } console.debug("[gyakkun] dataUser " + dataUser); if ($.inArray(userId, BLOCK_UID_LIST) >= 0 || $.inArray(dataUser, BLOCK_USERNAME_LIST) >= 0) { console.warn("[gyakkun] Removing by dataUser " + dataUser); obj.closest(selectorToRemove).hide(); console.warn(userId + " was removed by uid, " + "called by function " + RemoveByUid.caller.name + "."); return true; } } catch (err) { console.error("[gyakkun] err: " + err); } return false; }; var OddEvenClassInnerHandler = function (obj, selector, oddClass, evenClass) { console.warn("Odd/even class inner handled from function " + GetFinalCallerName(OddEvenClassInnerHandler) + "."); obj.find(selector).each(function () { if ($(this).hasClass(oddClass)) { $(this).removeClass(oddClass); $(this).addClass(evenClass); } else { $(this).removeClass(evenClass); $(this).addClass(oddClass); } }); }; var OddOrEvenClassOuterHandler = function (obj, selector, OddOrEvenClass) { //This function only add/remove one class which is odd/even related. console.warn("Odd/even class outer handled from function " + GetFinalCallerName(OddOrEvenClassOuterHandler) + "."); obj.closest(selector).nextAll().each(function () { if ($(this).hasClass(OddOrEvenClass)) { $(this).removeClass(OddOrEvenClass); } else { $(this).addClass(OddOrEvenClass); } }); }; var RemoveUidIndexTimeline = function () { var that = $(this); RemoveByUid(that, "li.clearit", "style"); }; var RemoveUidIndexThread = function () { var that = $(this); RemoveByUid(that, "li.clearit", "src"); }; var RemoveUsernameIndexTimeline = function () { var that = $(this); RemoveByUsername(that, "li.clearit"); }; var RemoveCommentFromThread = function () { var that = $(this); RemoveByUsername(that, "div[id^='post_']"); }; var RemoveBlogFromSubject = function () { var that = $(this); RemoveByUsername(that, "div.clearit"); }; var RemoveThreadFromSubject = function () { var that = $(this); RemoveByUsername(that, "tr"); }; var RemoveDoingFromSubject = function () { var that = $(this); RemoveByUsername(that, "li.clearit"); }; var RemoveIndexFromSubject = function () { var that = $(this); RemoveByUsername(that, "li.clearit"); }; var RemoveIndexFromSubjectIndexDetailPage = function () { var that = $(this); RemoveByUsername(that, "li.clearit"); }; var RemoveBlogFromCategory = function () { var that = $(this); var isSuccess = RemoveByUsername(that, "div.item"); if (isSuccess) { OddOrEvenClassOuterHandler(that, "div.item", "odd"); } }; var RemoveRatingFromSubject = function () { var that = $(this); var isSuccess = RemoveByUsername(that, "li.user"); if (isSuccess) { OddOrEvenClassOuterHandler(that, "li.user", "odd"); } }; var RemoveCommetFromSubjectCommentDetailPage = function () { var that = $(this); var isSuccess = RemoveByUsername(that, "div.clearit"); if (isSuccess) { that.closest("div.clearit").nextAll().each(function () { OddEvenClassInnerHandler($(this), "> div[class^='text_main']", "text_main_odd", "text_main_even"); OddEvenClassInnerHandler($(this), "> a > span.avatarNeue", "ll", "rr"); }); } }; var RemoveDoingFromCategory = function () { var that = $(this); RemoveByUsername(that, "li.clearit"); }; var RemoveThreadFromCategory = function () { var that = $(this); var isSuccess = RemoveByUsername(that, "tr"); if (isSuccess) { that.closest("tr").nextAll().each(function () { OddEvenClassInnerHandler($(this), ">td", "odd", "even"); }); } }; var RemoveThreadFromGroupIndex = function () { var that = $(this); var isSuccess = RemoveByUsername(that, "tr"); if (isSuccess) { that.closest("tr").nextAll().each(function () { OddEvenClassInnerHandler($(this), "> td", "odd", "even"); }); } }; var RemoveThreadFromGroupThreadList = RemoveThreadFromGroupIndex; var RemoveThreadFromGroupForum = RemoveThreadFromGroupIndex; var StoreBlockList = function () { localStorage["blockUsernameList"] = '["' + BLOCK_USERNAME_LIST.join('","') + '"]'; localStorage["blockUidList"] = '[' + BLOCK_UID_LIST + ']'; console.debug("Block UID List Updated: " + localStorage["blockUidList"]); console.debug("Block Username List Updated: " + localStorage["blockUsernameList"]); } var AddBlockitButtonInUserHomePage = function () { $(USER_HOMEPAGE_HEADER_BUTTON_DIV) .append("<a class=\"blockit chiiBtn\"><span class=\"blockitspan\">加入屏蔽</span></a>") var userNameOrIdFromUrl = PATH.match(USER_HOMEPAGE_URL)[1]; var styleAttr = $(USER_HOMEPAGE_USER_AVATAR_SPAN).attr("style"); var isStyleMatch = !!styleAttr.match(AVATAR_UID_REG) && styleAttr.match(AVATAR_UID_REG).length > 0; var userIdFromAvatar = isStyleMatch ? parseInt(styleAttr.match(AVATAR_UID_REG)[1]) : -1; if (userIdFromAvatar == -1 && !isNaN(parseInt(userNameOrIdFromUrl))) { userIdFromAvatar = parseInt(userNameOrIdFromUrl); } var isBlocked = (userIdFromAvatar == -1 || $.inArray(userIdFromAvatar, BLOCK_UID_LIST) >= 0 ) && $.inArray(userNameOrIdFromUrl, BLOCK_USERNAME_LIST) >= 0; var onBlocked = function () { console.debug("[gyakkun] onBlocked") if (userIdFromAvatar != -1) { var uidIdx = BLOCK_UID_LIST.indexOf(userIdFromAvatar); console.debug("[gyakkun] uidIdx " + uidIdx) if (uidIdx >= 0) { BLOCK_UID_LIST.splice(uidIdx, 1); console.debug("[gyakkun] buidl " + BLOCK_UID_LIST) } } var usnIdx = BLOCK_USERNAME_LIST.indexOf(userNameOrIdFromUrl); console.debug("[gyakkun] usnIdx " + usnIdx) if (usnIdx >= 0) { BLOCK_USERNAME_LIST.splice(usnIdx, 1); console.debug("[gyakkun] busnl " + BLOCK_USERNAME_LIST) } StoreBlockList(); window.alert("已解除屏蔽"); $(".blockitspan").html("加入屏蔽"); $(".blockit").unbind(); $(".blockit").click(onNotBlocked); } var onNotBlocked = function () { console.debug("[gyakkun] onNotBlocked") if (userIdFromAvatar != -1 && $.inArray(userIdFromAvatar, BLOCK_UID_LIST) < 0) { BLOCK_UID_LIST.push(userIdFromAvatar); } if ($.inArray(userNameOrIdFromUrl, BLOCK_USERNAME_LIST) < 0) { BLOCK_USERNAME_LIST.push(userNameOrIdFromUrl); } StoreBlockList(); window.alert("成功加入屏蔽列表"); $(".blockitspan").html("解除屏蔽"); $(".blockit").unbind(); $(".blockit").click(onBlocked); } if (isBlocked) { console.debug("[gyakkun] BLOCK_UID_LIST " + JSON.stringify(BLOCK_UID_LIST)) console.debug("[gyakkun] userIdFromAvatar " + userIdFromAvatar) console.debug("[gyakkun] BLOCK_USERNAME_LIST " + JSON.stringify(BLOCK_USERNAME_LIST)) console.debug("[gyakkun] userNameOrIdFromUrl " + userNameOrIdFromUrl) $(".blockitspan").html("解除屏蔽"); $(".blockit").click(onBlocked); } else { $(".blockit").click(onNotBlocked); } } if (PATH.match(TIMELINE_URL) !== null || PATH.match(INDEX_URL) !== null) { $(INDEX_TIMELINE_AVATAR_SELECTOR).each(RemoveUidIndexTimeline); $(INDEX_TIMELINE_USERNAME_SELECTOR).each(RemoveUsernameIndexTimeline); $(INDEX_THREAD_AVATAR_SELECTOR).each(RemoveUidIndexThread); } if (PATH.match(GROUP_INDEX_URL) !== null) { $(GROUP_INDEX_USERNAME_SELECTOR).each(RemoveThreadFromGroupIndex); } if (PATH.match(GROUP_THREAD_LIST_URL) !== null) { $(GROUP_THREAD_LIST_USERNAME_SELECTOR).each(RemoveThreadFromGroupThreadList); } if (PATH.match(GROUP_THREAD_FORUM_URL) !== null) { $(GROUP_FORUM_USERNAME_SELECTOR).each(RemoveThreadFromGroupForum); } if (PATH.match(THREAD_URL) !== null) { $(THREAD_AVATAR_SELECTOR).each(RemoveCommentFromThread); $(SUBJECT_BLOG_USERNAME_SELECTOR).each(RemoveBlogFromSubject); $(SUBJECT_THREAD_USERNAME_SELECTOR).each(RemoveThreadFromSubject); $(SUBJECT_COLLECT_USERNAME_SELECTOR).each(RemoveDoingFromSubject); $(SUBJECT_INDEX_USERNAME_SELECTOR).each(RemoveIndexFromSubject); $(SUBJECT_INDEX_DETAIL_PAGE_USERNAME_SELECTOR).each(RemoveIndexFromSubjectIndexDetailPage); $(SUBJECT_RATING_USERNAME_SELECTOR).each(RemoveRatingFromSubject); $(SUBJECT_COMMENT_DETAIL_PAGE_USERNAME_SELECTOR).each(RemoveCommetFromSubjectCommentDetailPage); } if (PATH.match(CATEGORY_URL) !== null) { $(CATEGORY_DOING_USERNAME_SELECTOR).each(RemoveDoingFromCategory); $(CATEGORY_BLOG_USERNAME_SELECTOR).each(RemoveBlogFromCategory); $(CATEGORY_THREAD_USERNAME_SELECTOR).each(RemoveThreadFromCategory); } if (PATH.match(USER_HOMEPAGE_URL) !== null) { AddBlockitButtonInUserHomePage(); } if (PATH.match(SETTINGS_URL) !== null) { /*jshint multistr: true */ $("#columnA > form > span > table > tbody > tr:nth-last-child(2)").after('\ <tr>\ <td valign="top" width="12%">\ <h2 class="subtitle">屏蔽列表</h2>\ </td>\ <td valign="top"></td>\ </tr>\ <tr>\ <td valign="top" width="12%">Block UID List</td>\ <td valign="top">\ <input id="buidl" name="Block UID List" class="inputtext" type="text" value="" style="width:380px;">\ </td>\ </tr>\ <tr>\ <td valign="top" width="12%">Block Username List</td>\ <td valign="top">\ <input id="busrnl" name="Block UID List" class="inputtext" type="text" value="" style="width:380px;">\ </td>\ </tr>\ <tr>\ <td valign="top" width="12%">注意</td>\ <td valign="top">请填入需要屏蔽用户的用户名(username), 以英语逗号分隔, 如: laoism, acgism</br></br>\ 用户名可以根据用户详情页url得到, 如 https://bgm.tv/user/Example</br>\ 则该用户的的用户名为Example。</br>\ 用户名也可在用户详情页头像旁的@xxxx处得到, xxxx即为用户名。</br></br>\ 如需屏蔽首页右侧指定用户小组动态, 请在Block UID List填入该用户的UID</br></br>\ UID可从用户头像得到, 如 https://lain.bgm.tv/pic/user/l/000/01/43/14382.jpg?r=1497204837</br>\ 则该用户UID为14382。</br>\ 可使用用户页右上角的"加入屏蔽"/"解除屏蔽"按扭来控制。\ </br>\ </td>\ </tr>\ '); $("#buidl").attr("value", BLOCK_UID_LIST); $("#busrnl").attr("value", BLOCK_USERNAME_LIST); $("input[type='submit']").click(function () { BLOCK_USERNAME_LIST = $("#busrnl").attr("value").replace(/\s+/g, "").split(","); BLOCK_UID_LIST = []; BLOCK_USERNAME_LIST.forEach(function (item, index, input) { if (!isNaN(parseInt(item))) { BLOCK_UID_LIST.push(parseInt(item)); } }); StoreBlockList(); }); } //TODO: Intercept XHR to timeline page. })();