您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Improvements to the usability of chats 2.0.
当前为
// ==UserScript== // @name [TORN] Better Chat // @namespace dekleinekobini.betterchat // @license GPL-3 // @version 0.3.1 // @description Improvements to the usability of chats 2.0. // @author DeKleineKobini [2114440] // @match https://www.torn.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=torn.com // @run-at document-body // @grant GM_addStyle // ==/UserScript== "use strict"; const settings = { messages: { hideAvatars: true, compact: true, fixLongName: true, leftAlignedText: true, // left align all text, prefixed by the name (supports the mini-profile as well), even for private chats hyperlinks: true, }, box: { groupRight: true, // opening chat logic to put private chat left of group chats hideAvatars: true, }, }; /* ## TODO * chat name colours */ const URL_PATTERN = /(https?:\/\/)?(\.?[\w-]+)+\.([a-z]{2,})(\/[\w\.]*)*(\?[\w=]+)?(#[\w/]+)?/gi; (() => { setupStyles(); setupChatModifier().catch((reason) => console.error("[Better Chat] Failed to initialize the chat modifier.", reason)); })(); function includeStyle(styleRules) { if (typeof GM_addStyle !== "undefined") { GM_addStyle(styleRules); } else { const styleElement = document.createElement("style"); styleElement.setAttribute("type", "text/css"); styleElement.innerHTML = styleRules; document.head.appendChild(styleElement); } } function setupStyles() { if (settings.messages.hideAvatars) { includeStyle(` [class*='chat-box-body__avatar___'] { display: none; } `); } if (settings.messages.compact) { includeStyle(` [class*='chat-box-body__sender-group___'] { margin-right: 0 !important; } [class*='chat-box-body__wrapper___'] { margin-bottom: 0px !important; } [class*='chat-box-body___'] > div:last-child { margin-bottom: 8px !important; } `); } if (settings.messages.fixLongName) { includeStyle(` [class*='chat-box-body__sender-button___'] { max-width: unset !important; } `); } if (settings.box.groupRight) { includeStyle(` [class*='group-chat-box___'] { gap: 3px; } [class*='group-chat-box__chat-box-wrapper___'] { margin-right: 0 !important; } `); } if (settings.messages.leftAlignedText) { includeStyle(` [class*='chat-box-body__sender___'] { display: unset !important; font-weight: 700; } [class*='chat-box-body__sender-separator___'] { display: unset !important; margin-right: 4px; line-break: anywhere; } [class*='chat-box-body__message-box___'] { background: none !important; border-radius: none !important; color: initial !important; padding: 0 !important; } [class*='chat-box-body__message-box--self___'] { background: none !important; border-radius: none !important; color: initial !important; padding: 0 !important; } [class*='chat-box-body__wrapper--self___'] { justify-content: normal !important; } [class*='chat-box-body__wrapper--self___'] > [class*='chat-box-body__message___'], [class*='chat-box-body__message___'] { color: var(--chat-text-color) !important; } `); } if (settings.box.hideAvatars) { includeStyle(` [class*='avatar__avatar-status-wrapper___'] > img { display: none; } `); } } async function setupChatModifier() { const group = await new Promise((resolve) => { new MutationObserver((_, observer) => { const group = findByClass(document, "group-chat-box___"); if (group) { observer.disconnect(); resolve(group); } }).observe(document, {childList: true, subtree: true}); }); group.childNodes.forEach(processChat) new MutationObserver((mutations) => { mutations.flatMap((mutation) => [...mutation.addedNodes]).forEach(processChat); }).observe(group, {childList: true}); } function processChat(chatNode) { if (settings.box.groupRight) { const avatarElement = findByClass(chatNode, "chat-box-header__avatar___", "> *"); const isGroup = avatarElement.tagName.toLowerCase() === "svg"; if (isGroup) { chatNode.style.order = "1"; } } const bodyElement = findByClass(chatNode, "chat-box-body___"); bodyElement.childNodes.forEach(processMessage); new MutationObserver((mutations) => { mutations.flatMap((mutation) => [...mutation.addedNodes]).forEach(processMessage); }).observe(chatNode, {childList: true}); new MutationObserver(() => { bodyElement.childNodes.forEach(processMessage); }).observe(bodyElement, {childList: true}); } function processMessage(messageNode) { const senderElement = findByClass(messageNode, "chat-box-body__sender___"); const messageElement = findByClass(messageNode, "chat-box-body__message___"); if (senderElement.textContent === "newMessage") { // Take the name from the sidebar. senderElement.textContent = findByClass(document, "menu-value___").textContent; } if (settings.messages.hyperlinks) { messageElement.innerHTML = replaceHyperlinks(messageElement.innerHTML); } } function findByClass(node, className, subSelector = "") { return node.querySelector(`[class*='${className}'] ${subSelector}`.trim()) } function replaceHyperlinks(text) { return text.replace(URL_PATTERN, (url) => { let usableUrl = url; if (!usableUrl.startsWith('http://') && !usableUrl.startsWith('https://')) { usableUrl = 'https://' + usableUrl; } return `<a href="${usableUrl}" target="_blank">${url}</a>`; }); }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址