| import logging |
| from twilio.rest import Client |
| from ..config import settings |
|
|
| logger = logging.getLogger(__name__) |
|
|
|
|
| def _is_placeholder(value: str) -> bool: |
| return not value or value.startswith("your_twilio_") |
|
|
|
|
| def _ensure_whatsapp_address(number: str) -> str: |
| cleaned = str(number).strip() |
| if cleaned.startswith("whatsapp:"): |
| return cleaned |
| return f"whatsapp:{cleaned}" |
|
|
| def get_twilio_client(): |
| if _is_placeholder(settings.TWILIO_ACCOUNT_SID) or _is_placeholder(settings.TWILIO_AUTH_TOKEN): |
| return None |
| return Client(settings.TWILIO_ACCOUNT_SID, settings.TWILIO_AUTH_TOKEN) |
|
|
| async def send_async_verdict_reply(to_number: str, text_message: str): |
| """ |
| Sends the completed analysis report back to the user via Programmable SMS/WhatsApp. |
| """ |
| client = get_twilio_client() |
| if not client: |
| logger.warning(f"Twilio not configured. Would have sent directly to {to_number}: {text_message}") |
| return |
|
|
| use_whatsapp = str(to_number).strip().startswith("whatsapp:") or str(settings.TWILIO_PHONE_NUMBER).strip().startswith("whatsapp:") |
| from_number = _ensure_whatsapp_address(settings.TWILIO_PHONE_NUMBER) if use_whatsapp else settings.TWILIO_PHONE_NUMBER |
| to_target = _ensure_whatsapp_address(to_number) if use_whatsapp else to_number |
| |
| try: |
| message = client.messages.create( |
| from_=from_number, |
| body=text_message, |
| to=to_target |
| ) |
| logger.info(f"Sent Async Twilio reply: {message.sid}") |
| except Exception as e: |
| logger.error(f"Failed to send async reply: {e}") |
|
|