diff --git a/common/views.py b/common/views.py index f9d8a0cc..c2141c02 100644 --- a/common/views.py +++ b/common/views.py @@ -34,7 +34,7 @@ def home(request): def ap_redirect(request, uri): - return redirect(uri) + return redirect(request.get_full_path().replace("~neodb~", "/")) def nodeinfo2(request): diff --git a/journal/models/comment.py b/journal/models/comment.py index b3ed0940..ccc26a54 100644 --- a/journal/models/comment.py +++ b/journal/models/comment.py @@ -1,8 +1,10 @@ from datetime import datetime from functools import cached_property +from django.conf import settings from django.db import models from django.utils import timezone +from django.utils.translation import gettext as _ from catalog.models import Item from takahe.utils import Takahe @@ -10,7 +12,13 @@ from users.models import APIdentity from .common import Content from .rating import Rating -from .renderers import render_text +from .renderers import ( + render_post_with_macro, + render_rating, + render_spoiler_text, + render_text, +) +from .shelf import ShelfManager, ShelfType class Comment(Content): @@ -103,3 +111,45 @@ class Comment(Content): comment.created_time = created_time comment.save() return comment + + def get_repost_postfix(self): + tags = render_post_with_macro( + self.owner.user.preference.mastodon_append_tag, self.item + ) + return "\n" + tags if tags else "" + + def get_repost_template(self): + return _( + ShelfManager.get_action_template(ShelfType.PROGRESS, self.item.category) + ) + + def to_mastodon_params(self): + spoiler_text, txt = render_spoiler_text(self.text, self.item) + content = ( + self.get_repost_template().format(item=self.item.display_title) + + f"\n{txt}\n{settings.SITE_INFO['site_url']}{self.item_url}" + + self.get_repost_postfix() + ) + params = { + "content": content, + "spoiler_text": spoiler_text, + "sensitive": bool(spoiler_text), + } + return params + + def to_post_params(self): + item_link = f"{settings.SITE_INFO['site_url']}/~neodb~{self.item_url}" + pre_conetent = ( + self.get_repost_template().format( + item=f'{self.item.display_title}' + ) + + "
" + ) + spoiler_text, txt = render_spoiler_text(self.text, self.item) + content = f"{txt}\n{self.get_repost_postfix()}" + return { + "pre_conetent": pre_conetent, + "content": content, + "summary": spoiler_text, + "sensitive": bool(spoiler_text), + } diff --git a/journal/models/renderers.py b/journal/models/renderers.py index cfae1fcf..60963073 100644 --- a/journal/models/renderers.py +++ b/journal/models/renderers.py @@ -1,9 +1,10 @@ import re -from typing import TYPE_CHECKING, cast +from typing import cast import mistune from django.conf import settings from django.utils.html import escape +from django.utils.translation import gettext as _ from catalog.models import Item, ItemCategory @@ -83,3 +84,15 @@ def render_rating(score: int | None, star_mode=0) -> str: emoji_code = emoji_code.replace("::", ": :") emoji_code = " " + emoji_code + " " return emoji_code + + +def render_spoiler_text(text, item): + if not text: + return None, "" + if text.find(">!") != -1: + spoiler_text = _( + "regarding {item_title}, may contain spoiler or triggering content" + ).format(item_title=item.display_title) + return spoiler_text, text.replace(">!", "").replace("!<", "") + else: + return None, text diff --git a/journal/views/mark.py b/journal/views/mark.py index 7ca829f6..d70018f4 100644 --- a/journal/views/mark.py +++ b/journal/views/mark.py @@ -13,7 +13,7 @@ from loguru import logger from catalog.models import * from common.utils import AuthedHttpRequest, get_uuid_or_404 -from mastodon.api import boost_toot_later, share_comment +from mastodon.api import boost_toot_later from takahe.utils import Takahe from ..models import Comment, Mark, Note, ShelfManager, ShelfType, TagManager @@ -179,16 +179,14 @@ def comment(request: AuthedHttpRequest, item_uuid): d = {"text": text, "visibility": visibility} if position: d["metadata"] = {"position": position} + delete_existing_post = comment is not None and comment.visibility != visibility + share_to_mastodon = bool(request.POST.get("share_to_mastodon", default=False)) comment = Comment.objects.update_or_create( owner=request.user.identity, item=item, defaults=d )[0] - post = Takahe.post_comment(comment, False) - share_to_mastodon = bool(request.POST.get("share_to_mastodon", default=False)) - if post and share_to_mastodon: - if request.user.preference.mastodon_repost_mode == 1: - share_comment(comment) - else: - boost_toot_later(request.user, post.url) + comment.sync_to_timeline(delete_existing=delete_existing_post) + if share_to_mastodon: + comment.sync_to_mastodon(delete_existing=delete_existing_post) return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/")) diff --git a/mastodon/api.py b/mastodon/api.py index d93249a4..cdfc419d 100644 --- a/mastodon/api.py +++ b/mastodon/api.py @@ -634,53 +634,6 @@ def get_toot_visibility(visibility, user): return TootVisibilityEnum.UNLISTED -def share_comment(comment): - from catalog.common import ItemCategory - from journal.models import ShelfManager, ShelfType - - user = comment.owner.user - visibility = get_toot_visibility(comment.visibility, user) - tags = ( - "\n" - + user.preference.mastodon_append_tag.replace( - "[category]", str(ItemCategory(comment.item.category).label) - ) - if user.preference.mastodon_append_tag - else "" - ) - spoiler_text, txt = get_spoiler_text(comment.text or "", comment.item) - tpl = ShelfManager.get_action_template(ShelfType.PROGRESS, comment.item.category) - content = ( - _(tpl).format(item=comment.item.display_title) - + f"\n{txt}\n{comment.item.absolute_url}{tags}" - ) - update_id = None - if comment.metadata.get( - "shared_link" - ): # "https://mastodon.social/@username/1234567890" - r = re.match( - r".+/(\w+)$", comment.metadata.get("shared_link") - ) # might be re.match(r'.+/([^/]+)$', u) if Pleroma supports edit - update_id = r[1] if r else None - response = post_toot( - user.mastodon_site, - content, - visibility, - user.mastodon_token, - False, - update_id, - spoiler_text, - ) - if response is not None and response.status_code in [200, 201]: - j = response.json() - if "url" in j: - comment.metadata["shared_link"] = j["url"] - comment.save() - return True - else: - return False - - def share_mark(mark, post_as_new=False): from catalog.common import ItemCategory diff --git a/takahe/utils.py b/takahe/utils.py index 063b3da3..84422025 100644 --- a/takahe/utils.py +++ b/takahe/utils.py @@ -615,54 +615,6 @@ class Takahe: collection.link_post_id(post.pk) return post - @staticmethod - def post_comment(comment, share_as_new_post: bool) -> Post | None: - from catalog.common import ItemCategory - from journal.models import ShelfManager, ShelfType - - user = comment.owner.user - category = str(ItemCategory(comment.item.category).label) - tags = ( - "\n" + user.preference.mastodon_append_tag.replace("[category]", category) - if user.preference.mastodon_append_tag - else "" - ) - item_link = f"{settings.SITE_INFO['site_url']}/~neodb~{comment.item_url}" - tpl = ShelfManager.get_action_template( - ShelfType.PROGRESS, comment.item.category - ) - pre_conetent = ( - _(tpl).format( - item=f'{comment.item.display_title}' - ) - + "
" - ) - spoiler, txt = Takahe.get_spoiler_text(comment.text, comment.item) - content = f"{txt}\n{tags}" - data = { - "object": { - "tag": [comment.item.ap_object_ref], - "relatedWith": [comment.ap_object], - } - } - v = Takahe.visibility_n2t(comment.visibility, user.preference.post_public_mode) - existing_post = None if share_as_new_post else comment.latest_post - post = Takahe.post( - comment.owner.pk, - content, - v, - pre_conetent, - spoiler, - spoiler is not None, - data, - existing_post.pk if existing_post else None, - comment.created_time, - ) - if not post: - return - comment.link_post_id(post.pk) - return post - @staticmethod def post_mark(mark, share_as_new_post: bool, append_content="") -> Post | None: from catalog.common import ItemCategory