Skip to content

Commit

Permalink
Add support for animated emojis
Browse files Browse the repository at this point in the history
  • Loading branch information
ItsOnlyBinary committed Aug 23, 2024
1 parent d1fc4cc commit 8b7bddf
Show file tree
Hide file tree
Showing 421 changed files with 540 additions and 162 deletions.
25 changes: 24 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ This plugin adds an advanced emoji picker to Kiwi IRC's UI. It also parses incom

> powered by [emoji-mart-vue-fast](https://github.com/serebrov/emoji-mart-vue)
> animated emojis powered by [noto-emoji-animation](https://googlefonts.github.io/noto-emoji-animation/)
## Building from source

### Dependencies
Expand Down Expand Up @@ -71,7 +73,7 @@ omitted, as these defaults are used if not specified.
}
},
"frequentlyUsedLength": 16,
// Do NOT include the following 3 options unless you intend to set them
// DO NOT include the following 3 options unless you intend to set them
// doing so would change the default behaviour of the plugin
"frequentlyUsedList": [],
"categoryInclude": [],
Expand All @@ -86,6 +88,27 @@ omitted, as these defaults are used if not specified.
"imageUrl": "static/favicon.png",
},
],
// This option will enable the included animated emojis
// or allow existing emojis to be replaced by customised ones on a different url
// using external emojis will come with a performance penalty over the default emoji sheet
"externalEnabled": true,
// This option controls how external emojis are displayed in the emoji picker
// valid options are: "all", "hover", "none"
// note: "all" will put great load on the server and users internet connect as it will
// attempt to download all the external emojis when the picker is opened (around 30MB for the included animated emojis)
"externalPicker": "none",
// DO NOT include externalUrl unless you intend to set it
// doing so would override the default automatically generated url based on plugin location
// If your wanting to use another server you can provide a custom url
// %CODEPOINT% will be replaced with the google emojis code point eg "1f44f_1f3fc"
// %UNIFIED% will be replaced with the emoji mart unified code eg "1F44F-1F3FC"
// Although included for demonstration it is not recommended to use fonts.gstatic.com url due to the emojis being 512x512
// where as the included ones have been resized to 64x64 to make the file sizes much smaller
"externalUrl": "https://fonts.gstatic.com/s/e/notoemoji/latest/%CODEPOINT%/512.gif",
// DO NOT include externalEmojis unless you intend to set it
// doing so would override the animated emojis being used
// this object should use emoji-marts unified codes eg "1F44F-1F3FC"
"externalEmojis": { "1F604": 1 }
},
}
```
Expand Down
87 changes: 87 additions & 0 deletions build/commands/update-emojis.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
const fs = require('fs');
const path = require('path');
const sharp = require('sharp');
const fetch = require('node-fetch');

const utils = require('../utils');

const emojisDir = utils.pathResolve('src/res/animated_emojis/');

if (!fs.existsSync(emojisDir)) {
fs.mkdirSync(emojisDir);
}

async function getGoogleEmojiList() {
const response = await fetch('https://googlefonts.github.io/noto-emoji-animation/data/api.json');
if (!response.ok) {
throw new Error(`Failed to fetch data: ${response.statusText}`);
}
const data = await response.json();

return data.icons.map((icon) => ({
codepoint: icon.codepoint,
name: icon.tags[0].slice(1, -1),
}));
}

async function downloadEmoji(codepoint, gifPath) {
const url = `https://fonts.gstatic.com/s/e/notoemoji/latest/${codepoint}/512.gif`;

const response = await fetch(url);
if (!response.ok) {
throw new Error(`Failed to fetch emoji: ${response.statusText}`);
}

const gifBuffer = await response.buffer();

// Resize the GIF to 64px and save it to the emojis directory
await sharp(gifBuffer, { animated: true })
.resize(64)
.toFile(gifPath);
}

(async () => {
try {
const localDataPath = path.join(emojisDir, 'data.json');
const localOut = {};
const local = {};

try {
const localRaw = await fs.promises.readFile(localDataPath);
Object.assign(local, JSON.parse(localRaw));
} catch (error) {
console.error(`Could not read local data.json: ${error.message}`);
}

const emojis = await getGoogleEmojiList();

for (let i = 0; i < emojis.length; i++) {
const { codepoint, name } = emojis[i];
const unified = codepoint.toUpperCase().replace(/_/g, '-');
const gifPath = path.join(emojisDir, `${codepoint}.gif`);

if (local[unified] && fs.existsSync(gifPath)) {
localOut[unified] = 1;
continue;
}

if (localOut[unified]) {
continue;
}

console.log(`Downloading ${name} (${codepoint})`);
try {
// eslint-disable-next-line no-await-in-loop
await downloadEmoji(codepoint, gifPath);
} catch (error) {
console.error(`Could not get emoji ${name} (${codepoint}): ${error.message}`);
}

localOut[unified] = 1;
}

await fs.promises.writeFile(localDataPath, JSON.stringify(localOut));
} catch (error) {
console.error(`Failed to update emojis: ${error.message}`);
}
})();
14 changes: 14 additions & 0 deletions build/configs/base.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ const { merge } = require('webpack-merge');
const ESLintPlugin = require('eslint-webpack-plugin');
const ESLintFormatter = require('eslint-formatter-friendly');
const { VueLoaderPlugin } = require('vue-loader');
const CopyPlugin = require('copy-webpack-plugin');
const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');
const FriendlyErrorsWebpackPlugin = require('@soda/friendly-errors-webpack-plugin');

Expand Down Expand Up @@ -58,6 +59,19 @@ module.exports = (env, argv, config) => {
formatter: ESLintFormatter,
}),
new VueLoaderPlugin(),
new CopyPlugin({
patterns: [
{
from: utils.pathResolve('src/res/animated_emojis'),
to: utils.pathResolve('dist/plugin-emojis/animated'),
toType: 'dir',
filter: async (file) => /\.gif$/.test(file),
globOptions: {
ignore: ['.*'],
},
},
],
}),
new CaseSensitivePathsPlugin(),
new FriendlyErrorsWebpackPlugin(),
],
Expand Down
14 changes: 9 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"license": "Apache-2.0",
"private": true,
"scripts": {
"update": "node build/commands/update-emojis.js",
"dev": "node build/commands/dev.js",
"build": "node build/commands/build.js",
"stats": "node build/commands/build.js --stats",
Expand All @@ -12,15 +13,15 @@
"lint:style": "stylelint --allow-empty-input \"./src/**/*.{vue,html,css,less,scss,sass}\""
},
"dependencies": {
"emoji-mart-vue-fast": "^15.0.2",
"emoji-mart-vue-fast": "git+https://github.com/ItsOnlyBinary/emoji-mart-vue.git#b53683dc9f3c3bdceacf18ed4dd2dd80ea9323f3",
"grapheme-splitter": "^1.0.4",
"platform": "^1.3.6"
},
"devDependencies": {
"@babel/core": "^7.25.2",
"@babel/eslint-parser": "^7.25.1",
"@babel/plugin-transform-runtime": "^7.24.7",
"@babel/preset-env": "^7.25.3",
"@babel/plugin-transform-runtime": "^7.25.4",
"@babel/preset-env": "^7.25.4",
"@kiwiirc/eslint-plugin": "file:./build/plugins/eslint-rules/",
"@soda/friendly-errors-webpack-plugin": "^1.8.1",
"@stylistic/stylelint-plugin": "^2.1.3",
Expand Down Expand Up @@ -51,6 +52,7 @@
"less-loader": "^12.2.0",
"mini-css-extract-plugin": "^2.9.1",
"murmurhash3js": "^3.0.1",
"node-fetch": "^2.7.0",
"npm-run-all": "^4.1.5",
"ora": "^5.4.1",
"portfinder": "^1.0.32",
Expand All @@ -65,21 +67,23 @@
"rimraf": "^5.0.10",
"sass": "^1.77.8",
"sass-loader": "^16.0.1",
"sharp": "^0.33.5",
"style-loader": "^4.0.0",
"stylelint": "^16.8.2",
"stylelint-config-recess-order": "^5.0.1",
"stylelint-config-recess-order": "^5.1.0",
"stylelint-config-recommended": "^14.0.1",
"stylelint-config-recommended-scss": "^14.1.0",
"stylelint-config-recommended-vue": "^1.5.0",
"stylelint-config-standard": "^36.0.1",
"stylelint-config-standard-scss": "^13.1.0",
"stylelint-order": "^6.0.4",
"stylelint-webpack-plugin": "5.0.1",
"vue": "^2.7.16",
"vue-eslint-parser": "^9.4.3",
"vue-loader": "^15.11.1",
"vue-style-loader": "^4.1.3",
"vue-template-compiler": "^2.7.16",
"webpack": "^5.93.0",
"webpack": "^5.94.0",
"webpack-bundle-analyzer": "^4.10.2",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^5.0.4",
Expand Down
16 changes: 14 additions & 2 deletions src/components/EmojiPicker.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
v-bind="pickerProps"
:set="emojiSet"
:data="emojiIndex"
:external-enabled="externalEnabled"
:external-picker="externalPicker"
class="kiwi-emoji-mart"
@select="onEmojiSelected"
/>
Expand All @@ -29,6 +31,12 @@ export default {
emojiSet() {
return config.setting('emojiSet');
},
externalEnabled() {
return config.setting('externalEnabled');
},
externalPicker() {
return config.setting('externalPicker');
},
},
methods: {
getBestAscii(emoji) {
Expand Down Expand Up @@ -56,14 +64,18 @@ export default {
return emoji.colons;
},
onEmojiSelected(emoji) {
if (emoji.imageUrl) {
/* eslint-disable no-underscore-dangle */
if ((emoji._data.has_img_external && config.setting('externalEnabled')) || emoji.imageUrl) {
// custom emojis
this.ircinput.addImg(
this.getBestAscii(emoji),
emoji.imageUrl,
(emoji._data.has_img_external && config.setting('externalEnabled')
? emoji._data.externalUrl
: emoji.imageUrl),
);
return;
}
/* eslint-enable no-underscore-dangle */
this.ircinput.addImg(
this.getBestAscii(emoji),
Expand Down
15 changes: 13 additions & 2 deletions src/config.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
/* global kiwi:true */

let configBase = 'plugin-emojis';
let defaultConfig = {
export const basePath = getBasePath();
export const configBase = 'plugin-emojis';

export const defaultConfig = {
sendNativeEmojis: true,
parseEmoticons: true,
parseColons: true,
Expand All @@ -27,6 +29,9 @@ let defaultConfig = {
imageUrl: 'static/favicon.png',
},
],
externalEnabled: true,
externalPicker: 'none', // 'all', 'hover', 'none'
externalUrl: basePath + configBase + '/animated/%CODEPOINT%.gif',
};

export function setDefaults(kiwi) {
Expand All @@ -44,3 +49,9 @@ export function getSetting(name) {
export function setSetting(name, value) {
return kiwi.state.setSetting(['settings', configBase, name].join('.'), value);
}

function getBasePath() {
const scripts = document.getElementsByTagName('script');
const scriptPath = scripts[scripts.length - 1].src;
return scriptPath.substring(0, scriptPath.lastIndexOf('/') + 1);
}
19 changes: 12 additions & 7 deletions src/libs/EmojiProvider.js
Original file line number Diff line number Diff line change
Expand Up @@ -120,21 +120,26 @@ export function getEmojis(word) {
function makeEmojiObj(emojiRaw, match, index) {
const emojiObj = {
ascii: match,
url: 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
imgProps: {
style: `background-position: ${emojiRaw.getPosition()}; height: 1.2em; vertical-align: -0.3em;`,
className: `emoji-set-${config.setting('emojiSet')} emoji-type-image`,
},
mart: emojiRaw,
matchDetail: {
index,
match,
},
};

if (emojiRaw.imageUrl) {
emojiObj.url = emojiRaw.imageUrl;
/* eslint-disable no-underscore-dangle */
if ((emojiRaw._data.has_img_external && config.setting('externalEnabled')) || emojiRaw.imageUrl) {
emojiObj.url = emojiRaw._data.has_img_external
? emojiRaw._data.externalUrl
: emojiRaw.imageUrl;

emojiObj.imgProps = {};
} else {
emojiObj.url = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
emojiObj.imgProps = {
style: `background-position: ${emojiRaw.getPosition()}; height: 1.2em; vertical-align: -0.3em;`,
className: `emoji-set-${config.setting('emojiSet')} emoji-type-image`,
};
}

return emojiObj;
Expand Down
19 changes: 19 additions & 0 deletions src/plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import { EmojiIndex } from 'emoji-mart-vue-fast/src';
import 'emoji-mart-vue-fast/css/emoji-mart.css';
import EmojiData from 'emoji-mart-vue-fast/data/all.json';
import AnimatedEmojiData from '@/res/animated_emojis/data.json';
import EmojiPicker from '@/components/EmojiPicker.vue';
import * as config from '@/config.js';
import * as EmojiProvider from '@/libs/EmojiProvider.js';
Expand All @@ -17,6 +18,8 @@ kiwi.plugin('emojis', (kiwi) => {
custom: config.setting('customEmojis'),
recent: config.setting('frequentlyUsedList'),
recentLength: config.setting('frequentlyUsedLength'),
externalEmojis: config.setting('externalEmojis') || AnimatedEmojiData,
externalUrl: config.setting('externalUrl'),
});
kiwi['plugin-emojis'] = Object.create(null);
kiwi['plugin-emojis'].emojiIndex = emojiIndex;
Expand All @@ -39,4 +42,20 @@ kiwi.plugin('emojis', (kiwi) => {
});
});
});

kiwi.Vue.watch(
() => config.setting('externalEnabled'),
() => {
kiwi.state.networks.forEach((network) => {
// Re-render messages with user colours
Object.values(network.buffers).forEach((buffer) => {
buffer.getMessages().forEach((msg) => {
if (msg.html.indexOf('kiwi-messagelist-emoji') > -1) {
msg.hasRendered = false;
}
});
});
});
}
);
});
Binary file added src/res/animated_emojis/1f192.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f193.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f195.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f198.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f199.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f304.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f305.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f308.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f30a.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f30b.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f30d.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f30e.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f30f.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f31b.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f31c.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f31e.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f31f.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f327_fe0f.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f329_fe0f.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f32a_fe0f.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f32c_fe0f.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f331.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f339.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f340.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f342.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/res/animated_emojis/1f343.gif
Binary file added src/res/animated_emojis/1f345.gif
Binary file added src/res/animated_emojis/1f35c.gif
Binary file added src/res/animated_emojis/1f35d.gif
Binary file added src/res/animated_emojis/1f373.gif
Binary file added src/res/animated_emojis/1f377.gif
Binary file added src/res/animated_emojis/1f379.gif
Binary file added src/res/animated_emojis/1f37b.gif
Binary file added src/res/animated_emojis/1f37e.gif
Binary file added src/res/animated_emojis/1f37f.gif
Binary file added src/res/animated_emojis/1f381.gif
Binary file added src/res/animated_emojis/1f382.gif
Binary file added src/res/animated_emojis/1f383.gif
Binary file added src/res/animated_emojis/1f386.gif
Binary file added src/res/animated_emojis/1f388.gif
Binary file added src/res/animated_emojis/1f389.gif
Binary file added src/res/animated_emojis/1f38a.gif
Binary file added src/res/animated_emojis/1f393.gif
Binary file added src/res/animated_emojis/1f3a2.gif
Binary file added src/res/animated_emojis/1f3af.gif
Binary file added src/res/animated_emojis/1f3b0.gif
Binary file added src/res/animated_emojis/1f3b2.gif
Binary file added src/res/animated_emojis/1f3b3.gif
Binary file added src/res/animated_emojis/1f3b6.gif
Binary file added src/res/animated_emojis/1f3bb.gif
Binary file added src/res/animated_emojis/1f3be.gif
Binary file added src/res/animated_emojis/1f3c1.gif
Binary file added src/res/animated_emojis/1f3cf.gif
Binary file added src/res/animated_emojis/1f3d1.gif
Binary file added src/res/animated_emojis/1f3d2.gif
Binary file added src/res/animated_emojis/1f3d3.gif
Binary file added src/res/animated_emojis/1f3d5_fe0f.gif
Binary file added src/res/animated_emojis/1f3f3_fe0f.gif
Binary file added src/res/animated_emojis/1f3f4.gif
Binary file added src/res/animated_emojis/1f3f8.gif
Binary file added src/res/animated_emojis/1f400.gif
Binary file added src/res/animated_emojis/1f402.gif
Binary file added src/res/animated_emojis/1f405.gif
Binary file added src/res/animated_emojis/1f407.gif
Binary file added src/res/animated_emojis/1f409.gif
Binary file added src/res/animated_emojis/1f40a.gif
Binary file added src/res/animated_emojis/1f40c.gif
Binary file added src/res/animated_emojis/1f40d.gif
Binary file added src/res/animated_emojis/1f40e.gif
Binary file added src/res/animated_emojis/1f410.gif
Binary file added src/res/animated_emojis/1f412.gif
Binary file added src/res/animated_emojis/1f413.gif
Binary file added src/res/animated_emojis/1f415.gif
Binary file added src/res/animated_emojis/1f415_200d_1f9ba.gif
Binary file added src/res/animated_emojis/1f416.gif
Binary file added src/res/animated_emojis/1f419.gif
Binary file added src/res/animated_emojis/1f41b.gif
Binary file added src/res/animated_emojis/1f41c.gif
Binary file added src/res/animated_emojis/1f41d.gif
Binary file added src/res/animated_emojis/1f41e.gif
Binary file added src/res/animated_emojis/1f421.gif
Binary file added src/res/animated_emojis/1f422.gif
Binary file added src/res/animated_emojis/1f423.gif
Binary file added src/res/animated_emojis/1f424.gif
Binary file added src/res/animated_emojis/1f425.gif
Binary file added src/res/animated_emojis/1f426.gif
Binary file added src/res/animated_emojis/1f426_200d_2b1b.gif
Binary file added src/res/animated_emojis/1f429.gif
Binary file added src/res/animated_emojis/1f42c.gif
Binary file added src/res/animated_emojis/1f42e.gif
Binary file added src/res/animated_emojis/1f433.gif
Binary file added src/res/animated_emojis/1f438.gif
Binary file added src/res/animated_emojis/1f43e.gif
Binary file added src/res/animated_emojis/1f43f_fe0f.gif
Binary file added src/res/animated_emojis/1f440.gif
Binary file added src/res/animated_emojis/1f441_fe0f.gif
Binary file added src/res/animated_emojis/1f44b.gif
Binary file added src/res/animated_emojis/1f44b_1f3fb.gif
Binary file added src/res/animated_emojis/1f44b_1f3fc.gif
Binary file added src/res/animated_emojis/1f44b_1f3fd.gif
Binary file added src/res/animated_emojis/1f44b_1f3fe.gif
Binary file added src/res/animated_emojis/1f44b_1f3ff.gif
Binary file added src/res/animated_emojis/1f44d.gif
Binary file added src/res/animated_emojis/1f44d_1f3fb.gif
Binary file added src/res/animated_emojis/1f44d_1f3fc.gif
Binary file added src/res/animated_emojis/1f44d_1f3fd.gif
Binary file added src/res/animated_emojis/1f44d_1f3fe.gif
Binary file added src/res/animated_emojis/1f44d_1f3ff.gif
Binary file added src/res/animated_emojis/1f44e.gif
Binary file added src/res/animated_emojis/1f44e_1f3fb.gif
Binary file added src/res/animated_emojis/1f44e_1f3fc.gif
Binary file added src/res/animated_emojis/1f44e_1f3fd.gif
Binary file added src/res/animated_emojis/1f44e_1f3fe.gif
Binary file added src/res/animated_emojis/1f44e_1f3ff.gif
Binary file added src/res/animated_emojis/1f44f.gif
Binary file added src/res/animated_emojis/1f44f_1f3fb.gif
Binary file added src/res/animated_emojis/1f44f_1f3fc.gif
Binary file added src/res/animated_emojis/1f44f_1f3fd.gif
Binary file added src/res/animated_emojis/1f44f_1f3fe.gif
Binary file added src/res/animated_emojis/1f44f_1f3ff.gif
Binary file added src/res/animated_emojis/1f463.gif
Binary file added src/res/animated_emojis/1f47b.gif
Binary file added src/res/animated_emojis/1f47d.gif
Binary file added src/res/animated_emojis/1f47f.gif
Binary file added src/res/animated_emojis/1f480.gif
Binary file added src/res/animated_emojis/1f483.gif
Binary file added src/res/animated_emojis/1f483_1f3fb.gif
Binary file added src/res/animated_emojis/1f483_1f3fc.gif
Binary file added src/res/animated_emojis/1f483_1f3fd.gif
Binary file added src/res/animated_emojis/1f483_1f3fe.gif
Binary file added src/res/animated_emojis/1f483_1f3ff.gif
Binary file added src/res/animated_emojis/1f48b.gif
Binary file added src/res/animated_emojis/1f48c.gif
Binary file added src/res/animated_emojis/1f48e.gif
Binary file added src/res/animated_emojis/1f493.gif
Binary file added src/res/animated_emojis/1f494.gif
Binary file added src/res/animated_emojis/1f495.gif
Binary file added src/res/animated_emojis/1f496.gif
Binary file added src/res/animated_emojis/1f497.gif
Binary file added src/res/animated_emojis/1f498.gif
Binary file added src/res/animated_emojis/1f499.gif
Binary file added src/res/animated_emojis/1f49a.gif
Binary file added src/res/animated_emojis/1f49b.gif
Binary file added src/res/animated_emojis/1f49c.gif
Binary file added src/res/animated_emojis/1f49d.gif
Binary file added src/res/animated_emojis/1f49e.gif
Binary file added src/res/animated_emojis/1f49f.gif
Binary file added src/res/animated_emojis/1f4a1.gif
Binary file added src/res/animated_emojis/1f4a5.gif
Binary file added src/res/animated_emojis/1f4a7.gif
Binary file added src/res/animated_emojis/1f4a9.gif
Binary file added src/res/animated_emojis/1f4aa.gif
Binary file added src/res/animated_emojis/1f4aa_1f3fb.gif
Binary file added src/res/animated_emojis/1f4aa_1f3fc.gif
Binary file added src/res/animated_emojis/1f4aa_1f3fd.gif
Binary file added src/res/animated_emojis/1f4aa_1f3fe.gif
Binary file added src/res/animated_emojis/1f4aa_1f3ff.gif
Binary file added src/res/animated_emojis/1f4ab.gif
Binary file added src/res/animated_emojis/1f4af.gif
Binary file added src/res/animated_emojis/1f4b8.gif
Binary file added src/res/animated_emojis/1f4f4.gif
Binary file added src/res/animated_emojis/1f4f8.gif
Binary file added src/res/animated_emojis/1f50b.gif
Binary file added src/res/animated_emojis/1f514.gif
Binary file added src/res/animated_emojis/1f525.gif
Binary file added src/res/animated_emojis/1f52e.gif
Binary file added src/res/animated_emojis/1f54a_fe0f.gif
Binary file added src/res/animated_emojis/1f577_fe0f.gif
Binary file added src/res/animated_emojis/1f5a4.gif
Binary file added src/res/animated_emojis/1f600.gif
Binary file added src/res/animated_emojis/1f601.gif
Binary file added src/res/animated_emojis/1f602.gif
Binary file added src/res/animated_emojis/1f603.gif
Binary file added src/res/animated_emojis/1f604.gif
Binary file added src/res/animated_emojis/1f605.gif
Binary file added src/res/animated_emojis/1f606.gif
Binary file added src/res/animated_emojis/1f607.gif
Binary file added src/res/animated_emojis/1f608.gif
Binary file added src/res/animated_emojis/1f609.gif
Binary file added src/res/animated_emojis/1f60a.gif
Binary file added src/res/animated_emojis/1f60b.gif
Binary file added src/res/animated_emojis/1f60c.gif
Binary file added src/res/animated_emojis/1f60d.gif
Binary file added src/res/animated_emojis/1f60e.gif
Binary file added src/res/animated_emojis/1f60f.gif
Binary file added src/res/animated_emojis/1f610.gif
Binary file added src/res/animated_emojis/1f611.gif
Binary file added src/res/animated_emojis/1f612.gif
Binary file added src/res/animated_emojis/1f613.gif
Binary file added src/res/animated_emojis/1f614.gif
Binary file added src/res/animated_emojis/1f615.gif
Binary file added src/res/animated_emojis/1f616.gif
Binary file added src/res/animated_emojis/1f617.gif
Binary file added src/res/animated_emojis/1f618.gif
Binary file added src/res/animated_emojis/1f619.gif
Binary file added src/res/animated_emojis/1f61a.gif
Binary file added src/res/animated_emojis/1f61b.gif
Binary file added src/res/animated_emojis/1f61c.gif
Binary file added src/res/animated_emojis/1f61d.gif
Binary file added src/res/animated_emojis/1f61e.gif
Binary file added src/res/animated_emojis/1f61f.gif
Binary file added src/res/animated_emojis/1f620.gif
Binary file added src/res/animated_emojis/1f621.gif
Binary file added src/res/animated_emojis/1f622.gif
Binary file added src/res/animated_emojis/1f623.gif
Binary file added src/res/animated_emojis/1f624.gif
Binary file added src/res/animated_emojis/1f625.gif
Binary file added src/res/animated_emojis/1f626.gif
Binary file added src/res/animated_emojis/1f627.gif
Binary file added src/res/animated_emojis/1f628.gif
Binary file added src/res/animated_emojis/1f629.gif
Binary file added src/res/animated_emojis/1f62a.gif
Binary file added src/res/animated_emojis/1f62b.gif
Binary file added src/res/animated_emojis/1f62c.gif
Binary file added src/res/animated_emojis/1f62d.gif
Binary file added src/res/animated_emojis/1f62e.gif
Binary file added src/res/animated_emojis/1f62e_200d_1f4a8.gif
Binary file added src/res/animated_emojis/1f62f.gif
Binary file added src/res/animated_emojis/1f630.gif
Binary file added src/res/animated_emojis/1f631.gif
Binary file added src/res/animated_emojis/1f632.gif
Binary file added src/res/animated_emojis/1f633.gif
Binary file added src/res/animated_emojis/1f634.gif
Binary file added src/res/animated_emojis/1f635.gif
Binary file added src/res/animated_emojis/1f635_200d_1f4ab.gif
Binary file added src/res/animated_emojis/1f636.gif
Binary file added src/res/animated_emojis/1f637.gif
Binary file added src/res/animated_emojis/1f638.gif
Binary file added src/res/animated_emojis/1f639.gif
Binary file added src/res/animated_emojis/1f63a.gif
Binary file added src/res/animated_emojis/1f63b.gif
Binary file added src/res/animated_emojis/1f63c.gif
Binary file added src/res/animated_emojis/1f63d.gif
Binary file added src/res/animated_emojis/1f63e.gif
Binary file added src/res/animated_emojis/1f63f.gif
Binary file added src/res/animated_emojis/1f640.gif
Binary file added src/res/animated_emojis/1f641.gif
Binary file added src/res/animated_emojis/1f642.gif
Binary file added src/res/animated_emojis/1f643.gif
Binary file added src/res/animated_emojis/1f644.gif
Binary file added src/res/animated_emojis/1f648.gif
Binary file added src/res/animated_emojis/1f649.gif
Binary file added src/res/animated_emojis/1f64a.gif
Binary file added src/res/animated_emojis/1f64c.gif
Binary file added src/res/animated_emojis/1f64c_1f3fb.gif
Binary file added src/res/animated_emojis/1f64c_1f3fc.gif
Binary file added src/res/animated_emojis/1f64c_1f3fd.gif
Binary file added src/res/animated_emojis/1f64c_1f3fe.gif
Binary file added src/res/animated_emojis/1f64c_1f3ff.gif
Binary file added src/res/animated_emojis/1f64f.gif
Binary file added src/res/animated_emojis/1f64f_1f3fb.gif
Binary file added src/res/animated_emojis/1f64f_1f3fc.gif
Binary file added src/res/animated_emojis/1f64f_1f3fd.gif
Binary file added src/res/animated_emojis/1f64f_1f3fe.gif
Binary file added src/res/animated_emojis/1f64f_1f3ff.gif
Binary file added src/res/animated_emojis/1f680.gif
Binary file added src/res/animated_emojis/1f6a7.gif
Binary file added src/res/animated_emojis/1f6a8.gif
Binary file added src/res/animated_emojis/1f6a9.gif
Binary file added src/res/animated_emojis/1f6ae.gif
Binary file added src/res/animated_emojis/1f6b2.gif
Binary file added src/res/animated_emojis/1f6ce_fe0f.gif
Binary file added src/res/animated_emojis/1f6eb.gif
Binary file added src/res/animated_emojis/1f6ec.gif
Binary file added src/res/animated_emojis/1f6f8.gif
Binary file added src/res/animated_emojis/1f90d.gif
Binary file added src/res/animated_emojis/1f90e.gif
Binary file added src/res/animated_emojis/1f910.gif
Binary file added src/res/animated_emojis/1f911.gif
Binary file added src/res/animated_emojis/1f912.gif
Binary file added src/res/animated_emojis/1f913.gif
Binary file added src/res/animated_emojis/1f914.gif
Binary file added src/res/animated_emojis/1f915.gif
Binary file added src/res/animated_emojis/1f916.gif
Binary file added src/res/animated_emojis/1f917.gif
Binary file added src/res/animated_emojis/1f91e.gif
Binary file added src/res/animated_emojis/1f91e_1f3fb.gif
Binary file added src/res/animated_emojis/1f91e_1f3fc.gif
Binary file added src/res/animated_emojis/1f91e_1f3fd.gif
Binary file added src/res/animated_emojis/1f91e_1f3fe.gif
Binary file added src/res/animated_emojis/1f91e_1f3ff.gif
Binary file added src/res/animated_emojis/1f920.gif
Binary file added src/res/animated_emojis/1f921.gif
Binary file added src/res/animated_emojis/1f922.gif
Binary file added src/res/animated_emojis/1f923.gif
Binary file added src/res/animated_emojis/1f924.gif
Binary file added src/res/animated_emojis/1f925.gif
Binary file added src/res/animated_emojis/1f927.gif
Binary file added src/res/animated_emojis/1f928.gif
Binary file added src/res/animated_emojis/1f929.gif
Binary file added src/res/animated_emojis/1f92a.gif
Loading

0 comments on commit 8b7bddf

Please sign in to comment.