From baee20b2797fd0f01c92d764c24d9658f44509f9 Mon Sep 17 00:00:00 2001 From: "Harrison (Harry) Cramer" <32515581+harrisoncramer@users.noreply.github.com> Date: Sun, 18 Feb 2024 21:16:53 -0500 Subject: [PATCH] Add/Show/Delete Emojis on Notes (#181) This MR adds the ability to view, add, and delete emojis from notes and comments. This action can be performed by default with the `Ea` (emoji add) keybinding, and the `Ed` (emoji delete) keybinding. Only emojis added by the current user are eligible for deletion. The MR also implements a popup functionality which shows the user who added emojis on hover. Implements #179 --- README.md | 2 + after/syntax/gitlab.vim | 4 +- cmd/client.go | 4 + cmd/comment.go | 6 +- cmd/emoji.go | 234 + cmd/list_discussions.go | 26 +- cmd/list_discussions_test.go | 25 +- cmd/server.go | 8 + cmd/test.go | 105 +- cmd/types.go | 28 +- cmd/user.go | 47 + config/emojis.json | 10878 ++++++++++++++++ doc/gitlab.nvim.txt | 9 + .../actions/discussions/annotations.lua | 12 + lua/gitlab/actions/discussions/init.lua | 109 +- lua/gitlab/actions/discussions/signs.lua | 1 - lua/gitlab/actions/summary.lua | 1 - lua/gitlab/emoji.lua | 140 + lua/gitlab/hover.lua | 78 + lua/gitlab/init.lua | 7 +- lua/gitlab/state.lua | 5 + lua/gitlab/utils/init.lua | 9 + 22 files changed, 11655 insertions(+), 83 deletions(-) create mode 100644 cmd/emoji.go create mode 100644 cmd/user.go create mode 100644 config/emojis.json create mode 100644 lua/gitlab/emoji.lua create mode 100644 lua/gitlab/hover.lua diff --git a/README.md b/README.md index 290da49..c4ffbd4 100644 --- a/README.md +++ b/README.md @@ -136,6 +136,8 @@ require("gitlab").setup({ delete_comment = "dd", -- Delete comment reply = "r", -- Reply to comment toggle_node = "t", -- Opens or closes the discussion + add_emoji = "Ea" -- Add an emoji to the note/comment + add_emoji = "Ed" -- Remove an emoji from a note/comment toggle_all_discussions = "T", -- Open or close separately both resolved and unresolved discussions toggle_resolved_discussions = "R", -- Open or close all resolved discussions toggle_unresolved_discussions = "U", -- Open or close all unresolved discussions diff --git a/after/syntax/gitlab.vim b/after/syntax/gitlab.vim index 34c0d50..937df5c 100644 --- a/after/syntax/gitlab.vim +++ b/after/syntax/gitlab.vim @@ -6,8 +6,8 @@ syntax match Username "@\S*" syntax match Date "\v\d+\s+\w+\s+ago" syntax match ChevronDown "" syntax match ChevronRight "" -syntax match Resolved "✓$" -syntax match Unresolved "-$" +syntax match Resolved /\s✓\s\?/ +syntax match Unresolved /\s-\s\?/ highlight link Username GitlabUsername highlight link Date GitlabDate diff --git a/cmd/client.go b/cmd/client.go index cab6c01..46a5a7e 100644 --- a/cmd/client.go +++ b/cmd/client.go @@ -33,6 +33,8 @@ type Client struct { *gitlab.JobsService *gitlab.PipelinesService *gitlab.LabelsService + *gitlab.AwardEmojiService + *gitlab.UsersService } /* initGitlabClient parses and validates the project settings and initializes the Gitlab client. */ @@ -89,6 +91,8 @@ func initGitlabClient() (error, *Client) { JobsService: client.Jobs, PipelinesService: client.Pipelines, LabelsService: client.Labels, + AwardEmojiService: client.AwardEmoji, + UsersService: client.Users, } } diff --git a/cmd/comment.go b/cmd/comment.go index d78e895..3b300ba 100644 --- a/cmd/comment.go +++ b/cmd/comment.go @@ -55,6 +55,7 @@ type CommentResponse struct { /* commentHandler creates, edits, and deletes discussions (comments, multi-line comments) */ func (a *api) commentHandler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") switch r.Method { case http.MethodPost: a.postComment(w, r) @@ -63,7 +64,6 @@ func (a *api) commentHandler(w http.ResponseWriter, r *http.Request) { case http.MethodDelete: a.deleteComment(w, r) default: - w.Header().Set("Content-Type", "application/json") w.Header().Set("Access-Control-Allow-Methods", fmt.Sprintf("%s, %s, %s", http.MethodDelete, http.MethodPost, http.MethodPatch)) handleError(w, InvalidRequestError{}, "Expected DELETE, POST or PATCH", http.StatusMethodNotAllowed) } @@ -71,7 +71,6 @@ func (a *api) commentHandler(w http.ResponseWriter, r *http.Request) { /* deleteComment deletes a note, multiline comment, or comment, which are all considered discussion notes. */ func (a *api) deleteComment(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") body, err := io.ReadAll(r.Body) if err != nil { handleError(w, err, "Could not read request body", http.StatusBadRequest) @@ -113,8 +112,6 @@ func (a *api) deleteComment(w http.ResponseWriter, r *http.Request) { /* postComment creates a note, multiline comment, or comment. */ func (a *api) postComment(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - body, err := io.ReadAll(r.Body) if err != nil { handleError(w, err, "Could not read request body", http.StatusBadRequest) @@ -208,7 +205,6 @@ func (a *api) postComment(w http.ResponseWriter, r *http.Request) { /* editComment changes the text of a comment or changes it's resolved status. */ func (a *api) editComment(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") body, err := io.ReadAll(r.Body) if err != nil { diff --git a/cmd/emoji.go b/cmd/emoji.go new file mode 100644 index 0000000..b994299 --- /dev/null +++ b/cmd/emoji.go @@ -0,0 +1,234 @@ +package main + +import ( + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "os" + "path" + "strconv" + "strings" + "sync" + + "github.com/xanzy/go-gitlab" +) + +type Emoji struct { + Unicode string `json:"unicode"` + UnicodeAlternates []string `json:"unicode_alternates"` + Name string `json:"name"` + Shortname string `json:"shortname"` + Category string `json:"category"` + Aliases []string `json:"aliases"` + AliasesASCII []string `json:"aliases_ascii"` + Keywords []string `json:"keywords"` + Moji string `json:"moji"` +} + +type EmojiMap map[string]Emoji + +type CreateNoteEmojiPost struct { + Emoji string `json:"emoji"` + NoteId int `json:"note_id"` +} + +type CreateEmojiResponse struct { + SuccessResponse + Emoji *gitlab.AwardEmoji +} + +/* +attachEmojisToApi reads the emojis from our external JSON file +and attaches them to the API so that they can be looked up later +*/ +func attachEmojisToApi(a *api) error { + + e, err := os.Executable() + if err != nil { + return err + } + + binPath := path.Dir(e) + filePath := fmt.Sprintf("%s/config/emojis.json", binPath) + + reader, err := a.fileReader.ReadFile(filePath) + + if err != nil { + return fmt.Errorf("Could not find emojis at %s", filePath) + } + + bytes, err := io.ReadAll(reader) + if err != nil { + return errors.New("Could not read emoji file") + } + + var emojiMap EmojiMap + err = json.Unmarshal(bytes, &emojiMap) + if err != nil { + return errors.New("Could not unmarshal emojis") + } + + a.emojiMap = emojiMap + return nil +} + +/* +Fetches emojis for a set of notes and comments in parallel and returns a map of note IDs to their emojis. +Gitlab's API does not allow for fetching notes for an entire discussion thread so we have to do it per-note. +*/ +func (a *api) fetchEmojisForNotesAndComments(noteIDs []int) (map[int][]*gitlab.AwardEmoji, error) { + var wg sync.WaitGroup + + emojis := make(map[int][]*gitlab.AwardEmoji) + mu := &sync.Mutex{} + errs := make(chan error, len(noteIDs)) + emojiChan := make(chan struct { + noteID int + emojis []*gitlab.AwardEmoji + }, len(noteIDs)) + + for _, noteID := range noteIDs { + wg.Add(1) + go func(noteID int) { + defer wg.Done() + emojis, _, err := a.client.ListMergeRequestAwardEmojiOnNote(a.projectInfo.ProjectId, a.projectInfo.MergeId, noteID, &gitlab.ListAwardEmojiOptions{}) + if err != nil { + errs <- err + return + } + emojiChan <- struct { + noteID int + emojis []*gitlab.AwardEmoji + }{noteID, emojis} + }(noteID) + } + + /* Close the channels when all goroutines finish */ + go func() { + wg.Wait() + close(errs) + close(emojiChan) + }() + + /* Collect emojis */ + for e := range emojiChan { + mu.Lock() + emojis[e.noteID] = e.emojis + mu.Unlock() + } + + /* Check if any errors occurred */ + if len(errs) > 0 { + for err := range errs { + if err != nil { + return nil, err + } + } + } + + return emojis, nil +} + +func (a *api) emojiNoteHandler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + switch r.Method { + case http.MethodPost: + a.postEmojiOnNote(w, r) + case http.MethodDelete: + a.deleteEmojiFromNote(w, r) + default: + w.Header().Set("Access-Control-Allow-Methods", fmt.Sprintf("%s, %s", http.MethodDelete, http.MethodPost)) + handleError(w, InvalidRequestError{}, "Expected DELETE or POST", http.StatusMethodNotAllowed) + } +} + +/* deleteEmojiFromNote deletes an emoji from a note based on the emoji (awardable) ID and the note's ID */ +func (a *api) deleteEmojiFromNote(w http.ResponseWriter, r *http.Request) { + + suffix := strings.TrimPrefix(r.URL.Path, "/mr/awardable/note/") + ids := strings.Split(suffix, "/") + + noteId, err := strconv.Atoi(ids[0]) + if err != nil { + handleError(w, err, "Could not convert note ID to integer", http.StatusBadRequest) + return + } + + awardableId, err := strconv.Atoi(ids[1]) + if err != nil { + handleError(w, err, "Could not convert awardable ID to integer", http.StatusBadRequest) + return + } + + res, err := a.client.DeleteMergeRequestAwardEmojiOnNote(a.projectInfo.ProjectId, a.projectInfo.MergeId, noteId, awardableId) + + if err != nil { + handleError(w, err, "Could not delete awardable", http.StatusInternalServerError) + return + } + + if res.StatusCode >= 300 { + handleError(w, GenericError{endpoint: "/pipeline"}, "Could not delete awardable", res.StatusCode) + return + } + + w.WriteHeader(http.StatusOK) + response := SuccessResponse{ + Message: "Emoji deleted", + Status: http.StatusOK, + } + + err = json.NewEncoder(w).Encode(response) + if err != nil { + handleError(w, err, "Could not encode response", http.StatusInternalServerError) + } +} + +/* postEmojiOnNote adds an emojis to a note based on the note's ID */ +func (a *api) postEmojiOnNote(w http.ResponseWriter, r *http.Request) { + body, err := io.ReadAll(r.Body) + if err != nil { + handleError(w, err, "Could not read request body", http.StatusBadRequest) + return + } + + defer r.Body.Close() + + var emojiPost CreateNoteEmojiPost + err = json.Unmarshal(body, &emojiPost) + + if err != nil { + handleError(w, err, "Could not unmarshal request body", http.StatusBadRequest) + return + } + + awardEmoji, res, err := a.client.CreateMergeRequestAwardEmojiOnNote(a.projectInfo.ProjectId, a.projectInfo.MergeId, emojiPost.NoteId, &gitlab.CreateAwardEmojiOptions{ + Name: emojiPost.Emoji, + }) + + if err != nil { + handleError(w, err, "Could not post emoji", http.StatusInternalServerError) + return + } + + if res.StatusCode >= 300 { + handleError(w, GenericError{endpoint: "/mr/awardable/note"}, "Could not post emoji", res.StatusCode) + return + } + + w.WriteHeader(http.StatusOK) + response := CreateEmojiResponse{ + SuccessResponse: SuccessResponse{ + Message: "Merge requests retrieved", + Status: http.StatusOK, + }, + Emoji: awardEmoji, + } + + err = json.NewEncoder(w).Encode(response) + if err != nil { + handleError(w, err, "Could not encode response", http.StatusInternalServerError) + } +} diff --git a/cmd/list_discussions.go b/cmd/list_discussions.go index 909aa1f..2638f2a 100644 --- a/cmd/list_discussions.go +++ b/cmd/list_discussions.go @@ -16,8 +16,9 @@ type DiscussionsRequest struct { type DiscussionsResponse struct { SuccessResponse - Discussions []*gitlab.Discussion `json:"discussions"` - UnlinkedDiscussions []*gitlab.Discussion `json:"unlinked_discussions"` + Discussions []*gitlab.Discussion `json:"discussions"` + UnlinkedDiscussions []*gitlab.Discussion `json:"unlinked_discussions"` + Emojis map[int][]*gitlab.AwardEmoji `json:"emojis"` } type SortableDiscussions []*gitlab.Discussion @@ -83,6 +84,7 @@ func (a *api) listDiscussionsHandler(w http.ResponseWriter, r *http.Request) { and system discussions, then return them sorted by created date */ var unlinkedDiscussions []*gitlab.Discussion var linkedDiscussions []*gitlab.Discussion + for _, discussion := range discussions { if discussion.Notes == nil || len(discussion.Notes) == 0 || Contains(requestBody.Blacklist, discussion.Notes[0].Author.Username) > -1 { continue @@ -98,17 +100,26 @@ func (a *api) listDiscussionsHandler(w http.ResponseWriter, r *http.Request) { } } + /* Collect IDs in order to fetch emojis */ + var noteIds []int + for _, discussion := range discussions { + for _, note := range discussion.Notes { + noteIds = append(noteIds, note.ID) + } + } + + emojis, err := a.fetchEmojisForNotesAndComments(noteIds) + if err != nil { + handleError(w, err, "Could not fetch emojis", http.StatusInternalServerError) + return + } + sortedLinkedDiscussions := SortableDiscussions(linkedDiscussions) sortedUnlinkedDiscussions := SortableDiscussions(unlinkedDiscussions) sort.Sort(sortedLinkedDiscussions) sort.Sort(sortedUnlinkedDiscussions) - if err != nil { - handleError(w, err, "Could not list discussions", http.StatusBadRequest) - return - } - w.WriteHeader(http.StatusOK) response := DiscussionsResponse{ SuccessResponse: SuccessResponse{ @@ -117,6 +128,7 @@ func (a *api) listDiscussionsHandler(w http.ResponseWriter, r *http.Request) { }, Discussions: linkedDiscussions, UnlinkedDiscussions: unlinkedDiscussions, + Emojis: emojis, } err = json.NewEncoder(w).Encode(response) diff --git a/cmd/list_discussions_test.go b/cmd/list_discussions_test.go index b635eee..6e51224 100644 --- a/cmd/list_discussions_test.go +++ b/cmd/list_discussions_test.go @@ -47,10 +47,18 @@ func listMergeRequestDiscussionsNon200(pid interface{}, mergeRequest int, opt *g return nil, makeResponse(http.StatusSeeOther), nil } +func listMergeRequestAwardEmojiOnNote(pid interface{}, mr int, noteID int, opt *gitlab.ListAwardEmojiOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.AwardEmoji, *gitlab.Response, error) { + return []*gitlab.AwardEmoji{}, makeResponse(http.StatusOK), nil +} + +func listMergeRequestAwardEmojiOnNoteFailure(pid interface{}, mr int, noteID int, opt *gitlab.ListAwardEmojiOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.AwardEmoji, *gitlab.Response, error) { + return nil, makeResponse(http.StatusBadRequest), errors.New("Some error from Gitlab") +} + func TestListDiscussionsHandler(t *testing.T) { t.Run("Returns sorted discussions", func(t *testing.T) { request := makeRequest(t, http.MethodPost, "/mr/discussions/list", DiscussionsRequest{}) - server, _ := createRouterAndApi(fakeClient{listMergeRequestDiscussions: listMergeRequestDiscussions}) + server, _ := createRouterAndApi(fakeClient{listMergeRequestDiscussions: listMergeRequestDiscussions, listMergeRequestAwardEmojiOnNote: listMergeRequestAwardEmojiOnNote}) data := serveRequest(t, server, request, DiscussionsResponse{}) assert(t, data.SuccessResponse.Message, "Discussions retrieved") assert(t, data.SuccessResponse.Status, http.StatusOK) @@ -60,7 +68,7 @@ func TestListDiscussionsHandler(t *testing.T) { t.Run("Uses blacklist to filter unwanted authors", func(t *testing.T) { request := makeRequest(t, http.MethodPost, "/mr/discussions/list", DiscussionsRequest{Blacklist: []string{"hcramer"}}) - server, _ := createRouterAndApi(fakeClient{listMergeRequestDiscussions: listMergeRequestDiscussions}) + server, _ := createRouterAndApi(fakeClient{listMergeRequestDiscussions: listMergeRequestDiscussions, listMergeRequestAwardEmojiOnNote: listMergeRequestAwardEmojiOnNote}) data := serveRequest(t, server, request, DiscussionsResponse{}) assert(t, data.SuccessResponse.Message, "Discussions retrieved") assert(t, data.SuccessResponse.Status, http.StatusOK) @@ -70,22 +78,29 @@ func TestListDiscussionsHandler(t *testing.T) { t.Run("Disallows non-POST method", func(t *testing.T) { request := makeRequest(t, http.MethodPatch, "/mr/discussions/list", DiscussionsRequest{}) - server, _ := createRouterAndApi(fakeClient{listMergeRequestDiscussions: listMergeRequestDiscussions}) + server, _ := createRouterAndApi(fakeClient{listMergeRequestDiscussions: listMergeRequestDiscussions, listMergeRequestAwardEmojiOnNote: listMergeRequestAwardEmojiOnNote}) data := serveRequest(t, server, request, ErrorResponse{}) checkBadMethod(t, *data, http.MethodPost) }) t.Run("Handles errors from Gitlab client", func(t *testing.T) { request := makeRequest(t, http.MethodPost, "/mr/discussions/list", DiscussionsRequest{}) - server, _ := createRouterAndApi(fakeClient{listMergeRequestDiscussions: listMergeRequestDiscussionsErr}) + server, _ := createRouterAndApi(fakeClient{listMergeRequestDiscussions: listMergeRequestDiscussionsErr, listMergeRequestAwardEmojiOnNote: listMergeRequestAwardEmojiOnNote}) data := serveRequest(t, server, request, ErrorResponse{}) checkErrorFromGitlab(t, *data, "Could not list discussions") }) t.Run("Handles non-200s from Gitlab client", func(t *testing.T) { request := makeRequest(t, http.MethodPost, "/mr/discussions/list", DiscussionsRequest{}) - server, _ := createRouterAndApi(fakeClient{listMergeRequestDiscussions: listMergeRequestDiscussionsNon200}) + server, _ := createRouterAndApi(fakeClient{listMergeRequestDiscussions: listMergeRequestDiscussionsNon200, listMergeRequestAwardEmojiOnNote: listMergeRequestAwardEmojiOnNote}) data := serveRequest(t, server, request, ErrorResponse{}) checkNon200(t, *data, "Could not list discussions", "/mr/discussions/list") }) + + t.Run("Handles error from emoji service", func(t *testing.T) { + request := makeRequest(t, http.MethodPost, "/mr/discussions/list", DiscussionsRequest{}) + server, _ := createRouterAndApi(fakeClient{listMergeRequestDiscussions: listMergeRequestDiscussions, listMergeRequestAwardEmojiOnNote: listMergeRequestAwardEmojiOnNoteFailure}) + data := serveRequest(t, server, request, ErrorResponse{}) + checkErrorFromGitlab(t, *data, "Could not fetch emojis") + }) } diff --git a/cmd/server.go b/cmd/server.go index bd09405..07d7df7 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -31,6 +31,10 @@ func startServer(client *Client, projectInfo *ProjectInfo, gitInfo GitProjectInf func(a *api) error { a.gitInfo = &gitInfo return nil + }, + func(a *api) error { + err := attachEmojisToApi(a) + return err }) l := createListener() @@ -82,6 +86,7 @@ type api struct { projectInfo *ProjectInfo gitInfo *GitProjectInfo fileReader FileReader + emojiMap EmojiMap sigCh chan os.Signal } @@ -100,6 +105,7 @@ func createRouterAndApi(client ClientInterface, optFuncs ...optFunc) (*http.Serv projectInfo: &ProjectInfo{}, gitInfo: &GitProjectInfo{}, fileReader: nil, + emojiMap: EmojiMap{}, sigCh: make(chan os.Signal, 1), } @@ -124,7 +130,9 @@ func createRouterAndApi(client ClientInterface, optFuncs ...optFunc) (*http.Serv m.HandleFunc("/mr/reply", a.withMr(a.replyHandler)) m.HandleFunc("/mr/label", a.withMr(a.labelHandler)) m.HandleFunc("/mr/revoke", a.withMr(a.revokeHandler)) + m.HandleFunc("/mr/awardable/note/", a.withMr(a.emojiNoteHandler)) + m.HandleFunc("/users/me", a.meHandler) m.HandleFunc("/attachment", a.attachmentHandler) m.HandleFunc("/create_mr", a.createMr) m.HandleFunc("/job", a.jobHandler) diff --git a/cmd/test.go b/cmd/test.go index 0376b0b..33cc5d2 100644 --- a/cmd/test.go +++ b/cmd/test.go @@ -18,25 +18,28 @@ The FakeHandlerClient is used to create a fake gitlab client for testing our han */ type fakeClient struct { - createMrFn func(pid interface{}, opt *gitlab.CreateMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) - getMergeRequestFn func(pid interface{}, mergeRequest int, opt *gitlab.GetMergeRequestsOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) - updateMergeRequestFn func(pid interface{}, mergeRequest int, opt *gitlab.UpdateMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) - acceptAndMergeFn func(pid interface{}, mergeRequest int, opt *gitlab.AcceptMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) - unapprorveMergeRequestFn func(pid interface{}, mr int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) - uploadFile func(pid interface{}, content io.Reader, filename string, options ...gitlab.RequestOptionFunc) (*gitlab.ProjectFile, *gitlab.Response, error) - getMergeRequestDiffVersions func(pid interface{}, mergeRequest int, opt *gitlab.GetMergeRequestDiffVersionsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.MergeRequestDiffVersion, *gitlab.Response, error) - approveMergeRequest func(pid interface{}, mr int, opt *gitlab.ApproveMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequestApprovals, *gitlab.Response, error) - listMergeRequestDiscussions func(pid interface{}, mergeRequest int, opt *gitlab.ListMergeRequestDiscussionsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Discussion, *gitlab.Response, error) - resolveMergeRequestDiscussion func(pid interface{}, mergeRequest int, discussion string, opt *gitlab.ResolveMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error) - createMergeRequestDiscussion func(pid interface{}, mergeRequest int, opt *gitlab.CreateMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error) - updateMergeRequestDiscussionNote func(pid interface{}, mergeRequest int, discussion string, note int, opt *gitlab.UpdateMergeRequestDiscussionNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error) - deleteMergeRequestDiscussionNote func(pid interface{}, mergeRequest int, discussion string, note int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) - addMergeRequestDiscussionNote func(pid interface{}, mergeRequest int, discussion string, opt *gitlab.AddMergeRequestDiscussionNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error) - listAllProjectMembers func(pid interface{}, opt *gitlab.ListProjectMembersOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.ProjectMember, *gitlab.Response, error) - retryPipelineBuild func(pid interface{}, pipeline int, options ...gitlab.RequestOptionFunc) (*gitlab.Pipeline, *gitlab.Response, error) - listPipelineJobs func(pid interface{}, pipelineID int, opts *gitlab.ListJobsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Job, *gitlab.Response, error) - getTraceFile func(pid interface{}, jobID int, options ...gitlab.RequestOptionFunc) (*bytes.Reader, *gitlab.Response, error) - listLabels func(pid interface{}, opt *gitlab.ListLabelsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Label, *gitlab.Response, error) + createMrFn func(pid interface{}, opt *gitlab.CreateMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) + getMergeRequestFn func(pid interface{}, mergeRequestIID int, opt *gitlab.GetMergeRequestsOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) + updateMergeRequestFn func(pid interface{}, mergeRequestIID int, opt *gitlab.UpdateMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) + acceptAndMergeFn func(pid interface{}, mergeRequestIID int, opt *gitlab.AcceptMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) + unapprorveMergeRequestFn func(pid interface{}, mergeRequestIID int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) + uploadFile func(pid interface{}, content io.Reader, filename string, options ...gitlab.RequestOptionFunc) (*gitlab.ProjectFile, *gitlab.Response, error) + getMergeRequestDiffVersions func(pid interface{}, mergeRequestIID int, opt *gitlab.GetMergeRequestDiffVersionsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.MergeRequestDiffVersion, *gitlab.Response, error) + approveMergeRequest func(pid interface{}, mergeRequestIID int, opt *gitlab.ApproveMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequestApprovals, *gitlab.Response, error) + listMergeRequestDiscussions func(pid interface{}, mergeRequestIID int, opt *gitlab.ListMergeRequestDiscussionsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Discussion, *gitlab.Response, error) + resolveMergeRequestDiscussion func(pid interface{}, mergeRequestIID int, discussion string, opt *gitlab.ResolveMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error) + createMergeRequestDiscussion func(pid interface{}, mergeRequestIID int, opt *gitlab.CreateMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error) + updateMergeRequestDiscussionNote func(pid interface{}, mergeRequestIID int, discussion string, note int, opt *gitlab.UpdateMergeRequestDiscussionNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error) + deleteMergeRequestDiscussionNote func(pid interface{}, mergeRequestIID int, discussion string, note int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) + addMergeRequestDiscussionNote func(pid interface{}, mergeRequestIID int, discussion string, opt *gitlab.AddMergeRequestDiscussionNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error) + listAllProjectMembers func(pid interface{}, opt *gitlab.ListProjectMembersOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.ProjectMember, *gitlab.Response, error) + retryPipelineBuild func(pid interface{}, pipeline int, options ...gitlab.RequestOptionFunc) (*gitlab.Pipeline, *gitlab.Response, error) + listPipelineJobs func(pid interface{}, pipelineID int, opts *gitlab.ListJobsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Job, *gitlab.Response, error) + getTraceFile func(pid interface{}, jobID int, options ...gitlab.RequestOptionFunc) (*bytes.Reader, *gitlab.Response, error) + listLabels func(pid interface{}, opt *gitlab.ListLabelsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Label, *gitlab.Response, error) + listMergeRequestAwardEmojiOnNote func(pid interface{}, mergeRequestIID, noteID int, opt *gitlab.ListAwardEmojiOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.AwardEmoji, *gitlab.Response, error) + deleteMergeRequestAwardEmojiOnNote func(pid interface{}, mergeRequestIID, noteID, awardID int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) + currentUser func(options ...gitlab.RequestOptionFunc) (*gitlab.User, *gitlab.Response, error) } type Author struct { @@ -53,56 +56,56 @@ func (f fakeClient) CreateMergeRequest(pid interface{}, opt *gitlab.CreateMergeR return f.createMrFn(pid, opt, options...) } -func (f fakeClient) AcceptMergeRequest(pid interface{}, mergeRequest int, opt *gitlab.AcceptMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) { - return f.acceptAndMergeFn(pid, mergeRequest, opt, options...) +func (f fakeClient) AcceptMergeRequest(pid interface{}, mergeRequestIID int, opt *gitlab.AcceptMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) { + return f.acceptAndMergeFn(pid, mergeRequestIID, opt, options...) } -func (f fakeClient) GetMergeRequest(pid interface{}, mergeRequest int, opt *gitlab.GetMergeRequestsOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) { - return f.getMergeRequestFn(pid, mergeRequest, opt, options...) +func (f fakeClient) GetMergeRequest(pid interface{}, mergeRequestIID int, opt *gitlab.GetMergeRequestsOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) { + return f.getMergeRequestFn(pid, mergeRequestIID, opt, options...) } -func (f fakeClient) UpdateMergeRequest(pid interface{}, mergeRequest int, opt *gitlab.UpdateMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) { - return f.updateMergeRequestFn(pid, mergeRequest, opt, options...) +func (f fakeClient) UpdateMergeRequest(pid interface{}, mergeRequestIID int, opt *gitlab.UpdateMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) { + return f.updateMergeRequestFn(pid, mergeRequestIID, opt, options...) } -func (f fakeClient) UnapproveMergeRequest(pid interface{}, mr int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) { - return f.unapprorveMergeRequestFn(pid, mr, options...) +func (f fakeClient) UnapproveMergeRequest(pid interface{}, mergeRequestIID int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) { + return f.unapprorveMergeRequestFn(pid, mergeRequestIID, options...) } func (f fakeClient) UploadFile(pid interface{}, content io.Reader, filename string, options ...gitlab.RequestOptionFunc) (*gitlab.ProjectFile, *gitlab.Response, error) { return f.uploadFile(pid, content, filename, options...) } -func (f fakeClient) GetMergeRequestDiffVersions(pid interface{}, mergeRequest int, opt *gitlab.GetMergeRequestDiffVersionsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.MergeRequestDiffVersion, *gitlab.Response, error) { - return f.getMergeRequestDiffVersions(pid, mergeRequest, opt, options...) +func (f fakeClient) GetMergeRequestDiffVersions(pid interface{}, mergeRequestIID int, opt *gitlab.GetMergeRequestDiffVersionsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.MergeRequestDiffVersion, *gitlab.Response, error) { + return f.getMergeRequestDiffVersions(pid, mergeRequestIID, opt, options...) } -func (f fakeClient) ApproveMergeRequest(pid interface{}, mr int, opt *gitlab.ApproveMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequestApprovals, *gitlab.Response, error) { - return f.approveMergeRequest(pid, mr, opt, options...) +func (f fakeClient) ApproveMergeRequest(pid interface{}, mergeRequestIID int, opt *gitlab.ApproveMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequestApprovals, *gitlab.Response, error) { + return f.approveMergeRequest(pid, mergeRequestIID, opt, options...) } -func (f fakeClient) ListMergeRequestDiscussions(pid interface{}, mergeRequest int, opt *gitlab.ListMergeRequestDiscussionsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Discussion, *gitlab.Response, error) { - return f.listMergeRequestDiscussions(pid, mergeRequest, opt, options...) +func (f fakeClient) ListMergeRequestDiscussions(pid interface{}, mergeRequestIID int, opt *gitlab.ListMergeRequestDiscussionsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Discussion, *gitlab.Response, error) { + return f.listMergeRequestDiscussions(pid, mergeRequestIID, opt, options...) } -func (f fakeClient) ResolveMergeRequestDiscussion(pid interface{}, mergeRequest int, discussion string, opt *gitlab.ResolveMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error) { - return f.resolveMergeRequestDiscussion(pid, mergeRequest, discussion, opt, options...) +func (f fakeClient) ResolveMergeRequestDiscussion(pid interface{}, mergeRequestIID int, discussion string, opt *gitlab.ResolveMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error) { + return f.resolveMergeRequestDiscussion(pid, mergeRequestIID, discussion, opt, options...) } -func (f fakeClient) CreateMergeRequestDiscussion(pid interface{}, mergeRequest int, opt *gitlab.CreateMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error) { - return f.createMergeRequestDiscussion(pid, mergeRequest, opt, options...) +func (f fakeClient) CreateMergeRequestDiscussion(pid interface{}, mergeRequestIID int, opt *gitlab.CreateMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error) { + return f.createMergeRequestDiscussion(pid, mergeRequestIID, opt, options...) } -func (f fakeClient) UpdateMergeRequestDiscussionNote(pid interface{}, mergeRequest int, discussion string, note int, opt *gitlab.UpdateMergeRequestDiscussionNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error) { - return f.updateMergeRequestDiscussionNote(pid, mergeRequest, discussion, note, opt, options...) +func (f fakeClient) UpdateMergeRequestDiscussionNote(pid interface{}, mergeRequestIID int, discussion string, note int, opt *gitlab.UpdateMergeRequestDiscussionNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error) { + return f.updateMergeRequestDiscussionNote(pid, mergeRequestIID, discussion, note, opt, options...) } -func (f fakeClient) DeleteMergeRequestDiscussionNote(pid interface{}, mergeRequest int, discussion string, note int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) { - return f.deleteMergeRequestDiscussionNote(pid, mergeRequest, discussion, note, options...) +func (f fakeClient) DeleteMergeRequestDiscussionNote(pid interface{}, mergeRequestIID int, discussion string, note int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) { + return f.deleteMergeRequestDiscussionNote(pid, mergeRequestIID, discussion, note, options...) } -func (f fakeClient) AddMergeRequestDiscussionNote(pid interface{}, mergeRequest int, discussion string, opt *gitlab.AddMergeRequestDiscussionNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error) { - return f.addMergeRequestDiscussionNote(pid, mergeRequest, discussion, opt, options...) +func (f fakeClient) AddMergeRequestDiscussionNote(pid interface{}, mergeRequestIID int, discussion string, opt *gitlab.AddMergeRequestDiscussionNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error) { + return f.addMergeRequestDiscussionNote(pid, mergeRequestIID, discussion, opt, options...) } func (f fakeClient) ListAllProjectMembers(pid interface{}, opt *gitlab.ListProjectMembersOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.ProjectMember, *gitlab.Response, error) { @@ -125,11 +128,27 @@ func (f fakeClient) ListLabels(pid interface{}, opt *gitlab.ListLabelsOptions, o return f.listLabels(pid, opt, options...) } +func (f fakeClient) ListMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID int, noteID int, opt *gitlab.ListAwardEmojiOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.AwardEmoji, *gitlab.Response, error) { + return f.listMergeRequestAwardEmojiOnNote(pid, mergeRequestIID, noteID, opt, options...) +} + +func (f fakeClient) DeleteMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID, noteID, awardID int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) { + return f.deleteMergeRequestAwardEmojiOnNote(pid, mergeRequestIID, noteID, awardID) +} + +func (f fakeClient) CurrentUser(options ...gitlab.RequestOptionFunc) (*gitlab.User, *gitlab.Response, error) { + return f.currentUser() +} + /* This middleware function needs to return an ID for the rest of the handlers */ func (f fakeClient) ListProjectMergeRequests(pid interface{}, opt *gitlab.ListProjectMergeRequestsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.MergeRequest, *gitlab.Response, error) { return []*gitlab.MergeRequest{{ID: 1}}, &gitlab.Response{}, nil } +func (f fakeClient) CreateMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID, noteID int, opt *gitlab.CreateAwardEmojiOptions, options ...gitlab.RequestOptionFunc) (*gitlab.AwardEmoji, *gitlab.Response, error) { + return &gitlab.AwardEmoji{}, &gitlab.Response{}, nil +} + /* The assert function is a helper function used to check two comparables */ func assert[T comparable](t *testing.T, got T, want T) { t.Helper() diff --git a/cmd/types.go b/cmd/types.go index 235fa27..70f3d2e 100644 --- a/cmd/types.go +++ b/cmd/types.go @@ -37,22 +37,26 @@ func (e InvalidRequestError) Error() string { type ClientInterface interface { CreateMergeRequest(pid interface{}, opt *gitlab.CreateMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) ListProjectMergeRequests(pid interface{}, opt *gitlab.ListProjectMergeRequestsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.MergeRequest, *gitlab.Response, error) - GetMergeRequest(pid interface{}, mr int, opt *gitlab.GetMergeRequestsOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) - AcceptMergeRequest(pid interface{}, mergeRequest int, opt *gitlab.AcceptMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) - UpdateMergeRequest(pid interface{}, mr int, opt *gitlab.UpdateMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) + GetMergeRequest(pid interface{}, mergeRequestIID int, opt *gitlab.GetMergeRequestsOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) + AcceptMergeRequest(pid interface{}, mergeRequestIID int, opt *gitlab.AcceptMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) + UpdateMergeRequest(pid interface{}, mergeRequestIID int, opt *gitlab.UpdateMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) UploadFile(pid interface{}, content io.Reader, filename string, options ...gitlab.RequestOptionFunc) (*gitlab.ProjectFile, *gitlab.Response, error) - GetMergeRequestDiffVersions(pid interface{}, mr int, opt *gitlab.GetMergeRequestDiffVersionsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.MergeRequestDiffVersion, *gitlab.Response, error) - ApproveMergeRequest(pid interface{}, mr int, opt *gitlab.ApproveMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequestApprovals, *gitlab.Response, error) - UnapproveMergeRequest(pid interface{}, mr int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) - ListMergeRequestDiscussions(pid interface{}, mergeRequest int, opt *gitlab.ListMergeRequestDiscussionsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Discussion, *gitlab.Response, error) - ResolveMergeRequestDiscussion(pid interface{}, mergeRequest int, discussion string, opt *gitlab.ResolveMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error) - CreateMergeRequestDiscussion(pid interface{}, mergeRequest int, opt *gitlab.CreateMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error) - UpdateMergeRequestDiscussionNote(pid interface{}, mergeRequest int, discussion string, note int, opt *gitlab.UpdateMergeRequestDiscussionNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error) - DeleteMergeRequestDiscussionNote(pid interface{}, mergeRequest int, discussion string, note int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) - AddMergeRequestDiscussionNote(pid interface{}, mergeRequest int, discussion string, opt *gitlab.AddMergeRequestDiscussionNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error) + GetMergeRequestDiffVersions(pid interface{}, mergeRequestIID int, opt *gitlab.GetMergeRequestDiffVersionsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.MergeRequestDiffVersion, *gitlab.Response, error) + ApproveMergeRequest(pid interface{}, mergeRequestIID int, opt *gitlab.ApproveMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequestApprovals, *gitlab.Response, error) + UnapproveMergeRequest(pid interface{}, mergeRequestIID int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) + ListMergeRequestDiscussions(pid interface{}, mergeRequestIID int, opt *gitlab.ListMergeRequestDiscussionsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Discussion, *gitlab.Response, error) + ResolveMergeRequestDiscussion(pid interface{}, mergeRequestIID int, discussion string, opt *gitlab.ResolveMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error) + CreateMergeRequestDiscussion(pid interface{}, mergeRequestIID int, opt *gitlab.CreateMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error) + UpdateMergeRequestDiscussionNote(pid interface{}, mergeRequestIID int, discussion string, note int, opt *gitlab.UpdateMergeRequestDiscussionNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error) + DeleteMergeRequestDiscussionNote(pid interface{}, mergeRequestIID int, discussion string, note int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) + AddMergeRequestDiscussionNote(pid interface{}, mergeRequestIID int, discussion string, opt *gitlab.AddMergeRequestDiscussionNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error) ListAllProjectMembers(pid interface{}, opt *gitlab.ListProjectMembersOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.ProjectMember, *gitlab.Response, error) RetryPipelineBuild(pid interface{}, pipeline int, options ...gitlab.RequestOptionFunc) (*gitlab.Pipeline, *gitlab.Response, error) ListPipelineJobs(pid interface{}, pipelineID int, opts *gitlab.ListJobsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Job, *gitlab.Response, error) GetTraceFile(pid interface{}, jobID int, options ...gitlab.RequestOptionFunc) (*bytes.Reader, *gitlab.Response, error) ListLabels(pid interface{}, opt *gitlab.ListLabelsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Label, *gitlab.Response, error) + ListMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID int, noteID int, opt *gitlab.ListAwardEmojiOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.AwardEmoji, *gitlab.Response, error) + CreateMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID int, noteID int, opt *gitlab.CreateAwardEmojiOptions, options ...gitlab.RequestOptionFunc) (*gitlab.AwardEmoji, *gitlab.Response, error) + DeleteMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID, noteID, awardID int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) + CurrentUser(options ...gitlab.RequestOptionFunc) (*gitlab.User, *gitlab.Response, error) } diff --git a/cmd/user.go b/cmd/user.go new file mode 100644 index 0000000..14b3fb7 --- /dev/null +++ b/cmd/user.go @@ -0,0 +1,47 @@ +package main + +import ( + "encoding/json" + "net/http" + + "github.com/xanzy/go-gitlab" +) + +type UserResponse struct { + SuccessResponse + User *gitlab.User `json:"user"` +} + +func (a *api) meHandler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + if r.Method != http.MethodGet { + w.Header().Set("Access-Control-Allow-Methods", http.MethodGet) + handleError(w, InvalidRequestError{}, "Expected GET", http.StatusMethodNotAllowed) + return + } + + user, res, err := a.client.CurrentUser() + + if err != nil { + handleError(w, err, "Failed to get current user", http.StatusInternalServerError) + return + } + + if res.StatusCode >= 300 { + handleError(w, err, "User API returned non-200 status", res.StatusCode) + return + } + + response := UserResponse{ + SuccessResponse: SuccessResponse{ + Message: "User fetched successfully", + Status: http.StatusOK, + }, + User: user, + } + + err = json.NewEncoder(w).Encode(response) + if err != nil { + handleError(w, err, "Could not encode response", http.StatusInternalServerError) + } +} diff --git a/config/emojis.json b/config/emojis.json new file mode 100644 index 0000000..36088ef --- /dev/null +++ b/config/emojis.json @@ -0,0 +1,10878 @@ +{ + "alien": { + "unicode": "1F47D", + "unicode_alternates": [], + "name": "extraterrestrial alien", + "shortname": ":alien:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "UFO", + "paul", + "alien", + "ufo", + "space", + "monster", + "scientology" + ], + "moji": "👽" + }, + "angel": { + "unicode": "1F47C", + "unicode_alternates": [], + "name": "baby angel", + "shortname": ":angel:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "baby", + "angel", + "halo", + "cupid", + "wings", + "heaven", + "jesus", + "people", + "diversity", + "omg" + ], + "moji": "👼" + }, + "angel_tone1": { + "unicode": "1F47C-1F3FB", + "unicode_alternates": [], + "name": "baby angel tone 1", + "shortname": ":angel_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "halo", + "cupid", + "heaven", + "wings", + "jesus" + ], + "moji": "👼🏻" + }, + "angel_tone2": { + "unicode": "1F47C-1F3FC", + "unicode_alternates": [], + "name": "baby angel tone 2", + "shortname": ":angel_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "halo", + "cupid", + "heaven", + "wings", + "jesus" + ], + "moji": "👼🏼" + }, + "angel_tone3": { + "unicode": "1F47C-1F3FD", + "unicode_alternates": [], + "name": "baby angel tone 3", + "shortname": ":angel_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "halo", + "cupid", + "heaven", + "wings", + "jesus" + ], + "moji": "👼🏽" + }, + "angel_tone4": { + "unicode": "1F47C-1F3FE", + "unicode_alternates": [], + "name": "baby angel tone 4", + "shortname": ":angel_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "halo", + "cupid", + "heaven", + "wings", + "jesus" + ], + "moji": "👼🏾" + }, + "angel_tone5": { + "unicode": "1F47C-1F3FF", + "unicode_alternates": [], + "name": "baby angel tone 5", + "shortname": ":angel_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "halo", + "cupid", + "heaven", + "wings", + "jesus" + ], + "moji": "👼🏿" + }, + "angry": { + "unicode": "1F620", + "unicode_alternates": [], + "name": "angry face", + "shortname": ":angry:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + ">:(", + ">:-(", + ":@" + ], + "keywords": [ + "angry", + "livid", + "mad", + "vexed", + "irritated", + "annoyed", + "face", + "frustrated", + "smiley", + "emotion" + ], + "moji": "😠" + }, + "anguished": { + "unicode": "1F627", + "unicode_alternates": [], + "name": "anguished face", + "shortname": ":anguished:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "nervous", + "stunned", + "pain", + "anguish", + "ouch", + "misery", + "distress", + "grief", + "sad", + "smiley", + "surprised", + "emotion" + ], + "moji": "😧" + }, + "astonished": { + "unicode": "1F632", + "unicode_alternates": [], + "name": "astonished face", + "shortname": ":astonished:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "xox", + "shocked", + "surprise", + "astonished", + "smiley", + "surprised", + "wow", + "emotion", + "omg" + ], + "moji": "😲" + }, + "athletic_shoe": { + "unicode": "1F45F", + "unicode_alternates": [], + "name": "athletic shoe", + "shortname": ":athletic_shoe:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "shoes", + "sports", + "fashion", + "shoe", + "accessories", + "boys night" + ], + "moji": "👟" + }, + "baby": { + "unicode": "1F476", + "unicode_alternates": [], + "name": "baby", + "shortname": ":baby:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "boy", + "child", + "infant", + "people", + "baby", + "diversity" + ], + "moji": "👶" + }, + "baby_tone1": { + "unicode": "1F476-1F3FB", + "unicode_alternates": [], + "name": "baby tone 1", + "shortname": ":baby_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "child", + "infant", + "toddler" + ], + "moji": "👶🏻" + }, + "baby_tone2": { + "unicode": "1F476-1F3FC", + "unicode_alternates": [], + "name": "baby tone 2", + "shortname": ":baby_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "child", + "infant", + "toddler" + ], + "moji": "👶🏼" + }, + "baby_tone3": { + "unicode": "1F476-1F3FD", + "unicode_alternates": [], + "name": "baby tone 3", + "shortname": ":baby_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "child", + "infant", + "toddler" + ], + "moji": "👶🏽" + }, + "baby_tone4": { + "unicode": "1F476-1F3FE", + "unicode_alternates": [], + "name": "baby tone 4", + "shortname": ":baby_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "child", + "infant", + "toddler" + ], + "moji": "👶🏾" + }, + "baby_tone5": { + "unicode": "1F476-1F3FF", + "unicode_alternates": [], + "name": "baby tone 5", + "shortname": ":baby_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "child", + "infant", + "toddler" + ], + "moji": "👶🏿" + }, + "bikini": { + "unicode": "1F459", + "unicode_alternates": [], + "name": "bikini", + "shortname": ":bikini:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "beach", + "fashion", + "female", + "girl", + "swimming", + "woman", + "women", + "sexy", + "vacation", + "tropical", + "swim" + ], + "moji": "👙" + }, + "blush": { + "unicode": "1F60A", + "unicode_alternates": [], + "name": "smiling face with smiling eyes", + "shortname": ":blush:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "crush", + "embarrassed", + "face", + "flushed", + "happy", + "shy", + "smile", + "smiling", + "smiley", + "emotion", + "good", + "beautiful" + ], + "moji": "😊" + }, + "boot": { + "unicode": "1F462", + "unicode_alternates": [], + "name": "womans boots", + "shortname": ":boot:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fashion", + "shoes", + "women", + "shoe", + "sexy", + "accessories" + ], + "moji": "👢" + }, + "bow": { + "unicode": "1F647", + "unicode_alternates": [], + "name": "person bowing deeply", + "shortname": ":bow:", + "category": "people", + "aliases": [ + ":bowing_man:" + ], + "aliases_ascii": [], + "keywords": [ + "boy", + "male", + "man", + "sorry", + "bow", + "respect", + "curtsy", + "bend", + "people", + "pray", + "diversity" + ], + "moji": "🙇" + }, + "bow_tone1": { + "unicode": "1F647-1F3FB", + "unicode_alternates": [], + "name": "person bowing deeply tone 1", + "shortname": ":bow_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "boy", + "male", + "man", + "sorry", + "bow", + "respect", + "bend" + ], + "moji": "🙇🏻" + }, + "bow_tone2": { + "unicode": "1F647-1F3FC", + "unicode_alternates": [], + "name": "person bowing deeply tone 2", + "shortname": ":bow_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "boy", + "male", + "man", + "sorry", + "bow", + "respect", + "bend" + ], + "moji": "🙇🏼" + }, + "bow_tone3": { + "unicode": "1F647-1F3FD", + "unicode_alternates": [], + "name": "person bowing deeply tone 3", + "shortname": ":bow_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "boy", + "male", + "man", + "sorry", + "bow", + "respect", + "bend" + ], + "moji": "🙇🏽" + }, + "bow_tone4": { + "unicode": "1F647-1F3FE", + "unicode_alternates": [], + "name": "person bowing deeply tone 4", + "shortname": ":bow_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "boy", + "male", + "man", + "sorry", + "bow", + "respect", + "bend" + ], + "moji": "🙇🏾" + }, + "bow_tone5": { + "unicode": "1F647-1F3FF", + "unicode_alternates": [], + "name": "person bowing deeply tone 5", + "shortname": ":bow_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "boy", + "male", + "man", + "sorry", + "bow", + "respect", + "bend" + ], + "moji": "🙇🏿" + }, + "boy": { + "unicode": "1F466", + "unicode_alternates": [], + "name": "boy", + "shortname": ":boy:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "guy", + "male", + "man", + "people", + "baby", + "diversity" + ], + "moji": "👦" + }, + "boy_tone1": { + "unicode": "1F466-1F3FB", + "unicode_alternates": [], + "name": "boy tone 1", + "shortname": ":boy_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "kid", + "child" + ], + "moji": "👦🏻" + }, + "boy_tone2": { + "unicode": "1F466-1F3FC", + "unicode_alternates": [], + "name": "boy tone 2", + "shortname": ":boy_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "kid", + "child" + ], + "moji": "👦🏼" + }, + "boy_tone3": { + "unicode": "1F466-1F3FD", + "unicode_alternates": [], + "name": "boy tone 3", + "shortname": ":boy_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "kid", + "child" + ], + "moji": "👦🏽" + }, + "boy_tone4": { + "unicode": "1F466-1F3FE", + "unicode_alternates": [], + "name": "boy tone 4", + "shortname": ":boy_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "kid", + "child" + ], + "moji": "👦🏾" + }, + "boy_tone5": { + "unicode": "1F466-1F3FF", + "unicode_alternates": [], + "name": "boy tone 5", + "shortname": ":boy_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "kid", + "child" + ], + "moji": "👦🏿" + }, + "bride_with_veil": { + "unicode": "1F470", + "unicode_alternates": [], + "name": "bride with veil", + "shortname": ":bride_with_veil:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "couple", + "marriage", + "wedding", + "bride", + "planning", + "veil", + "gown", + "dress", + "engagement", + "white", + "people", + "women", + "diversity" + ], + "moji": "👰" + }, + "bride_with_veil_tone1": { + "unicode": "1F470-1F3FB", + "unicode_alternates": [], + "name": "bride with veil tone 1", + "shortname": ":bride_with_veil_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "couple", + "marriage", + "wedding", + "planning", + "gown", + "dress", + "engagement", + "white" + ], + "moji": "👰🏻" + }, + "bride_with_veil_tone2": { + "unicode": "1F470-1F3FC", + "unicode_alternates": [], + "name": "bride with veil tone 2", + "shortname": ":bride_with_veil_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "couple", + "marriage", + "wedding", + "planning", + "gown", + "dress", + "engagement", + "white" + ], + "moji": "👰🏼" + }, + "bride_with_veil_tone3": { + "unicode": "1F470-1F3FD", + "unicode_alternates": [], + "name": "bride with veil tone 3", + "shortname": ":bride_with_veil_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "couple", + "marriage", + "wedding", + "planning", + "gown", + "dress", + "engagement", + "white" + ], + "moji": "👰🏽" + }, + "bride_with_veil_tone4": { + "unicode": "1F470-1F3FE", + "unicode_alternates": [], + "name": "bride with veil tone 4", + "shortname": ":bride_with_veil_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "couple", + "marriage", + "wedding", + "planning", + "gown", + "dress", + "engagement", + "white" + ], + "moji": "👰🏾" + }, + "bride_with_veil_tone5": { + "unicode": "1F470-1F3FF", + "unicode_alternates": [], + "name": "bride with veil tone 5", + "shortname": ":bride_with_veil_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "couple", + "marriage", + "wedding", + "planning", + "gown", + "dress", + "engagement", + "white" + ], + "moji": "👰🏿" + }, + "briefcase": { + "unicode": "1F4BC", + "unicode_alternates": [], + "name": "briefcase", + "shortname": ":briefcase:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "business", + "documents", + "work", + "bag", + "accessories", + "nutcase", + "job" + ], + "moji": "💼" + }, + "bust_in_silhouette": { + "unicode": "1F464", + "unicode_alternates": [], + "name": "bust in silhouette", + "shortname": ":bust_in_silhouette:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "human", + "man", + "person", + "user", + "silhouette", + "member", + "account", + "guest", + "icon", + "avatar", + "profile", + "me", + "myself", + "i", + "people" + ], + "moji": "👤" + }, + "busts_in_silhouette": { + "unicode": "1F465", + "unicode_alternates": [], + "name": "busts in silhouette", + "shortname": ":busts_in_silhouette:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "group", + "human", + "man", + "person", + "team", + "user", + "silhouette", + "silhouettes", + "people", + "members", + "accounts", + "relationship", + "shadow" + ], + "moji": "👥" + }, + "call_me": { + "unicode": "1F919", + "unicode_alternates": [], + "name": "call me hand", + "shortname": ":call_me:", + "category": "people", + "aliases": [ + ":call_me_hand:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤙" + }, + "call_me_tone1": { + "unicode": "1F919-1F3FB", + "unicode_alternates": [], + "name": "call me hand tone 1", + "shortname": ":call_me_tone1:", + "category": "people", + "aliases": [ + ":call_me_hand_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤙🏻" + }, + "call_me_tone2": { + "unicode": "1F919-1F3FC", + "unicode_alternates": [], + "name": "call me hand tone 2", + "shortname": ":call_me_tone2:", + "category": "people", + "aliases": [ + ":call_me_hand_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤙🏼" + }, + "call_me_tone3": { + "unicode": "1F919-1F3FD", + "unicode_alternates": [], + "name": "call me hand tone 3", + "shortname": ":call_me_tone3:", + "category": "people", + "aliases": [ + ":call_me_hand_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤙🏽" + }, + "call_me_tone4": { + "unicode": "1F919-1F3FE", + "unicode_alternates": [], + "name": "call me hand tone 4", + "shortname": ":call_me_tone4:", + "category": "people", + "aliases": [ + ":call_me_hand_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤙🏾" + }, + "call_me_tone5": { + "unicode": "1F919-1F3FF", + "unicode_alternates": [], + "name": "call me hand tone 5", + "shortname": ":call_me_tone5:", + "category": "people", + "aliases": [ + ":call_me_hand_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤙🏿" + }, + "clap": { + "unicode": "1F44F", + "unicode_alternates": [], + "name": "clapping hands sign", + "shortname": ":clap:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "applause", + "congrats", + "hands", + "praise", + "clapping", + "appreciation", + "approval", + "sound", + "encouragement", + "enthusiasm", + "body", + "win", + "diversity", + "good", + "beautiful" + ], + "moji": "👏" + }, + "clap_tone1": { + "unicode": "1F44F-1F3FB", + "unicode_alternates": [], + "name": "clapping hands sign tone 1", + "shortname": ":clap_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "applause", + "congrats", + "praise", + "clap", + "appreciation", + "approval", + "sound", + "encouragement", + "enthusiasm" + ], + "moji": "👏🏻" + }, + "clap_tone2": { + "unicode": "1F44F-1F3FC", + "unicode_alternates": [], + "name": "clapping hands sign tone 2", + "shortname": ":clap_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "applause", + "congrats", + "praise", + "clap", + "appreciation", + "approval", + "sound", + "encouragement", + "enthusiasm" + ], + "moji": "👏🏼" + }, + "clap_tone3": { + "unicode": "1F44F-1F3FD", + "unicode_alternates": [], + "name": "clapping hands sign tone 3", + "shortname": ":clap_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "applause", + "congrats", + "praise", + "clap", + "appreciation", + "approval", + "sound", + "encouragement", + "enthusiasm" + ], + "moji": "👏🏽" + }, + "clap_tone4": { + "unicode": "1F44F-1F3FE", + "unicode_alternates": [], + "name": "clapping hands sign tone 4", + "shortname": ":clap_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "applause", + "congrats", + "praise", + "clap", + "appreciation", + "approval", + "sound", + "encouragement", + "enthusiasm" + ], + "moji": "👏🏾" + }, + "clap_tone5": { + "unicode": "1F44F-1F3FF", + "unicode_alternates": [], + "name": "clapping hands sign tone 5", + "shortname": ":clap_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "applause", + "congrats", + "praise", + "clap", + "appreciation", + "approval", + "sound", + "encouragement", + "enthusiasm" + ], + "moji": "👏🏿" + }, + "closed_umbrella": { + "unicode": "1F302", + "unicode_alternates": [], + "name": "closed umbrella", + "shortname": ":closed_umbrella:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "drizzle", + "rain", + "weather", + "umbrella", + "closed", + "moisture", + "protection", + "sun", + "ultraviolet", + "uv", + "object", + "sky", + "accessories" + ], + "moji": "🌂" + }, + "clown": { + "unicode": "1F921", + "unicode_alternates": [], + "name": "clown face", + "shortname": ":clown:", + "category": "people", + "aliases": [ + ":clown_face:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤡" + }, + "cold_sweat": { + "unicode": "1F630", + "unicode_alternates": [], + "name": "face with open mouth and cold sweat", + "shortname": ":cold_sweat:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "nervous", + "sweat", + "exasperated", + "frustrated", + "smiley", + "emotion" + ], + "moji": "😰" + }, + "confounded": { + "unicode": "1F616", + "unicode_alternates": [], + "name": "confounded face", + "shortname": ":confounded:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "confused", + "face", + "sick", + "unwell", + "confound", + "amaze", + "perplex", + "puzzle", + "mystify", + "sad", + "smiley", + "angry", + "emotion" + ], + "moji": "😖" + }, + "confused": { + "unicode": "1F615", + "unicode_alternates": [], + "name": "confused face", + "shortname": ":confused:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + ">:\\", + ">:/", + ":-/", + ":-.", + ":/", + ":\\", + "=/", + "=\\", + ":L", + "=L" + ], + "keywords": [ + "confused", + "confuse", + "daze", + "perplex", + "puzzle", + "indifference", + "skeptical", + "undecided", + "uneasy", + "hesitant", + "smiley", + "surprised", + "emotion" + ], + "moji": "😕" + }, + "construction_worker": { + "unicode": "1F477", + "unicode_alternates": [], + "name": "construction worker", + "shortname": ":construction_worker:", + "category": "people", + "aliases": [ + ":construction_worker_man:" + ], + "aliases_ascii": [], + "keywords": [ + "human", + "male", + "man", + "wip", + "people", + "hat", + "men", + "diversity", + "job" + ], + "moji": "👷" + }, + "construction_worker_tone1": { + "unicode": "1F477-1F3FB", + "unicode_alternates": [], + "name": "construction worker tone 1", + "shortname": ":construction_worker_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "human", + "male", + "man", + "wip" + ], + "moji": "👷🏻" + }, + "construction_worker_tone2": { + "unicode": "1F477-1F3FC", + "unicode_alternates": [], + "name": "construction worker tone 2", + "shortname": ":construction_worker_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "human", + "male", + "man", + "wip" + ], + "moji": "👷🏼" + }, + "construction_worker_tone3": { + "unicode": "1F477-1F3FD", + "unicode_alternates": [], + "name": "construction worker tone 3", + "shortname": ":construction_worker_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "human", + "male", + "man", + "wip" + ], + "moji": "👷🏽" + }, + "construction_worker_tone4": { + "unicode": "1F477-1F3FE", + "unicode_alternates": [], + "name": "construction worker tone 4", + "shortname": ":construction_worker_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "human", + "male", + "man", + "wip" + ], + "moji": "👷🏾" + }, + "construction_worker_tone5": { + "unicode": "1F477-1F3FF", + "unicode_alternates": [], + "name": "construction worker tone 5", + "shortname": ":construction_worker_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "human", + "male", + "man", + "wip" + ], + "moji": "👷🏿" + }, + "cop": { + "unicode": "1F46E", + "unicode_alternates": [], + "name": "police officer", + "shortname": ":cop:", + "category": "people", + "aliases": [ + ":policeman:" + ], + "aliases_ascii": [], + "keywords": [ + "arrest", + "enforcement", + "law", + "man", + "police", + "people", + "hat", + "men", + "diversity", + "job", + "911" + ], + "moji": "👮" + }, + "cop_tone1": { + "unicode": "1F46E-1F3FB", + "unicode_alternates": [], + "name": "police officer tone 1", + "shortname": ":cop_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "arrest", + "enforcement", + "law", + "man", + "cop" + ], + "moji": "👮🏻" + }, + "cop_tone2": { + "unicode": "1F46E-1F3FC", + "unicode_alternates": [], + "name": "police officer tone 2", + "shortname": ":cop_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "arrest", + "enforcement", + "law", + "man", + "cop" + ], + "moji": "👮🏼" + }, + "cop_tone3": { + "unicode": "1F46E-1F3FD", + "unicode_alternates": [], + "name": "police officer tone 3", + "shortname": ":cop_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "arrest", + "enforcement", + "law", + "man", + "cop" + ], + "moji": "👮🏽" + }, + "cop_tone4": { + "unicode": "1F46E-1F3FE", + "unicode_alternates": [], + "name": "police officer tone 4", + "shortname": ":cop_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "arrest", + "enforcement", + "law", + "man", + "cop" + ], + "moji": "👮🏾" + }, + "cop_tone5": { + "unicode": "1F46E-1F3FF", + "unicode_alternates": [], + "name": "police officer tone 5", + "shortname": ":cop_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "arrest", + "enforcement", + "law", + "man", + "cop" + ], + "moji": "👮🏿" + }, + "couple": { + "unicode": "1F46B", + "unicode_alternates": [], + "name": "man and woman holding hands", + "shortname": ":couple:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "affection", + "date", + "dating", + "human", + "like", + "love", + "marriage", + "people", + "valentines", + "sex", + "creationism" + ], + "moji": "👫" + }, + "couple_mm": { + "unicode": "1F468-2764-1F468", + "unicode_alternates": [ + "1F468-200D-2764-FE0F-200D-1F468" + ], + "name": "couple (man,man)", + "shortname": ":couple_mm:", + "category": "people", + "aliases": [ + ":couple_with_heart_mm:", + ":couple_with_heart_man_man:" + ], + "aliases_ascii": [], + "keywords": [ + "affection", + "dating", + "human", + "like", + "love", + "marriage", + "valentines", + "people", + "gay", + "men", + "sex", + "lgbt" + ], + "moji": "👨‍❤️‍👨" + }, + "couple_with_heart": { + "unicode": "1F491", + "unicode_alternates": [], + "name": "couple with heart", + "shortname": ":couple_with_heart:", + "category": "people", + "aliases": [ + ":couple_with_heart_woman_man:" + ], + "aliases_ascii": [], + "keywords": [ + "affection", + "dating", + "human", + "like", + "love", + "marriage", + "valentines", + "people", + "sex" + ], + "moji": "💑" + }, + "couple_ww": { + "unicode": "1F469-2764-1F469", + "unicode_alternates": [ + "1F469-200D-2764-FE0F-200D-1F469" + ], + "name": "couple (woman,woman)", + "shortname": ":couple_ww:", + "category": "people", + "aliases": [ + ":couple_with_heart_ww:", + ":couple_with_heart_woman_woman:" + ], + "aliases_ascii": [], + "keywords": [ + "affection", + "dating", + "human", + "like", + "love", + "marriage", + "valentines", + "people", + "women", + "sex", + "lgbt" + ], + "moji": "👩‍❤️‍👩" + }, + "couplekiss": { + "unicode": "1F48F", + "unicode_alternates": [], + "name": "kiss", + "shortname": ":couplekiss:", + "category": "people", + "aliases": [ + ":couplekiss_man_woman:" + ], + "aliases_ascii": [], + "keywords": [ + "dating", + "like", + "love", + "marriage", + "valentines", + "people", + "sex" + ], + "moji": "💏" + }, + "cowboy": { + "unicode": "1F920", + "unicode_alternates": [], + "name": "face with cowboy hat", + "shortname": ":cowboy:", + "category": "people", + "aliases": [ + ":face_with_cowboy_hat:", + ":cowboy_hat_face:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤠" + }, + "crown": { + "unicode": "1F451", + "unicode_alternates": [], + "name": "crown", + "shortname": ":crown:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "king", + "kod", + "leader", + "royalty", + "object", + "gem", + "accessories" + ], + "moji": "👑" + }, + "cry": { + "unicode": "1F622", + "unicode_alternates": [], + "name": "crying face", + "shortname": ":cry:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + ":'(", + ":'-(", + ";(", + ";-(" + ], + "keywords": [ + "face", + "sad", + "cry", + "tear", + "weep", + "tears", + "smiley", + "emotion", + "rip", + "heartbreak" + ], + "moji": "😢" + }, + "crying_cat_face": { + "unicode": "1F63F", + "unicode_alternates": [], + "name": "crying cat face", + "shortname": ":crying_cat_face:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "cats", + "sad", + "tears", + "weep", + "cry", + "cat", + "sob", + "melancholy", + "morn", + "somber", + "hurt" + ], + "moji": "😿" + }, + "dancer": { + "unicode": "1F483", + "unicode_alternates": [], + "name": "dancer", + "shortname": ":dancer:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "fun", + "girl", + "woman", + "dance", + "dancer", + "dress", + "fancy", + "boogy", + "party", + "celebrate", + "ballet", + "tango", + "cha cha", + "music", + "people", + "women", + "sexy", + "diversity", + "girls night" + ], + "moji": "💃" + }, + "dancer_tone1": { + "unicode": "1F483-1F3FB", + "unicode_alternates": [], + "name": "dancer tone 1", + "shortname": ":dancer_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "fun", + "girl", + "woman", + "dress", + "fancy", + "boogy", + "party", + "celebrate", + "ballet", + "tango", + "cha cha", + "music" + ], + "moji": "💃🏻" + }, + "dancer_tone2": { + "unicode": "1F483-1F3FC", + "unicode_alternates": [], + "name": "dancer tone 2", + "shortname": ":dancer_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "fun", + "girl", + "woman", + "dress", + "fancy", + "boogy", + "party", + "celebrate", + "ballet", + "tango", + "cha cha", + "music" + ], + "moji": "💃🏼" + }, + "dancer_tone3": { + "unicode": "1F483-1F3FD", + "unicode_alternates": [], + "name": "dancer tone 3", + "shortname": ":dancer_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "fun", + "girl", + "woman", + "dress", + "fancy", + "boogy", + "party", + "celebrate", + "ballet", + "tango", + "cha cha", + "music" + ], + "moji": "💃🏽" + }, + "dancer_tone4": { + "unicode": "1F483-1F3FE", + "unicode_alternates": [], + "name": "dancer tone 4", + "shortname": ":dancer_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "fun", + "girl", + "woman", + "dress", + "fancy", + "boogy", + "party", + "celebrate", + "ballet", + "tango", + "cha cha", + "music" + ], + "moji": "💃🏾" + }, + "dancer_tone5": { + "unicode": "1F483-1F3FF", + "unicode_alternates": [], + "name": "dancer tone 5", + "shortname": ":dancer_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "fun", + "girl", + "woman", + "dress", + "fancy", + "boogy", + "party", + "celebrate", + "ballet", + "tango", + "cha cha", + "music" + ], + "moji": "💃🏿" + }, + "dancers": { + "unicode": "1F46F", + "unicode_alternates": [], + "name": "woman with bunny ears", + "shortname": ":dancers:", + "category": "people", + "aliases": [ + ":dancing_women:" + ], + "aliases_ascii": [], + "keywords": [ + "bunny", + "female", + "girls", + "women", + "dancing", + "dancers", + "showgirl", + "playboy", + "costume", + "cancan", + "people", + "sexy", + "girls night", + "boys night", + "parties", + "dance" + ], + "moji": "👯" + }, + "dark_sunglasses": { + "unicode": "1F576", + "unicode_alternates": [], + "name": "dark sunglasses", + "shortname": ":dark_sunglasses:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "shades", + "eyes", + "fashion", + "glasses", + "accessories" + ], + "moji": "🕶" + }, + "disappointed": { + "unicode": "1F61E", + "unicode_alternates": [], + "name": "disappointed face", + "shortname": ":disappointed:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + ">:[", + ":-(", + ":(", + ":-[", + ":[", + "=(" + ], + "keywords": [ + "disappointed", + "disappoint", + "frown", + "depressed", + "discouraged", + "face", + "sad", + "upset", + "smiley", + "tired", + "emotion" + ], + "moji": "😞" + }, + "disappointed_relieved": { + "unicode": "1F625", + "unicode_alternates": [], + "name": "disappointed but relieved face", + "shortname": ":disappointed_relieved:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "nervous", + "phew", + "sweat", + "disappoint", + "relief", + "sad", + "smiley", + "stressed", + "cry", + "emotion" + ], + "moji": "😥" + }, + "dizzy_face": { + "unicode": "1F635", + "unicode_alternates": [], + "name": "dizzy face", + "shortname": ":dizzy_face:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + "#-)", + "#)", + "%-)", + "%)", + "X)", + "X-)" + ], + "keywords": [ + "dizzy", + "drunk", + "inebriated", + "face", + "spent", + "unconscious", + "xox", + "smiley", + "surprised", + "dead", + "wow", + "emotion", + "omg" + ], + "moji": "😵" + }, + "dress": { + "unicode": "1F457", + "unicode_alternates": [], + "name": "dress", + "shortname": ":dress:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "clothes", + "fashion", + "women", + "sexy", + "girls night" + ], + "moji": "👗" + }, + "drooling_face": { + "unicode": "1F924", + "unicode_alternates": [], + "name": "drooling face", + "shortname": ":drooling_face:", + "category": "people", + "aliases": [ + ":drool:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤤" + }, + "ear": { + "unicode": "1F442", + "unicode_alternates": [], + "name": "ear", + "shortname": ":ear:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "hear", + "listen", + "sound", + "body", + "diversity" + ], + "moji": "👂" + }, + "ear_tone1": { + "unicode": "1F442-1F3FB", + "unicode_alternates": [], + "name": "ear tone 1", + "shortname": ":ear_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "hear", + "listen", + "sound" + ], + "moji": "👂🏻" + }, + "ear_tone2": { + "unicode": "1F442-1F3FC", + "unicode_alternates": [], + "name": "ear tone 2", + "shortname": ":ear_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "hear", + "listen", + "sound" + ], + "moji": "👂🏼" + }, + "ear_tone3": { + "unicode": "1F442-1F3FD", + "unicode_alternates": [], + "name": "ear tone 3", + "shortname": ":ear_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "hear", + "listen", + "sound" + ], + "moji": "👂🏽" + }, + "ear_tone4": { + "unicode": "1F442-1F3FE", + "unicode_alternates": [], + "name": "ear tone 4", + "shortname": ":ear_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "hear", + "listen", + "sound" + ], + "moji": "👂🏾" + }, + "ear_tone5": { + "unicode": "1F442-1F3FF", + "unicode_alternates": [], + "name": "ear tone 5", + "shortname": ":ear_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "hear", + "listen", + "sound" + ], + "moji": "👂🏿" + }, + "expressionless": { + "unicode": "1F611", + "unicode_alternates": [], + "name": "expressionless face", + "shortname": ":expressionless:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + "-_-", + "-__-", + "-___-" + ], + "keywords": [ + "expressionless", + "blank", + "void", + "vapid", + "without expression", + "face", + "indifferent", + "mad", + "smiley", + "neutral", + "emotion" + ], + "moji": "😑" + }, + "eye": { + "unicode": "1F441", + "unicode_alternates": [], + "name": "eye", + "shortname": ":eye:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "look", + "peek", + "watch", + "body", + "eyes" + ], + "moji": "👁" + }, + "eyeglasses": { + "unicode": "1F453", + "unicode_alternates": [], + "name": "eyeglasses", + "shortname": ":eyeglasses:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "accessories", + "eyesight", + "fashion", + "eyeglasses", + "spectacles", + "eye", + "sight", + "nearsightedness", + "myopia", + "farsightedness", + "hyperopia", + "frames", + "vision", + "see", + "blurry", + "contacts", + "glasses" + ], + "moji": "👓" + }, + "eyes": { + "unicode": "1F440", + "unicode_alternates": [], + "name": "eyes", + "shortname": ":eyes:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "look", + "peek", + "stalk", + "watch", + "body", + "eyes" + ], + "moji": "👀" + }, + "face_palm": { + "unicode": "1F926", + "unicode_alternates": [], + "name": "face palm", + "shortname": ":face_palm:", + "category": "people", + "aliases": [ + ":facepalm:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤦" + }, + "face_palm_tone1": { + "unicode": "1F926-1F3FB", + "unicode_alternates": [], + "name": "face palm tone 1", + "shortname": ":face_palm_tone1:", + "category": "people", + "aliases": [ + ":facepalm_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤦🏻" + }, + "face_palm_tone2": { + "unicode": "1F926-1F3FC", + "unicode_alternates": [], + "name": "face palm tone 2", + "shortname": ":face_palm_tone2:", + "category": "people", + "aliases": [ + ":facepalm_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤦🏼" + }, + "face_palm_tone3": { + "unicode": "1F926-1F3FD", + "unicode_alternates": [], + "name": "face palm tone 3", + "shortname": ":face_palm_tone3:", + "category": "people", + "aliases": [ + ":facepalm_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤦🏽" + }, + "face_palm_tone4": { + "unicode": "1F926-1F3FE", + "unicode_alternates": [], + "name": "face palm tone 4", + "shortname": ":face_palm_tone4:", + "category": "people", + "aliases": [ + ":facepalm_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤦🏾" + }, + "face_palm_tone5": { + "unicode": "1F926-1F3FF", + "unicode_alternates": [], + "name": "face palm tone 5", + "shortname": ":face_palm_tone5:", + "category": "people", + "aliases": [ + ":facepalm_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤦🏿" + }, + "family": { + "unicode": "1F46A", + "unicode_alternates": [], + "name": "family", + "shortname": ":family:", + "category": "people", + "aliases": [ + ":family_man_woman_boy:" + ], + "aliases_ascii": [], + "keywords": [ + "child", + "dad", + "father", + "home", + "mom", + "mother", + "parents", + "family", + "girl", + "boy", + "group", + "unit", + "people", + "baby" + ], + "moji": "👪" + }, + "family_mmb": { + "unicode": "1F468-1F468-1F466", + "unicode_alternates": [ + "1F468-200D-1F468-200D-1F466" + ], + "name": "family (man,man,boy)", + "shortname": ":family_mmb:", + "category": "people", + "aliases": [ + ":family_man_man_boy:" + ], + "aliases_ascii": [], + "keywords": [ + "child", + "dad", + "father", + "parents", + "group", + "unit", + "gay", + "homosexual", + "man", + "boy", + "people", + "family", + "men", + "baby", + "lgbt" + ], + "moji": "👨‍👨‍👦" + }, + "family_mmbb": { + "unicode": "1F468-1F468-1F466-1F466", + "unicode_alternates": [ + "1F468-200D-1F468-200D-1F466-200D-1F466" + ], + "name": "family (man,man,boy,boy)", + "shortname": ":family_mmbb:", + "category": "people", + "aliases": [ + ":family_man_man_boy_boy:" + ], + "aliases_ascii": [], + "keywords": [ + "children", + "dad", + "father", + "parents", + "group", + "unit", + "gay", + "homosexual", + "man", + "boy", + "people", + "family", + "men", + "baby", + "lgbt" + ], + "moji": "👨‍👨‍👦‍👦" + }, + "family_mmg": { + "unicode": "1F468-1F468-1F467", + "unicode_alternates": [ + "1F468-200D-1F468-200D-1F467" + ], + "name": "family (man,man,girl)", + "shortname": ":family_mmg:", + "category": "people", + "aliases": [ + ":family_man_man_girl:" + ], + "aliases_ascii": [], + "keywords": [ + "child", + "dad", + "father", + "parents", + "group", + "unit", + "gay", + "homosexual", + "man", + "girl", + "people", + "family", + "men", + "baby", + "lgbt" + ], + "moji": "👨‍👨‍👧" + }, + "family_mmgb": { + "unicode": "1F468-1F468-1F467-1F466", + "unicode_alternates": [ + "1F468-200D-1F468-200D-1F467-200D-1F466" + ], + "name": "family (man,man,girl,boy)", + "shortname": ":family_mmgb:", + "category": "people", + "aliases": [ + ":family_man_man_girl_boy:" + ], + "aliases_ascii": [], + "keywords": [ + "children", + "dad", + "father", + "parents", + "group", + "unit", + "gay", + "homosexual", + "man", + "girl", + "boy", + "people", + "family", + "men", + "baby", + "lgbt" + ], + "moji": "👨‍👨‍👧‍👦" + }, + "family_mmgg": { + "unicode": "1F468-1F468-1F467-1F467", + "unicode_alternates": [ + "1F468-200D-1F468-200D-1F467-200D-1F467" + ], + "name": "family (man,man,girl,girl)", + "shortname": ":family_mmgg:", + "category": "people", + "aliases": [ + ":family_man_man_girl_girl:" + ], + "aliases_ascii": [], + "keywords": [ + "children", + "dad", + "father", + "parents", + "group", + "unit", + "gay", + "homosexual", + "man", + "girl", + "people", + "family", + "men", + "baby", + "lgbt" + ], + "moji": "👨‍👨‍👧‍👧" + }, + "family_mwbb": { + "unicode": "1F468-1F469-1F466-1F466", + "unicode_alternates": [ + "1F468-200D-1F469-200D-1F466-200D-1F466" + ], + "name": "family (man,woman,boy,boy)", + "shortname": ":family_mwbb:", + "category": "people", + "aliases": [ + ":family_man_woman_boy_boy:" + ], + "aliases_ascii": [], + "keywords": [ + "dad", + "father", + "mom", + "mother", + "parents", + "children", + "boy", + "group", + "unit", + "man", + "woman", + "people", + "family", + "baby" + ], + "moji": "👨‍👩‍👦‍👦" + }, + "family_mwg": { + "unicode": "1F468-1F469-1F467", + "unicode_alternates": [ + "1F468-200D-1F469-200D-1F467" + ], + "name": "family (man,woman,girl)", + "shortname": ":family_mwg:", + "category": "people", + "aliases": [ + ":family_man_woman_girl:" + ], + "aliases_ascii": [], + "keywords": [ + "child", + "dad", + "father", + "mom", + "mother", + "parents", + "girl", + "boy", + "group", + "unit", + "man", + "woman", + "people", + "family", + "baby" + ], + "moji": "👨‍👩‍👧" + }, + "family_mwgb": { + "unicode": "1F468-1F469-1F467-1F466", + "unicode_alternates": [ + "1F468-200D-1F469-200D-1F467-200D-1F466" + ], + "name": "family (man,woman,girl,boy)", + "shortname": ":family_mwgb:", + "category": "people", + "aliases": [ + ":family_man_woman_girl_boy:" + ], + "aliases_ascii": [], + "keywords": [ + "dad", + "father", + "mom", + "mother", + "parents", + "children", + "girl", + "boy", + "group", + "unit", + "man", + "woman", + "people", + "family", + "baby" + ], + "moji": "👨‍👩‍👧‍👦" + }, + "family_mwgg": { + "unicode": "1F468-1F469-1F467-1F467", + "unicode_alternates": [ + "1F468-200D-1F469-200D-1F467-200D-1F467" + ], + "name": "family (man,woman,girl,girl)", + "shortname": ":family_mwgg:", + "category": "people", + "aliases": [ + ":family_man_woman_girl_girl:" + ], + "aliases_ascii": [], + "keywords": [ + "dad", + "father", + "mom", + "mother", + "parents", + "children", + "girl", + "group", + "unit", + "man", + "woman", + "people", + "family", + "baby" + ], + "moji": "👨‍👩‍👧‍👧" + }, + "family_wwb": { + "unicode": "1F469-1F469-1F466", + "unicode_alternates": [ + "1F469-200D-1F469-200D-1F466" + ], + "name": "family (woman,woman,boy)", + "shortname": ":family_wwb:", + "category": "people", + "aliases": [ + ":family_woman_woman_boy:" + ], + "aliases_ascii": [], + "keywords": [ + "mom", + "mother", + "parents", + "child", + "boy", + "group", + "unit", + "gay", + "lesbian", + "homosexual", + "woman", + "people", + "family", + "women", + "baby", + "lgbt" + ], + "moji": "👩‍👩‍👦" + }, + "family_wwbb": { + "unicode": "1F469-1F469-1F466-1F466", + "unicode_alternates": [ + "1F469-200D-1F469-200D-1F466-200D-1F466" + ], + "name": "family (woman,woman,boy,boy)", + "shortname": ":family_wwbb:", + "category": "people", + "aliases": [ + ":family_woman_woman_boy_boy:" + ], + "aliases_ascii": [], + "keywords": [ + "mom", + "mother", + "parents", + "children", + "group", + "unit", + "gay", + "lesbian", + "homosexual", + "woman", + "boy", + "people", + "family", + "women", + "baby", + "lgbt" + ], + "moji": "👩‍👩‍👦‍👦" + }, + "family_wwg": { + "unicode": "1F469-1F469-1F467", + "unicode_alternates": [ + "1F469-200D-1F469-200D-1F467" + ], + "name": "family (woman,woman,girl)", + "shortname": ":family_wwg:", + "category": "people", + "aliases": [ + ":family_woman_woman_girl:" + ], + "aliases_ascii": [], + "keywords": [ + "mom", + "mother", + "parents", + "child", + "woman", + "girl", + "group", + "unit", + "gay", + "lesbian", + "homosexual", + "people", + "family", + "women", + "baby", + "lgbt" + ], + "moji": "👩‍👩‍👧" + }, + "family_wwgb": { + "unicode": "1F469-1F469-1F467-1F466", + "unicode_alternates": [ + "1F469-200D-1F469-200D-1F467-200D-1F466" + ], + "name": "family (woman,woman,girl,boy)", + "shortname": ":family_wwgb:", + "category": "people", + "aliases": [ + ":family_woman_woman_girl_boy:" + ], + "aliases_ascii": [], + "keywords": [ + "mom", + "mother", + "parents", + "children", + "group", + "unit", + "gay", + "lesbian", + "homosexual", + "woman", + "girl", + "boy", + "people", + "family", + "women", + "baby", + "lgbt" + ], + "moji": "👩‍👩‍👧‍👦" + }, + "family_wwgg": { + "unicode": "1F469-1F469-1F467-1F467", + "unicode_alternates": [ + "1F469-200D-1F469-200D-1F467-200D-1F467" + ], + "name": "family (woman,woman,girl,girl)", + "shortname": ":family_wwgg:", + "category": "people", + "aliases": [ + ":family_woman_woman_girl_girl:" + ], + "aliases_ascii": [], + "keywords": [ + "mom", + "mother", + "parents", + "children", + "group", + "unit", + "gay", + "lesbian", + "homosexual", + "woman", + "girl", + "people", + "family", + "women", + "baby", + "lgbt" + ], + "moji": "👩‍👩‍👧‍👧" + }, + "fearful": { + "unicode": "1F628", + "unicode_alternates": [], + "name": "fearful face", + "shortname": ":fearful:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "nervous", + "oops", + "scared", + "terrified", + "fear", + "fearful", + "frightened", + "smiley", + "surprised", + "emotion" + ], + "moji": "😨" + }, + "fingers_crossed": { + "unicode": "1F91E", + "unicode_alternates": [], + "name": "hand with first and index finger crossed", + "shortname": ":fingers_crossed:", + "category": "people", + "aliases": [ + ":hand_with_index_and_middle_finger_crossed:", + ":crossed_fingers:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤞" + }, + "fingers_crossed_tone1": { + "unicode": "1F91E-1F3FB", + "unicode_alternates": [], + "name": "hand with index and middle fingers crossed tone 1", + "shortname": ":fingers_crossed_tone1:", + "category": "people", + "aliases": [ + ":hand_with_index_and_middle_fingers_crossed_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤞🏻" + }, + "fingers_crossed_tone2": { + "unicode": "1F91E-1F3FC", + "unicode_alternates": [], + "name": "hand with index and middle fingers crossed tone 2", + "shortname": ":fingers_crossed_tone2:", + "category": "people", + "aliases": [ + ":hand_with_index_and_middle_fingers_crossed_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤞🏼" + }, + "fingers_crossed_tone3": { + "unicode": "1F91E-1F3FD", + "unicode_alternates": [], + "name": "hand with index and middle fingers crossed tone 3", + "shortname": ":fingers_crossed_tone3:", + "category": "people", + "aliases": [ + ":hand_with_index_and_middle_fingers_crossed_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤞🏽" + }, + "fingers_crossed_tone4": { + "unicode": "1F91E-1F3FE", + "unicode_alternates": [], + "name": "hand with index and middle fingers crossed tone 4", + "shortname": ":fingers_crossed_tone4:", + "category": "people", + "aliases": [ + ":hand_with_index_and_middle_fingers_crossed_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤞🏾" + }, + "fingers_crossed_tone5": { + "unicode": "1F91E-1F3FF", + "unicode_alternates": [], + "name": "hand with index and middle fingers crossed tone 5", + "shortname": ":fingers_crossed_tone5:", + "category": "people", + "aliases": [ + ":hand_with_index_and_middle_fingers_crossed_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤞🏿" + }, + "fist": { + "unicode": "270A", + "unicode_alternates": [], + "name": "raised fist", + "shortname": ":fist:", + "category": "people", + "aliases": [ + ":fist_raised:" + ], + "aliases_ascii": [], + "keywords": [ + "fingers", + "grasp", + "hand", + "body", + "hands", + "hi", + "fist bump", + "diversity", + "condolence" + ], + "moji": "✊" + }, + "fist_tone1": { + "unicode": "270A-1F3FB", + "unicode_alternates": [], + "name": "raised fist tone 1", + "shortname": ":fist_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fingers", + "grasp", + "hand" + ], + "moji": "✊🏻" + }, + "fist_tone2": { + "unicode": "270A-1F3FC", + "unicode_alternates": [], + "name": "raised fist tone 2", + "shortname": ":fist_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fingers", + "grasp", + "hand" + ], + "moji": "✊🏼" + }, + "fist_tone3": { + "unicode": "270A-1F3FD", + "unicode_alternates": [], + "name": "raised fist tone 3", + "shortname": ":fist_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fingers", + "grasp", + "hand" + ], + "moji": "✊🏽" + }, + "fist_tone4": { + "unicode": "270A-1F3FE", + "unicode_alternates": [], + "name": "raised fist tone 4", + "shortname": ":fist_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fingers", + "grasp", + "hand" + ], + "moji": "✊🏾" + }, + "fist_tone5": { + "unicode": "270A-1F3FF", + "unicode_alternates": [], + "name": "raised fist tone 5", + "shortname": ":fist_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fingers", + "grasp", + "hand" + ], + "moji": "✊🏿" + }, + "flushed": { + "unicode": "1F633", + "unicode_alternates": [], + "name": "flushed face", + "shortname": ":flushed:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + ":$", + "=$" + ], + "keywords": [ + "blush", + "face", + "flattered", + "flush", + "red", + "pink", + "cheeks", + "shy", + "smiley", + "emotion", + "omg" + ], + "moji": "😳" + }, + "footprints": { + "unicode": "1F463", + "unicode_alternates": [], + "name": "footprints", + "shortname": ":footprints:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "feet" + ], + "moji": "👣" + }, + "frowning": { + "unicode": "1F626", + "unicode_alternates": [], + "name": "frowning face with open mouth", + "shortname": ":frowning:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "aw", + "face", + "frown", + "sad", + "pout", + "sulk", + "glower", + "smiley", + "surprised", + "emotion" + ], + "moji": "😦" + }, + "frowning2": { + "unicode": "2639", + "unicode_alternates": [], + "name": "white frowning face", + "shortname": ":frowning2:", + "category": "people", + "aliases": [ + ":white_frowning_face:" + ], + "aliases_ascii": [], + "keywords": [ + "frown", + "person", + "sad", + "smiley", + "emotion" + ], + "moji": "☹" + }, + "ghost": { + "unicode": "1F47B", + "unicode_alternates": [], + "name": "ghost", + "shortname": ":ghost:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "halloween", + "holidays", + "monster" + ], + "moji": "👻" + }, + "girl": { + "unicode": "1F467", + "unicode_alternates": [], + "name": "girl", + "shortname": ":girl:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "woman", + "people", + "women", + "baby", + "diversity" + ], + "moji": "👧" + }, + "girl_tone1": { + "unicode": "1F467-1F3FB", + "unicode_alternates": [], + "name": "girl tone 1", + "shortname": ":girl_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "kid", + "child" + ], + "moji": "👧🏻" + }, + "girl_tone2": { + "unicode": "1F467-1F3FC", + "unicode_alternates": [], + "name": "girl tone 2", + "shortname": ":girl_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "kid", + "child" + ], + "moji": "👧🏼" + }, + "girl_tone3": { + "unicode": "1F467-1F3FD", + "unicode_alternates": [], + "name": "girl tone 3", + "shortname": ":girl_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "kid", + "child" + ], + "moji": "👧🏽" + }, + "girl_tone4": { + "unicode": "1F467-1F3FE", + "unicode_alternates": [], + "name": "girl tone 4", + "shortname": ":girl_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "kid", + "child" + ], + "moji": "👧🏾" + }, + "girl_tone5": { + "unicode": "1F467-1F3FF", + "unicode_alternates": [], + "name": "girl tone 5", + "shortname": ":girl_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "kid", + "child" + ], + "moji": "👧🏿" + }, + "grimacing": { + "unicode": "1F62C", + "unicode_alternates": [], + "name": "grimacing face", + "shortname": ":grimacing:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "grimace", + "teeth", + "disapprove", + "pain", + "silly", + "smiley", + "emotion", + "selfie" + ], + "moji": "😬" + }, + "grin": { + "unicode": "1F601", + "unicode_alternates": [], + "name": "grinning face with smiling eyes", + "shortname": ":grin:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "happy", + "joy", + "smile", + "grin", + "grinning", + "smiling", + "smiley", + "silly", + "emotion", + "good", + "selfie" + ], + "moji": "😁" + }, + "grinning": { + "unicode": "1F600", + "unicode_alternates": [], + "name": "grinning face", + "shortname": ":grinning:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "happy", + "joy", + "smile", + "grin", + "grinning", + "smiling", + "smiley", + "emotion" + ], + "moji": "😀" + }, + "guardsman": { + "unicode": "1F482", + "unicode_alternates": [], + "name": "guardsman", + "shortname": ":guardsman:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "british", + "gb", + "male", + "man", + "uk", + "guardsman", + "guard", + "bearskin", + "hat", + "queen", + "ceremonial", + "military", + "people", + "men", + "diversity", + "job" + ], + "moji": "💂" + }, + "guardsman_tone1": { + "unicode": "1F482-1F3FB", + "unicode_alternates": [], + "name": "guardsman tone 1", + "shortname": ":guardsman_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "british", + "gb", + "male", + "man", + "uk", + "guard", + "bearskin", + "hat", + "queen", + "ceremonial", + "military" + ], + "moji": "💂🏻" + }, + "guardsman_tone2": { + "unicode": "1F482-1F3FC", + "unicode_alternates": [], + "name": "guardsman tone 2", + "shortname": ":guardsman_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "british", + "gb", + "male", + "man", + "uk", + "guard", + "bearskin", + "hat", + "queen", + "ceremonial", + "military" + ], + "moji": "💂🏼" + }, + "guardsman_tone3": { + "unicode": "1F482-1F3FD", + "unicode_alternates": [], + "name": "guardsman tone 3", + "shortname": ":guardsman_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "british", + "gb", + "male", + "man", + "uk", + "guard", + "bearskin", + "hat", + "queen", + "ceremonial", + "military" + ], + "moji": "💂🏽" + }, + "guardsman_tone4": { + "unicode": "1F482-1F3FE", + "unicode_alternates": [], + "name": "guardsman tone 4", + "shortname": ":guardsman_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "british", + "gb", + "male", + "man", + "uk", + "guard", + "bearskin", + "hat", + "queen", + "ceremonial", + "military" + ], + "moji": "💂🏾" + }, + "guardsman_tone5": { + "unicode": "1F482-1F3FF", + "unicode_alternates": [], + "name": "guardsman tone 5", + "shortname": ":guardsman_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "british", + "gb", + "male", + "man", + "uk", + "guard", + "bearskin", + "hat", + "queen", + "ceremonial", + "military" + ], + "moji": "💂🏿" + }, + "haircut": { + "unicode": "1F487", + "unicode_alternates": [], + "name": "haircut", + "shortname": ":haircut:", + "category": "people", + "aliases": [ + ":haircut_woman:" + ], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "people", + "women", + "diversity" + ], + "moji": "💇" + }, + "haircut_tone1": { + "unicode": "1F487-1F3FB", + "unicode_alternates": [], + "name": "haircut tone 1", + "shortname": ":haircut_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman" + ], + "moji": "💇🏻" + }, + "haircut_tone2": { + "unicode": "1F487-1F3FC", + "unicode_alternates": [], + "name": "haircut tone 2", + "shortname": ":haircut_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman" + ], + "moji": "💇🏼" + }, + "haircut_tone3": { + "unicode": "1F487-1F3FD", + "unicode_alternates": [], + "name": "haircut tone 3", + "shortname": ":haircut_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman" + ], + "moji": "💇🏽" + }, + "haircut_tone4": { + "unicode": "1F487-1F3FE", + "unicode_alternates": [], + "name": "haircut tone 4", + "shortname": ":haircut_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman" + ], + "moji": "💇🏾" + }, + "haircut_tone5": { + "unicode": "1F487-1F3FF", + "unicode_alternates": [], + "name": "haircut tone 5", + "shortname": ":haircut_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman" + ], + "moji": "💇🏿" + }, + "hand_splayed": { + "unicode": "1F590", + "unicode_alternates": [], + "name": "raised hand with fingers splayed", + "shortname": ":hand_splayed:", + "category": "people", + "aliases": [ + ":raised_hand_with_fingers_splayed:" + ], + "aliases_ascii": [], + "keywords": [ + "hi", + "five", + "stop", + "halt", + "body", + "hands", + "diversity" + ], + "moji": "🖐" + }, + "hand_splayed_tone1": { + "unicode": "1F590-1F3FB", + "unicode_alternates": [], + "name": "raised hand with fingers splayed tone 1", + "shortname": ":hand_splayed_tone1:", + "category": "people", + "aliases": [ + ":raised_hand_with_fingers_splayed_tone1:" + ], + "aliases_ascii": [], + "keywords": [ + "hi", + "five", + "stop", + "halt" + ], + "moji": "🖐🏻" + }, + "hand_splayed_tone2": { + "unicode": "1F590-1F3FC", + "unicode_alternates": [], + "name": "raised hand with fingers splayed tone 2", + "shortname": ":hand_splayed_tone2:", + "category": "people", + "aliases": [ + ":raised_hand_with_fingers_splayed_tone2:" + ], + "aliases_ascii": [], + "keywords": [ + "hi", + "five", + "stop", + "halt" + ], + "moji": "🖐🏼" + }, + "hand_splayed_tone3": { + "unicode": "1F590-1F3FD", + "unicode_alternates": [], + "name": "raised hand with fingers splayed tone 3", + "shortname": ":hand_splayed_tone3:", + "category": "people", + "aliases": [ + ":raised_hand_with_fingers_splayed_tone3:" + ], + "aliases_ascii": [], + "keywords": [ + "hi", + "five", + "stop", + "halt" + ], + "moji": "🖐🏽" + }, + "hand_splayed_tone4": { + "unicode": "1F590-1F3FE", + "unicode_alternates": [], + "name": "raised hand with fingers splayed tone 4", + "shortname": ":hand_splayed_tone4:", + "category": "people", + "aliases": [ + ":raised_hand_with_fingers_splayed_tone4:" + ], + "aliases_ascii": [], + "keywords": [ + "hi", + "five", + "stop", + "halt" + ], + "moji": "🖐🏾" + }, + "hand_splayed_tone5": { + "unicode": "1F590-1F3FF", + "unicode_alternates": [], + "name": "raised hand with fingers splayed tone 5", + "shortname": ":hand_splayed_tone5:", + "category": "people", + "aliases": [ + ":raised_hand_with_fingers_splayed_tone5:" + ], + "aliases_ascii": [], + "keywords": [ + "hi", + "five", + "stop", + "halt" + ], + "moji": "🖐🏿" + }, + "handbag": { + "unicode": "1F45C", + "unicode_alternates": [], + "name": "handbag", + "shortname": ":handbag:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "accessories", + "accessory", + "bag", + "fashion", + "women", + "vacation" + ], + "moji": "👜" + }, + "handshake": { + "unicode": "1F91D", + "unicode_alternates": [], + "name": "handshake", + "shortname": ":handshake:", + "category": "people", + "aliases": [ + ":shaking_hands:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤝" + }, + "head_bandage": { + "unicode": "1F915", + "unicode_alternates": [], + "name": "face with head-bandage", + "shortname": ":head_bandage:", + "category": "people", + "aliases": [ + ":face_with_head_bandage:" + ], + "aliases_ascii": [], + "keywords": [ + "smiley", + "health", + "sick", + "emotion" + ], + "moji": "🤕" + }, + "heart_eyes": { + "unicode": "1F60D", + "unicode_alternates": [], + "name": "smiling face with heart-shaped eyes", + "shortname": ":heart_eyes:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "affection", + "crush", + "face", + "infatuation", + "like", + "love", + "valentines", + "smiling", + "heart", + "lovestruck", + "flirt", + "smile", + "heart-shaped", + "happy", + "smiley", + "sex", + "heart eyes", + "emotion", + "beautiful" + ], + "moji": "😍" + }, + "heart_eyes_cat": { + "unicode": "1F63B", + "unicode_alternates": [], + "name": "smiling cat face with heart-shaped eyes", + "shortname": ":heart_eyes_cat:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "affection", + "animal", + "cats", + "like", + "love", + "valentines", + "lovestruck", + "heart", + "heart eyes", + "cat", + "beautiful" + ], + "moji": "😻" + }, + "helmet_with_cross": { + "unicode": "26D1", + "unicode_alternates": [], + "name": "helmet with white cross", + "shortname": ":helmet_with_cross:", + "category": "people", + "aliases": [ + ":helmet_with_white_cross:", + ":rescue_worker_helmet:" + ], + "aliases_ascii": [], + "keywords": [ + "aid", + "face", + "hat", + "person", + "object", + "accessories", + "job" + ], + "moji": "⛑" + }, + "high_heel": { + "unicode": "1F460", + "unicode_alternates": [], + "name": "high-heeled shoe", + "shortname": ":high_heel:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fashion", + "female", + "shoes", + "women", + "shoe", + "sexy", + "accessories", + "girls night" + ], + "moji": "👠" + }, + "hugging": { + "unicode": "1F917", + "unicode_alternates": [], + "name": "hugging face", + "shortname": ":hugging:", + "category": "people", + "aliases": [ + ":hugging_face:", + ":hugs:" + ], + "aliases_ascii": [], + "keywords": [ + "smiley", + "hug", + "thank you" + ], + "moji": "🤗" + }, + "hushed": { + "unicode": "1F62F", + "unicode_alternates": [], + "name": "hushed face", + "shortname": ":hushed:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "woo", + "quiet", + "hush", + "whisper", + "silent", + "smiley", + "surprised", + "wow" + ], + "moji": "😯" + }, + "imp": { + "unicode": "1F47F", + "unicode_alternates": [], + "name": "imp", + "shortname": ":imp:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "angry", + "devil", + "evil", + "horns", + "cute", + "smiley", + "monster", + "wth" + ], + "moji": "👿" + }, + "information_desk_person": { + "unicode": "1F481", + "unicode_alternates": [], + "name": "information desk person", + "shortname": ":information_desk_person:", + "category": "people", + "aliases": [ + ":tipping_hand_woman:" + ], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "human", + "woman", + "information", + "help", + "question", + "answer", + "sassy", + "unimpressed", + "attitude", + "snarky", + "people", + "women", + "diversity" + ], + "moji": "💁" + }, + "information_desk_person_tone1": { + "unicode": "1F481-1F3FB", + "unicode_alternates": [], + "name": "information desk person tone 1", + "shortname": ":information_desk_person_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "human", + "woman", + "help", + "question", + "answer", + "sassy", + "unimpressed", + "attitude", + "snarky" + ], + "moji": "💁🏻" + }, + "information_desk_person_tone2": { + "unicode": "1F481-1F3FC", + "unicode_alternates": [], + "name": "information desk person tone 2", + "shortname": ":information_desk_person_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "human", + "woman", + "help", + "question", + "answer", + "sassy", + "unimpressed", + "attitude", + "snarky" + ], + "moji": "💁🏼" + }, + "information_desk_person_tone3": { + "unicode": "1F481-1F3FD", + "unicode_alternates": [], + "name": "information desk person tone 3", + "shortname": ":information_desk_person_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "human", + "woman", + "help", + "question", + "answer", + "sassy", + "unimpressed", + "attitude", + "snarky" + ], + "moji": "💁🏽" + }, + "information_desk_person_tone4": { + "unicode": "1F481-1F3FE", + "unicode_alternates": [], + "name": "information desk person tone 4", + "shortname": ":information_desk_person_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "human", + "woman", + "help", + "question", + "answer", + "sassy", + "unimpressed", + "attitude", + "snarky" + ], + "moji": "💁🏾" + }, + "information_desk_person_tone5": { + "unicode": "1F481-1F3FF", + "unicode_alternates": [], + "name": "information desk person tone 5", + "shortname": ":information_desk_person_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "human", + "woman", + "help", + "question", + "answer", + "sassy", + "unimpressed", + "attitude", + "snarky" + ], + "moji": "💁🏿" + }, + "innocent": { + "unicode": "1F607", + "unicode_alternates": [], + "name": "smiling face with halo", + "shortname": ":innocent:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + "O:-)", + "0:-3", + "0:3", + "0:-)", + "0:)", + "0;^)", + "O:)", + "O;-)", + "O=)", + "0;-)", + "O:-3", + "O:3" + ], + "keywords": [ + "angel", + "face", + "halo", + "innocent", + "ring", + "circle", + "heaven", + "smiley", + "emotion" + ], + "moji": "😇" + }, + "japanese_goblin": { + "unicode": "1F47A", + "unicode_alternates": [], + "name": "japanese goblin", + "shortname": ":japanese_goblin:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "evil", + "mask", + "red", + "japanese", + "tengu", + "supernatural", + "avian", + "demon", + "goblin", + "theater", + "nose", + "frown", + "mustache", + "anger", + "frustration", + "angry", + "monster" + ], + "moji": "👺" + }, + "japanese_ogre": { + "unicode": "1F479", + "unicode_alternates": [], + "name": "japanese ogre", + "shortname": ":japanese_ogre:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "monster", + "japanese", + "oni", + "demon", + "troll", + "ogre", + "folklore", + "devil", + "mask", + "theater", + "horns", + "teeth" + ], + "moji": "👹" + }, + "jeans": { + "unicode": "1F456", + "unicode_alternates": [], + "name": "jeans", + "shortname": ":jeans:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fashion", + "shopping", + "jeans", + "pants", + "blue", + "denim", + "levi's", + "levi", + "designer", + "work", + "skinny" + ], + "moji": "👖" + }, + "joy": { + "unicode": "1F602", + "unicode_alternates": [], + "name": "face with tears of joy", + "shortname": ":joy:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + ":')", + ":'-)" + ], + "keywords": [ + "cry", + "face", + "haha", + "happy", + "tears", + "joy", + "weep", + "silly", + "smiley", + "laugh", + "emotion", + "sarcastic" + ], + "moji": "😂" + }, + "joy_cat": { + "unicode": "1F639", + "unicode_alternates": [], + "name": "cat face with tears of joy", + "shortname": ":joy_cat:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "cats", + "haha", + "happy", + "tears", + "cry", + "joy", + "silly", + "laugh", + "cat", + "sarcastic" + ], + "moji": "😹" + }, + "kimono": { + "unicode": "1F458", + "unicode_alternates": [], + "name": "kimono", + "shortname": ":kimono:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "dress", + "fashion", + "female", + "japanese", + "women" + ], + "moji": "👘" + }, + "kiss": { + "unicode": "1F48B", + "unicode_alternates": [], + "name": "kiss mark", + "shortname": ":kiss:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "affection", + "face", + "like", + "lips", + "love", + "valentines", + "women", + "sexy", + "lip", + "beautiful", + "girls night" + ], + "moji": "💋" + }, + "kiss_mm": { + "unicode": "1F468-2764-1F48B-1F468", + "unicode_alternates": [ + "1F468-200D-2764-FE0F-200D-1F48B-200D-1F468" + ], + "name": "kiss (man,man)", + "shortname": ":kiss_mm:", + "category": "people", + "aliases": [ + ":couplekiss_mm:", + ":couplekiss_man_man:" + ], + "aliases_ascii": [], + "keywords": [ + "dating", + "like", + "love", + "marriage", + "valentines", + "couple", + "people", + "gay", + "men", + "sex", + "lgbt" + ], + "moji": "👨‍❤️‍💋‍👨" + }, + "kiss_ww": { + "unicode": "1F469-2764-1F48B-1F469", + "unicode_alternates": [ + "1F469-200D-2764-FE0F-200D-1F48B-200D-1F469" + ], + "name": "kiss (woman,woman)", + "shortname": ":kiss_ww:", + "category": "people", + "aliases": [ + ":couplekiss_ww:", + ":couplekiss_woman_woman:" + ], + "aliases_ascii": [], + "keywords": [ + "dating", + "like", + "love", + "marriage", + "valentines", + "couple", + "people", + "women", + "sex", + "lgbt", + "lesbian" + ], + "moji": "👩‍❤️‍💋‍👩" + }, + "kissing": { + "unicode": "1F617", + "unicode_alternates": [], + "name": "kissing face", + "shortname": ":kissing:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "3", + "face", + "infatuation", + "like", + "love", + "valentines", + "kissing", + "kiss", + "pucker", + "lips", + "smooch", + "smiley", + "sexy" + ], + "moji": "😗" + }, + "kissing_cat": { + "unicode": "1F63D", + "unicode_alternates": [], + "name": "kissing cat face with closed eyes", + "shortname": ":kissing_cat:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "cats", + "passion", + "kiss", + "puckered", + "heart", + "love", + "cat" + ], + "moji": "😽" + }, + "kissing_closed_eyes": { + "unicode": "1F61A", + "unicode_alternates": [], + "name": "kissing face with closed eyes", + "shortname": ":kissing_closed_eyes:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "affection", + "face", + "infatuation", + "like", + "love", + "valentines", + "kissing", + "kiss", + "passion", + "puckered", + "heart", + "smooch", + "smiley", + "sexy" + ], + "moji": "😚" + }, + "kissing_heart": { + "unicode": "1F618", + "unicode_alternates": [], + "name": "face throwing a kiss", + "shortname": ":kissing_heart:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + ":*", + ":-*", + "=*", + ":^*" + ], + "keywords": [ + "affection", + "face", + "infatuation", + "kiss", + "blowing kiss", + "heart", + "love", + "lips", + "like", + "valentines", + "smiley", + "sexy" + ], + "moji": "😘" + }, + "kissing_smiling_eyes": { + "unicode": "1F619", + "unicode_alternates": [], + "name": "kissing face with smiling eyes", + "shortname": ":kissing_smiling_eyes:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "affection", + "face", + "infatuation", + "valentines", + "kissing", + "kiss", + "smile", + "pucker", + "lips", + "smooch", + "smiley", + "sexy" + ], + "moji": "😙" + }, + "laughing": { + "unicode": "1F606", + "unicode_alternates": [], + "name": "smiling face with open mouth and tightly-closed ey", + "shortname": ":laughing:", + "category": "people", + "aliases": [ + ":satisfied:" + ], + "aliases_ascii": [ + ">:)", + ">;)", + ">:-)", + ">=)" + ], + "keywords": [ + "happy", + "joy", + "lol", + "smiling", + "laughing", + "laugh", + "smiley", + "emotion" + ], + "moji": "😆" + }, + "left_facing_fist": { + "unicode": "1F91B", + "unicode_alternates": [], + "name": "left-facing fist", + "shortname": ":left_facing_fist:", + "category": "people", + "aliases": [ + ":left_fist:", + ":fist_left:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤛" + }, + "left_facing_fist_tone1": { + "unicode": "1F91B-1F3FB", + "unicode_alternates": [], + "name": "left facing fist tone 1", + "shortname": ":left_facing_fist_tone1:", + "category": "people", + "aliases": [ + ":left_fist_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤛🏻" + }, + "left_facing_fist_tone2": { + "unicode": "1F91B-1F3FC", + "unicode_alternates": [], + "name": "left facing fist tone 2", + "shortname": ":left_facing_fist_tone2:", + "category": "people", + "aliases": [ + ":left_fist_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤛🏼" + }, + "left_facing_fist_tone3": { + "unicode": "1F91B-1F3FD", + "unicode_alternates": [], + "name": "left facing fist tone 3", + "shortname": ":left_facing_fist_tone3:", + "category": "people", + "aliases": [ + ":left_fist_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤛🏽" + }, + "left_facing_fist_tone4": { + "unicode": "1F91B-1F3FE", + "unicode_alternates": [], + "name": "left facing fist tone 4", + "shortname": ":left_facing_fist_tone4:", + "category": "people", + "aliases": [ + ":left_fist_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤛🏾" + }, + "left_facing_fist_tone5": { + "unicode": "1F91B-1F3FF", + "unicode_alternates": [], + "name": "left facing fist tone 5", + "shortname": ":left_facing_fist_tone5:", + "category": "people", + "aliases": [ + ":left_fist_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤛🏿" + }, + "lips": { + "unicode": "1F444", + "unicode_alternates": [], + "name": "mouth", + "shortname": ":lips:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "kiss", + "mouth", + "women", + "body", + "sexy", + "lip" + ], + "moji": "👄" + }, + "lipstick": { + "unicode": "1F484", + "unicode_alternates": [], + "name": "lipstick", + "shortname": ":lipstick:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fashion", + "female", + "girl", + "object", + "women", + "sexy", + "lip" + ], + "moji": "💄" + }, + "lying_face": { + "unicode": "1F925", + "unicode_alternates": [], + "name": "lying face", + "shortname": ":lying_face:", + "category": "people", + "aliases": [ + ":liar:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤥" + }, + "man": { + "unicode": "1F468", + "unicode_alternates": [], + "name": "man", + "shortname": ":man:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "classy", + "dad", + "father", + "guy", + "mustashe", + "people", + "men", + "sex", + "diversity", + "selfie", + "boys night" + ], + "moji": "👨" + }, + "man_dancing": { + "unicode": "1F57A", + "unicode_alternates": [], + "name": "man dancing", + "shortname": ":man_dancing:", + "category": "people", + "aliases": [ + ":male_dancer:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🕺" + }, + "man_in_tuxedo": { + "unicode": "1F935", + "unicode_alternates": [], + "name": "man in tuxedo", + "shortname": ":man_in_tuxedo:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤵" + }, + "man_in_tuxedo_tone1": { + "unicode": "1F935-1F3FB", + "unicode_alternates": [], + "name": "man in tuxedo tone 1", + "shortname": ":man_in_tuxedo_tone1:", + "category": "people", + "aliases": [ + ":tuxedo_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤵🏻" + }, + "man_in_tuxedo_tone2": { + "unicode": "1F935-1F3FC", + "unicode_alternates": [], + "name": "man in tuxedo tone 2", + "shortname": ":man_in_tuxedo_tone2:", + "category": "people", + "aliases": [ + ":tuxedo_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤵🏼" + }, + "man_in_tuxedo_tone3": { + "unicode": "1F935-1F3FD", + "unicode_alternates": [], + "name": "man in tuxedo tone 3", + "shortname": ":man_in_tuxedo_tone3:", + "category": "people", + "aliases": [ + ":tuxedo_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤵🏽" + }, + "man_in_tuxedo_tone4": { + "unicode": "1F935-1F3FE", + "unicode_alternates": [], + "name": "man in tuxedo tone 4", + "shortname": ":man_in_tuxedo_tone4:", + "category": "people", + "aliases": [ + ":tuxedo_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤵🏾" + }, + "man_in_tuxedo_tone5": { + "unicode": "1F935-1F3FF", + "unicode_alternates": [], + "name": "man in tuxedo tone 5", + "shortname": ":man_in_tuxedo_tone5:", + "category": "people", + "aliases": [ + ":tuxedo_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤵🏿" + }, + "man_tone1": { + "unicode": "1F468-1F3FB", + "unicode_alternates": [], + "name": "man tone 1", + "shortname": ":man_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "classy", + "dad", + "father", + "guy", + "mustache" + ], + "moji": "👨🏻" + }, + "man_tone2": { + "unicode": "1F468-1F3FC", + "unicode_alternates": [], + "name": "man tone 2", + "shortname": ":man_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "classy", + "dad", + "father", + "guy", + "mustache" + ], + "moji": "👨🏼" + }, + "man_tone3": { + "unicode": "1F468-1F3FD", + "unicode_alternates": [], + "name": "man tone 3", + "shortname": ":man_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "classy", + "dad", + "father", + "guy", + "mustache" + ], + "moji": "👨🏽" + }, + "man_tone4": { + "unicode": "1F468-1F3FE", + "unicode_alternates": [], + "name": "man tone 4", + "shortname": ":man_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "classy", + "dad", + "father", + "guy", + "mustache" + ], + "moji": "👨🏾" + }, + "man_tone5": { + "unicode": "1F468-1F3FF", + "unicode_alternates": [], + "name": "man tone 5", + "shortname": ":man_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "classy", + "dad", + "father", + "guy", + "mustache" + ], + "moji": "👨🏿" + }, + "man_with_gua_pi_mao": { + "unicode": "1F472", + "unicode_alternates": [], + "name": "man with gua pi mao", + "shortname": ":man_with_gua_pi_mao:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "boy", + "male", + "skullcap", + "chinese", + "asian", + "qing", + "people", + "hat", + "men", + "diversity" + ], + "moji": "👲" + }, + "man_with_gua_pi_mao_tone1": { + "unicode": "1F472-1F3FB", + "unicode_alternates": [], + "name": "man with gua pi mao tone 1", + "shortname": ":man_with_gua_pi_mao_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "boy", + "male", + "skullcap", + "chinese", + "asian", + "qing" + ], + "moji": "👲🏻" + }, + "man_with_gua_pi_mao_tone2": { + "unicode": "1F472-1F3FC", + "unicode_alternates": [], + "name": "man with gua pi mao tone 2", + "shortname": ":man_with_gua_pi_mao_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "boy", + "male", + "skullcap", + "chinese", + "asian", + "qing" + ], + "moji": "👲🏼" + }, + "man_with_gua_pi_mao_tone3": { + "unicode": "1F472-1F3FD", + "unicode_alternates": [], + "name": "man with gua pi mao tone 3", + "shortname": ":man_with_gua_pi_mao_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "boy", + "male", + "skullcap", + "chinese", + "asian", + "qing" + ], + "moji": "👲🏽" + }, + "man_with_gua_pi_mao_tone4": { + "unicode": "1F472-1F3FE", + "unicode_alternates": [], + "name": "man with gua pi mao tone 4", + "shortname": ":man_with_gua_pi_mao_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "boy", + "male", + "skullcap", + "chinese", + "asian", + "qing" + ], + "moji": "👲🏾" + }, + "man_with_gua_pi_mao_tone5": { + "unicode": "1F472-1F3FF", + "unicode_alternates": [], + "name": "man with gua pi mao tone 5", + "shortname": ":man_with_gua_pi_mao_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "boy", + "male", + "skullcap", + "chinese", + "asian", + "qing" + ], + "moji": "👲🏿" + }, + "man_with_turban": { + "unicode": "1F473", + "unicode_alternates": [], + "name": "man with turban", + "shortname": ":man_with_turban:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "turban", + "headdress", + "headwear", + "pagri", + "india", + "indian", + "mummy", + "wisdom", + "peace", + "people", + "hat", + "diversity" + ], + "moji": "👳" + }, + "man_with_turban_tone1": { + "unicode": "1F473-1F3FB", + "unicode_alternates": [], + "name": "man with turban tone 1", + "shortname": ":man_with_turban_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "headdress", + "headwear", + "pagri", + "india", + "indian", + "mummy", + "wisdom", + "peace" + ], + "moji": "👳🏻" + }, + "man_with_turban_tone2": { + "unicode": "1F473-1F3FC", + "unicode_alternates": [], + "name": "man with turban tone 2", + "shortname": ":man_with_turban_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "headdress", + "headwear", + "pagri", + "india", + "indian", + "mummy", + "wisdom", + "peace" + ], + "moji": "👳🏼" + }, + "man_with_turban_tone3": { + "unicode": "1F473-1F3FD", + "unicode_alternates": [], + "name": "man with turban tone 3", + "shortname": ":man_with_turban_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "headdress", + "headwear", + "pagri", + "india", + "indian", + "mummy", + "wisdom", + "peace" + ], + "moji": "👳🏽" + }, + "man_with_turban_tone4": { + "unicode": "1F473-1F3FE", + "unicode_alternates": [], + "name": "man with turban tone 4", + "shortname": ":man_with_turban_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "headdress", + "headwear", + "pagri", + "india", + "indian", + "mummy", + "wisdom", + "peace" + ], + "moji": "👳🏾" + }, + "man_with_turban_tone5": { + "unicode": "1F473-1F3FF", + "unicode_alternates": [], + "name": "man with turban tone 5", + "shortname": ":man_with_turban_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "headdress", + "headwear", + "pagri", + "india", + "indian", + "mummy", + "wisdom", + "peace" + ], + "moji": "👳🏿" + }, + "mans_shoe": { + "unicode": "1F45E", + "unicode_alternates": [], + "name": "mans shoe", + "shortname": ":mans_shoe:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fashion", + "male", + "shoe", + "accessories" + ], + "moji": "👞" + }, + "mask": { + "unicode": "1F637", + "unicode_alternates": [], + "name": "face with medical mask", + "shortname": ":mask:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "ill", + "sick", + "virus", + "flu", + "medical", + "mask", + "smiley", + "dead", + "health" + ], + "moji": "😷" + }, + "massage": { + "unicode": "1F486", + "unicode_alternates": [], + "name": "face massage", + "shortname": ":massage:", + "category": "people", + "aliases": [ + ":massage_woman:" + ], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "people", + "women", + "diversity" + ], + "moji": "💆" + }, + "massage_tone1": { + "unicode": "1F486-1F3FB", + "unicode_alternates": [], + "name": "face massage tone 1", + "shortname": ":massage_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman" + ], + "moji": "💆🏻" + }, + "massage_tone2": { + "unicode": "1F486-1F3FC", + "unicode_alternates": [], + "name": "face massage tone 2", + "shortname": ":massage_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman" + ], + "moji": "💆🏼" + }, + "massage_tone3": { + "unicode": "1F486-1F3FD", + "unicode_alternates": [], + "name": "face massage tone 3", + "shortname": ":massage_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman" + ], + "moji": "💆🏽" + }, + "massage_tone4": { + "unicode": "1F486-1F3FE", + "unicode_alternates": [], + "name": "face massage tone 4", + "shortname": ":massage_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman" + ], + "moji": "💆🏾" + }, + "massage_tone5": { + "unicode": "1F486-1F3FF", + "unicode_alternates": [], + "name": "face massage tone 5", + "shortname": ":massage_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman" + ], + "moji": "💆🏿" + }, + "metal": { + "unicode": "1F918", + "unicode_alternates": [], + "name": "sign of the horns", + "shortname": ":metal:", + "category": "people", + "aliases": [ + ":sign_of_the_horns:" + ], + "aliases_ascii": [], + "keywords": [ + "band", + "concert", + "fingers", + "rocknroll", + "body", + "hands", + "hi", + "diversity", + "boys night", + "parties" + ], + "moji": "🤘" + }, + "metal_tone1": { + "unicode": "1F918-1F3FB", + "unicode_alternates": [], + "name": "sign of the horns tone 1", + "shortname": ":metal_tone1:", + "category": "people", + "aliases": [ + ":sign_of_the_horns_tone1:" + ], + "aliases_ascii": [], + "keywords": [ + "band", + "concert", + "fingers", + "rocknroll" + ], + "moji": "🤘🏻" + }, + "metal_tone2": { + "unicode": "1F918-1F3FC", + "unicode_alternates": [], + "name": "sign of the horns tone 2", + "shortname": ":metal_tone2:", + "category": "people", + "aliases": [ + ":sign_of_the_horns_tone2:" + ], + "aliases_ascii": [], + "keywords": [ + "band", + "concert", + "fingers", + "rocknroll" + ], + "moji": "🤘🏼" + }, + "metal_tone3": { + "unicode": "1F918-1F3FD", + "unicode_alternates": [], + "name": "sign of the horns tone 3", + "shortname": ":metal_tone3:", + "category": "people", + "aliases": [ + ":sign_of_the_horns_tone3:" + ], + "aliases_ascii": [], + "keywords": [ + "band", + "concert", + "fingers", + "rocknroll" + ], + "moji": "🤘🏽" + }, + "metal_tone4": { + "unicode": "1F918-1F3FE", + "unicode_alternates": [], + "name": "sign of the horns tone 4", + "shortname": ":metal_tone4:", + "category": "people", + "aliases": [ + ":sign_of_the_horns_tone4:" + ], + "aliases_ascii": [], + "keywords": [ + "band", + "concert", + "fingers", + "rocknroll" + ], + "moji": "🤘🏾" + }, + "metal_tone5": { + "unicode": "1F918-1F3FF", + "unicode_alternates": [], + "name": "sign of the horns tone 5", + "shortname": ":metal_tone5:", + "category": "people", + "aliases": [ + ":sign_of_the_horns_tone5:" + ], + "aliases_ascii": [], + "keywords": [ + "band", + "concert", + "fingers", + "rocknroll" + ], + "moji": "🤘🏿" + }, + "middle_finger": { + "unicode": "1F595", + "unicode_alternates": [], + "name": "reversed hand with middle finger extended", + "shortname": ":middle_finger:", + "explicit": "true", + "category": "people", + "aliases": [ + ":reversed_hand_with_middle_finger_extended:" + ], + "aliases_ascii": [], + "keywords": [ + "fu", + "body", + "hands", + "middle finger", + "diversity" + ], + "moji": "🖕" + }, + "middle_finger_tone1": { + "unicode": "1F595-1F3FB", + "unicode_alternates": [], + "name": "reversed hand with middle finger extended tone 1", + "shortname": ":middle_finger_tone1:", + "category": "people", + "aliases": [ + ":reversed_hand_with_middle_finger_extended_tone1:" + ], + "aliases_ascii": [], + "keywords": [ + "fu" + ], + "moji": "🖕🏻" + }, + "middle_finger_tone2": { + "unicode": "1F595-1F3FC", + "unicode_alternates": [], + "name": "reversed hand with middle finger extended tone 2", + "shortname": ":middle_finger_tone2:", + "category": "people", + "aliases": [ + ":reversed_hand_with_middle_finger_extended_tone2:" + ], + "aliases_ascii": [], + "keywords": [ + "fu" + ], + "moji": "🖕🏼" + }, + "middle_finger_tone3": { + "unicode": "1F595-1F3FD", + "unicode_alternates": [], + "name": "reversed hand with middle finger extended tone 3", + "shortname": ":middle_finger_tone3:", + "category": "people", + "aliases": [ + ":reversed_hand_with_middle_finger_extended_tone3:" + ], + "aliases_ascii": [], + "keywords": [ + "fu" + ], + "moji": "🖕🏽" + }, + "middle_finger_tone4": { + "unicode": "1F595-1F3FE", + "unicode_alternates": [], + "name": "reversed hand with middle finger extended tone 4", + "shortname": ":middle_finger_tone4:", + "category": "people", + "aliases": [ + ":reversed_hand_with_middle_finger_extended_tone4:" + ], + "aliases_ascii": [], + "keywords": [ + "fu" + ], + "moji": "🖕🏾" + }, + "middle_finger_tone5": { + "unicode": "1F595-1F3FF", + "unicode_alternates": [], + "name": "reversed hand with middle finger extended tone 5", + "shortname": ":middle_finger_tone5:", + "category": "people", + "aliases": [ + ":reversed_hand_with_middle_finger_extended_tone5:" + ], + "aliases_ascii": [], + "keywords": [ + "fu" + ], + "moji": "🖕🏿" + }, + "money_mouth": { + "unicode": "1F911", + "unicode_alternates": [], + "name": "money-mouth face", + "shortname": ":money_mouth:", + "category": "people", + "aliases": [ + ":money_mouth_face:" + ], + "aliases_ascii": [], + "keywords": [ + "smiley", + "win", + "money", + "emotion", + "boys night" + ], + "moji": "🤑" + }, + "mortar_board": { + "unicode": "1F393", + "unicode_alternates": [], + "name": "graduation cap", + "shortname": ":mortar_board:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "cap", + "college", + "degree", + "graduation", + "hat", + "school", + "university", + "mortarboard", + "academic", + "education", + "ceremony", + "square", + "tassel", + "office", + "accessories" + ], + "moji": "🎓" + }, + "mrs_claus": { + "unicode": "1F936", + "unicode_alternates": [], + "name": "mother christmas", + "shortname": ":mrs_claus:", + "category": "people", + "aliases": [ + ":mother_christmas:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤶" + }, + "mrs_claus_tone1": { + "unicode": "1F936-1F3FB", + "unicode_alternates": [], + "name": "mother christmas tone 1", + "shortname": ":mrs_claus_tone1:", + "category": "people", + "aliases": [ + ":mother_christmas_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤶🏻" + }, + "mrs_claus_tone2": { + "unicode": "1F936-1F3FC", + "unicode_alternates": [], + "name": "mother christmas tone 2", + "shortname": ":mrs_claus_tone2:", + "category": "people", + "aliases": [ + ":mother_christmas_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤶🏼" + }, + "mrs_claus_tone3": { + "unicode": "1F936-1F3FD", + "unicode_alternates": [], + "name": "mother christmas tone 3", + "shortname": ":mrs_claus_tone3:", + "category": "people", + "aliases": [ + ":mother_christmas_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤶🏽" + }, + "mrs_claus_tone4": { + "unicode": "1F936-1F3FE", + "unicode_alternates": [], + "name": "mother christmas tone 4", + "shortname": ":mrs_claus_tone4:", + "category": "people", + "aliases": [ + ":mother_christmas_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤶🏾" + }, + "mrs_claus_tone5": { + "unicode": "1F936-1F3FF", + "unicode_alternates": [], + "name": "mother christmas tone 5", + "shortname": ":mrs_claus_tone5:", + "category": "people", + "aliases": [ + ":mother_christmas_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤶🏿" + }, + "muscle": { + "unicode": "1F4AA", + "unicode_alternates": [], + "name": "flexed biceps", + "shortname": ":muscle:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "arm", + "flex", + "hand", + "strong", + "muscle", + "bicep", + "body", + "hands", + "workout", + "win", + "diversity", + "feminist", + "boys night" + ], + "moji": "💪" + }, + "muscle_tone1": { + "unicode": "1F4AA-1F3FB", + "unicode_alternates": [], + "name": "flexed biceps tone 1", + "shortname": ":muscle_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "arm", + "flex", + "hand", + "strong", + "muscle", + "bicep" + ], + "moji": "💪🏻" + }, + "muscle_tone2": { + "unicode": "1F4AA-1F3FC", + "unicode_alternates": [], + "name": "flexed biceps tone 2", + "shortname": ":muscle_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "arm", + "flex", + "hand", + "strong", + "muscle", + "bicep" + ], + "moji": "💪🏼" + }, + "muscle_tone3": { + "unicode": "1F4AA-1F3FD", + "unicode_alternates": [], + "name": "flexed biceps tone 3", + "shortname": ":muscle_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "arm", + "flex", + "hand", + "strong", + "muscle", + "bicep" + ], + "moji": "💪🏽" + }, + "muscle_tone4": { + "unicode": "1F4AA-1F3FE", + "unicode_alternates": [], + "name": "flexed biceps tone 4", + "shortname": ":muscle_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "arm", + "flex", + "hand", + "strong", + "muscle", + "bicep" + ], + "moji": "💪🏾" + }, + "muscle_tone5": { + "unicode": "1F4AA-1F3FF", + "unicode_alternates": [], + "name": "flexed biceps tone 5", + "shortname": ":muscle_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "arm", + "flex", + "hand", + "strong", + "muscle", + "bicep" + ], + "moji": "💪🏿" + }, + "nail_care": { + "unicode": "1F485", + "unicode_alternates": [], + "name": "nail polish", + "shortname": ":nail_care:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "beauty", + "manicure", + "women", + "body", + "hands", + "nailpolish", + "diversity", + "girls night" + ], + "moji": "💅" + }, + "nail_care_tone1": { + "unicode": "1F485-1F3FB", + "unicode_alternates": [], + "name": "nail polish tone 1", + "shortname": ":nail_care_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "beauty", + "manicure" + ], + "moji": "💅🏻" + }, + "nail_care_tone2": { + "unicode": "1F485-1F3FC", + "unicode_alternates": [], + "name": "nail polish tone 2", + "shortname": ":nail_care_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "beauty", + "manicure" + ], + "moji": "💅🏼" + }, + "nail_care_tone3": { + "unicode": "1F485-1F3FD", + "unicode_alternates": [], + "name": "nail polish tone 3", + "shortname": ":nail_care_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "beauty", + "manicure" + ], + "moji": "💅🏽" + }, + "nail_care_tone4": { + "unicode": "1F485-1F3FE", + "unicode_alternates": [], + "name": "nail polish tone 4", + "shortname": ":nail_care_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "beauty", + "manicure" + ], + "moji": "💅🏾" + }, + "nail_care_tone5": { + "unicode": "1F485-1F3FF", + "unicode_alternates": [], + "name": "nail polish tone 5", + "shortname": ":nail_care_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "beauty", + "manicure" + ], + "moji": "💅🏿" + }, + "nauseated_face": { + "unicode": "1F922", + "unicode_alternates": [], + "name": "nauseated face", + "shortname": ":nauseated_face:", + "category": "people", + "aliases": [ + ":sick:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤢" + }, + "necktie": { + "unicode": "1F454", + "unicode_alternates": [], + "name": "necktie", + "shortname": ":necktie:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "cloth", + "fashion", + "formal", + "shirt", + "suitup" + ], + "moji": "👔" + }, + "nerd": { + "unicode": "1F913", + "unicode_alternates": [], + "name": "nerd face", + "shortname": ":nerd:", + "category": "people", + "aliases": [ + ":nerd_face:" + ], + "aliases_ascii": [], + "keywords": [ + "smiley", + "glasses" + ], + "moji": "🤓" + }, + "neutral_face": { + "unicode": "1F610", + "unicode_alternates": [], + "name": "neutral face", + "shortname": ":neutral_face:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "indifference", + "neutral", + "objective", + "impartial", + "blank", + "mad", + "smiley", + "shrug", + "emotion" + ], + "moji": "😐" + }, + "no_good": { + "unicode": "1F645", + "unicode_alternates": [], + "name": "face with no good gesture", + "shortname": ":no_good:", + "category": "people", + "aliases": [ + ":no_good_woman:" + ], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "no", + "stop", + "nope", + "don't", + "not", + "people", + "women", + "diversity", + "girls night" + ], + "moji": "🙅" + }, + "no_good_tone1": { + "unicode": "1F645-1F3FB", + "unicode_alternates": [], + "name": "face with no good gesture tone 1", + "shortname": ":no_good_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "stop", + "nope", + "don't", + "not", + "forbidden", + "hand", + "person", + "prohibited" + ], + "moji": "🙅🏻" + }, + "no_good_tone2": { + "unicode": "1F645-1F3FC", + "unicode_alternates": [], + "name": "face with no good gesture tone 2", + "shortname": ":no_good_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "stop", + "nope", + "don't", + "not", + "forbidden", + "hand", + "person", + "prohibited" + ], + "moji": "🙅🏼" + }, + "no_good_tone3": { + "unicode": "1F645-1F3FD", + "unicode_alternates": [], + "name": "face with no good gesture tone 3", + "shortname": ":no_good_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "stop", + "nope", + "don't", + "not", + "forbidden", + "hand", + "person", + "prohibited" + ], + "moji": "🙅🏽" + }, + "no_good_tone4": { + "unicode": "1F645-1F3FE", + "unicode_alternates": [], + "name": "face with no good gesture tone 4", + "shortname": ":no_good_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "stop", + "nope", + "don't", + "not", + "forbidden", + "hand", + "person", + "prohibited" + ], + "moji": "🙅🏾" + }, + "no_good_tone5": { + "unicode": "1F645-1F3FF", + "unicode_alternates": [], + "name": "face with no good gesture tone 5", + "shortname": ":no_good_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "stop", + "nope", + "don't", + "not", + "forbidden", + "hand", + "person", + "prohibited" + ], + "moji": "🙅🏿" + }, + "no_mouth": { + "unicode": "1F636", + "unicode_alternates": [], + "name": "face without mouth", + "shortname": ":no_mouth:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + ":-X", + ":X", + ":-#", + ":#", + "=X", + "=x", + ":x", + ":-x", + "=#" + ], + "keywords": [ + "face", + "hellokitty", + "mouth", + "silent", + "vapid", + "mad", + "smiley", + "neutral", + "emotion" + ], + "moji": "😶" + }, + "nose": { + "unicode": "1F443", + "unicode_alternates": [], + "name": "nose", + "shortname": ":nose:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "smell", + "sniff", + "body", + "diversity" + ], + "moji": "👃" + }, + "nose_tone1": { + "unicode": "1F443-1F3FB", + "unicode_alternates": [], + "name": "nose tone 1", + "shortname": ":nose_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "smell", + "sniff" + ], + "moji": "👃🏻" + }, + "nose_tone2": { + "unicode": "1F443-1F3FC", + "unicode_alternates": [], + "name": "nose tone 2", + "shortname": ":nose_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "smell", + "sniff" + ], + "moji": "👃🏼" + }, + "nose_tone3": { + "unicode": "1F443-1F3FD", + "unicode_alternates": [], + "name": "nose tone 3", + "shortname": ":nose_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "smell", + "sniff" + ], + "moji": "👃🏽" + }, + "nose_tone4": { + "unicode": "1F443-1F3FE", + "unicode_alternates": [], + "name": "nose tone 4", + "shortname": ":nose_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "smell", + "sniff" + ], + "moji": "👃🏾" + }, + "nose_tone5": { + "unicode": "1F443-1F3FF", + "unicode_alternates": [], + "name": "nose tone 5", + "shortname": ":nose_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "smell", + "sniff" + ], + "moji": "👃🏿" + }, + "ok_hand": { + "unicode": "1F44C", + "unicode_alternates": [], + "name": "ok hand sign", + "shortname": ":ok_hand:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fingers", + "limbs", + "perfect", + "okay", + "ok", + "smoke", + "smoking", + "marijuana", + "joint", + "pot", + "420", + "body", + "hands", + "hi", + "diversity", + "good", + "beautiful" + ], + "moji": "👌" + }, + "ok_hand_tone1": { + "unicode": "1F44C-1F3FB", + "unicode_alternates": [], + "name": "ok hand sign tone 1", + "shortname": ":ok_hand_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fingers", + "limbs", + "perfect", + "okay", + "smoke", + "smoking", + "marijuana", + "joint", + "pot", + "420" + ], + "moji": "👌🏻" + }, + "ok_hand_tone2": { + "unicode": "1F44C-1F3FC", + "unicode_alternates": [], + "name": "ok hand sign tone 2", + "shortname": ":ok_hand_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fingers", + "limbs", + "perfect", + "okay", + "smoke", + "smoking", + "marijuana", + "joint", + "pot", + "420" + ], + "moji": "👌🏼" + }, + "ok_hand_tone3": { + "unicode": "1F44C-1F3FD", + "unicode_alternates": [], + "name": "ok hand sign tone 3", + "shortname": ":ok_hand_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fingers", + "limbs", + "perfect", + "okay", + "smoke", + "smoking", + "marijuana", + "joint", + "pot", + "420" + ], + "moji": "👌🏽" + }, + "ok_hand_tone4": { + "unicode": "1F44C-1F3FE", + "unicode_alternates": [], + "name": "ok hand sign tone 4", + "shortname": ":ok_hand_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fingers", + "limbs", + "perfect", + "okay", + "smoke", + "smoking", + "marijuana", + "joint", + "pot", + "420" + ], + "moji": "👌🏾" + }, + "ok_hand_tone5": { + "unicode": "1F44C-1F3FF", + "unicode_alternates": [], + "name": "ok hand sign tone 5", + "shortname": ":ok_hand_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fingers", + "limbs", + "perfect", + "okay", + "smoke", + "smoking", + "marijuana", + "joint", + "pot", + "420" + ], + "moji": "👌🏿" + }, + "ok_woman": { + "unicode": "1F646", + "unicode_alternates": [], + "name": "face with ok gesture", + "shortname": ":ok_woman:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + "*\\0/*", + "\\0/", + "*\\O/*", + "\\O/" + ], + "keywords": [ + "female", + "girl", + "human", + "pink", + "women", + "yes", + "ok", + "okay", + "accept", + "people", + "diversity" + ], + "moji": "🙆" + }, + "ok_woman_tone1": { + "unicode": "1F646-1F3FB", + "unicode_alternates": [], + "name": "face with ok gesture tone1", + "shortname": ":ok_woman_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "human", + "pink", + "women", + "yes", + "okay", + "accept" + ], + "moji": "🙆🏻" + }, + "ok_woman_tone2": { + "unicode": "1F646-1F3FC", + "unicode_alternates": [], + "name": "face with ok gesture tone2", + "shortname": ":ok_woman_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "human", + "pink", + "women", + "yes", + "okay", + "accept" + ], + "moji": "🙆🏼" + }, + "ok_woman_tone3": { + "unicode": "1F646-1F3FD", + "unicode_alternates": [], + "name": "face with ok gesture tone3", + "shortname": ":ok_woman_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "human", + "pink", + "women", + "yes", + "okay", + "accept" + ], + "moji": "🙆🏽" + }, + "ok_woman_tone4": { + "unicode": "1F646-1F3FE", + "unicode_alternates": [], + "name": "face with ok gesture tone4", + "shortname": ":ok_woman_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "human", + "pink", + "women", + "yes", + "okay", + "accept" + ], + "moji": "🙆🏾" + }, + "ok_woman_tone5": { + "unicode": "1F646-1F3FF", + "unicode_alternates": [], + "name": "face with ok gesture tone5", + "shortname": ":ok_woman_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "human", + "pink", + "women", + "yes", + "okay", + "accept" + ], + "moji": "🙆🏿" + }, + "older_man": { + "unicode": "1F474", + "unicode_alternates": [], + "name": "older man", + "shortname": ":older_man:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "human", + "male", + "men", + "people", + "old people", + "diversity" + ], + "moji": "👴" + }, + "older_man_tone1": { + "unicode": "1F474-1F3FB", + "unicode_alternates": [], + "name": "older man tone 1", + "shortname": ":older_man_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "men", + "grandpa", + "grandfather" + ], + "moji": "👴🏻" + }, + "older_man_tone2": { + "unicode": "1F474-1F3FC", + "unicode_alternates": [], + "name": "older man tone 2", + "shortname": ":older_man_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "men", + "grandpa", + "grandfather" + ], + "moji": "👴🏼" + }, + "older_man_tone3": { + "unicode": "1F474-1F3FD", + "unicode_alternates": [], + "name": "older man tone 3", + "shortname": ":older_man_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "men", + "grandpa", + "grandfather" + ], + "moji": "👴🏽" + }, + "older_man_tone4": { + "unicode": "1F474-1F3FE", + "unicode_alternates": [], + "name": "older man tone 4", + "shortname": ":older_man_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "men", + "grandpa", + "grandfather" + ], + "moji": "👴🏾" + }, + "older_man_tone5": { + "unicode": "1F474-1F3FF", + "unicode_alternates": [], + "name": "older man tone 5", + "shortname": ":older_man_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "men", + "grandpa", + "grandfather" + ], + "moji": "👴🏿" + }, + "older_woman": { + "unicode": "1F475", + "unicode_alternates": [], + "name": "older woman", + "shortname": ":older_woman:", + "category": "people", + "aliases": [ + ":grandma:" + ], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "women", + "grandma", + "grandmother", + "people", + "old people", + "diversity" + ], + "moji": "👵" + }, + "older_woman_tone1": { + "unicode": "1F475-1F3FB", + "unicode_alternates": [], + "name": "older woman tone 1", + "shortname": ":older_woman_tone1:", + "category": "people", + "aliases": [ + ":grandma_tone1:" + ], + "aliases_ascii": [], + "keywords": [ + "female", + "women", + "lady", + "grandma", + "grandmother" + ], + "moji": "👵🏻" + }, + "older_woman_tone2": { + "unicode": "1F475-1F3FC", + "unicode_alternates": [], + "name": "older woman tone 2", + "shortname": ":older_woman_tone2:", + "category": "people", + "aliases": [ + ":grandma_tone2:" + ], + "aliases_ascii": [], + "keywords": [ + "female", + "women", + "lady", + "grandma", + "grandmother" + ], + "moji": "👵🏼" + }, + "older_woman_tone3": { + "unicode": "1F475-1F3FD", + "unicode_alternates": [], + "name": "older woman tone 3", + "shortname": ":older_woman_tone3:", + "category": "people", + "aliases": [ + ":grandma_tone3:" + ], + "aliases_ascii": [], + "keywords": [ + "female", + "women", + "lady", + "grandma", + "grandmother" + ], + "moji": "👵🏽" + }, + "older_woman_tone4": { + "unicode": "1F475-1F3FE", + "unicode_alternates": [], + "name": "older woman tone 4", + "shortname": ":older_woman_tone4:", + "category": "people", + "aliases": [ + ":grandma_tone4:" + ], + "aliases_ascii": [], + "keywords": [ + "female", + "women", + "lady", + "grandma", + "grandmother" + ], + "moji": "👵🏾" + }, + "older_woman_tone5": { + "unicode": "1F475-1F3FF", + "unicode_alternates": [], + "name": "older woman tone 5", + "shortname": ":older_woman_tone5:", + "category": "people", + "aliases": [ + ":grandma_tone5:" + ], + "aliases_ascii": [], + "keywords": [ + "female", + "women", + "lady", + "grandma", + "grandmother" + ], + "moji": "👵🏿" + }, + "open_hands": { + "unicode": "1F450", + "unicode_alternates": [], + "name": "open hands sign", + "shortname": ":open_hands:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "butterfly", + "fingers", + "body", + "hands", + "diversity", + "condolence" + ], + "moji": "👐" + }, + "open_hands_tone1": { + "unicode": "1F450-1F3FB", + "unicode_alternates": [], + "name": "open hands sign tone 1", + "shortname": ":open_hands_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "butterfly", + "fingers" + ], + "moji": "👐🏻" + }, + "open_hands_tone2": { + "unicode": "1F450-1F3FC", + "unicode_alternates": [], + "name": "open hands sign tone 2", + "shortname": ":open_hands_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "butterfly", + "fingers" + ], + "moji": "👐🏼" + }, + "open_hands_tone3": { + "unicode": "1F450-1F3FD", + "unicode_alternates": [], + "name": "open hands sign tone 3", + "shortname": ":open_hands_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "butterfly", + "fingers" + ], + "moji": "👐🏽" + }, + "open_hands_tone4": { + "unicode": "1F450-1F3FE", + "unicode_alternates": [], + "name": "open hands sign tone 4", + "shortname": ":open_hands_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "butterfly", + "fingers" + ], + "moji": "👐🏾" + }, + "open_hands_tone5": { + "unicode": "1F450-1F3FF", + "unicode_alternates": [], + "name": "open hands sign tone 5", + "shortname": ":open_hands_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "butterfly", + "fingers" + ], + "moji": "👐🏿" + }, + "open_mouth": { + "unicode": "1F62E", + "unicode_alternates": [], + "name": "face with open mouth", + "shortname": ":open_mouth:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + ":-O", + ":O", + ":-o", + ":o", + "O_O", + ">:O" + ], + "keywords": [ + "face", + "impressed", + "mouth", + "open", + "jaw", + "gapping", + "surprise", + "wow", + "smiley", + "surprised", + "emotion" + ], + "moji": "😮" + }, + "pensive": { + "unicode": "1F614", + "unicode_alternates": [], + "name": "pensive face", + "shortname": ":pensive:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "okay", + "sad", + "pensive", + "thoughtful", + "think", + "reflective", + "wistful", + "meditate", + "serious", + "smiley", + "emotion", + "rip" + ], + "moji": "😔" + }, + "persevere": { + "unicode": "1F623", + "unicode_alternates": [], + "name": "persevering face", + "shortname": ":persevere:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + ">.<" + ], + "keywords": [ + "endure", + "persevere", + "face", + "no", + "sick", + "upset", + "sad", + "smiley", + "angry", + "emotion" + ], + "moji": "😣" + }, + "person_frowning": { + "unicode": "1F64D", + "unicode_alternates": [], + "name": "person frowning", + "shortname": ":person_frowning:", + "category": "people", + "aliases": [ + ":frowning_woman:" + ], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "dejected", + "rejected", + "sad", + "frown", + "people", + "women", + "diversity" + ], + "moji": "🙍" + }, + "person_frowning_tone1": { + "unicode": "1F64D-1F3FB", + "unicode_alternates": [], + "name": "person frowning tone 1", + "shortname": ":person_frowning_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "dejected", + "rejected", + "sad", + "frown" + ], + "moji": "🙍🏻" + }, + "person_frowning_tone2": { + "unicode": "1F64D-1F3FC", + "unicode_alternates": [], + "name": "person frowning tone 2", + "shortname": ":person_frowning_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "dejected", + "rejected", + "sad", + "frown" + ], + "moji": "🙍🏼" + }, + "person_frowning_tone3": { + "unicode": "1F64D-1F3FD", + "unicode_alternates": [], + "name": "person frowning tone 3", + "shortname": ":person_frowning_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "dejected", + "rejected", + "sad", + "frown" + ], + "moji": "🙍🏽" + }, + "person_frowning_tone4": { + "unicode": "1F64D-1F3FE", + "unicode_alternates": [], + "name": "person frowning tone 4", + "shortname": ":person_frowning_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "dejected", + "rejected", + "sad", + "frown" + ], + "moji": "🙍🏾" + }, + "person_frowning_tone5": { + "unicode": "1F64D-1F3FF", + "unicode_alternates": [], + "name": "person frowning tone 5", + "shortname": ":person_frowning_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "dejected", + "rejected", + "sad", + "frown" + ], + "moji": "🙍🏿" + }, + "person_with_blond_hair": { + "unicode": "1F471", + "unicode_alternates": [], + "name": "person with blond hair", + "shortname": ":person_with_blond_hair:", + "category": "people", + "aliases": [ + ":blonde_man:" + ], + "aliases_ascii": [], + "keywords": [ + "male", + "man", + "blonde", + "young", + "western", + "westerner", + "occidental", + "people", + "men", + "diversity" + ], + "moji": "👱" + }, + "person_with_blond_hair_tone1": { + "unicode": "1F471-1F3FB", + "unicode_alternates": [], + "name": "person with blond hair tone 1", + "shortname": ":person_with_blond_hair_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "man", + "blonde", + "young", + "western", + "westerner", + "occidental" + ], + "moji": "👱🏻" + }, + "person_with_blond_hair_tone2": { + "unicode": "1F471-1F3FC", + "unicode_alternates": [], + "name": "person with blond hair tone 2", + "shortname": ":person_with_blond_hair_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "man", + "blonde", + "young", + "western", + "westerner", + "occidental" + ], + "moji": "👱🏼" + }, + "person_with_blond_hair_tone3": { + "unicode": "1F471-1F3FD", + "unicode_alternates": [], + "name": "person with blond hair tone 3", + "shortname": ":person_with_blond_hair_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "man", + "blonde", + "young", + "western", + "westerner", + "occidental" + ], + "moji": "👱🏽" + }, + "person_with_blond_hair_tone4": { + "unicode": "1F471-1F3FE", + "unicode_alternates": [], + "name": "person with blond hair tone 4", + "shortname": ":person_with_blond_hair_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "man", + "blonde", + "young", + "western", + "westerner", + "occidental" + ], + "moji": "👱🏾" + }, + "person_with_blond_hair_tone5": { + "unicode": "1F471-1F3FF", + "unicode_alternates": [], + "name": "person with blond hair tone 5", + "shortname": ":person_with_blond_hair_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "male", + "man", + "blonde", + "young", + "western", + "westerner", + "occidental" + ], + "moji": "👱🏿" + }, + "person_with_pouting_face": { + "unicode": "1F64E", + "unicode_alternates": [], + "name": "person with pouting face", + "shortname": ":person_with_pouting_face:", + "category": "people", + "aliases": [ + ":pouting_woman:" + ], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "pout", + "sexy", + "cute", + "annoyed", + "people", + "women", + "diversity" + ], + "moji": "🙎" + }, + "person_with_pouting_face_tone1": { + "unicode": "1F64E-1F3FB", + "unicode_alternates": [], + "name": "person with pouting face tone1", + "shortname": ":person_with_pouting_face_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "pout", + "sexy", + "cute", + "annoyed" + ], + "moji": "🙎🏻" + }, + "person_with_pouting_face_tone2": { + "unicode": "1F64E-1F3FC", + "unicode_alternates": [], + "name": "person with pouting face tone2", + "shortname": ":person_with_pouting_face_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "pout", + "sexy", + "cute", + "annoyed" + ], + "moji": "🙎🏼" + }, + "person_with_pouting_face_tone3": { + "unicode": "1F64E-1F3FD", + "unicode_alternates": [], + "name": "person with pouting face tone3", + "shortname": ":person_with_pouting_face_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "pout", + "sexy", + "cute", + "annoyed" + ], + "moji": "🙎🏽" + }, + "person_with_pouting_face_tone4": { + "unicode": "1F64E-1F3FE", + "unicode_alternates": [], + "name": "person with pouting face tone4", + "shortname": ":person_with_pouting_face_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "pout", + "sexy", + "cute", + "annoyed" + ], + "moji": "🙎🏾" + }, + "person_with_pouting_face_tone5": { + "unicode": "1F64E-1F3FF", + "unicode_alternates": [], + "name": "person with pouting face tone5", + "shortname": ":person_with_pouting_face_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "pout", + "sexy", + "cute", + "annoyed" + ], + "moji": "🙎🏿" + }, + "point_down": { + "unicode": "1F447", + "unicode_alternates": [], + "name": "white down pointing backhand index", + "shortname": ":point_down:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "fingers", + "hand", + "body", + "hands", + "diversity" + ], + "moji": "👇" + }, + "point_down_tone1": { + "unicode": "1F447-1F3FB", + "unicode_alternates": [], + "name": "white down pointing backhand index tone 1", + "shortname": ":point_down_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand" + ], + "moji": "👇🏻" + }, + "point_down_tone2": { + "unicode": "1F447-1F3FC", + "unicode_alternates": [], + "name": "white down pointing backhand index tone 2", + "shortname": ":point_down_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand" + ], + "moji": "👇🏼" + }, + "point_down_tone3": { + "unicode": "1F447-1F3FD", + "unicode_alternates": [], + "name": "white down pointing backhand index tone 3", + "shortname": ":point_down_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand" + ], + "moji": "👇🏽" + }, + "point_down_tone4": { + "unicode": "1F447-1F3FE", + "unicode_alternates": [], + "name": "white down pointing backhand index tone 4", + "shortname": ":point_down_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand" + ], + "moji": "👇🏾" + }, + "point_down_tone5": { + "unicode": "1F447-1F3FF", + "unicode_alternates": [], + "name": "white down pointing backhand index tone 5", + "shortname": ":point_down_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand" + ], + "moji": "👇🏿" + }, + "point_left": { + "unicode": "1F448", + "unicode_alternates": [], + "name": "white left pointing backhand index", + "shortname": ":point_left:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "fingers", + "hand", + "body", + "hands", + "hi", + "diversity" + ], + "moji": "👈" + }, + "point_left_tone1": { + "unicode": "1F448-1F3FB", + "unicode_alternates": [], + "name": "white left pointing backhand index tone 1", + "shortname": ":point_left_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand" + ], + "moji": "👈🏻" + }, + "point_left_tone2": { + "unicode": "1F448-1F3FC", + "unicode_alternates": [], + "name": "white left pointing backhand index tone 2", + "shortname": ":point_left_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand" + ], + "moji": "👈🏼" + }, + "point_left_tone3": { + "unicode": "1F448-1F3FD", + "unicode_alternates": [], + "name": "white left pointing backhand index tone 3", + "shortname": ":point_left_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand" + ], + "moji": "👈🏽" + }, + "point_left_tone4": { + "unicode": "1F448-1F3FE", + "unicode_alternates": [], + "name": "white left pointing backhand index tone 4", + "shortname": ":point_left_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand" + ], + "moji": "👈🏾" + }, + "point_left_tone5": { + "unicode": "1F448-1F3FF", + "unicode_alternates": [], + "name": "white left pointing backhand index tone 5", + "shortname": ":point_left_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand" + ], + "moji": "👈🏿" + }, + "point_right": { + "unicode": "1F449", + "unicode_alternates": [], + "name": "white right pointing backhand index", + "shortname": ":point_right:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "fingers", + "hand", + "body", + "hands", + "hi", + "diversity" + ], + "moji": "👉" + }, + "point_right_tone1": { + "unicode": "1F449-1F3FB", + "unicode_alternates": [], + "name": "white right pointing backhand index tone 1", + "shortname": ":point_right_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand" + ], + "moji": "👉🏻" + }, + "point_right_tone2": { + "unicode": "1F449-1F3FC", + "unicode_alternates": [], + "name": "white right pointing backhand index tone 2", + "shortname": ":point_right_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand" + ], + "moji": "👉🏼" + }, + "point_right_tone3": { + "unicode": "1F449-1F3FD", + "unicode_alternates": [], + "name": "white right pointing backhand index tone 3", + "shortname": ":point_right_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand" + ], + "moji": "👉🏽" + }, + "point_right_tone4": { + "unicode": "1F449-1F3FE", + "unicode_alternates": [], + "name": "white right pointing backhand index tone 4", + "shortname": ":point_right_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand" + ], + "moji": "👉🏾" + }, + "point_right_tone5": { + "unicode": "1F449-1F3FF", + "unicode_alternates": [], + "name": "white right pointing backhand index tone 5", + "shortname": ":point_right_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand" + ], + "moji": "👉🏿" + }, + "point_up": { + "unicode": "261D", + "unicode_alternates": [ + "261D-FE0F" + ], + "name": "white up pointing index", + "shortname": ":point_up:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "fingers", + "hand", + "body", + "hands", + "emojione", + "diversity" + ], + "moji": "☝" + }, + "point_up_2": { + "unicode": "1F446", + "unicode_alternates": [], + "name": "white up pointing backhand index", + "shortname": ":point_up_2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "fingers", + "hand", + "body", + "hands", + "diversity" + ], + "moji": "👆" + }, + "point_up_2_tone1": { + "unicode": "1F446-1F3FB", + "unicode_alternates": [], + "name": "white up pointing backhand index tone 1", + "shortname": ":point_up_2_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand", + "one" + ], + "moji": "👆🏻" + }, + "point_up_2_tone2": { + "unicode": "1F446-1F3FC", + "unicode_alternates": [], + "name": "white up pointing backhand index tone 2", + "shortname": ":point_up_2_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand", + "one" + ], + "moji": "👆🏼" + }, + "point_up_2_tone3": { + "unicode": "1F446-1F3FD", + "unicode_alternates": [], + "name": "white up pointing backhand index tone 3", + "shortname": ":point_up_2_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand", + "one" + ], + "moji": "👆🏽" + }, + "point_up_2_tone4": { + "unicode": "1F446-1F3FE", + "unicode_alternates": [], + "name": "white up pointing backhand index tone 4", + "shortname": ":point_up_2_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand", + "one" + ], + "moji": "👆🏾" + }, + "point_up_2_tone5": { + "unicode": "1F446-1F3FF", + "unicode_alternates": [], + "name": "white up pointing backhand index tone 5", + "shortname": ":point_up_2_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand", + "one" + ], + "moji": "👆🏿" + }, + "point_up_tone1": { + "unicode": "261D-1F3FB", + "unicode_alternates": [], + "name": "white up pointing index tone 1", + "shortname": ":point_up_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand", + "one" + ], + "moji": "☝🏻" + }, + "point_up_tone2": { + "unicode": "261D-1F3FC", + "unicode_alternates": [], + "name": "white up pointing index tone 2", + "shortname": ":point_up_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand", + "one" + ], + "moji": "☝🏼" + }, + "point_up_tone3": { + "unicode": "261D-1F3FD", + "unicode_alternates": [], + "name": "white up pointing index tone 3", + "shortname": ":point_up_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand", + "one" + ], + "moji": "☝🏽" + }, + "point_up_tone4": { + "unicode": "261D-1F3FE", + "unicode_alternates": [], + "name": "white up pointing index tone 4", + "shortname": ":point_up_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand", + "one" + ], + "moji": "☝🏾" + }, + "point_up_tone5": { + "unicode": "261D-1F3FF", + "unicode_alternates": [], + "name": "white up pointing index tone 5", + "shortname": ":point_up_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "direction", + "finger", + "hand", + "one" + ], + "moji": "☝🏿" + }, + "poop": { + "unicode": "1F4A9", + "unicode_alternates": [], + "name": "pile of poo", + "shortname": ":poop:", + "category": "people", + "aliases": [ + ":shit:", + ":hankey:", + ":poo:" + ], + "aliases_ascii": [], + "keywords": [ + "poop", + "shit", + "shitface", + "turd", + "poo", + "bathroom", + "sol", + "diarrhea" + ], + "moji": "💩" + }, + "pouch": { + "unicode": "1F45D", + "unicode_alternates": [], + "name": "pouch", + "shortname": ":pouch:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "accessories", + "bag", + "pouch", + "cosmetic", + "packing", + "grandma", + "makeup", + "women", + "fashion" + ], + "moji": "👝" + }, + "pouting_cat": { + "unicode": "1F63E", + "unicode_alternates": [], + "name": "pouting cat face", + "shortname": ":pouting_cat:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "cats", + "pout", + "annoyed", + "miffed", + "glower", + "frown", + "cat" + ], + "moji": "😾" + }, + "pray": { + "unicode": "1F64F", + "unicode_alternates": [], + "name": "person with folded hands", + "shortname": ":pray:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "highfive", + "hope", + "namaste", + "please", + "wish", + "pray", + "high five", + "hands", + "sorrow", + "regret", + "sorry", + "body", + "hi", + "luck", + "thank you", + "diversity", + "scientology" + ], + "moji": "🙏" + }, + "pray_tone1": { + "unicode": "1F64F-1F3FB", + "unicode_alternates": [], + "name": "person with folded hands tone 1", + "shortname": ":pray_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "highfive", + "hope", + "namaste", + "please", + "wish", + "pray", + "high five", + "sorrow", + "regret", + "sorry" + ], + "moji": "🙏🏻" + }, + "pray_tone2": { + "unicode": "1F64F-1F3FC", + "unicode_alternates": [], + "name": "person with folded hands tone 2", + "shortname": ":pray_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "highfive", + "hope", + "namaste", + "please", + "wish", + "pray", + "high five", + "sorrow", + "regret", + "sorry" + ], + "moji": "🙏🏼" + }, + "pray_tone3": { + "unicode": "1F64F-1F3FD", + "unicode_alternates": [], + "name": "person with folded hands tone 3", + "shortname": ":pray_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "highfive", + "hope", + "namaste", + "please", + "wish", + "pray", + "high five", + "sorrow", + "regret", + "sorry" + ], + "moji": "🙏🏽" + }, + "pray_tone4": { + "unicode": "1F64F-1F3FE", + "unicode_alternates": [], + "name": "person with folded hands tone 4", + "shortname": ":pray_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "highfive", + "hope", + "namaste", + "please", + "wish", + "pray", + "high five", + "sorrow", + "regret", + "sorry" + ], + "moji": "🙏🏾" + }, + "pray_tone5": { + "unicode": "1F64F-1F3FF", + "unicode_alternates": [], + "name": "person with folded hands tone 5", + "shortname": ":pray_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "highfive", + "hope", + "namaste", + "please", + "wish", + "pray", + "high five", + "sorrow", + "regret", + "sorry" + ], + "moji": "🙏🏿" + }, + "pregnant_woman": { + "unicode": "1F930", + "unicode_alternates": [], + "name": "pregnant woman", + "shortname": ":pregnant_woman:", + "category": "people", + "aliases": [ + ":expecting_woman:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤰" + }, + "pregnant_woman_tone1": { + "unicode": "1F930-1F3FB", + "unicode_alternates": [], + "name": "pregnant woman tone 1", + "shortname": ":pregnant_woman_tone1:", + "category": "people", + "aliases": [ + ":expecting_woman_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤰🏻" + }, + "pregnant_woman_tone2": { + "unicode": "1F930-1F3FC", + "unicode_alternates": [], + "name": "pregnant woman tone 2", + "shortname": ":pregnant_woman_tone2:", + "category": "people", + "aliases": [ + ":expecting_woman_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤰🏼" + }, + "pregnant_woman_tone3": { + "unicode": "1F930-1F3FD", + "unicode_alternates": [], + "name": "pregnant woman tone 3", + "shortname": ":pregnant_woman_tone3:", + "category": "people", + "aliases": [ + ":expecting_woman_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤰🏽" + }, + "pregnant_woman_tone4": { + "unicode": "1F930-1F3FE", + "unicode_alternates": [], + "name": "pregnant woman tone 4", + "shortname": ":pregnant_woman_tone4:", + "category": "people", + "aliases": [ + ":expecting_woman_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤰🏾" + }, + "pregnant_woman_tone5": { + "unicode": "1F930-1F3FF", + "unicode_alternates": [], + "name": "pregnant woman tone 5", + "shortname": ":pregnant_woman_tone5:", + "category": "people", + "aliases": [ + ":expecting_woman_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤰🏿" + }, + "prince": { + "unicode": "1F934", + "unicode_alternates": [], + "name": "prince", + "shortname": ":prince:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤴" + }, + "prince_tone1": { + "unicode": "1F934-1F3FB", + "unicode_alternates": [], + "name": "prince tone 1", + "shortname": ":prince_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤴🏻" + }, + "prince_tone2": { + "unicode": "1F934-1F3FC", + "unicode_alternates": [], + "name": "prince tone 2", + "shortname": ":prince_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤴🏼" + }, + "prince_tone3": { + "unicode": "1F934-1F3FD", + "unicode_alternates": [], + "name": "prince tone 3", + "shortname": ":prince_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤴🏽" + }, + "prince_tone4": { + "unicode": "1F934-1F3FE", + "unicode_alternates": [], + "name": "prince tone 4", + "shortname": ":prince_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤴🏾" + }, + "prince_tone5": { + "unicode": "1F934-1F3FF", + "unicode_alternates": [], + "name": "prince tone 5", + "shortname": ":prince_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤴🏿" + }, + "princess": { + "unicode": "1F478", + "unicode_alternates": [], + "name": "princess", + "shortname": ":princess:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "blond", + "crown", + "female", + "girl", + "woman", + "princess", + "royal", + "royalty", + "king", + "queen", + "daughter", + "disney", + "high-maintenance", + "people", + "women", + "diversity", + "beautiful", + "girls night" + ], + "moji": "👸" + }, + "princess_tone1": { + "unicode": "1F478-1F3FB", + "unicode_alternates": [], + "name": "princess tone 1", + "shortname": ":princess_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "blond", + "crown", + "female", + "girl", + "woman", + "royal", + "royalty", + "king", + "queen", + "daughter", + "disney", + "high-maintenance" + ], + "moji": "👸🏻" + }, + "princess_tone2": { + "unicode": "1F478-1F3FC", + "unicode_alternates": [], + "name": "princess tone 2", + "shortname": ":princess_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "blond", + "crown", + "female", + "girl", + "woman", + "royal", + "royalty", + "king", + "queen", + "daughter", + "disney", + "high-maintenance" + ], + "moji": "👸🏼" + }, + "princess_tone3": { + "unicode": "1F478-1F3FD", + "unicode_alternates": [], + "name": "princess tone 3", + "shortname": ":princess_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "blond", + "crown", + "female", + "girl", + "woman", + "royal", + "royalty", + "king", + "queen", + "daughter", + "disney", + "high-maintenance" + ], + "moji": "👸🏽" + }, + "princess_tone4": { + "unicode": "1F478-1F3FE", + "unicode_alternates": [], + "name": "princess tone 4", + "shortname": ":princess_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "blond", + "crown", + "female", + "girl", + "woman", + "royal", + "royalty", + "king", + "queen", + "daughter", + "disney", + "high-maintenance" + ], + "moji": "👸🏾" + }, + "princess_tone5": { + "unicode": "1F478-1F3FF", + "unicode_alternates": [], + "name": "princess tone 5", + "shortname": ":princess_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "blond", + "crown", + "female", + "girl", + "woman", + "royal", + "royalty", + "king", + "queen", + "daughter", + "disney", + "high-maintenance" + ], + "moji": "👸🏿" + }, + "punch": { + "unicode": "1F44A", + "unicode_alternates": [], + "name": "fisted hand sign", + "shortname": ":punch:", + "category": "people", + "aliases": [ + ":fist_oncoming:" + ], + "aliases_ascii": [], + "keywords": [ + "fist", + "hand", + "body", + "hands", + "hi", + "fist bump", + "diversity", + "boys night" + ], + "moji": "👊" + }, + "punch_tone1": { + "unicode": "1F44A-1F3FB", + "unicode_alternates": [], + "name": "fisted hand sign tone 1", + "shortname": ":punch_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fist", + "punch" + ], + "moji": "👊🏻" + }, + "punch_tone2": { + "unicode": "1F44A-1F3FC", + "unicode_alternates": [], + "name": "fisted hand sign tone 2", + "shortname": ":punch_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fist", + "punch" + ], + "moji": "👊🏼" + }, + "punch_tone3": { + "unicode": "1F44A-1F3FD", + "unicode_alternates": [], + "name": "fisted hand sign tone 3", + "shortname": ":punch_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fist", + "punch" + ], + "moji": "👊🏽" + }, + "punch_tone4": { + "unicode": "1F44A-1F3FE", + "unicode_alternates": [], + "name": "fisted hand sign tone 4", + "shortname": ":punch_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fist", + "punch" + ], + "moji": "👊🏾" + }, + "punch_tone5": { + "unicode": "1F44A-1F3FF", + "unicode_alternates": [], + "name": "fisted hand sign tone 5", + "shortname": ":punch_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fist", + "punch" + ], + "moji": "👊🏿" + }, + "purse": { + "unicode": "1F45B", + "unicode_alternates": [], + "name": "purse", + "shortname": ":purse:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "accessories", + "fashion", + "money", + "purse", + "clutch", + "bag", + "handbag", + "coin bag", + "accessory", + "ladies", + "shopping", + "women" + ], + "moji": "👛" + }, + "rage": { + "unicode": "1F621", + "unicode_alternates": [], + "name": "pouting face", + "shortname": ":rage:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "angry", + "despise", + "hate", + "mad", + "pout", + "anger", + "rage", + "irate", + "smiley", + "emotion" + ], + "moji": "😡" + }, + "raised_back_of_hand": { + "unicode": "1F91A", + "unicode_alternates": [], + "name": "raised back of hand", + "shortname": ":raised_back_of_hand:", + "category": "people", + "aliases": [ + ":back_of_hand:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤚" + }, + "raised_back_of_hand_tone1": { + "unicode": "1F91A-1F3FB", + "unicode_alternates": [], + "name": "raised back of hand tone 1", + "shortname": ":raised_back_of_hand_tone1:", + "category": "people", + "aliases": [ + ":back_of_hand_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤚🏻" + }, + "raised_back_of_hand_tone2": { + "unicode": "1F91A-1F3FC", + "unicode_alternates": [], + "name": "raised back of hand tone 2", + "shortname": ":raised_back_of_hand_tone2:", + "category": "people", + "aliases": [ + ":back_of_hand_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤚🏼" + }, + "raised_back_of_hand_tone3": { + "unicode": "1F91A-1F3FD", + "unicode_alternates": [], + "name": "raised back of hand tone 3", + "shortname": ":raised_back_of_hand_tone3:", + "category": "people", + "aliases": [ + ":back_of_hand_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤚🏽" + }, + "raised_back_of_hand_tone4": { + "unicode": "1F91A-1F3FE", + "unicode_alternates": [], + "name": "raised back of hand tone 4", + "shortname": ":raised_back_of_hand_tone4:", + "category": "people", + "aliases": [ + ":back_of_hand_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤚🏾" + }, + "raised_back_of_hand_tone5": { + "unicode": "1F91A-1F3FF", + "unicode_alternates": [], + "name": "raised back of hand tone 5", + "shortname": ":raised_back_of_hand_tone5:", + "category": "people", + "aliases": [ + ":back_of_hand_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤚🏿" + }, + "raised_hand": { + "unicode": "270B", + "unicode_alternates": [], + "name": "raised hand", + "shortname": ":raised_hand:", + "category": "people", + "aliases": [ + ":hand:" + ], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "body", + "hands", + "hi", + "diversity", + "girls night" + ], + "moji": "✋" + }, + "raised_hand_tone1": { + "unicode": "270B-1F3FB", + "unicode_alternates": [], + "name": "raised hand tone 1", + "shortname": ":raised_hand_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman" + ], + "moji": "✋🏻" + }, + "raised_hand_tone2": { + "unicode": "270B-1F3FC", + "unicode_alternates": [], + "name": "raised hand tone 2", + "shortname": ":raised_hand_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman" + ], + "moji": "✋🏼" + }, + "raised_hand_tone3": { + "unicode": "270B-1F3FD", + "unicode_alternates": [], + "name": "raised hand tone 3", + "shortname": ":raised_hand_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman" + ], + "moji": "✋🏽" + }, + "raised_hand_tone4": { + "unicode": "270B-1F3FE", + "unicode_alternates": [], + "name": "raised hand tone 4", + "shortname": ":raised_hand_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman" + ], + "moji": "✋🏾" + }, + "raised_hand_tone5": { + "unicode": "270B-1F3FF", + "unicode_alternates": [], + "name": "raised hand tone 5", + "shortname": ":raised_hand_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman" + ], + "moji": "✋🏿" + }, + "raised_hands": { + "unicode": "1F64C", + "unicode_alternates": [], + "name": "person raising both hands in celebration", + "shortname": ":raised_hands:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "gesture", + "hooray", + "winning", + "woot", + "yay", + "banzai", + "body", + "hands", + "diversity", + "perfect", + "good", + "parties" + ], + "moji": "🙌" + }, + "raised_hands_tone1": { + "unicode": "1F64C-1F3FB", + "unicode_alternates": [], + "name": "person raising both hands in celebration tone 1", + "shortname": ":raised_hands_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "gesture", + "hooray", + "winning", + "woot", + "yay", + "banzai", + "raised" + ], + "moji": "🙌🏻" + }, + "raised_hands_tone2": { + "unicode": "1F64C-1F3FC", + "unicode_alternates": [], + "name": "person raising both hands in celebration tone 2", + "shortname": ":raised_hands_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "gesture", + "hooray", + "winning", + "woot", + "yay", + "banzai", + "raised" + ], + "moji": "🙌🏼" + }, + "raised_hands_tone3": { + "unicode": "1F64C-1F3FD", + "unicode_alternates": [], + "name": "person raising both hands in celebration tone 3", + "shortname": ":raised_hands_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "gesture", + "hooray", + "winning", + "woot", + "yay", + "banzai", + "raised" + ], + "moji": "🙌🏽" + }, + "raised_hands_tone4": { + "unicode": "1F64C-1F3FE", + "unicode_alternates": [], + "name": "person raising both hands in celebration tone 4", + "shortname": ":raised_hands_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "gesture", + "hooray", + "winning", + "woot", + "yay", + "banzai", + "raised" + ], + "moji": "🙌🏾" + }, + "raised_hands_tone5": { + "unicode": "1F64C-1F3FF", + "unicode_alternates": [], + "name": "person raising both hands in celebration tone 5", + "shortname": ":raised_hands_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "gesture", + "hooray", + "winning", + "woot", + "yay", + "banzai", + "raised" + ], + "moji": "🙌🏿" + }, + "raising_hand": { + "unicode": "1F64B", + "unicode_alternates": [], + "name": "happy person raising one hand", + "shortname": ":raising_hand:", + "category": "people", + "aliases": [ + ":raising_hand_woman:" + ], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "hand", + "raise", + "notice", + "attention", + "answer", + "people", + "women", + "diversity" + ], + "moji": "🙋" + }, + "raising_hand_tone1": { + "unicode": "1F64B-1F3FB", + "unicode_alternates": [], + "name": "happy person raising one hand tone1", + "shortname": ":raising_hand_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "raise", + "notice", + "attention", + "answer" + ], + "moji": "🙋🏻" + }, + "raising_hand_tone2": { + "unicode": "1F64B-1F3FC", + "unicode_alternates": [], + "name": "happy person raising one hand tone2", + "shortname": ":raising_hand_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "raise", + "notice", + "attention", + "answer" + ], + "moji": "🙋🏼" + }, + "raising_hand_tone3": { + "unicode": "1F64B-1F3FD", + "unicode_alternates": [], + "name": "happy person raising one hand tone3", + "shortname": ":raising_hand_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "raise", + "notice", + "attention", + "answer" + ], + "moji": "🙋🏽" + }, + "raising_hand_tone4": { + "unicode": "1F64B-1F3FE", + "unicode_alternates": [], + "name": "happy person raising one hand tone4", + "shortname": ":raising_hand_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "raise", + "notice", + "attention", + "answer" + ], + "moji": "🙋🏾" + }, + "raising_hand_tone5": { + "unicode": "1F64B-1F3FF", + "unicode_alternates": [], + "name": "happy person raising one hand tone5", + "shortname": ":raising_hand_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "woman", + "raise", + "notice", + "attention", + "answer" + ], + "moji": "🙋🏿" + }, + "relaxed": { + "unicode": "263A", + "unicode_alternates": [ + "263A-FE0F" + ], + "name": "white smiling face", + "shortname": ":relaxed:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "blush", + "face", + "happiness", + "massage", + "smile", + "happy", + "smiley" + ], + "moji": "☺" + }, + "relieved": { + "unicode": "1F60C", + "unicode_alternates": [], + "name": "relieved face", + "shortname": ":relieved:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "happiness", + "massage", + "phew", + "relaxed", + "relieved", + "satisfied", + "relief", + "smiley", + "emotion" + ], + "moji": "😌" + }, + "right_facing_fist": { + "unicode": "1F91C", + "unicode_alternates": [], + "name": "right-facing fist", + "shortname": ":right_facing_fist:", + "category": "people", + "aliases": [ + ":right_fist:", + ":fist_right:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤜" + }, + "right_facing_fist_tone1": { + "unicode": "1F91C-1F3FB", + "unicode_alternates": [], + "name": "right facing fist tone 1", + "shortname": ":right_facing_fist_tone1:", + "category": "people", + "aliases": [ + ":right_fist_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤜🏻" + }, + "right_facing_fist_tone2": { + "unicode": "1F91C-1F3FC", + "unicode_alternates": [], + "name": "right facing fist tone 2", + "shortname": ":right_facing_fist_tone2:", + "category": "people", + "aliases": [ + ":right_fist_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤜🏼" + }, + "right_facing_fist_tone3": { + "unicode": "1F91C-1F3FD", + "unicode_alternates": [], + "name": "right facing fist tone 3", + "shortname": ":right_facing_fist_tone3:", + "category": "people", + "aliases": [ + ":right_fist_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤜🏽" + }, + "right_facing_fist_tone4": { + "unicode": "1F91C-1F3FE", + "unicode_alternates": [], + "name": "right facing fist tone 4", + "shortname": ":right_facing_fist_tone4:", + "category": "people", + "aliases": [ + ":right_fist_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤜🏾" + }, + "right_facing_fist_tone5": { + "unicode": "1F91C-1F3FF", + "unicode_alternates": [], + "name": "right facing fist tone 5", + "shortname": ":right_facing_fist_tone5:", + "category": "people", + "aliases": [ + ":right_fist_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤜🏿" + }, + "ring": { + "unicode": "1F48D", + "unicode_alternates": [], + "name": "ring", + "shortname": ":ring:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "marriage", + "propose", + "valentines", + "wedding", + "object", + "fashion", + "gem", + "accessories" + ], + "moji": "💍" + }, + "robot": { + "unicode": "1F916", + "unicode_alternates": [], + "name": "robot face", + "shortname": ":robot:", + "category": "people", + "aliases": [ + ":robot_face:" + ], + "aliases_ascii": [], + "keywords": [ + "monster", + "robot" + ], + "moji": "🤖" + }, + "rofl": { + "unicode": "1F923", + "unicode_alternates": [], + "name": "rolling on the floor laughing", + "shortname": ":rofl:", + "category": "people", + "aliases": [ + ":rolling_on_the_floor_laughing:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤣" + }, + "rolling_eyes": { + "unicode": "1F644", + "unicode_alternates": [], + "name": "face with rolling eyes", + "shortname": ":rolling_eyes:", + "category": "people", + "aliases": [ + ":face_with_rolling_eyes:", + ":roll_eyes:" + ], + "aliases_ascii": [], + "keywords": [ + "mad", + "smiley", + "rolling eyes", + "emotion", + "sarcastic" + ], + "moji": "🙄" + }, + "runner": { + "unicode": "1F3C3", + "unicode_alternates": [], + "name": "runner", + "shortname": ":runner:", + "category": "people", + "aliases": [ + ":running_man:" + ], + "aliases_ascii": [], + "keywords": [ + "exercise", + "man", + "walking", + "run", + "runner", + "jog", + "sprint", + "race", + "dash", + "people", + "men", + "diversity", + "boys night" + ], + "moji": "🏃" + }, + "runner_tone1": { + "unicode": "1F3C3-1F3FB", + "unicode_alternates": [], + "name": "runner tone 1", + "shortname": ":runner_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "exercise", + "man", + "run", + "jog", + "sprint", + "race", + "dash", + "marathon" + ], + "moji": "🏃🏻" + }, + "runner_tone2": { + "unicode": "1F3C3-1F3FC", + "unicode_alternates": [], + "name": "runner tone 2", + "shortname": ":runner_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "exercise", + "man", + "run", + "jog", + "sprint", + "race", + "dash", + "marathon" + ], + "moji": "🏃🏼" + }, + "runner_tone3": { + "unicode": "1F3C3-1F3FD", + "unicode_alternates": [], + "name": "runner tone 3", + "shortname": ":runner_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "exercise", + "man", + "run", + "jog", + "sprint", + "race", + "dash", + "marathon" + ], + "moji": "🏃🏽" + }, + "runner_tone4": { + "unicode": "1F3C3-1F3FE", + "unicode_alternates": [], + "name": "runner tone 4", + "shortname": ":runner_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "exercise", + "man", + "run", + "jog", + "sprint", + "race", + "dash", + "marathon" + ], + "moji": "🏃🏾" + }, + "runner_tone5": { + "unicode": "1F3C3-1F3FF", + "unicode_alternates": [], + "name": "runner tone 5", + "shortname": ":runner_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "exercise", + "man", + "run", + "jog", + "sprint", + "race", + "dash", + "marathon" + ], + "moji": "🏃🏿" + }, + "sandal": { + "unicode": "1F461", + "unicode_alternates": [], + "name": "womans sandal", + "shortname": ":sandal:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fashion", + "shoes", + "shoe", + "accessories" + ], + "moji": "👡" + }, + "santa": { + "unicode": "1F385", + "unicode_alternates": [], + "name": "father christmas", + "shortname": ":santa:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "christmas", + "father christmas", + "festival", + "male", + "man", + "xmas", + "santa", + "saint nick", + "jolly", + "ho ho ho", + "north pole", + "presents", + "gifts", + "naughty", + "nice", + "sleigh", + "father", + "holiday", + "people", + "hat", + "winter", + "holidays", + "diversity" + ], + "moji": "🎅" + }, + "santa_tone1": { + "unicode": "1F385-1F3FB", + "unicode_alternates": [], + "name": "father christmas tone 1", + "shortname": ":santa_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "festival", + "male", + "man", + "xmas", + "santa", + "saint nick", + "jolly", + "ho ho ho", + "north pole", + "presents", + "gifts", + "naughty", + "nice", + "sleigh", + "holiday" + ], + "moji": "🎅🏻" + }, + "santa_tone2": { + "unicode": "1F385-1F3FC", + "unicode_alternates": [], + "name": "father christmas tone 2", + "shortname": ":santa_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "festival", + "male", + "man", + "xmas", + "santa", + "saint nick", + "jolly", + "ho ho ho", + "north pole", + "presents", + "gifts", + "naughty", + "nice", + "sleigh", + "holiday" + ], + "moji": "🎅🏼" + }, + "santa_tone3": { + "unicode": "1F385-1F3FD", + "unicode_alternates": [], + "name": "father christmas tone 3", + "shortname": ":santa_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "festival", + "male", + "man", + "xmas", + "santa", + "saint nick", + "jolly", + "ho ho ho", + "north pole", + "presents", + "gifts", + "naughty", + "nice", + "sleigh", + "holiday" + ], + "moji": "🎅🏽" + }, + "santa_tone4": { + "unicode": "1F385-1F3FE", + "unicode_alternates": [], + "name": "father christmas tone 4", + "shortname": ":santa_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "festival", + "male", + "man", + "xmas", + "santa", + "saint nick", + "jolly", + "ho ho ho", + "north pole", + "presents", + "gifts", + "naughty", + "nice", + "sleigh", + "holiday" + ], + "moji": "🎅🏾" + }, + "santa_tone5": { + "unicode": "1F385-1F3FF", + "unicode_alternates": [], + "name": "father christmas tone 5", + "shortname": ":santa_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "festival", + "male", + "man", + "xmas", + "santa", + "saint nick", + "jolly", + "ho ho ho", + "north pole", + "presents", + "gifts", + "naughty", + "nice", + "sleigh", + "holiday" + ], + "moji": "🎅🏿" + }, + "school_satchel": { + "unicode": "1F392", + "unicode_alternates": [], + "name": "school satchel", + "shortname": ":school_satchel:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "bag", + "education", + "student", + "school", + "satchel", + "backpack", + "packing", + "pack", + "hike", + "adventure", + "travel", + "sightsee", + "fashion", + "office", + "vacation", + "accessories" + ], + "moji": "🎒" + }, + "scream": { + "unicode": "1F631", + "unicode_alternates": [], + "name": "face screaming in fear", + "shortname": ":scream:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "munch", + "scream", + "painting", + "artist", + "alien", + "smiley", + "surprised", + "wow", + "emotion", + "omg" + ], + "moji": "😱" + }, + "scream_cat": { + "unicode": "1F640", + "unicode_alternates": [], + "name": "weary cat face", + "shortname": ":scream_cat:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "cats", + "munch", + "weary", + "sleepy", + "tired", + "tiredness", + "study", + "finals", + "school", + "exhausted", + "scream", + "painting", + "artist", + "cat" + ], + "moji": "🙀" + }, + "selfie": { + "unicode": "1F933", + "unicode_alternates": [], + "name": "selfie", + "shortname": ":selfie:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤳" + }, + "selfie_tone1": { + "unicode": "1F933-1F3FB", + "unicode_alternates": [], + "name": "selfie tone 1", + "shortname": ":selfie_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤳🏻" + }, + "selfie_tone2": { + "unicode": "1F933-1F3FC", + "unicode_alternates": [], + "name": "selfie tone 2", + "shortname": ":selfie_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤳🏼" + }, + "selfie_tone3": { + "unicode": "1F933-1F3FD", + "unicode_alternates": [], + "name": "selfie tone 3", + "shortname": ":selfie_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤳🏽" + }, + "selfie_tone4": { + "unicode": "1F933-1F3FE", + "unicode_alternates": [], + "name": "selfie tone 4", + "shortname": ":selfie_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤳🏾" + }, + "selfie_tone5": { + "unicode": "1F933-1F3FF", + "unicode_alternates": [], + "name": "selfie tone 5", + "shortname": ":selfie_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤳🏿" + }, + "shirt": { + "unicode": "1F455", + "unicode_alternates": [], + "name": "t-shirt", + "shortname": ":shirt:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "cloth", + "fashion" + ], + "moji": "👕" + }, + "shrug": { + "unicode": "1F937", + "unicode_alternates": [], + "name": "shrug", + "shortname": ":shrug:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤷" + }, + "shrug_tone1": { + "unicode": "1F937-1F3FB", + "unicode_alternates": [], + "name": "shrug tone 1", + "shortname": ":shrug_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤷🏻" + }, + "shrug_tone2": { + "unicode": "1F937-1F3FC", + "unicode_alternates": [], + "name": "shrug tone 2", + "shortname": ":shrug_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤷🏼" + }, + "shrug_tone3": { + "unicode": "1F937-1F3FD", + "unicode_alternates": [], + "name": "shrug tone 3", + "shortname": ":shrug_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤷🏽" + }, + "shrug_tone4": { + "unicode": "1F937-1F3FE", + "unicode_alternates": [], + "name": "shrug tone 4", + "shortname": ":shrug_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤷🏾" + }, + "shrug_tone5": { + "unicode": "1F937-1F3FF", + "unicode_alternates": [], + "name": "shrug tone 5", + "shortname": ":shrug_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤷🏿" + }, + "skull": { + "unicode": "1F480", + "unicode_alternates": [], + "name": "skull", + "shortname": ":skull:", + "category": "people", + "aliases": [ + ":skeleton:" + ], + "aliases_ascii": [], + "keywords": [ + "dead", + "skeleton", + "dying", + "halloween", + "skull" + ], + "moji": "💀" + }, + "sleeping": { + "unicode": "1F634", + "unicode_alternates": [], + "name": "sleeping face", + "shortname": ":sleeping:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "sleepy", + "tired", + "sleep", + "sleeping", + "snore", + "smiley", + "emotion", + "goodnight" + ], + "moji": "😴" + }, + "sleepy": { + "unicode": "1F62A", + "unicode_alternates": [], + "name": "sleepy face", + "shortname": ":sleepy:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "rest", + "tired", + "sleepy", + "exhausted", + "smiley", + "sick", + "emotion" + ], + "moji": "😪" + }, + "slight_frown": { + "unicode": "1F641", + "unicode_alternates": [], + "name": "slightly frowning face", + "shortname": ":slight_frown:", + "category": "people", + "aliases": [ + ":slightly_frowning_face:" + ], + "aliases_ascii": [], + "keywords": [ + "slight", + "frown", + "unhappy", + "disappointed", + "sad", + "smiley", + "emotion" + ], + "moji": "🙁" + }, + "slight_smile": { + "unicode": "1F642", + "unicode_alternates": [], + "name": "slightly smiling face", + "shortname": ":slight_smile:", + "category": "people", + "aliases": [ + ":slightly_smiling_face:" + ], + "aliases_ascii": [], + "keywords": [ + "slight", + "smile", + "happy", + "smiley" + ], + "moji": "🙂" + }, + "smile": { + "unicode": "1F604", + "unicode_alternates": [], + "name": "smiling face with open mouth and smiling eyes", + "shortname": ":smile:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + ":)", + ":-)", + "=]", + "=)", + ":]" + ], + "keywords": [ + "face", + "funny", + "haha", + "happy", + "joy", + "laugh", + "smile", + "smiley", + "smiling", + "emotion" + ], + "moji": "😄" + }, + "smile_cat": { + "unicode": "1F638", + "unicode_alternates": [], + "name": "grinning cat face with smiling eyes", + "shortname": ":smile_cat:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "cats", + "cat", + "smile", + "grin", + "grinning", + "happy" + ], + "moji": "😸" + }, + "smiley": { + "unicode": "1F603", + "unicode_alternates": [], + "name": "smiling face with open mouth", + "shortname": ":smiley:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + ":D", + ":-D", + "=D" + ], + "keywords": [ + "face", + "haha", + "happy", + "joy", + "smiling", + "smile", + "smiley", + "emotion", + "good" + ], + "moji": "😃" + }, + "smiley_cat": { + "unicode": "1F63A", + "unicode_alternates": [], + "name": "smiling cat face with open mouth", + "shortname": ":smiley_cat:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "cats", + "happy", + "smile", + "smiley", + "cat" + ], + "moji": "😺" + }, + "smiling_imp": { + "unicode": "1F608", + "unicode_alternates": [], + "name": "smiling face with horns", + "shortname": ":smiling_imp:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "devil", + "horns", + "impish", + "trouble", + "silly", + "smiley", + "angry", + "monster", + "boys night" + ], + "moji": "😈" + }, + "smirk": { + "unicode": "1F60F", + "unicode_alternates": [], + "name": "smirking face", + "shortname": ":smirk:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "mean", + "prank", + "smile", + "smug", + "smirking", + "smirk", + "half-smile", + "conceited", + "silly", + "smiley", + "sexy", + "sarcastic" + ], + "moji": "😏" + }, + "smirk_cat": { + "unicode": "1F63C", + "unicode_alternates": [], + "name": "cat face with wry smile", + "shortname": ":smirk_cat:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "animal", + "cats", + "smirk", + "smirking", + "wry", + "confident", + "confidence", + "cat" + ], + "moji": "😼" + }, + "sneezing_face": { + "unicode": "1F927", + "unicode_alternates": [], + "name": "sneezing face", + "shortname": ":sneezing_face:", + "category": "people", + "aliases": [ + ":sneeze:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤧" + }, + "sob": { + "unicode": "1F62D", + "unicode_alternates": [], + "name": "loudly crying face", + "shortname": ":sob:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "cry", + "face", + "sad", + "tears", + "upset", + "sob", + "melancholy", + "morn", + "somber", + "hurt", + "smiley", + "emotion", + "heartbreak" + ], + "moji": "😭" + }, + "speaking_head": { + "unicode": "1F5E3", + "unicode_alternates": [], + "name": "speaking head in silhouette", + "shortname": ":speaking_head:", + "category": "people", + "aliases": [ + ":speaking_head_in_silhouette:" + ], + "aliases_ascii": [], + "keywords": [ + "talk", + "people" + ], + "moji": "🗣" + }, + "spy": { + "unicode": "1F575", + "unicode_alternates": [], + "name": "sleuth or spy", + "shortname": ":spy:", + "category": "people", + "aliases": [ + ":sleuth_or_spy:" + ], + "aliases_ascii": [], + "keywords": [ + "pi", + "undercover", + "investigator", + "people", + "hat", + "men", + "glasses", + "diversity", + "job" + ], + "moji": "🕵" + }, + "spy_tone1": { + "unicode": "1F575-1F3FB", + "unicode_alternates": [], + "name": "sleuth or spy tone 1", + "shortname": ":spy_tone1:", + "category": "people", + "aliases": [ + ":sleuth_or_spy_tone1:" + ], + "aliases_ascii": [], + "keywords": [ + "pi", + "undercover", + "investigator", + "person" + ], + "moji": "🕵🏻" + }, + "spy_tone2": { + "unicode": "1F575-1F3FC", + "unicode_alternates": [], + "name": "sleuth or spy tone 2", + "shortname": ":spy_tone2:", + "category": "people", + "aliases": [ + ":sleuth_or_spy_tone2:" + ], + "aliases_ascii": [], + "keywords": [ + "pi", + "undercover", + "investigator", + "person" + ], + "moji": "🕵🏼" + }, + "spy_tone3": { + "unicode": "1F575-1F3FD", + "unicode_alternates": [], + "name": "sleuth or spy tone 3", + "shortname": ":spy_tone3:", + "category": "people", + "aliases": [ + ":sleuth_or_spy_tone3:" + ], + "aliases_ascii": [], + "keywords": [ + "pi", + "undercover", + "investigator", + "person" + ], + "moji": "🕵🏽" + }, + "spy_tone4": { + "unicode": "1F575-1F3FE", + "unicode_alternates": [], + "name": "sleuth or spy tone 4", + "shortname": ":spy_tone4:", + "category": "people", + "aliases": [ + ":sleuth_or_spy_tone4:" + ], + "aliases_ascii": [], + "keywords": [ + "pi", + "undercover", + "investigator", + "person" + ], + "moji": "🕵🏾" + }, + "spy_tone5": { + "unicode": "1F575-1F3FF", + "unicode_alternates": [], + "name": "sleuth or spy tone 5", + "shortname": ":spy_tone5:", + "category": "people", + "aliases": [ + ":sleuth_or_spy_tone5:" + ], + "aliases_ascii": [], + "keywords": [ + "pi", + "undercover", + "investigator", + "person" + ], + "moji": "🕵🏿" + }, + "stuck_out_tongue": { + "unicode": "1F61B", + "unicode_alternates": [], + "name": "face with stuck-out tongue", + "shortname": ":stuck_out_tongue:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + ":P", + ":-P", + "=P", + ":-p", + ":p", + "=p", + ":-Þ", + ":Þ", + ":þ", + ":-þ", + ":-b", + ":b", + "d:" + ], + "keywords": [ + "childish", + "face", + "mischievous", + "playful", + "prank", + "tongue", + "silly", + "cheeky", + "smiley", + "sex", + "emotion" + ], + "moji": "😛" + }, + "stuck_out_tongue_closed_eyes": { + "unicode": "1F61D", + "unicode_alternates": [], + "name": "face with stuck-out tongue and tightly-closed eyes", + "shortname": ":stuck_out_tongue_closed_eyes:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "mischievous", + "playful", + "prank", + "tongue", + "kidding", + "silly", + "ecstatic", + "happy", + "smiley", + "emotion" + ], + "moji": "😝" + }, + "stuck_out_tongue_winking_eye": { + "unicode": "1F61C", + "unicode_alternates": [], + "name": "face with stuck-out tongue and winking eye", + "shortname": ":stuck_out_tongue_winking_eye:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + ">:P", + "X-P", + "x-p" + ], + "keywords": [ + "childish", + "face", + "mischievous", + "playful", + "prank", + "tongue", + "wink", + "winking", + "kidding", + "silly", + "crazy", + "happy", + "smiley", + "emotion", + "parties" + ], + "moji": "😜" + }, + "sunglasses": { + "unicode": "1F60E", + "unicode_alternates": [], + "name": "smiling face with sunglasses", + "shortname": ":sunglasses:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + "B-)", + "B)", + "8)", + "8-)", + "B-D", + "8-D" + ], + "keywords": [ + "cool", + "face", + "smiling", + "sunglasses", + "sun", + "glasses", + "sunny", + "smooth", + "silly", + "smiley", + "emojione", + "boys night" + ], + "moji": "😎" + }, + "sweat": { + "unicode": "1F613", + "unicode_alternates": [], + "name": "face with cold sweat", + "shortname": ":sweat:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + "':(", + "':-(", + "'=(" + ], + "keywords": [ + "cold", + "sweat", + "sick", + "anxious", + "worried", + "clammy", + "diaphoresis", + "face", + "hot", + "sad", + "smiley", + "stressed", + "emotion" + ], + "moji": "😓" + }, + "sweat_smile": { + "unicode": "1F605", + "unicode_alternates": [], + "name": "smiling face with open mouth and cold sweat", + "shortname": ":sweat_smile:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + "':)", + "':-)", + "'=)", + "':D", + "':-D", + "'=D" + ], + "keywords": [ + "face", + "happy", + "hot", + "smiling", + "cold", + "sweat", + "perspiration", + "smiley", + "workout", + "emotion" + ], + "moji": "😅" + }, + "thermometer_face": { + "unicode": "1F912", + "unicode_alternates": [], + "name": "face with thermometer", + "shortname": ":thermometer_face:", + "category": "people", + "aliases": [ + ":face_with_thermometer:" + ], + "aliases_ascii": [], + "keywords": [ + "smiley", + "health", + "sick", + "emotion" + ], + "moji": "🤒" + }, + "thinking": { + "unicode": "1F914", + "unicode_alternates": [], + "name": "thinking face", + "shortname": ":thinking:", + "category": "people", + "aliases": [ + ":thinking_face:" + ], + "aliases_ascii": [], + "keywords": [ + "smiley", + "thinking", + "boys night" + ], + "moji": "🤔" + }, + "thumbsdown": { + "unicode": "1F44E", + "unicode_alternates": [], + "name": "thumbs down sign", + "shortname": ":thumbsdown:", + "category": "people", + "aliases": [ + ":-1:" + ], + "aliases_ascii": [], + "keywords": [ + "hand", + "no", + "body", + "hands", + "diversity" + ], + "moji": "👎" + }, + "thumbsdown_tone1": { + "unicode": "1F44E-1F3FB", + "unicode_alternates": [], + "name": "thumbs down sign tone 1", + "shortname": ":thumbsdown_tone1:", + "category": "people", + "aliases": [ + ":-1_tone1:" + ], + "aliases_ascii": [], + "keywords": [ + "hand", + "no", + "-1" + ], + "moji": "👎🏻" + }, + "thumbsdown_tone2": { + "unicode": "1F44E-1F3FC", + "unicode_alternates": [], + "name": "thumbs down sign tone 2", + "shortname": ":thumbsdown_tone2:", + "category": "people", + "aliases": [ + ":-1_tone2:" + ], + "aliases_ascii": [], + "keywords": [ + "hand", + "no", + "-1" + ], + "moji": "👎🏼" + }, + "thumbsdown_tone3": { + "unicode": "1F44E-1F3FD", + "unicode_alternates": [], + "name": "thumbs down sign tone 3", + "shortname": ":thumbsdown_tone3:", + "category": "people", + "aliases": [ + ":-1_tone3:" + ], + "aliases_ascii": [], + "keywords": [ + "hand", + "no", + "-1" + ], + "moji": "👎🏽" + }, + "thumbsdown_tone4": { + "unicode": "1F44E-1F3FE", + "unicode_alternates": [], + "name": "thumbs down sign tone 4", + "shortname": ":thumbsdown_tone4:", + "category": "people", + "aliases": [ + ":-1_tone4:" + ], + "aliases_ascii": [], + "keywords": [ + "hand", + "no", + "-1" + ], + "moji": "👎🏾" + }, + "thumbsdown_tone5": { + "unicode": "1F44E-1F3FF", + "unicode_alternates": [], + "name": "thumbs down sign tone 5", + "shortname": ":thumbsdown_tone5:", + "category": "people", + "aliases": [ + ":-1_tone5:" + ], + "aliases_ascii": [], + "keywords": [ + "hand", + "no", + "-1" + ], + "moji": "👎🏿" + }, + "thumbsup": { + "unicode": "1F44D", + "unicode_alternates": [], + "name": "thumbs up sign", + "shortname": ":thumbsup:", + "category": "people", + "aliases": [ + ":+1:" + ], + "aliases_ascii": [], + "keywords": [ + "cool", + "hand", + "like", + "yes", + "body", + "hands", + "hi", + "luck", + "thank you", + "diversity", + "perfect", + "good", + "beautiful" + ], + "moji": "👍" + }, + "thumbsup_tone1": { + "unicode": "1F44D-1F3FB", + "unicode_alternates": [], + "name": "thumbs up sign tone 1", + "shortname": ":thumbsup_tone1:", + "category": "people", + "aliases": [ + ":+1_tone1:" + ], + "aliases_ascii": [], + "keywords": [ + "cool", + "hand", + "like", + "yes", + "+1" + ], + "moji": "👍🏻" + }, + "thumbsup_tone2": { + "unicode": "1F44D-1F3FC", + "unicode_alternates": [], + "name": "thumbs up sign tone 2", + "shortname": ":thumbsup_tone2:", + "category": "people", + "aliases": [ + ":+1_tone2:" + ], + "aliases_ascii": [], + "keywords": [ + "cool", + "hand", + "like", + "yes", + "+1" + ], + "moji": "👍🏼" + }, + "thumbsup_tone3": { + "unicode": "1F44D-1F3FD", + "unicode_alternates": [], + "name": "thumbs up sign tone 3", + "shortname": ":thumbsup_tone3:", + "category": "people", + "aliases": [ + ":+1_tone3:" + ], + "aliases_ascii": [], + "keywords": [ + "cool", + "hand", + "like", + "yes", + "+1" + ], + "moji": "👍🏽" + }, + "thumbsup_tone4": { + "unicode": "1F44D-1F3FE", + "unicode_alternates": [], + "name": "thumbs up sign tone 4", + "shortname": ":thumbsup_tone4:", + "category": "people", + "aliases": [ + ":+1_tone4:" + ], + "aliases_ascii": [], + "keywords": [ + "cool", + "hand", + "like", + "yes", + "+1" + ], + "moji": "👍🏾" + }, + "thumbsup_tone5": { + "unicode": "1F44D-1F3FF", + "unicode_alternates": [], + "name": "thumbs up sign tone 5", + "shortname": ":thumbsup_tone5:", + "category": "people", + "aliases": [ + ":+1_tone5:" + ], + "aliases_ascii": [], + "keywords": [ + "cool", + "hand", + "like", + "yes", + "+1" + ], + "moji": "👍🏿" + }, + "tired_face": { + "unicode": "1F62B", + "unicode_alternates": [], + "name": "tired face", + "shortname": ":tired_face:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "frustrated", + "sick", + "upset", + "whine", + "exhausted", + "sleepy", + "tired", + "sad", + "smiley", + "emotion" + ], + "moji": "😫" + }, + "tongue": { + "unicode": "1F445", + "unicode_alternates": [], + "name": "tongue", + "shortname": ":tongue:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "mouth", + "playful", + "tongue", + "taste", + "buds", + "food", + "silly", + "tease", + "kiss", + "french kiss", + "lick", + "tasty", + "playfulness", + "silliness", + "intimacy", + "body", + "sexy", + "lip" + ], + "moji": "👅" + }, + "tophat": { + "unicode": "1F3A9", + "unicode_alternates": [], + "name": "top hat", + "shortname": ":tophat:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "classy", + "gentleman", + "magic", + "top", + "hat", + "cap", + "beaver", + "high", + "tall", + "stove", + "pipe", + "chimney", + "topper", + "london", + "period piece", + "magician", + "fashion", + "accessories" + ], + "moji": "🎩" + }, + "triumph": { + "unicode": "1F624", + "unicode_alternates": [], + "name": "face with look of triumph", + "shortname": ":triumph:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "gas", + "phew", + "triumph", + "steam", + "breath", + "mad", + "smiley", + "angry", + "emotion" + ], + "moji": "😤" + }, + "two_men_holding_hands": { + "unicode": "1F46C", + "unicode_alternates": [], + "name": "two men holding hands", + "shortname": ":two_men_holding_hands:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "bromance", + "couple", + "friends", + "like", + "love", + "men", + "gay", + "homosexual", + "hands", + "holding", + "team", + "unity", + "people", + "sex", + "lgbt" + ], + "moji": "👬" + }, + "two_women_holding_hands": { + "unicode": "1F46D", + "unicode_alternates": [], + "name": "two women holding hands", + "shortname": ":two_women_holding_hands:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "couple", + "female", + "friends", + "like", + "love", + "women", + "hands", + "girlfriends", + "sisters", + "mother", + "daughter", + "gay", + "homosexual", + "unity", + "people", + "sex", + "lgbt", + "lesbian", + "girls night" + ], + "moji": "👭" + }, + "unamused": { + "unicode": "1F612", + "unicode_alternates": [], + "name": "unamused face", + "shortname": ":unamused:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "bored", + "face", + "indifference", + "serious", + "straight face", + "unamused", + "not amused", + "depressed", + "unhappy", + "disapprove", + "lame", + "sad", + "mad", + "smiley", + "tired", + "emotion" + ], + "moji": "😒" + }, + "upside_down": { + "unicode": "1F643", + "unicode_alternates": [], + "name": "upside-down face", + "shortname": ":upside_down:", + "category": "people", + "aliases": [ + ":upside_down_face:" + ], + "aliases_ascii": [], + "keywords": [ + "silly", + "smiley", + "sarcastic" + ], + "moji": "🙃" + }, + "v": { + "unicode": "270C", + "unicode_alternates": [ + "270C-FE0F" + ], + "name": "victory hand", + "shortname": ":v:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fingers", + "hand", + "ohyeah", + "peace", + "two", + "victory", + "body", + "hands", + "hi", + "thank you", + "diversity", + "girls night" + ], + "moji": "✌" + }, + "v_tone1": { + "unicode": "270C-1F3FB", + "unicode_alternates": [], + "name": "victory hand tone 1", + "shortname": ":v_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fingers", + "ohyeah", + "peace", + "two", + "v" + ], + "moji": "✌🏻" + }, + "v_tone2": { + "unicode": "270C-1F3FC", + "unicode_alternates": [], + "name": "victory hand tone 2", + "shortname": ":v_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fingers", + "ohyeah", + "peace", + "two", + "v" + ], + "moji": "✌🏼" + }, + "v_tone3": { + "unicode": "270C-1F3FD", + "unicode_alternates": [], + "name": "victory hand tone 3", + "shortname": ":v_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fingers", + "ohyeah", + "peace", + "two", + "v" + ], + "moji": "✌🏽" + }, + "v_tone4": { + "unicode": "270C-1F3FE", + "unicode_alternates": [], + "name": "victory hand tone 4", + "shortname": ":v_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fingers", + "ohyeah", + "peace", + "two", + "v" + ], + "moji": "✌🏾" + }, + "v_tone5": { + "unicode": "270C-1F3FF", + "unicode_alternates": [], + "name": "victory hand tone 5", + "shortname": ":v_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fingers", + "ohyeah", + "peace", + "two", + "v" + ], + "moji": "✌🏿" + }, + "vulcan": { + "unicode": "1F596", + "unicode_alternates": [], + "name": "raised hand with part between middle and ring fingers", + "shortname": ":vulcan:", + "category": "people", + "aliases": [ + ":raised_hand_with_part_between_middle_and_ring_fingers:", + ":vulcan_salute:" + ], + "aliases_ascii": [], + "keywords": [ + "vulcan", + "spock", + "leonard", + "nimoy", + "star trek", + "live long", + "body", + "hands", + "hi", + "diversity" + ], + "moji": "🖖" + }, + "vulcan_tone1": { + "unicode": "1F596-1F3FB", + "unicode_alternates": [], + "name": "raised hand with part between middle and ring fingers tone 1", + "shortname": ":vulcan_tone1:", + "category": "people", + "aliases": [ + ":raised_hand_with_part_between_middle_and_ring_fingers_tone1:" + ], + "aliases_ascii": [], + "keywords": [ + "vulcan", + "spock", + "leonard", + "nimoy", + "star trek", + "live long" + ], + "moji": "🖖🏻" + }, + "vulcan_tone2": { + "unicode": "1F596-1F3FC", + "unicode_alternates": [], + "name": "raised hand with part between middle and ring fingers tone 2", + "shortname": ":vulcan_tone2:", + "category": "people", + "aliases": [ + ":raised_hand_with_part_between_middle_and_ring_fingers_tone2:" + ], + "aliases_ascii": [], + "keywords": [ + "vulcan", + "spock", + "leonard", + "nimoy", + "star trek", + "live long" + ], + "moji": "🖖🏼" + }, + "vulcan_tone3": { + "unicode": "1F596-1F3FD", + "unicode_alternates": [], + "name": "raised hand with part between middle and ring fingers tone 3", + "shortname": ":vulcan_tone3:", + "category": "people", + "aliases": [ + ":raised_hand_with_part_between_middle_and_ring_fingers_tone3:" + ], + "aliases_ascii": [], + "keywords": [ + "vulcan", + "spock", + "leonard", + "nimoy", + "star trek", + "live long" + ], + "moji": "🖖🏽" + }, + "vulcan_tone4": { + "unicode": "1F596-1F3FE", + "unicode_alternates": [], + "name": "raised hand with part between middle and ring fingers tone 4", + "shortname": ":vulcan_tone4:", + "category": "people", + "aliases": [ + ":raised_hand_with_part_between_middle_and_ring_fingers_tone4:" + ], + "aliases_ascii": [], + "keywords": [ + "vulcan", + "spock", + "leonard", + "nimoy", + "star trek", + "live long" + ], + "moji": "🖖🏾" + }, + "vulcan_tone5": { + "unicode": "1F596-1F3FF", + "unicode_alternates": [], + "name": "raised hand with part between middle and ring fingers tone 5", + "shortname": ":vulcan_tone5:", + "category": "people", + "aliases": [ + ":raised_hand_with_part_between_middle_and_ring_fingers_tone5:" + ], + "aliases_ascii": [], + "keywords": [ + "vulcan", + "spock", + "leonard", + "nimoy", + "star trek", + "live long" + ], + "moji": "🖖🏿" + }, + "walking": { + "unicode": "1F6B6", + "unicode_alternates": [], + "name": "pedestrian", + "shortname": ":walking:", + "category": "people", + "aliases": [ + ":walking_man:" + ], + "aliases_ascii": [], + "keywords": [ + "human", + "man", + "walk", + "pedestrian", + "stroll", + "stride", + "foot", + "feet", + "people", + "men", + "diversity" + ], + "moji": "🚶" + }, + "walking_tone1": { + "unicode": "1F6B6-1F3FB", + "unicode_alternates": [], + "name": "pedestrian tone 1", + "shortname": ":walking_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "man", + "walk", + "stroll", + "stride", + "hiking", + "hike" + ], + "moji": "🚶🏻" + }, + "walking_tone2": { + "unicode": "1F6B6-1F3FC", + "unicode_alternates": [], + "name": "pedestrian tone 2", + "shortname": ":walking_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "man", + "walk", + "stroll", + "stride", + "hiking", + "hike" + ], + "moji": "🚶🏼" + }, + "walking_tone3": { + "unicode": "1F6B6-1F3FD", + "unicode_alternates": [], + "name": "pedestrian tone 3", + "shortname": ":walking_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "man", + "walk", + "stroll", + "stride", + "hiking", + "hike" + ], + "moji": "🚶🏽" + }, + "walking_tone4": { + "unicode": "1F6B6-1F3FE", + "unicode_alternates": [], + "name": "pedestrian tone 4", + "shortname": ":walking_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "man", + "walk", + "stroll", + "stride", + "hiking", + "hike" + ], + "moji": "🚶🏾" + }, + "walking_tone5": { + "unicode": "1F6B6-1F3FF", + "unicode_alternates": [], + "name": "pedestrian tone 5", + "shortname": ":walking_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "man", + "walk", + "stroll", + "stride", + "hiking", + "hike" + ], + "moji": "🚶🏿" + }, + "wave": { + "unicode": "1F44B", + "unicode_alternates": [], + "name": "waving hand sign", + "shortname": ":wave:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "farewell", + "gesture", + "goodbye", + "hands", + "solong", + "body", + "hi", + "diversity" + ], + "moji": "👋" + }, + "wave_tone1": { + "unicode": "1F44B-1F3FB", + "unicode_alternates": [], + "name": "waving hand sign tone 1", + "shortname": ":wave_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "farewell", + "gesture", + "goodbye", + "solong", + "hi", + "wave" + ], + "moji": "👋🏻" + }, + "wave_tone2": { + "unicode": "1F44B-1F3FC", + "unicode_alternates": [], + "name": "waving hand sign tone 2", + "shortname": ":wave_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "farewell", + "gesture", + "goodbye", + "solong", + "hi", + "wave" + ], + "moji": "👋🏼" + }, + "wave_tone3": { + "unicode": "1F44B-1F3FD", + "unicode_alternates": [], + "name": "waving hand sign tone 3", + "shortname": ":wave_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "farewell", + "gesture", + "goodbye", + "solong", + "hi", + "wave" + ], + "moji": "👋🏽" + }, + "wave_tone4": { + "unicode": "1F44B-1F3FE", + "unicode_alternates": [], + "name": "waving hand sign tone 4", + "shortname": ":wave_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "farewell", + "gesture", + "goodbye", + "solong", + "hi", + "wave" + ], + "moji": "👋🏾" + }, + "wave_tone5": { + "unicode": "1F44B-1F3FF", + "unicode_alternates": [], + "name": "waving hand sign tone 5", + "shortname": ":wave_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "farewell", + "gesture", + "goodbye", + "solong", + "hi", + "wave" + ], + "moji": "👋🏿" + }, + "weary": { + "unicode": "1F629", + "unicode_alternates": [], + "name": "weary face", + "shortname": ":weary:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "frustrated", + "sad", + "sleepy", + "tired", + "weary", + "tiredness", + "study", + "finals", + "school", + "exhausted", + "smiley", + "stressed", + "emotion" + ], + "moji": "😩" + }, + "wink": { + "unicode": "1F609", + "unicode_alternates": [], + "name": "winking face", + "shortname": ":wink:", + "category": "people", + "aliases": [], + "aliases_ascii": [ + ";)", + ";-)", + "*-)", + "*)", + ";-]", + ";]", + ";D", + ";^)" + ], + "keywords": [ + "face", + "happy", + "mischievous", + "secret", + "wink", + "winking", + "friendly", + "joke", + "silly", + "smiley", + "emotion" + ], + "moji": "😉" + }, + "woman": { + "unicode": "1F469", + "unicode_alternates": [], + "name": "woman", + "shortname": ":woman:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girls", + "people", + "women", + "sex", + "diversity", + "feminist", + "selfie", + "girls night" + ], + "moji": "👩" + }, + "woman_tone1": { + "unicode": "1F469-1F3FB", + "unicode_alternates": [], + "name": "woman tone 1", + "shortname": ":woman_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "lady" + ], + "moji": "👩🏻" + }, + "woman_tone2": { + "unicode": "1F469-1F3FC", + "unicode_alternates": [], + "name": "woman tone 2", + "shortname": ":woman_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "lady" + ], + "moji": "👩🏼" + }, + "woman_tone3": { + "unicode": "1F469-1F3FD", + "unicode_alternates": [], + "name": "woman tone 3", + "shortname": ":woman_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "lady" + ], + "moji": "👩🏽" + }, + "woman_tone4": { + "unicode": "1F469-1F3FE", + "unicode_alternates": [], + "name": "woman tone 4", + "shortname": ":woman_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "lady" + ], + "moji": "👩🏾" + }, + "woman_tone5": { + "unicode": "1F469-1F3FF", + "unicode_alternates": [], + "name": "woman tone 5", + "shortname": ":woman_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "female", + "girl", + "lady" + ], + "moji": "👩🏿" + }, + "womans_clothes": { + "unicode": "1F45A", + "unicode_alternates": [], + "name": "womans clothes", + "shortname": ":womans_clothes:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "fashion", + "woman", + "clothing", + "clothes", + "blouse", + "shirt", + "wardrobe", + "breasts", + "cleavage", + "shopping", + "shop", + "dressing", + "dressed", + "women" + ], + "moji": "👚" + }, + "womans_hat": { + "unicode": "1F452", + "unicode_alternates": [], + "name": "womans hat", + "shortname": ":womans_hat:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "accessories", + "fashion", + "female", + "women" + ], + "moji": "👒" + }, + "worried": { + "unicode": "1F61F", + "unicode_alternates": [], + "name": "worried face", + "shortname": ":worried:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "concern", + "face", + "nervous", + "worried", + "anxious", + "distressed", + "tense", + "sad", + "smiley", + "emotion" + ], + "moji": "😟" + }, + "writing_hand": { + "unicode": "270D", + "unicode_alternates": [ + "270D-FE0F" + ], + "name": "writing hand", + "shortname": ":writing_hand:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "body", + "hands", + "write", + "diversity" + ], + "moji": "✍" + }, + "writing_hand_tone1": { + "unicode": "270D-1F3FB", + "unicode_alternates": [], + "name": "writing hand tone 1", + "shortname": ":writing_hand_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "write", + "sign", + "signature", + "draw" + ], + "moji": "✍🏻" + }, + "writing_hand_tone2": { + "unicode": "270D-1F3FC", + "unicode_alternates": [], + "name": "writing hand tone 2", + "shortname": ":writing_hand_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "write", + "sign", + "signature", + "draw" + ], + "moji": "✍🏼" + }, + "writing_hand_tone3": { + "unicode": "270D-1F3FD", + "unicode_alternates": [], + "name": "writing hand tone 3", + "shortname": ":writing_hand_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "write", + "sign", + "signature", + "draw" + ], + "moji": "✍🏽" + }, + "writing_hand_tone4": { + "unicode": "270D-1F3FE", + "unicode_alternates": [], + "name": "writing hand tone 4", + "shortname": ":writing_hand_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "write", + "sign", + "signature", + "draw" + ], + "moji": "✍🏾" + }, + "writing_hand_tone5": { + "unicode": "270D-1F3FF", + "unicode_alternates": [], + "name": "writing hand tone 5", + "shortname": ":writing_hand_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "write", + "sign", + "signature", + "draw" + ], + "moji": "✍🏿" + }, + "yum": { + "unicode": "1F60B", + "unicode_alternates": [], + "name": "face savouring delicious food", + "shortname": ":yum:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "face", + "happy", + "joy", + "smile", + "tongue", + "delicious", + "savoring", + "food", + "eat", + "yummy", + "yum", + "tasty", + "savory", + "silly", + "smiley", + "emotion", + "sarcastic", + "good" + ], + "moji": "😋" + }, + "zipper_mouth": { + "unicode": "1F910", + "unicode_alternates": [], + "name": "zipper-mouth face", + "shortname": ":zipper_mouth:", + "category": "people", + "aliases": [ + ":zipper_mouth_face:" + ], + "aliases_ascii": [], + "keywords": [ + "mad", + "smiley" + ], + "moji": "🤐" + }, + "zzz": { + "unicode": "1F4A4", + "unicode_alternates": [], + "name": "sleeping symbol", + "shortname": ":zzz:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "sleepy", + "tired", + "goodnight" + ], + "moji": "💤" + } +} diff --git a/doc/gitlab.nvim.txt b/doc/gitlab.nvim.txt index 54bcb87..24a9652 100644 --- a/doc/gitlab.nvim.txt +++ b/doc/gitlab.nvim.txt @@ -14,6 +14,7 @@ Table of Contents *gitlab.nvim.table-of-contents* - Discussions and Notes |gitlab.nvim.discussions-and-notes| - Labels |gitlab.nvim.labels| - Signs and diagnostics |gitlab.nvim.signs-and-diagnostics| + - Emojis gitlab.nvim.emojis - Uploading Files |gitlab.nvim.uploading-files| - MR Approvals |gitlab.nvim.mr-approvals| - Merging an MR |gitlab.nvim.merging-an-mr| @@ -425,6 +426,14 @@ of diagnostic, where the `discussion_sign.text` is shown, otherwise `vim.diagnostic.show` and `move_to_discussion_tree_from_diagnostic` will not work. +EMOJIS *gitlab.nvim.emojis* + +You can add or remove emojis from a note or comment in the discussion tree. + +To see who has reacted with an emoji, hover over the emoji. A popup will +appear with anyone who has responded with that emoji. You can only delete +emojis that you have responded with. + UPLOADING FILES *gitlab.nvim.uploading-files* diff --git a/lua/gitlab/actions/discussions/annotations.lua b/lua/gitlab/actions/discussions/annotations.lua index 163d36c..341a57c 100644 --- a/lua/gitlab/actions/discussions/annotations.lua +++ b/lua/gitlab/actions/discussions/annotations.lua @@ -66,6 +66,18 @@ ---@field discussions Discussion[] ---@field unlinked_discussions UnlinkedDiscussion[] +---@class EmojiMap: table +---@class Emoji +---@field unicode string +---@field unicodeAlternates string[] +---@field name string +---@field shortname string +---@field category string +---@field aliases string[] +---@field aliasesASCII string[] +---@field keywords string[] +---@field moji string + ---@class WinbarTable ---@field name string ---@field resolvable_discussions number diff --git a/lua/gitlab/actions/discussions/init.lua b/lua/gitlab/actions/discussions/init.lua index ed3a0bc..92b3c1d 100644 --- a/lua/gitlab/actions/discussions/init.lua +++ b/lua/gitlab/actions/discussions/init.lua @@ -14,6 +14,7 @@ local discussions_tree = require("gitlab.actions.discussions.tree") local signs = require("gitlab.actions.discussions.signs") local winbar = require("gitlab.actions.discussions.winbar") local help = require("gitlab.actions.help") +local emoji = require("gitlab.emoji") local M = { split_visible = false, @@ -24,6 +25,8 @@ local M = { discussions = {}, ---@type UnlinkedDiscussion[] unlinked_discussions = {}, + ---@type EmojiMap + emojis = {}, ---@type number linked_bufnr = nil, ---@type number @@ -40,6 +43,7 @@ M.load_discussions = function(callback) job.run_job("/mr/discussions/list", "POST", { blacklist = state.settings.discussion_tree.blacklist }, function(data) M.discussions = data.discussions ~= vim.NIL and data.discussions or {} M.unlinked_discussions = data.unlinked_discussions ~= vim.NIL and data.unlinked_discussions or {} + M.emojis = data.emojis or {} if type(callback) == "function" then callback(data) end @@ -100,7 +104,7 @@ M.toggle = function(callback) M.load_discussions(function() if type(M.discussions) ~= "table" and type(M.unlinked_discussions) ~= "table" then - vim.notify("No discussions or notes for this MR", vim.log.levels.WARN) + u.notify("No discussions or notes for this MR", vim.log.levels.WARN) vim.api.nvim_buf_set_lines(split.bufnr, 0, -1, false, { "" }) return end @@ -159,7 +163,7 @@ M.move_to_discussion_tree = function() local discussion_id = diagnostic.user_data.discussion_id local discussion_node, line_number = M.discussion_tree:get_node("-" .. discussion_id) if discussion_node == {} or discussion_node == nil then - vim.notify("Discussion not found", vim.log.levels.WARN) + u.notify("Discussion not found", vim.log.levels.WARN) return end if not discussion_node:is_expanded() then @@ -181,7 +185,7 @@ M.move_to_discussion_tree = function() end if #diagnostics == 0 then - vim.notify("No diagnostics for this line", vim.log.levels.WARN) + u.notify("No diagnostics for this line", vim.log.levels.WARN) return elseif #diagnostics > 1 then vim.ui.select(diagnostics, { @@ -479,7 +483,6 @@ local function nui_tree_prepare_node(node) end local texts = node.text - if type(node.text) ~= "table" or node.text.content then texts = { node.text } end @@ -502,6 +505,24 @@ local function nui_tree_prepare_node(node) line:append(text, node.text_hl) + local note_id = tostring(node.is_root and node.root_note_id or node.id) + + local e = require("gitlab.emoji") + + ---@type Emoji[] + local emojis = M.emojis[note_id] + local placed_emojis = {} + if emojis ~= nil then + for _, v in ipairs(emojis) do + local icon = e.emoji_map[v.name] + if icon ~= nil and not u.contains(placed_emojis, icon.moji) then + line:append(" ") + line:append(icon.moji) + table.insert(placed_emojis, icon.moji) + end + end + end + table.insert(lines, line) end @@ -689,7 +710,15 @@ M.set_tree_keymaps = function(tree, bufnr, unlinked) end, { buffer = bufnr, desc = "Open the note in your browser" }) vim.keymap.set("n", "p", function() M.print_node(tree) - end, { buffer = bufnr, desc = "dev_ Print current node (for debugging)" }) + end, { buffer = bufnr, desc = "Print current node (for debugging)" }) + vim.keymap.set("n", state.settings.discussion_tree.add_emoji, function() + M.add_emoji_to_note(tree, unlinked) + end, { buffer = bufnr, desc = "Add an emoji reaction to the note/comment" }) + vim.keymap.set("n", state.settings.discussion_tree.delete_emoji, function() + M.delete_emoji_from_note(tree, unlinked) + end, { buffer = bufnr, desc = "Remove an emoji reaction from the note/comment" }) + + emoji.init_popup(tree, bufnr) end M.redraw_resolved_status = function(tree, note, mark_resolved) @@ -829,6 +858,76 @@ M.open_in_browser = function(tree) u.open_in_browser(url) end +M.add_emoji_to_note = function(tree, unlinked) + local node = tree:get_node() + local note_node = M.get_note_node(tree, node) + local root_node = M.get_root_node(tree, node) + local note_id = tonumber(note_node.is_root and root_node.root_note_id or note_node.id) + local note_id_str = tostring(note_id) + local emojis = require("gitlab.emoji").emoji_list + emoji.pick_emoji(emojis, function(name) + local body = { emoji = name, note_id = note_id } + job.run_job("/mr/awardable/note/", "POST", body, function(data) + if M.emojis[note_id_str] == nil then + M.emojis[note_id_str] = {} + table.insert(M.emojis[note_id_str], data.Emoji) + else + table.insert(M.emojis[note_id_str], data.Emoji) + end + if unlinked then + M.rebuild_unlinked_discussion_tree() + else + M.rebuild_discussion_tree() + end + u.notify("Emoji added", vim.log.levels.INFO) + end) + end) +end + +M.delete_emoji_from_note = function(tree, unlinked) + local node = tree:get_node() + local note_node = M.get_note_node(tree, node) + local root_node = M.get_root_node(tree, node) + local note_id = tonumber(note_node.is_root and root_node.root_note_id or note_node.id) + local note_id_str = tostring(note_id) + + local e = require("gitlab.emoji") + + local emojis = {} + local current_emojis = M.emojis[note_id_str] + for _, current_emoji in ipairs(current_emojis) do + if state.USER.id == current_emoji.user.id then + table.insert(emojis, e.emoji_map[current_emoji.name]) + end + end + + emoji.pick_emoji(emojis, function(name) + local awardable_id + for _, current_emoji in ipairs(current_emojis) do + if current_emoji.name == name and current_emoji.user.id == state.USER.id then + awardable_id = current_emoji.id + break + end + end + job.run_job(string.format("/mr/awardable/note/%d/%d", note_id, awardable_id), "DELETE", nil, function(_) + local keep = {} -- Emojis to keep after deletion in the UI + for _, saved in ipairs(M.emojis[note_id_str]) do + if saved.name ~= name or saved.user.id ~= state.USER.id then + table.insert(keep, saved) + end + end + M.emojis[note_id_str] = keep + if unlinked then + M.rebuild_unlinked_discussion_tree() + else + M.rebuild_discussion_tree() + end + e.init_popup(tree, unlinked and M.unlinked_bufnr or M.linked_bufnr) + u.notify("Emoji removed", vim.log.levels.INFO) + end) + end) +end + -- For developers! M.print_node = function(tree) local current_node = tree:get_node() diff --git a/lua/gitlab/actions/discussions/signs.lua b/lua/gitlab/actions/discussions/signs.lua index 142a5f9..e1c5747 100644 --- a/lua/gitlab/actions/discussions/signs.lua +++ b/lua/gitlab/actions/discussions/signs.lua @@ -267,7 +267,6 @@ M.parse_signs_from_discussions = function(discussions) start_line = start_old_line end_line = end_old_line else - vim.print(start_type == "") return {}, {}, string.format("Unsupported line range type found for discussion %s", discussion.id) end diff --git a/lua/gitlab/actions/summary.lua b/lua/gitlab/actions/summary.lua index 0a678e2..55cb87a 100644 --- a/lua/gitlab/actions/summary.lua +++ b/lua/gitlab/actions/summary.lua @@ -245,7 +245,6 @@ M.color_labels = function(bufnr) for i, v in ipairs(state.settings.info.fields) do if v == "labels" then local line_content = u.get_line_content(bufnr, i) - vim.print(line_content) for j, label in ipairs(state.LABELS) do local start_idx, end_idx = line_content:find(label.Name) if start_idx ~= nil and end_idx ~= nil then diff --git a/lua/gitlab/emoji.lua b/lua/gitlab/emoji.lua new file mode 100644 index 0000000..617ffab --- /dev/null +++ b/lua/gitlab/emoji.lua @@ -0,0 +1,140 @@ +local u = require("gitlab.utils") +local state = require("gitlab.state") + +local M = { + ---@type EmojiMap|nil + emoji_map = {}, + ---@type Emoji[] + emoji_list = {}, +} + +M.init = function() + local bin_path = state.settings.bin_path + local emoji_path = bin_path + .. state.settings.file_separator + .. "config" + .. state.settings.file_separator + .. "emojis.json" + local emojis = u.read_file(emoji_path) + if emojis == nil then + u.notify("Could not read emoji file at " .. emoji_path, vim.log.levels.WARN) + end + + local data_ok, data = pcall(vim.json.decode, emojis) + if not data_ok then + u.notify("Could not parse emoji file at " .. emoji_path, vim.log.levels.WARN) + end + + M.emoji_map = data + M.emoji_list = {} + for _, v in pairs(M.emoji_map) do + table.insert(M.emoji_list, v) + end +end + +-- Define the popup window options +M.popup_opts = { + relative = "cursor", + row = -2, + col = 0, + width = 2, -- Width set dynamically later + height = 1, + style = "minimal", + border = "single", +} + +M.show_popup = function(char) + -- Close existing popup if it's open + if M.popup_win_id and vim.api.nvim_win_is_valid(M.popup_win_id) then + vim.api.nvim_win_close(M.popup_win_id, true) + end + + -- Create a buffer for the popup window + local buf = vim.api.nvim_create_buf(false, true) + + -- Set the content of the popup buffer to the character + vim.api.nvim_buf_set_lines(buf, 0, -1, false, { char }) + + -- Open the popup window and store its ID + M.popup_win_id = vim.api.nvim_open_win(buf, false, M.popup_opts) +end + +M.close_popup = function() + if M.popup_win_id and vim.api.nvim_win_is_valid(M.popup_win_id) then + vim.api.nvim_win_close(M.popup_win_id, true) + M.popup_win_id = nil -- Reset the window ID + end +end + +M.init_popup = function(tree, bufnr) + vim.api.nvim_create_autocmd({ "CursorHold" }, { + callback = function() + local node = tree:get_node() + if node == nil then + return + end + + local note_node = require("gitlab.actions.discussions").get_note_node(tree, node) + local root_node = require("gitlab.actions.discussions").get_root_node(tree, node) + local note_id_str = tostring(note_node.is_root and root_node.root_note_id or note_node.id) + + local emojis = require("gitlab.actions.discussions").emojis + local note_emojis = emojis[note_id_str] + if note_emojis == nil then + return + end + + local cursor_pos = vim.api.nvim_win_get_cursor(0) + vim.api.nvim_command('normal! "zyiw') + vim.api.nvim_win_set_cursor(0, cursor_pos) + local word = vim.fn.getreg("z") + + for k, v in pairs(M.emoji_map) do + if v.moji == word then + local names = M.get_users_who_reacted_with_emoji(k, note_emojis) + M.popup_opts.width = string.len(names) + if M.popup_opts.width > 0 then + M.show_popup(names) + end + end + end + end, + buffer = bufnr, + }) + + vim.api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI" }, { + callback = function() + M.close_popup() + end, + buffer = bufnr, + }) +end + +---@param name string +---@return string +M.get_users_who_reacted_with_emoji = function(name, note_emojis) + local result = "" + for _, v in pairs(note_emojis) do + if v.name == name then + result = result .. v.user.name .. ", " + end + end + return string.len(result) > 3 and result:sub(1, -3) or result +end + +M.pick_emoji = function(options, cb) + vim.ui.select(options, { + prompt = "Choose emoji", + format_item = function(val) + return string.format("%s %s", val.moji, val.name) + end, + }, function(choice) + if not choice then + return + end + local name = choice.shortname:sub(2, -2) + cb(name, choice) + end) +end + +return M diff --git a/lua/gitlab/hover.lua b/lua/gitlab/hover.lua new file mode 100644 index 0000000..57c2edf --- /dev/null +++ b/lua/gitlab/hover.lua @@ -0,0 +1,78 @@ +local M = {} + +M.show_popup = function(char) + -- Close existing popup if it's open + if M.popup_win_id and vim.api.nvim_win_is_valid(M.popup_win_id) then + vim.api.nvim_win_close(M.popup_win_id, true) + end + + -- Create a buffer for the popup window + local buf = vim.api.nvim_create_buf(false, true) + + -- Set the content of the popup buffer to the character + vim.api.nvim_buf_set_lines(buf, 0, -1, false, { char }) + + -- Define the popup window options + local opts = { + relative = "cursor", + row = -2, + col = 0, + width = 2, -- Width set to 2 to accommodate the border + height = 1, + style = "minimal", + border = "single", + } + + -- Open the popup window and store its ID + M.popup_win_id = vim.api.nvim_open_win(buf, false, opts) +end + +M.close_popup = function() + if M.popup_win_id and vim.api.nvim_win_is_valid(M.popup_win_id) then + vim.api.nvim_win_close(M.popup_win_id, true) + M.popup_win_id = nil -- Reset the window ID + end +end + +M.init = function() + -- Set up autocommands + vim.api.nvim_create_autocmd({ "CursorHold" }, { + callback = function() + -- Get the current cursor position + local row, col = unpack(vim.api.nvim_win_get_cursor(0)) + row = row - 1 -- Adjust row because Lua is 1-indexed + col = col - 2 -- Adjust to account for > at front of line + + if col < 1 then + return + end + + -- Get the text of the current line + local line = vim.api.nvim_buf_get_lines(0, row, row + 1, false)[1] + + -- Correctly handle multi-byte characters, such as emojis + local byteIndexStart = vim.str_byteindex(line, col) + local byteIndexEnd = vim.str_byteindex(line, col + 1) + + -- Extract the character (or emoji) under the cursor + local char = line:sub(byteIndexStart + 1, byteIndexEnd) + + -- Proceed only if char is not empty (to avoid empty popups) + if char == "" then + return + end + + M.show_popup(char) + end, + buffer = vim.api.nvim_get_current_buf(), + }) + + vim.api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI" }, { + callback = function() + M.close_popup() + end, + buffer = vim.api.nvim_get_current_buf(), + }) +end + +return M diff --git a/lua/gitlab/init.lua b/lua/gitlab/init.lua index c521c5f..ab91d9d 100644 --- a/lua/gitlab/init.lua +++ b/lua/gitlab/init.lua @@ -1,6 +1,7 @@ local u = require("gitlab.utils") local async = require("gitlab.async") local server = require("gitlab.server") +local emoji = require("gitlab.emoji") local state = require("gitlab.state") local reviewer = require("gitlab.reviewer") local discussions = require("gitlab.actions.discussions") @@ -13,6 +14,7 @@ local create_mr = require("gitlab.actions.create_mr") local approvals = require("gitlab.actions.approvals") local labels = require("gitlab.actions.labels") +local user = state.dependencies.user local info = state.dependencies.info local labels_dep = state.dependencies.labels local project_members = state.dependencies.project_members @@ -28,6 +30,7 @@ return { require("gitlab.colors") -- Sets colors reviewer.init() discussions.initialize_discussions() -- place signs / diagnostics for discussions in reviewer + emoji.init() -- Read in emojis for lookup purposes end, -- Global Actions 🌎 summary = async.sequence({ u.merge(info, { refresh = true }), labels_dep }, summary.summary), @@ -45,7 +48,7 @@ return { move_to_discussion_tree_from_diagnostic = async.sequence({}, discussions.move_to_discussion_tree), create_note = async.sequence({ info }, comment.create_note), create_mr = async.sequence({}, create_mr.start), - review = async.sequence({ u.merge(info, { refresh = true }), revisions }, function() + review = async.sequence({ u.merge(info, { refresh = true }), revisions, user }, function() reviewer.open() end), close_review = function() @@ -54,7 +57,7 @@ return { pipeline = async.sequence({ info }, pipeline.open), merge = async.sequence({ u.merge(info, { refresh = true }) }, merge.merge), -- Discussion Tree Actions 🌴 - toggle_discussions = async.sequence({ info }, discussions.toggle), + toggle_discussions = async.sequence({ info, user }, discussions.toggle), edit_comment = async.sequence({ info }, discussions.edit_comment), delete_comment = async.sequence({ info }, discussions.delete_comment), toggle_resolved = async.sequence({ info }, discussions.toggle_discussion_resolved), diff --git a/lua/gitlab/state.lua b/lua/gitlab/state.lua index 3c59c17..0cd3f23 100644 --- a/lua/gitlab/state.lua +++ b/lua/gitlab/state.lua @@ -6,6 +6,8 @@ local u = require("gitlab.utils") local M = {} +M.emoji_map = nil + -- These are the default settings for the plugin M.settings = { port = nil, -- choose random port @@ -49,6 +51,8 @@ M.settings = { open_in_browser = "b", reply = "r", toggle_node = "t", + add_emoji = "Ea", + delete_emoji = "Ed", toggle_all_discussions = "T", toggle_resolved_discussions = "R", toggle_unresolved_discussions = "U", @@ -311,6 +315,7 @@ end -- for each of the actions to occur. This is necessary because some Gitlab behaviors (like -- adding a reviewer) requires some initial state. M.dependencies = { + user = { endpoint = "/users/me", key = "user", state = "USER", refresh = false }, info = { endpoint = "/mr/info", key = "info", state = "INFO", refresh = false }, labels = { endpoint = "/mr/label", key = "labels", state = "LABELS", refresh = false }, revisions = { endpoint = "/mr/revisions", key = "Revisions", state = "MR_REVISIONS", refresh = false }, diff --git a/lua/gitlab/utils/init.lua b/lua/gitlab/utils/init.lua index 78c7be9..30d95f8 100644 --- a/lua/gitlab/utils/init.lua +++ b/lua/gitlab/utils/init.lua @@ -38,6 +38,15 @@ M.filter = function(input_table, value_to_remove) return resultTable end +M.filter_by_key_value = function(input_table, target_key, target_value) + local result_table = {} + for _, v in ipairs(input_table) do + if v[target_key] ~= target_value then + table.insert(result_table, v) + end + end +end + ---Merges two deeply nested tables together, overriding values from the first with conflicts ---@param defaults table The first table ---@param overrides table The second table