您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Really ignore ignored users, and ignore users in specific topics
当前为
- // ==UserScript==
- // @name Rllmuk Really Ignore Users
- // @description Really ignore ignored users, and ignore users in specific topics
- // @namespace https://github.com/insin/greasemonkey/
- // @version 6
- // @match https://www.rllmukforum.com/index.php*
- // ==/UserScript==
- function addStyle(css) {
- let $style = document.createElement('style')
- $style.appendChild(document.createTextNode(css))
- document.querySelector('head').appendChild($style)
- }
- function TopicPage() {
- let topicId = document.body.dataset.pageid
- let ignoredUserIds = JSON.parse(localStorage.ignoredUserIds || '[]')
- let ignoredUsersInTopics = JSON.parse(localStorage.ignoredUsersInTopics || '{}')
- let topicIgnoredUserIds = []
- if (ignoredUsersInTopics[topicId]) {
- topicIgnoredUserIds = ignoredUsersInTopics[topicId].users.map(user => user.id)
- ignoredUserIds.push(...topicIgnoredUserIds)
- }
- // Hide "You've chosen to ignore content by <ignored user>"
- addStyle(`
- .ipsComment_ignored {
- display: none;
- }
- `)
- // Hide posts containing elements which have an ignored user id as a specified
- // data attribute.
- function hidePostsByDataAttribute(elements, dataAttribute) {
- elements.forEach(el => {
- if (!ignoredUserIds.includes(el.dataset[dataAttribute])) return
- let post = el.closest('article.ipsComment')
- if (post.style.display == 'none') return
- post.style.display = 'none'
- })
- }
- // Hide posts which quote ignored users
- function processQuotes(context) {
- hidePostsByDataAttribute(
- context.querySelectorAll('[data-ipsquote-userid]'),
- 'ipsquoteUserid'
- )
- }
- // Hide posts which @-mention ignored users
- function processMentions(context) {
- hidePostsByDataAttribute(
- context.querySelectorAll('[data-mentionid]'),
- 'mentionid'
- )
- }
- // Hide posts by users ignored in this specific topic
- function processTopicIgnoredPosts(context = document) {
- if (topicIgnoredUserIds.length == 0) return
- let postAvatarLinks = context.querySelectorAll('li.cAuthorPane_photo a')
- postAvatarLinks.forEach(el => {
- let userId = /profile\/(\d+)/.exec(el.href)[1]
- if (!topicIgnoredUserIds.includes(userId)) return
- let post = el.closest('article.ipsComment')
- if (post.style.display == 'none') return
- post.style.display = 'none'
- })
- }
- // Hide the unread comment separator if all subsequent posts are hidden
- function updateUnreadCommentSeparator() {
- let separator = document.querySelector('hr.ipsCommentUnreadSeperator')
- if (!separator) return
- let hasVisiblePost = false
- let sibling = separator.nextElementSibling
- while (sibling) {
- if (sibling.matches('article.ipsComment') &&
- !sibling.classList.contains('ipsHide') &&
- sibling.style.display != 'none') {
- hasVisiblePost = true
- break
- }
- sibling = sibling.nextElementSibling
- }
- separator.style.display = hasVisiblePost ? '' : 'none'
- }
- // Process all posts on the current page
- function processPosts(context = document) {
- processQuotes(context)
- processMentions(context)
- processTopicIgnoredPosts(context)
- }
- // Process initial posts
- processPosts()
- updateUnreadCommentSeparator()
- // Add a new control to a user's hover card to ignore them in this topic
- function processHoverCard($el) {
- if (!$el.classList.contains('ipsHovercard')) return
- // Create a new "Topic Ignore" control
- let $topicIgnoreItem = document.createElement('li')
- $topicIgnoreItem.innerHTML = `<a href="#">
- <i class="fa fa-times-circle"></i> Topic Ignore
- </a>`
- let $ignoreLink = $topicIgnoreItem.querySelector('a')
- $ignoreLink.addEventListener('click', (e) => {
- e.preventDefault()
- let topicName = document.querySelector('.ipsType_pageTitle').innerText
- let user = {
- id: /profile\/(\d+)/.exec($el.querySelector('a').href)[1],
- name: $el.querySelector('h2').innerText,
- avatar: $el.querySelector('img.ipsUserPhoto').src,
- }
- // Add the user to the ignored users config for this topic
- let ignoredUsersInTopics = JSON.parse(localStorage.ignoredUsersInTopics || '{}')
- if (ignoredUsersInTopics[topicId] == undefined) {
- ignoredUsersInTopics[topicId] = {
- name: topicName,
- users: [],
- }
- }
- ignoredUsersInTopics[topicId].name = topicName
- ignoredUsersInTopics[topicId].users.push(user)
- localStorage.ignoredUsersInTopics = JSON.stringify(ignoredUsersInTopics)
- // Apply the new ignored user settings
- ignoredUserIds.push(user.id)
- topicIgnoredUserIds.push(user.id)
- processPosts()
- updateUnreadCommentSeparator()
- // Hide the hover card
- $el.style.display = 'none'
- })
- // Insert the new control into the hover card
- let $findContentItem = $el.querySelector('ul.ipsList_inline li:last-child')
- $findContentItem.parentNode.insertBefore($topicIgnoreItem, $findContentItem)
- }
- // Watch for posts being replaced when paging
- new MutationObserver(mutations =>
- mutations.forEach(mutation => {
- if (mutation.oldValue == 'true') {
- processPosts()
- updateUnreadCommentSeparator()
- }
- })
- ).observe(document.querySelector('div.cTopic'), {
- attributes: true,
- attributeFilter: ['animating'],
- attributeOldValue: true,
- })
- // Watch for new posts being loaded into the current page
- new MutationObserver(mutations => {
- mutations.forEach(mutation =>
- mutation.addedNodes.forEach(processPosts)
- )
- updateUnreadCommentSeparator()
- }).observe(document.querySelector('#elPostFeed > form'), {
- childList: true,
- })
- // Watch for user hover cards being added for display
- new MutationObserver(mutations => {
- mutations.forEach(mutation =>
- mutation.addedNodes.forEach(processHoverCard)
- )
- }).observe(document.body, {
- childList: true,
- })
- }
- function IgnoredUsersPage() {
- // Sync ignored user ids
- localStorage.ignoredUserIds = JSON.stringify(
- Array.from(document.querySelectorAll('[data-ignoreuserid]')).map(el =>
- el.dataset.ignoreuserid
- )
- )
- // Add a new section to manage users ignored in specific topics
- let $mainArea = document.querySelector('#ipsLayout_mainArea')
- $mainArea.appendChild(document.createElement('br'))
- let $div = document.createElement('div')
- $div.className = 'ipsBox'
- function populateIgnoredUsersInTopics() {
- let ignoredUsersInTopics = JSON.parse(localStorage.ignoredUsersInTopics || '{}')
- $div.innerHTML = `
- <h2 class="ipsType_sectionTitle ipsType_reset ipsClear">Users currently being ignored in specific topics</h2>
- <ol class="ipsDataList ipsGrid ipsGrid_collapsePhone ipsClear" data-role="tableRows">
- </ol>`
- let $ol = $div.querySelector('ol')
- if (Object.keys(ignoredUsersInTopics).length == 0) {
- $ol.innerHTML = `<li class="ipsDataItem">
- <div class="ipsType_light ipsType_center ipsPad">
- <br>
- <br>
- You're not currently ignoring any users in specific topics.
- </div>
- </li>`
- }
- for (let [topicId, topicConfig] of Object.entries(ignoredUsersInTopics)) {
- for (let user of topicConfig.users) {
- let $li = document.createElement('li')
- $li.className = 'ipsDataItem ipsGrid_span6 ipsFaded_withHover'
- $li.innerHTML = `
- <p class="ipsType_reset ipsDataItem_icon">
- <a href="https://www.rllmukforum.com/index.php?/profile/${user.id}" class="ipsUserPhoto ipsUserPhoto_tiny">
- <img src="${user.avatar}" alt="${user.name}">
- </a>
- </p>
- <div class="ipsDataItem_main">
- <h4 class="ipsDataItem_title"><strong>${user.name}</strong></h4>
- <ul class="ipsList_inline">
- <li class="ipsType_light">
- in <a href="https://www.rllmukforum.com/index.php?/topic/${topicId}">
- ${topicConfig.name}
- </a>
- </li>
- <li>
- <a href="#" class="unignore ipsPos_middle ipsType_blendLinks">
- <i class="fa fa-times-circle"></i> Stop ignoring
- </a>
- </li>
- </ul>
- </div>`
- $li.querySelector('a.unignore').addEventListener('click', (e) => {
- e.preventDefault()
- let ignoredUsersInTopics = JSON.parse(localStorage.ignoredUsersInTopics || '{}')
- if (!ignoredUsersInTopics[topicId]) return populateIgnoredUsersInTopics()
- let index = ignoredUsersInTopics[topicId].users.findIndex(u => u.id == user.id)
- if (index == -1) return populateIgnoredUsersInTopics()
- ignoredUsersInTopics[topicId].users.splice(index, 1)
- if (ignoredUsersInTopics[topicId].users.length == 0) {
- delete ignoredUsersInTopics[topicId]
- }
- localStorage.ignoredUsersInTopics = JSON.stringify(ignoredUsersInTopics)
- populateIgnoredUsersInTopics()
- })
- $ol.appendChild($li)
- }
- }
- $mainArea.appendChild($div)
- }
- populateIgnoredUsersInTopics()
- }
- let page
- if (location.href.includes('index.php?/topic/')) {
- page = TopicPage
- } else if (location.href.includes('index.php?/ignore/')) {
- page = IgnoredUsersPage
- }
- if (page) {
- page()
- }