From 0e75fc74eebd142601d725cb814d7fe18b87c25e Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Tue, 29 Oct 2024 12:02:23 +0100 Subject: group-notifs custom (for servers without). #608. WIP. --- lisp/mastodon-notifications.el | 137 +++++++++++++++++++++++++++++++++++------ 1 file changed, 119 insertions(+), 18 deletions(-) (limited to 'lisp/mastodon-notifications.el') diff --git a/lisp/mastodon-notifications.el b/lisp/mastodon-notifications.el index f4615fb..4bf797d 100644 --- a/lisp/mastodon-notifications.el +++ b/lisp/mastodon-notifications.el @@ -85,6 +85,10 @@ make them unweildy." "Whether to display attached images in notifications." :type '(boolean)) +(defcustom mastodon-notifications--group-notifications t + "Whether to use grouped notifications." + :type '(boolean)) + (defvar mastodon-tl--buffer-spec) (defvar mastodon-tl--display-media-p) (defvar mastodon-mode-map) @@ -231,7 +235,101 @@ 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 of TYPE." + ;; FIXME: apply/refactor filtering as per/with `mastodon-tl--toot' + (let* ((id (alist-get 'id note)) + (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-notifications--profile-note-in-foll-reqs-max-length + (string-limit str mastodon-notifications--profile-note-in-foll-reqs-max-length) + str)))) + (status (mastodon-tl--field 'status note)) + (follower (alist-get 'username (alist-get 'account note))) + (toot (alist-get 'status note)) + (filtered (mastodon-tl--field 'filtered toot)) + (filters (when filtered + (mastodon-tl--current-filters filtered)))) + (if (and filtered (assoc "hide" filters)) + nil + (mastodon-tl--insert-status + ;; toot + (cond ((or (eq type 'follow) + (eq type 'follow-request)) + ;; Using reblog with an empty id will mark this as something + ;; non-boostable/non-favable. + (cons '(reblog (id . nil)) note)) + ;; reblogs/faves use 'note' to process their own json + ;; not the toot's. this ensures following etc. work on such notifs + ((or (eq type 'favourite) + (eq type 'boost)) + note) + (t + status)) + ;; body + (let ((body (if-let ((match (assoc "warn" filters))) + (mastodon-tl--spoiler toot (cadr match)) + (mastodon-tl--clean-tabs-and-nl + (if (mastodon-tl--has-spoiler status) + (mastodon-tl--spoiler status) + (if (eq 'follow-request type) + (mastodon-tl--render-text profile-note) + (mastodon-tl--content status))))))) + (cond ((or (eq type 'follow) + (eq type 'follow-request)) + (if (eq type 'follow) + (propertize "Congratulations, you have a new follower!" + 'face 'default) + (concat + (propertize + (format "You have a follow request from... %s" + follower) + 'face 'default) + (when mastodon-notifications--profile-note-in-foll-reqs + (concat + ":\n" + (mastodon-notifications--comment-note-text body)))))) + ((or (eq type 'favourite) + (eq type 'boost)) + (mastodon-notifications--comment-note-text body)) + (t body))) + ;; author-byline + (if (or (eq type 'follow) + (eq type 'follow-request) + (eq type 'mention)) + 'mastodon-tl--byline-author + (lambda (_status &rest _args) ; unbreak stuff + (mastodon-tl--byline-author note))) + ;; action-byline + (lambda (_status) + (mastodon-notifications--byline-concat + (cond ((eq type 'reblog) + "Boosted") + ((eq type 'favourite) + "Favourited") + ((eq type 'follow_request) + "Requested to follow") + ((eq type 'follow) + "Followed") + ((eq type 'mention) + "Mentioned") + ((eq type 'status) + "Posted") + ((eq type 'poll) + "Posted a poll") + ((eq type 'update) + "Edited")))) + id + ;; base toot + (when (or (eq type 'favourite) + (eq type 'boost)) + status))))) + +(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." @@ -420,30 +518,33 @@ When DOMAIN, force inclusion of user's domain in their handle." (cddr accounts) ;; not first two ", "))))))) -(defun mastodon-notifications--render (json) +(defun mastodon-notifications--render (json no-group) "Display grouped notifications in JSON." ;; (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-notifications--group-notifications)) (goto-char (point-min)))) (defun mastodon-notifications--get-mentions () -- cgit v1.2.3 From 8446f239bb5cfe55511e43b8b3d938d67d6e1aa3 Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Tue, 29 Oct 2024 16:59:03 +0100 Subject: working v1 notifications custom. #608 --- lisp/mastodon-notifications.el | 134 ++++++++++++++++++----------------------- lisp/mastodon-tl.el | 5 +- 2 files changed, 62 insertions(+), 77 deletions(-) (limited to 'lisp/mastodon-notifications.el') diff --git a/lisp/mastodon-notifications.el b/lisp/mastodon-notifications.el index 4bf797d..34aeb9d 100644 --- a/lisp/mastodon-notifications.el +++ b/lisp/mastodon-notifications.el @@ -236,12 +236,11 @@ JSON is a list of alists." .target_account))) (defun mastodon-notifications--format-note (note) - "Format for a NOTE of TYPE." - ;; FIXME: apply/refactor filtering as per/with `mastodon-tl--toot' + "Format for a NOTE, a non-grouped notification." (let* ((id (alist-get 'id note)) (type (intern (alist-get 'type note))) (profile-note - (when (eq 'follow-request type) + (when (eq 'follow_request type) (let ((str (mastodon-tl--field 'note (mastodon-tl--field 'account note)))) @@ -249,85 +248,69 @@ JSON is a list of alists." (string-limit str mastodon-notifications--profile-note-in-foll-reqs-max-length) str)))) (status (mastodon-tl--field 'status note)) - (follower (alist-get 'username (alist-get 'account note))) - (toot (alist-get 'status note)) - (filtered (mastodon-tl--field 'filtered toot)) + (follower (alist-get 'account note)) + (follower-name (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-tl--insert-status + (mastodon-notifications--insert-note ;; toot - (cond ((or (eq type 'follow) - (eq type 'follow-request)) - ;; Using reblog with an empty id will mark this as something - ;; non-boostable/non-favable. - (cons '(reblog (id . nil)) note)) - ;; reblogs/faves use 'note' to process their own json - ;; not the toot's. this ensures following etc. work on such notifs - ((or (eq type 'favourite) - (eq type 'boost)) - note) - (t - status)) + (if (member type '(follow follow_request)) + follower + status) ;; body - (let ((body (if-let ((match (assoc "warn" filters))) - (mastodon-tl--spoiler toot (cadr match)) - (mastodon-tl--clean-tabs-and-nl - (if (mastodon-tl--has-spoiler status) - (mastodon-tl--spoiler status) - (if (eq 'follow-request type) - (mastodon-tl--render-text profile-note) - (mastodon-tl--content status))))))) - (cond ((or (eq type 'follow) - (eq type 'follow-request)) - (if (eq type 'follow) - (propertize "Congratulations, you have a new follower!" - 'face 'default) - (concat - (propertize - (format "You have a follow request from... %s" - follower) - 'face 'default) - (when mastodon-notifications--profile-note-in-foll-reqs - (concat - ":\n" - (mastodon-notifications--comment-note-text body)))))) - ((or (eq type 'favourite) - (eq type 'boost)) - (mastodon-notifications--comment-note-text body)) - (t 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 '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-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 '(favourite reblog)) + (propertize + (mastodon-notifications--comment-note-text body))) + (t body))) ;; author-byline - (if (or (eq type 'follow) - (eq type 'follow-request) - (eq type 'mention)) - 'mastodon-tl--byline-author - (lambda (_status &rest _args) ; unbreak stuff - (mastodon-tl--byline-author note))) + #'mastodon-tl--byline-author ;; action-byline - (lambda (_status) - (mastodon-notifications--byline-concat - (cond ((eq type 'reblog) - "Boosted") - ((eq type 'favourite) - "Favourited") - ((eq type 'follow_request) - "Requested to follow") - ((eq type 'follow) - "Followed") - ((eq type 'mention) - "Mentioned") - ((eq type 'status) - "Posted") - ((eq type 'poll) - "Posted a poll") - ((eq type 'update) - "Edited")))) - id + (unless (member type '(follow follow_request mention)) + (downcase + (mastodon-notifications--byline-concat + (alist-get type mastodon-notifications--action-alist)))) + ;; action authors + (cond ((member type '(follow follow_request mention)) + "") ;; mentions are normal statuses + (t (mastodon-tl--byline-username + note (alist-get 'account note)))) + ;; action symbol: + (unless (eq type 'mention) + (mastodon-tl--symbol type)) ;; base toot (when (or (eq type 'favourite) (eq type 'boost)) - status))))) + status) + nil nil nil type)))) (defun mastodon-notifications--format-group-note (group status accounts) "Format for a GROUP notification. @@ -407,7 +390,7 @@ ACCOUNTS is data of the accounts that have reacted to the notification." (defun mastodon-notifications--insert-note (toot body author-byline action-byline action-authors action-symbol - &optional base-toot unfolded group accounts) + &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 @@ -427,7 +410,9 @@ 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))) + (let* ((type (if type + (symbol-name type) + (alist-get 'type group))) (toot-foldable (and mastodon-tl--fold-toots-at-length (length> body mastodon-tl--fold-toots-at-length)))) @@ -452,7 +437,8 @@ ACCOUNTS is the notification accounts 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--field 'latest_page_notification_at group)) + type)) 'item-type 'toot ;; for nav, actions, etc. 'item-id (or (alist-get 'page_max_id group) ;; newest notif (alist-get 'id toot)) ; toot id diff --git a/lisp/mastodon-tl.el b/lisp/mastodon-tl.el index 5eb52e3..ab6951e 100644 --- a/lisp/mastodon-tl.el +++ b/lisp/mastodon-tl.el @@ -797,7 +797,7 @@ LETTER is a string, F for favourited, B for boosted, or K for bookmarked." (image-transforms-p))) (defun mastodon-tl--byline (toot author-byline &optional detailed-p - domain base-toot group account ts) + domain base-toot group account ts type) "Generate byline for TOOT. AUTHOR-BYLINE is a function for adding the author portion of the byline that takes one variable. @@ -811,7 +811,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 (or 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 @@ -826,7 +826,6 @@ TS is a timestamp from the server, if any." (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 -- cgit v1.2.3 From f3602493dadeac6b19558c3655fbd5fbb1125107 Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Tue, 29 Oct 2024 17:09:50 +0100 Subject: fix notifs custom group --- lisp/mastodon-notifications.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lisp/mastodon-notifications.el') diff --git a/lisp/mastodon-notifications.el b/lisp/mastodon-notifications.el index 34aeb9d..fde57f5 100644 --- a/lisp/mastodon-notifications.el +++ b/lisp/mastodon-notifications.el @@ -64,7 +64,7 @@ (autoload 'mastodon-tl--symbol "mastodon-tl") (autoload 'mastodon-tl--display-or-uname "mastodon-tl") -(defgroup mastodon-tl nil +(defgroup mastodon-notifications nil "Nofications in mastodon.el." :prefix "mastodon-notifications-" :group 'mastodon) -- cgit v1.2.3 From 639745a8850dd01713437c2327610bdef9bd525c Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Tue, 29 Oct 2024 17:16:21 +0100 Subject: move notifs customizes into mastodon.el --- lisp/mastodon-notifications.el | 40 +++++++++------------------------------- lisp/mastodon-tl.el | 4 ++-- lisp/mastodon.el | 26 +++++++++++++++++++++++++- mastodon-index.org | 6 +++--- 4 files changed, 39 insertions(+), 37 deletions(-) (limited to 'lisp/mastodon-notifications.el') diff --git a/lisp/mastodon-notifications.el b/lisp/mastodon-notifications.el index fde57f5..f0657fb 100644 --- a/lisp/mastodon-notifications.el +++ b/lisp/mastodon-notifications.el @@ -64,30 +64,8 @@ (autoload 'mastodon-tl--symbol "mastodon-tl") (autoload 'mastodon-tl--display-or-uname "mastodon-tl") -(defgroup mastodon-notifications 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)) - -(defcustom mastodon-notifications--group-notifications t - "Whether to use grouped 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) @@ -244,8 +222,8 @@ JSON is a list of alists." (let ((str (mastodon-tl--field 'note (mastodon-tl--field 'account note)))) - (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)))) (status (mastodon-tl--field 'status note)) (follower (alist-get 'account note)) @@ -279,7 +257,7 @@ JSON is a list of alists." (propertize (format "You have a follow request from %s" follower-name) 'face 'default) - (when mastodon-notifications--profile-note-in-foll-reqs + (when mastodon-profile-note-in-foll-reqs (concat ":\n" (mastodon-notifications--comment-note-text body))))) @@ -323,8 +301,8 @@ ACCOUNTS is data of the accounts that have reacted to the notification." (profile-note (when (member type-sym '(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)) (car accounts))) @@ -356,7 +334,7 @@ ACCOUNTS is data of the accounts that have reacted to the notification." (propertize (format "You have a follow request from %s" follower-name) 'face 'default) - (when mastodon-notifications--profile-note-in-foll-reqs + (when mastodon-profile-note-in-foll-reqs (concat ":\n" (mastodon-notifications--comment-note-text body))))) @@ -530,7 +508,7 @@ When DOMAIN, force inclusion of user's domain in their handle." "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 (not mastodon-notifications--group-notifications)) + (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 ab6951e..4f77f92 100644 --- a/lisp/mastodon-tl.el +++ b/lisp/mastodon-tl.el @@ -97,7 +97,7 @@ (defvar mastodon-toot--visibility) (defvar mastodon-toot-mode) (defvar mastodon-active-user) -(defvar mastodon-notifications--images-in-notifs) +(defvar mastodon-images-in-notifs) (when (require 'mpv nil :no-error) (declare-function mpv-start "mpv")) @@ -1326,7 +1326,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 diff --git a/lisp/mastodon.el b/lisp/mastodon.el index 86810b7..211a9bc 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) @@ -373,7 +397,7 @@ MAX-ID is a request parameter for pagination." (when max-id `(("max_id" . ,(mastodon-tl--buffer-property 'max-id)))) nil nil nil - (if (not mastodon-notifications--group-notifications) + (if (not mastodon-group-notifications) "v1" "v2")) (with-current-buffer (get-buffer-create buffer) diff --git a/mastodon-index.org b/mastodon-index.org index b3d6af7..858c322 100644 --- a/mastodon-index.org +++ b/mastodon-index.org @@ -269,9 +269,9 @@ | 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-images-in-notifs | Whether to display attached images in notifications. | +| 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-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'. | -- cgit v1.2.3 From b529690f96953cd9b0ab248b18d811b9e95d0890 Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Tue, 29 Oct 2024 20:59:48 +0100 Subject: notifs: refactor some v1/v2 calling code, mastodon-notifiations--body-arg --- lisp/mastodon-notifications.el | 164 ++++++++++++++++++++++------------------- 1 file changed, 88 insertions(+), 76 deletions(-) (limited to 'lisp/mastodon-notifications.el') diff --git a/lisp/mastodon-notifications.el b/lisp/mastodon-notifications.el index f0657fb..97d0d80 100644 --- a/lisp/mastodon-notifications.el +++ b/lisp/mastodon-notifications.el @@ -72,6 +72,9 @@ (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" @@ -215,8 +218,7 @@ JSON is a list of alists." (defun mastodon-notifications--format-note (note) "Format for a NOTE, a non-grouped notification." - (let* ((id (alist-get 'id note)) - (type (intern (alist-get 'type note))) + (let* ((type (intern (alist-get 'type note))) (profile-note (when (eq 'follow_request type) (let ((str (mastodon-tl--field @@ -239,36 +241,38 @@ JSON is a list of alists." 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 '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-sym 'severed_relationships) - ;; (mastodon-notifications--severance-body group)) - ;; ((eq type-sym 'moderation_warning) - ;; (mastodon-notifications--mod-warning-body group)) - ((member type '(favourite reblog)) - (propertize - (mastodon-notifications--comment-note-text body))) - (t body))) + (mastodon-notifiations--body-arg + type filters status profile-note follower-name) + ;; (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))) ;; author-byline #'mastodon-tl--byline-author ;; action-byline @@ -297,14 +301,14 @@ 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-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)) @@ -313,59 +317,67 @@ 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-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))) + (mastodon-notifiations--body-arg + type filters status profile-note follower-name group) ;; author-byline #'mastodon-tl--byline-author ;; action-byline - (unless (member type-sym '(follow follow_request mention)) + (unless (member type '(follow follow_request mention)) (downcase (mastodon-notifications--byline-concat - (alist-get type-sym mastodon-notifications--action-alist)))) + (alist-get type mastodon-notifications--action-alist)))) ;; action authors - (cond ((member type-sym '(follow follow_request mention)) + (cond ((member type '(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)) + (unless (eq type 'mention) + (mastodon-tl--symbol type)) ;; base toot (no need for update/poll/?) - (when (member type-sym '(favourite reblog)) + (when (member type '(favourite reblog)) status) folded group accounts)))))) +(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 type) @@ -389,7 +401,7 @@ foldable. GROUP is the notification group data. ACCOUNTS is the notification accounts data." (let* ((type (if type - (symbol-name type) + (symbol-name type) ;; non-group (alist-get 'type group))) (toot-foldable (and mastodon-tl--fold-toots-at-length @@ -403,9 +415,8 @@ ACCOUNTS is the notification accounts data." (concat action-symbol " " action-authors action-byline)) 'byline-top t) - (propertize ;; body only - body - 'toot-body t) ;; includes newlines etc. for folding + (propertize body ;; body only + 'toot-body t) ;; includes newlines etc. for folding "\n" ;; actual byline: (mastodon-tl--byline @@ -483,7 +494,8 @@ When DOMAIN, force inclusion of user's domain in their handle." ", "))))))) (defun mastodon-notifications--render (json no-group) - "Display grouped notifications in JSON." + "Display grouped notifications in JSON. +NO-GROUP means don't render grouped notifications." ;; (setq masto-grouped-notifs json) (if no-group (cl-loop for x in json -- cgit v1.2.3 From 7d61f38a6bbe8a329892c5e91d1627a3ab03ee66 Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Wed, 30 Oct 2024 08:17:07 +0100 Subject: FIX #609. insert-status remove author-byline arg, its always the same function --- lisp/mastodon-notifications.el | 11 +++++------ lisp/mastodon-tl.el | 16 +++++++--------- 2 files changed, 12 insertions(+), 15 deletions(-) (limited to 'lisp/mastodon-notifications.el') diff --git a/lisp/mastodon-notifications.el b/lisp/mastodon-notifications.el index 97d0d80..6d6b339 100644 --- a/lisp/mastodon-notifications.el +++ b/lisp/mastodon-notifications.el @@ -273,8 +273,6 @@ JSON is a list of alists." ;; (propertize ;; (mastodon-notifications--comment-note-text body))) ;; (t body))) - ;; author-byline - #'mastodon-tl--byline-author ;; action-byline (unless (member type '(follow follow_request mention)) (downcase @@ -323,8 +321,6 @@ ACCOUNTS is data of the accounts that have reacted to the notification." ;; body (mastodon-notifiations--body-arg type filters status profile-note follower-name group) - ;; author-byline - #'mastodon-tl--byline-author ;; action-byline (unless (member type '(follow follow_request mention)) (downcase @@ -379,7 +375,7 @@ FILTERS STATUS PROFILE-NOTE FOLLOWER-NAME GROUP." (t body)))) (defun mastodon-notifications--insert-note - (toot body author-byline action-byline action-authors action-symbol + (toot body action-byline action-authors action-symbol &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. @@ -420,7 +416,10 @@ ACCOUNTS is the notification accounts data." "\n" ;; actual byline: (mastodon-tl--byline - toot author-byline nil nil base-toot group + toot nil nil base-toot group + ;; FIXME: remove account arg (esp. if we have type). maybe we need + ;; type arg when we step from notifs (here); to tl--byline land + ;; (there): (when (member type '("follow" "follow_request")) toot) ;; account data! ;; types listed here use base item timestamp, else we use group's diff --git a/lisp/mastodon-tl.el b/lisp/mastodon-tl.el index 4f77f92..61014ff 100644 --- a/lisp/mastodon-tl.el +++ b/lisp/mastodon-tl.el @@ -796,7 +796,7 @@ 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 +(defun mastodon-tl--byline (toot &optional detailed-p domain base-toot group account ts type) "Generate byline for TOOT. AUTHOR-BYLINE is a function for adding the author portion of @@ -861,7 +861,7 @@ 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) + (mastodon-tl--byline-author toot nil domain :base account) ;; visibility: (cond ((string= visibility "direct") (propertize (concat " " (mastodon-tl--symbol 'direct)) @@ -1654,7 +1654,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. @@ -1709,8 +1709,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,10 +1791,9 @@ NO-BYLINE means just insert toot body, used for folding." (if (and filtered (assoc "hide" filters)) nil ;; 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. -- cgit v1.2.3 From 89f93a1316b229313dac36125a6ad439ed1e1ae1 Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Wed, 30 Oct 2024 08:52:46 +0100 Subject: remove ACCOUNT and TYPE from our byline functions. to avoid them, for foll/reqs we send the full notif as TOOT arg, and fetch type/account from it as needed. muuuuuuuuch simpler, fingers crossed. fix grouped notifs new non-account arg byline code fix handle byline for grouped notifs --- lisp/mastodon-notifications.el | 18 ++++++------------ lisp/mastodon-tl.el | 41 +++++++++++++++++++---------------------- 2 files changed, 25 insertions(+), 34 deletions(-) (limited to 'lisp/mastodon-notifications.el') diff --git a/lisp/mastodon-notifications.el b/lisp/mastodon-notifications.el index 6d6b339..1b04699 100644 --- a/lisp/mastodon-notifications.el +++ b/lisp/mastodon-notifications.el @@ -238,7 +238,7 @@ JSON is a list of alists." (mastodon-notifications--insert-note ;; toot (if (member type '(follow follow_request)) - follower + note ;; full notif, not just follower acct? status) ;; body (mastodon-notifiations--body-arg @@ -281,8 +281,7 @@ JSON is a list of alists." ;; action authors (cond ((member type '(follow follow_request mention)) "") ;; mentions are normal statuses - (t (mastodon-tl--byline-username - note (alist-get 'account note)))) + (t (mastodon-tl--byline-username note))) ;; action symbol: (unless (eq type 'mention) (mastodon-tl--symbol type)) @@ -395,7 +394,8 @@ 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." +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))) @@ -417,16 +417,10 @@ ACCOUNTS is the notification accounts data." ;; actual byline: (mastodon-tl--byline toot nil nil base-toot group - ;; FIXME: remove account arg (esp. if we have type). maybe we need - ;; type arg when we step from notifs (here); to tl--byline land - ;; (there): - (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)) - type)) + (mastodon-tl--field 'latest_page_notification_at group)))) 'item-type 'toot ;; for nav, actions, etc. 'item-id (or (alist-get 'page_max_id group) ;; newest notif (alist-get 'id toot)) ; toot id @@ -478,7 +472,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 toot nil uname 'mastodon-display-name-face)) ", "))) nil ", ") diff --git a/lisp/mastodon-tl.el b/lisp/mastodon-tl.el index 61014ff..4846164 100644 --- a/lisp/mastodon-tl.el +++ b/lisp/mastodon-tl.el @@ -610,14 +610,12 @@ 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)) +TOOT may be account data, or toot data, in which case acount data +is extracted from it." + (let-alist (or (alist-get 'account toot) + toot) ;; grouped nofifs use account data directly (propertize (if (not (string-empty-p .display_name)) .display_name .username) @@ -635,7 +633,7 @@ ACCOUNT is optionally acccount data to use." (string-suffix-p "-following*" (buffer-name))) (mastodon-tl--format-byline-help-echo toot))))) -(defun mastodon-tl--byline-handle (toot &optional domain account string face) +(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 +641,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 +652,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 +671,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 +682,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 +699,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. @@ -797,7 +795,7 @@ LETTER is a string, F for favourited, B for boosted, or K for bookmarked." (image-transforms-p))) (defun mastodon-tl--byline (toot &optional detailed-p - domain base-toot group account ts type) + 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. @@ -811,7 +809,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 (or type (alist-get 'type (or group toot)))) + (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 @@ -828,8 +826,7 @@ TS is a timestamp from the server, if any." (visibility (mastodon-tl--field 'visibility 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))) + (account (alist-get 'account base-toot-maybe)) (avatar-url (alist-get 'avatar account)) (edited-time (alist-get 'edited_at base-toot-maybe)) (edited-parsed (when edited-time (date-to-time edited-time)))) @@ -861,7 +858,7 @@ 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: - (mastodon-tl--byline-author toot nil domain :base account) + (mastodon-tl--byline-author toot nil domain :base) ;; visibility: (cond ((string= visibility "direct") (propertize (concat " " (mastodon-tl--symbol 'direct)) -- cgit v1.2.3 From 521c87ea65ccd1976e76e70c7be0abc625fc61d5 Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Wed, 30 Oct 2024 08:53:39 +0100 Subject: notifs: remove commented body-arg code from format-note --- lisp/mastodon-notifications.el | 30 ------------------------------ 1 file changed, 30 deletions(-) (limited to 'lisp/mastodon-notifications.el') diff --git a/lisp/mastodon-notifications.el b/lisp/mastodon-notifications.el index 1b04699..23bd1fa 100644 --- a/lisp/mastodon-notifications.el +++ b/lisp/mastodon-notifications.el @@ -243,36 +243,6 @@ JSON is a list of alists." ;; body (mastodon-notifiations--body-arg type filters status profile-note follower-name) - ;; (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))) ;; action-byline (unless (member type '(follow follow_request mention)) (downcase -- cgit v1.2.3 From 411e9f22e0f770b8a416ea587dc8be0260ca4d91 Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Wed, 30 Oct 2024 19:25:19 +0100 Subject: grouped notifs: top byline create with account data, not toot. #612 half fixed. --- lisp/mastodon-notifications.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lisp/mastodon-notifications.el') diff --git a/lisp/mastodon-notifications.el b/lisp/mastodon-notifications.el index 23bd1fa..d9f7114 100644 --- a/lisp/mastodon-notifications.el +++ b/lisp/mastodon-notifications.el @@ -442,7 +442,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 + (mastodon-tl--byline-handle account nil uname 'mastodon-display-name-face)) ", "))) nil ", ") -- cgit v1.2.3 From 089eee64854ad6d8a880b0949fba7e2c1fb04cc6 Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Wed, 30 Oct 2024 20:03:16 +0100 Subject: notifs: fix author action byline, top, for ungrouped. FIX #612 --- lisp/mastodon-notifications.el | 28 ++++++++++++---------------- lisp/mastodon-tl.el | 37 +++++++++++++++++++------------------ 2 files changed, 31 insertions(+), 34 deletions(-) (limited to 'lisp/mastodon-notifications.el') diff --git a/lisp/mastodon-notifications.el b/lisp/mastodon-notifications.el index d9f7114..862f2a2 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") @@ -243,7 +242,7 @@ JSON is a list of alists." ;; body (mastodon-notifiations--body-arg type filters status profile-note follower-name) - ;; action-byline + ;; action-byline (top) (unless (member type '(follow follow_request mention)) (downcase (mastodon-notifications--byline-concat @@ -251,10 +250,9 @@ JSON is a list of alists." ;; action authors (cond ((member type '(follow follow_request mention)) "") ;; mentions are normal statuses - (t (mastodon-tl--byline-username note))) - ;; action symbol: - (unless (eq type 'mention) - (mastodon-tl--symbol type)) + (t (mastodon-tl--byline-handle note nil + follower-name + 'mastodon-display-name-face))) ;; base toot (when (or (eq type 'favourite) (eq type 'boost)) @@ -300,9 +298,6 @@ ACCOUNTS is data of the accounts that have reacted to the notification." "") ;; mentions are normal statuses (t (mastodon-notifications--byline-accounts accounts status group))) - ;; action symbol: - (unless (eq type 'mention) - (mastodon-tl--symbol type)) ;; base toot (no need for update/poll/?) (when (member type '(favourite reblog)) status) @@ -344,7 +339,7 @@ FILTERS STATUS PROFILE-NOTE FOLLOWER-NAME GROUP." (t body)))) (defun mastodon-notifications--insert-note - (toot body action-byline action-authors action-symbol + (toot body action-byline action-authors &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. @@ -369,18 +364,19 @@ TYPE is notification type, used for non-group notifs." (let* ((type (if type (symbol-name type) ;; non-group (alist-get 'type group))) + (action-symbol (unless (eq type 'mention) + (mastodon-tl--symbol (intern type)))) (toot-foldable (and mastodon-tl--fold-toots-at-length (length> body mastodon-tl--fold-toots-at-length)))) (insert (propertize ;; top byline, body + byline: (concat - (propertize ;; top byline - (if (equal type "mention") - "" - (concat action-symbol " " action-authors - action-byline)) - 'byline-top t) + (if (equal type "mention") + "" + (propertize ;; top byline + (concat action-symbol " " action-authors action-byline) + 'byline-top t)) (propertize body ;; body only 'toot-body t) ;; includes newlines etc. for folding "\n" diff --git a/lisp/mastodon-tl.el b/lisp/mastodon-tl.el index 3a7988e..6f510b3 100644 --- a/lisp/mastodon-tl.el +++ b/lisp/mastodon-tl.el @@ -615,24 +615,25 @@ Do so if type of status at poins is not follow_request/follow." "Format a byline username from account in TOOT. TOOT may be account data, or toot data, in which case acount data is extracted from it." - (let-alist (or (alist-get 'account toot) - toot) ;; grouped nofifs use account data directly - (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))))) + (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. -- cgit v1.2.3 From 5cb2bf1c0409acb2a88f5ad45135fadb6d84db7a Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Wed, 30 Oct 2024 20:59:57 +0100 Subject: FIX #610 fix note/base toot in format-note/author byline. non-grouped notif pagination was broken because we were propertizing item-json and base-toot wrong. now we always hand insert-note the note data as toot, and the status notified about as base-toot. then we adjust our handling of this in tl--byline-author to display base item byline correctly. --- lisp/mastodon-notifications.el | 12 +++++------- lisp/mastodon-tl.el | 5 ++++- 2 files changed, 9 insertions(+), 8 deletions(-) (limited to 'lisp/mastodon-notifications.el') diff --git a/lisp/mastodon-notifications.el b/lisp/mastodon-notifications.el index 862f2a2..9ff8413 100644 --- a/lisp/mastodon-notifications.el +++ b/lisp/mastodon-notifications.el @@ -236,9 +236,9 @@ JSON is a list of alists." nil (mastodon-notifications--insert-note ;; toot - (if (member type '(follow follow_request)) - note ;; full notif, not just follower acct? - status) + ;; should always be note, otherwise notif data not avail + ;; later on: + note ;; body (mastodon-notifiations--body-arg type filters status profile-note follower-name) @@ -253,10 +253,8 @@ JSON is a list of alists." (t (mastodon-tl--byline-handle note nil follower-name 'mastodon-display-name-face))) - ;; base toot - (when (or (eq type 'favourite) - (eq type 'boost)) - status) + ;; base toot (always provide) + status nil nil nil type)))) (defun mastodon-notifications--format-group-note (group status accounts) diff --git a/lisp/mastodon-tl.el b/lisp/mastodon-tl.el index 6f510b3..7e37b00 100644 --- a/lisp/mastodon-tl.el +++ b/lisp/mastodon-tl.el @@ -860,7 +860,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: - (mastodon-tl--byline-author toot nil domain :base) + ;; 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)) -- cgit v1.2.3 From 27e438a2a4bbd2ee35cb70c382980216e6710866 Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Wed, 30 Oct 2024 21:47:06 +0100 Subject: fix author action byline non-grouped notifs: use display-name if poss --- lisp/mastodon-notifications.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lisp/mastodon-notifications.el') diff --git a/lisp/mastodon-notifications.el b/lisp/mastodon-notifications.el index 9ff8413..c27ffef 100644 --- a/lisp/mastodon-notifications.el +++ b/lisp/mastodon-notifications.el @@ -228,7 +228,8 @@ JSON is a list of alists." str)))) (status (mastodon-tl--field 'status note)) (follower (alist-get 'account note)) - (follower-name (alist-get 'username follower)) + (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)))) -- cgit v1.2.3 From 271308160538a2631869f3bb61e0dfdede2ad4d3 Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Wed, 30 Oct 2024 22:25:40 +0100 Subject: notifs: byline-accounts: remove toot arg --- lisp/mastodon-notifications.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lisp/mastodon-notifications.el') diff --git a/lisp/mastodon-notifications.el b/lisp/mastodon-notifications.el index c27ffef..384241d 100644 --- a/lisp/mastodon-notifications.el +++ b/lisp/mastodon-notifications.el @@ -414,8 +414,8 @@ TYPE is notification type, used for non-group notifs." ;; 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." -- cgit v1.2.3 From 464d2e463423f7c431f85497658531312c2ad448 Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Thu, 31 Oct 2024 08:32:10 +0100 Subject: notifs: factor an action-byline fun (maybe move into insert-note) --- lisp/mastodon-notifications.el | 153 +++++++++++++++++++++-------------------- 1 file changed, 79 insertions(+), 74 deletions(-) (limited to 'lisp/mastodon-notifications.el') diff --git a/lisp/mastodon-notifications.el b/lisp/mastodon-notifications.el index 384241d..e5ad1ea 100644 --- a/lisp/mastodon-notifications.el +++ b/lisp/mastodon-notifications.el @@ -244,16 +244,8 @@ JSON is a list of alists." (mastodon-notifiations--body-arg type filters status profile-note follower-name) ;; action-byline (top) - (unless (member type '(follow follow_request mention)) - (downcase - (mastodon-notifications--byline-concat - (alist-get type mastodon-notifications--action-alist)))) - ;; action authors - (cond ((member type '(follow follow_request mention)) - "") ;; mentions are normal statuses - (t (mastodon-tl--byline-handle note nil - follower-name - 'mastodon-display-name-face))) + (mastodon-notifications--action-byline + type nil nil note follower-name) ;; base toot (always provide) status nil nil nil type)))) @@ -288,20 +280,36 @@ ACCOUNTS is data of the accounts that have reacted to the notification." (mastodon-notifiations--body-arg type filters status profile-note follower-name group) ;; action-byline - (unless (member type '(follow follow_request mention)) - (downcase - (mastodon-notifications--byline-concat - (alist-get type mastodon-notifications--action-alist)))) - ;; action authors - (cond ((member type '(follow follow_request mention)) - "") ;; mentions are normal statuses - (t (mastodon-notifications--byline-accounts - accounts status group))) + (mastodon-notifications--action-byline + type accounts group) ;; base toot (no need for update/poll/?) (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'. @@ -338,9 +346,9 @@ FILTERS STATUS PROFILE-NOTE FOLLOWER-NAME GROUP." (t body)))) (defun mastodon-notifications--insert-note - (toot body action-byline action-authors + (toot body action-byline &optional base-toot unfolded group accounts type) - "Display the content and byline of timeline element TOOT. +"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 portion of the byline that takes one variable. By default it is @@ -360,59 +368,56 @@ foldable. GROUP is the notification group data. 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))) - (action-symbol (unless (eq type 'mention) - (mastodon-tl--symbol (intern type)))) - (toot-foldable - (and mastodon-tl--fold-toots-at-length - (length> body mastodon-tl--fold-toots-at-length)))) - (insert - (propertize ;; top byline, body + byline: - (concat - (if (equal type "mention") - "" - (propertize ;; top byline - (concat action-symbol " " action-authors action-byline) - 'byline-top t)) - (propertize body ;; body only - 'toot-body t) ;; includes newlines etc. for folding - "\n" - ;; actual byline: - (mastodon-tl--byline - toot nil nil base-toot group - ;; 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)))) - 'item-type 'toot ;; for nav, actions, etc. - 'item-id (or (alist-get 'page_max_id group) ;; newest notif - (alist-get 'id toot)) ; toot id - 'base-item-id (mastodon-tl--item-id - ;; if status is a notif, get id from base-toot - ;; (-tl--item-id toot) will not work here: - (or base-toot - toot)) ; else normal toot with reblog check - 'item-json toot - 'base-toot base-toot - 'cursor-face 'mastodon-cursor-highlight-face - 'toot-foldable toot-foldable - '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: - 'notifications-min-id (alist-get 'page_min_id group) - '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. +(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))) + (follower (alist-get 'account toot)) + (follower-name (or (alist-get 'display_name follower) + (alist-get 'username follower)))) + (insert + (propertize ;; top byline, body + byline: + (concat + (if (equal type "mention") ;; top (action) byline + "" + action-byline) + ;; (mastodon-notifications--action-byline + ;; (intern type) accounts group toot follower-name)) + (propertize body ;; body only + 'toot-body t) ;; includes newlines etc. for folding + "\n" + ;; actual byline: + (mastodon-tl--byline + toot nil nil base-toot group + ;; 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)))) + 'item-type 'toot ;; for nav, actions, etc. + 'item-id (or (alist-get 'page_max_id group) ;; newest notif + (alist-get 'id toot)) ; toot id + 'base-item-id (mastodon-tl--item-id + ;; if status is a notif, get id from base-toot + ;; (-tl--item-id toot) will not work here: + (or base-toot + toot)) ; else normal toot with reblog check + 'item-json toot + 'base-toot base-toot + 'cursor-face 'mastodon-cursor-highlight-face + 'toot-foldable toot-foldable + '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: + 'notifications-min-id (alist-get 'page_min_id group) + 'notifications-max-id (alist-get 'page_max_id group)) + "\n"))) + (defun mastodon-notifications--byline-accounts (accounts group &optional avatar) "Propertize author byline ACCOUNTS. -- cgit v1.2.3 From 380c6be86f570854cc9b2a714f36301339e57c8b Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Thu, 31 Oct 2024 09:43:12 +0100 Subject: keep cleaning up notifs insert note --- lisp/mastodon-notifications.el | 99 +++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 50 deletions(-) (limited to 'lisp/mastodon-notifications.el') diff --git a/lisp/mastodon-notifications.el b/lisp/mastodon-notifications.el index e5ad1ea..99d9d89 100644 --- a/lisp/mastodon-notifications.el +++ b/lisp/mastodon-notifications.el @@ -348,7 +348,7 @@ FILTERS STATUS PROFILE-NOTE FOLLOWER-NAME GROUP." (defun mastodon-notifications--insert-note (toot body action-byline &optional base-toot unfolded group accounts type) -"Display the content and byline of timeline element TOOT. + "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 portion of the byline that takes one variable. By default it is @@ -368,55 +368,54 @@ foldable. GROUP is the notification group data. 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))) - (follower (alist-get 'account toot)) - (follower-name (or (alist-get 'display_name follower) - (alist-get 'username follower)))) - (insert - (propertize ;; top byline, body + byline: - (concat - (if (equal type "mention") ;; top (action) byline - "" - action-byline) - ;; (mastodon-notifications--action-byline - ;; (intern type) accounts group toot follower-name)) - (propertize body ;; body only - 'toot-body t) ;; includes newlines etc. for folding - "\n" - ;; actual byline: - (mastodon-tl--byline - toot nil nil base-toot group - ;; 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)))) - 'item-type 'toot ;; for nav, actions, etc. - 'item-id (or (alist-get 'page_max_id group) ;; newest notif - (alist-get 'id toot)) ; toot id - 'base-item-id (mastodon-tl--item-id - ;; if status is a notif, get id from base-toot - ;; (-tl--item-id toot) will not work here: - (or base-toot - toot)) ; else normal toot with reblog check - 'item-json toot - 'base-toot base-toot - 'cursor-face 'mastodon-cursor-highlight-face - 'toot-foldable toot-foldable - '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: - 'notifications-min-id (alist-get 'page_min_id group) - 'notifications-max-id (alist-get 'page_max_id group)) - "\n"))) + (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))) + (follower (alist-get 'account toot)) + (follower-name (or (alist-get 'display_name follower) + (alist-get 'username follower))) + (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 + (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 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 + 'base-item-id (mastodon-tl--item-id + ;; if status is a notif, get id from base-toot + ;; (-tl--item-id toot) will not work here: + (or base-toot + toot)) ; else normal toot with reblog check + 'item-json toot + 'base-toot base-toot + 'cursor-face 'mastodon-cursor-highlight-face + 'toot-foldable toot-foldable + '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: + 'notifications-min-id (alist-get 'page_min_id group) + 'notifications-max-id (alist-get 'page_max_id group)) + "\n"))) (defun mastodon-notifications--byline-accounts (accounts group &optional avatar) -- cgit v1.2.3 From c4edecd145eafc7f6d7fd58106dbc0bca43ed861 Mon Sep 17 00:00:00 2001 From: marty hiatt Date: Thu, 31 Oct 2024 10:08:47 +0100 Subject: cask build cleanups --- lisp/mastodon-notifications.el | 3 --- lisp/mastodon-toot.el | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'lisp/mastodon-notifications.el') diff --git a/lisp/mastodon-notifications.el b/lisp/mastodon-notifications.el index 99d9d89..eed3d20 100644 --- a/lisp/mastodon-notifications.el +++ b/lisp/mastodon-notifications.el @@ -374,9 +374,6 @@ TYPE is notification type, used for non-group notifs." (toot-foldable (and mastodon-tl--fold-toots-at-length (length> body mastodon-tl--fold-toots-at-length))) - (follower (alist-get 'account toot)) - (follower-name (or (alist-get 'display_name follower) - (alist-get 'username follower))) (ts ;; types listed here use base item timestamp, else we use ;; group's latest timestamp: (when (and group diff --git a/lisp/mastodon-toot.el b/lisp/mastodon-toot.el index 82ebc90..fa5a955 100644 --- a/lisp/mastodon-toot.el +++ b/lisp/mastodon-toot.el @@ -36,14 +36,18 @@ (require 'emojify nil :noerror) (declare-function emojify-insert-emoji "emojify") (declare-function emojify-set-emoji-data "emojify") +(declare-function emojify-mode "emojify") +(declare-function emojify-emojis-each "emojify") (defvar emojify-emojis-dir) (defvar emojify-user-emojis) +(defvar emojify-emoji-styles) (require 'cl-lib) (require 'persist) (require 'mastodon-iso) (require 'facemenu) (require 'text-property-search) +(require 'ht) (eval-when-compile (require 'mastodon-tl)) -- cgit v1.2.3