diff --git a/app/bot.py b/app/bot.py index 2751f86..d70ce3a 100644 --- a/app/bot.py +++ b/app/bot.py @@ -1,9 +1,11 @@ +from datetime import datetime + from telethon import TelegramClient, events from telethon.sessions import StringSession from app.notifier import send_mail 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_token=BOT_TOKEN @@ -11,23 +13,94 @@ bot = TelegramClient(StringSession(SESSION), API_ID, API_HASH).start( @bot.on(events.NewMessage(pattern="/start")) -async def start(event): - await event.respond( - "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." - ) - raise events.StopPropagation - - -@bot.on(events.NewMessage(pattern=r"^[0-9]{8,8}[A-Za-z]")) -@bot.on( - events.NewMessage(pattern=r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)") -) -async def identify(event): - user = search_database(id=event.raw_text) - send_mail(recipient=user["correo_institucional"]) - 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 conversation(event): + entity = event.sender_id + async with bot.conversation(entity=entity) as conv: + await conv.send_message( + "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() + user = search_database(id=unique_id.text.lower()) + send_mail(recipient=user.correo_institucional) + 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." + ) + verification_code = await conv.get_response() + valid_code = verify_code( + id=user.numero_de_documento, code=verification_code.text + ) + 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__": diff --git a/database/crud.py b/database/crud.py index 019c9de..5d7ea4a 100644 --- a/database/crud.py +++ b/database/crud.py @@ -64,7 +64,7 @@ def parse_boolean_string(value) -> bool: """ 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]