124-webapp/mailer.py

97 lines
3.4 KiB
Python
Raw Normal View History

2025-09-17 16:35:11 +02:00
import os
import asyncio
from io import BytesIO
from nio import AsyncClient, UploadResponse, RoomSendResponse
async def send_order(pdf_path: str, analysis: dict, room_id: str, comment: str = ""):
matrix_user = os.environ.get("MATRIX_USER")
matrix_pass = os.environ.get("MATRIX_PASS")
homeserver = os.environ.get("MATRIX_HOMESERVER", "http://localhost:8008")
if not matrix_user or not matrix_pass:
raise RuntimeError("Missing MATRIX_USER or MATRIX_PASS in environment")
client = AsyncClient(homeserver, matrix_user)
login_resp = await client.login(matrix_pass)
if getattr(login_resp, "access_token", None) is None:
await client.close()
raise RuntimeError(f"Failed to login to Matrix: {login_resp}")
# Build summary text
summary_lines = [
f"File: {analysis['filename']}",
f"Grand total: {analysis['grand_total']}",
f" - Black/White: {analysis['total_area_black']:.2f} m² = {analysis['total_cost_black']}",
f" - Color: {analysis['total_area_color']:.2f} m² = {analysis['total_cost_color']}",
"",
"Page details:",
]
for page in analysis["pages"]:
summary_lines.append(
f"Page {page['page']}: {page['width_m']*1000:.0f}×{page['height_m']*1000:.0f} mm, "
f"{'Color' if page['is_color'] else 'B/W'}, Cost {page['cost']}"
)
if comment.strip():
summary_lines.append("\nUser comment:\n" + comment.strip())
summary_text = "\n".join(summary_lines)
# Send text summary
text_resp = await client.room_send(
room_id=room_id,
message_type="m.room.message",
content={
"msgtype": "m.text",
"body": f"New print order submitted:\n\n{summary_text}",
},
)
if not (isinstance(text_resp, RoomSendResponse) and text_resp.event_id):
await client.logout()
await client.close()
raise RuntimeError(f"Failed to send order summary: {text_resp}")
# Upload PDF
with open(pdf_path, "rb") as f:
pdf_bytes = f.read()
upload_resp, upload_err = await client.upload(
data_provider=BytesIO(pdf_bytes),
content_type="application/pdf",
filename=os.path.basename(pdf_path),
filesize=len(pdf_bytes),
)
if upload_err:
await client.logout()
await client.close()
raise RuntimeError(f"Failed to upload PDF: {upload_err}")
if not (isinstance(upload_resp, UploadResponse) and upload_resp.content_uri):
await client.logout()
await client.close()
raise RuntimeError(f"Failed to upload PDF: {upload_resp}")
# Send PDF as separate file message
file_resp = await client.room_send(
room_id=room_id,
message_type="m.room.message",
content={
"msgtype": "m.file",
"body": os.path.basename(pdf_path),
"url": upload_resp.content_uri,
},
)
if not (isinstance(file_resp, RoomSendResponse) and file_resp.event_id):
await client.logout()
await client.close()
raise RuntimeError(f"Failed to send PDF message: {file_resp}")
await client.logout()
await client.close()
print(f"✅ Text summary and PDF sent to room {room_id}")
def send_order_sync(pdf_path: str, analysis: dict, room_id: str, comment: str = ""):
asyncio.run(send_order(pdf_path, analysis, room_id, comment))