您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
将摸鱼室聊天界面改造成终端风格(黑白版),方便摸鱼,默认不启用终端风格,按ESC键切换
// ==UserScript== // @name 摸鱼室终端风格-黑白版 // @namespace http://tampermonkey.net/ // @version 1.1.7 // @description 将摸鱼室聊天界面改造成终端风格(黑白版),方便摸鱼,默认不启用终端风格,按ESC键切换 // @author Claude // @match https://fish.codebug.icu/chat // @match https://yucoder.cn/chat // @icon https://www.google.com/s2/favicons?sz=64&domain=codebug.icu // @grant none // ==/UserScript== (function () { "use strict"; // 创建并添加终端风格的CSS,但先不应用 const terminalCSS = ` /* 整体背景和字体 */ body { background-color: #0c0c0c !important; color: #d0d0d0 !important; font-family: 'Courier New', monospace !important; } /* 聊天容器样式 */ .messageContainer___zUc1q { background-color: #0c0c0c !important; border: 1px solid #555 !important; border-radius: 0 !important; padding: 10px !important; max-height: 85vh !important; } /* 消息项样式 - 改为单行终端风格 */ .messageItem___UXffF { background-color: transparent !important; border-bottom: 1px dashed #444 !important; padding: 5px 0 !important; margin-bottom: 5px !important; display: flex !important; flex-direction: row !important; align-items: center !important; flex-wrap: nowrap !important; } /* 隐藏头像 */ .avatar___zrh3f { display: none !important; } /* 消息头部样式 */ .messageHeader___ABpsT { display: inline-flex !important; align-items: center !important; margin-right: 5px !important; order: 2 !important; width: 150px !important; /* 固定宽度 */ min-width: 150px !important; /* 防止缩小 */ flex-shrink: 0 !important; /* 防止缩小 */ } /* 用户名样式 */ .senderName___s5UP3 { color: #4CAF50 !important; font-weight: bold !important; margin-right: 5px !important; width: 120px !important; /* 固定宽度,最多显示10个汉字 */ min-width: 120px !important; /* 防止缩小 */ display: inline-block !important; overflow: hidden !important; text-overflow: ellipsis !important; white-space: nowrap !important; flex-shrink: 0 !important; /* 防止缩小 */ } /* 完全删除等级标签和管理员标签 */ .levelBadge___XJap_, .adminTag___lL0Ow, .titleTagInvestor___DUbJ4 { display: none !important; } /* 隐藏等级文字 */ .adminText___jDfqg { display: none !important; } /* 消息内容样式 - 终端风格单行显示 */ .messageContent___BeZJv { margin: 0 !important; padding: 0 !important; background: transparent !important; box-shadow: none !important; border-radius: 0 !important; margin-left: 0 !important; display: inline-block !important; order: 3 !important; flex: 1 !important; /* 让消息内容占据剩余空间 */ } .messageContent___QDsxD { color: #d0d0d0 !important; display: inline !important; background: transparent !important; padding: 0 !important; box-shadow: none !important; } /* 移除消息内容的气泡样式 */ .chatRoom___z4hOy .messageContainer___zUc1q .messageItem___UXffF .messageContent___BeZJv { margin-top: 0 !important; background: transparent !important; padding: 0 !important; border-radius: 0 !important; box-shadow: none !important; margin-left: 0 !important; } /* 时间戳样式 - 移到最前面并调整宽度 */ .timestamp___pqcve { color: #777 !important; font-style: italic !important; margin-right: 0px !important; order: 1 !important; width: 60px !important; min-width: 60px !important; /* 防止缩小 */ padding-left: 0px !important; font-size: 12px !important; flex-shrink: 0 !important; /* 防止缩小 */ } /* 消息底部样式 */ .messageFooter___eWkrw { display: inline-flex !important; align-items: center !important; margin-left: 0px !important; margin-right: 5px !important; order: 1 !important; /* 将整个footer移到前面 */ padding-left: 0px !important; flex-shrink: 0 !important; /* 防止缩小 */ } /* 引用按钮样式 - 默认隐藏,悬浮时显示 */ .quoteText___reQEz { display: none !important; color: #888 !important; font-size: 12px !important; cursor: pointer !important; margin-left: 5px !important; } /* 悬浮在消息上时显示引用按钮 */ .messageFooter___eWkrw:hover .quoteText___reQEz { display: inline-block !important; } /* 输入区域样式 */ .inputArea___KNPKm { background-color: #0c0c0c !important; border-top: 1px solid #444 !important; padding: 10px !important; } /* 输入框样式 */ .chatTextArea___P0JAV { background-color: #0c0c0c !important; color: #d0d0d0 !important; border: 1px solid #444 !important; border-radius: 0 !important; } /* 隐藏输入框的占位符文本 */ .chatTextArea___P0JAV::placeholder { color: transparent !important; } /* 按钮样式 */ .ant-btn { background-color: #0c0c0c !important; color: #d0d0d0 !important; border: 1px solid #444 !important; border-radius: 0 !important; } /* 发送按钮样式 */ .sendButton___gOHpp { background-color: #0c0c0c !important; color: #d0d0d0 !important; border: 1px solid #444 !important; } /* 隐藏发送按钮中的所有文本 */ .sendButton___gOHpp span { font-size: 0 !important; } /* 隐藏发送按钮中的图标 */ .sendButton___gOHpp .ant-btn-icon { display: none !important; } /* 只在按钮上添加一个执行文本 */ .sendButton___gOHpp::after { content: "执行" !important; font-size: 14px !important; color: #d0d0d0 !important; } /* 修改滚动条样式 */ ::-webkit-scrollbar { width: 8px !important; background-color: #0c0c0c !important; } ::-webkit-scrollbar-thumb { background-color: #444 !important; } /* 添加终端前缀 - 放在时间戳后面 */ .messageHeader___ABpsT::before { content: "$ " !important; color: #ffffff !important; font-weight: bold !important; margin-right: 5px !important; display: inline-block !important; width: 15px !important; text-align: center !important; } /* 添加终端窗口标题 */ body::before { content: "Terminal - 系统监控"; display: block; background-color: #222; color: #fff; padding: 5px 10px; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; font-size: 14px; border-bottom: 1px solid #444; } /* 添加终端命令提示符 */ .inputRow___kMy91::before { content: "$ "; color: #ffffff; font-weight: bold; margin-right: 5px; } /* 隐藏在线成员列表 */ .userList___AyZ7o { display: none !important; } /* 让聊天区域占满整个宽度 */ .chatPanel___QEdZP { width: 100% !important; max-width: 100% !important; } /* 强制消息内容为单行,超出部分用省略号 */ .messageContent___QDsxD p { display: inline !important; white-space: normal !important; overflow: visible !important; word-wrap: break-word !important; max-width: 100% !important; } /* 修复可能的布局问题 */ .senderInfo___F2m3s { display: inline-flex !important; align-items: center !important; } `; // 创建样式元素但不立即添加到文档中 const terminalStyle = document.createElement("style"); terminalStyle.textContent = terminalCSS; // 保存原始页面标题 let originalTitle = ""; // 创建切换模式的通知元素 const modeNotification = document.createElement("div"); modeNotification.style.cssText = ` position: fixed; bottom: 20px; right: 20px; background-color: rgba(0, 0, 0, 0.7); color: white; padding: 8px 15px; border-radius: 4px; z-index: 9999; font-family: 'Segoe UI', sans-serif; font-size: 14px; transition: opacity 0.5s; opacity: 0; pointer-events: none; `; document.body.appendChild(modeNotification); // 显示通知函数 function showNotification(message) { modeNotification.textContent = message; modeNotification.style.opacity = "1"; setTimeout(() => { modeNotification.style.opacity = "0"; }, 2000); } // 终端模式状态和消息缓存 let terminalModeEnabled = false; let messageStates = new Map(); // 用于保存消息原始状态 // 切换终端模式的函数 function toggleTerminalMode() { terminalModeEnabled = !terminalModeEnabled; if (terminalModeEnabled) { // 启用终端模式 document.head.appendChild(terminalStyle); document.title = "系统监控终端"; // 处理所有现有消息 applyTerminalStyleToMessages(); // 隐藏在线成员列表 const userList = document.querySelector(".userList___AyZ7o"); if (userList) { userList.style.display = "none"; } // 修改输入框占位符文本为空 const textarea = document.querySelector(".chatTextArea___P0JAV"); if (textarea) { textarea.setAttribute( "data-original-placeholder", textarea.getAttribute("placeholder") || "" ); textarea.setAttribute("placeholder", ""); } showNotification("已启用终端模式"); } else { // 禁用终端模式 document.head.removeChild(terminalStyle); document.title = originalTitle; // 恢复所有消息的原始样式 restoreOriginalStyleToMessages(); // 显示在线成员列表 const userList = document.querySelector(".userList___AyZ7o"); if (userList) { userList.style.display = ""; } // 恢复输入框占位符文本 const textarea = document.querySelector(".chatTextArea___P0JAV"); if (textarea) { const originalPlaceholder = textarea.getAttribute( "data-original-placeholder" ); if (originalPlaceholder) { textarea.setAttribute("placeholder", originalPlaceholder); } } showNotification("已恢复正常模式"); } } // 应用终端样式到所有消息 function applyTerminalStyleToMessages() { const messageContainer = document.querySelector( ".messageContainer___zUc1q" ); if (!messageContainer) return; const messages = messageContainer.querySelectorAll(".messageItem___UXffF"); messages.forEach(function (message) { // 保存消息的原始状态(如果尚未保存) if (!messageStates.has(message)) { const state = { footerPosition: null, levelBadgeDisplay: null, adminTagDisplay: null, contentText: null, }; // 获取时间戳位置 const footer = message.querySelector(".messageFooter___eWkrw"); if (footer) { state.footerPosition = Array.from(message.children).indexOf(footer); } // 获取等级标签和管理员标签的显示状态 const levelBadge = message.querySelector(".levelBadge___XJap_"); if (levelBadge) { state.levelBadgeDisplay = window.getComputedStyle(levelBadge).display; } const adminTag = message.querySelector(".adminTag___lL0Ow"); if (adminTag) { state.adminTagDisplay = window.getComputedStyle(adminTag).display; } // 获取消息内容的原始文本(包括换行) const contentDiv = message.querySelector(".messageContent___QDsxD p"); if (contentDiv) { state.contentText = contentDiv.innerText; } messageStates.set(message, state); } // 应用终端样式 // 将时间戳移到最前面 const footer = message.querySelector(".messageFooter___eWkrw"); if (footer) { message.insertBefore(footer, message.firstChild); // 隐藏引用按钮 const quoteButton = footer.querySelector(".quoteText___reQEz"); if (quoteButton) { quoteButton.style.display = "none"; } } // 确保消息内容在一行显示 const contentDiv = message.querySelector(".messageContent___QDsxD p"); if (contentDiv) { contentDiv.innerText = contentDiv.innerText.replace(/\n/g, " "); } // 隐藏等级标签和管理员标签 const levelBadge = message.querySelector(".levelBadge___XJap_"); if (levelBadge) { levelBadge.style.display = "none"; } const adminTag = message.querySelector(".adminTag___lL0Ow"); if (adminTag) { adminTag.style.display = "none"; } }); } // 恢复消息的原始样式 function restoreOriginalStyleToMessages() { const messageContainer = document.querySelector( ".messageContainer___zUc1q" ); if (!messageContainer) return; const messages = messageContainer.querySelectorAll(".messageItem___UXffF"); messages.forEach(function (message) { // 检查是否有保存的原始状态 const state = messageStates.get(message); if (!state) return; // 恢复时间戳位置 const footer = message.querySelector(".messageFooter___eWkrw"); if (footer && state.footerPosition !== null) { // 如果时间戳不在原始位置,移动它 if (footer === message.firstChild && state.footerPosition > 0) { const targetPosition = Math.min( state.footerPosition, message.children.length ); if (targetPosition >= message.children.length) { message.appendChild(footer); } else { message.insertBefore(footer, message.children[targetPosition]); } } // 恢复引用按钮的显示状态 const quoteButton = footer.querySelector(".quoteText___reQEz"); if (quoteButton) { quoteButton.style.display = ""; } } // 恢复消息内容的原始文本(包括换行) const contentDiv = message.querySelector(".messageContent___QDsxD p"); if (contentDiv && state.contentText) { contentDiv.innerText = state.contentText; } // 恢复等级标签和管理员标签的显示状态 const levelBadge = message.querySelector(".levelBadge___XJap_"); if (levelBadge && state.levelBadgeDisplay) { levelBadge.style.display = state.levelBadgeDisplay; } const adminTag = message.querySelector(".adminTag___lL0Ow"); if (adminTag && state.adminTagDisplay) { adminTag.style.display = state.adminTagDisplay; } }); } // 添加键盘快捷键 - 按下Esc键切换终端模式 document.addEventListener("keydown", function (e) { // Esc键切换终端模式 if (e.key === "Escape") { toggleTerminalMode(); } }); // 页面加载完成后设置界面和DOM观察器 window.addEventListener("load", function () { // 保存原始页面标题 originalTitle = document.title; // 监听DOM变化,对新添加的消息应用当前样式 const observer = new MutationObserver(function (mutations) { if (!terminalModeEnabled) return; mutations.forEach(function (mutation) { if (mutation.addedNodes.length) { mutation.addedNodes.forEach(function (node) { if ( node.nodeType === 1 && node.classList.contains("messageItem___UXffF") ) { // 保存消息的原始状态 if (!messageStates.has(node)) { const state = { footerPosition: null, levelBadgeDisplay: null, adminTagDisplay: null, contentText: null, }; // 获取时间戳位置 const footer = node.querySelector(".messageFooter___eWkrw"); if (footer) { state.footerPosition = Array.from(node.children).indexOf( footer ); } // 获取等级标签和管理员标签的显示状态 const levelBadge = node.querySelector(".levelBadge___XJap_"); if (levelBadge) { state.levelBadgeDisplay = window.getComputedStyle(levelBadge).display; } const adminTag = node.querySelector(".adminTag___lL0Ow"); if (adminTag) { state.adminTagDisplay = window.getComputedStyle(adminTag).display; } // 获取消息内容的原始文本(包括换行) const contentDiv = node.querySelector( ".messageContent___QDsxD p" ); if (contentDiv) { state.contentText = contentDiv.innerText; } messageStates.set(node, state); } // 应用终端样式 // 确保消息内容在一行显示 const contentDiv = node.querySelector( ".messageContent___QDsxD p" ); if (contentDiv) { contentDiv.innerText = contentDiv.innerText.replace(/\n/g, " "); } // 将时间戳移到最前面 const footer = node.querySelector(".messageFooter___eWkrw"); if (footer) { node.insertBefore(footer, node.firstChild); // 确保引用按钮可见性正确 const quoteButton = footer.querySelector(".quoteText___reQEz"); if (quoteButton) { quoteButton.style.display = "none"; } } // 删除等级标签和天使投资人标签 const levelBadge = node.querySelector(".levelBadge___XJap_"); if (levelBadge) { levelBadge.style.display = "none"; } const adminTag = node.querySelector(".adminTag___lL0Ow"); if (adminTag) { adminTag.style.display = "none"; } } }); } }); }); const messageContainer = document.querySelector( ".messageContainer___zUc1q" ); if (messageContainer) { observer.observe(messageContainer, { childList: true }); } }); })();