TexLiLy/callbacks.py
2023-06-15 17:11:10 +02:00

99 lines
3.1 KiB
Python

from router import Router
from routes import *
from nio import *
latex_regex = r'((?:\$[^\$]+\$)|(?:\$\$[^\$]+\$\$)|(?:\\\[[^\]]+\\\]))'
tex_router = Router("tex")
lily_router = Router("lily")
def init_routes() -> None:
tex_router.add_route("help", "This very help menu.", route_help)
tex_router.add_route("delete", "Removes a TeX style file.", route_delete)
lily_router.add_route("help", "This very help menu.", route_help)
lily_router.add_route("show", "Shows an in-line LilyPond expression", route_lshow)
# Our message callback. It should be passed through a router.
async def msg_cb(room: MatrixRoom, event: RoomMessageText) -> None:
import latex
import utils
import shlex
import re
client = utils.get_client()
if event.sender == client.user_id:
return
if event.body.startswith("tex!"):
import router
args = shlex.split(event.body[4:])
if len(args) >= 1:
await tex_router.handle_command(args[0], room.room_id, event, args[1:])
return
if event.body.startswith("lily!"):
import router
args = shlex.split(event.body[5:])
if len(args) >= 1:
await lily_router.handle_command(args[0], room.room_id, event, args[1:])
return
if event.formatted_body is not None:
import lilypond
import parser
code = parser.CodeParser()
code.feed(event.formatted_body)
code.close()
for block in code.blocks:
content = block['content']
if block['lang'] == 'tex':
filename = latex.render(event.sender, content)
await utils.send_png(room.room_id, filename)
if block['lang'] == 'ly':
filename = lilypond.render(event.sender, content, template=False)
await utils.send_png(room.room_id, filename)
for tex in re.findall(latex_regex, event.formatted_body, re.M):
try:
filename = latex.render(event.sender, tex)
await utils.send_png(room.room_id, filename)
except FileNotFoundError as e:
await utils.send_plain(room.room_id, e.args[0])
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:
import utils
import os
url = event.url
filename = event.body
if filename.endswith(".sty"):
# Download file and save it for user.
client = utils.get_client()
directory = utils.create_user_dir(event.sender)
response = await client.download(url, filename)
if not isinstance(response, DownloadResponse):
return
with open(os.path.join(directory, filename), 'wb') as f:
f.write(response.body)
async def invite_cb(room: MatrixRoom, event: InviteEvent) -> None:
import utils
await utils.get_client().join(room_id=room.room_id)