summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt9
-rw-r--r--include/EmojiCategory.h62
-rw-r--r--include/EmojiItemDelegate.h41
-rw-r--r--include/EmojiPanel.h60
-rw-r--r--include/EmojiPickButton.h50
-rw-r--r--include/EmojiProvider.h45
-rw-r--r--include/TextInputWidget.h20
-rw-r--r--include/ui/FlatButton.h2
-rw-r--r--resources/emoji.json1
-rw-r--r--resources/fonts/EmojiOne/emojione-android.ttfbin3524972 -> 67877 bytes
-rw-r--r--resources/icons/emoji-categories/activity.pngbin0 -> 659 bytes
-rw-r--r--resources/icons/emoji-categories/activity.svg25
-rwxr-xr-xresources/icons/emoji-categories/diversity.svg30
-rw-r--r--resources/icons/emoji-categories/flags.pngbin0 -> 472 bytes
-rw-r--r--resources/icons/emoji-categories/flags.svg29
-rw-r--r--resources/icons/emoji-categories/foods.pngbin0 -> 599 bytes
-rw-r--r--resources/icons/emoji-categories/foods.svg25
-rw-r--r--resources/icons/emoji-categories/nature.pngbin0 -> 725 bytes
-rw-r--r--resources/icons/emoji-categories/nature.svg36
-rw-r--r--resources/icons/emoji-categories/objects.pngbin0 -> 640 bytes
-rw-r--r--resources/icons/emoji-categories/objects.svg30
-rw-r--r--resources/icons/emoji-categories/people.pngbin0 -> 637 bytes
-rw-r--r--resources/icons/emoji-categories/people.svg37
-rw-r--r--resources/icons/emoji-categories/recent.svg29
-rw-r--r--resources/icons/emoji-categories/symbols.pngbin0 -> 560 bytes
-rw-r--r--resources/icons/emoji-categories/symbols.svg46
-rw-r--r--resources/icons/emoji-categories/travel.pngbin0 -> 535 bytes
-rw-r--r--resources/icons/emoji-categories/travel.svg34
-rwxr-xr-xresources/icons/emoji-categories/unicode9.svg30
-rw-r--r--resources/icons/smile.pngbin0 -> 631 bytes
-rw-r--r--resources/res.qrc11
-rwxr-xr-xscripts/emoji_codegen.py89
-rw-r--r--src/EmojiCategory.cc84
-rw-r--r--src/EmojiItemDelegate.cc47
-rw-r--r--src/EmojiPanel.cc247
-rw-r--r--src/EmojiPickButton.cc65
-rw-r--r--src/EmojiProvider.cc1470
-rw-r--r--src/HistoryViewItem.cc6
-rw-r--r--src/TextInputWidget.cc62
-rw-r--r--src/ui/FlatButton.cc10
40 files changed, 2715 insertions, 17 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 492c5f74..b008ab45 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -71,6 +71,11 @@ endif()
set(SRC_FILES
src/ChatPage.cc
src/Deserializable.cc
+ src/EmojiCategory.cc
+ src/EmojiItemDelegate.cc
+ src/EmojiPanel.cc
+ src/EmojiPickButton.cc
+ src/EmojiProvider.cc
src/HistoryView.cc
src/HistoryViewItem.cc
src/HistoryViewManager.cc
@@ -116,6 +121,10 @@ qt5_wrap_ui (UI_HEADERS
qt5_wrap_cpp(MOC_HEADERS
include/ChatPage.h
+ include/EmojiCategory.h
+ include/EmojiItemDelegate.h
+ include/EmojiPanel.h
+ include/EmojiPickButton.h
include/HistoryView.h
include/HistoryViewItem.h
include/HistoryViewManager.h
diff --git a/include/EmojiCategory.h b/include/EmojiCategory.h
new file mode 100644
index 00000000..a26711df
--- /dev/null
+++ b/include/EmojiCategory.h
@@ -0,0 +1,62 @@
+/*
+ * nheko Copyright (C) 2017 Konstantinos Sideris <siderisk@auth.gr>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef EMOJI_CATEGORY_H
+#define EMOJI_CATEGORY_H
+
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QListView>
+#include <QStandardItemModel>
+#include <QVBoxLayout>
+#include <QWidget>
+
+#include "EmojiItemDelegate.h"
+#include "EmojiProvider.h"
+
+class EmojiCategory : public QWidget
+{
+ Q_OBJECT
+
+public:
+ EmojiCategory(QString category, QList<Emoji> emoji, QWidget *parent = nullptr);
+ ~EmojiCategory();
+
+signals:
+ void emojiSelected(const QString &emoji);
+
+private slots:
+ inline void clickIndex(const QModelIndex &);
+
+private:
+ QVBoxLayout *mainLayout_;
+
+ QStandardItemModel *itemModel_;
+ QListView *emojiListView_;
+
+ Emoji *data_;
+ EmojiItemDelegate *delegate_;
+
+ QLabel *category_;
+};
+
+inline void EmojiCategory::clickIndex(const QModelIndex &index)
+{
+ emit emojiSelected(index.data(Qt::UserRole).toString());
+}
+
+#endif // EMOJI_CATEGORY_H
diff --git a/include/EmojiItemDelegate.h b/include/EmojiItemDelegate.h
new file mode 100644
index 00000000..5eeb4e24
--- /dev/null
+++ b/include/EmojiItemDelegate.h
@@ -0,0 +1,41 @@
+/*
+ * nheko Copyright (C) 2017 Konstantinos Sideris <siderisk@auth.gr>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef EMOJI_ITEM_DELEGATE_H
+#define EMOJI_ITEM_DELEGATE_H
+
+#include <QModelIndex>
+#include <QStandardItemModel>
+#include <QStyledItemDelegate>
+
+#include "EmojiProvider.h"
+
+class EmojiItemDelegate : public QStyledItemDelegate
+{
+ Q_OBJECT
+
+public:
+ explicit EmojiItemDelegate(QObject *parent = nullptr);
+ ~EmojiItemDelegate();
+
+ void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
+
+private:
+ Emoji *data_;
+};
+
+#endif // EMOJI_ITEM_DELEGATE_H
diff --git a/include/EmojiPanel.h b/include/EmojiPanel.h
new file mode 100644
index 00000000..5e053216
--- /dev/null
+++ b/include/EmojiPanel.h
@@ -0,0 +1,60 @@
+/*
+ * nheko Copyright (C) 2017 Konstantinos Sideris <siderisk@auth.gr>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef EMOJI_PANEL_H
+#define EMOJI_PANEL_H
+
+#include <QFrame>
+#include <QGraphicsOpacityEffect>
+#include <QPropertyAnimation>
+#include <QScrollArea>
+#include <QWidget>
+
+#include "EmojiCategory.h"
+#include "EmojiProvider.h"
+
+class EmojiPanel : public QFrame
+{
+ Q_OBJECT
+
+public:
+ EmojiPanel(QWidget *parent = nullptr);
+
+ void fadeOut();
+ void fadeIn();
+
+signals:
+ void mouseLeft();
+ void emojiSelected(const QString &emoji);
+
+protected:
+ void leaveEvent(QEvent *event);
+
+private:
+ void showEmojiCategory(const EmojiCategory *category);
+
+ QPropertyAnimation *animation_;
+ QGraphicsOpacityEffect *opacity_;
+
+ EmojiProvider emoji_provider_;
+
+ QScrollArea *scroll_area_;
+
+ const int category_icon_size_ = 20;
+};
+
+#endif // EMOJI_PANEL_H
diff --git a/include/EmojiPickButton.h b/include/EmojiPickButton.h
new file mode 100644
index 00000000..77bc5495
--- /dev/null
+++ b/include/EmojiPickButton.h
@@ -0,0 +1,50 @@
+/*
+ * nheko Copyright (C) 2017 Konstantinos Sideris <siderisk@auth.gr>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef EMOJI_PICK_BUTTON_H
+#define EMOJI_PICK_BUTTON_H
+
+#include <QEvent>
+#include <QWidget>
+
+#include "EmojiPanel.h"
+#include "FlatButton.h"
+
+class EmojiPickButton : public FlatButton
+{
+ Q_OBJECT
+public:
+ explicit EmojiPickButton(QWidget *parent = nullptr);
+
+signals:
+ void emojiSelected(const QString &emoji);
+
+protected:
+ void enterEvent(QEvent *e) override;
+ void leaveEvent(QEvent *e) override;
+
+private:
+ // Vertical distance from panel's bottom.
+ int vertical_distance_ = 10;
+
+ // Horizontal distance from panel's bottom right corner.
+ int horizontal_distance_ = 70;
+
+ EmojiPanel *panel_;
+};
+
+#endif // EMOJI_PICK_BUTTON_H
diff --git a/include/EmojiProvider.h b/include/EmojiProvider.h
new file mode 100644
index 00000000..630ea81a
--- /dev/null
+++ b/include/EmojiProvider.h
@@ -0,0 +1,45 @@
+/*
+ * nheko Copyright (C) 2017 Konstantinos Sideris <siderisk@auth.gr>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef EMOJI_PROVIDER_H
+#define EMOJI_PROVIDER_H
+
+#include <QFile>
+#include <QList>
+#include <QMap>
+
+struct Emoji {
+ // Unicode code.
+ QString unicode;
+ // Keyboard shortcut e.g :emoji:
+ QString shortname;
+};
+
+class EmojiProvider
+{
+public:
+ static const QList<Emoji> people;
+ static const QList<Emoji> nature;
+ static const QList<Emoji> food;
+ static const QList<Emoji> activity;
+ static const QList<Emoji> travel;
+ static const QList<Emoji> objects;
+ static const QList<Emoji> symbols;
+ static const QList<Emoji> flags;
+};
+
+#endif // EMOJI_PROVIDER_H
diff --git a/include/TextInputWidget.h b/include/TextInputWidget.h
index 35a12892..c61298bf 100644
--- a/include/TextInputWidget.h
+++ b/include/TextInputWidget.h
@@ -19,12 +19,24 @@
#define TEXT_INPUT_WIDGET_H
#include <QHBoxLayout>
-#include <QLineEdit>
#include <QPaintEvent>
+#include <QTextEdit>
#include <QWidget>
+#include "EmojiPickButton.h"
#include "FlatButton.h"
+class FilteredTextEdit : public QTextEdit
+{
+ Q_OBJECT
+public:
+ explicit FilteredTextEdit(QWidget *parent = nullptr);
+ void keyPressEvent(QKeyEvent *event);
+
+signals:
+ void enterPressed();
+};
+
class TextInputWidget : public QWidget
{
Q_OBJECT
@@ -36,6 +48,9 @@ public:
public slots:
void onSendButtonClicked();
+private slots:
+ void addSelectedEmoji(const QString &emoji);
+
signals:
void sendTextMessage(QString msg);
@@ -44,10 +59,11 @@ protected:
private:
QHBoxLayout *top_layout_;
- QLineEdit *input_;
+ FilteredTextEdit *input_;
FlatButton *send_file_button_;
FlatButton *send_message_button_;
+ EmojiPickButton *emoji_button_;
};
#endif // TEXT_INPUT_WIDGET_H
diff --git a/include/ui/FlatButton.h b/include/ui/FlatButton.h
index be7ce09c..8053f430 100644
--- a/include/ui/FlatButton.h
+++ b/include/ui/FlatButton.h
@@ -133,7 +133,7 @@ public:
protected:
enum {
- IconPadding = 12
+ IconPadding = 0
};
void checkStateSet() override;
diff --git a/resources/emoji.json b/resources/emoji.json
new file mode 100644
index 00000000..791fa190
--- /dev/null
+++ b/resources/emoji.json
@@ -0,0 +1 @@
+{"grinning":{"unicode":"1f600","unicode_alt":"","code_decimal":"&#128512;","name":"grinning face","shortname":":grinning:","category":"people","emoji_order":"1","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","emotion"]},"grin":{"unicode":"1f601","unicode_alt":"","code_decimal":"&#128513;","name":"grinning face with smiling eyes","shortname":":grin:","category":"people","emoji_order":"2","aliases":[],"aliases_ascii":[],"keywords":["happy","silly","smiley","emotion","good","selfie"]},"joy":{"unicode":"1f602","unicode_alt":"","code_decimal":"&#128514;","name":"face with tears of joy","shortname":":joy:","category":"people","emoji_order":"3","aliases":[],"aliases_ascii":[":')",":'-)"],"keywords":["happy","silly","smiley","cry","laugh","emotion","sarcastic"]},"rofl":{"unicode":"1f923","unicode_alt":"","code_decimal":"&#129315;","name":"rolling on the floor laughing","shortname":":rofl:","category":"people","emoji_order":"4","aliases":[":rolling_on_the_floor_laughing:"],"aliases_ascii":[],"keywords":[]},"smiley":{"unicode":"1f603","unicode_alt":"","code_decimal":"&#128515;","name":"smiling face with open mouth","shortname":":smiley:","category":"people","emoji_order":"5","aliases":[],"aliases_ascii":[":D",":-D","=D"],"keywords":["happy","smiley","emotion","good"]},"smile":{"unicode":"1f604","unicode_alt":"","code_decimal":"&#128516;","name":"smiling face with open mouth and smiling eyes","shortname":":smile:","category":"people","emoji_order":"6","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","emotion"]},"sweat_smile":{"unicode":"1f605","unicode_alt":"","code_decimal":"&#128517;","name":"smiling face with open mouth and cold sweat","shortname":":sweat_smile:","category":"people","emoji_order":"7","aliases":[],"aliases_ascii":["':)","':-)","'=)","':D","':-D","'=D"],"keywords":["smiley","workout","sweat","emotion"]},"laughing":{"unicode":"1f606","unicode_alt":"","code_decimal":"&#128518;","name":"smiling face with open mouth and tightly-closed eyes","shortname":":laughing:","category":"people","emoji_order":"8","aliases":[":satisfied:"],"aliases_ascii":[">:)",">;)",">:-)",">=)"],"keywords":["happy","smiley","laugh","emotion"]},"wink":{"unicode":"1f609","unicode_alt":"","code_decimal":"&#128521;","name":"winking face","shortname":":wink:","category":"people","emoji_order":"9","aliases":[],"aliases_ascii":[";)",";-)","*-)","*)",";-]",";]",";D",";^)"],"keywords":["silly","smiley","emotion"]},"blush":{"unicode":"1f60a","unicode_alt":"","code_decimal":"&#128522;","name":"smiling face with smiling eyes","shortname":":blush:","category":"people","emoji_order":"10","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","emotion","good","beautiful"]},"yum":{"unicode":"1f60b","unicode_alt":"","code_decimal":"&#128523;","name":"face savouring delicious food","shortname":":yum:","category":"people","emoji_order":"11","aliases":[],"aliases_ascii":[],"keywords":["happy","silly","smiley","emotion","sarcastic","good"]},"sunglasses":{"unicode":"1f60e","unicode_alt":"","code_decimal":"&#128526;","name":"smiling face with sunglasses","shortname":":sunglasses:","category":"people","emoji_order":"12","aliases":[],"aliases_ascii":["B-)","B)","8)","8-)","B-D","8-D"],"keywords":["silly","smiley","emojione","glasses","boys night"]},"heart_eyes":{"unicode":"1f60d","unicode_alt":"","code_decimal":"&#128525;","name":"smiling face with heart-shaped eyes","shortname":":heart_eyes:","category":"people","emoji_order":"13","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","love","sex","heart eyes","emotion","beautiful"]},"kissing_heart":{"unicode":"1f618","unicode_alt":"","code_decimal":"&#128536;","name":"face throwing a kiss","shortname":":kissing_heart:","category":"people","emoji_order":"14","aliases":[],"aliases_ascii":[":*",":-*","=*",":^*"],"keywords":["smiley","love","sexy"]},"kissing":{"unicode":"1f617","unicode_alt":"","code_decimal":"&#128535;","name":"kissing face","shortname":":kissing:","category":"people","emoji_order":"15","aliases":[],"aliases_ascii":[],"keywords":["smiley","sexy"]},"kissing_smiling_eyes":{"unicode":"1f619","unicode_alt":"","code_decimal":"&#128537;","name":"kissing face with smiling eyes","shortname":":kissing_smiling_eyes:","category":"people","emoji_order":"16","aliases":[],"aliases_ascii":[],"keywords":["smiley","sexy"]},"kissing_closed_eyes":{"unicode":"1f61a","unicode_alt":"","code_decimal":"&#128538;","name":"kissing face with closed eyes","shortname":":kissing_closed_eyes:","category":"people","emoji_order":"17","aliases":[],"aliases_ascii":[],"keywords":["smiley","sexy"]},"relaxed":{"unicode":"263a","unicode_alt":"263a-fe0f","code_decimal":"&#9786;","name":"white smiling face","shortname":":relaxed:","category":"people","emoji_order":"18","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley"]},"slight_smile":{"unicode":"1f642","unicode_alt":"","code_decimal":"&#128578;","name":"slightly smiling face","shortname":":slight_smile:","category":"people","emoji_order":"19","aliases":[":slightly_smiling_face:"],"aliases_ascii":[":)",":-)","=]","=)",":]"],"keywords":["happy","smiley"]},"hugging":{"unicode":"1f917","unicode_alt":"","code_decimal":"&#129303;","name":"hugging face","shortname":":hugging:","category":"people","emoji_order":"20","aliases":[":hugging_face:"],"aliases_ascii":[],"keywords":["smiley","hug","thank you"]},"thinking":{"unicode":"1f914","unicode_alt":"","code_decimal":"&#129300;","name":"thinking face","shortname":":thinking:","category":"people","emoji_order":"21","aliases":[":thinking_face:"],"aliases_ascii":[],"keywords":["smiley","thinking","boys night"]},"neutral_face":{"unicode":"1f610","unicode_alt":"","code_decimal":"&#128528;","name":"neutral face","shortname":":neutral_face:","category":"people","emoji_order":"22","aliases":[],"aliases_ascii":[],"keywords":["mad","smiley","shrug","neutral","emotion"]},"expressionless":{"unicode":"1f611","unicode_alt":"","code_decimal":"&#128529;","name":"expressionless face","shortname":":expressionless:","category":"people","emoji_order":"23","aliases":[],"aliases_ascii":["-_-","-__-","-___-"],"keywords":["mad","smiley","neutral","emotion"]},"no_mouth":{"unicode":"1f636","unicode_alt":"","code_decimal":"&#128566;","name":"face without mouth","shortname":":no_mouth:","category":"people","emoji_order":"24","aliases":[],"aliases_ascii":[":-X",":X",":-#",":#","=X","=x",":x",":-x","=#"],"keywords":["mad","smiley","neutral","emotion"]},"rolling_eyes":{"unicode":"1f644","unicode_alt":"","code_decimal":"&#128580;","name":"face with rolling eyes","shortname":":rolling_eyes:","category":"people","emoji_order":"25","aliases":[":face_with_rolling_eyes:"],"aliases_ascii":[],"keywords":["mad","smiley","rolling eyes","emotion","sarcastic"]},"smirk":{"unicode":"1f60f","unicode_alt":"","code_decimal":"&#128527;","name":"smirking face","shortname":":smirk:","category":"people","emoji_order":"26","aliases":[],"aliases_ascii":[],"keywords":["silly","smiley","sexy","sarcastic"]},"persevere":{"unicode":"1f623","unicode_alt":"","code_decimal":"&#128547;","name":"persevering face","shortname":":persevere:","category":"people","emoji_order":"27","aliases":[],"aliases_ascii":[">.<"],"keywords":["sad","smiley","angry","emotion"]},"disappointed_relieved":{"unicode":"1f625","unicode_alt":"","code_decimal":"&#128549;","name":"disappointed but relieved face","shortname":":disappointed_relieved:","category":"people","emoji_order":"28","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","stressed","sweat","cry","emotion"]},"open_mouth":{"unicode":"1f62e","unicode_alt":"","code_decimal":"&#128558;","name":"face with open mouth","shortname":":open_mouth:","category":"people","emoji_order":"29","aliases":[],"aliases_ascii":[":-O",":O",":-o",":o","O_O",">:O"],"keywords":["smiley","surprised","wow","emotion"]},"zipper_mouth":{"unicode":"1f910","unicode_alt":"","code_decimal":"&#129296;","name":"zipper-mouth face","shortname":":zipper_mouth:","category":"people","emoji_order":"30","aliases":[":zipper_mouth_face:"],"aliases_ascii":[],"keywords":["mad","smiley"]},"hushed":{"unicode":"1f62f","unicode_alt":"","code_decimal":"&#128559;","name":"hushed face","shortname":":hushed:","category":"people","emoji_order":"31","aliases":[],"aliases_ascii":[],"keywords":["smiley","surprised","wow"]},"sleepy":{"unicode":"1f62a","unicode_alt":"","code_decimal":"&#128554;","name":"sleepy face","shortname":":sleepy:","category":"people","emoji_order":"32","aliases":[],"aliases_ascii":[],"keywords":["smiley","sick","emotion"]},"tired_face":{"unicode":"1f62b","unicode_alt":"","code_decimal":"&#128555;","name":"tired face","shortname":":tired_face:","category":"people","emoji_order":"33","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","tired","emotion"]},"sleeping":{"unicode":"1f634","unicode_alt":"","code_decimal":"&#128564;","name":"sleeping face","shortname":":sleeping:","category":"people","emoji_order":"34","aliases":[],"aliases_ascii":[],"keywords":["smiley","tired","emotion","goodnight"]},"relieved":{"unicode":"1f60c","unicode_alt":"","code_decimal":"&#128524;","name":"relieved face","shortname":":relieved:","category":"people","emoji_order":"35","aliases":[],"aliases_ascii":[],"keywords":["smiley","emotion"]},"nerd":{"unicode":"1f913","unicode_alt":"","code_decimal":"&#129299;","name":"nerd face","shortname":":nerd:","category":"people","emoji_order":"36","aliases":[":nerd_face:"],"aliases_ascii":[],"keywords":["smiley","glasses"]},"stuck_out_tongue":{"unicode":"1f61b","unicode_alt":"","code_decimal":"&#128539;","name":"face with stuck-out tongue","shortname":":stuck_out_tongue:","category":"people","emoji_order":"37","aliases":[],"aliases_ascii":[":P",":-P","=P",":-p",":p","=p",":-\u00de",":\u00de",":\u00fe",":-\u00fe",":-b",":b","d:"],"keywords":["smiley","sex","emotion"]},"stuck_out_tongue_winking_eye":{"unicode":"1f61c","unicode_alt":"","code_decimal":"&#128540;","name":"face with stuck-out tongue and winking eye","shortname":":stuck_out_tongue_winking_eye:","category":"people","emoji_order":"38","aliases":[],"aliases_ascii":[">:P","X-P","x-p"],"keywords":["happy","smiley","emotion","parties"]},"stuck_out_tongue_closed_eyes":{"unicode":"1f61d","unicode_alt":"","code_decimal":"&#128541;","name":"face with stuck-out tongue and tightly-closed eyes","shortname":":stuck_out_tongue_closed_eyes:","category":"people","emoji_order":"39","aliases":[],"aliases_ascii":[],"keywords":["happy","smiley","emotion"]},"drooling_face":{"unicode":"1f924","unicode_alt":"","code_decimal":"&#129316;","name":"drooling face","shortname":":drooling_face:","category":"people","emoji_order":"40","aliases":[":drool:"],"aliases_ascii":[],"keywords":[]},"unamused":{"unicode":"1f612","unicode_alt":"","code_decimal":"&#128530;","name":"unamused face","shortname":":unamused:","category":"people","emoji_order":"41","aliases":[],"aliases_ascii":[],"keywords":["sad","mad","smiley","tired","emotion"]},"sweat":{"unicode":"1f613","unicode_alt":"","code_decimal":"&#128531;","name":"face with cold sweat","shortname":":sweat:","category":"people","emoji_order":"42","aliases":[],"aliases_ascii":["':(","':-(","'=("],"keywords":["sad","smiley","stressed","sweat","emotion"]},"pensive":{"unicode":"1f614","unicode_alt":"","code_decimal":"&#128532;","name":"pensive face","shortname":":pensive:","category":"people","emoji_order":"43","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","emotion","rip"]},"confused":{"unicode":"1f615","unicode_alt":"","code_decimal":"&#128533;","name":"confused face","shortname":":confused:","category":"people","emoji_order":"44","aliases":[],"aliases_ascii":[">:\\",">:\/",":-\/",":-.",":\/",":\\","=\/","=\\",":L","=L"],"keywords":["smiley","surprised","emotion"]},"upside_down":{"unicode":"1f643","unicode_alt":"","code_decimal":"&#128579;","name":"upside-down face","shortname":":upside_down:","category":"people","emoji_order":"45","aliases":[":upside_down_face:"],"aliases_ascii":[],"keywords":["silly","smiley","sarcastic"]},"money_mouth":{"unicode":"1f911","unicode_alt":"","code_decimal":"&#129297;","name":"money-mouth face","shortname":":money_mouth:","category":"people","emoji_order":"46","aliases":[":money_mouth_face:"],"aliases_ascii":[],"keywords":["smiley","win","money","emotion","boys night"]},"astonished":{"unicode":"1f632","unicode_alt":"","code_decimal":"&#128562;","name":"astonished face","shortname":":astonished:","category":"people","emoji_order":"47","aliases":[],"aliases_ascii":[],"keywords":["smiley","surprised","wow","emotion","omg"]},"frowning2":{"unicode":"2639","unicode_alt":"2639-fe0f","code_decimal":"&#9785;","name":"white frowning face","shortname":":frowning2:","category":"people","emoji_order":"48","aliases":[":white_frowning_face:"],"aliases_ascii":[],"keywords":["sad","smiley","emotion"]},"slight_frown":{"unicode":"1f641","unicode_alt":"","code_decimal":"&#128577;","name":"slightly frowning face","shortname":":slight_frown:","category":"people","emoji_order":"49","aliases":[":slightly_frowning_face:"],"aliases_ascii":[],"keywords":["sad","smiley","emotion"]},"confounded":{"unicode":"1f616","unicode_alt":"","code_decimal":"&#128534;","name":"confounded face","shortname":":confounded:","category":"people","emoji_order":"50","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","angry","emotion"]},"disappointed":{"unicode":"1f61e","unicode_alt":"","code_decimal":"&#128542;","name":"disappointed face","shortname":":disappointed:","category":"people","emoji_order":"51","aliases":[],"aliases_ascii":[">:[",":-(",":(",":-[",":[","=("],"keywords":["sad","smiley","tired","emotion"]},"worried":{"unicode":"1f61f","unicode_alt":"","code_decimal":"&#128543;","name":"worried face","shortname":":worried:","category":"people","emoji_order":"52","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","emotion"]},"triumph":{"unicode":"1f624","unicode_alt":"","code_decimal":"&#128548;","name":"face with look of triumph","shortname":":triumph:","category":"people","emoji_order":"53","aliases":[],"aliases_ascii":[],"keywords":["mad","smiley","angry","emotion","steam"]},"cry":{"unicode":"1f622","unicode_alt":"","code_decimal":"&#128546;","name":"crying face","shortname":":cry:","category":"people","emoji_order":"54","aliases":[],"aliases_ascii":[":'(",":'-(",";(",";-("],"keywords":["sad","smiley","cry","emotion","rip","heartbreak"]},"sob":{"unicode":"1f62d","unicode_alt":"","code_decimal":"&#128557;","name":"loudly crying face","shortname":":sob:","category":"people","emoji_order":"55","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","cry","emotion","heartbreak"]},"frowning":{"unicode":"1f626","unicode_alt":"","code_decimal":"&#128550;","name":"frowning face with open mouth","shortname":":frowning:","category":"people","emoji_order":"56","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","surprised","emotion"]},"anguished":{"unicode":"1f627","unicode_alt":"","code_decimal":"&#128551;","name":"anguished face","shortname":":anguished:","category":"people","emoji_order":"57","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","surprised","emotion"]},"fearful":{"unicode":"1f628","unicode_alt":"","code_decimal":"&#128552;","name":"fearful face","shortname":":fearful:","category":"people","emoji_order":"58","aliases":[],"aliases_ascii":["D:"],"keywords":["smiley","surprised","emotion"]},"weary":{"unicode":"1f629","unicode_alt":"","code_decimal":"&#128553;","name":"weary face","shortname":":weary:","category":"people","emoji_order":"59","aliases":[],"aliases_ascii":[],"keywords":["sad","smiley","tired","stressed","emotion"]},"grimacing":{"unicode":"1f62c","unicode_alt":"","code_decimal":"&#128556;","name":"grimacing face","shortname":":grimacing:","category":"people","emoji_order":"60","aliases":[],"aliases_ascii":[],"keywords":["silly","smiley","emotion","selfie"]},"cold_sweat":{"unicode":"1f630","unicode_alt":"","code_decimal":"&#128560;","name":"face with open mouth and cold sweat","shortname":":cold_sweat:","category":"people","emoji_order":"61","aliases":[],"aliases_ascii":[],"keywords":["smiley","sweat","emotion"]},"scream":{"unicode":"1f631","unicode_alt":"","code_decimal":"&#128561;","name":"face screaming in fear","shortname":":scream:","category":"people","emoji_order":"62","aliases":[],"aliases_ascii":[],"keywords":["smiley","surprised","wow","emotion","omg"]},"flushed":{"unicode":"1f633","unicode_alt":"","code_decimal":"&#128563;","name":"flushed face","shortname":":flushed:","category":"people","emoji_order":"63","aliases":[],"aliases_ascii":[":$","=$"],"keywords":["smiley","emotion","omg"]},"dizzy_face":{"unicode":"1f635","unicode_alt":"","code_decimal":"&#128565;","name":"dizzy face","shortname":":dizzy_face:","category":"people","emoji_order":"64","aliases":[],"aliases_ascii":["#-)","#)","%-)","%)","X)","X-)"],"keywords":["smiley","surprised","dead","wow","emotion","omg"]},"rage":{"unicode":"1f621","unicode_alt":"","code_decimal":"&#128545;","name":"pouting face","shortname":":rage:","category":"people","emoji_order":"65","aliases":[],"aliases_ascii":[],"keywords":["mad","smiley","angry","emotion"]},"angry":{"unicode":"1f620","unicode_alt":"","code_decimal":"&#128544;","name":"angry face","shortname":":angry:","category":"people","emoji_order":"66","aliases":[],"aliases_ascii":[">:(",">:-(",":@"],"keywords":["mad","smiley","emotion"]},"innocent":{"unicode":"1f607","unicode_alt":"","code_decimal":"&#128519;","name":"smiling face with halo","shortname":":innocent:","category":"people","emoji_order":"67","aliases":[],"aliases_ascii":["O:-)","0:-3","0:3","0:-)","0:)","0;^)","O:)","O;-)","O=)","0;-)","O:-3","O:3"],"keywords":["smiley","emotion"]},"cowboy":{"unicode":"1f920","unicode_alt":"","code_decimal":"&#129312;","name":"face with cowboy hat","shortname":":cowboy:","category":"people","emoji_order":"68","aliases":[":face_with_cowboy_hat:"],"aliases_ascii":[],"keywords":[]},"clown":{"unicode":"1f921","unicode_alt":"","code_decimal":"&#129313;","name":"clown face","shortname":":clown:","category":"people","emoji_order":"69","aliases":[":clown_face:"],"aliases_ascii":[],"keywords":[]},"lying_face":{"unicode":"1f925","unicode_alt":"","code_decimal":"&#129317;","name":"lying face","shortname":":lying_face:","category":"people","emoji_order":"70","aliases":[":liar:"],"aliases_ascii":[],"keywords":[]},"mask":{"unicode":"1f637","unicode_alt":"","code_decimal":"&#128567;","name":"face with medical mask","shortname":":mask:","category":"people","emoji_order":"71","aliases":[],"aliases_ascii":[],"keywords":["smiley","dead","health","sick"]},"thermometer_face":{"unicode":"1f912","unicode_alt":"","code_decimal":"&#129298;","name":"face with thermometer","shortname":":thermometer_face:","category":"people","emoji_order":"72","aliases":[":face_with_thermometer:"],"aliases_ascii":[],"keywords":["smiley","health","sick","emotion"]},"head_bandage":{"unicode":"1f915","unicode_alt":"","code_decimal":"&#129301;","name":"face with head-bandage","shortname":":head_bandage:","category":"people","emoji_order":"73","aliases":[":face_with_head_bandage:"],"aliases_ascii":[],"keywords":["smiley","health","sick","emotion"]},"nauseated_face":{"unicode":"1f922","unicode_alt":"","code_decimal":"&#129314;","name":"nauseated face","shortname":":nauseated_face:","category":"people","emoji_order":"74","aliases":[":sick:"],"aliases_ascii":[],"keywords":[]},"sneezing_face":{"unicode":"1f927","unicode_alt":"","code_decimal":"&#129319;","name":"sneezing face","shortname":":sneezing_face:","category":"people","emoji_order":"75","aliases":[":sneeze:"],"aliases_ascii":[],"keywords":[]},"smiling_imp":{"unicode":"1f608","unicode_alt":"","code_decimal":"&#128520;","name":"smiling face with horns","shortname":":smiling_imp:","category":"people","emoji_order":"76","aliases":[],"aliases_ascii":[],"keywords":["silly","smiley","angry","monster","devil","boys night"]},"imp":{"unicode":"1f47f","unicode_alt":"","code_decimal":"&#128127;","name":"imp","shortname":":imp:","category":"people","emoji_order":"77","aliases":[],"aliases_ascii":[],"keywords":["smiley","monster","devil","wth"]},"japanese_ogre":{"unicode":"1f479","unicode_alt":"","code_decimal":"&#128121;","name":"japanese ogre","shortname":":japanese_ogre:","category":"people","emoji_order":"78","aliases":[],"aliases_ascii":[],"keywords":["monster"]},"japanese_goblin":{"unicode":"1f47a","unicode_alt":"","code_decimal":"&#128122;","name":"japanese goblin","shortname":":japanese_goblin:","category":"people","emoji_order":"79","aliases":[],"aliases_ascii":[],"keywords":["angry","monster"]},"skull":{"unicode":"1f480","unicode_alt":"","code_decimal":"&#128128;","name":"skull","shortname":":skull:","category":"people","emoji_order":"80","aliases":[":skeleton:"],"aliases_ascii":[],"keywords":["dead","halloween","skull"]},"skull_crossbones":{"unicode":"2620","unicode_alt":"2620-fe0f","code_decimal":"&#9760;","name":"skull and crossbones","shortname":":skull_crossbones:","category":"objects","emoji_order":"81","aliases":[":skull_and_crossbones:"],"aliases_ascii":[],"keywords":["symbol","dead","skull"]},"ghost":{"unicode":"1f47b","unicode_alt":"","code_decimal":"&#128123;","name":"ghost","shortname":":ghost:","category":"people","emoji_order":"82","aliases":[],"aliases_ascii":[],"keywords":["holidays","halloween","monster"]},"alien":{"unicode":"1f47d","unicode_alt":"","code_decimal":"&#128125;","name":"extraterrestrial alien","shortname":":alien:","category":"people","emoji_order":"83","aliases":[],"aliases_ascii":[],"keywords":["space","monster","alien","scientology"]},"space_invader":{"unicode":"1f47e","unicode_alt":"","code_decimal":"&#128126;","name":"alien monster","shortname":":space_invader:","category":"activity","emoji_order":"84","aliases":[],"aliases_ascii":[],"keywords":["monster","alien"]},"robot":{"unicode":"1f916","unicode_alt":