from nio import * import asyncio import yaml import os async def send_png(room: MatrixRoom, filename: str) -> None: import imagesize 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: if event.body.startswith("$"): import latex try: filename = latex.render("", event.body) await send_png(room, filename) except (FileNotFoundError, OSError): content = { "msgtype": "m.text", "body": "Couldn't parse LaTeX correctly." } 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.\nPlease 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=300000) # 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())