您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add a thread delay to the Arsenal Mania forum
// ==UserScript== // @name Arsenal Mania thread delay // @namespace http://tampermonkey.net/ // @version 1.0 // @description Add a thread delay to the Arsenal Mania forum // @author lufere7 // @match https://arsenal-mania.com/forum/* // @grant none // ==/UserScript== (function() { 'use strict'; const colors = { navy: 'rgb(32, 43, 54)', borderGray: 'rgb(127, 127, 127)', darkRed: 'rgb(136, 0, 0)', gray: 'rgb(148, 148, 148)', white: 'rgb(253, 253, 253)', } const styles = { container: ` display: flex; align-items: center; `, inputsContainer: ` margin-left: 8px; display: flex; justify-content: center; align-items: center; background-color: ${colors.gray}; padding: 4px 12px; border-radius: 4px; min-height: 34px; `, wrapper: ` display: flex; flex-direction: column; justify-content: center; align-items: center; `, input: ` width: 60px; background-color: ${colors.navy}; color: ${colors.white}; border: 1px solid ${colors.borderGray}; border-radius: 4px; padding-left: 8px; `, label: ` color: ${colors.navy}; font-weight: bold; font-size: 12px; margin-bottom: -2px; `, secondWrapper: ` display: flex; flex-direction: column; `, setDelayButton: ` border: 1px solid ${colors.borderGray}; background-color: ${colors.darkRed}; color: ${colors.white}; border-radius: 6px; cursor: pointer; padding: 8px 10px; font-size: 13px; font-family: Helvetica, Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; `, banner: ` border: 2px solid black; width: 100%; height: 30px; background-color: goldenrod; color: black; display: flex; justify-content: center; align-items: center; font-weight: bold; `, enabledCheckbox: ` margin-right: 8px; margin-top: 4px; accent-color: ${colors.darkRed}; `, hideableWrapper: ` display: flex; margin-left: 8px; `, } let globalTimeout; const hidePosts = (delay) => { const isEnabled = document.getElementById('enabled').checked; const hiddenPosts = [] const postsArray = Array.from(document.querySelectorAll('article.message')) const currentDate = Date.now()/1000 clearTimeout(globalTimeout) postsArray.forEach((post) => { const postDate = Number(post.querySelector('.u-dt').getAttribute('data-time')) const secondsAgo = currentDate - postDate if(secondsAgo < delay){ post.style.transition = 'opacity 0s' post.style.opacity = 0 post.style.border = '1px solid goldenrod' if(!hiddenPosts.length) { const secondsUntilPost = delay - secondsAgo globalTimeout = setTimeout(() => { hidePosts(delay) }, secondsUntilPost*1000); } hiddenPosts.push(post) } else { post.style.opacity = 1 post.style.transition = 'opacity 2s' if(!isEnabled) post.style.border = `1px solid ${colors.borderGray}` } }) removeBanner() if(!hiddenPosts.length && isEnabled) appendBanner() } const initialCheck = () => { const storedMinutes = localStorage.getItem('delayMinutes') const storedSeconds = localStorage.getItem('delaySeconds') const enabled = localStorage.getItem('enabled') const isEnabled = JSON.parse(enabled) toggleVisibility(isEnabled) if(storedMinutes || storedSeconds) { let storedTime = 0 if(storedMinutes) { storedTime += Number(storedMinutes)*60 const minuteInput = document.getElementById('minuteInput') minuteInput.value = Number(storedMinutes); } if(storedSeconds) { storedTime += Number(storedSeconds) const secondInput = document.getElementById('secondInput') secondInput.value = Number(storedSeconds); } if(isEnabled) { const checkbox = document.getElementById('enabled'); checkbox.checked = true; hidePosts(storedTime) } } } const onSubmit = () => { const isEnabled = document.getElementById('enabled').checked; const minuteInput = document.querySelector('#minuteInput').value const secondInput = document.querySelector('#secondInput').value const minutes = Number(minuteInput) const seconds = Number(secondInput) localStorage.setItem('delayMinutes', minuteInput) localStorage.setItem('delaySeconds', secondInput) const totalDelay = (minutes*60)+seconds if(isEnabled)hidePosts(totalDelay) } const onEnable = (event) => { const isEnabled = event.target.checked localStorage.setItem('enabled', isEnabled) const inputsExist = document.getElementById('setDelayButton') if(isEnabled) { toggleVisibility(true) onSubmit() }else{ hidePosts(0) toggleVisibility(false) } } const appendBanner = () => { const postContainer = document.querySelector('#top > div.xb-page-wrapper.xb-canvas-menuActive > div.xb-content-wrapper > div.p-body > div > div > div.p-body-content > div.p-body-pageContent > div.block.block--messages > div.block-container.lbContainer') const banner = document.createElement('div') banner.style.cssText = styles.banner; banner.innerHTML='No more hidden posts' banner.setAttribute('id', 'banner'); postContainer.append(banner) } const removeBanner = () => { const banner = document.getElementById('banner') if(banner)banner.remove() } const toggleVisibility = (enabled) => { const hideableWrapper = document.getElementById('hideableWrapper') hideableWrapper.style.display = enabled ? 'flex' : 'none'; } const createInputs = () => { const container = document.querySelector('#top > div.xb-page-wrapper.xb-canvas-menuActive > div.xb-content-wrapper > div.p-body > div > div > div.p-body-content > div.p-body-pageContent > div.block.block--messages > div.block-outer.block-outer--after > div.block-outer-main') container.style.cssText = styles.container; const inputsContainer = document.createElement('div') inputsContainer.style.cssText = styles.inputsContainer; const enabledWrapper = document.createElement('div'); enabledWrapper.style.cssText = styles.wrapper; const enabledCheckbox = document.createElement('input'); enabledCheckbox.setAttribute('label', 'enabled'); enabledCheckbox.setAttribute('type', 'checkbox'); const enabledLabel = document.createElement('label') enabledLabel.textContent = 'Enable' enabledLabel.style.cssText = styles.label; enabledCheckbox.style.cssText = styles.enabledCheckbox; enabledCheckbox.setAttribute('id', 'enabled'); enabledCheckbox.addEventListener('click', onEnable) enabledWrapper.append(enabledLabel, enabledCheckbox) const minuteWrapper = document.createElement('div'); minuteWrapper.setAttribute('id', 'minuteWrapper') minuteWrapper.style.cssText = styles.wrapper; const minuteLabel = document.createElement('label'); minuteLabel.style.cssText = styles.label; minuteLabel.textContent = 'Minutes' const minuteInput = document.createElement('input'); minuteInput.setAttribute('label', 'minutes'); minuteInput.setAttribute('type', 'number'); minuteInput.setAttribute('id', 'minuteInput'); minuteInput.style.cssText = styles.input; minuteWrapper.append(minuteLabel, minuteInput) const secondWrapper = document.createElement('div'); secondWrapper.setAttribute('id', 'secondWrapper') secondWrapper.style.cssText = styles.wrapper; const secondLabel = document.createElement('label'); secondLabel.textContent = 'Seconds' secondLabel.style.cssText = styles.label; const secondInput = document.createElement('input'); secondInput.setAttribute('label', 'seconds'); secondInput.setAttribute('type', 'number'); secondInput.setAttribute('id', 'secondInput'); secondInput.style.cssText = styles.input; secondWrapper.append(secondLabel, secondInput) const setDelayButton = document.createElement('button'); setDelayButton.setAttribute('id', 'setDelayButton') setDelayButton.textContent = 'Set delay' setDelayButton.addEventListener('click', onSubmit) setDelayButton.style.cssText = styles.setDelayButton; const hideableWrapper = document.createElement('div') hideableWrapper.setAttribute('id', 'hideableWrapper'); hideableWrapper.style.cssText = styles.hideableWrapper; hideableWrapper.append(minuteWrapper, secondWrapper, setDelayButton) inputsContainer.append(enabledWrapper, hideableWrapper) container.append(inputsContainer) } createInputs() initialCheck() })();