124-webapp/mailer.py
2025-09-17 16:35:11 +02:00

96 lines
3.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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))