Skip to content

Commit ca92be4

Browse files
authored
Merge pull request #16 from nossas/feature/reducao-fluxo
Feature/reducao fluxo
2 parents 1e77fc8 + 4a62abe commit ca92be4

File tree

6 files changed

+77
-263
lines changed

6 files changed

+77
-263
lines changed

actions/actions.py

Lines changed: 62 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ def run(self, dispatcher, tracker, domain):
5454
user_message = tracker.latest_message.get("text")
5555
logger.debug(f"Salvando fallback como descrição de risco: {user_message}")
5656
correcao_classificacao = tracker.get_slot("contexto_classificacao_corrigida")
57+
dispatcher.utter_message(text="Obrigada pela descrição!")
5758
next_action = "utter_perguntar_por_midia" if not correcao_classificacao else "action_confirmar_relato"
5859
return [
5960
SlotSet("descricao_risco", user_message),
@@ -256,7 +257,7 @@ def run(self, dispatcher, tracker, domain):
256257
logger.error(f"Erro ao buscar nome no banco: {e}")
257258

258259
dispatcher.utter_message(
259-
text="Oie! 👋 \n \n Bem-vindo(a) à *Defesa Climática Popular*.\n \nPra começar, *como você prefere ser chamado(a)?*"
260+
text="Oie! 👋 \n \n Bem-vindo(a) à *Defesa Climática Popular*.\n \nPra começar, *como você prefere ser chamada(o)?*"
260261
)
261262

262263
return [SlotSet("pagina_risco",1)]
@@ -325,7 +326,7 @@ def run(self, dispatcher, tracker, domain):
325326
finally:
326327
if conn:
327328
conn.close()
328-
dispatcher.utter_message(text="Sem problemas! Como você prefere ser chamado(a)?")
329+
dispatcher.utter_message(text="Sem problemas! Como você prefere ser chamada(o)?")
329330
return [SlotSet("nome", None)]
330331
class ActionBuscarEndereco(Action):
331332
def name(self):
@@ -356,7 +357,7 @@ def run(self, dispatcher, tracker, domain):
356357
if endereco and dentro_do_retangulo(latitude, longitude):
357358
logger.debug(f"Endereço no retangulo {latitude}{longitude}")
358359
dispatcher.utter_message(
359-
text=f"Encontrei esse endereço:\n{endereco}\nEstá correto?",
360+
text=f"Encontrei esse endereço:\n{endereco}\n \nEstá correto?",
360361
buttons=[
361362
{"title": "Sim", "payload": "/affirm_address"},
362363
{"title": "Não", "payload": "/deny_address"}
@@ -380,7 +381,7 @@ def run(self, dispatcher, tracker, domain):
380381
endereco = location_data['address']
381382
endereco = format_address(endereco)
382383
dispatcher.utter_message(
383-
text=f"Encontrei esse endereço:\n{endereco}\nEstá correto?",
384+
text=f"Encontrei esse endereço:\n{endereco}\n \nEstá correto?",
384385
buttons=[
385386
{"title": "Sim", "payload": "/affirm_address"},
386387
{"title": "Não", "payload": "/deny_address"}
@@ -432,7 +433,7 @@ def run(self, dispatcher, tracker, domain):
432433
latitude = coords.get("lat","")
433434
longitude = coords.get("lng","")
434435
dispatcher.utter_message(
435-
text=f"Encontrei esse endereço:\n{endereco}\nEstá correto?",
436+
text=f"Encontrei esse endereço:\n{endereco}\n \nEstá correto?",
436437
buttons=[
437438
{"title": "Sim", "payload": "/affirm_address"},
438439
{"title": "Não", "payload": "/deny_address"}
@@ -501,7 +502,7 @@ def run(self, dispatcher, tracker, domain):
501502
next_action = "utter_perguntar_por_midia" if last_action == "utter_classificar_risco" else "action_confirmar_relato"
502503
descricao = tracker.get_slot("descricao_risco")
503504
if descricao:
504-
dispatcher.utter_message(text="Obrigado pela descrição!")
505+
dispatcher.utter_message(text="Obrigada pela descrição!")
505506
return [FollowupAction(next_action)]
506507
else:
507508
dispatcher.utter_message(text="Não consegui entender a descrição, tente novamente.")
@@ -529,7 +530,6 @@ def run(self, dispatcher, tracker, domain):
529530

530531
midias_slot = tracker.get_slot("midias") or []
531532
logger.debug(f"midia_data: {midia_data}")
532-
533533
if midia_data.get("tipo") == "mídia_combinada":
534534
novas_midias = [m["path"] for m in midia_data["midias"]]
535535
midias_slot.extend(novas_midias)
@@ -538,8 +538,11 @@ def run(self, dispatcher, tracker, domain):
538538
path = midia_data["path"]
539539
midias_slot.append(path)
540540

541-
dispatcher.utter_message(text=f"Recebendo... Se ainda estiver algo carregando, aguarde concluir.")
542-
return [SlotSet("midias", midias_slot)]
541+
quantidade_midias = len(midias_slot)
542+
plural = "s" if quantidade_midias > 1 else ""
543+
dispatcher.utter_message(text=f"📸 Já recebemos {quantidade_midias} arquivo{plural}. Se ainda tiver mídia sendo enviada, *espere concluir*.")
544+
545+
return [SlotSet("midias", midias_slot), FollowupAction("action_perguntar_por_nova_midia")]
543546

544547
except Exception as e:
545548
dispatcher.utter_message(
@@ -557,7 +560,7 @@ def run(self, dispatcher, tracker, domain):
557560
time.sleep(1)
558561
logger.debug("rodando action: action_perguntar_por_nova_midia")
559562
dispatcher.utter_message(
560-
text="📸 Você pode mandar mais fotos e vídeos ou clicar em Não enviar mais para seguir.",
563+
text="Você pode enviar mais fotos ou vídeos ou clicar em *Não enviar mais* para continuar.",
561564
buttons=[
562565
{"title": "Não enviar mais", "payload": "/pular_enviar_midia_risco"}
563566
]
@@ -735,16 +738,12 @@ def run(self, dispatcher, tracker, domain):
735738
dispatcher.utter_message(text="Erro ao salvar os dados do risco.")
736739
logger.error(f"[ERRO SALVAMENTO RISCO] {e}", exc_info=True)
737740
return []
738-
739-
dispatcher.utter_message(
740-
text='*Registrado!*\n \nVamos *revisar suas informações* e, assim que finalizarmos, você receberá uma mensagem de confirmação.\n \n⚠️ Em caso de urgência, ligue para a *Defesa Civil: 199*.'
741-
)
742741

743742
dispatcher.utter_message(
744-
text='ℹ️ Te ajudo em algo mais? Você pode:',
743+
text='*Registrado!* Te ajudo em algo mais? Você pode:',
745744
buttons=[
746-
{"title": "Como tá minha área?", "payload": "/como_ta_minha_area"},
747-
{"title": "Menu inicial", "payload": "/menu_inicial"},
745+
{"title": "Situação no Jacaré", "payload": "/situacao_no_jacare"},
746+
{"title": "Contatos emergência", "payload": "/contatos_emergencia"},
748747
{"title": "Encerrar", "payload": "/sair"}
749748
]
750749
)
@@ -765,71 +764,43 @@ def name(self) -> str:
765764

766765
def run(self, dispatcher, tracker, domain):
767766
logger.debug("rodando action: action_listar_riscos")
768-
last_action = None
769-
last_action = get_last_action(tracker)
770-
pagina = tracker.get_slot("pagina_risco") or 1
771-
if last_action != "action_listar_riscos" and last_action != "action_perguntar_mais_riscos":
772-
logger.debug(f"Last action:: {last_action}")
773-
pagina = 1
774-
775767
wordpress_url = os.getenv("WORDPRESS_URL")
776768
if not wordpress_url:
777769
dispatcher.utter_message(text="Erro de configuração: URL do WordPress não definida.")
778770
logger.error("WORDPRESS_URL não está definida nas variáveis de ambiente.")
779771
return []
780772

781-
endpoint = f"{wordpress_url}wp-json/dcp/v1/riscos?per_page=1&page={pagina}"
773+
endpoint = f"{wordpress_url}wp-json/dcp/v1/riscos-resumo"
782774
logger.debug(f"Buscando riscos na URL: {endpoint}")
783775

784776
try:
785777
response = requests.get(endpoint)
786778
logger.debug(f"Resposta HTTP: {response.status_code} - {response.text}")
787779
response.raise_for_status()
788780
dados = response.json()
789-
riscos = extrair_riscos(dados)
790-
if not riscos and pagina == 1:
791-
dispatcher.utter_message(text="Nenhuma informação foi compartilhada pela comunidade recentemente!")
792-
return [SlotSet("pagina_risco", 1),FollowupAction("utter_saida_riscos")]
793-
if not riscos:
794-
dispatcher.utter_message(text="Você já viu todos os relatos da comunidade.")
795-
return [SlotSet("pagina_risco", 1),FollowupAction("utter_saida_riscos")]
796-
if pagina > 5:
797-
dispatcher.utter_message(text="Para visualizar mais riscos entre no nosso site: https://defesaclimaticapopular.org.br/")
798-
return [SlotSet("pagina_risco", 1),FollowupAction("utter_saida_riscos")]
799-
mensagem = '⬇️ Confira abaixo as informações enviadas pela comunidade:\n \n \n' if pagina == 1 else ''
800-
for risco in riscos:
801-
classificacao = risco['classificacao'][0]
802-
classificacao_dict = {
803-
"Alagamento": "*Alagamento* informado",
804-
"Lixo": "*Lixo* registrado",
805-
"Outros": "*Risco* informado"
806-
}
807-
classificacao_texto = classificacao_dict.get(classificacao, "")
808-
data_hora = formata_data(risco['data'],'%H:%M do dia %d/%m/%Y')
809-
mensagem += (
810-
f"{classificacao_texto} às {data_hora}\n \n"
811-
f"*Local:* {risco['endereco']}\n \n"
781+
# Exemplo de dados: {"total":6,"alagamento":4,"lixo":1,"outros":1}
782+
total = dados.get("total", 0)
783+
alagamento = dados.get("alagamento", 0)
784+
lixo = dados.get("lixo", 0)
785+
outros = dados.get("outros", 0)
786+
if total == 0:
787+
dispatcher.utter_message(text="📝 Nas últimas 24h não houve nenhum registro de risco.")
788+
else:
789+
mensagem = (
790+
f"📝 Nas últimas 24h foram registrados {total} relatos: "
791+
f"sendo {alagamento} sobre alagamento, {lixo} sobre lixo e {outros} sobre outros riscos."
812792
)
813-
if risco['descricao']:
814-
mensagem += f"*Descrição:* {risco['descricao']}\n \n"
815-
if risco['imagens'] or risco['videos']:
816-
mensagem = mensagem + f"*Fotos/vídeos:*\n \n"
817-
dispatcher.utter_message(text=mensagem)
818-
for image in risco['imagens']:
819-
dispatcher.utter_message(image=image)
820-
videos = risco['videos']
821-
for idx, video in enumerate(videos):
822-
is_last = idx == len(videos) - 1
823-
logger.debug(f"video: {video}")
824-
dispatcher.utter_message(text="", custom={"type": "video", "url": video, 'is_last': is_last})
825-
dispatcher.utter_message(text="\n \n \n \n")
793+
dispatcher.utter_message(text=mensagem)
794+
dispatcher.utter_message(
795+
text="➡️ Para ver todos os relatos e acompanhar mais detalhes, acesse: defesaclimaticapopular.org.br"
796+
)
826797

827-
return [SlotSet("pagina_risco", pagina + 1), FollowupAction("action_perguntar_mais_riscos")]
798+
return [FollowupAction('action_preciso_de_ajuda')]
828799

829800
except requests.RequestException as e:
830801
dispatcher.utter_message(text="Ocorreu um erro ao buscar os riscos.")
831802
logger.error(f"[ERRO] Falha na requisição para {endpoint}: {e}", exc_info=True)
832-
return []
803+
return [FollowupAction('action_listen')]
833804

834805
class ActionPerguntarMaisRiscos(Action):
835806
def name(self) -> str:
@@ -938,7 +909,16 @@ def run(
938909
texto_final = FALLBACK_TEXTO
939910

940911
dispatcher.utter_message(text=texto_final)
941-
return []
912+
dispatcher.utter_message(
913+
text='Te ajudo em algo mais? Você pode:',
914+
buttons=[
915+
{"title": "Informar um risco", "payload": "/informar_risco"},
916+
{"title": "Contatos emergência", "payload": "/contatos_emergencia"},
917+
{"title": "Encerrar", "payload": "/sair"}
918+
]
919+
920+
)
921+
return [FollowupAction('action_listen')]
942922

943923
class ActionListarAbrigos(Action):
944924
def name(self):
@@ -1007,12 +987,28 @@ def run(self, dispatcher, tracker, domain):
1007987

1008988
mensagem_final = f"Contatos de emergência:\n \n{mensagem}"
1009989
dispatcher.utter_message(text=mensagem_final)
1010-
990+
dispatcher.utter_message(
991+
text='Te ajudo em algo mais? Você pode:',
992+
buttons=[
993+
{"title": "Informar um risco", "payload": "/informar_risco"},
994+
{"title": "Situação no Jacaré", "payload": "/situacao_no_jacare"},
995+
{"title": "Encerrar", "payload": "/sair"}
996+
]
997+
998+
)
1011999
except requests.exceptions.RequestException as e:
10121000
dispatcher.utter_message(text="Não foi possível obter os contatos de emergência no momento.")
10131001
print(f"Erro ao acessar o endpoint: {e}")
1002+
dispatcher.utter_message(
1003+
text='Te ajudo em algo mais? Você pode:',
1004+
buttons=[
1005+
{"title": "Informar um risco", "payload": "/informar_risco"},
1006+
{"title": "Situação no Jacaré", "payload": "/situacao_no_jacare"},
1007+
{"title": "Encerrar", "payload": "/sair"}
1008+
]
1009+
)
10141010

1015-
return []
1011+
return [FollowupAction('action_listen')]
10161012

10171013
# class ActionBuscarDicas(Action):
10181014
# def name(self):

data/nlu.yml

Lines changed: 4 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -432,10 +432,10 @@ nlu:
432432
- /menu_inicial
433433
- começar
434434
435-
- intent: como_ta_minha_area
435+
- intent: situacao_no_jacare
436436
examples: |
437-
- /como_ta_minha_area
438-
- como_ta_minha_area
437+
- /situacao_no_jacare
438+
- situacao_no_jacare
439439
- situação na minha região
440440
- situação na região
441441
- como está a região
@@ -448,22 +448,6 @@ nlu:
448448
- É seguro sair agora?
449449
450450
451-
- intent: preciso_de_ajuda
452-
examples: |
453-
- preciso_de_ajuda
454-
- /preciso_de_ajuda
455-
- o que fazer agora?
456-
- o que faço?
457-
- saber o que fazer
458-
- Como me proteger?
459-
- Preciso me proteger?
460-
- O que não fazer?
461-
- O que evitar?
462-
- não sei o que fazer
463-
- /ajuda
464-
- eu estou na enchente
465-
- estou com medo
466-
467451
468452
- intent: contatos_emergencia
469453
examples: |
@@ -486,41 +470,6 @@ nlu:
486470
487471
488472
489-
- intent: encontrar_abrigo
490-
examples: |
491-
- /encontrar_abrigo
492-
- encontrar_abrigo
493-
- encontrar abrigo
494-
- preciso me abrigar
495-
- para onde ir
496-
- Para onde eu vou
497-
- Onde está/tá seguro
498-
- Onde tem abrigo? Tem abrigo perto?
499-
- Preciso sair de casa, pra onde vou?
500-
501-
502-
# - intent: menu_dicas
503-
# examples: |
504-
# - dicas_de_seguranca
505-
# - /dicas_de_seguranca
506-
# - dicas de segurança
507-
# - Como ficar em segurança
508-
509-
# - intent: dicas_de
510-
# examples: |
511-
# - /dicas{"dicas": "enchente"}
512-
# - /dicas{"dicas": "lixo"}
513-
# - /dicas{"dicas": "calor"}
514-
# - {"dicas": "enchente"}
515-
# - {"dicas": "lixo"}
516-
# - {"dicas": "calor"}
517-
# - dicas de Calor
518-
# - dicas de lixo
519-
# - dicas de enchente
520-
# - O que fazer quando tem enchente {"dicas": "enchente"}
521-
# - O que fazer quando tem lixo {"dicas": "lixo"}
522-
# - O que fazer quando tem calor {"dicas": "calor"}
523-
524473
- intent: sair
525474
examples: |
526475
- /sair
@@ -530,20 +479,6 @@ nlu:
530479
- fechar
531480
- encerrar
532481
533-
- intent: mais_riscos
534-
examples: |
535-
- mais_riscos
536-
- /mais_riscos
537-
- quer ver mais riscos
538-
- me mostre mais riscos
539-
540-
- intent: sair_consulta_risco
541-
examples: |
542-
- /sair_consulta_risco
543-
- não quero mais riscos
544-
- sair_consulta_risco
545-
- sair consulta risco
546-
547482
- intent: just_listen
548483
examples: |
549484
- EXTERNAL: inatividade_monitoramento
@@ -615,3 +550,4 @@ nlu:
615550
- não pode ser
616551
- não quero
617552
- não mesmo
553+

0 commit comments

Comments
 (0)