Dedonych / ShikiRand

// ==UserScript==
// @name         ShikiRand
// @updateURL    https://openuserjs.org/meta/Dedonych/ShikiRand.meta.js
// @downloadURL  https://openuserjs.org/install/Dedonych/ShikiRand.user.js
// @namespace    http://tampermonkey.net/
// @copyright    2023, Dedonych (https://openuserjs.org/users/Dedonych)
// @version      0.6
// @description  Добавляет на шикимори кнопку рандом-аниме/манги/ранобе.
// @author       Dedonych
// @match        *://shikimori.org/*
// @match        *://shikimori.one/*
// @match        *://shikimori.me/*
// @license      MIT
// @icon         https://www.google.com/s2/favicons?sz=64&domain=shikimori.me
// @require      https://gist.githubusercontent.com/Chortowod/814b010c68fc97e5f900df47bf79059c/raw/chtw_settings.js
// ==/UserScript==


const style = `
   #random-btn{
      cursor:pointer;
      margin-left:-25px
   }
   #random-btn::before {
        content: "🎲";
        -webkit-filter: grayscale(1);
                filter: grayscale(1);
        font-size: 24px;
    }
    `

let settings = new ChtwSettings('randomButton', `<a target='_blank' href='https://openuserjs.org/scripts/Dedonych/ShikiRand/'>Рандомный тайтл`);

function initSettings() {
    settings.createOption('minScore', 'Минимальная оценка', 3, 'number');
    settings.createOption('nsfw', 'Включить в поиск NSFW');
    settings.createOption('blank', 'Открывать в новой вкладке?');
    settings.createOption('showText', 'Показывать текст у кнопки?', false);
    settings.createOption('myList', "Тип выбора в своем списке", {
        "Выберете вариант": null,
        "Запланированно":"planned",
        "Смотрю": "watching",
        "Пересматриваю": "rewatching",
        "Просмотренно":"completed",
        "Отложенно":"on_hold",
        "Брошенно": "dropped",
    }, 'select');
    settings.createOption("alwaysList","Всегда рандом по списку?",false);

}
function createRandomButton() {
    const {origin} = location;
    'use strict'
    if (document.getElementById("random-btn")) return
    let path = location.pathname.match(/\/\w+\/?/g);
    const arr = ["animes", "ranobe", "mangas"];
    path = (!path || !arr.includes(path[0].replaceAll("/", ""))) ? 'animes' : path[0].replaceAll("/", "");
    const menu_logo = document.querySelector(".menu-logo")
    const randomBtn = document.createElement("div");
    randomBtn.id = "random-btn";
    randomBtn.className='menu-icon';
    randomBtn.textContent = settings.getOption('showText') ? "random" : null;

    randomBtn.onclick = async function () {
        var def = `order=random&score=${settings.getOption("minScore")}&censored=${settings.getOption("nsfw") ? false : true}`
        if(settings.getOption("myList")!==null){
            if(settings.getOption("alwaysList")||(/.+\/list\/(anime|manga|ranobe)/).test(location.pathname)){
                def=`order=random&mylist=${settings.getOption("myList")}`
            }
        }
        console.log(def)
        try {
            const response = await fetch(`${origin}/api/${path}?` + def)
            const data = await response.json();
            open(`${origin}/${path}/${data[0].id}`, settings.getOption("blank") ? "_blank" : "_self");
        }catch(e){
            throw Error(e)
        }
    }
    menu_logo.append(randomBtn)
    settings.addStyle(style)
}
ready(createRandomButton);
ready(initSettings);