Greasy Fork is available in English.

Tinychat Trivia Auto-Responder

Automatically answers trivia questions on Tinychat with enhanced debugging and error handling

Aquí están todas las versiones de este script. Mostrar únicamente las versiones en las que hubo cambios de código.

  • v11.1 17/8/2024
  • v9.7 17/8/2024

    // ==UserScript==
    // @name Tinychat Trivia Auto-Responder
    // @author AllAccessEvIL with help from Bort & X0R
    // @version 11.1
    // @description Automatically answers trivia questions on Tinychat with enhanced debugging and error handling
    // @match https://tinychat.com/room/*
    // @grant none
    // @run-at document-start
    // @license MIT
    // @namespace https://greasyfork.org/users/1351339
    // ==/UserScript==

    /* jshint esversion: 6 */

    (function () {
    "use strict";

    // Debugging and Logging Setup
    function log(message) {
    console.log(`[Tinychat Trivia Auto-Responder] ${message}`);
    var logContainer = document.getElementById("logContainer");
    if (logContainer) {
    logContainer.innerHTML += `

    ${message}

    `;
    }
    }

    // Create a logging window for debugging
    function createLogWindow() {
    var logWindow = document.createElement('div');
    logWindow.id = 'logWindow';
    logWindow.style.position = 'fixed';
    logWindow.style.bottom = '0';
    logWindow.style.right = '0';
    logWindow.style.width = '300px';
    logWindow.style.height = '200px';
    logWindow.style.overflow = 'auto';
    logWindow.style.backgroundColor = 'rgba(0,0,0,0.7)';
    logWindow.style.color = 'white';
    logWindow.style.padding = '10px';
    logWindow.style.zIndex = '9999';
    logWindow.style.fontSize = '12px';
    logWindow.innerHTML = '

    ';
    document.body.appendChild(logWindow);
    }

    // Track trivia questions asked
    var triviaQuestionCount = 0;

    // Send a custom message
    function sendMessage(message) {
    if (CTS.SocketTarget && CTS.SocketTarget.send) {
    var formattedMessage = JSON.stringify({"tc": "msg", "text": message});
    log(`Sending message: ${message}`);
    CTS.SocketTarget.send(formattedMessage);
    } else {
    log("WebSocket connection not available for sending messages.");
    sendError("WebSocket connection lost.");
    }
    }

    // Send special messages after certain trivia questions
    function sendSpecialMessages() {
    if (triviaQuestionCount === 4 || triviaQuestionCount === 9) {
    sendMessage("Who's Ready to Smoke with 😈˜”*°”*°•𝐀𝐥𝐥𝐀𝐜𝐜𝐞𝐬𝐬𝐄𝐯𝐈𝐋•°*°*”˜😈");
    log("Special message sent after trivia question count: " + triviaQuestionCount);
    }
    }

    // WebSocket Proxy Integration
    function CTSWebSocket() {
    if (window.Proxy === undefined) return;

    // WebSocket handler to intercept and log messages
    var handler = {
    set: function(Target, prop, value) {
    if (prop === "onmessage") {
    var oldMessage = value;
    value = function(event) {
    var data = JSON.parse(event.data);
    if (data.tc === "msg") {
    log(`Received message: ${data.text}`);
    handleMessage(data.text);
    }
    oldMessage(event);
    };
    }
    return (Target[prop] = value);
    },
    get: function(Target, prop) {
    var value = Target[prop];
    if (prop === "send") {
    value = function(event) {
    var data = JSON.parse(event);
    log(`Sending message: ${data.text}`);
    Target.send(event);
    };
    } else if (typeof value === 'function') {
    value = value.bind(Target);
    }
    return value;
    }
    };

    var WebSocketProxy = new window.Proxy(window.WebSocket, {
    construct: function(Target, args) {
    CTS.SocketTarget = new Target(args[0]);
    log(`SOCKET::CONNECTING ${args[0]}`);
    return new window.Proxy(CTS.SocketTarget, handler);
    }
    });
    window.WebSocket = WebSocketProxy;
    }

    // Handle incoming chat messages
    function handleMessage(text) {
    // Detect if the message starts with "[TRIVIA]"
    if (text.includes("[TRIVIA]")) {
    triviaQuestionCount++;
    log("Trivia question detected.");
    sendSpecialMessages(); // Check if a special message needs to be sent
    var messageText = text;
    var questionMatch = messageText.match(/\[TRIVIA\](.*?)(\["A\)", "B\)", "C\)", "D\)"/);
    if (questionMatch) {
    var question = questionMatch[1].trim();
    log(`Question detected: ${question}`);
    fetchCorrectAnswer(question);
    } else {
    log("No trivia question match found.");
    }
    }
    }

    // Fetch the correct answer from the Open Trivia Database
    function fetchCorrectAnswer(question) {
    var apiUrl = "https://opentdb.com/api.php?amount=50&type=multiple";
    log(`Fetching trivia data from API URL: ${apiUrl}`);

    fetch(apiUrl)
    .then(response => response.json())
    .then(data => {
    log(`API response data: ${JSON.stringify(data)}`);
    var questionData = data.results.find(q => q.question.toLowerCase().includes(question.toLowerCase()));
    if (questionData) {
    var correctAnswer = questionData.correct_answer;
    var answerOptions = ["A)", "B)", "C)", "D)"];
    var allOptions = questionData.incorrect_answers.concat(correctAnswer);
    var selectedOptionIndex = allOptions.indexOf(correctAnswer);

    if (selectedOptionIndex !== -1) {
    var selectedOption = answerOptions[selectedOptionIndex];
    log(`Correct answer identified: ${selectedOption}`);
    sendAnswer(selectedOption);
    } else {
    log("Correct answer not found in options.");
    sendError("Correct answer not found in options.");
    }
    } else {
    log("Question not found in trivia data.");
    sendError("Trivia question not found in database.");
    }
    })
    .catch(error => {
    log(`API request failed: ${error}`);
    sendError("API request failed.");
    });
    }

    // Send the correct answer to the chat
    function sendAnswer(option) {
    var message = JSON.stringify({"tc": "msg", "text": option});
    log(`Sending answer: ${option}`);
    sendMessage(message);

    // Wait for a response and send a follow-up message if correct
    setTimeout(() => {
    var responseMessage = JSON.stringify({"tc": "msg", "text": "Your answer was correct!"});
    log(`Sending follow-up message: "Your answer was correct!"`);
    sendMessage(responseMessage);

    // Send additional message after another 3 seconds
    setTimeout(() => {
    var additionalMessage = JSON.stringify({"tc": "msg", "text": "𝕐𝕒𝕝𝕝 𝔾𝕠𝕟𝕖 𝕃𝕖𝕒𝕣𝕟 𝕋𝕠𝕕𝕒𝕪"});
    log(`Sending additional message: "𝕐𝕒𝕝𝕝 𝔾𝕠𝕟𝕖 𝕃𝕖𝕒𝕣𝕟 𝕋𝕠𝕕𝕒𝕪"`);
    sendMessage(additionalMessage);
    }, 3000); // 3-second delay
    }, 3000); // 3-second delay after the answer
    }

    // Send an error message to the chat and log it
    function sendError(errorMessage) {
    var message = JSON.stringify({"tc": "msg", "text": `Error: ${errorMessage}`});
    log(`Sending error message: ${errorMessage}`);
    sendMessage(message);
    }

    // Initialize WebSocket proxy
    CTSWebSocket();

    // Start the logging window
    createLogWindow();

    // Initialize and run the script
    var e = 0, i;
    var error_code = [
    "Timeout",
    "Bad Code",
    "More Than One Addon Running",
    "Version Mismatch"
    ];

    var CTS = {
    Init: function Init() {
    e++;
    if (CTS.PageLoaded()) {
    try {
    if (window.CTS === undefined) {
    window.CTS = true;
    CTS.Dispose();
    if (CTS.Version()) {
    log("Script initialized.");
    } else {
    CTS.Flag(
    3,
    "ReqVersion:" +
    Project.RequiredVersion.Major +
    "." +
    Project.RequiredVersion.Minor +
    "." +
    Project.RequiredVersion.Patch +
    "\nCTSVersion:" +
    (window.CTSVersion ? window.CTSVersion.Major : "N/A") +
    "." +
    (window.CTSVersion ? window.CTSVersion.Minor : "N/A") +
    "." +
    (window.CTSVersion ? window.CTSVersion.Patch : "N/A")
    );
    }
    } else {
    CTS.Flag(2);
    }
    } catch (e) {
    CTS.Flag(1, e);
    }
    if (e >= 20) CTS.Flag(0);
    }
    },
    Load: function Load() {
    var val = localStorage.getItem("CTS_" + arguments[0]);
    if (val === null && typeof arguments[1] !== "undefined") {
    CTS.Save(arguments[0], arguments[1]);
    return arguments[1];
    }
    return val;
    },
    Save: function Save() {
    localStorage.setItem("CTS_" + arguments[0], arguments[1]);
    },
    PageLoaded: function PageLoaded() {
    return document.querySelector("tinychat-webrtc-app") &&
    document.querySelector("tinychat-webrtc-app").shadowRoot;
    },
    Dispose: function Dispose() {
    clearInterval(i);
    },
    Version: function Version() {
    var ctsVersion = window.CTSVersion || { Major: 0, Minor: 0, Patch: 0 };
    return (
    (Project.RequiredVersion.Major < ctsVersion.Major) ||
    (Project.RequiredVersion.Major === ctsVersion.Major && Project.RequiredVersion.Minor < ctsVersion.Minor) ||
    (Project.RequiredVersion.Major === ctsVersion.Major && Project.RequiredVersion.Minor === ctsVersion.Minor && Project.RequiredVersion.Patch <= ctsVersion.Patch)
    );
    },
    Flag: function Flag(err, caught) {
    clearInterval(i);
    if (error_code[err] !== undefined) {
    log(
    "CTS ADDON ERROR\nCould not load!\nError: " +
    error_code[err] +
    (caught !== undefined ? "\n" + caught : "") +
    "\n\nProject Name:\n" +
    Project.Name
    );
    } else {
    log("Unknown error occurred.");
    }
    }
    };

    i = setInterval(CTS.Init, 500);
    })();

  • v9.7 15/8/2024
  • v9.1 13/8/2024