about summary refs log tree commit diff
path: root/configs/shared/emacs/.emacs.d/elpa/slack-20180913.651/slack-conversations.el
diff options
context:
space:
mode:
Diffstat (limited to 'configs/shared/emacs/.emacs.d/elpa/slack-20180913.651/slack-conversations.el')
-rw-r--r--configs/shared/emacs/.emacs.d/elpa/slack-20180913.651/slack-conversations.el278
1 files changed, 278 insertions, 0 deletions
diff --git a/configs/shared/emacs/.emacs.d/elpa/slack-20180913.651/slack-conversations.el b/configs/shared/emacs/.emacs.d/elpa/slack-20180913.651/slack-conversations.el
new file mode 100644
index 000000000000..f752d0c14783
--- /dev/null
+++ b/configs/shared/emacs/.emacs.d/elpa/slack-20180913.651/slack-conversations.el
@@ -0,0 +1,278 @@
+;;; slack-conversations.el ---                       -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2018
+
+;; Author:  <yuya373@yuya373>
+;; 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 <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+(require 'slack-request)
+(require 'slack-room)
+
+(defconst slack-conversations-archive-url
+  "https://slack.com/api/conversations.archive")
+(defconst slack-conversations-invite-url
+  "https://slack.com/api/conversations.invite")
+(defconst slack-conversations-join-url
+  "https://slack.com/api/conversations.join")
+(defconst slack-conversations-leave-url
+  "https://slack.com/api/conversations.leave")
+(defconst slack-conversations-rename-url
+  "https://slack.com/api/conversations.rename")
+(defconst slack-conversations-set-purpose-url
+  "https://slack.com/api/conversations.setPurpose")
+(defconst slack-conversations-set-topic-url
+  "https://slack.com/api/conversations.setTopic")
+(defconst slack-conversations-members-url
+  "https://slack.com/api/conversations.members")
+(defconst slack-conversations-kick-url
+  "https://slack.com/api/conversations.kick")
+
+(cl-defun slack-conversations-success-handler (team &key on-errors on-success)
+  (cl-function
+   (lambda (&key data &allow-other-keys)
+     (cl-labels
+         ((replace-underscore-with-space (s)
+                                         (replace-regexp-in-string "_"
+                                                                   " "
+                                                                   s))
+          (log-error
+           (_)
+           (slack-if-let*
+               ((err (plist-get data :error))
+                (message (format "%s"
+                                 (replace-underscore-with-space
+                                  err))))
+               (slack-log message team :level 'error))
+           (slack-if-let*
+               ((errors (plist-get data :errors))
+                (has-handler (functionp on-errors)))
+               (funcall on-errors errors))))
+       (slack-request-handle-error
+        (data "conversations" #'log-error)
+        (slack-if-let* ((warning (plist-get data :warning)))
+            (slack-log (format "%s" (replace-underscore-with-space
+                                     warning))
+                       team
+                       :level 'warn)
+          (when (functionp on-success)
+            (funcall on-success data))))))))
+
+(defun slack-conversations-archive (room team)
+  (let ((id (oref room id)))
+    (slack-request
+     (slack-request-create
+      slack-conversations-archive-url
+      team
+      :type "POST"
+      :params (list (cons "channel" id))
+      :success (slack-conversations-success-handler team)))))
+
+(defun slack-conversations-invite (room team)
+  (let* ((channel (oref room id))
+         (user-names (slack-user-names team))
+         (users nil))
+    (cl-labels
+        ((already-selected-p
+          (user-name)
+          (cl-find-if #'(lambda (e)
+                          (string= e
+                                   (plist-get (cdr user-name)
+                                              :id)))
+                      users))
+         (filter-selected (user-names)
+                          (cl-remove-if #'already-selected-p
+                                        user-names)))
+      (cl-loop for i from 1 upto 30
+               as candidates = (filter-selected user-names)
+               as selected = (slack-select-from-list
+                                 (candidates "Select User: "))
+               while selected
+               do (push (plist-get selected :id) users)))
+    (setq users (mapconcat #'identity users ","))
+
+    (cl-labels
+        ((errors-handler
+          (errors)
+          (let ((message
+                 (mapconcat #'(lambda (err)
+                                (let ((msg (plist-get err :error))
+                                      (user (plist-get err :user)))
+                                  (format "%s%s"
+                                          (replace-regexp-in-string "_" " " msg)
+                                          (or (and user (format ": %s" user))
+                                              ""))))
+                            errors
+                            ", ")))
+            (slack-log message team :level 'error))))
+      (slack-request
+       (slack-request-create
+        slack-conversations-invite-url
+        team
+        :type "POST"
+        :params (list (cons "channel" channel)
+                      (cons "users" users))
+        :success (slack-conversations-success-handler team
+                                                      :on-errors
+                                                      #'errors-handler))))))
+
+(defun slack-conversations-join (room team)
+  (let ((channel (oref room id)))
+    (slack-request
+     (slack-request-create
+      slack-conversations-join-url
+      team
+      :type "POST"
+      :params (list (cons "channel" channel))
+      :success (slack-conversations-success-handler team)))))
+
+(defun slack-conversations-leave (room team)
+  (let ((channel (oref room id)))
+    (slack-request
+     (slack-request-create
+      slack-conversations-leave-url
+      team
+      :type "POST"
+      :params (list (cons "channel" channel))
+      :success (slack-conversations-success-handler team)))))
+
+(defun slack-conversations-rename (room team)
+  (let ((channel (oref room id))
+        (name (read-from-minibuffer "Name: ")))
+    (slack-request
+     (slack-request-create
+      slack-conversations-rename-url
+      team
+      :type "POST"
+      :params (list (cons "channel" channel)
+                    (cons "name" name))
+      :success (slack-conversations-success-handler team)))))
+
+(defun slack-conversations-set-purpose (room team)
+  (let ((channel (oref room id))
+        (purpose (read-from-minibuffer "Purpose: ")))
+    (cl-labels
+        ((on-success (data)
+                     (let* ((channel (plist-get data :channel))
+                            (purpose (plist-get channel :purpose)))
+                       (oset room purpose purpose))))
+      (slack-request
+       (slack-request-create
+        slack-conversations-set-purpose-url
+        team
+        :type "POST"
+        :params (list (cons "channel" channel)
+                      (cons "purpose" purpose))
+        :success (slack-conversations-success-handler team
+                                                      :on-success
+                                                      #'on-success))))))
+
+(defun slack-conversations-set-topic (room team)
+  (let ((channel (oref room id))
+        (topic (read-from-minibuffer "Topic: ")))
+    (cl-labels
+        ((on-success (data)
+                     (let* ((channel (plist-get data :channel))
+                            (topic (plist-get channel :topic)))
+                       (oset room topic topic))))
+      (slack-request
+       (slack-request-create
+        slack-conversations-set-topic-url
+        team
+        :type "POST"
+        :params (list (cons "channel" channel)
+                      (cons "topic" topic))
+        :success (slack-conversations-success-handler team
+                                                      :on-success
+                                                      #'on-success))))))
+
+(defun slack-conversations-members (room team &optional cursor after-success)
+  (let ((channel (oref room id)))
+    (cl-labels
+        ((build-users
+          (members)
+          (cl-remove-if-not #'(lambda (user-name)
+                                (cl-find (plist-get (cdr user-name)
+                                                    :id)
+                                         members
+                                         :test #'string=))
+                            (slack-user-names team)))
+         (on-success
+          (&key data &allow-other-keys)
+          (slack-request-handle-error
+           (data "slack-conversations-membe")
+           (let* ((members (plist-get data :members))
+                  (meta (plist-get data :response_metadata))
+                  (next-cursor (plist-get meta :next_cursor)))
+             (when (functionp after-success)
+               (funcall after-success
+                        (build-users members)
+                        next-cursor))))))
+      (slack-request
+       (slack-request-create
+        slack-conversations-members-url
+        team
+        :type "GET"
+        :sync t
+        :params (list (cons "channel" channel)
+                      (and cursor (cons "cursor" cursor))
+                      ;; (cons "limit" "1")
+                      )
+        :success #'on-success)))))
+
+(defun slack-conversations-kick (room team)
+  (let ((channel (oref room id))
+        (cursor nil)
+        (user nil)
+        (candidates nil))
+    (cl-labels
+        ((on-member-success (members next-cursor)
+                            (setq candidates members)
+                            (setq cursor next-cursor))
+         (select-member (candidates)
+                        (funcall #'completing-read
+                                 "Select User: " candidates)))
+      (while (not user)
+        (slack-conversations-members room
+                                     team
+                                     cursor
+                                     #'on-member-success)
+        (let ((selected (cl-assoc (select-member (or (and (< 0 (length cursor))
+                                                          (append candidates
+                                                                  (cons "Next page"
+                                                                        'next-page)))
+                                                     candidates))
+                                  candidates
+                                  :test #'string=)))
+          (when selected
+            (unless (eq 'next-page (cdr selected))
+              (setq user (plist-get (cdr selected) :id))))))
+
+      (slack-request
+       (slack-request-create
+        slack-conversations-kick-url
+        team
+        :type "POST"
+        :params (list (cons "channel" channel)
+                      (cons "user" user))
+        :success (slack-conversations-success-handler team))))))
+
+(provide 'slack-conversations)
+;;; slack-conversations.el ends here