diff --git a/callbacks.py b/callbacks.py new file mode 100644 index 0000000..8c138bb --- /dev/null +++ b/callbacks.py @@ -0,0 +1,39 @@ +from nio import * + +import utils + + +# Our message callback. It should be passed through a router. +async def msg_cb(room: MatrixRoom, event: RoomMessageText) -> None: + import re + import latex + client = utils.get_client() + if event.sender == client.user_id: + return + print("ae", client) + + for tex in re.findall(r'((?:\$[^\$]+\$)|(?:\$\$[^\$]+\$\$)|(?:\\\[[^\]]+\\\]))', event.body, re.M): + print("Text:", tex) + try: + filename = latex.render("", tex) + await utils.send_png(room, filename) + except FileNotFoundError as e: + content = { + "msgtype": "m.text", + "body": f"Couldn't parse LaTeX correctly.\n```{e.args[0]}\n```", + "formatted_body": f"Couldn't parse LaTeX correctly.
{e.args[0]}
", + } + await client.room_send(room.room_id, message_type="m.room.message", content=content) + except OSError: + content = { + "msgtype": "m.text", + "body": "???", + "formatted_body": "???" + } + + await client.room_send(room.room_id, message_type="m.room.message", content=content) + +# Our file callback. +async def file_cb(room: MatrixRoom, event: RoomMessageFile) -> None: + url = event.url + filename = event.body diff --git a/main.py b/main.py index d861ea7..1f03594 100644 --- a/main.py +++ b/main.py @@ -1,76 +1,14 @@ from nio import * import asyncio -import yaml +import utils -async def send_png(room: MatrixRoom, filename: str) -> None: - import imagesize - import os - basename = os.path.basename(filename) - w, h = imagesize.get(filename) - - file = open(filename, "r+b") - size = os.path.getsize(filename) - - filename = os.path.basename(filename) - resp, keys = await client.upload(file, content_type="image/png", filename=basename) - - if not isinstance(resp, UploadResponse): - raise OSError("Couldn't upload file.") - - content = { - "body": basename, - "info": { - "size": size, - "mimetype": "image/png", - "w": w, "h": h - }, - "msgtype": "m.image", - "url": resp.content_uri, - } - file.close() - - await client.room_send(room.room_id, message_type="m.room.message", content=content) - - -# Our message callback. It should be passed through a router. -async def msg_cb(room: MatrixRoom, event: RoomMessageText) -> None: - import re - import latex - if event.sender == client.user_id: - return - - for tex in re.findall(r'((?:\$[^\$]+\$)|(?:\$\$[^\$]+\$\$)|(?:\\\[[^\]]+\\\]))', event.body, re.M): - print("Text:", tex) - try: - filename = latex.render("", tex) - await send_png(room, filename) - except FileNotFoundError as e: - content = { - "msgtype": "m.text", - "body": f"Couldn't parse LaTeX correctly.\n```{e.args[0]}\n```", - "formatted_body": f"Couldn't parse LaTeX correctly.
{e.args[0]}
", - } - await client.room_send(room.room_id, message_type="m.room.message", content=content) - except OSError: - content = { - "msgtype": "m.text", - "body": "???", - "formatted_body": "???" - } - - await client.room_send(room.room_id, message_type="m.room.message", content=content) - -# Our file callback. -async def file_cb(room: MatrixRoom, event: RoomMessageFile) -> None: - url = event.url - filename = event.body - async def main() -> None: + import callbacks + import yaml # Load our config file. - global client config = {} try: @@ -98,8 +36,9 @@ async def main() -> None: await client.sync(timeout=3000) # Register all of the callbacks - client.add_event_callback(msg_cb, RoomMessageText) - client.add_event_callback(file_cb, RoomMessageFile) + utils.set_client(client) + client.add_event_callback(callbacks.msg_cb, RoomMessageText) + client.add_event_callback(callbacks.file_cb, RoomMessageFile) await client.sync_forever(timeout=10000, full_state=True) diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..086e7ac --- /dev/null +++ b/utils.py @@ -0,0 +1,37 @@ +from nio import * + +def set_client(c: AsyncClient) -> None: + global client + client = c + +def get_client() -> AsyncClient: + return client + +async def send_png(room: MatrixRoom, filename: str) -> None: + import imagesize + import os + basename = os.path.basename(filename) + w, h = imagesize.get(filename) + + file = open(filename, "r+b") + size = os.path.getsize(filename) + + filename = os.path.basename(filename) + resp, keys = await client.upload(file, content_type="image/png", filename=basename) + + if not isinstance(resp, UploadResponse): + raise OSError("Couldn't upload file.") + + content = { + "body": basename, + "info": { + "size": size, + "mimetype": "image/png", + "w": w, "h": h + }, + "msgtype": "m.image", + "url": resp.content_uri, + } + file.close() + + await client.room_send(room.room_id, message_type="m.room.message", content=content)