// ==UserScript==
// @name 妖火复读机(兼容分屏)
// @namespace http://yaohuo.me/
// @supportURL http://yaohuo.me/
// @version 20250225.02
// @description 妖火论坛每个回复后面加个复读按钮。
// @author 我黄某与赌毒不两立
// @match *://yaohuo.me/bbs*
// @match *://www.yaohuo.me/bbs*
// @grant none
// @license MIT
// @downloadURL https://update.greasyfork.icu/scripts/533117/%E5%A6%96%E7%81%AB%E5%A4%8D%E8%AF%BB%E6%9C%BA%28%E5%85%BC%E5%AE%B9%E5%88%86%E5%B1%8F%29.user.js
// @updateURL https://update.greasyfork.icu/scripts/533117/%E5%A6%96%E7%81%AB%E5%A4%8D%E8%AF%BB%E6%9C%BA%28%E5%85%BC%E5%AE%B9%E5%88%86%E5%B1%8F%29.meta.js
// ==/UserScript==
(function () {
let domTextarea = document.querySelector('textarea');
//发表回复
window.reply = function (txt, face) {
//填写内容
domTextarea.value += txt;
//选择表情
for (let i = 0; i < document.forms.length; i++) {
const form = document.forms[i];
if (form.name == 'f') {
form.face.value = face;
break;
}
}
//点击回复按钮
let domInput = document.querySelectorAll('input');
for (let i = domInput.length - 1; i > 0; i--) {
const btn = domInput[i];
if (btn.value == '快速回复' || btn.value == '发表回复') {
btn.click();
break;
}
}
return false; // 阻止默认行为和冒泡
}
//注入更多按钮
let moreButn = [
{ css: 'background:#937a3e;color:#fff', showText: '吃', text: '吃', face: '', },
{ css: 'background:#937a3e;color:#fff', showText: '过', text: '过', face: '', },
{ css: 'background:#a7588d;color:#fffa28', showText: '感谢分享', text: '感谢分享', face: '谢谢.gif' },
{ css: 'background:#3e933e;color:#fff', showText: '哈哈', text: '哈哈', face: '哈哈.gif' },
{ css: 'background:#3e933e;color:#fff', showText: '恭喜', text: '恭喜', face: '么么哒.gif' },
{ css: 'background:#3e933e;color:#fff', showText: '大佬带带', text: '大佬带带', face: '耶耶.gif' },
{ css: 'background:#3e933e;color:#fff', showText: '大水比', text: '大水比', face: '被揍.gif' },
];
let domForm = document.querySelector('.recontent');
window.moreReplyBtn = function () {
if (domForm != null) {
//注入按钮
let className = 'moreReplyButn';
let isAddBtn = domForm.querySelector(`.${className}`);
if (isAddBtn == null) {
let btnHtml = '';
let btnStyle = 'padding:5px;border-radius:5px;font-size:14px;cursor:pointer;';
moreButn.forEach(f => {
btnHtml += ` ${f.showText}`;
});
domForm.innerHTML = `
${btnHtml}
` + domForm.innerHTML;
}
}
}
//注入复读按钮
let isNewLayout = false;
let getNewLayout = localStorage.getItem('customLayoutEnabled');
if (getNewLayout !== null) isNewLayout = JSON.parse(getNewLayout);
window.repeatBotBtn = function () {
//获取当前主题版本
let domTxt = {};
if (isNewLayout) domTxt = document.querySelectorAll('.forum-post');//新主题
else domTxt = document.querySelectorAll('.list-reply'); //旧主题
//注入按钮
let className = 'repeatBotButn';
domTxt.forEach(f => {
let domSpan = f.querySelector('.retext');
let isAddBtn = domSpan.querySelector(`.${className}`);
if (isAddBtn == null) {
let txt = generateHtmlUbb(domSpan.innerHTML);
let btnHtml = ` +1`;
domSpan.innerHTML += btnHtml;
}
});
}
//检查页面
if (domTextarea != null) {
//注入更多按钮
window.moreReplyBtn();
//注入复读按钮
window.repeatBotBtn();
//元素监视(减少性能损耗)
const callback = function (mutationsList, observer) {
//隐藏提示
var showTipe = document.querySelector('#retip');
if (showTipe != null) showTipe.style.display = 'none';
//注入更多按钮
window.moreReplyBtn();
//注入复读按钮
window.repeatBotBtn();
};
const observer = new MutationObserver(callback);
observer.observe(domForm, { childList: true, subtree: true });
}
//HTML转UBB
function generateHtmlUbb(html) {
//创建一个临时 DOM 元素来解析 HTML
const tempDiv = document.createElement('div');
tempDiv.innerHTML = html;
//获取所有的 img 元素并替换为 UBB 格式
const imgElements = tempDiv.getElementsByTagName('img');
for (let i = imgElements.length - 1; i >= 0; i--) {
const img = imgElements[i];
const ubbImage = `[img]${img.src}[/img]`;
//用 UBB 格式替换 img 元素
img.replaceWith(ubbImage);
}
//获取所有的 br 元素并替换为换行符
const brElements = tempDiv.getElementsByTagName('br');
for (let i = brElements.length - 1; i >= 0; i--) {
const br = brElements[i];
const newLine = document.createTextNode('\n');
//用换行符替换 br 元素
br.replaceWith(newLine);
}
//返回处理后的文本
return tempDiv.innerText || tempDiv.textContent;
}
//生成彩色文字UBB
function generateFontUBB(input) {
let ubbString = '';
for (const char of input) {
const color = getRandomColor();
ubbString += `[forecolor=${color}]${char}[/forecolor]`;
}
return ubbString;
}
//获取随机颜色
function getRandomColor() {
const letters = '0123456789ABCDEF';
let color = '#';
for (let i = 0; i < 6; i++) {
color += letters[Math.floor(Math.random() * 16)];
}
return color;
}
})();