NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name Kick Emote Auto Complete
// @namespace https://tampermonkey.net/
// @version 0.1
// @description adds a emote auto complete feature to kick
// @author TalkingPanda
// @match https://kick.com/*
// @exclude https://kick.com/dashboard/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
// @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js
// @require https://gist.githubusercontent.com/raw/2625891/waitForKeyElements.js
// @require https://cdn.jsdelivr.net/npm/fuse.js/dist/fuse.js
// @license GPL-3.0-only
// ==/UserScript==
//
var selectedEmote = 0;
var fuse;
const fuseoptions = {
keys: ['name']
};
(function () {
'use strict';
loadEmotes();
waitForKeyElements("#chatroom-footer", actionFunction);
document.onkeydown = (e) => {
switch (e.keyCode) {
// Key up
case 38:
selectedEmote = selectedEmote == 0 ? 0 : selectedEmote - 1;
break;
// Key down
case 40:
selectedEmote = selectedEmote == 4 ? 0 : selectedEmote + 1;
break;
// Tab
case 9:
sendEmote($(`#emote-${selectedEmote}`).text());
break;
// Escape
case 27:
$('#emotePopup').css('display', 'none');
break;
default:
return;
break;
}
e.preventDefault();
e.stopPropagation();
for (var i = 0; i < 5; i++) {
$(`#emote-${i}`).css('color', 'white');
}
$(`#emote-${selectedEmote}`).css('color', '#53fc18');
}
})();
// Puts the emote in the input
function sendEmote(emote) {
$('#emotePopup').css('display', 'none');
var words = $('.chat-input').text().trim().split(' ');
var lastword = words[words.length - 1];
for (var i = 0; i < lastword.length; i++)
document.execCommand("delete");
$('.chat-input').focus();
document.execCommand("insertText", false, emote);
}
async function loadEmotes() {
var emotelist = await fetch(`https://kick.com/emotes/${document.URL.split('/')[3]}`);
var emotesJson = await emotelist.json();
var emotes = [];
emotesJson.forEach((emoteGroup) => {
emoteGroup.emotes.forEach((emote) => {
emotes.push(emote);
});
});
fuse = new Fuse(emotes, fuseoptions);
}
function actionFunction(chatroom) {
chatroom.prepend('<ul id="emotePopup" style="display: none;"></ul>');
$('.chat-input').on('propertychange input', (e) => {
var words = e.target.textContent.trim().split(' ');
var lastword = words[words.length - 1];
if (lastword.startsWith(':')) {
$('#emotePopup').empty();
$('#emotePopup').css('display', 'block');
fuse.search(lastword).slice(0, 5).forEach((e, i, a) => {
$('#emotePopup').append(`<li><button class="emoteButton" id="emote-${i}" style="display: block ruby"><img width=25 height=25 src=https://files.kick.com/emotes/${e.item.id}/fullsize /> ${e.item.name} </button></li>`);
});
selectedEmote = 0;
$(`#emote-${selectedEmote}`).css('color', '#53fc18');
$('.emoteButton').on('click', (event) => {
sendEmote(event.target.innerText.trim());
});
}
else {
$('#emotePopup').css('display', 'none');
}
})
}