自动选择 "Mortal 3.0" 并勾选 "显示 rating",同时在牌谱 URL 输入框旁添加复制按钮,并在「关于」弹框中添加截图按钮
// ==UserScript==// @name 雀魂 Mortal 举报小帮手// @name:zh-TW 雀魂 Mortal 舉報小幫手// @name:zh-CN 雀魂 Mortal 举报小帮手// @name:ja 雀魂 Mortal レポートアシスタント & 牌譜 URL コピー & テーブルキャプチャ// @name:en Mahjong Soul Mortal Report Assistant & Copy Log URL & Table Capture// @author Scott// @version 0.5// @description 自动选择 "Mortal 3.0" 并勾选 "显示 rating",同时在牌谱 URL 输入框旁添加复制按钮,并在「关于」弹框中添加截图按钮// @description:zh-TW 自動選擇 "Mortal 3.0" 並勾選 "顯示 rating",同時在牌譜 URL 輸入框旁添加複製按鈕,並在「關於」彈框中添加截圖按鈕// @description:zh-CN 自动选择 "Mortal 3.0" 并勾选 "显示 rating",同时在牌谱 URL 输入框旁添加复制按钮,并在「关于」弹框中添加截图按钮// @description:ja "Mortal 3.0" を自動選択し、"表示 rating" をチェックし、牌譜 URL 入力欄にコピーボタンを追加し、「關於」彈框にスクリーンショットボタンを追加// @description:en Automatically select "Mortal 3.0" and check "Show rating", and add a copy button next to the log URL input field, and add a screenshot button in the "About" dialog// @match *://mjai.ekyu.moe/*// @grant none// @license MIT// @namespace https://greasyfork.org/zh-CN/users/1284613// ==/UserScript==(function () {"use strict";// ==================== 举报小帮手功能 ====================function selectMortalNetwork() {const selectElement = document.querySelector("#mortal-model-tag");if (selectElement) {selectElement.value = "3.0";selectElement.dispatchEvent(new Event("change", { bubbles: true }));}}function checkShowRating() {const ratingCheckbox = document.querySelector('input[name="show-rating"]');if (ratingCheckbox && !ratingCheckbox.checked) {ratingCheckbox.checked = true;ratingCheckbox.dispatchEvent(new Event("change", { bubbles: true }));}}function initReportHelper() {selectMortalNetwork();checkShowRating();}// ==================== 复制牌谱 URL 功能 ====================function addCopyButton() {const label = document.querySelector('label.radio');if (label) {const copyButton = document.createElement("button");copyButton.type = "button"; // 指定按钮类型copyButton.id = "copy-url-button";copyButton.className = "copy-button";copyButton.textContent = "复制 URL";label.appendChild(copyButton);}// 添加样式const style = document.createElement("style");style.textContent = `.copy-button {margin-left: 10px;padding: 5px 10px;background-color: #4CAF50;color: white;border: none;border-radius: 4px;cursor: pointer;}.copy-button:hover {background-color: #45a049;}`;document.head.appendChild(style);// 复制功能const inputField = document.querySelector('input[name="log-url"]');const copyButton = document.getElementById("copy-url-button");if (inputField && copyButton) {// 点击按钮复制copyButton.addEventListener("click", (event) => {event.preventDefault(); // 阻止默认行为event.stopPropagation(); // 阻止事件冒泡inputField.select();inputField.setSelectionRange(0, 99999); // 兼容移动设备document.execCommand("copy");alert("URL 已复制到剪贴板!");});// 点击输入框自动复制inputField.addEventListener("click", () => {inputField.select();inputField.setSelectionRange(0, 99999); // 兼容移动设备document.execCommand("copy");alert("URL 已复制到剪贴板!");});}}// ==================== 截取表格功能 ====================function addScreenshotButton() {// 找到「如遇界面 Bug,请提交问题至 GitHub。」這一句的元素const bugReportText = document.querySelector('#about-body-0 li:last-child span');if (bugReportText) {console.log('找到「如遇界面 Bug,请提交问题至 GitHub。」的文字元素,準備添加按鈕...');// 創建截圖按鈕const screenshotButton = document.createElement("button");screenshotButton.innerText = "截取表格";screenshotButton.style.marginLeft = "10px";screenshotButton.style.padding = "5px 10px";screenshotButton.style.backgroundColor = "#007bff";screenshotButton.style.color = "#fff";screenshotButton.style.border = "none";screenshotButton.style.borderRadius = "4px";screenshotButton.style.cursor = "pointer";// 將按鈕插入到指定文字的下方bugReportText.parentNode.insertBefore(screenshotButton, bugReportText.nextSibling);// 點擊按鈕時觸發截圖功能screenshotButton.addEventListener("click", function () {console.log("截圖按鈕被點擊,開始截圖...");// 獲取要截圖的 tbody 元素const tbodyElement = document.querySelector(".about-metadata tbody");if (tbodyElement && tbodyElement.children.length > 0) {console.log("找到 tbody 元素,內容如下:", tbodyElement.innerHTML);// 創建一個 canvas 元素const canvas = document.createElement("canvas");const ctx = canvas.getContext("2d");// 設置 canvas 大小const padding = 20; // 內邊距const cellHeight = 30; // 單元格高度const cellWidth = 150; // 單元格寬度const rows = tbodyElement.querySelectorAll("tr");const cols = rows[0].querySelectorAll("td").length;canvas.width = cols * cellWidth + padding * 2;canvas.height = rows.length * cellHeight + padding * 2;// 設置背景顏色ctx.fillStyle = "#ffffff"; // 白色背景ctx.fillRect(0, 0, canvas.width, canvas.height);// 設置表格樣式ctx.strokeStyle = "#000000"; // 黑色邊框ctx.lineWidth = 1;ctx.font = "14px Arial";ctx.textAlign = "center"; // 文字居中ctx.textBaseline = "middle"; // 文字垂直居中// 繪製表格內容let y = padding;rows.forEach((row) => {let x = padding;const cells = row.querySelectorAll("td");// 繪製單元格邊框ctx.strokeRect(x, y, cellWidth * cols, cellHeight);cells.forEach((cell) => {// 繪製單元格背景顏色ctx.fillStyle = "#f0f0f0"; // 灰色背景ctx.fillRect(x, y, cellWidth, cellHeight);// 繪製單元格文字ctx.fillStyle = "#000000"; // 黑色文字ctx.fillText(cell.innerText, x + cellWidth / 2, y + cellHeight / 2);x += cellWidth;});y += cellHeight;});// 將 canvas 轉換為圖片const image = canvas.toDataURL("image/png");// 創建一個鏈接元素,用於下載圖片const link = document.createElement("a");link.href = image;link.download = "Mortal.png"; // 設置圖片名稱link.click();console.log("圖片已生成並觸發下載。");} else {console.error("未找到指定的表格內容或內容為空!");alert("未找到指定的表格內容或內容為空!");}});} else {console.error("未找到「如遇界面 Bug,请提交问题至 GitHub。」的文字元素!");}}// ==================== 初始化 ====================function init() {initReportHelper(); // 初始化举报小帮手功能addCopyButton(); // 初始化复制牌谱 URL 功能// 監聽「關於」按鈕的點擊事件const aboutButton = document.querySelector("#about");if (aboutButton) {aboutButton.addEventListener("click", function () {// 等待彈出對話框內容加載完成setTimeout(() => {addScreenshotButton(); // 添加截圖按鈕}, 1000); // 延遲 1 秒以確保內容加載完成});}}// 等待 DOM 加载完成window.addEventListener("load", init);})();