aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormarty hiatt <martianhiatus@disroot.org>2024-11-01 16:07:08 +0100
committermarty hiatt <martianhiatus@disroot.org>2024-11-01 16:07:08 +0100
commit3ec8a8386b63e00042482bd52be74d48dc160f8a (patch)
tree2bc5c5311ef5214469eba95577f79bd61ca318c1
parentadd6bfceafeb115d4665706ca76f3c1e5105d531 (diff)
parent1bf73f2528e35c28d41d48548ea65ab00bd8f689 (diff)
Merge branch 'non-group-notifs' into develop
-rw-r--r--lisp/mastodon-notifications.el274
-rw-r--r--lisp/mastodon-tl.el140
-rw-r--r--lisp/mastodon.el29
-rw-r--r--mastodon-index.org96
4 files changed, 304 insertions, 235 deletions
diff --git a/lisp/mastodon-notifications.el b/lisp/mastodon-notifications.el
index f4615fb..eed3d20 100644
--- a/lisp/mastodon-notifications.el
+++ b/lisp/mastodon-notifications.el
@@ -56,7 +56,6 @@
(autoload 'mastodon-tl--render-text "mastodon-tl")
(autoload 'mastodon-notifications-get "mastodon")
(autoload 'mastodon-tl--byline-uname-+-handle "mastodon-tl")
-(autoload 'mastodon-tl--byline-username "mastodon-tl")
(autoload 'mastodon-tl--byline-handle "mastodon-tl")
(autoload 'mastodon-http--get-json "mastodon-http")
(autoload 'mastodon-media--get-avatar-rendering "mastodon-media")
@@ -64,32 +63,17 @@
(autoload 'mastodon-tl--symbol "mastodon-tl")
(autoload 'mastodon-tl--display-or-uname "mastodon-tl")
-(defgroup mastodon-tl nil
- "Nofications in mastodon.el."
- :prefix "mastodon-notifications-"
- :group 'mastodon)
-
-(defcustom mastodon-notifications--profile-note-in-foll-reqs t
- "If non-nil, show a user's profile note in follow request notifications."
- :type '(boolean))
-
-(defcustom mastodon-notifications--profile-note-in-foll-reqs-max-length nil
- "The max character length for user profile note in follow requests.
-Profile notes are only displayed if
-`mastodon-notifications--profile-note-in-foll-reqs' is non-nil.
-If unset, profile notes of any size will be displayed, which may
-make them unweildy."
- :type '(integer))
-
-(defcustom mastodon-notifications--images-in-notifs nil
- "Whether to display attached images in notifications."
- :type '(boolean))
+;; notifications defcustoms moved into mastodon.el
+;; as some need to be available without loading this file
(defvar mastodon-tl--buffer-spec)
(defvar mastodon-tl--display-media-p)
(defvar mastodon-mode-map)
(defvar mastodon-tl--fold-toots-at-length)
(defvar mastodon-tl--show-avatars)
+(defvar mastodon-profile-note-in-foll-reqs)
+(defvar mastodon-profile-note-in-foll-reqs-max-length)
+(defvar mastodon-group-notifications)
(defvar mastodon-notifications--types
'("favourite" "reblog" "mention" "poll"
@@ -231,21 +215,56 @@ JSON is a list of alists."
"\nfor account: "
.target_account)))
-(defun mastodon-notifications--format-note (group status accounts)
+(defun mastodon-notifications--format-note (note)
+ "Format for a NOTE, a non-grouped notification."
+ (let* ((type (intern (alist-get 'type note)))
+ (profile-note
+ (when (eq 'follow_request type)
+ (let ((str (mastodon-tl--field
+ 'note
+ (mastodon-tl--field 'account note))))
+ (if mastodon-profile-note-in-foll-reqs-max-length
+ (string-limit str mastodon-profile-note-in-foll-reqs-max-length)
+ str))))
+ (status (mastodon-tl--field 'status note))
+ (follower (alist-get 'account note))
+ (follower-name (or (alist-get 'display_name follower)
+ (alist-get 'username follower)))
+ (filtered (mastodon-tl--field 'filtered status))
+ (filters (when filtered
+ (mastodon-tl--current-filters filtered))))
+ (if (and filtered (assoc "hide" filters))
+ nil
+ (mastodon-notifications--insert-note
+ ;; toot
+ ;; should always be note, otherwise notif data not avail
+ ;; later on:
+ note
+ ;; body
+ (mastodon-notifiations--body-arg
+ type filters status profile-note follower-name)
+ ;; action-byline (top)
+ (mastodon-notifications--action-byline
+ type nil nil note follower-name)
+ ;; base toot (always provide)
+ status
+ nil nil nil type))))
+
+(defun mastodon-notifications--format-group-note (group status accounts)
"Format for a GROUP notification.
STATUS is the status's JSON.
ACCOUNTS is data of the accounts that have reacted to the notification."
(let ((folded nil))
;; FIXME: apply/refactor filtering as per/with `mastodon-tl--toot'
(let-alist group
- (let* ((type-sym (intern .type))
+ (let* ((type (intern .type))
(profile-note
- (when (member type-sym '(follow_request))
+ (when (member type '(follow_request))
(let ((str (mastodon-tl--field 'note (car accounts))))
- (if mastodon-notifications--profile-note-in-foll-reqs-max-length
- (string-limit str mastodon-notifications--profile-note-in-foll-reqs-max-length)
+ (if mastodon-profile-note-in-foll-reqs-max-length
+ (string-limit str mastodon-profile-note-in-foll-reqs-max-length)
str))))
- (follower (when (member type-sym '(follow follow_request))
+ (follower (when (member type '(follow follow_request))
(car accounts)))
(follower-name (mastodon-tl--field 'username follower))
(filtered (mastodon-tl--field 'filtered status))
@@ -254,62 +273,81 @@ ACCOUNTS is data of the accounts that have reacted to the notification."
(unless (and filtered (assoc "hide" filters))
(mastodon-notifications--insert-note
;; toot
- (if (member type-sym '(follow follow_request))
+ (if (member type '(follow follow_request))
follower
status)
;; body
- (let ((body (if-let ((match (assoc "warn" filters)))
- (mastodon-tl--spoiler status (cadr match))
- (mastodon-tl--clean-tabs-and-nl
- (cond ((mastodon-tl--has-spoiler status)
- (mastodon-tl--spoiler status))
- ((eq type-sym 'follow_request)
- (mastodon-tl--render-text profile-note))
- (t (mastodon-tl--content status)))))))
- (cond
- ((eq type-sym 'follow)
- (propertize "Congratulations, you have a new follower!"
- 'face 'default))
- ((eq type-sym 'follow_request)
- (concat
- (propertize (format "You have a follow request from %s"
- follower-name)
- 'face 'default)
- (when mastodon-notifications--profile-note-in-foll-reqs
- (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)))
- (t body)))
- ;; author-byline
- #'mastodon-tl--byline-author
+ (mastodon-notifiations--body-arg
+ type filters status profile-note follower-name group)
;; action-byline
- (unless (member type-sym '(follow follow_request mention))
- (downcase
- (mastodon-notifications--byline-concat
- (alist-get type-sym mastodon-notifications--action-alist))))
- ;; action authors
- (cond ((member type-sym '(follow follow_request mention))
- "") ;; mentions are normal statuses
- (t (mastodon-notifications--byline-accounts
- accounts status group)))
- ;; action symbol:
- (unless (eq type-sym 'mention)
- (mastodon-tl--symbol type-sym))
+ (mastodon-notifications--action-byline
+ type accounts group)
;; base toot (no need for update/poll/?)
- (when (member type-sym '(favourite reblog))
+ (when (member type '(favourite reblog))
status)
folded group accounts))))))
+(defun mastodon-notifications--action-byline
+ (type &optional accounts group note follower-name)
+ "TYPE ACCOUNTS GROUP NOTE FOLLOWER-NAME."
+ (let ((action-str
+ (unless (member type '(follow follow_request mention))
+ (downcase
+ (mastodon-notifications--byline-concat
+ (alist-get type mastodon-notifications--action-alist)))))
+ (action-symbol (if (eq type 'mention)
+ ""
+ (mastodon-tl--symbol type)))
+ (action-authors
+ (if (member type '(follow follow_request mention))
+ "" ;; mentions are normal statuses
+ (if group
+ (mastodon-notifications--byline-accounts accounts group)
+ (mastodon-tl--byline-handle note nil
+ follower-name
+ 'mastodon-display-name-face)))))
+ (propertize
+ (concat action-symbol " " action-authors action-str)
+ 'byline-top t)))
+
+(defun mastodon-notifiations--body-arg
+ (type &optional filters status profile-note follower-name group)
+ "TYPE is a symbol, a member of `mastodon-notifiations--types'.
+FILTERS STATUS PROFILE-NOTE FOLLOWER-NAME GROUP."
+ (let ((body
+ (if-let ((match (assoc "warn" filters)))
+ (mastodon-tl--spoiler status (cadr match))
+ (mastodon-tl--clean-tabs-and-nl
+ (cond ((mastodon-tl--has-spoiler status)
+ (mastodon-tl--spoiler status))
+ ((eq type 'follow_request)
+ (mastodon-tl--render-text profile-note))
+ (t (mastodon-tl--content status)))))))
+ (cond
+ ((eq type 'follow)
+ (propertize "Congratulations, you have a new follower!"
+ 'face 'default))
+ ((eq type 'follow_request)
+ (concat
+ (propertize (format "You have a follow request from %s"
+ follower-name)
+ 'face 'default)
+ (when mastodon-profile-note-in-foll-reqs
+ (concat
+ ":\n"
+ (mastodon-notifications--comment-note-text body)))))
+ ((eq type 'severed_relationships)
+ (mastodon-notifications--severance-body group))
+ ((eq type 'moderation_warning)
+ (mastodon-notifications--mod-warning-body group))
+ ((member type '(favourite reblog))
+ (propertize
+ (mastodon-notifications--comment-note-text body)))
+ (t body))))
+
(defun mastodon-notifications--insert-note
- (toot body author-byline action-byline action-authors action-symbol
- &optional base-toot unfolded group accounts)
+ (toot body action-byline
+ &optional base-toot unfolded group accounts type)
"Display the content and byline of timeline element TOOT.
BODY will form the section of the toot above the byline.
AUTHOR-BYLINE is an optional function for adding the author
@@ -328,33 +366,31 @@ JSON of the toot responded to.
UNFOLDED is a boolean meaning whether to unfold or fold item if
foldable.
GROUP is the notification group data.
-ACCOUNTS is the notification accounts data."
- (let* ((type (alist-get 'type (or group toot)))
+ACCOUNTS is the notification accounts data.
+TYPE is notification type, used for non-group notifs."
+ (let* ((type (if type
+ (symbol-name type) ;; non-group
+ (alist-get 'type group)))
(toot-foldable
(and mastodon-tl--fold-toots-at-length
- (length> body mastodon-tl--fold-toots-at-length))))
+ (length> body mastodon-tl--fold-toots-at-length)))
+ (ts ;; types listed here use base item timestamp, else we use
+ ;; group's latest timestamp:
+ (when (and group
+ (not
+ (member type '("favourite" "reblog" "edit" "poll"))))
+ (mastodon-tl--field 'latest_page_notification_at group))))
(insert
(propertize ;; top byline, body + byline:
(concat
- (propertize ;; top byline
- (if (equal type "mention")
- ""
- (concat action-symbol " " action-authors
- action-byline))
- 'byline-top t)
- (propertize ;; body only
- body
- 'toot-body t) ;; includes newlines etc. for folding
+ (if (equal type "mention") ;; top (action) byline
+ ""
+ action-byline)
+ (propertize body ;; body only
+ 'toot-body t) ;; includes newlines etc. for folding
"\n"
;; actual byline:
- (mastodon-tl--byline
- toot author-byline nil nil base-toot group
- (when (member type '("follow" "follow_request"))
- toot) ;; account data!
- ;; types listed here use base item timestamp, else we use group's
- ;; latest timestamp:
- (when (not (member type '("favourite" "reblog" "edit" "poll")))
- (mastodon-tl--field 'latest_page_notification_at group))))
+ (mastodon-tl--byline toot nil nil base-toot group ts))
'item-type 'toot ;; for nav, actions, etc.
'item-id (or (alist-get 'page_max_id group) ;; newest notif
(alist-get 'id toot)) ; toot id
@@ -378,13 +414,9 @@ ACCOUNTS is the notification accounts data."
'notifications-max-id (alist-get 'page_max_id group))
"\n")))
-;; FIXME: REFACTOR with -tl--byline?:
-;; we provide account directly, rather than let-alisting toot
-;; almost everything is .account.field anyway
-;; but toot still needed also, for attachments, etc.
(defun mastodon-notifications--byline-accounts
- (accounts toot group &optional avatar)
- "Propertize author byline ACCOUNTS for TOOT, the item responded to.
+ (accounts group &optional avatar)
+ "Propertize author byline ACCOUNTS.
GROUP is the group notification data.
When AVATAR, include the account's avatar image.
When DOMAIN, force inclusion of user's domain in their handle."
@@ -406,7 +438,7 @@ When DOMAIN, force inclusion of user's domain in their handle."
(mastodon-tl--image-trans-check))
(mastodon-media--get-avatar-rendering .avatar))
(let ((uname (mastodon-tl--display-or-uname account)))
- (mastodon-tl--byline-handle toot nil account
+ (mastodon-tl--byline-handle account nil
uname 'mastodon-display-name-face))
", ")))
nil ", ")
@@ -420,30 +452,34 @@ When DOMAIN, force inclusion of user's domain in their handle."
(cddr accounts) ;; not first two
", ")))))))
-(defun mastodon-notifications--render (json)
- "Display grouped notifications in JSON."
+(defun mastodon-notifications--render (json no-group)
+ "Display grouped notifications in JSON.
+NO-GROUP means don't render grouped notifications."
;; (setq masto-grouped-notifs json)
- (let ((groups (alist-get 'notification_groups json)))
- (cl-loop
- for g in groups
- for start-pos = (point)
- for accounts = (mastodon-notifications--group-accounts
- (alist-get 'sample_account_ids g)
- (alist-get 'accounts json))
- for status = (mastodon-notifications--alist-by-value
- (alist-get 'status_id g) 'id
- (alist-get 'statuses json))
- do (mastodon-notifications--format-note g status accounts)
- (when mastodon-tl--display-media-p
- ;; images-in-notifs custom is handeld in
- ;; `mastodon-tl--media-attachment', not here
- (mastodon-media--inline-images start-pos (point))))))
+ (if no-group
+ (cl-loop for x in json
+ do (mastodon-notifications--format-note x))
+ (let ((groups (alist-get 'notification_groups json)))
+ (cl-loop
+ for g in groups
+ for start-pos = (point)
+ for accounts = (mastodon-notifications--group-accounts
+ (alist-get 'sample_account_ids g)
+ (alist-get 'accounts json))
+ for status = (mastodon-notifications--alist-by-value
+ (alist-get 'status_id g) 'id
+ (alist-get 'statuses json))
+ do (mastodon-notifications--format-group-note g status accounts)
+ (when mastodon-tl--display-media-p
+ ;; images-in-notifs custom is handeld in
+ ;; `mastodon-tl--media-attachment', not here
+ (mastodon-media--inline-images start-pos (point)))))))
(defun mastodon-notifications--timeline (json)
"Format JSON in Emacs buffer."
(if (seq-empty-p json)
(user-error "Looks like you have no (more) notifications for now")
- (mastodon-notifications--render json)
+ (mastodon-notifications--render json (not mastodon-group-notifications))
(goto-char (point-min))))
(defun mastodon-notifications--get-mentions ()
diff --git a/lisp/mastodon-tl.el b/lisp/mastodon-tl.el
index 2db7f34..b5dfa2b 100644
--- a/lisp/mastodon-tl.el
+++ b/lisp/mastodon-tl.el
@@ -97,7 +97,8 @@
(defvar mastodon-toot--visibility)
(defvar mastodon-toot-mode)
(defvar mastodon-active-user)
-(defvar mastodon-notifications--images-in-notifs)
+(defvar mastodon-images-in-notifs)
+(defvar mastodon-group-notifications)
(when (require 'mpv nil :no-error)
(declare-function mpv-start "mpv"))
@@ -610,32 +611,31 @@ Do so if type of status at poins is not follow_request/follow."
(string= type "follow")) ; no counts for these
(message "%s" echo)))))
-;; FIXME: now that this can also be used for non byline rendering, let's
-;; remove the toot arg, and deal with attachments higher up (on real
-;; author byline only) removing toot arg makes it easier to render notifs
-;; that have no status (foll_reqs)
-(defun mastodon-tl--byline-username (toot &optional account)
+(defun mastodon-tl--byline-username (toot)
"Format a byline username from account in TOOT.
-ACCOUNT is optionally acccount data to use."
- (let-alist (or account (alist-get 'account toot))
- (propertize (if (not (string-empty-p .display_name))
- .display_name
- .username)
- 'face 'mastodon-display-name-face
- ;; enable playing of videos when point is on byline:
- ;; 'attachments (mastodon-tl--get-attachments-for-byline toot)
- 'keymap mastodon-tl--byline-link-keymap
- ;; echo faves count when point on post author name:
- ;; which is where --goto-next-toot puts point.
- 'help-echo
- ;; but don't add it to "following"/"follows" on
- ;; profile views: we don't have a tl--buffer-spec
- ;; yet:
- (unless (or (string-suffix-p "-followers*" (buffer-name))
- (string-suffix-p "-following*" (buffer-name)))
- (mastodon-tl--format-byline-help-echo toot)))))
-
-(defun mastodon-tl--byline-handle (toot &optional domain account string face)
+TOOT may be account data, or toot data, in which case acount data
+is extracted from it."
+ (let ((data (or (alist-get 'account toot)
+ toot))) ;; grouped nofifs use account data directly
+ (let-alist data
+ (propertize (if (not (string-empty-p .display_name))
+ .display_name
+ .username)
+ 'face 'mastodon-display-name-face
+ ;; enable playing of videos when point is on byline:
+ ;; 'attachments (mastodon-tl--get-attachments-for-byline toot)
+ 'keymap mastodon-tl--byline-link-keymap
+ ;; echo faves count when point on post author name:
+ ;; which is where --goto-next-toot puts point.
+ 'help-echo
+ ;; but don't add it to "following"/"follows" on
+ ;; profile views: we don't have a tl--buffer-spec
+ ;; yet:
+ (unless (or (string-suffix-p "-followers*" (buffer-name))
+ (string-suffix-p "-following*" (buffer-name)))
+ (mastodon-tl--format-byline-help-echo data))))))
+
+(defun mastodon-tl--byline-handle (toot &optional domain string face)
"Format a byline handle from account in TOOT.
DOMAIN is optionally added to the handle.
ACCOUNT is optionally acccount data to use.
@@ -643,7 +643,8 @@ STRING is optionally the string to propertize.
FACE is optionally the face to use.
The last two args allow for display a username as a clickable
handle."
- (let-alist (or account (alist-get 'account toot))
+ (let-alist (or (alist-get 'account toot)
+ toot) ;; grouped notifs
(propertize (or string
(concat "@" .acct
(when domain
@@ -653,19 +654,18 @@ handle."
'face (or face 'mastodon-handle-face)
'mouse-face 'highlight
'mastodon-tab-stop 'user-handle
- 'account account
'shr-url .url
'keymap mastodon-tl--link-keymap
'mastodon-handle (concat "@" .acct)
'help-echo (concat "Browse user profile of @" .acct))))
-(defun mastodon-tl--byline-uname-+-handle (data &optional domain account)
+(defun mastodon-tl--byline-uname-+-handle (data &optional domain)
"Concatenate a byline username and handle.
DATA is the (toot) data to use.
DOMAIN is optionally a domain for the handle.
ACCOUNT is optionally acccount data to use."
- (concat (mastodon-tl--byline-username data account)
- " (" (mastodon-tl--byline-handle data domain account) ")"))
+ (concat (mastodon-tl--byline-username data)
+ " (" (mastodon-tl--byline-handle data domain) ")"))
(defun mastodon-tl--display-or-uname (account)
"Return display name or username from ACCOUNT data."
@@ -673,7 +673,7 @@ ACCOUNT is optionally acccount data to use."
(alist-get 'display_name account)
(alist-get 'username account)))
-(defun mastodon-tl--byline-author (toot &optional avatar domain base account)
+(defun mastodon-tl--byline-author (toot &optional avatar domain base)
"Propertize author of TOOT.
If TOOT contains a reblog, return author of reblogged item.
With arg AVATAR, include the account's avatar image.
@@ -684,7 +684,7 @@ ACCOUNT is optionally acccount data to use."
(let* ((data (if base
(mastodon-tl--toot-or-base toot)
toot))
- (account (or account (alist-get 'account data)))
+ (account (alist-get 'account data))
(uname (mastodon-tl--display-or-uname account)))
(concat
;; avatar insertion moved up to `mastodon-tl--byline' by default to
@@ -701,11 +701,11 @@ ACCOUNT is optionally acccount data to use."
" "
;; username as button:
(mastodon-tl--byline-handle
- data domain account
+ data domain
;; display uname not handle (for boosts):
uname 'mastodon-display-name-face))
;; normal combo author byline:
- (mastodon-tl--byline-uname-+-handle data domain account)))))
+ (mastodon-tl--byline-uname-+-handle data domain)))))
(defun mastodon-tl--format-byline-help-echo (toot)
"Format a help-echo for byline of TOOT.
@@ -796,14 +796,11 @@ LETTER is a string, F for favourited, B for boosted, or K for bookmarked."
(image-type-available-p 'imagemagick)
(image-transforms-p)))
-(defun mastodon-tl--byline (toot author-byline &optional detailed-p
- domain base-toot group account ts)
+(defun mastodon-tl--byline (toot &optional detailed-p
+ domain base-toot group ts)
"Generate byline for TOOT.
AUTHOR-BYLINE is a function for adding the author portion of
the byline that takes one variable.
-ACTION-BYLINE is a function for adding an action, such as boosting,
-favouriting and following to the byline. It also takes a single function.
-By default it is `mastodon-tl--byline-author'
DETAILED-P means display more detailed info. For now
this just means displaying toot client.
When DOMAIN, force inclusion of user's domain in their handle.
@@ -811,7 +808,7 @@ BASE-TOOT is JSON for the base toot, if any.
GROUP is the notification group if any.
ACCOUNT is the notification account if any.
TS is a timestamp from the server, if any."
- (let* ((type (alist-get 'type group))
+ (let* ((type (alist-get 'type (or group toot)))
(created-time
(or ts ;; mentions, statuses, folls/foll-reqs
;; bosts, faves, edits, polls in notifs view use base item
@@ -822,17 +819,17 @@ TS is a timestamp from the server, if any."
;; (mastodon-tl--field auto fetches from reblogs if needed):
(mastodon-tl--field 'created_at toot)))
(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)))
- (visibility (mastodon-tl--field 'visibility toot))
- (type (alist-get 'type (or group toot)))
- (base-toot-maybe (or base-toot ;; show edits for notifs
- (mastodon-tl--toot-or-base toot))) ;; for boosts
- (account (or account
- (alist-get 'account base-toot-maybe)))
+ ;; non-grouped notifs now need to pull the following data from
+ ;; base toot:
+ (base-maybe (or base-toot ;; show edits for notifs
+ (mastodon-tl--toot-or-base toot))) ;; for boosts
+ (faved (eq t (mastodon-tl--field 'favourited base-maybe)))
+ (boosted (eq t (mastodon-tl--field 'reblogged base-maybe)))
+ (bookmarked (eq t (mastodon-tl--field 'bookmarked base-maybe)))
+ (visibility (mastodon-tl--field 'visibility base-maybe))
+ (account (alist-get 'account base-maybe))
(avatar-url (alist-get 'avatar account))
- (edited-time (alist-get 'edited_at base-toot-maybe))
+ (edited-time (alist-get 'edited_at base-maybe))
(edited-parsed (when edited-time (date-to-time edited-time))))
(concat
;; Boosted/favourited markers are not technically part of the byline, so
@@ -862,7 +859,10 @@ TS is a timestamp from the server, if any."
;; NB: action-byline (boost) is now added in insert-status, so no
;; longer part of the byline.
;; (base) author byline:
- (funcall author-byline toot nil domain :base account)
+ ;; we use base-toot if poss for fave/boost notifs that need to show
+ ;; base item in author byline
+ (mastodon-tl--byline-author (or base-toot toot)
+ nil domain :base)
;; visibility:
(cond ((string= visibility "direct")
(propertize (concat " " (mastodon-tl--symbol 'direct))
@@ -925,7 +925,7 @@ TS is a timestamp from the server, if any."
'edited edited-time
'edit-history (when edited-time
(mastodon-toot--get-toot-edits
- (alist-get 'id base-toot-maybe)))
+ (alist-get 'id base-maybe)))
'byline t))))
@@ -1324,7 +1324,7 @@ SENSITIVE is a flag from the item's JSON data."
;; if in notifs, also check notifs images custom:
(if (or (mastodon-tl--buffer-type-eq 'notifications)
(mastodon-tl--buffer-type-eq 'mentions))
- mastodon-notifications--images-in-notifs
+ mastodon-images-in-notifs
t))
(mastodon-media--get-media-link-rendering ; placeholder: "[img]"
.preview_url remote-url ; for shr-browse-url
@@ -1652,7 +1652,7 @@ Runs `mastodon-tl--render-text' and fetches poll or media."
(string= reply-to-id prev-id)))
(defun mastodon-tl--insert-status
- (toot body author-byline action-byline &optional id base-toot
+ (toot body action-byline &optional id base-toot
detailed-p thread domain unfolded no-byline)
"Display the content and byline of timeline element TOOT.
BODY will form the section of the toot above the byline.
@@ -1707,8 +1707,7 @@ NO-BYLINE means just insert toot body, used for folding."
"\n"
(if no-byline
""
- (mastodon-tl--byline toot author-byline detailed-p
- domain base-toot)))
+ (mastodon-tl--byline toot detailed-p domain base-toot)))
'item-type 'toot
'item-id (or id ; notification's own id
(alist-get 'id toot)) ; toot id
@@ -1792,16 +1791,16 @@ NO-CW means treat content warnings as unfolded."
;; even though item may also have a "warn" filter:
(unless (and filtered (assoc "hide" filters)) ;; no insert
(mastodon-tl--insert-status
- toot
- (mastodon-tl--clean-tabs-and-nl spoiler-or-content)
- #'mastodon-tl--byline-author #'mastodon-tl--byline-boost
- nil nil detailed-p thread domain unfolded no-byline))))
+ toot (mastodon-tl--clean-tabs-and-nl spoiler-or-content)
+ #'mastodon-tl--byline-boost nil nil detailed-p
+ thread domain unfolded no-byline))))
(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.
-When DOMAIN, force inclusion of user's domain in their handle."
+When DOMAIN, force inclusion of user's domain in their handle.
+NO-BYLINE means just insert toot body, used for folding."
(let ((start-pos (point))
(toots ;; hack to *not* filter replies on profiles:
(if (eq (mastodon-tl--get-buffer-type) 'profile-statuses)
@@ -2254,8 +2253,9 @@ If we are in a notifications view, return `notifications-min-id'."
(save-excursion
(goto-char (point-max))
(mastodon-tl--property
- (if (member (mastodon-tl--get-buffer-type)
- '(mentions notifications))
+ (if (and mastodon-group-notifications
+ (member (mastodon-tl--get-buffer-type)
+ '(mentions notifications)))
'notifications-min-id
'item-id)
nil :backward)))
@@ -2879,7 +2879,8 @@ the current view."
(args (append args params))
(url (mastodon-http--api
endpoint
- (when (or (string= endpoint "notifications")
+ (when (or (and mastodon-group-notifications
+ (string= endpoint "notifications"))
(string-suffix-p "search" endpoint))
"v2"))))
(apply #'mastodon-http--get-json-async url args callback cbargs)))
@@ -3272,7 +3273,8 @@ favourites and bookmarks.
PARAMS is any parameters to send with the request.
HIDE-REPLIES is a flag indicating if replies are hidden in the current buffer.
INSTANCE is a string of another instance domain we are displaying
-a timeline from."
+a timeline from.
+NO-BYLINE means just insert toot body, used for announcements."
(let ((url (if instance
(concat "https://" instance "/api/v1/" endpoint)
(mastodon-http--api endpoint)))
@@ -3292,7 +3294,8 @@ a timeline from."
UPDATE-FUNCTION is used to recieve more toots.
RESPONSE is the data returned from the server by
`mastodon-http--process-json', with arg HEADERS a cons cell of
-JSON and http headers, without it just the JSON."
+JSON and http headers, without it just the JSON.
+NO-BYLINE means just insert toot body, used for announcements."
(let ((json (if headers (car response) response)))
(cond ((not json) ; praying this is right here, else try "\n[]"
;; this means that whatever tl was inited won't load, which is not
@@ -3364,7 +3367,8 @@ ENDPOINT-VERSION is a string, format Vx, e.g. V2."
(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."
+When DOMAIN, force inclusion of user's domain in their handle.
+NO-BYLINE means just insert toot body, used for announcements."
(remove-overlays) ; video overlays
(cond (domain ;; maybe our update-fun doesn't always have 3 args...:
(funcall update-fun json nil domain))
diff --git a/lisp/mastodon.el b/lisp/mastodon.el
index ea4a4e2..32cc671 100644
--- a/lisp/mastodon.el
+++ b/lisp/mastodon.el
@@ -153,6 +153,30 @@ currently, it doesn't seem to have a way to handle custom emoji,
while emojify,el has this feature and mastodon.el implements it."
:type 'boolean)
+;; notifications customizes
+;; moved here because we can load notifs without first loading mastodon.el
+;; or mastodon-notifications.el
+
+(defcustom mastodon-profile-note-in-foll-reqs t
+ "If non-nil, show a user's profile note in follow request notifications."
+ :type '(boolean))
+
+(defcustom mastodon-profile-note-in-foll-reqs-max-length nil
+ "The max character length for user profile note in follow requests.
+Profile notes are only displayed if
+`mastodon-profile-note-in-foll-reqs' is non-nil.
+If unset, profile notes of any size will be displayed, which may
+make them unweildy."
+ :type '(integer))
+
+(defcustom mastodon-images-in-notifs nil
+ "Whether to display attached images in notifications."
+ :type '(boolean))
+
+(defcustom mastodon-group-notifications t
+ "Whether to use grouped notifications."
+ :type '(boolean))
+
(defun mastodon-kill-window ()
"Quit window and delete helper."
(interactive)
@@ -372,7 +396,10 @@ MAX-ID is a request parameter for pagination."
type
(when max-id
`(("max_id" . ,(mastodon-tl--buffer-property 'max-id))))
- nil nil nil "v2")
+ nil nil nil
+ (if (not mastodon-group-notifications)
+ "v1"
+ "v2"))
(with-current-buffer (get-buffer-create buffer)
(use-local-map mastodon-notifications--map))))
diff --git a/mastodon-index.org b/mastodon-index.org
index b3d6af7..7e5d2a7 100644
--- a/mastodon-index.org
+++ b/mastodon-index.org
@@ -200,6 +200,7 @@
| a | mastodon-toot--translate-toot-text | Translate text of toot at point. |
| E | mastodon-toot--view-toot-edits | View editing history of the toot at point in a popup buffer. |
| | mastodon-toot-mode | Minor mode for composing toots. |
+| | mastodon-transient--choice-add | Add another poll choice if possible. |
| | mastodon-update-profile-note | Update current user profile note. |
| | mastodon-url-lookup | If a URL resembles a fediverse link, try to load in `mastodon.el'. |
| | mastodon-url-lookup-force | Call `mastodon-url-lookup' without checking if URL is fedi-like. |
@@ -259,50 +260,51 @@
#+end_src
#+RESULTS:
-| Custom variable | Description |
-|--------------------------------------------------------------+-------------------------------------------------------------------------------|
-| mastodon-active-user | Username of the active user. |
-| mastodon-client--token-file | File path where Mastodon access tokens are stored. |
-| mastodon-instance-url | Base URL for the fediverse instance you want to be active. |
-| mastodon-media--avatar-height | Height of the user avatar images (if shown). |
-| mastodon-media--enable-image-caching | Whether images should be cached. |
-| mastodon-media--hide-sensitive-media | Whether media marked as sensitive should be hidden. |
-| mastodon-media--preview-max-height | Max height of any media attachment preview to be shown in timelines. |
-| mastodon-mode-hook | Hook run when entering Mastodon mode. |
-| mastodon-notifications--images-in-notifs | Whether to display attached images in notifications. |
-| mastodon-notifications--profile-note-in-foll-reqs | If non-nil, show a user's profile note in follow request notifications. |
-| mastodon-notifications--profile-note-in-foll-reqs-max-length | The max character length for user profile note in follow requests. |
-| mastodon-profile-mode-hook | Hook run after entering or leaving `mastodon-profile-mode'. |
-| mastodon-profile-update-mode-hook | Hook run after entering or leaving `mastodon-profile-update-mode'. |
-| mastodon-search-mode-hook | Hook run after entering or leaving `mastodon-search-mode'. |
-| mastodon-tl--display-caption-not-url-when-no-media | Display an image's caption rather than URL. |
-| mastodon-tl--display-media-p | A boolean value stating whether to show media in timelines. |
-| mastodon-tl--enable-proportional-fonts | Nonnil to enable using proportional fonts when rendering HTML. |
-| mastodon-tl--enable-relative-timestamps | Whether to show relative (to the current time) timestamps. |
-| mastodon-tl--expand-content-warnings | Whether to expand content warnings by default. |
-| mastodon-tl--fold-toots-at-length | Length, in characters, to fold a toot at. |
-| mastodon-tl--hide-replies | Whether to hide replies from the timelines. |
-| mastodon-tl--highlight-current-toot | Whether to highlight the toot at point. Uses `cursor-face' special property. |
-| mastodon-tl--load-full-sized-images-in-emacs | Whether to load full-sized images inside Emacs. |
-| mastodon-tl--no-fill-on-render | Non-nil to disable filling by shr.el while rendering toot body. |
-| mastodon-tl--remote-local-domains | A list of domains to view the local timelines of. |
-| mastodon-tl--show-avatars | Whether to enable display of user avatars in timelines. |
-| mastodon-tl--show-stats | Whether to show toot stats (faves, boosts, replies counts). |
-| mastodon-tl--symbols | A set of symbols (and fallback strings) to be used in timeline. |
-| mastodon-tl--tag-timeline-tags | A list of up to four tags for use with `mastodon-tl--followed-tags-timeline'. |
-| mastodon-tl--timeline-posts-count | Number of posts to display when loading a timeline. |
-| mastodon-tl-position-after-update | Defines where `point' should be located after a timeline update. |
-| mastodon-toot--attachment-height | Height of the attached images preview in the toot draft buffer. |
-| mastodon-toot--completion-style-for-mentions | The company completion style to use for mentions. |
-| mastodon-toot--default-media-directory | The default directory when prompting for a media file to upload. |
-| mastodon-toot--default-reply-visibility | Default visibility settings when replying. |
-| mastodon-toot--enable-completion | Whether to enable completion of mentions and hashtags. |
-| mastodon-toot--enable-custom-instance-emoji | Whether to enable your instance's custom emoji by default. |
-| mastodon-toot--proportional-fonts-compose | Nonnil to enable using proportional fonts in the compose buffer. |
-| mastodon-toot--use-company-for-completion | Whether to enable company for completion. |
-| mastodon-toot-display-orig-in-reply-buffer | Display a copy of the toot replied to in the compose buffer. |
-| mastodon-toot-mode-hook | Hook run after entering or leaving `mastodon-toot-mode'. |
-| mastodon-toot-orig-in-reply-length | Length to crop toot replied to in the compose buffer to. |
-| mastodon-toot-poll-use-transient | Whether to use the transient menu to create a poll. |
-| mastodon-toot-timestamp-format | Format to use for timestamps. |
-| mastodon-use-emojify | Whether to use emojify.el to display emojis. |
+| Custom variable | Description |
+|----------------------------------------------------+-------------------------------------------------------------------------------|
+| mastodon-active-user | Username of the active user. |
+| mastodon-client--token-file | File path where Mastodon access tokens are stored. |
+| mastodon-group-notifications | Whether to use grouped notifications. |
+| mastodon-images-in-notifs | Whether to display attached images in notifications. |
+| mastodon-instance-url | Base URL for the fediverse instance you want to be active. |
+| mastodon-media--avatar-height | Height of the user avatar images (if shown). |
+| mastodon-media--enable-image-caching | Whether images should be cached. |
+| mastodon-media--hide-sensitive-media | Whether media marked as sensitive should be hidden. |
+| mastodon-media--preview-max-height | Max height of any media attachment preview to be shown in timelines. |
+| mastodon-mode-hook | Hook run when entering Mastodon mode. |
+| mastodon-profile-mode-hook | Hook run after entering or leaving `mastodon-profile-mode'. |
+| mastodon-profile-note-in-foll-reqs | If non-nil, show a user's profile note in follow request notifications. |
+| mastodon-profile-note-in-foll-reqs-max-length | The max character length for user profile note in follow requests. |
+| mastodon-profile-update-mode-hook | Hook run after entering or leaving `mastodon-profile-update-mode'. |
+| mastodon-search-mode-hook | Hook run after entering or leaving `mastodon-search-mode'. |
+| mastodon-tl--display-caption-not-url-when-no-media | Display an image's caption rather than URL. |
+| mastodon-tl--display-media-p | A boolean value stating whether to show media in timelines. |
+| mastodon-tl--enable-proportional-fonts | Nonnil to enable using proportional fonts when rendering HTML. |
+| mastodon-tl--enable-relative-timestamps | Whether to show relative (to the current time) timestamps. |
+| mastodon-tl--expand-content-warnings | Whether to expand content warnings by default. |
+| mastodon-tl--fold-toots-at-length | Length, in characters, to fold a toot at. |
+| mastodon-tl--hide-replies | Whether to hide replies from the timelines. |
+| mastodon-tl--highlight-current-toot | Whether to highlight the toot at point. Uses `cursor-face' special property. |
+| mastodon-tl--load-full-sized-images-in-emacs | Whether to load full-sized images inside Emacs. |
+| mastodon-tl--no-fill-on-render | Non-nil to disable filling by shr.el while rendering toot body. |
+| mastodon-tl--remote-local-domains | A list of domains to view the local timelines of. |
+| mastodon-tl--show-avatars | Whether to enable display of user avatars in timelines. |
+| mastodon-tl--show-stats | Whether to show toot stats (faves, boosts, replies counts). |
+| mastodon-tl--symbols | A set of symbols (and fallback strings) to be used in timeline. |
+| mastodon-tl--tag-timeline-tags | A list of up to four tags for use with `mastodon-tl--followed-tags-timeline'. |
+| mastodon-tl--timeline-posts-count | Number of posts to display when loading a timeline. |
+| mastodon-tl-position-after-update | Defines where `point' should be located after a timeline update. |
+| mastodon-toot--attachment-height | Height of the attached images preview in the toot draft buffer. |
+| mastodon-toot--completion-style-for-mentions | The company completion style to use for mentions. |
+| mastodon-toot--default-media-directory | The default directory when prompting for a media file to upload. |
+| mastodon-toot--default-reply-visibility | Default visibility settings when replying. |
+| mastodon-toot--enable-completion | Whether to enable completion of mentions and hashtags. |
+| mastodon-toot--enable-custom-instance-emoji | Whether to enable your instance's custom emoji by default. |
+| mastodon-toot--proportional-fonts-compose | Nonnil to enable using proportional fonts in the compose buffer. |
+| mastodon-toot--use-company-for-completion | Whether to enable company for completion. |
+| mastodon-toot-display-orig-in-reply-buffer | Display a copy of the toot replied to in the compose buffer. |
+| mastodon-toot-mode-hook | Hook run after entering or leaving `mastodon-toot-mode'. |
+| mastodon-toot-orig-in-reply-length | Length to crop toot replied to in the compose buffer to. |
+| mastodon-toot-poll-use-transient | Whether to use the transient menu to create a poll. |
+| mastodon-toot-timestamp-format | Format to use for timestamps. |
+| mastodon-use-emojify | Whether to use emojify.el to display emojis. |