aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lisp/mastodon-profile.el36
-rw-r--r--lisp/mastodon-toot.el27
2 files changed, 54 insertions, 9 deletions
diff --git a/lisp/mastodon-profile.el b/lisp/mastodon-profile.el
index cf27732..3065621 100644
--- a/lisp/mastodon-profile.el
+++ b/lisp/mastodon-profile.el
@@ -35,6 +35,7 @@
;;; Code:
(require 'seq)
(require 'cl-lib)
+(require 'persist)
(autoload 'mastodon-http--api "mastodon-http.el")
(autoload 'mastodon-http--get-json "mastodon-http.el")
@@ -67,10 +68,12 @@
(autoload 'mastodon-toot "mastodon")
(autoload 'mastodon-search--insert-users-propertized "mastodon-search")
(autoload 'mastodon-tl--get-endpoint "mastodon-tl.el")
+(autoload 'mastodon-toot--get-max-toot-chars "mastodon-toot")
(defvar mastodon-instance-url)
(defvar mastodon-tl--buffer-spec)
(defvar mastodon-tl--update-point)
(defvar mastodon-mode-map)
+(defvar mastodon-toot--max-toot-chars)
(defvar-local mastodon-profile--account nil
"The data for the account being described in the current profile buffer.")
@@ -116,6 +119,9 @@ extra keybindings."
map)
"Keymap for `mastodon-profile-update-mode'.")
+(persist-defvar mastodon-profile-account-settings nil
+ "An alist of account settings saved from the server.")
+
(define-minor-mode mastodon-profile-update-mode
"Minor mode to update Mastodon user profile."
:group 'mastodon-profile
@@ -267,8 +273,38 @@ SOURCE means that the preference is in the 'source' part of the account json."
(response (mastodon-http--patch url `((,pref-formatted ,val)))))
(mastodon-http--triage response
(lambda ()
+ (mastodon-profile-update-preference-alist pref val)
(message "Account setting %s updated to %s!" pref val)))))
+(defun mastodon-profile-update-preference-alist (pref val)
+ "Set local account preference plist preference PREF to VAL.
+This is done after changing the setting on the server."
+ (setf (plist-get mastodon-profile-account-settings pref) val))
+
+(defun mastodon-profile-fetch-server-account-settings ()
+ "Fetch basic account settings from the server.
+Store the values in `mastodon-profile-account-settings'.
+Run in `mastodon-mode-hook'."
+ ;; TODO: add some server settings like max_chars
+ (let ((keys '(locked discoverable display_name))
+ (source-keys '(privacy)))
+ ;; (instance-keys '(max_toot_chars)))
+ (mapc (lambda (k)
+ (mastodon-profile-update-preference-alist
+ k
+ (mastodon-profile--get-json-value k)))
+ keys)
+ (mapc (lambda (sk)
+ (mastodon-profile-update-preference-alist
+ sk
+ (mastodon-profile--get-source-pref sk)))
+ source-keys)
+ ;; hack for max toot chars:
+ (mastodon-toot--get-max-toot-chars :no-toot)
+ (mastodon-profile-update-preference-alist 'max_toot_chars
+ mastodon-toot--max-toot-chars)
+ mastodon-profile-account-settings))
+
(defun mastodon-profile-account-locked-toggle ()
"Toggle the locked status of your account.
Locked accounts mean follow requests have to be manually approved."
diff --git a/lisp/mastodon-toot.el b/lisp/mastodon-toot.el
index 7048996..2f58bfb 100644
--- a/lisp/mastodon-toot.el
+++ b/lisp/mastodon-toot.el
@@ -143,13 +143,15 @@ This is only used if company mode is installed."
'(direct private unlisted public)
"A list of the available toot visibility settings.")
-(defvar-local mastodon-toot--visibility "public"
+(defvar-local mastodon-toot--visibility nil
"A string indicating the visibility of the toot being composed.
Valid values are \"direct\", \"private\" (followers-only),
\"unlisted\", and \"public\".
-This may be set by the account setting on the server.")
+This is determined by the account setting on the server. To
+change the setting on the server, see
+`mastodon-toot-set-default-visibility'.")
(defvar-local mastodon-toot--media-attachments nil
"A list of the media attachments of the toot being composed.")
@@ -194,12 +196,12 @@ send.")
nil t)))
(mastodon-profile--update-preference "privacy" vis :source)))
-(defun mastodon-toot--get-max-toot-chars ()
+(defun mastodon-toot--get-max-toot-chars (&optional no-toot)
"Fetch max_toot_chars from `mastodon-instance-url' asynchronously."
(mastodon-http--get-json-async
- (mastodon-http--api "instance") 'mastodon-toot--get-max-toot-chars-callback))
+ (mastodon-http--api "instance") 'mastodon-toot--get-max-toot-chars-callback 'no-toot))
-(defun mastodon-toot--get-max-toot-chars-callback (json-response)
+(defun mastodon-toot--get-max-toot-chars-callback (json-response &optional no-toot)
"Set max_toot_chars returned in JSON-RESPONSE and display in new toot buffer."
(let ((max-chars
(or
@@ -210,8 +212,9 @@ send.")
(alist-get 'configuration
json-response))))))
(setq mastodon-toot--max-toot-chars max-chars)
- (with-current-buffer "*new toot*"
- (mastodon-toot--update-status-fields))))
+ (unless no-toot
+ (with-current-buffer "*new toot*"
+ (mastodon-toot--update-status-fields)))))
(defun mastodon-toot--action-success (marker byline-region remove)
"Insert/remove the text MARKER with 'success face in byline.
@@ -1118,6 +1121,8 @@ Added to `after-change-functions' in new toot buffers."
"Return t if compose buffer is current."
(equal (buffer-name (current-buffer)) "*new toot*"))
+;; NB: now that we have toot drafts, to ensure offline composing remains
+;; possible, avoid any direct requests here:
(defun mastodon-toot--compose-buffer (&optional reply-to-user
reply-to-id reply-json initial-text)
"Create a new buffer to capture text for a new toot.
@@ -1133,15 +1138,19 @@ a draft into the buffer."
(switch-to-buffer-other-window buffer)
(text-mode)
(mastodon-toot-mode t)
- ;; use toot visibility setting from the server:
(setq mastodon-toot--visibility
- (mastodon-profile--get-source-pref 'privacy))
+ (or (plist-get mastodon-profile-account-settings 'privacy)
+ ;; use toot visibility setting from the server:
+ (mastodon-profile--get-source-pref 'privacy)
+ "public")) ; fallback
(unless buffer-exists
(mastodon-toot--display-docs-and-status-fields
(when mastodon-toot-display-orig-in-reply-buffer
reply-text))
(mastodon-toot--setup-as-reply reply-to-user reply-to-id reply-json))
(unless mastodon-toot--max-toot-chars
+ ;; no need to fetch from `mastodon-profile-account-settings' as
+ ;; `mastodon-toot--max-toot-chars' is set when we set it
(mastodon-toot--get-max-toot-chars))
;; set up company backends:
(when (require 'company nil :noerror)