mirror of https://gitlab.com/akasroua/covot
Rewrite bot logic as a sequential conversation
This commit is contained in:
parent
e10a9508a0
commit
aaaaed3c40
109
app/bot.py
109
app/bot.py
|
@ -1,9 +1,11 @@
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
from telethon import TelegramClient, events
|
from telethon import TelegramClient, events
|
||||||
from telethon.sessions import StringSession
|
from telethon.sessions import StringSession
|
||||||
|
|
||||||
from app.notifier import send_mail
|
from app.notifier import send_mail
|
||||||
from constants import API_HASH, API_ID, BOT_TOKEN, EXAMPLE, SESSION
|
from constants import API_HASH, API_ID, BOT_TOKEN, EXAMPLE, SESSION
|
||||||
from database.crud import create_database, search_database
|
from database.crud import *
|
||||||
|
|
||||||
bot = TelegramClient(StringSession(SESSION), API_ID, API_HASH).start(
|
bot = TelegramClient(StringSession(SESSION), API_ID, API_HASH).start(
|
||||||
bot_token=BOT_TOKEN
|
bot_token=BOT_TOKEN
|
||||||
|
@ -11,23 +13,94 @@ bot = TelegramClient(StringSession(SESSION), API_ID, API_HASH).start(
|
||||||
|
|
||||||
|
|
||||||
@bot.on(events.NewMessage(pattern="/start"))
|
@bot.on(events.NewMessage(pattern="/start"))
|
||||||
async def start(event):
|
async def conversation(event):
|
||||||
await event.respond(
|
entity = event.sender_id
|
||||||
"Hola, muy buenas. Gracias por ponerte en contacto con UGR Tracing Bot. Para poder continuar con el proceso por favor responda a este mensaje con un identificador único (DNI o correo institucional). Muchas gracias."
|
async with bot.conversation(entity=entity) as conv:
|
||||||
)
|
await conv.send_message(
|
||||||
raise events.StopPropagation
|
"Hola, muy buenas. Gracias por ponerte en contacto con UGR Tracing Bot. Para poder continuar con el proceso por favor responda a este mensaje con un identificador único (DNI o correo institucional). Muchas gracias."
|
||||||
|
)
|
||||||
|
unique_id = await conv.get_response()
|
||||||
@bot.on(events.NewMessage(pattern=r"^[0-9]{8,8}[A-Za-z]"))
|
user = search_database(id=unique_id.text.lower())
|
||||||
@bot.on(
|
send_mail(recipient=user.correo_institucional)
|
||||||
events.NewMessage(pattern=r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)")
|
await event.respond(
|
||||||
)
|
"El usuario se ha identificado con éxito. Se ha mandado una clave alfanumérica a su correo institucional. Por favor envíe la clave para continuar con el proceso."
|
||||||
async def identify(event):
|
)
|
||||||
user = search_database(id=event.raw_text)
|
verification_code = await conv.get_response()
|
||||||
send_mail(recipient=user["correo_institucional"])
|
valid_code = verify_code(
|
||||||
await event.respond(
|
id=user.numero_de_documento, code=verification_code.text
|
||||||
"El usuario se ha identificado con éxito. Se ha mandado una clave alfanumérica a su correo institucional. Por favor envíe la clave para continuar con el proceso."
|
)
|
||||||
)
|
if not valid_code:
|
||||||
|
await event.respond("La clave que indica no es correcta")
|
||||||
|
conv.cancel()
|
||||||
|
await event.respond(
|
||||||
|
f"""Hola {user.nombre}. Por favor seleccione su tipo de vivienda:
|
||||||
|
1. Familiar
|
||||||
|
2. Piso compartido
|
||||||
|
3. Piso individual
|
||||||
|
4. Residencia de estudiantes o Colegio Mayor
|
||||||
|
5. Otra
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
accomodation_type = await conv.get_response()
|
||||||
|
save_attribute(
|
||||||
|
id=user.numero_de_documento,
|
||||||
|
attribute="tipo_alojamiento",
|
||||||
|
data=accomodation_type.text,
|
||||||
|
)
|
||||||
|
await event.respond(
|
||||||
|
"""Por favor seleccione su tipo de caso COVID-19:
|
||||||
|
1. Confirmado
|
||||||
|
2. Contacto estrecho
|
||||||
|
3. Sospechoso
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
case_type = await conv.get_response()
|
||||||
|
save_attribute(
|
||||||
|
id=user.numero_de_documento,
|
||||||
|
attribute="tipo_caso",
|
||||||
|
data=case_type.text,
|
||||||
|
)
|
||||||
|
await event.respond("¿Tiene síntomas compatibles con el COVID-19?")
|
||||||
|
symptoms = await conv.get_response()
|
||||||
|
parsed_symptoms = parse_boolean_string(value=symptoms.text.lower())
|
||||||
|
save_attribute(
|
||||||
|
id=user.numero_de_documento,
|
||||||
|
attribute="sintomas",
|
||||||
|
data=parsed_symptoms,
|
||||||
|
)
|
||||||
|
await event.respond("Indique la fecha de inicio del aislamiento.")
|
||||||
|
quarantine_start = await conv.get_response()
|
||||||
|
save_attribute(
|
||||||
|
id=user.numero_de_documento,
|
||||||
|
attribute="comienzo_aislamiento",
|
||||||
|
data=datetime.strptime(quarantine_start.text, "%d/%m/%Y"),
|
||||||
|
)
|
||||||
|
await event.respond("Indique la fecha de fin del aislamiento.")
|
||||||
|
quarantine_end = await conv.get_response()
|
||||||
|
save_attribute(
|
||||||
|
id=user.numero_de_documento,
|
||||||
|
attribute="fin_aislamiento",
|
||||||
|
data=datetime.strptime(quarantine_end.text, "%d/%m/%Y"),
|
||||||
|
)
|
||||||
|
await event.respond(
|
||||||
|
f"""Por favor confirme que los siguientes datos son correctos:
|
||||||
|
1. Nombre: {user.nombre}
|
||||||
|
2. Apellidos: {user.primer_apellido} {user.segundo_apellido}
|
||||||
|
3. Documento identificativo: {user.numero_de_documento}
|
||||||
|
4. Tipo de domicilio: {user.tipo_alojamiento }
|
||||||
|
5. Tipo de caso COVID-19: {user.tipo_caso}
|
||||||
|
6. Síntomas COVID-19: {boolean_to_string(user.sintomas)}
|
||||||
|
7. Periodo de aislamiento: {user.comienzo_aislamiento} - {user.fin_aislamiento}
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
confirmation = await conv.get_response()
|
||||||
|
parsed_confirmation = parse_boolean_string(confirmation.text.lower())
|
||||||
|
if not parsed_confirmation:
|
||||||
|
await event.respond("Un saludo")
|
||||||
|
conv.cancel()
|
||||||
|
await event.respond(
|
||||||
|
"Su caso ha sido comunicado correctamente. Muchas gracias por utilizar UGR Tracing Bot. Le demasos una pronta recuperación"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
@ -64,7 +64,7 @@ def parse_boolean_string(value) -> bool:
|
||||||
"""
|
"""
|
||||||
Converts string response to a boolean
|
Converts string response to a boolean
|
||||||
"""
|
"""
|
||||||
mapping = {r"[S-s][i-í]": True, r"[N-n]o": False}
|
mapping = {"si": True, "sí": True, "no": False}
|
||||||
return mapping[value]
|
return mapping[value]
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue