about summary refs log tree commit diff
path: root/configs/shared/emacs/.emacs.d/elpa/slack-20180712.2222/slack-message-sender.el
diff options
context:
space:
mode:
Diffstat (limited to 'configs/shared/emacs/.emacs.d/elpa/slack-20180712.2222/slack-message-sender.el')
-rw-r--r--configs/shared/emacs/.emacs.d/elpa/slack-20180712.2222/slack-message-sender.el169
1 files changed, 169 insertions, 0 deletions
diff --git a/configs/shared/emacs/.emacs.d/elpa/slack-20180712.2222/slack-message-sender.el b/configs/shared/emacs/.emacs.d/elpa/slack-20180712.2222/slack-message-sender.el
new file mode 100644
index 000000000000..9896c4316579
--- /dev/null
+++ b/configs/shared/emacs/.emacs.d/elpa/slack-20180712.2222/slack-message-sender.el
@@ -0,0 +1,169 @@
+;;; slack-message-sender.el --- slack message concern message sending  -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2015  yuya.minami
+
+;; Author: yuya.minami <yuya.minami@yuyaminami-no-MacBook-Pro.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 'eieio)
+(require 'json)
+(require 'slack-util)
+(require 'slack-websocket)
+(require 'slack-room)
+(require 'slack-im)
+(require 'slack-group)
+(require 'slack-message)
+(require 'slack-channel)
+(require 'slack-slash-commands)
+
+(defvar slack-message-minibuffer-local-map nil)
+(defvar slack-buffer-function)
+
+(defun slack-message-send ()
+  (interactive)
+  (slack-message--send (slack-message-read-from-minibuffer)))
+
+(defun slack-message-inc-id (team)
+  (with-slots (message-id) team
+    (if (eq message-id (1- most-positive-fixnum))
+        (setq message-id 1)
+      (cl-incf message-id))))
+
+(defun slack-escape-message (message)
+  "Escape '<,' '>' & '&' in MESSAGE."
+  (replace-regexp-in-string
+   ">" "&gt;"
+   (replace-regexp-in-string
+    "<" "&lt;"
+    (replace-regexp-in-string "&" "&amp;" message))))
+
+(defun slack-link-users (message team)
+  "Add links to all references to valid users in MESSAGE."
+  (replace-regexp-in-string
+   "@\\<\\([A-Za-z0-9._\-]+\\)\\>"
+   #'(lambda (text)
+       (let* ((username (match-string 1 text))
+              (id (slack-user-get-id username team)))
+         (if id
+             (format "<@%s|%s>" id username)
+           (cond
+            ((string= username "here") "<!here|here>")
+            ((cl-find username '("channel" "group") :test #'string=) "<!channel>")
+            ((string= username "everyone") "<!everyone>")
+            (t text)))))
+   message t))
+
+(defun slack-link-channels (message team)
+  "Add links to all references to valid channels in MESSAGE."
+  (let ((channel-ids
+         (mapcar #'(lambda (x)
+                     (let ((channel (cdr x)))
+                       (cons (slack-room-name channel) (slot-value channel 'id))))
+                 (slack-channel-names team))))
+    (replace-regexp-in-string
+     "#\\<\\([A-Za-z0-9_\-]+\\)\\>"
+     #'(lambda (text)
+         (let* ((channel (match-string 1 text))
+                (id (cdr (assoc channel channel-ids))))
+           (if id
+               (format "<#%s|%s>" id channel)
+             text)))
+     message t)))
+
+(defun slack-message-prepare-links (message team)
+  (slack-link-channels (slack-link-users message team) team))
+
+(defun slack-message--send (message)
+  (slack-if-let* ((buf slack-current-buffer))
+      (slack-if-let* ((command (slack-slash-commands-parse message)))
+          (slack-buffer-execute-slash-command buf command)
+        (slack-buffer-send-message buf message))))
+
+(defun slack-message-send-internal (message channel-id team)
+  (slack-message-inc-id team)
+  (with-slots (message-id sent-message self-id) team
+    (let* ((m (list :id message-id
+                    :channel channel-id
+                    :type "message"
+                    :user self-id
+                    :text (slack-message-prepare-links
+                           (slack-escape-message message)
+                           team)))
+           (json (json-encode m))
+           (obj (slack-message-create m team)))
+      (slack-ws-send json team)
+      (puthash message-id obj sent-message))))
+
+(defun slack-message-read-room (team)
+  (let* ((list (slack-message-room-list team))
+         (choices (mapcar #'car list))
+         (room-name (slack-message-read-room-list "Select Room: " choices))
+         (room (cdr (cl-assoc room-name list :test #'string=))))
+    room))
+
+(defun slack-message-read-room-list (prompt choices)
+  (let ((completion-ignore-case t))
+    (funcall slack-completing-read-function (format "%s" prompt)
+             choices nil t nil nil choices)))
+
+(defun slack-message-room-list (team)
+  (append (slack-group-names team)
+          (slack-im-names team)
+          (slack-channel-names team)))
+
+(defun slack-message-read-from-minibuffer ()
+  (let ((prompt "Message: "))
+    (slack-message-setup-minibuffer-keymap)
+    (read-from-minibuffer
+     prompt
+     nil
+     slack-message-minibuffer-local-map)))
+
+(defun slack-message-setup-minibuffer-keymap ()
+  (unless slack-message-minibuffer-local-map
+    (setq slack-message-minibuffer-local-map
+          (let ((map (make-sparse-keymap)))
+            (define-key map (kbd "RET") 'newline)
+            (set-keymap-parent map minibuffer-local-map)
+            map))))
+
+(defun slack-message-embed-channel ()
+  (interactive)
+  (slack-if-let* ((buf slack-current-buffer))
+      (with-slots (team) buf
+        (slack-select-from-list
+            ((slack-channel-names team) "Select Channel: ")
+            (insert (concat "#" (slack-room-name selected)))))))
+
+(defun slack-message-embed-mention ()
+  (interactive)
+  (slack-if-let* ((buf slack-current-buffer))
+      (with-slots (team) buf
+        (let* ((pre-defined (list (list "here" :name "here")
+                                  (list "channel" :name "channel")))
+               (alist (append pre-defined (slack-user-names team))))
+          (slack-select-from-list
+              (alist "Select User: ")
+              (insert (concat "@" (plist-get selected :name))))))))
+
+(provide 'slack-message-sender)
+;;; slack-message-sender.el ends here