Raw Source
stephfuchs / queer wisdom for Twitter

// ==UserScript==
// @name            queer wisdom for Twitter
// @namespace       stephfuchs.queer.wisdowm.for.twitter
// @version         1.0.0
// @author          Stephanie Fuchs
// @description     The "Queer wisdom for Twitter" script adds a button with a queer flag for the LGBTQIA+ community. By clicking the flag the script will add a random wisdom. There is a list of quotes provided by a JSON file. So the script automatically gets quote-updates. Updates concerning the script are just as features or bugfixing.
// @homepage        https://github.com/stephfuchs/queer-wisdom-for-twitter-userscript
// @include         https://twitter.com/home
// @include         https://twitter.com/intent/*
// @run-at          document-body
// @downloadURL     https://github.com/stephfuchs/queer-wisdom-for-twitter-userscript/raw/master/queer-wisdom-for-twitter.user.js
// @updateURL       https://github.com/stephfuchs/queer-wisdom-for-twitter-userscript/raw/master/queer-wisdom-for-twitter.user.js
// @supportURL      https://github.com/stephfuchs/queer-wisdom-for-twitter-userscript/issues
// @license         MIT
// ==/UserScript==

(function () {
    'use strict';

    /**
     * Start the plugin stuff to tweet queer stuff.
     */
    class Plugin {

        /**
         * Run the stuff when document body is loaded
         */
        start() {
            var twitterIsReady = setInterval(function () {
                let version = '1.0.0';
                let name = 'Queer wisdom for Twitter';
                let copyright = '(c) 2021 • Stephanie Fuchs • https://github.com/stephfuchs';
                let classes = '.css-1dbjc4n.r-1awozwy.r-18u37iz.r-156q2ks';

                if (document.querySelector(classes) !== null || document.querySelector(classes) !== undefined) {
                    let wisdom = new QueerWisdom();
                    console.info('loaded script: "' + name + '" with version: ' + version + '\n' + copyright);
                    clearInterval(twitterIsReady);
                    console.debug(wisdom.debug + 'removed interval');
                    wisdom.init();
                    console.debug(wisdom.debug + 'created new wisdom object');
                }
            }, 3000); // check every 3sec

            /**
             * Check the system every 5 min whether the button is been missing.
             */
            setInterval(function () {
                if (document.getElementById('queer_wisdom') === null) {
                    console.debug('Button was deleted. Restarts.');
                    let wisdom = new QueerWisdom();
                    wisdom.init();
                    console.info('reloaded the queer button, because it disappeared.');
                    console.debug('Restart finished.');
                }
            }, 300000); // check every 5 min
        }
    }

    var plugin = new Plugin();
    plugin.start();

    /**
     * Make the queer wisdom great again.
     */
    class QueerWisdom {

        /**
         * Provide some variables for the the extra button.
         */
        constructor() {
            this.debug = '## Queer wisdom for Twitter debugger ##\n';
            this.info = '## Queer wisdom for Twitter information ##\n';
            this.queerElement = null;
            this.queerElementId = 'queer_wisdom';
            this.lesbianJesus = new HayleyKiyoko();
        }

        /**
         * Initialization of the script.
         */
        init() {
            let tweetOptionContainerElement = document.querySelector('.css-1dbjc4n.r-1awozwy.r-18u37iz.r-156q2ks');
            console.debug(this.debug + 'Initialization of the script starts.');
            console.debug(this.debug + tweetOptionContainerElement);

            this._createQueerElement();
            tweetOptionContainerElement.append(this.queerElement);
            console.debug(this.debug + 'Added lgbtqia+ flag.');
            console.debug(this.debug + tweetOptionContainerElement);
            console.debug(this.debug + 'Initialization of the script ended.');
        }

        /**
         * Creates a new div container with the queer flag.
         *
         * @returns {HTMLDivElement}
         * @private
         */
        _createQueerElement() {
            this.queerElement = document.createElement('a');
            this.queerElement.id = this.queerElementId;
            this.queerElement.style.paddingLeft = '10px';
            this.queerElement.title = 'add a random queer wisdom';
            this.queerElement.innerHTML = this._getFlagSVG();
            this.queerElement.setAttribute('href', 'https://twitter.com/intent/tweet?text=' + encodeURI(this._getJsonWisdom()));
            console.debug(this.debug + 'Created tweet: https://twitter.com/intent/tweet?text=' + encodeURI(this._getJsonWisdom()));
        }

        /**
         * Get the wisdom from the JSON.
         *
         * @returns {string}
         * @private
         */
        _getJsonWisdom() {
            console.info(this.info + 'We have to call Hayley Kiyoko for help.');
            let girlsLikeGirls = this.lesbianJesus.girlsLikeGirls().wisdoms;
            let wisdomCount = girlsLikeGirls.length;
            console.info(this.info + 'The answer from Hayley Kiyoko has arrived with ' + wisdomCount + ' wisdoms.');

            let random = Math.floor(Math.random() * wisdomCount);
            let hayleyWisdom = girlsLikeGirls[random];
            console.debug(this.debug + 'random number: ' + random);
            console.debug(this.debug + 'random wisdom: ' + hayleyWisdom.quote);

            switch (hayleyWisdom) {
                case hayleyWisdom.copyright === "":
                    return hayleyWisdom.quote;

                case hayleyWisdom.copyright !== "":
                default:
                    return hayleyWisdom.quote + '\n-- ' + hayleyWisdom.copyright;
            }
        }

        /**
         * Get the LGBTQIA+ flag.
         * Credits for the svg: https://commons.wikimedia.org/wiki/File:LGBTQ%2B_rainbow_flag_Quasar_%22Progress%22_variant.svg
         *
         * @returns {string}
         * @private
         */
        _getFlagSVG() {
            return '<svg style="width: 27px; height: auto;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 6000 3810">\n' +
                '\t<rect fill="#750787" width="6000" height="3810"/>\n' +
                '\t<rect fill="#004dff" width="6000" height="3175"/>\n' +
                '\t<rect fill="#008026" width="6000" height="2540"/>\n' +
                '\t<rect fill="#ffed00" width="6000" height="1905"/>\n' +
                '\t<rect fill="#ff8c00" width="6000" height="1270"/>\n' +
                '\t<rect fill="#e40303" width="6000" height="635"/>\n' +
                '\n' +
                '    <polygon points="-1,960 950,1905 -1,2850" fill="#ffffff"/>\n' +
                '    <polygon points="-1,960 -1,480 1420,1905 -1,3330 -1,2850 950,1905" fill="#ffafc8"/>\n' +
                '    <polygon points="-1,480 -1,0 1912,1905 -1,3810 -1,3330 1420,1905 -1,480" fill="#74d7ee"/>\n' +
                '    <polygon points="-1,0 1912,1905 -1,3810 480,3810 2384,1905 480,0" fill="#613915"/>\n' +
                '    <polygon points="480,0 960,0 2864,1905 960,3810 480,3810 2384 1905 480,0" fill="#000000"/>\n' +
                '</svg>';
        }
    }

    /**
     * The class for the lesbian jesus to give us the queer wisdom.
     */
    class HayleyKiyoko {

        /**
         * It's obvious.
         *
         * @returns {JSON}
         */
        girlsLikeGirls() {
            return {
                "wisdoms": [
                    {
                        "quote": "I am here, I am queer.",
                        "copyright": ""
                    },
                    {
                        "quote": "It's LGBTQIA\+\nL\=lesbian\nG\=gay\nB\=bi\nT\=trans\nQ\=queer\nI\=intersex\nA\=ace\/aro\n\+\=ally",
                        "copyright": ""
                    },
                    {
                        "quote": "There is no man in a wlw relationship. That is the point.",
                        "copyright": ""
                    },
                    {
                        "quote": "Did I hit my head and wake up in patriarchal bullshit land?",
                        "copyright": "Nicole Haught \('Wynonna Earp'\)"
                    },
                    {
                        "quote": "Others: \"How do you know, you are queer?\" - Me: \"How do you know you are not?\" ",
                        "copyright": ""
                    },
                    {
                        "quote": "When someone tells you they are < insert label >, accept it. They know best, who they are.",
                        "copyright": ""
                    },
                    {
                        "quote": "\"Really, I don't know why I did this. I guess it's probably because I've got a big lesbian crush on you! Suck on that! AY-YI-YI-YI-YI-YI!\"",
                        "copyright": "Janis \('Mean Girls'\)"
                    },
                    {
                        "quote": "Hetero people when they see women kissing: \"Oh, they must be good friends\" - Queer women: \"Me n who???\"",
                        "copyright": ""
                    },
                    {
                        "quote": "There is no wrong or right about beeing queer. You are who you are and this should be always right.",
                        "copyright": ""
                    },
                    {
                        "quote": "\"You are a lesbian, not a unicorn, right?\"",
                        "copyright": "Waverly Earp \('Wynonna Earp'\)"
                    },
                    {
                        "quote": "My religion is called Hayley Kiyoko and she is the lesbian jesus.",
                        "copyright": ""
                    }
                ]
            };
        }
    }
})();