diff --git a/app/modules/misskey_preview.py b/app/modules/misskey_preview.py new file mode 100644 index 0000000..82a0992 --- /dev/null +++ b/app/modules/misskey_preview.py @@ -0,0 +1,49 @@ +""" +This module takes misskey links (e.g.) and provides a preview in a reply. +""" +import niobot +import httpx +import typing +import textwrap +from urllib.parse import urlparse +if typing.TYPE_CHECKING: + from ..main import TortoiseIntegratedBot + + +class MisskeyPreviewModule(niobot.Module): + bot: "TortoiseIntegratedBot" + + @niobot.event("message") + async def on_message(self, room: niobot.MatrixRoom, event: niobot.RoomMessage): + supported_prefixes = self.bot.cfg.get("misskey_preview", {}) + supported_prefixes = supported_prefixes.get("urls", ["https://fedi.transgender.ing/notes"]) + if not isinstance(event, niobot.RoomMessageText): + return + + sent = [] + async with httpx.AsyncClient() as client: + for item in event.body.split(): + if not event.body.startswith(tuple(supported_prefixes)): + return + parsed = urlparse(item) + post_id = parsed.path.split("/")[-1] + if post_id in sent: + continue + elif len(sent) >= 5: + break + resp = await client.post("https://%s/api/notes/show" % parsed.netloc, json={"noteId": post_id}) + if resp.status_code != 200: + continue + data = resp.json() + if not data["text"]: + continue + text_body = [] + for line in textwrap.shorten(data["text"], width=1000).splitlines(keepends=True): + text_body.append("> " + (line or "\u200b")) + body = "@%s:\n\n%s" % ( + "https://%s/notes/%s" % (parsed.netloc, data["user"]["username"]), + data["user"]["username"], + "".join(text_body), + ) + await self.bot.send_message(room, body, reply_to=event) + sent.append(post_id) diff --git a/config.example.toml b/config.example.toml index bc3dbad..c94a5a4 100644 --- a/config.example.toml +++ b/config.example.toml @@ -5,4 +5,7 @@ device_id = "nonsensebot" # optional, defaults to hostname. DO NOT CHANGE AFTER access_token = "syt_xyzxyz" # access token (niocli get-access-token) [database] -url = "sqlite://./store/data.db" \ No newline at end of file +url = "sqlite://./store/data.db" + +[misskey_preview] +urls = ["https://fedi.transgender.ing/notes"] \ No newline at end of file diff --git a/tox.init b/tox.init new file mode 100644 index 0000000..ec2ea30 --- /dev/null +++ b/tox.init @@ -0,0 +1,2 @@ +[flake8] +max-line-length=120 \ No newline at end of file