aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lisp/mastodon-notifications.el57
-rw-r--r--lisp/mastodon-tl.el34
-rw-r--r--lisp/mastodon-toot.el4
3 files changed, 75 insertions, 20 deletions
diff --git a/lisp/mastodon-notifications.el b/lisp/mastodon-notifications.el
index 747ab8b..f688f2d 100644
--- a/lisp/mastodon-notifications.el
+++ b/lisp/mastodon-notifications.el
@@ -92,7 +92,8 @@ make them unweildy."
(defvar mastodon-notifications--types
'("favourite" "reblog" "mention" "poll"
- "follow_request" "follow" "status" "update")
+ "follow_request" "follow" "status" "update"
+ "severed_relationships" "moderation_warning")
"A list of notification types according to their name on the server.")
(defvar mastodon-notifications--response-alist
@@ -210,6 +211,25 @@ JSON is a list of alists."
for x in ids
collect (mastodon-notifications--alist-by-value x 'id json)))
+(defun mastodon-notifications--severance-body (group)
+ "Return a body for a severance notification GROUP."
+ ;; FIXME: actually implement this when we encounter one in the wild!
+ (let-alist (alist-get 'event group)
+ (concat .description ": "
+ .target_name
+ "\nRelationships affected: "
+ .relationships_count)))
+
+(defun mastodon-notifications--mod-warning-body (group)
+ "Return a body for a moderation warning notification GROUP."
+ (let-alist (alist-get )
+ (concat .description ": "
+ .text
+ "\nStatuses: "
+ .status_ids
+ "\nfor account: "
+ .target_account)))
+
(defun mastodon-notifications--format-note (group status accounts)
"Format for a GROUP notification.
STATUS is the status's JSON.
@@ -258,6 +278,10 @@ ACCOUNTS is data of the accounts that have reacted to the notification."
(concat
":\n"
(mastodon-notifications--comment-note-text body)))))
+ ((eq type-sym 'severed_relationships)
+ (mastodon-notifications--severance-body group))
+ ((eq type-sym 'moderation_warning)
+ (mastodon-notifications--mod-warning-body group))
((member type-sym '(favourite reblog))
(propertize
(mastodon-notifications--comment-note-text body)))
@@ -341,6 +365,7 @@ ACCOUNTS is the notification accounts data."
'toot-folded (and toot-foldable (not unfolded))
;; grouped notifs data:
'notification-type type
+ 'notification-id (alist-get 'group_key group)
'notification-group group
'notification-accounts accounts
;; for pagination:
@@ -462,18 +487,36 @@ Status notifications are created when you call
(defun mastodon-notifications--clear-current ()
"Dismiss the notification at point."
(interactive)
- (let* ((id (or (mastodon-tl--property 'item-id)
- (mastodon-tl--field 'id
- (mastodon-tl--property 'item-json))))
- (response
- (mastodon-http--post (mastodon-http--api
- (format "notifications/%s/dismiss" id)))))
+ (let* ((id (or (or (mastodon-tl--property 'notification-id) ;; grouped
+ (mastodon-tl--property 'item-id)
+ (mastodon-tl--field
+ 'id
+ (mastodon-tl--property 'item-json)))))
+ (endpoint (mastodon-http--api
+ (format "notifications/%s/dismiss" id)
+ "v2"))
+ (response (mastodon-http--post endpoint)))
(mastodon-http--triage
response (lambda (_)
(when mastodon-tl--buffer-spec
(mastodon-tl--reload-timeline-or-profile))
(message "Notification dismissed!")))))
+(defun mastodon-notifications--get-single-notif ()
+ "Return a single notification JSON for v2 notifs."
+ (interactive)
+ (let* ((id (mastodon-tl--property
+ 'notification-id)) ;; grouped, doesn't work for ungrouped!
+ ;; (key (format "ungrouped-%s"
+ ;; (mastodon-tl--property 'item-id)))
+ (endpoint (mastodon-http--api
+ (format "notifications/%s" id)
+ "v2"))
+ (response (mastodon-http--get-json endpoint)))
+ (mastodon-http--triage
+ response (lambda (_)
+ (message "%s" (prin1-to-string response))))))
+
(defun mastodon-notifications--get-unread-count ()
"Return the number of unread notifications for the current account."
;; params: limit - max 1000, default 100, types[], exclude_types[], account_id
diff --git a/lisp/mastodon-tl.el b/lisp/mastodon-tl.el
index 1a4df7f..8be802e 100644
--- a/lisp/mastodon-tl.el
+++ b/lisp/mastodon-tl.el
@@ -590,6 +590,12 @@ With a double PREFIX arg, limit results to your own instance."
'mastodon-tl--timeline nil
params)))
+(defun mastodon-tl--announcements ()
+ "Display announcements from your instance."
+ (interactive)
+ (mastodon-tl--init "announcements" "announcements"
+ 'mastodon-tl--timeline nil nil nil nil :no-byline))
+
;;; BYLINES, etc.
@@ -814,7 +820,7 @@ ACCOUNT is the notification account if any."
;; all other toots, inc. boosts/faves in timelines:
;; (mastodon-tl--field auto fetches from reblogs if needed):
(mastodon-tl--field 'created_at toot))))
- (parsed-time (date-to-time created-time))
+ (parsed-time (when created-time (date-to-time created-time)))
(faved (eq t (mastodon-tl--field 'favourited toot)))
(boosted (eq t (mastodon-tl--field 'reblogged toot)))
(bookmarked (eq t (mastodon-tl--field 'bookmarked toot)))
@@ -1791,7 +1797,7 @@ NO-BYLINE means just insert toot body, used for folding."
#'mastodon-tl--byline-author #'mastodon-tl--byline-boost
nil nil detailed-p thread domain unfolded no-byline))))
-(defun mastodon-tl--timeline (toots &optional thread domain)
+(defun mastodon-tl--timeline (toots &optional thread domain no-byline)
"Display each toot in TOOTS.
This function removes replies if user required.
THREAD means the status will be displayed in a thread view.
@@ -1807,7 +1813,7 @@ When DOMAIN, force inclusion of user's domain in their handle."
(cl-remove-if-not #'mastodon-tl--is-reply toots)
toots))))
(mapc (lambda (toot)
- (mastodon-tl--toot toot nil thread domain))
+ (mastodon-tl--toot toot nil thread domain nil no-byline))
toots)
;; media:
(when mastodon-tl--display-media-p
@@ -2117,7 +2123,9 @@ call this function after it is set or use something else."
((string= "*masto-image*" (buffer-name))
'mastodon-image)
((mastodon-tl--endpoint-str-= "timelines/link")
- 'link-timeline))))
+ 'link-timeline)
+ ((mastodon-tl--endpoint-str-= "announcements")
+ 'announcements))))
(defun mastodon-tl--buffer-type-eq (type)
"Return t if current buffer type is equal to symbol TYPE."
@@ -3246,7 +3254,7 @@ This location is defined by a non-nil value of
(defun mastodon-tl--init
(buffer-name endpoint update-function &optional headers params
- hide-replies instance)
+ hide-replies instance no-byline)
"Initialize BUFFER-NAME with timeline targeted by ENDPOINT asynchronously.
UPDATE-FUNCTION is used to recieve more toots.
HEADERS means to also collect the response headers. Used for paginating
@@ -3264,11 +3272,12 @@ a timeline from."
#'mastodon-http--get-response-async
#'mastodon-http--get-json-async)
url params 'mastodon-tl--init*
- buffer endpoint update-function headers params hide-replies instance)))
+ buffer endpoint update-function headers params hide-replies
+ instance no-byline)))
(defun mastodon-tl--init*
(response buffer endpoint update-function &optional headers
- update-params hide-replies instance)
+ update-params hide-replies instance no-byline)
"Initialize BUFFER with timeline targeted by ENDPOINT.
UPDATE-FUNCTION is used to recieve more toots.
RESPONSE is the data returned from the server by
@@ -3299,7 +3308,7 @@ JSON and http headers, without it just the JSON."
link-header update-params hide-replies
;; awful hack to fix multiple reloads:
(alist-get "max_id" update-params nil nil #'string=))
- (mastodon-tl--do-init json update-function instance)))))))
+ (mastodon-tl--do-init json update-function instance no-byline)))))))
(defun mastodon-tl--init-sync
(buffer-name endpoint update-function &optional note-type params
@@ -3342,14 +3351,15 @@ ENDPOINT-VERSION is a string, format Vx, e.g. V2."
(mastodon-tl--do-init json update-function)
buffer)))
-(defun mastodon-tl--do-init (json update-fun &optional domain)
+(defun mastodon-tl--do-init (json update-fun &optional domain no-byline)
"Utility function for `mastodon-tl--init*' and `mastodon-tl--init-sync'.
JSON is the data to call UPDATE-FUN on.
When DOMAIN, force inclusion of user's domain in their handle."
(remove-overlays) ; video overlays
- (if domain ;; maybe our update-fun doesn't always have 3 args...:
- (funcall update-fun json nil domain)
- (funcall update-fun json))
+ (cond (domain ;; maybe our update-fun doesn't always have 3 args...:
+ (funcall update-fun json nil domain))
+ (no-byline (funcall update-fun json nil nil no-byline))
+ (t (funcall update-fun json)))
(setq
;; Initialize with a minimal interval; we re-scan at least once
;; every 5 minutes to catch any timestamps we may have missed
diff --git a/lisp/mastodon-toot.el b/lisp/mastodon-toot.el
index bd62728..4e116fa 100644
--- a/lisp/mastodon-toot.el
+++ b/lisp/mastodon-toot.el
@@ -297,7 +297,9 @@ data about the item boosted or favourited."
Includes boosts, and notifications that display toots.
This macro makes the local variable ID available."
(declare (debug t))
- `(if (not (eq 'toot (mastodon-tl--property 'item-type :no-move)))
+ `(if (or (not (eq 'toot (mastodon-tl--property 'item-type :no-move)))
+ (member (mastodon-tl--property 'notification-type)
+ '("follow" "follow_request")))
(user-error "Looks like there's no toot at point?")
(mastodon-tl--with-toot-helper
(lambda (id)