From 2dfdb0b8594d6602672cf45e4bec6e35255edbbf Mon Sep 17 00:00:00 2001 From: Cy Date: Sat, 30 May 2020 23:07:38 +0000 Subject: [PATCH 1/4] Support feature_set= other than mainline for Mastodon Pleroma will send records that cause brutaldon to make pleroma-specific responses, which the mastodon python module wigs out on claiming it doesn't support that "feature set" so allow for a feature set to be specified... --- brutaldon/views.py | 46 +++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/brutaldon/views.py b/brutaldon/views.py index 5249078..a561e13 100644 --- a/brutaldon/views.py +++ b/brutaldon/views.py @@ -71,7 +71,7 @@ def get_session(domain): return s -def get_usercontext(request): +def get_usercontext(request, feature_set="mainline"): if is_logged_in(request): try: client = Client.objects.get(api_base_id=request.session["active_instance"]) @@ -83,13 +83,14 @@ def get_usercontext(request): Account.MultipleObjectsReturned, ): raise NotLoggedInException() - mastodon = Mastodon( + mastodon = get_mastodon()Mastodon( client_id=client.client_id, client_secret=client.client_secret, access_token=user.access_token, api_base_url=client.api_base_id, session=get_session(client.api_base_id), ratelimit_method="throw", + feature_set=feature_set ) return user, mastodon else: @@ -808,7 +809,23 @@ def settings(request): {"form": form, "account": account, "preferences": account.preferences}, ) +def status_post(account, request, mastodon, **kw): + try: + mastodon.status_post(**kw) + except MastodonIllegalArgumentError as e: + if not 'is only available with feature set' in e.args[0]: + raise + feature_set = e.args[0].rsplit(" ",1)[-1] + account, mastodon = get_usercontext(request, + feature_set=feature_set) + + return status_post(account, request, mastodon, **kw) + except TypeError: + kw.pop("content_type") + return status_post(account, request, mastodon, **kw) + return account, mastodon + @never_cache @br_login_required def toot(request, mention=None): @@ -864,26 +881,19 @@ def toot(request, mention=None): ), ) ) + if form.cleaned_data["visibility"] == "": form.cleaned_data["visibility"] = request.session[ "active_user" ].source.privacy try: - try: - mastodon.status_post( - status=form.cleaned_data["status"], - visibility=form.cleaned_data["visibility"], - spoiler_text=form.cleaned_data["spoiler_text"], - media_ids=media_objects, - content_type="text/markdown", - ) - except TypeError: - mastodon.status_post( - status=form.cleaned_data["status"], - visibility=form.cleaned_data["visibility"], - spoiler_text=form.cleaned_data["spoiler_text"], - media_ids=media_objects, - ) + status_post( + account, mastodon, + status=form.cleaned_data["status"], + visibility=form.cleaned_data["visibility"], + spoiler_text=form.cleaned_data["spoiler_text"], + media_ids=media_objects, + content_type="text/markdown") except MastodonAPIError as error: form.add_error( "", @@ -903,6 +913,8 @@ def toot(request, mention=None): "preferences": account.preferences, }, ) + else: + return result return redirect(home) else: return render( From 12d7b4cb7d6aef2c3dc511a76e9bcef8f668a502 Mon Sep 17 00:00:00 2001 From: Cy Date: Sat, 30 May 2020 23:06:28 +0000 Subject: [PATCH 2/4] Handle feature_set errors automatically Recreate the mastodon object if there's an error complaining about a missing feature set. Only happens for status_post I think. Could be further generalized... --- brutaldon/views.py | 50 ++++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/brutaldon/views.py b/brutaldon/views.py index a561e13..4f2ba49 100644 --- a/brutaldon/views.py +++ b/brutaldon/views.py @@ -16,6 +16,7 @@ from brutaldon.forms import ( from brutaldon.models import Client, Account, Preference, Theme from mastodon import ( Mastodon, + MastodonIllegalArgumentError, AttribAccessDict, MastodonError, MastodonAPIError, @@ -83,14 +84,14 @@ def get_usercontext(request, feature_set="mainline"): Account.MultipleObjectsReturned, ): raise NotLoggedInException() - mastodon = get_mastodon()Mastodon( + mastodon = Mastodon( client_id=client.client_id, client_secret=client.client_secret, access_token=user.access_token, api_base_url=client.api_base_id, session=get_session(client.api_base_id), ratelimit_method="throw", - feature_set=feature_set + feature_set=feature_set ) return user, mastodon else: @@ -810,22 +811,27 @@ def settings(request): ) def status_post(account, request, mastodon, **kw): - try: - mastodon.status_post(**kw) - except MastodonIllegalArgumentError as e: - if not 'is only available with feature set' in e.args[0]: - raise - feature_set = e.args[0].rsplit(" ",1)[-1] + while True: + try: + mastodon.status_post(**kw) + except MastodonIllegalArgumentError as e: + if not 'is only available with feature set' in e.args[0]: + raise + feature_set = e.args[0].rsplit(" ",1)[-1] - account, mastodon = get_usercontext(request, - feature_set=feature_set) - - return status_post(account, request, mastodon, **kw) - except TypeError: - kw.pop("content_type") - return status_post(account, request, mastodon, **kw) + account, mastodon = get_usercontext(request, + feature_set=feature_set) + + continue + except TypeError: + # not sure why, but the old code retried status_post without a + # content_type keyword, if there was a TypeError + kw.pop("content_type") + continue + else: + break return account, mastodon - + @never_cache @br_login_required def toot(request, mention=None): @@ -881,15 +887,15 @@ def toot(request, mention=None): ), ) ) - + if form.cleaned_data["visibility"] == "": form.cleaned_data["visibility"] = request.session[ "active_user" ].source.privacy try: - status_post( - account, mastodon, - status=form.cleaned_data["status"], + status_post( + account, request, mastodon, + status=form.cleaned_data["status"], visibility=form.cleaned_data["visibility"], spoiler_text=form.cleaned_data["spoiler_text"], media_ids=media_objects, @@ -913,8 +919,8 @@ def toot(request, mention=None): "preferences": account.preferences, }, ) - else: - return result + else: + return result return redirect(home) else: return render( From c0caab49193bb24d675ca2ceb8b703b8170ee9fe Mon Sep 17 00:00:00 2001 From: Cy Date: Sun, 31 May 2020 01:04:43 +0000 Subject: [PATCH 3/4] Missed a few status_post calls --- brutaldon/views.py | 54 ++++++++++++++++------------------------------ 1 file changed, 19 insertions(+), 35 deletions(-) diff --git a/brutaldon/views.py b/brutaldon/views.py index 4f2ba49..2caa7b6 100644 --- a/brutaldon/views.py +++ b/brutaldon/views.py @@ -16,7 +16,7 @@ from brutaldon.forms import ( from brutaldon.models import Client, Account, Preference, Theme from mastodon import ( Mastodon, - MastodonIllegalArgumentError, + MastodonIllegalArgumentError, AttribAccessDict, MastodonError, MastodonAPIError, @@ -995,23 +995,15 @@ def redraft(request, id): "active_user" ].source.privacy try: - try: - mastodon.status_post( - status=form.cleaned_data["status"], - visibility=form.cleaned_data["visibility"], - spoiler_text=form.cleaned_data["spoiler_text"], - media_ids=media_objects, - in_reply_to_id=toot.in_reply_to_id, - content_type="text/markdown", - ) - except TypeError: - mastodon.status_post( - status=form.cleaned_data["status"], - visibility=form.cleaned_data["visibility"], - spoiler_text=form.cleaned_data["spoiler_text"], - media_ids=media_objects, - in_reply_to_id=toot.in_reply_to_id, - ) + status_post( + account, request, mastodon, + status=form.cleaned_data["status"], + visibility=form.cleaned_data["visibility"], + spoiler_text=form.cleaned_data["spoiler_text"], + media_ids=media_objects, + in_reply_to_id=toot.in_reply_to_id, + content_type="text/markdown", + ) mastodon.status_delete(id) except MastodonAPIError as error: form.add_error( @@ -1125,23 +1117,15 @@ def reply(request, id): ) ) try: - try: - mastodon.status_post( - status=form.cleaned_data["status"], - visibility=form.cleaned_data["visibility"], - spoiler_text=form.cleaned_data["spoiler_text"], - media_ids=media_objects, - in_reply_to_id=id, - content_type="text/markdown", - ) - except TypeError: - mastodon.status_post( - status=form.cleaned_data["status"], - visibility=form.cleaned_data["visibility"], - spoiler_text=form.cleaned_data["spoiler_text"], - media_ids=media_objects, - in_reply_to_id=id, - ) + status_post( + account, request, mastodon, + status=form.cleaned_data["status"], + visibility=form.cleaned_data["visibility"], + spoiler_text=form.cleaned_data["spoiler_text"], + media_ids=media_objects, + in_reply_to_id=id, + content_type="text/markdown", + ) except MastodonAPIError as error: form.add_error( "", From 9415defedea12f5b91862a51e5ca870f5594eac9 Mon Sep 17 00:00:00 2001 From: Cy Date: Sun, 31 May 2020 02:22:47 +0000 Subject: [PATCH 4/4] whoops, left an old mistake in the code --- brutaldon/views.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/brutaldon/views.py b/brutaldon/views.py index 2caa7b6..ef76ebf 100644 --- a/brutaldon/views.py +++ b/brutaldon/views.py @@ -919,8 +919,6 @@ def toot(request, mention=None): "preferences": account.preferences, }, ) - else: - return result return redirect(home) else: return render(