rossvor / Hacker News avatars

// ==UserScript==
// @name     Hacker News avatars
// @version  1.1
// @include  https://news.ycombinator.com/item*
// @grant    none
// @description  Display dicebear avatars on Hacker news comments page.
// @author   rossvor
// @license MIT
// @copyright 2019, rossvor (https://openuserjs.org/users/rossvor)
// ==/UserScript==

(() => {
	  "use strict";

    let sumHash = (str) => {
        return str.split('')
            .map(c => c.charCodeAt(0))
            .reduce( (a, v) => a + v );
    };

    let getURL = (str, sources) => {
        let i = sumHash(str) % sources.length;
        return sources[i][0] + str + sources[i][1];
    }

    let users = document.querySelectorAll(".hnuser");
    
    let sources = [
        [ 'https://avatars.dicebear.com/api/adventurer/', '.svg' ],
        [ 'https://avatars.dicebear.com/api/adventurer-neutral/', '.svg' ],
        [ 'https://avatars.dicebear.com/api/avataaars/', '.svg' ],
        [ 'https://avatars.dicebear.com/api/big-ears/', '.svg' ],
        [ 'https://avatars.dicebear.com/api/big-ears-neutral/', '.svg' ],
        [ 'https://avatars.dicebear.com/api/big-smile/', '.svg' ],
        [ 'https://avatars.dicebear.com/api/bottts/', '.svg' ],
        [ 'https://avatars.dicebear.com/api/croodles/', '.svg' ],
        [ 'https://avatars.dicebear.com/api/croodles-neutral/', '.svg' ],
        [ 'https://avatars.dicebear.com/api/gridy/', '.svg' ],
        [ 'https://avatars.dicebear.com/api/micah/', '.svg' ],
        [ 'https://avatars.dicebear.com/api/miniavs/', '.svg' ],
        [ 'https://avatars.dicebear.com/api/open-peeps/', '.svg' ],
        [ 'https://avatars.dicebear.com/api/personas/', '.svg' ],
        [ 'https://avatars.dicebear.com/api/pixel-art/', '.svg' ],
    ];

    users.forEach( u => {
        if (u.getAttribute('has-avatar') !== null)
            return;
        let uname = u.textContent;
        let img = document.createElement("img");
        img.setAttribute('src', getURL(uname, sources));
        img.setAttribute('style', 'width: 30px; border-radius: 12%;');
        u.parentElement.appendChild(img);
        u.setAttribute('has-avatar', '');
    });
})();