OWoT online and offline

Tells if someone goes online or offline (if they have this script).

Versión del día 09/03/2023. Echa un vistazo a la versión más reciente.

// ==UserScript==
// @name         OWoT online and offline
// @namespace    https://greasyfork.org/scripts/458537-owot-online-and-offline
// @version      9.1
// @description  Tells if someone goes online or offline (if they have this script).
// @author       e_g.
// @match        https://ourworldoftext.com/*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// ==/UserScript==

let warn = true;
let counter = 0;
let amityping = false;
let people = [];

//Part made by KKosty4ka
var chat_upper = document.getElementById("chat_upper");
chat_upper.appendChild(document.createElement("br"));
var typing_display = chat_upper.appendChild(document.createElement("span"));
typing_display.style.display = "flex";
typing_display.style.justifyContent = "center";
typing_display.style.alignItems = "center";
//Part made by KKosty4ka

menu.addCheckboxOption('Online Offline warning', function(){
    warn = true;
}, function(){
    warn = false;
}, true);

w.broadcastReceive(true);
w.on('cmd', function(e){
    if(!e.username || !warn) return;
    if(e.data.startsWith('online')){
        clientChatResponse(e.username + " is online!");
    }
    else if(e.data.startsWith('offline')){
        clientChatResponse(e.username + " is now offline.");
    }
    else if(e.data.startsWith('back')){
        clientChatResponse(e.username + " is back.");
    }
    else if(e.data.startsWith('afk')){
        clientChatResponse(e.username + " is AFK. (Idle)");
    }
    else if(e.data.startsWith('typing')){
        if(!people.includes(e.username)) people.push(e.username);
        typing_display.innerText = people.join(" and ") + " " + (people.length > 1 ? "are" : "is") + " typing...";
    }
    else if(e.data.startsWith('untyping')){
        people = people.filter((x, i)=>i != people.indexOf(e.username))
        typing_display.innerText = people.length ? people.join(" and ") + " " + (people.length > 1 ? "are" : "is") + " typing..." : "Currently, no one is typing";
    };
});

setTimeout(function(){
    w.broadcastCommand('online', true);
}, 1000);

window.addEventListener('beforeunload', function(){
    w.broadcastCommand('offline', true)
});

window.onblur = function(){w.broadcastCommand('afk', true)};

window.onfocus = function(){w.broadcastCommand('back', true)};

elm.chatbar.oninput = function(e){
    counter = 0;
    amityping = !!elm.chatbar.value.length;
    if(amityping) w.broadcastCommand('typing', true)
    else w.broadcastCommand('untyping', true);
};

setInterval(function(){
    counter += 100;
    if((counter >= 5000 && amityping) || !elm.chatbar.value.length){
        w.broadcastCommand('untyping', true);
        amityping = false;
    };
}, 100);