about summary refs log blame commit diff
path: root/configs/shared/emacs/.emacs.d/elpa/slack-20180712.2222/slack-file-comment.el
blob: faeba0cdcdd730ed13bf6cb21029b258fc30f88f (plain) (tree)

















































































































































































































                                                                                             
;;; slack-file-comment.el ---                        -*- lexical-binding: t; -*-

;; Copyright (C) 2017

;; 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-util)
(require 'slack-message)
(require 'slack-file)

(define-derived-mode slack-edit-file-comment-mode
  fundamental-mode
  "Slack Edit File Comment"
  ""
  (slack-buffer-enable-emojify))

(defvar slack-edit-file-comment-mode-map
  (let ((keymap (make-sparse-keymap)))
    (define-key keymap (kbd "C-c C-c") #'slack-file-comment-edit-commit)
    keymap))

(defclass slack-file-comment (slack-user-message)
  ((id :initarg :id)
   (file-id :initarg :file_id :type string)
   (created :initarg :created)
   (timestamp :initarg :timestamp)
   (user :initarg :user)
   (is-intro :initarg :is_intro)
   (comment :initarg :comment)
   (channel :initarg :channel)
   (reactions :initarg :reactions type list)
   (is-starred :initarg :is_starred :type boolean :initform nil)))

(defclass slack-file-comment-message (slack-file-message)
  ((comment :initarg :comment :initform nil)))

(defclass slack-file-mention-message (slack-file-message)
  ((user :initarg :user :initform nil)))

(defmethod slack-reaction-delete ((this slack-file-comment) reaction)
  (with-slots (reactions) this
    (setq reactions
          (slack-reaction--delete reactions reaction))))

(defmethod slack-reaction-push ((this slack-file-comment) reaction)
  (push reaction (oref this reactions)))

(defmethod slack-reaction-find ((this slack-file-comment) reaction)
  (slack-reaction--find (oref this reactions) reaction))

(defmethod slack-message-reactions ((this slack-file-comment))
  (oref this reactions))

(defmethod slack-message-reaction-to-string ((m slack-file-comment) team)
  (let ((reactions (oref m reactions)))
    (when reactions
      (slack-format-reactions reactions team))))

(defmethod slack-equalp ((c slack-file-comment) other)
  (string= (oref c id) (oref other id)))

(defmethod slack-merge ((old slack-file-comment) new)
  (slack-merge-list (oref old reactions) (oref new reactions))
  (oset old comment (oref new comment)))

(defmethod slack-message-body ((comment slack-file-comment) team)
  (slack-message-unescape-string (oref comment comment) team))

(defmethod slack-message-to-string ((comment slack-file-comment) team)
  (let ((header (slack-message-header-to-string comment team))
        (body (slack-message-body-to-string comment team))
        (reactions (slack-message-reaction-to-string comment team)))
    (propertize (slack-format-message header body reactions)
                'file-comment-id (oref comment id))))

(defmethod slack-file-id ((file-comment slack-file-comment))
  (oref file-comment file-id))

(defmethod slack-message-star-added ((this slack-file-comment))
  (oset this is-starred t))

(defmethod slack-message-star-removed ((this slack-file-comment))
  (oset this is-starred nil))

(defmethod slack-message-star-api-params ((this slack-file-comment))
  (cons "file_comment" (oref this id)))

(defun slack-file-comment-edit-commit ()
  (interactive)
  (slack-if-let* ((buf slack-current-buffer)
            (message (buffer-substring-no-properties (point-min) (point-max))))
      (slack-buffer-send-message buf message)))

(defun slack-file-comment-process-star-api (url team)
  (slack-if-let* ((file-id slack-current-file-id)
            (file-comment-id (slack-get-file-comment-id)))
      (slack-with-file file-id team
        (slack-with-file-comment file-comment-id file
          (slack-message-star-api-request url
                                          (list (slack-message-star-api-params file-comment))
                                          team)))))

(defmethod slack-message-set-file-comment ((m slack-file-comment-message) payload)
  (let* ((file-id (plist-get (plist-get payload :file) :id))
         (comment (plist-get payload :comment))
         (file-comment (slack-file-comment-create comment file-id)))
    (oset m comment file-comment)
    m))

(defmethod slack-message-sender-name ((m slack-file-comment-message) team)
  (slack-user-name (oref (oref m comment) user) team))

(defmethod slack-message-sender-id ((m slack-file-comment-message))
  (oref (oref m comment) user))

(defmethod slack-message-star-added ((m slack-file-comment-message))
  (slack-message-star-added (oref m comment)))

(defmethod slack-message-star-removed ((m slack-file-comment-message))
  (slack-message-star-removed (oref m comment)))

(defmethod slack-message-star-api-params ((m slack-file-comment-message))
  (slack-message-star-api-params (oref m comment)))

(defmethod slack-reaction-delete ((this slack-file-comment-message) reaction)
  (slack-reaction-delete (oref this comment) reaction))

(defmethod slack-reaction-push ((this slack-file-comment-message) reaction)
  (slack-reaction-push (oref this comment) reaction))

(defmethod slack-reaction-find ((this slack-file-comment-message) reaction)
  (slack-reaction-find (oref this comment) reaction))

(defmethod slack-message-reactions ((this slack-file-comment-message))
  (slack-message-reactions (oref this comment)))

(defmethod slack-message-get-param-for-reaction ((m slack-file-comment-message))
  (cons "file_comment" (oref (oref m comment) id)))

(defmethod slack-file-id ((m slack-file-comment-message))
  (slack-file-id (oref m comment)))

(defmethod slack-message-starred-p ((m slack-file-comment-message))
  (oref (oref m comment) is-starred))

(defmethod slack-message-to-string ((this slack-file-comment-message) team)
  (with-slots (permalink name id page) (oref this file)
    (with-slots (comment) (oref this comment)
      (let* ((face '(:underline t))
             (text (format "commented on %s <%s|open in browser>\n%s"
                           (slack-file-link-info (oref (oref this file) id) name)
                           permalink
                           (format "“ %s" (slack-message-unescape-string comment
                                                                          team))))
             (header (slack-message-header-to-string this team))
             (reactions (slack-message-reaction-to-string this team)))
        (slack-format-message header text reactions)))))

(defmethod slack-message-get-user-id ((m slack-file-comment-message))
  (oref (oref m comment) user))

(defmethod slack-message-edit-type ((_m slack-file-comment-message))
  'edit-file-comment)

(defmethod slack-message-get-text ((m slack-file-comment-message))
  (oref (oref m comment) comment))

(defmethod slack-message-changed--copy ((this slack-file-comment-message) other)
  (when (slack-file-comment-message-p other)
    (let ((changed (call-next-method)))
      (with-slots ((old-comment comment) text) this
        (let ((new-comment (oref other comment)))
          (oset old-comment reactions (oref new-comment reactions))
          (unless (string= (oref old-comment comment) (oref new-comment comment))
            (oset old-comment comment (oref new-comment comment))
            (setq changed t))))
      changed)))

(defmethod slack-ts ((this slack-file-comment))
  (number-to-string (oref this timestamp)))

(defmethod slack-message-update ((this slack-file-comment) file team)
  (slack-if-let* ((buffer (slack-buffer-find 'slack-file-info-buffer
                                             file
                                             team)))
      (progn
        (oset buffer file file)
        (slack-buffer-update buffer (oref this id)))))

(provide 'slack-file-comment)
;;; slack-file-comment.el ends here