Greasy Fork is available in English.

Ignore 10

Allows to ignore 10-point ratings in average score (Shiki)

// ==UserScript==
// @name         Ignore 10
// @namespace    http://tampermonkey.net/
// @version      1.1.1
// @description  Allows to ignore 10-point ratings in average score (Shiki)
// @author       chabab
// @match        https://shikimori.one/*
// @icon         https://shikimori.one/assets/layouts/l-top_menu-v2/glyph.svg
// @grant        none
// @license      MIT
// ==/UserScript==

'use strict';

function insertBlock(source, scoresNum) {
    const malScore = document.querySelector('.scores');
    malScore.style.alignItems = 'center';

    const malScoreInfo = document.createElement('p');
    malScoreInfo.innerHTML = `На основе оценок MAL`;
    malScoreInfo.setAttribute('style', 'margin-bottom: 15px;');

    const labelDuplicate = document.querySelector('.scores .score-source');
    if (labelDuplicate) {
        labelDuplicate.after(malScoreInfo);
        labelDuplicate.remove();
    } else {
        malScore.appendChild(malScoreInfo);
    }

    const bRate = document.querySelector('.scores .b-rate');
    bRate.setAttribute('id', 'MAL-rate');

    const sourceScore = bRate.cloneNode(true);
    sourceScore.setAttribute('id', `${source}-rate`);

    const scoreInfo = document.createElement('p');
    scoreInfo.innerHTML = `На основе <span style="font-weight: 1000;">${scoresNum}</span> оценок ${source}`;
    scoreInfo.setAttribute('style', 'margin-bottom: 12px');
    scoreInfo.setAttribute('id', `${source}-scores`);

    malScore.appendChild(sourceScore);
    malScore.appendChild(scoreInfo);

    const blockParent = malScore.parentElement;
    const scoresHeader = document.createElement('div');
    const textHeader = document.querySelector('.block .m5');
    const button = document.createElement('div');
    const buttonText = document.createElement('span');

    textHeader.style.width = '-moz-available';
    button.appendChild(buttonText);
    button.style.position = 'unset';
    button.style.height = 'fit-content'
    button.style.alignContent = 'center';
    scoresHeader.setAttribute('id', 'ignore-10');
    scoresHeader.style.display = 'flex';
    scoresHeader.style.alignItems = 'center';
    scoresHeader.style.marginBottom = '12px';
    button.classList.add('b-link_button');
    scoresHeader.append(button);

    blockParent.insertBefore(scoresHeader, malScore);
    scoresHeader.insertBefore(textHeader, button);

    const scoreNotices = [
        {"10": "Эпик вин!", "9": "Великолепно", "8": "Отлично", "7": "Хорошо", "6": "Нормально", "5": "Более-менее", "4": "Плохо", "3": "Очень плохо", "2": "Ужасно", "1": "Хуже некуда"}
    ]

    return [button, buttonText, scoreNotices];
};

function appendShikiRating() {

    const shikiRating = () => {
        if (isIgnore == false) {
            isIgnore = true;
            shikiBlock[1].innerText = 'w/ 10';

            const oldStarClass = Array.from(starScore.classList).find(c => c.startsWith('score-'));
            if (oldStarClass) {
                starScore.classList.remove(oldStarClass);
            }

            const oldTextClass = Array.from(textScore.classList).find(c => c.startsWith('score-'));
            if (oldTextClass) {
                textScore.classList.remove(oldTextClass);
            }

            elemSum = elemSum - elemSumDiff
            elemCount = elemCount - elemCountDiff
            shikiAvgScore = elemSum / elemCount
            let textScoreDec = Math.round(shikiAvgScore);
            let textScoreDecFloor = Math.floor(shikiAvgScore);
            textScore.innerHTML = shikiAvgScore.toFixed(2);
            scoresCount.innerHTML = `На основе <span style="font-weight: 1000;">${elemCount}</span> оценок Shiki`;

            for (const elem of shikiBlock[2]) {
                for (const key of Object.keys(elem)) {
                    if (key == textScoreDecFloor) {
                        scoreNotice.innerHTML = elem[key]
                    }
                }
            }

            textScore.classList.add(`score-${textScoreDec}`);
            starScore.classList.add(`score-${textScoreDec}`);

        } else {
            isIgnore = false;
            shikiBlock[1].innerText = 'w/o 10';

            const oldStarClass = Array.from(starScore.classList).find(c => c.startsWith('score-'));
            if (oldStarClass) {
                starScore.classList.remove(oldStarClass);
            }

            const oldTextClass = Array.from(textScore.classList).find(c => c.startsWith('score-'));
            if (oldTextClass) {
                textScore.classList.remove(oldTextClass);
            }

            elemSum = elemSum + elemSumDiff
            elemCount = elemCount + elemCountDiff
            shikiAvgScore = elemSum / elemCount
            let textScoreDec = Math.round(shikiAvgScore);
            let textScoreDecFloor = Math.floor(shikiAvgScore);
            textScore.innerHTML = shikiAvgScore.toFixed(2);
            scoresCount.innerHTML = `На основе <span style="font-weight: 1000;">${elemCount}</span> оценок Shiki`;

            for (const elem of shikiBlock[2]) {
                for (const key of Object.keys(elem)) {
                    if (key == textScoreDecFloor) {
                        scoreNotice.innerHTML = elem[key]
                    }
                }
            }

            textScore.classList.add(`score-${textScoreDec}`);
            starScore.classList.add(`score-${textScoreDec}`);
        }
    }

    if (document.querySelector('#Shiki-rate')) {
        console.log('Shiki rating block already exists. Skipping.');
        return;
    }

    let isIgnore = false;

    const dataBlock = document.querySelector('#rates_scores_stats');
    if (!dataBlock) {
        return ;
    }
    const dataJSON = dataBlock.getAttribute('data-stats')
    const data = JSON.parse(dataJSON);

    let elemSum = 0;
    let elemCount = 0;
    let elemSumDiff = 0;
    let elemCountDiff = 0;

    for (const elem of data) {
        if (elem[0] == '10') {
            elemSumDiff = elem[0] * elem[1];
            elemCountDiff = elem[1];
        }
        elemSum += (elem[0] * elem[1]);
        elemCount += elem[1];
    }

    let shikiAvgScore = elemSum / elemCount;
    const shikiBlock = insertBlock("Shiki", elemCount);

    let scoresCount = document.querySelector('#Shiki-scores');
    let scoreNotice = document.querySelector('#Shiki-rate .text-score .score-notice');
    let textScore = document.querySelector('#Shiki-rate .text-score .score-value');
    let starScore = document.querySelector('#Shiki-rate .stars-container .stars');
    starScore.setAttribute('style', 'color: rgb(68, 85, 102)');

    shikiRating();

    shikiBlock[0].addEventListener('click', shikiRating)

    const shikiBRate = document.querySelector('#Shiki-rate')
    shikiBRate.addEventListener('mouseenter', shikiRating)
    shikiBRate.addEventListener('mouseleave', shikiRating)
    //console.log(isIgnore)
};

function ready(fn) {
    document.addEventListener('page:load', fn);
    document.addEventListener('turbolinks:load', fn);

    if (document.attachEvent ? document.readyState === "complete" : document.readyState !== "loading") {
        fn();
    } else {
        document.addEventListener('DOMContentLoaded', fn);
    }
}

ready(appendShikiRating);