forked from microsoft/python-sample-vscode-fastapi-tutorial
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
101 lines (83 loc) · 2.66 KB
/
main.py
File metadata and controls
101 lines (83 loc) · 2.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
from fastapi import FastAPI, Form, Depends
from sqlmodel import Session
from datetime import datetime
from .models import User, MedicationLog
from .database import get_session, init_db
from .whatsapp import send_whatsapp_message, get_message
from .scheduler import start_scheduler
app = FastAPI()
@app.on_event("startup")
def on_startup():
init_db()
start_scheduler()
@app.post("/status")
async def message_status(
MessageSid: str = Form(...),
MessageStatus: str = Form(...),
session: Session = Depends(get_session)
):
log = session.query(MedicationLog).filter(
MedicationLog.message_sid == MessageSid
).first()
if log:
log.delivery_status = MessageStatus
session.add(log)
session.commit()
print(f"Message {MessageSid} status updated to {MessageStatus}")
return "OK"
def detect_language(message: str):
french_keywords = ["bonjour", "oui", "non"]
if any(word in message.lower() for word in french_keywords):
return "fr"
return "en"
@app.post("/webhook")
async def whatsapp_webhook(
Body: str = Form(...),
From: str = Form(...),
session: Session = Depends(get_session)
):
phone = From.replace("whatsapp:", "") if From.startswith("whatsapp:") else From
msg = Body.strip()
user = session.query(User).filter(User.phone == phone).first()
if not user:
detected_lang = detect_language(msg)
user = User(phone=phone, language=detected_lang)
session.add(user)
session.commit()
lang = user.language or "en"
timestamp = datetime.utcnow()
msg_clean = msg.strip().lower()
if msg_clean in ["1", "YES", "yes"]:
message_sid = send_whatsapp_message(phone, get_message("yes_response", lang))
log = MedicationLog(
phone=phone,
response="YES",
timestamp=timestamp,
message_sid=message_sid
)
session.add(log)
session.commit()
return "OK"
elif msg_clean in ["2", "NO", "no"]:
message_sid = send_whatsapp_message(phone, get_message("no_response", lang))
log = MedicationLog(
phone=phone,
response="NO",
timestamp=timestamp,
message_sid=message_sid
)
session.add(log)
session.commit()
return "OK"
else:
reminder_text = get_message("reminder", lang)
message_sid = send_whatsapp_message(phone, reminder_text)
log = MedicationLog(
phone=phone,
response="REMINDER_SENT",
timestamp=timestamp,
message_sid=message_sid
)
session.add(log)
session.commit()
return "OK"