Better OWOT

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

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Greasemonkey lub Violentmonkey.

You will need to install an extension such as Tampermonkey to install this script.

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Violentmonkey.

Aby zainstalować ten skrypt, wymagana będzie instalacja rozszerzenia Tampermonkey lub Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

Aby zainstalować ten skrypt, musisz zainstalować rozszerzenie menedżera skryptów użytkownika.

(Mam już menedżera skryptów użytkownika, pozwól mi to zainstalować!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Musisz zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

(Mam już menedżera stylów użytkownika, pozwól mi to zainstalować!)

// ==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); })();
})();