from nio import * import asyncio import yaml 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: # Load our config file. global client config = {} try: with open('texlily.yaml', 'r') as conf: config = yaml.safe_load(conf) # Retrieve our configuration homeserver = str(config["homeserver"]) user = str(config["user"]) token = str(config["token"]) # path = str(config["path"]) # not used # if config file does not exist, quit except FileNotFoundError: print("No config file found.") print("Please create a file named `texlily.yaml` and read the README file.") quit() except TypeError: print("Invalid configuration file.") quit() client = AsyncClient(homeserver) client.access_token = token client.user_id = user # Bad kludge! await client.sync(timeout=3000) # Register all of the callbacks client.add_event_callback(msg_cb, RoomMessageText) client.add_event_callback(file_cb, RoomMessageFile) await client.sync_forever(timeout=10000, full_state=True) asyncio.run(main())