flyink13 / Web Sticker Keywords

// ==UserScript==
// @name         Web Sticker Keywords
// @namespace    http://tampermonkey.net/
// @version      1.7
// @description  Подсказки с https://vk.com/sticker_keywords_editor теперь на vk.com :3
// @author       Flyink13
// @match        https://vk.com/*
// @updateURL https://openuserjs.org/meta/flyink13/Web_Sticker_Keywords.meta.js
// @copyright 2018, flyink13 (https://openuserjs.org/users/flyink13)
// @license MIT
// ==/UserScript==
/* global vk, Emoji, stickersKeywords */

/*
    Полезности:
    Emoji.updateStickersHints - отрисовка панели подсказок
    Emoji.checkStickersKeywords - поиск подсказок
    Emoji.stickers - список наборов
    window.promotedStickerUrls - Ссылки на изображения по id стикера
    window.stickersKeywordsData - Список подсказок {promoted_stickers, user_stickers, words}
    window.stickersKeywords - Обьект по ключевым словам

    Добавление к стикеру 3484 ключевого слова 42:
    if (!stickersKeywords[42]) stickersKeywords[42] = [];
    stickersKeywords[42].push(3484);
    window.promotedStickerUrls[3484] = '/images/stickers/3484/128.png'
*/

function UserStickerKeywords() {
    var user_docs;
    if (/^\/(away|notifier)\.php/.test(window.location.pathname) || typeof vk !== 'object') return;

    user_docs = [];

    function get(url, cb, anon) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        if (anon) xhr.withCredentials = false;
        xhr.onload = function onGetLoaded() {
            cb(xhr.responseText);
            xhr = null;
        };
        xhr.send();
    }

    function toDocId(id) {
        var owner_id = -131495752;
        if (user_docs.indexOf(-id) > -1) owner_id = vk.id;
        if (id > 0) return id;

        var doc_id = owner_id + '_' + -id;
        var attach_id = "'-,doc:" + doc_id + ",'";
        window.promotedStickerUrls[attach_id] = '/doc' + doc_id + '?api=1';
        return attach_id;
    }

    function addUserKeywords() {
        if (typeof promotedStickerUrls != 'object' || typeof stickersKeywords != 'object') return;
        if (stickersKeywords.ske == 3484) return;
        stickersKeywords.ske = 3484;
        Emoji.userDictionary.forEach(function addDictionary(dict) {
            dict.words.forEach(function addWord(word) {
                if (!stickersKeywords[word]) stickersKeywords[word] = [];
                dict.user_stickers.forEach(function addSticker(sticker_id) {
                    sticker_id = toDocId(sticker_id);
                    if (stickersKeywords[word].indexOf(sticker_id) > -1) return;
                    stickersKeywords[word].unshift(sticker_id);
                });
            });
        });
        console.log('ske', 'addUserKeywords');
    }

    function initKeywords(dictionary) {
        if (typeof Emoji !== 'object') return console.log('var Emoji 404');
        // Отключаем логирование, там ошибки
        Emoji.sendHintsLog = Emoji.clearHintsLog;
        // Запоминаем подсказки пользователя
        Emoji.userDictionary = dictionary.response.dictionary;
        // Добавляем добавление своих подсказок в функцию установки подсказок и запускаем ее
        Emoji.addUserKeywords = addUserKeywords;
        Emoji.setStickersKeywords = (function(org) {
            return function() {
                var res = org.apply(this, arguments);
                if (window.promotedStickerUrls) {
                    window.promotedStickerUrls[2e9] = "https://NaN";
                }
                Emoji.addUserKeywords();
                return res;
            };
        })(Emoji.setStickersKeywords);
        Emoji.initStickersKeywords();

        // добавляем в генерацию подсказок стикеров поддержку граффити
        Emoji.render.stickerHintRs = (function(org) {
            return function() {
                var oid = arguments[0];
                var sid = arguments[1];
                var res = org.apply(this, arguments);

                if (!res && sid && sid[0] == "'") {
                    var tmlp = org(oid, -2e9);
                    var surl = window.promotedStickerUrls[sid];
                    if (!tmlp) {
                        console.warn('Web Sticker Keywords: invalid hint template');
                        return res;
                    }
                    res = tmlp.replace(' promo', '').replace(/http.+?(['"])/g, surl + '&$1').replace(/-2000000000/g, sid);
                    return res;
                }

                return res;
            };
        })(Emoji.render.stickerHintRs);
    }

    get('https://jsons.flyink.ru/' + vk.id + '.json?r=' + Math.random(), function onKeysLoaded(keywords) {
        get('/docs.php?al=-1&type=4', function onDocsLoaded(docs) {
            user_docs = (docs.match(/\[\\"(\d+)/g) || []).map(function parseIds(id) {
                return parseInt(id.match(/\[\\"(\d+)/)[1], 10);
            });
            initKeywords(JSON.parse(keywords));
        });
    }, 1);

    if (typeof FlyVK == 'object' && FlyVK.module) FlyVK.module.loaded('oujs_Web_Sticker_Keywords.user.js', UserStickerKeywords, {});
}

(function injectScript() {
    var script = document.createElement('script');
    script.appendChild(document.createTextNode('(' + UserStickerKeywords + ')();'));
    (document.body || document.head || document.documentElement).appendChild(script);
})();