NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name DiscordEmoji EmojiAdder // @namespace https://cirno.pw // @version 0.1 // @description Adds a button that will automatically add emoji to your servers for you from DiscordEmoji.com. // @author ExtraConcentratedJuice // @license MIT // @match https://discordemoji.com/category/* // @match https://discordemoji.com/search.php // @match https://discordemoji.com/ // @run-at document-idle // @grant GM_setValue // @grant GM_getValue // @require https://discordemoji.com/assets/js/jquery-3.1.1.min.js // @require https://discordemoji.com/assets/js/toast.min.js // @require https://cdn.jsdelivr.net/npm/jquery.initialize@1.2.0/jquery.initialize.min.js // ==/UserScript== (function() { 'use strict'; const TOKEN_KEY = 'emojiadder_token'; const GUILD_KEY = 'emojiadder_guild'; var count = 0; function toast(title, message) { iziToast.show({ class: 'dark-toast', theme: 'dark', progressBar: false, title: title, message: message, position: 'bottomCenter' }); } function addButton() { $('div.meta > div.float-right').each(function(index) { if (!$(this).find('.fa-plus-circle').length) { let name = $(this).closest('.emoji-card').find('.card-img-top').find('img').attr('alt'); let url = $(this).parent().find('.download').attr('href'); $(this).append(' <a id="addButton' + count + '"><i class="fas fa-plus-circle" style="cursor: pointer; color: #52bd8c;" data-url="' + url+ '" data-name="' + name + '"></i></a>'); $('#addButton' + count).click(function() { console.log('xd'); toast('Alert', 'Preparing to add :' + name + ': to your server...'); getBase64FromImage(url, function(data, size) { size = size * 0.0009765625; if (size > 256) { toast('Emoji Too Large', 'The emoji :' + name + ': is over 256kb. Discord\'s max emoji size is 256kb. Go bother Kohai (DiscordEmoji developer) to fix it.') return; } let xhr = new XMLHttpRequest(); xhr.open('POST', 'https://canary.discordapp.com/api/v6/guilds/' + GM_getValue(GUILD_KEY, '') + '/emojis'); xhr.setRequestHeader('Authorization', GM_getValue(TOKEN_KEY, '')); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.onreadystatechange = function() { if (xhr.readyState == XMLHttpRequest.DONE) { let respCode = xhr.status; let resp = JSON.parse(xhr.responseText); switch(respCode) { case 400: toast('400 Bad Request', 'The emoji failed to submit to Discord. ' + (resp.message || 'Unspecified error.')); break; case 401: toast('401 Unauthorized', 'You are not logged in. Click the cog on the bottom right corner to configure this extension.'); break; case 403: toast('403 Forbidden', 'You are not authorized to submit emojis to this guild. Check your token, check your guild ID. Click the cog icon on the bottom right.'); break; case 429: toast('429 Ratelimited', 'Discord has ratelimited you from uploading emojis. Try again later.'); break; case 201: toast('Success', 'Successfully added :' + name + ': to your server!'); break; default: toast('Unexpected Error', 'An unexpected status code was received from Discord. Whatever it is, it probably isn\'t good. Try again, I guess.'); break; } } } xhr.send(JSON.stringify( { 'name': name, 'image': data } )); }); }); count++; } }); } function getBase64FromImage(url, callback) { let xhr = new XMLHttpRequest(); xhr.onload = function() { let reader = new FileReader(); let size = xhr.getResponseHeader('content-length'); reader.onloadend = function() { callback(reader.result, size); } reader.readAsDataURL(xhr.response); }; xhr.open('GET', url); xhr.responseType = 'blob'; xhr.send(); } function configure() { let token = prompt('Enter your Discord user token. Don\'t know how to get it?\nhttps://github.com/TheRacingLion/Discord-SelfBot/wiki/Discord-Token-Tutorial', GM_getValue(TOKEN_KEY, '')); let guild = prompt('Enter the Guild ID of your server. Don\'t know how to get it?\nhttps://support.discordapp.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID-', GM_getValue(GUILD_KEY, '')); GM_setValue(TOKEN_KEY, token); GM_setValue(GUILD_KEY, guild); alert('Set your token to: ' + token + '\nSet your guild ID to: ' + guild); } $(document).ready( function() { $('body').append('<button id="emojiAdderConfigure" class="btn" style="position: fixed; bottom: 5px; right: 5px;"><i class="fas fa-cog"></i></button>'); $('#emojiAdderConfigure').click(configure); $.initialize('.emoji-card', addButton); }); })();