danielraynaud commited on
Commit
a989bf4
·
verified ·
1 Parent(s): d2646ab

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +145 -373
app.py CHANGED
@@ -1,216 +1,29 @@
1
  import gradio as gr
2
  from transformers import pipeline
3
- import json
4
  import sqlite3
5
  from datetime import datetime, timedelta
6
- import pandas as pd
7
  import random
8
- from typing import Dict, List, Optional
9
  from performance_system import PerformanceAnalyzer
10
  from simulado_system import SimuladoSystem, CasoClinicoSystem
11
- import json
12
  from database.db_manager import DatabaseManager
13
  from database.db_operations import adicionar_lote_questoes
14
- from study_generators import StudyMaterialGenerator, StudyPlanGenerator(self.db)
15
- from performance_analyzer import PerformanceAnalyzer
16
- import json
 
 
 
17
 
18
  class CRMJABot:
19
  def __init__(self):
 
20
  self.db = DatabaseManager()
21
- self.material_generator = StudyMaterialGenerator(self.db.get_connection()) # Corrigido para aceitar o argumento
22
  self.planner = StudyPlanGenerator(self.db)
23
  self.coach = MotivationalCoach()
24
- self.analytics = StudyAnalytics(self.db.conn)
25
- self.tracker = ProgressTracker(self.db.conn)
26
-
27
- self.performance = PerformanceAnalyzer()
28
- self.performance.set_db_connection(self.db.get_connection())
29
-
30
- try:
31
- with open('data/questoes_revalida.json', 'r', encoding='utf-8') as f:
32
- questoes = json.load(f)
33
-
34
- sucesso, mensagem = adicionar_lote_questoes(self.db, questoes)
35
-
36
- if sucesso:
37
- print("Questões adicionadas com sucesso!")
38
- else:
39
- print(f"Erro: {mensagem}")
40
-
41
- except Exception as e:
42
- print(f"Erro na inicialização: {str(e)}")
43
-
44
- def create_interface():
45
- return CRMJABot()
46
-
47
- if __name__ == "__main__":
48
- interface = create_interface()
49
- def buscar_questoes_para_simulado(db: DatabaseManager, usuario_id: str,
50
- num_questoes: int = 10,
51
- areas: list = None,
52
- dificuldade: str = None):
53
- """Busca questões para gerar simulado personalizado"""
54
- try:
55
- conn = db.get_connection()
56
- cursor = conn.cursor()
57
-
58
- # Busca áreas fracas do usuário
59
- user_profile = db.get_user_profile(usuario_id)
60
- weak_areas = user_profile.get('weak_areas', [])
61
-
62
- # Monta a query
63
- query = '''
64
- SELECT * FROM previous_questions
65
- WHERE 1=1
66
- '''
67
- params = []
68
-
69
- if areas:
70
- query += ' AND area IN ({})'.format(','.join(['?']*len(areas)))
71
- params.extend(areas)
72
-
73
- if dificuldade:
74
- query += ' AND difficulty = ?'
75
- params.append(dificuldade)
76
-
77
- # Prioriza áreas fracas
78
- if weak_areas:
79
- query += f'''
80
- ORDER BY
81
- CASE
82
- WHEN area IN ({','.join(['?']*len(weak_areas))}) THEN 1
83
- ELSE 2
84
- END,
85
- RANDOM()
86
- '''
87
- params.extend(weak_areas)
88
- else:
89
- query += ' ORDER BY RANDOM()'
90
-
91
- query += ' LIMIT ?'
92
- params.append(num_questoes)
93
-
94
- cursor.execute(query, params)
95
- questoes = cursor.fetchall()
96
-
97
- return [dict(q) for q in questoes]
98
-
99
- except Exception as e:
100
- logger.error(f"Erro ao buscar questões: {e}")
101
- return []
102
- from performance_system import PerformanceAnalyzer, StudyMaterialGenerator, ProgressTracker
103
-
104
- class MotivationalCoach:
105
- """Classe para gerenciar mensagens e estratégias motivacionais"""
106
-
107
- def __init__(self):
108
- self.frases_motivacionais = [
109
- "🌟 Cada hora de estudo te aproxima mais do seu objetivo!",
110
- "💪 Você está construindo seu futuro a cada dia!",
111
- "🎯 Mantenha o foco! O Revalida é só uma etapa da sua jornada de sucesso!",
112
- "⭐ Sua dedicação é inspiradora! Continue assim!",
113
- "🌈 Acredite no seu potencial! Você está no caminho certo!",
114
- "📚 Conhecimento é poder, e você está ficando mais forte a cada dia!",
115
- "🌅 Um novo dia, uma nova oportunidade de aprender!",
116
- "🎓 Sua aprovação no Revalida está cada vez mais próxima!"
117
- ]
118
-
119
- self.dicas_estudo = [
120
- "📌 Faça pequenas pausas a cada 45 minutos de estudo",
121
- "💡 Revise o conteúdo do dia antes de dormir",
122
- "🎯 Estabeleça metas diárias pequenas e alcançáveis",
123
- "📊 Alterne entre diferentes tópicos para manter o interesse",
124
- "🌟 Pratique questões antigas do Revalida regularmente",
125
- "💪 Mantenha uma rotina regular de estudos",
126
- "🧠 Use mapas mentais para conectar conceitos",
127
- "📝 Faça resumos ativos do conteúdo estudado"
128
- ]
129
-
130
- def get_motivational_message(self) -> str:
131
- return random.choice(self.frases_motivacionais)
132
-
133
- def get_study_tip(self) -> str:
134
- return random.choice(self.dicas_estudo)
135
-
136
- class StudyAnalytics:
137
- """Classe para análise avançada do progresso do estudante"""
138
-
139
- def __init__(self, db_connection):
140
- self.conn = db_connection
141
-
142
- def calculate_study_metrics(self, user_id: str) -> Dict:
143
- """Calcula métricas avançadas de estudo"""
144
- cursor = self.conn.cursor()
145
-
146
- # Horas totais de estudo
147
- cursor.execute('''
148
- SELECT SUM(horas_estudadas) FROM study_progress
149
- WHERE user_id = ?
150
- ''', (user_id,))
151
- total_horas = cursor.fetchone()[0] or 0
152
-
153
- # Desempenho por área
154
- cursor.execute('''
155
- SELECT topic, AVG(performance_score)
156
- FROM study_progress
157
- WHERE user_id = ?
158
- GROUP BY topic
159
- ''', (user_id,))
160
- desempenho_por_area = dict(cursor.fetchall())
161
-
162
- # Consistência de estudos (dias consecutivos)
163
- cursor.execute('''
164
- SELECT date FROM study_progress
165
- WHERE user_id = ?
166
- ORDER BY date DESC
167
- ''', (user_id,))
168
- datas = [row[0] for row in cursor.fetchall()]
169
- dias_consecutivos = self.calculate_streak(datas)
170
-
171
- return {
172
- "total_horas": total_horas,
173
- "desempenho_por_area": desempenho_por_area,
174
- "dias_consecutivos": dias_consecutivos
175
- }
176
-
177
- @staticmethod
178
- def calculate_streak(dates: List[str]) -> int:
179
- if not dates:
180
- return 0
181
-
182
- dates = [datetime.strptime(d, '%Y-%m-%d').date() for d in dates]
183
- dates.sort(reverse=True)
184
-
185
- streak = 1
186
- for i in range(len(dates)-1):
187
- if (dates[i] - dates[i+1]).days == 1:
188
- streak += 1
189
- else:
190
- break
191
- return streak
192
-
193
- class StudyMaterialGenerator:
194
- def __init__(self, db_connection):
195
- self.db_connection = db_connection # Passa o argumento necessário
196
- self.planner = StudyPlanGenerator(self.db) # Certifique-se de que StudyPlanGenerator aceita a instância de db
197
- self.coach = MotivationalCoach()
198
- self.analytics = StudyAnalytics(self.db.conn) # Certifique-se de que StudyAnalytics aceita db.conn
199
- self.tracker = ProgressTracker(self.db.conn) # Certifique-se de que ProgressTracker aceita db.conn
200
-
201
- self.performance = PerformanceAnalyzer()
202
- self.performance.set_db_connection(self.db.get_connection()) # Verifica o método set_db_connection
203
 
204
- try:
205
- self.qa_pipeline = pipeline(
206
- "question-answering",
207
- model="pierreguillou/bert-base-cased-squad-v1.1-portuguese",
208
- device=-1
209
- )
210
- except Exception as e:
211
- print(f"Erro ao carregar o modelo: {e}")
212
- self.qa_pipeline = None
213
-
214
  self.commands = {
215
  "/start": self.start_command,
216
  "/plano": self.create_plan,
@@ -221,232 +34,191 @@ class StudyMaterialGenerator:
221
  "/motiva": self.get_motivation,
222
  "/resumo": self.get_summary,
223
  "/ajuda": self.help_command,
224
- "/simulado": self.start_simulado,
225
- "/caso": self.start_caso_clinico,
226
- "/bancoquestoes": self.banco_questoes,
227
- "/revisao": self.modo_revisao,
228
- "/meta": self.set_goal,
229
- "/perfil": self.show_profile,
230
- "/configurar": self.configure_preferences
231
  }
232
-
233
- def start_command(self, message: str, user_id: str) -> str:
234
- """Mensagem inicial de boas-vindas"""
235
- return f"""🌟 Olá! Eu sou o crmjaBot, seu assistente pessoal para o Revalida!
236
-
237
- Estou aqui para te ajudar a alcançar seu objetivo de aprovação! Vamos juntos nessa jornada?
238
-
239
- Comandos principais:
240
- 📚 /plano - Criar plano de estudos personalizado
241
- 📊 /progresso - Verificar seu progresso
242
- 📝 /questoes - Praticar questões anteriores
243
- ⏱ /estudo - Registrar sessão de estudo
244
- 💡 /dica - Receber dica de estudo
245
- 🌟 /motiva - Mensagem motivacional
246
- 📋 /resumo - Resumo do seu desempenho
247
- ❓ /ajuda - Ver todos os comandos
248
-
249
- {self.coach.get_motivational_message()}
250
-
251
- Como posso te ajudar hoje?"""
252
-
253
- def get_tip(self, message: str, user_id: str) -> str:
254
- """Fornece dica de estudo"""
255
- return f"💡 Dica do dia:\n\n{self.coach.get_study_tip()}"
256
 
257
- def get_motivation(self, message: str, user_id: str) -> str:
258
- """Fornece mensagem motivacional"""
259
- return f"✨ Mensagem motivacional:\n\n{self.coach.get_motivational_message()}"
260
-
261
- def get_summary(self, message: str, user_id: str) -> str:
262
- """Fornece resumo completo do progresso"""
263
  try:
264
- metrics = self.analytics.calculate_study_metrics(user_id)
265
-
266
- response = f"""📊 Resumo do seu desempenho:
267
 
268
- Total de horas estudadas: {metrics['total_horas']:.1f}h
269
- 🎯 Sequência atual: {metrics['dias_consecutivos']} dias consecutivos
270
 
271
- 📈 Desempenho por área:"""
272
-
273
- for area, score in metrics['desempenho_por_area'].items():
274
- response += f"\n- {area}: {score:.1f}%"
275
-
276
- response += f"\n\n{self.coach.get_motivational_message()}"
277
-
278
- return response
279
-
280
  except Exception as e:
281
- return f"Erro ao gerar resumo: {str(e)}"
 
 
 
 
 
 
 
 
 
282
 
283
  def create_plan(self, message: str, user_id: str) -> str:
284
- """Criar plano de estudos personalizado com elementos motivacionais"""
285
  try:
286
  parts = message.split()
287
  if len(parts) < 3:
288
- return """📚 Para criar seu plano personalizado, preciso de algumas informações:
289
-
290
- Formato: /plano horas_diarias AAAA-MM-DD área1,área2
291
-
292
- Exemplo: /plano 4 2024-07-15 ClínicaMédica,Cirurgia
293
-
294
- As áreas disponíveis são:
295
- - ClínicaMédica
296
- - Cirurgia
297
- - Pediatria
298
- - GinecologiaObstetrícia
299
- - MedicinaFamília
300
- - SaúdeMental"""
301
-
302
  horas = int(parts[1])
303
  data_alvo = parts[2]
304
- areas_fracas = parts[3].split(',') if len(parts) > 3 else []
305
-
306
- plano = self.planner.create_study_plan(user_id, horas, data_alvo, areas_fracas)
307
-
308
- response = f"""✨ Seu Plano de Estudos Personalizado está pronto!
309
 
310
- {self.coach.get_motivational_message()}
311
-
312
- 📚 Distribuição semanal:"""
313
-
314
- for semana, topicos in plano.items():
315
- response += f"\n\n📅 {semana}:"
316
- for topico, horas in topicos.items():
317
- response += f"\n ▪ {topico}: {horas}h"
318
-
319
- response += f"\n\n💡 Dica: {self.coach.get_study_tip()}"
320
-
321
- return response
322
-
323
  except Exception as e:
324
- return f"Erro ao criar plano: {str(e)}"
 
325
 
326
  def check_progress(self, message: str, user_id: str) -> str:
327
- """Verifica o progresso com feedback motivacional"""
328
  try:
329
  metrics = self.analytics.calculate_study_metrics(user_id)
330
-
331
- response = f"""📊 Seu Progresso:
332
-
333
- ⭐ Incrível! Você já estudou {metrics['total_horas']:.1f} horas no total!
334
- 🎯 Sequência atual: {metrics['dias_consecutivos']} dias consecutivos
335
-
336
- 📈 Desempenho por área:"""
337
-
338
  for area, score in metrics['desempenho_por_area'].items():
339
- response += f"\n ▪ {area}: {score:.1f}%"
340
-
341
- response += f"\n\n{self.coach.get_motivational_message()}"
342
-
343
- if metrics['dias_consecutivos'] >= 7:
344
- response += "\n\n🏆 Parabéns pela dedicação consistente!"
345
-
346
  return response
347
-
348
  except Exception as e:
349
- return f"Erro ao verificar progresso: {str(e)}"
 
 
 
 
350
 
351
  def study_mode(self, message: str, user_id: str) -> str:
352
- """Registra sessão de estudo com feedback motivacional"""
353
- try:
354
- parts = message.split()
355
- if len(parts) < 3:
356
- return """📚 Para registrar seu estudo:
357
 
358
- Formato: /estudo área horas
 
359
 
360
- Exemplo: /estudo ClínicaMédica 2.5"""
361
-
362
- area = parts[1]
363
- horas = float(parts[2])
364
-
365
- cursor = self.db.conn.cursor()
366
- cursor.execute('''
367
- INSERT INTO study_progress
368
- (user_id, date, topic, horas_estudadas, questions_answered, performance_score)
369
- VALUES (?, ?, ?, ?, ?, ?)
370
- ''', (user_id, datetime.now().date(), area, horas, 0, 0.0))
371
- self.db.conn.commit()
372
-
373
  metrics = self.analytics.calculate_study_metrics(user_id)
374
-
375
- response = f"""✅ Ótimo trabalho! Registrei {horas}h de estudo em {area}
 
 
 
 
 
 
 
376
 
377
- Total de horas estudadas: {metrics['total_horas']:.1f}h
378
- 🎯 Sequência atual: {metrics['dias_consecutivos']} dias
379
 
380
- {self.coach.get_motivational_message()}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
381
 
382
- 💡 Dica: {self.coach.get_study_tip()}"""
383
-
384
- return response
385
-
386
- except Exception as e:
387
- return f"Erro ao registrar estudo: {str(e)}"
388
 
389
- def generate_response(self, message: str, history: List) -> str:
390
- """Gera resposta personalizada usando o pipeline de QA"""
391
- if not self.qa_pipeline:
392
- return f"""Desculpe, o modelo de linguagem não está disponível no momento.
393
 
394
- {self.coach.get_motivational_message()}
 
 
395
 
396
- Use /ajuda para ver os comandos disponíveis!"""
397
-
398
  try:
399
- context = "\n".join([h[1] for h in history[-3:]] if history else "")
400
-
401
- result = self.qa_pipeline(
402
- question=message,
403
- context=context or "Você é o crmjaBot, um assistente motivacional e educacional para o Revalida."
404
- )
405
-
406
- return f"""{result['answer']}
407
-
408
- {self.coach.get_motivational_message()}"""
409
- except Exception as e:
410
- return f"Erro ao gerar resposta: {str(e)}"
411
 
412
- def help_command(self, message: str, user_id: str) -> str:
413
- """Mostra todos os comandos disponíveis"""
414
- return """🤖 Comandos do crmjaBot:
 
 
415
 
416
- 📚 Estudos:
417
- /plano - Criar plano de estudos personalizado
418
- /estudo - Registrar sessão de estudo
419
- /questoes - Praticar questões anteriores
 
420
 
421
- 📊 Acompanhamento:
422
- /progresso - Ver seu progresso
423
- /resumo - Resumo completo do desempenho
 
 
 
 
 
 
 
 
 
 
 
 
424
 
425
- ✨ Motivacional:
426
- /dica - Receber dica de estudo
427
- /motiva - Mensagem motivacional
 
 
 
 
 
 
 
 
 
 
428
 
429
- Ajuda:
430
- /start - Iniciar/reiniciar bot
431
- /ajuda - Ver esta mensagem
432
 
433
- Estou aqui para te ajudar! Como posso ser útil hoje?"""
 
 
 
 
 
 
 
 
 
434
 
435
  def create_interface():
436
- """Criar interface Gradio"""
437
  bot = CRMJABot()
438
-
439
  with gr.Blocks(title="crmjaBot - Assistente Revalida") as interface:
440
- gr.Markdown("# 🏥 crmjaBot")
441
  gr.Markdown("### Seu mentor personalizado para o Revalida")
442
-
443
  with gr.Row():
444
  with gr.Column():
445
  user_id = gr.Textbox(
446
  label="Seu ID (email ou telefone)",
447
  placeholder="Digite seu ID único..."
448
  )
449
-
450
  chatbot = gr.Chatbot()
451
  msg = gr.Textbox(
452
  placeholder="Digite sua mensagem ou comando aqui...",
@@ -465,4 +237,4 @@ def create_interface():
465
 
466
  if __name__ == "__main__":
467
  interface = create_interface()
468
- interface.launch()
 
1
  import gradio as gr
2
  from transformers import pipeline
 
3
  import sqlite3
4
  from datetime import datetime, timedelta
 
5
  import random
6
+ from typing import Dict, List
7
  from performance_system import PerformanceAnalyzer
8
  from simulado_system import SimuladoSystem, CasoClinicoSystem
 
9
  from database.db_manager import DatabaseManager
10
  from database.db_operations import adicionar_lote_questoes
11
+ from study_generators import StudyPlanGenerator
12
+ import logging
13
+
14
+ # Configuração de logging
15
+ logging.basicConfig(level=logging.INFO)
16
+ logger = logging.getLogger(__name__)
17
 
18
  class CRMJABot:
19
  def __init__(self):
20
+ logger.info("Iniciando CRMJABot...")
21
  self.db = DatabaseManager()
22
+ self.material_generator = StudyMaterialGenerator(self.db.get_connection())
23
  self.planner = StudyPlanGenerator(self.db)
24
  self.coach = MotivationalCoach()
25
+ self.analytics = StudyAnalytics(self.db.get_connection())
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
 
 
 
 
 
 
 
 
 
 
 
27
  self.commands = {
28
  "/start": self.start_command,
29
  "/plano": self.create_plan,
 
34
  "/motiva": self.get_motivation,
35
  "/resumo": self.get_summary,
36
  "/ajuda": self.help_command,
 
 
 
 
 
 
 
37
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
 
 
 
 
 
 
 
39
  try:
40
+ with open('data/questoes_revalida.json', 'r', encoding='utf-8') as f:
41
+ questoes = json.load(f)
 
42
 
43
+ sucesso, mensagem = adicionar_lote_questoes(self.db, questoes)
 
44
 
45
+ if sucesso:
46
+ logger.info("Questões adicionadas com sucesso!")
47
+ else:
48
+ logger.error(f"Erro ao adicionar questões: {mensagem}")
 
 
 
 
 
49
  except Exception as e:
50
+ logger.error(f"Erro na inicialização do banco de questões: {e}")
51
+
52
+ def process_message(self, message: str, user_id: str, history: List) -> str:
53
+ command = message.split()[0]
54
+ if command in self.commands:
55
+ return self.commands[command](message, user_id)
56
+ return "Comando não reconhecido. Use /ajuda para ver os comandos disponíveis."
57
+
58
+ def start_command(self, message: str, user_id: str) -> str:
59
+ return "\ud83c\udf1f Bem-vindo ao crmjaBot! Use /ajuda para ver os comandos disponíveis."
60
 
61
  def create_plan(self, message: str, user_id: str) -> str:
 
62
  try:
63
  parts = message.split()
64
  if len(parts) < 3:
65
+ return "Erro: Informe horas diárias, data-alvo e áreas de estudo."
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  horas = int(parts[1])
67
  data_alvo = parts[2]
68
+ areas = parts[3].split(",") if len(parts) > 3 else []
 
 
 
 
69
 
70
+ plano = self.planner.create_study_plan(user_id, horas, data_alvo, areas)
71
+ return f"Plano criado: {plano}"
 
 
 
 
 
 
 
 
 
 
 
72
  except Exception as e:
73
+ logger.error(f"Erro ao criar plano: {e}")
74
+ return "Erro ao criar plano."
75
 
76
  def check_progress(self, message: str, user_id: str) -> str:
 
77
  try:
78
  metrics = self.analytics.calculate_study_metrics(user_id)
79
+ response = f"\ud83d\udd04 Seu progresso:\n"
80
+ response += f"Total de horas estudadas: {metrics['total_horas']}\n"
81
+ response += f"Dias consecutivos de estudo: {metrics['dias_consecutivos']}\n"
 
 
 
 
 
82
  for area, score in metrics['desempenho_por_area'].items():
83
+ response += f"{area}: {score:.2f}%\n"
 
 
 
 
 
 
84
  return response
 
85
  except Exception as e:
86
+ logger.error(f"Erro ao verificar progresso: {e}")
87
+ return "Erro ao verificar progresso."
88
+
89
+ def previous_questions(self, message: str, user_id: str) -> str:
90
+ return "Função de perguntas anteriores ainda não implementada."
91
 
92
  def study_mode(self, message: str, user_id: str) -> str:
93
+ return "Função de modo de estudo ainda não implementada."
 
 
 
 
94
 
95
+ def get_tip(self, message: str, user_id: str) -> str:
96
+ return self.coach.get_study_tip()
97
 
98
+ def get_motivation(self, message: str, user_id: str) -> str:
99
+ return self.coach.get_motivational_message()
100
+
101
+ def get_summary(self, message: str, user_id: str) -> str:
102
+ try:
 
 
 
 
 
 
 
 
103
  metrics = self.analytics.calculate_study_metrics(user_id)
104
+ response = "\ud83d\udd27 Resumo do desempenho:\n"
105
+ response += f"Total de horas estudadas: {metrics['total_horas']}\n"
106
+ response += f"Dias consecutivos de estudo: {metrics['dias_consecutivos']}\n"
107
+ for area, score in metrics['desempenho_por_area'].items():
108
+ response += f"{area}: {score:.2f}%\n"
109
+ return response
110
+ except Exception as e:
111
+ logger.error(f"Erro ao gerar resumo: {e}")
112
+ return "Erro ao gerar resumo."
113
 
114
+ def help_command(self, message: str, user_id: str) -> str:
115
+ return "\ud83d\udd27 Lista de comandos disponíveis: /start, /plano, /progresso, /questoes, /estudo, /dica, /motiva, /resumo, /ajuda."
116
 
117
+ class MotivationalCoach:
118
+ def __init__(self):
119
+ self.frases_motivacionais = [
120
+ "\ud83c\udf1f Cada hora de estudo te aproxima mais do seu objetivo!",
121
+ "\ud83d\udcaa Você está construindo seu futuro a cada dia!",
122
+ "\ud83c\udfaf Mantenha o foco! O Revalida é só uma etapa da sua jornada de sucesso!",
123
+ "\u2b50 Sua dedicação é inspiradora! Continue assim!",
124
+ "\ud83c\udf08 Acredite no seu potencial! Você está no caminho certo!",
125
+ "\ud83d\udcda Conhecimento é poder, e você está ficando mais forte a cada dia!",
126
+ ]
127
+ self.dicas_estudo = [
128
+ "\ud83d\udccc Faça pequenas pausas a cada 45 minutos de estudo",
129
+ "\ud83d\udca1 Revise o conteúdo do dia antes de dormir",
130
+ "\ud83c\udfaf Estabeleça metas diárias pequenas e alcançáveis",
131
+ ]
132
 
133
+ def get_motivational_message(self) -> str:
134
+ return random.choice(self.frases_motivacionais)
 
 
 
 
135
 
136
+ def get_study_tip(self) -> str:
137
+ return random.choice(self.dicas_estudo)
 
 
138
 
139
+ class StudyAnalytics:
140
+ def __init__(self, db_connection):
141
+ self.conn = db_connection
142
 
143
+ def calculate_study_metrics(self, user_id: str) -> Dict:
144
+ cursor = self.conn.cursor()
145
  try:
146
+ cursor.execute('''
147
+ SELECT SUM(horas_estudadas) FROM study_progress WHERE user_id = ?
148
+ ''', (user_id,))
149
+ total_horas = cursor.fetchone()[0] or 0
 
 
 
 
 
 
 
 
150
 
151
+ cursor.execute('''
152
+ SELECT topic, AVG(performance_score) FROM study_progress
153
+ WHERE user_id = ? GROUP BY topic
154
+ ''', (user_id,))
155
+ desempenho_por_area = dict(cursor.fetchall())
156
 
157
+ cursor.execute('''
158
+ SELECT date FROM study_progress WHERE user_id = ? ORDER BY date DESC
159
+ ''', (user_id,))
160
+ datas = [row[0] for row in cursor.fetchall()]
161
+ dias_consecutivos = self.calculate_streak(datas)
162
 
163
+ cursor.execute('''
164
+ SELECT COUNT(DISTINCT date) as dias_estudo FROM study_progress
165
+ WHERE user_id = ?
166
+ ''', (user_id,))
167
+ dias_estudo = cursor.fetchone()[0] or 0
168
+
169
+ return {
170
+ "total_horas": total_horas,
171
+ "desempenho_por_area": desempenho_por_area,
172
+ "dias_consecutivos": dias_consecutivos,
173
+ "dias_estudo": dias_estudo
174
+ }
175
+ except sqlite3.Error as e:
176
+ logger.error(f"Erro ao calcular métricas de estudo: {e}")
177
+ return {}
178
 
179
+ @staticmethod
180
+ def calculate_streak(dates: List[str]) -> int:
181
+ if not dates:
182
+ return 0
183
+ dates = [datetime.strptime(d, '%Y-%m-%d').date() for d in dates]
184
+ dates.sort(reverse=True)
185
+ streak = 1
186
+ for i in range(len(dates)-1):
187
+ if (dates[i] - dates[i+1]).days == 1:
188
+ streak += 1
189
+ else:
190
+ break
191
+ return streak
192
 
193
+ class StudyMaterialGenerator:
194
+ def __init__(self, db_connection):
195
+ self.db_connection = db_connection
196
 
197
+ def gerar_material(self, tema: str) -> str:
198
+ try:
199
+ cursor = self.db_connection.cursor()
200
+ query = "SELECT conteudo FROM materiais WHERE tema = ?"
201
+ cursor.execute(query, (tema,))
202
+ resultado = cursor.fetchone()
203
+ return resultado[0] if resultado else "Nenhum material encontrado para o tema especificado."
204
+ except sqlite3.Error as e:
205
+ logger.error(f"Erro ao gerar material: {e}")
206
+ return "Erro ao buscar material."
207
 
208
  def create_interface():
 
209
  bot = CRMJABot()
210
+
211
  with gr.Blocks(title="crmjaBot - Assistente Revalida") as interface:
212
+ gr.Markdown("# \ud83c\udfe5 crmjaBot")
213
  gr.Markdown("### Seu mentor personalizado para o Revalida")
214
+
215
  with gr.Row():
216
  with gr.Column():
217
  user_id = gr.Textbox(
218
  label="Seu ID (email ou telefone)",
219
  placeholder="Digite seu ID único..."
220
  )
221
+
222
  chatbot = gr.Chatbot()
223
  msg = gr.Textbox(
224
  placeholder="Digite sua mensagem ou comando aqui...",
 
237
 
238
  if __name__ == "__main__":
239
  interface = create_interface()
240
+ interface.launch()