Tinychat Trivia Auto-Responder

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

These are all versions of this script. Show only the versions where the code changed.

  • v11.1 2024-08-17
  • v9.7 2024-08-17

    // ==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 2024-08-15
  • v9.1 2024-08-13