social media crossposting tool. 3rd time's the charm
mastodon misskey crossposting bluesky

attach original post timestamp to bluesky posts

zenfyr.dev afce401d 1b843ade

verified
+15 -10
atproto2.py
···
reply_to: models.AppBskyFeedPost.ReplyRef | None = None,
langs: list[str] | None = None,
facets: list[models.AppBskyRichtextFacet.Main] | None = None,
-
labels: models.ComAtprotoLabelDefs.SelfLabels | None = None
+
labels: models.ComAtprotoLabelDefs.SelfLabels | None = None,
+
time_iso: str | None = None
) -> models.AppBskyFeedPost.CreateRecordResponse:
"""same as send_video, but with labels"""
···
embed=models.AppBskyEmbedVideo.Main(video=upload.blob, alt=video_alt, aspect_ratio=video_aspect_ratio),
langs=langs,
facets=facets,
-
labels=labels
+
labels=labels,
+
time_iso=time_iso
)
def send_images(
···
reply_to: models.AppBskyFeedPost.ReplyRef | None = None,
langs: list[str] | None = None,
facets: list[models.AppBskyRichtextFacet.Main] | None = None,
-
labels: models.ComAtprotoLabelDefs.SelfLabels | None = None
+
labels: models.ComAtprotoLabelDefs.SelfLabels | None = None,
+
time_iso: str | None = None
) -> models.AppBskyFeedPost.CreateRecordResponse:
"""same as send_images, but with labels"""
···
embed=models.AppBskyEmbedImages.Main(images=embed_images),
langs=langs,
facets=facets,
-
labels=labels
+
labels=labels,
+
time_iso=time_iso
)
def send_post(
···
models.AppBskyEmbedVideo.Main = None,
langs: list[str] | None = None,
facets: list[models.AppBskyRichtextFacet.Main] | None = None,
-
labels: models.ComAtprotoLabelDefs.SelfLabels | None = None
+
labels: models.ComAtprotoLabelDefs.SelfLabels | None = None,
+
time_iso: str | None = None
) -> models.AppBskyFeedPost.CreateRecordResponse:
"""same as send_post, but with labels"""
···
langs = ['en']
record = models.AppBskyFeedPost.Record(
-
created_at=self.get_current_time_iso(),
+
created_at=time_iso or self.get_current_time_iso(),
text=text,
reply=reply_to or None,
embed=embed or None,
···
)
return self.app.bsky.feed.post.create(repo, record)
-
def create_gates(self, options: dict, post_uri: str):
+
def create_gates(self, options: dict, post_uri: str, time_iso: str | None = None):
account = self.me
if not account:
raise Exception("Client not logged in!")
rkey = AtUri.from_str(post_uri).rkey
-
time = self.get_current_time_iso()
+
time_iso = time_iso or self.get_current_time_iso()
thread_gate_opts = options.get('thread_gate', [])
if 'everybody' not in thread_gate_opts:
···
thread_gate = models.AppBskyFeedThreadgate.Record(
post=post_uri,
-
created_at=time,
+
created_at=time_iso,
allow=allow
)
···
if options.get('quote_gate', False):
post_gate = models.AppBskyFeedPostgate.Record(
post=post_uri,
-
created_at=time,
+
created_at=time_iso,
embedding_rules=[
models.AppBskyFeedPostgate.DisableRule()
]
+9 -7
bluesky.py
···
new_post = self.bsky.send_post(text, reply_to=models.AppBskyFeedPost.ReplyRef(
parent=reply_ref,
root=root_ref
-
), labels=labels)
+
), labels=labels, time_iso=post.get_post_date_iso())
else:
-
new_post = self.bsky.send_post(text, labels=labels)
+
new_post = self.bsky.send_post(text, labels=labels, time_iso=post.get_post_date_iso())
root_ref = models.create_strong_ref(new_post)
-
self.bsky.create_gates(self.options, new_post.uri)
+
self.bsky.create_gates(self.options, new_post.uri, time_iso=post.get_post_date_iso())
reply_ref = models.create_strong_ref(new_post)
created_records.append(new_post)
else:
···
parent=reply_ref,
root=root_ref
) if root_ref and reply_ref else None,
-
labels=labels
+
labels=labels,
+
time_iso=post.get_post_date_iso()
)
if not root_ref:
root_ref = models.create_strong_ref(new_post)
-
self.bsky.create_gates(self.options, new_post.uri)
+
self.bsky.create_gates(self.options, new_post.uri, time_iso=post.get_post_date_iso())
reply_ref = models.create_strong_ref(new_post)
created_records.append(new_post)
else: # video is guarantedd to be one
···
parent=reply_ref,
root=root_ref
) if root_ref and reply_ref else None,
-
labels=labels
+
labels=labels,
+
time_iso=post.get_post_date_iso()
)
if not root_ref:
root_ref = models.create_strong_ref(new_post)
-
self.bsky.create_gates(self.options, new_post.uri)
+
self.bsky.create_gates(self.options, new_post.uri, time_iso=post.get_post_date_iso())
reply_ref = models.create_strong_ref(new_post)
created_records.append(new_post)
+4
cross.py
···
from typing import Callable, Any
from database import DataBaseWorker
+
from datetime import datetime, timezone
# generic token
class Token():
···
def get_parent_id(self) -> str | None:
return None
+
+
def get_post_date_iso(self) -> str:
+
return datetime.now(timezone.utc).isoformat()
def get_attachments(self) -> list[MediaAttachment]:
return []
+4
mastodon.py
···
def get_parent_id(self) -> str | None:
return self.status.get('in_reply_to_id')
+
def get_post_date_iso(self) -> str:
+
date = self.status.get('created_at')
+
return date or super().get_post_date_iso()
+
def get_cw(self) -> str:
return self.status.get('spoiler_text') or ''
+4
misskey.py
···
def get_parent_id(self) -> str | None:
return self.note.get('replyId')
+
def get_post_date_iso(self) -> str:
+
date = self.note.get('createdAt')
+
return date or super().get_post_date_iso()
+
def get_attachments(self) -> list[cross.MediaAttachment]:
return self.media_attachments