Compare commits

..

No commits in common. "3e707ab004df69ecc37039c835939bc070bfc0a7" and "b7b3d126520a5b22e187dad0517ac9fa9095598b" have entirely different histories.

3 changed files with 17 additions and 41 deletions

View File

@ -12,13 +12,14 @@ instance = mastodon.example.org
# ${instance}/settings/applications
token = blahblah
# Your user ID.
# Doesn't necessarily yours, it can be any user's ID, but that user should be
# on the list for crossposter to find it.
# Setting it to "auto" will just grab yours instead. Don't worry about it
# EXCEPT if you're using Pleroma. Check #11 issue for more details:
# https://github.com/hatkidchan/mastoposter/issues/11
user = auto
# Mastodon user ID. Used to filter out posts. Unfortunately, I can't find a way
# to get it using token itself. GARGROOOOOOON!!!!!
# Anyways, you could navigate to your profile ${instance}/@${username} and
# look for your profile picture link. For example, for me it's
# https://mastodon.astrr.ru/system/accounts/avatars/107/914/495/779/447/227/original/9651ac2f47cb2993.jpg
# that part between "avarars" and "original" is the user ID. Grab it, remove
# all of the slashes and you should be left with, for example, this:
user = 107914495779447227
# Mastodon user list ID. AGAIN, UNFORTUNATELY, there is no way to reliably use
# streaming API to get all of your posts. Using home timeline is unreliable and

View File

@ -5,12 +5,7 @@ from mastoposter import execute_integrations, load_integrations_from
from mastoposter.integrations import FilteredIntegration
from mastoposter.sources import websocket_source
from typing import AsyncGenerator, Callable, List
from mastoposter.types import Account, Status
from httpx import Client
WSOCK_TEMPLATE = "wss://{instance}/api/v1/streaming"
VERIFY_CREDS_TEMPLATE = "https://{instance}/api/v1/accounts/verify_credentials"
from mastoposter.types import Status
async def listen(
@ -55,22 +50,12 @@ def main(config_path: str):
modules: List[FilteredIntegration] = load_integrations_from(conf)
user_id: str = conf["main"]["user"]
if user_id == "auto":
with Client() as c:
rq = c.get(
VERIFY_CREDS_TEMPLATE.format(**conf["main"]),
params={"access_token": conf["main"]["token"]},
)
account = Account.from_dict(rq.json())
user_id = account.id
url = "wss://{}/api/v1/streaming".format(conf["main"]["instance"])
run(
listen(
websocket_source,
modules,
user_id,
conf["main"]["user"],
url=url,
reconnect=conf["main"].getboolean("auto_reconnect", False),
list=conf["main"]["list"],

View File

@ -1,4 +1,4 @@
from dataclasses import dataclass, field, fields
from dataclasses import dataclass, field
from datetime import datetime
from typing import Any, Callable, Optional, List, Literal, TypeVar
@ -51,9 +51,7 @@ class Emoji:
@classmethod
def from_dict(cls, data: dict) -> "Emoji":
return cls(
**{f.name: data[f.name] for f in fields(cls) if f.name in data}
)
return cls(**data)
@dataclass
@ -132,7 +130,7 @@ class AttachmentMetaImage:
@classmethod
def from_dict(cls, data: dict) -> "AttachmentMetaImage":
return cls(
**{f.name: data[f.name] for f in fields(cls) if f.name in data},
**data,
original=cls.AttachmentMetaImageDimensions(**data["original"]),
small=cls.AttachmentMetaImageDimensions(**data["small"]),
focus=cls.Vec2F(**data["focus"])
@ -193,9 +191,7 @@ class Attachment:
@classmethod
def from_dict(cls, data: dict) -> "Attachment":
return cls(
**{f.name: data[f.name] for f in fields(cls) if f.name in data}
)
return cls(**data)
@dataclass
@ -206,9 +202,7 @@ class Application:
@classmethod
def from_dict(cls, data: dict) -> "Application":
return cls(
**{f.name: data[f.name] for f in fields(cls) if f.name in data}
)
return cls(**data)
@dataclass
@ -220,9 +214,7 @@ class Mention:
@classmethod
def from_dict(cls, data: dict) -> "Mention":
return cls(
**{f.name: data[f.name] for f in fields(cls) if f.name in data}
)
return cls(**data)
@dataclass
@ -232,9 +224,7 @@ class Tag:
@classmethod
def from_dict(cls, data: dict) -> "Tag":
return cls(
**{f.name: data[f.name] for f in fields(cls) if f.name in data}
)
return cls(**data)
@dataclass