Better OWOT

This makes OWOT better by adding new stuff to menu like showing and hiding chat, enabling notifications and more!

// ==UserScript==
// @name         Better OWOT
// @name:ru      Лучше OWOT
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  This makes OWOT better by adding new stuff to menu like showing and hiding chat, enabling notifications and more!
// @description:ru Это делает OWOT лучше, добавляя в меню новые функции, такие как отображение и скрытие чата, включение уведомлений и многое другое!
// @author       You
// @match        https://ourworldoftext.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=ourworldoftext.com
// @grant        none
// ==/UserScript==
console.log("Warning!\nDo not paste anything here that might get your IP or token!");
(function() {
     'use strict';
	let title = document.title;
	let newMessageCount = 0;
	let isFocused = true;
	let notificationsOn = localStorage ? !localStorage.notificationsOn || localStorage.notificationsOn === "true" : true;

	window.addEventListener("blur", () => isFocused = false);
	window.addEventListener("focus", () => isFocused = true);

	if (window.Notification){
		Notification.requestPermission();
	}

	OWOT.on("chat", (event) => {
		if (!isFocused || !chatOpen){
			newMessageCount++;
			document.title = `(${newMessageCount}) ${title}`;

			if (notificationsOn && window.Notification && !isFocused && Notification.permission === "granted"){
				let notifText;

				if (event.type === "anon") notifText = `[${event.id}]: ${event.message}`;
				else if (event.type === "anon_nick") notifText = `[*${event.id}] ${event.nickname}: ${event.message}`;
				else notifText = `${event.nickname}: ${event.message}`;

				if (event.op) notifText = "(OP) " + notifText;
				else if (event.admin) notifText = "(Admin) " + notifText;
				else if (event.staff) notifText = "(Staff) " + notifText;
				else if (event.realUsername === "gateway") notifText = "(Discord) " + notifText;

				let notif = new Notification(`OWOT Chat (${event.location === "page" ? "World /" + (location.pathname.substr(1) || "main") : "Global"})`, {
					body:notifText,
					icon:"https://ourworldoftext.com/static/favicon.png",
				});

				notif.addEventListener("click", () => {
					window.focus();
					chat_open.click();
					(event.location === "page" ? chat_page_tab : chat_global_tab).click();
					let chatFieldElement = event.location === "page" ? page_chatfield : global_chatfield;
					chatFieldElement.scroll(0, chatFieldElement.scrollHeight);
					notif.close();
				});

				setTimeout(() => notif.close(), 5000);
			}
		}
	});

	function setNotificationsOn(flag){
		notificationsOn = flag;

		if (localStorage){
			localStorage.notificationsOn = flag;
		}
	}

	OWOT.menu.addCheckboxOption("Chat Notifications", () => setNotificationsOn(true), () => setNotificationsOn(false), notificationsOn);

	setInterval(() => {
		if (isFocused && chatOpen && newMessageCount > 0){
			document.title = title;
			newMessageCount = 0;
		}
	}, 100);
var removezoombar = document.getElementById("zoombar");
if (w.menu.show) {
removezoombar.remove();
}
(() => {
    if (Permissions.can_chat(state.userModel, state.worldModel)) return;

    let w_url = `ws${window.location.protocol == "https:" ? "s" : ""}://${
        window.location.host
    }/w${state.worldModel.pathname}/ws/${window.location.search || ""}`;
    let sock = new WebSocket(w_url);

    sock.onopen = () => {
        window.selectedChatTab = 0;
        ws_functions.propUpdate({props: [{type: "chat", value: 0}]});
        w.showChat();
        elm.chat_open.style.backgroundColor = "#990000";
        elm.total_unread.style.color = "#FFFF00";

        sock.onmessage = msg => {
            let data = JSON.parse(msg.data);
            if (data.kind.startsWith("chat")
               || ["channel", "user_count"].includes(data.kind)) {
                ws_functions[data.kind](data);
            }
        };

        sock.send(JSON.stringify({ kind: "chathistory" }));
        w.on("chat", e => {
            w.emit("chatmod", e);
            if (e.hide) return;
            event_on_chat(e);
        });
        
        network.chat = (message, location, nickname, color) => {
            sock.send(JSON.stringify({
                kind: "chat",
                nickname,
                message,
                location,
                color,
            }));
        };
    };
})();
(function(){ OWOT.menu.addCheckboxOption("Render all links", () => {linksRendered = true;renderTiles(true);}, () => {linksRendered = false;renderTiles(true);}, true); })();
OWOT.menu.addCheckboxOption("Show chat", () => w.showChat(), () => w.hideChat())
Permissions.can_paste = function() {return true;};
(function() { clearInterval(writeInterval); writeInterval = setInterval(function() { if(!writeBuffer.length || (write_busy && writeBuffer.length < 50)) return; try { flushWrites(); } catch(e) { console.log(e); } }, 10); })();
})();