mirror of
https://git.freetards.xyz/array.in.a.matrix/TexLiLy.git
synced 2025-04-02 13:21:42 -04:00
106 lines
3.1 KiB
Python
106 lines
3.1 KiB
Python
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.<br><code><pre>{e.args[0]}</pre></code>",
|
|
}
|
|
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())
|