-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchat.py
156 lines (128 loc) · 5.24 KB
/
chat.py
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
from flask import Flask, render_template, request, jsonify
from chatterbot import ChatBot
from chatterbot.trainers import ListTrainer
import re
import logging
from datetime import datetime
import mysql.connector
app = Flask(__name__)
app.logger.addHandler(logging.StreamHandler())
app.logger.setLevel(logging.INFO)
chatbot = ChatBot("Chatbot")
conversa = [
'Oi',
'Olá',
'Tudo bem?',
'Tudo ótimo',
'Tudo',
'Que bom',
'Qual o valor?',
'R$ 30,00',
'Quem é você?',
'Eu sou um assistente virtual',
'Obrigada',
'Por nada!',
]
trainer = ListTrainer(chatbot)
trainer.train(conversa)
config = {
'user': 'root',
'password': '',
'host': 'localhost',
'database': 'barbearia',
}
@app.route("/")
def home():
return render_template("index.html")
# Funções CRUD
def agendar(nome_cliente, data, hora):
try:
data_formatada = datetime.strptime(data, "%Y-%m-%d").date()
hora_formatada = datetime.strptime(hora, "%H:%M:%S").time()
# Obter a conexão com o banco de dados usando mysql-connector-python
conn = mysql.connector.connect(**config)
cur = conn.cursor()
cur.execute("INSERT INTO agendamentos (nome_cliente, data, hora) VALUES (%s, %s, %s)",
(nome_cliente, data_formatada, hora_formatada))
conn.commit()
return "Agendamento realizado com sucesso!"
except Exception as e:
return f"Erro ao agendar: {str(e)}"
def cancelar(agendamento_id):
try:
cur = mysql.get_db().cursor()
cur.execute("DELETE FROM agendamentos WHERE id = %s", [agendamento_id])
mysql.get_db().commit()
return "Cancelamento realizado com sucesso!"
except Exception as e:
return f"Erro ao cancelar: {str(e)}"
def consultar():
try:
cur = mysql.get_db().cursor()
cur.execute("SELECT * FROM agendamentos")
result = cur.fetchall()
return jsonify(result)
except Exception as e:
return f"Erro ao consultar: {str(e)}"
# Rota para processar a mensagem do usuário
@app.route("/get_response", methods=["POST"])
def get_response():
try:
user_message = request.form["user_message"]
app.logger.info(f"Received user message: {user_message}")
# Processa operações CRUD
resultado_operacao = processa_agendamento(user_message)
if resultado_operacao:
resposta = resultado_operacao
else:
resposta = str(chatbot.get_response(user_message))
return resposta
except Exception as e:
app.logger.error(f"Error processing request: {e}")
return "Error"
def processa_agendamento(user_message):
# Lista de palavras-chave relacionadas a operações CRUD
palavras_chave_agendar = ["agendamento", "agendar", "marcar", "data", "hora", "dia"]
palavras_chave_cancelar = ["cancelar", "desmarcar", "remover", "cancelamento"]
palavras_chave_consultar = ["consultar", "verificar", "meus agendamentos"]
palavras_chave_alterar = ["alterar", "alteração", "mudar"]
# Construir expressões regulares para encontrar palavras-chave
padrao_agendar = re.compile(r"\b(?:{})\b".format("|".join(palavras_chave_agendar)), re.IGNORECASE)
padrao_cancelar = re.compile(r"\b(?:{})\b".format("|".join(palavras_chave_cancelar)), re.IGNORECASE)
padrao_consultar = re.compile(r"\b(?:{})\b".format("|".join(palavras_chave_consultar)), re.IGNORECASE)
padrao_alterar = re.compile(r"\b(?:{})\b".format("|".join(palavras_chave_alterar)), re.IGNORECASE)
# Verificar se as expressões regulares encontram correspondências na mensagem do usuário
if padrao_agendar.search(user_message):
# Tentar extrair informações sobre agendamento da mensagem do usuário
informacoes_agendamento = extrai_informacoes_agendamento(user_message)
if informacoes_agendamento:
# Aqui você pode processar as informações extraídas (nome, data, hora)
nome_cliente = informacoes_agendamento.get("nome")
data = informacoes_agendamento.get("data")
hora = informacoes_agendamento.get("hora")
# Chama a função de agendamento
return agendar(nome_cliente, data, hora)
else:
return "Não foi possível extrair informações de agendamento."
elif padrao_cancelar.search(user_message):
# Executar a operação de cancelamento
# A lógica de cancelamento deve ser implementada aqui
return "Operação: Cancelar"
elif padrao_consultar.search(user_message):
# Executar a operação de consulta
# A lógica de consulta deve ser implementada aqui
return "Operação: Consultar"
else:
# Nenhuma operação correspondente identificada
return None
def extrai_informacoes_agendamento(user_message):
# Construir uma expressão regular para extrair nome, data e hora da mensagem
padrao = re.compile(r"\b(?:nome|data|hora)\b.*?(\b\w+\b)", re.IGNORECASE)
correspondencia = padrao.findall(user_message)
if correspondencia:
# Retorna um dicionário com as informações extraídas
return {"nome": correspondencia[0], "data": correspondencia[1], "hora": correspondencia[2]}
else:
return None
if __name__ == "__main__":
app.run()