您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add buttons for quick answers in a Xenforo forum organized into categories and subcategories
// ==UserScript== // @name Quick Answers for Xenforo Forum // @namespace http://tampermonkey-script-example // @version 1 // @description Add buttons for quick answers in a Xenforo forum organized into categories and subcategories // @author Your Name // @match *://*.forum.blackrussia.online/* // @include https://forum.blackrussia.online/index.php?threads/ // @grant none // ==/UserScript== (async function () { `use strict`; const UNACCEPT_PREFIX = 4; // Prefix that will be set when thread closes const ACCEPT_PREFIX = 8; // Prefix that will be set when thread accepted const PIN_PREFIX = 2; // Prefix that will be set when thread pins const COMMAND_PREFIX = 10; // Prefix that will be set when thread send to project team const WATCHED_PREFIX = 9; const CLOSE_PREFIX = 7; const SPECADM_PREFIX = 11; const DECIDED_PREFIX = 6; const MAINADM_PREFIX = 12; const TECHADM_PREFIX = 13; const CHECKED_PREFIX = 9 const data = await getThreadData(), greeting = data.greeting, user = data.user; // Create the buttons for each subcategory function createButtons(subcategory, answers) { const buttons = []; answers.forEach((answer, id) => { const buttonTitle = `${subcategory}-${id}`; const buttonMarkup = `<button id="${buttonTitle}">${answer.title}</button>`; buttons.push(buttonMarkup); // When button is clicked, paste the answer content $(`button#${buttonTitle}`).click(() => { XF.alert(answer.content, null, 'Выберите ответ:'); pasteContent(answer.content, threadData); }); }); return buttons.join(' '); } // Paste the selected answer content into the forum post function pasteContent(content, threadData) { // Replace with your own code to paste the content into the forum post console.log(`Selected answer: ${content}`); } // Define the categories, subcategories, and answers const categories = [ { name: 'Report', subcategories: [ { name: 'Opening', answers: [ { title: 'Hi', content: '[SIZE=4][FONT=verdana][SIZE=4]Здравствуйте.<br><br>[color=lightgreen] Рассмотрено.[/color][/FONT] [/SIZE]' }, { title: 'Hello', content: '[SIZE=4][FONT=verdana][SIZE=4]Привет.<br><br>[color=lightgreen] Рассмотрено.[/color][/FONT] [/SIZE]' } ] } ] }, { name: 'Amnesia', subcategories: [ { name: 'Opening', answers: [ { title: 'Bye', content: '[SIZE=4][FONT=verdana][SIZE=4]До свидания.<br><br>[color=lightgreen] Рассмотрено.[/color][/FONT] [/SIZE]' }, { title: 'Goodbye', content: '[SIZE=4][FONT=verdana][SIZE=4]Прощай.<br><br>[color=lightgreen] Рассмотрено.[/color][/FONT] [/SIZE]' } ] } ] } ]; $(document).ready(() => { // Загрузка скрипта для обработки шаблонов $(`body`).append(`<script src="https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js"></script>`); // Добавление кнопок при загрузке страницы addButton(`Ans`, `selectAnswer`); addButton(`Pin`, `pin`); addButton(`Approved`, `accepted`); addButton(`КП`, `teamProject`); addButton(`Close`, `closed`); addButton (`Spec.A`, `specialAdmin`); addButton (`Checked`, `checked`) // Поиск информации о теме const threadData = getThreadData(); $(`button#unaccept`).click(() => editThreadData(UNACCEPT_PREFIX, false)); $(`button#pin`).click(() => editThreadData(PIN_PREFIX, true)); $(`button#accepted`).click(() => editThreadData(ACCEPT_PREFIX, false)); $(`button#teamProject`).click(() => editThreadData(COMMAND_PREFIX, true)); $(`button#specadm`).click(() => editThreadData(SPECADM_PREFIX, true)); $(`button#mainadm`).click(() => editThreadData(MAINADM_PREFIX, true)); $(`button#watched`).click(() => editThreadData(WATCHED_PREFIX, false)); $(`button#decided`).click(() => editThreadData(DECIDED_PREFIX, false)); $(`button#closed`).click(() => editThreadData(CLOSE_PREFIX, false)); $(`button#techspec`).click(() => editThreadData(TECHADM_PREFIX, true)); $(`button#specialAdmin`).click(() => editThreadData(SPECADM_PREFIX, true)); $(`button#checked`).click(() => editThreadData(CHECKED_PREFIX, false)); $(`button#statusTheme`).click(() => { const threadTitle = $(`.p-title-value`)[0].lastChild.textContent; let status = threadData.theme_status if ( status == false) status = 1 else status = 0 fetch(`${document.URL}edit`, { method: `POST`, body: getFormData({ title: threadTitle, discussion_open: status, _xfToken: XF.config.csrf, _xfRequestUri: document.URL.split(XF.config.url.fullBase)[1], _xfWithData: 1, _xfResponseType: `json`, }), }).then(() => location.reload()); }); $(`button#selectAnswer`).click(() => { XF.alert(buttonsMarkup(buttons), null, `Select an answer:`); buttons.forEach((btn, id) => { if (id >1) { $(`button#answers-${id}`).click(() => pasteContent(id, threadData, true)); } else { $(`button#answers-${id}`).click(() => pasteContent(id, threadData, false)); } }); }); }); function addButton(name, id) { $(`.button--icon--reply`).before( `<button type="button" class="button rippleButton" id="${id}" style="margin: 3px;">${name}</button>`, ); } function buttonsMarkup(buttons) { return `<div class="select_answer">${buttons .map( (btn, i) => `<button id="answers-${i}" class="button--primary button ` + `rippleButton" style="margin:5px"><span class="button-text">${btn.title}</span></button>`, ) .join(``)}</div>`; } $('#input').focus(function() { $(this).setCursorPosition(4); }); async function getThreadData() { const authorID = $(`a.username`)[0].attributes[`data-user-id`].nodeValue; const authorName = $(`a.username`).html(); const theme_status = $(`a.discussion_open`).html(); const hours = new Date().getHours(); const greeting = 4 < hours && hours <= 11 ? `Доброе утро` : 11 < hours && hours <= 15 ? `Добрый день` : 15 < hours && hours <= 21 ? `Добрый вечер` : `Доброй ночи` return { user: { id: authorID, name: authorName, mention: `[USER=${authorID}]${authorName}[/USER]`, }, theme_status, greeting: greeting }; } function editThreadData(prefix, pin = false) { // Получаем заголовок темы, так как он необходим при запросе const threadTitle = $(`.p-title-value`)[0].lastChild.textContent; if (pin == false) { fetch(`${document.URL}edit`, { method: `POST`, body: getFormData({ prefix_id: prefix, title: threadTitle, _xfToken: XF.config.csrf, _xfRequestUri: document.URL.split(XF.config.url.fullBase)[1], _xfWithData: 1, _xfResponseType: `json`, }), }).then(() => location.reload()); } if (pin == true) { fetch(`${document.URL}edit`, { method: `POST`, body: getFormData({ prefix_id: prefix, title: threadTitle, sticky: 1, _xfToken: XF.config.csrf, _xfRequestUri: document.URL.split(XF.config.url.fullBase)[1], _xfWithData: 1, _xfResponseType: `json`, }), }).then(() => location.reload()); } } function getFormData(data) { const formData = new FormData(); Object.entries(data).forEach(i => formData.append(i[0], i[1])); return formData; } })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址