about summary refs log tree commit diff
path: root/configs/shared/emacs/.emacs.d/elpa/slack-20180913.651/slack-emoji.el
blob: baec1b03b86fac337b56cc4c803d3d741d276c9f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
;;; slack-emoji.el ---                               -*- lexical-binding: t; -*-

;; Copyright (C) 2017  南優也

;; Author: 南優也 <yuyaminami@minamiyuuya-no-MacBook.local>
;; Keywords:

;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <http://www.gnu.org/licenses/>.

;;; Commentary:

;;

;;; Code:
(require 'slack-request)

(defconst slack-emoji-list "https://slack.com/api/emoji.list")

(defun slack-emoji-watch-download-complete (team paths)
  (if (eq (length (cl-remove-if #'identity (mapcar #'file-exists-p paths)))
          0)
      (when (timerp (oref team emoji-download-watch-timer))
        (cancel-timer (oref team emoji-download-watch-timer))
        (oset team emoji-download-watch-timer nil)
        (emojify-create-emojify-emojis t))))

(defun slack-request-emoji (team)
  (if (require 'emojify nil t)
      (cl-labels
          ((handle-alias (name emojis)
                         (let* ((raw-url (plist-get emojis name))
                                (alias (if (string-prefix-p "alias:" raw-url)
                                           (intern (format ":%s" (cadr (split-string raw-url ":")))))))
                           (or (and alias (or (plist-get emojis alias)
                                              (let ((emoji (emojify-get-emoji (format "%s:" alias))))
                                                (if emoji
                                                    (concat (emojify-image-dir) "/" (gethash "image" emoji))))))
                               raw-url)))
           (push-new-emoji (emoji)
                           (cl-pushnew emoji emojify-user-emojis
                                       :test #'string=
                                       :key #'car))
           (on-success
            (&key data &allow-other-keys)
            (slack-request-handle-error
             (data "slack-request-emoji")
             (emojify-create-emojify-emojis)
             (let* ((emojis (plist-get data :emoji))
                    (names (cl-remove-if
                            #'(lambda (key) (not (plist-member emojis key)))
                            emojis))
                    (paths
                     (mapcar
                      #'(lambda (name)
                          (let* ((url (handle-alias name emojis))
                                 (path (if (file-exists-p url) url
                                         (slack-image-path url)))
                                 (emoji (cons (format "%s:" name)
                                              (list (cons "name" (substring (symbol-name name) 1))
                                                    (cons "image" path)
                                                    (cons "style" "github")))))
                            (if (file-exists-p path)
                                (push-new-emoji emoji)
                              (slack-url-copy-file
                               url
                               path
                               :success #'(lambda () (push-new-emoji emoji))))

                            path))
                      names)))

               (oset team
                     emoji-download-watch-timer
                     (run-with-idle-timer 5 t #'slack-emoji-watch-download-complete team paths))))))
        (slack-request
         (slack-request-create
          slack-emoji-list
          team
          :success #'on-success)))))

(provide 'slack-emoji)
;;; slack-emoji.el ends here