mirror of
https://git.freetards.xyz/array.in.a.matrix/TexLiLy.git
synced 2025-04-02 13:21:42 -04:00
99 lines
3.1 KiB
Python
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)
|