aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lisp/mastodon-http.el19
-rw-r--r--lisp/mastodon-profile.el63
-rw-r--r--lisp/mastodon-search.el5
-rw-r--r--lisp/mastodon-toot.el25
4 files changed, 81 insertions, 31 deletions
diff --git a/lisp/mastodon-http.el b/lisp/mastodon-http.el
index 49b2375..9904232 100644
--- a/lisp/mastodon-http.el
+++ b/lisp/mastodon-http.el
@@ -168,7 +168,7 @@ Pass response buffer to CALLBACK function."
(defun mastodon-http--append-query-string (url params)
"Append PARAMS to URL as query strings and return it.
-PARAMS should be an alist as required `url-build-query-string'."
+PARAMS should be an alist as required by `url-build-query-string'."
(let ((query-string (url-build-query-string params)))
(concat url "?" query-string)))
@@ -204,21 +204,18 @@ PARAM is a formatted request parameter, eg 'following=true'."
;; profile update functions
-(defun mastodon-http--patch-json (url)
- "Make synchronous PATCH request to URL. Return JSON response."
- (with-current-buffer (mastodon-http--patch url)
+(defun mastodon-http--patch-json (url &optional params)
+ "Make synchronous PATCH request to URL. Return JSON response.
+Optionally specify the PARAMS to send."
+ (with-current-buffer (mastodon-http--patch url params)
(mastodon-http--process-json)))
-;; hard coded just for bio note for now:
-(defun mastodon-http--patch (base-url &optional note)
+(defun mastodon-http--patch (base-url &optional params)
"Make synchronous PATCH request to BASE-URL.
-Optionally specify the NOTE to edit.
-Pass response buffer to CALLBACK function."
+Optionally specify the PARAMS to send."
(mastodon-http--authorized-request
"PATCH"
- (let ((url (if note
- (concat base-url "?note=" (url-hexify-string note))
- base-url)))
+ (let ((url (mastodon-http--append-query-string base-url params)))
(mastodon-http--url-retrieve-synchronously url))))
;; Asynchronous functions
diff --git a/lisp/mastodon-profile.el b/lisp/mastodon-profile.el
index 516059e..0c91556 100644
--- a/lisp/mastodon-profile.el
+++ b/lisp/mastodon-profile.el
@@ -70,6 +70,7 @@
(defvar mastodon-tl--buffer-spec)
(defvar mastodon-tl--update-point)
(defvar mastodon-mode-map)
+(defvar mastodon-toot-visibility-list)
(defvar-local mastodon-profile--account nil
"The data for the account being described in the current profile buffer.")
@@ -207,14 +208,25 @@ JSON is the data returned by the server."
'byline t
'toot-id "0"))
(mastodon-search--insert-users-propertized json :note)))
- ;; (mastodon-profile--add-author-bylines json)))
+;; (mastodon-profile--add-author-bylines json)))
+
+;;; account preferences
+
+(defun mastodon-profile--get-source-prefs ()
+ "Return the \"source\" preferences from the server."
+ (let* ((url (mastodon-http--api "accounts/verify_credentials"))
+ (response (mastodon-http--get-json url)))
+ (alist-get 'source response)))
+
+(defun mastodon-profile--get-source-pref (pref)
+ "Return account PREF erence from the \"source\" section on the server."
+ (let ((source (mastodon-profile--get-source-prefs)))
+ (alist-get pref source)))
(defun mastodon-profile--update-user-profile-note ()
"Fetch user's profile note and display for editing."
(interactive)
- (let* ((url (concat mastodon-instance-url
- "/api/v1/accounts/update_credentials"))
- ;; (buffer (mastodon-http--patch url))
+ (let* ((url (mastodon-http--api "accounts/update_credentials"))
(json (mastodon-http--patch-json url))
(source (alist-get 'source json))
(note (alist-get 'note source))
@@ -236,13 +248,50 @@ JSON is the data returned by the server."
"Send PATCH request with the updated profile note."
(interactive)
(let* ((note (buffer-substring-no-properties (point-min) (point-max)))
- (url (concat mastodon-instance-url
- "/api/v1/accounts/update_credentials")))
+ (url (mastodon-http--api "accounts/update_credentials")))
(kill-buffer-and-window)
- (let ((response (mastodon-http--patch url note)))
+ (let ((response (mastodon-http--patch url `((note ,note)))))
(mastodon-http--triage response
(lambda () (message "Profile note updated!"))))))
+(defun mastodon-profile--update-preference (pref val &optional source)
+ "Update a single acount PREF erence to setting VAL.
+SOURCE means that the preference is in the 'source' part of the account json."
+ (let* ((url (mastodon-http--api "accounts/update_credentials"))
+ (pref (if source (concat "source[" pref "]") pref))
+ (response (mastodon-http--patch url `((,pref ,val)))))
+ (mastodon-http--triage response
+ (lambda ()
+ (message "Account setting %s updated!" pref)))))
+
+(defun mastodon-profile-set-default-toot-visibility ()
+ "Set the default visibility for toots."
+ (interactive)
+ (let ((vis (completing-read "Set default visibility to:"
+ mastodon-toot-visibility-list
+ nil t)))
+ (mastodon-profile--update-preference "privacy" vis :source)))
+
+(defun mastodon-profile-view-preferences ()
+ "View user preferences in another window."
+ (interactive)
+ (let* ((url (mastodon-http--api "preferences"))
+ (response (mastodon-http--get-json url))
+ (buf (get-buffer-create "*mastodon-preferences*")))
+ (with-current-buffer buf
+ (switch-to-buffer-other-window buf)
+ (erase-buffer)
+ (special-mode)
+ (let ((inhibit-read-only t))
+ (while response
+ (let ((el (pop response)))
+ (insert
+ (format "%-30s %s"
+ (prin1-to-string (car el))
+ (prin1-to-string (cdr el)))
+ "\n\n"))))
+ (goto-char (point-min)))))
+
(defun mastodon-profile--relationships-get (id)
"Fetch info about logged-in user's relationship to user with id ID."
(let* ((their-id id)
diff --git a/lisp/mastodon-search.el b/lisp/mastodon-search.el
index 8d450e3..10e12c3 100644
--- a/lisp/mastodon-search.el
+++ b/lisp/mastodon-search.el
@@ -103,6 +103,11 @@ QUERY is the string to search."
(mastodon-mode)
(let ((inhibit-read-only t))
(erase-buffer)
+ (setq mastodon-tl--buffer-spec
+ `(buffer-name ,buffer
+ endpoint ,(format "api/v2/search")
+ update-function
+ (lambda (toot) (message "Searched."))))
;; user results:
(insert (mastodon-tl--set-face
(concat "\n ------------\n"
diff --git a/lisp/mastodon-toot.el b/lisp/mastodon-toot.el
index 23abb84..8d8b9f3 100644
--- a/lisp/mastodon-toot.el
+++ b/lisp/mastodon-toot.el
@@ -71,6 +71,7 @@
(autoload 'mastodon-tl--reload-timeline-or-profile "mastodon-tl")
(autoload 'mastodon-tl--toot-id "mastodon-tl")
(autoload 'mastodon-toot "mastodon")
+(autoload 'mastodon-profile--get-source-pref "mastodon-profile")
;; for mastodon-toot--translate-toot-text
(autoload 'mastodon-tl--content "mastodon-tl")
@@ -82,18 +83,6 @@
:prefix "mastodon-toot-"
:group 'mastodon)
-(defcustom mastodon-toot--default-visibility "public"
- "The default visibility for new toots.
-
-Must be one of \"public\", \"unlisted\", \"private\" (for
-followers-only), or \"direct\"."
- :group 'mastodon-toot
- :type '(choice
- (const :tag "public" "public")
- (const :tag "unlisted" "unlisted")
- (const :tag "followers only" "private")
- (const :tag "direct" "direct")))
-
(defcustom mastodon-toot--default-media-directory "~/"
"The default directory when prompting for a media file to upload."
:group 'mastodon-toot
@@ -137,11 +126,17 @@ This is only used if company mode is installed."
(defvar-local mastodon-toot--content-nsfw nil
"A flag indicating whether the toot should be marked as NSFW.")
+(defvar mastodon-toot-visibility-list
+ '(direct private unlisted public)
+ "A list of the available toot visibility settings.")
+
(defvar-local mastodon-toot--visibility "public"
"A string indicating the visibility of the toot being composed.
Valid values are \"direct\", \"private\" (followers-only),
-\"unlisted\", and \"public\".")
+\"unlisted\", and \"public\".
+
+This may be set by the account setting on the server.")
(defvar-local mastodon-toot--media-attachments nil
"A list of the media attachments of the toot being composed.")
@@ -1030,11 +1025,15 @@ REPLY-JSON is the full JSON of the toot being replied to."
(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))
(unless buffer-exists
(mastodon-toot--display-docs-and-status-fields)
(mastodon-toot--setup-as-reply reply-to-user reply-to-id reply-json))
(unless mastodon-toot--max-toot-chars
(mastodon-toot--get-max-toot-chars))
+ ;; set up company backends:
(when (require 'company nil :noerror)
(when mastodon-toot--enable-completion
(set (make-local-variable 'company-backends)