Greasy Fork is available in English.

Add Quality Score to C.AI

this userscript adds a 'quality' score to characters. it's based on the actions/likes ratio. this way you can be more informed when choosing a character to talk to

// ==UserScript==
// @name        Add Quality Score to C.AI
// @author      Redacted Basilisk
// @namespace   c.ai quality score
// @description this userscript adds a 'quality' score to characters. it's based on the actions/likes ratio. this way you can be more informed when choosing a character to talk to
// @match       https://beta.character.ai/*
// @version     1.0
// @license     GPLv3
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// ==/UserScript==

this.$ = this.jQuery = jQuery.noConflict(true);

window.onload = function() {
    (new MutationObserver(check)).observe(document, { childList: true, subtree: true });
};

const convertToNumber = str => (isNaN(parseFloat(str)) ? 1 : parseFloat(str)) * (str.endsWith('m') ? 1e6 : (str.endsWith('k') ? 1e3 : 1));
function check(changes, observer) {
    observer.disconnect();

  if(document.querySelector('.MuiToggleButtonGroup-root button[value="like"]')) {
        observer.disconnect();
        var likesCount = convertToNumber($('.MuiToggleButtonGroup-root button[value="like"] div').text());
        var actionsCount = convertToNumber($('[style="font-size: 12px; margin-left: 8px; font-weight: 400; display: flex; gap: 2px; align-items: center;"]').text());
        var result = Math.round(0.6*Math.log(actionsCount+1) / 1.2*Math.log(likesCount+1));
        var color = result < 18 ? "#b82f0d" : result < 28 ? "#ba8b0b" : "#258a00"; //change colors if you want. the order is red yellow green
        //console.log(likesCount, actionsCount);

        var lastButton = $('.MuiToggleButtonGroup-root[aria-label="Vote"]>button:last-child');
        lastButton.after('<div id="quality" style="color: ' + color + '!important; padding-top: 4px; padding-left: 8px;">' + result + '</div>');
    }

    observer.observe(document, { childList: true, attributes: true, characterData: true, subtree: true,  attributeFilter: ['class'] });
}