您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Change the appearance of a Discord message locally with clickable links, styled pings, and images below text
// ==UserScript== // @name Discord Fake Message Editor // @namespace http://tampermonkey.net/ // @homepageURL https://discord.gg/gFNAH7WNZj // @version 1.0.0 // @description Change the appearance of a Discord message locally with clickable links, styled pings, and images below text // @author Bacon But Pro // @match *://discord.com/channels/* // @icon https://cdn141.picsart.com/351217840073211.png // @license MIT // @grant none // ==/UserScript== (function() { 'use strict'; let originalMessages = {}; let boxVisible = true; let clickToCopyEnabled = false; let helpBox; const ANIMATION_DURATION = 500; function startLoading() { let loadingBox = document.createElement('div'); loadingBox.id = 'loadingBox'; loadingBox.style.position = 'fixed'; loadingBox.style.top = '50%'; loadingBox.style.left = '50%'; loadingBox.style.transform = 'translate(-50%, -50%) translateY(-20px)'; loadingBox.style.opacity = '0'; loadingBox.style.background = 'linear-gradient(135deg, #7289da, #2c2f33)'; loadingBox.style.color = 'white'; loadingBox.style.padding = '30px'; loadingBox.style.borderRadius = '10px'; loadingBox.style.boxShadow = '0 4px 20px rgba(0, 0, 0, 0.3)'; loadingBox.style.textAlign = 'center'; loadingBox.style.zIndex = '9999'; loadingBox.style.minWidth = '350px'; loadingBox.style.fontFamily = `'Segoe UI', Tahoma, Geneva, Verdana, sans-serif`; loadingBox.style.transition = `opacity ${ANIMATION_DURATION}ms ease, transform ${ANIMATION_DURATION}ms ease`; let loadingText = document.createElement('div'); loadingText.innerText = 'Loading Userscript'; loadingText.style.fontSize = '20px'; loadingText.style.marginBottom = '20px'; loadingBox.appendChild(loadingText); let barContainer = document.createElement('div'); barContainer.id = 'loadingBarContainer'; barContainer.style.width = '100%'; barContainer.style.height = '12px'; barContainer.style.background = 'rgba(0, 0, 0, 0.2)'; barContainer.style.borderRadius = '6px'; barContainer.style.overflow = 'hidden'; barContainer.style.marginTop = '10px'; loadingBox.appendChild(barContainer); let loadingBar = document.createElement('div'); loadingBar.id = 'loadingBar'; loadingBar.style.height = '100%'; loadingBar.style.width = '100%'; loadingBar.style.background = 'linear-gradient(90deg, #99aab5, #7289da)'; loadingBar.style.transformOrigin = 'right'; loadingBar.style.transition = 'transform 10s linear'; barContainer.appendChild(loadingBar); document.body.appendChild(loadingBox); requestAnimationFrame(() => { loadingBox.style.opacity = '1'; loadingBox.style.transform = 'translate(-50%, -50%) translateY(0)'; }); requestAnimationFrame(() => { loadingBar.style.transform = 'scaleX(0)'; }); setTimeout(() => { loadingBox.style.opacity = '0'; loadingBox.style.transform = 'translate(-50%, -50%) translateY(20px)'; setTimeout(() => { if (loadingBox.parentNode) { loadingBox.parentNode.removeChild(loadingBox); } createControlBox(); }, ANIMATION_DURATION); }, 10000); } function createControlBox() { let box = document.createElement("div"); box.id = "fakeMessageBox"; box.style.position = "fixed"; box.style.bottom = "20px"; box.style.right = "20px"; box.style.background = "linear-gradient(135deg, #2c2f33, #7289da)"; box.style.color = "white"; box.style.padding = "20px"; box.style.borderRadius = "10px"; box.style.boxShadow = "0 4px 20px rgba(0,0,0,0.3)"; box.style.zIndex = "9999"; box.style.width = "280px"; box.style.display = "flex"; box.style.flexDirection = "column"; box.style.gap = "10px"; box.style.fontFamily = `'Segoe UI', Tahoma, Geneva, Verdana, sans-serif`; box.style.opacity = "0"; box.style.transform = "translateX(50px)"; box.style.transition = `opacity ${ANIMATION_DURATION}ms ease, transform ${ANIMATION_DURATION}ms ease`; box.innerHTML = ` <div> <label style="display: block; margin-bottom: 4px;">Message ID:</label> <input type="text" id="fakeMsgId" style="width: 100%; padding: 6px; border-radius: 4px; border: none; box-sizing: border-box;"> </div> <div style="display: flex; flex-direction: column; gap: 5px;"> <button id="clearMsgId" style="padding: 6px; border: none; border-radius: 4px; background: #99aab5; color: white; cursor: pointer;">Clear</button> <button id="toggleCopy" style="padding: 6px; border: none; border-radius: 4px; background: #99aab5; color: white; cursor: pointer;">Copy</button> </div> <div> <label style="display: block; margin-bottom: 4px;">New Message:</label> <textarea id="fakeMsgHtml" style="width: 100%; padding: 6px; border-radius: 4px; border: none; box-sizing: border-box; resize: vertical;" rows="3"></textarea> </div> <div> <label style="display: block; margin-bottom: 4px;">Image URL (optional):</label> <input type="text" id="fakeMsgImage" style="width: 100%; padding: 6px; border-radius: 4px; border: none; box-sizing: border-box;"> </div> <div style="display: flex; gap: 5px;"> <button id="applyFakeChange" style="flex: 1; padding: 6px; border: none; border-radius: 4px; background: #7289da; color: white; cursor: pointer;">Apply</button> <button id="resetFakeChange" style="flex: 1; padding: 6px; border: none; border-radius: 4px; background: #7289da; color: white; cursor: pointer;">Reset</button> <button id="hideBox" style="flex: 1; padding: 6px; border: none; border-radius: 4px; background: #7289da; color: white; cursor: pointer;">Hide</button> <button id="helpBtn" style="flex: 1; padding: 6px; border: none; border-radius: 4px; background: #7289da; color: white; cursor: pointer;">Help</button> </div> <div id="notification" style="display: none; color: lime; text-align: center;">Message updated!</div> <small style="display: block; text-align: center; margin-top: 5px;">By Bacon But Pro</small> `; document.body.appendChild(box); requestAnimationFrame(() => { box.style.opacity = "1"; box.style.transform = "translateX(0)"; }); let toggleButton = document.createElement("button"); toggleButton.id = "toggleBoxButton"; toggleButton.innerText = "Show"; toggleButton.style.position = "fixed"; toggleButton.style.bottom = "20px"; toggleButton.style.right = "20px"; toggleButton.style.background = "#7289da"; toggleButton.style.color = "white"; toggleButton.style.padding = "8px 12px"; toggleButton.style.border = "none"; toggleButton.style.borderRadius = "4px"; toggleButton.style.boxShadow = "0 2px 10px rgba(0,0,0,0.2)"; toggleButton.style.zIndex = "9998"; toggleButton.style.display = "none"; toggleButton.style.cursor = "pointer"; document.body.appendChild(toggleButton); helpBox = createHelpBox(); document.getElementById("applyFakeChange").addEventListener("click", () => { let msgId = document.getElementById("fakeMsgId").value.trim(); let newHtml = document.getElementById("fakeMsgHtml").value; let imageUrl = document.getElementById("fakeMsgImage").value.trim(); if (msgId && (newHtml !== "" || imageUrl !== "")) { fakeEditMessage(msgId, newHtml, imageUrl); showNotification("Message updated!"); } }); document.getElementById("resetFakeChange").addEventListener("click", () => { let msgId = document.getElementById("fakeMsgId").value.trim(); if (msgId) { resetMessage(msgId); } }); document.getElementById("toggleCopy").addEventListener("click", () => { clickToCopyEnabled = !clickToCopyEnabled; alert(`Copy Mode: ${clickToCopyEnabled ? 'ON' : 'OFF'}`); }); document.getElementById("hideBox").addEventListener("click", () => { toggleControlBox(); }); document.getElementById("clearMsgId").addEventListener("click", () => { document.getElementById("fakeMsgId").value = ""; }); document.getElementById("helpBtn").addEventListener("click", () => { if (helpBox.style.display === "none") { helpBox.style.display = "block"; } else { helpBox.style.display = "none"; } }); toggleButton.addEventListener("click", () => { toggleControlBox(); }); document.addEventListener("keydown", (event) => { if (event.key === "F2") { toggleControlBox(); } }); document.addEventListener("click", (event) => { if (!clickToCopyEnabled) return; let messageElement = event.target.closest("[id^='message-content-']"); if (messageElement) { let messageId = messageElement.id.replace("message-content-", ""); document.getElementById("fakeMsgId").value = messageId; showNotification("Message ID copied!"); } }); } function createHelpBox() { let box = document.createElement("div"); box.id = "fakeMessageHelpBox"; box.style.position = "fixed"; box.style.bottom = "20px"; box.style.right = "320px"; box.style.background = "#2c2f33"; box.style.color = "white"; box.style.padding = "15px"; box.style.borderRadius = "10px"; box.style.boxShadow = "0 4px 20px rgba(0,0,0,0.3)"; box.style.zIndex = "9999"; box.style.width = "250px"; box.style.fontFamily = `'Segoe UI', Tahoma, Geneva, Verdana, sans-serif`; box.style.display = "none"; box.innerHTML = ` <h3 style="margin-top: 0;">Help</h3> <p style="font-size: 14px; line-height: 1.4;"> This script lets you locally modify the appearance of a Discord message.<br><br> <strong>Message ID</strong>: Enable "Copy" mode and click a message to grab its ID.<br> <strong>New Message</strong>: Enter your custom text, links, or mentions in the format <code><@123456789|DisplayName></code>.<br> <strong>Image URL</strong>: An optional link to an image below your custom text. </p> <p style="font-size: 14px; line-height: 1.4;"> <strong>Example:</strong><br> <code><@123456789|User> Check out https://google.com</code> </p> `; document.body.appendChild(box); return box; } function toggleControlBox() { let box = document.getElementById("fakeMessageBox"); let toggleButton = document.getElementById("toggleBoxButton"); if (!box) return; if (boxVisible) { box.style.transition = `opacity ${ANIMATION_DURATION}ms ease, transform ${ANIMATION_DURATION}ms ease`; box.style.opacity = "0"; box.style.transform = "translateX(50px)"; setTimeout(() => { box.style.display = "none"; toggleButton.style.display = "block"; boxVisible = false; }, ANIMATION_DURATION); } else { box.style.display = "flex"; box.style.opacity = "0"; box.style.transform = "translateX(50px)"; void box.offsetWidth; box.style.transition = `opacity ${ANIMATION_DURATION}ms ease, transform ${ANIMATION_DURATION}ms ease`; box.style.opacity = "1"; box.style.transform = "translateX(0)"; toggleButton.style.display = "none"; boxVisible = true; } } function fakeEditMessage(messageId, newHtml, imageUrl) { let messageElement = document.querySelector(`#message-content-${messageId}`); if (messageElement) { if (!originalMessages[messageId]) { originalMessages[messageId] = messageElement.innerHTML; } let processedHtml = processContent(newHtml); let finalContent = ""; if (processedHtml) { finalContent = `<div>${processedHtml}</div>`; } if (imageUrl) { finalContent += `<div style="margin-top: 5px;"><img src="${imageUrl}" style="max-width: 200px; border-radius: 5px;"></div>`; } messageElement.innerHTML = finalContent; } else { alert("Message not found. Make sure it's visible on screen."); } } function resetMessage(messageId) { let messageElement = document.querySelector(`#message-content-${messageId}`); if (messageElement && originalMessages[messageId]) { messageElement.innerHTML = originalMessages[messageId]; delete originalMessages[messageId]; } else { alert("Original message not stored or message not found."); } } function processLinks(text) { if (!text) return ""; return text.replace(/(https:\/\/[^\s]+)/g, function(match) { return `<a href="${match}" target="_blank" style="color: #00b0f4; text-decoration: none;">${match}</a>`; }); } function processMentions(text) { if (!text) return ""; return text.replace(/<@([^>|]+)(?:\|([^>]+))?>/g, function(match, id, displayName) { if (!displayName) displayName = id; return `<span class="mention" style="color: #7289da; font-weight: bold;">@${displayName}</span>`; }); } function processContent(text) { return processMentions(processLinks(text)); } function showNotification(text) { let notif = document.getElementById("notification"); notif.innerText = text; notif.style.display = "block"; setTimeout(() => notif.style.display = "none", 2000); } window.addEventListener("load", startLoading); })();