import gradio as gr from transformers import pipeline import sqlite3 from datetime import datetime, timedelta import random from typing import Dict, List from performance_system import PerformanceAnalyzer from simulado_system import SimuladoSystem, CasoClinicoSystem from database.db_manager import DatabaseManager from database.db_operations import adicionar_lote_questoes from study_generators import StudyPlanGenerator import logging from twilio.rest import Client # Configuração de logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) # Configuração Twilio para notificações via WhatsApp TWILIO_ACCOUNT_SID = 'your_account_sid' TWILIO_AUTH_TOKEN = 'your_auth_token' TWILIO_WHATSAPP_NUMBER = 'whatsapp:+14155238886' client = Client(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN) def send_whatsapp_message(to_number: str, message: str): try: client.messages.create( body=message, from_=TWILIO_WHATSAPP_NUMBER, to=f'whatsapp:{to_number}' ) logger.info(f"Mensagem enviada para {to_number}") except Exception as e: logger.error(f"Erro ao enviar mensagem pelo WhatsApp: {e}") class CRMJABot: def __init__(self): logger.info("Iniciando CRMJABot...") self.db = DatabaseManager() self.material_generator = StudyMaterialGenerator(self.db.get_connection()) self.planner = StudyPlanGenerator(self.db) self.coach = MotivationalCoach() self.analytics = StudyAnalytics(self.db.get_connection()) self.commands = { "/start": self.start_command, "/plano": self.create_plan, "/progresso": self.check_progress, "/questoes": self.previous_questions, "/estudo": self.study_mode, "/dica": self.get_tip, "/motiva": self.get_motivation, "/resumo": self.get_summary, "/ajuda": self.help_command, } try: with open('data/questoes_revalida.json', 'r', encoding='utf-8') as f: questoes = json.load(f) sucesso, mensagem = adicionar_lote_questoes(self.db, questoes) if sucesso: logger.info("Questões adicionadas com sucesso!") else: logger.error(f"Erro ao adicionar questões: {mensagem}") except Exception as e: logger.error(f"Erro na inicialização do banco de questões: {e}") def process_message(self, message: str, user_id: str, history: List) -> str: command = message.split()[0] if command in self.commands: return self.commands[command](message, user_id) return "Comando não reconhecido. Use /ajuda para ver os comandos disponíveis." def start_command(self, message: str, user_id: str) -> str: return "\ud83c\udf1f Bem-vindo ao crmjaBot! Use /ajuda para ver os comandos disponíveis." def create_plan(self, message: str, user_id: str) -> str: try: parts = message.split() if len(parts) < 3: return "Erro: Informe horas diárias, data-alvo e áreas de estudo." horas = int(parts[1]) data_alvo = parts[2] areas = parts[3].split(",") if len(parts) > 3 else [] plano = self.planner.create_study_plan(user_id, horas, data_alvo, areas) self.schedule_study_notifications(user_id, horas, data_alvo) return f"Plano criado: {plano}" except Exception as e: logger.error(f"Erro ao criar plano: {e}") return "Erro ao criar plano." def schedule_study_notifications(self, user_id: str, horas: int, data_alvo: str): try: # Envia notificações diárias para acompanhar os estudos to_number = self.db.get_user_phone(user_id) # Método fictício para obter o número do usuário message = f"Lembrete: Estude {horas} horas hoje para atingir sua meta até {data_alvo}!" send_whatsapp_message(to_number, message) except Exception as e: logger.error(f"Erro ao agendar notificações: {e}") def check_progress(self, message: str, user_id: str) -> str: try: metrics = self.analytics.calculate_study_metrics(user_id) response = f"\ud83d\udd04 Seu progresso:\n" response += f"Total de horas estudadas: {metrics['total_horas']}\n" response += f"Dias consecutivos de estudo: {metrics['dias_consecutivos']}\n" for area, score in metrics['desempenho_por_area'].items(): response += f"{area}: {score:.2f}%\n" return response except Exception as e: logger.error(f"Erro ao verificar progresso: {e}") return "Erro ao verificar progresso." def previous_questions(self, message: str, user_id: str) -> str: return "Função de perguntas anteriores ainda não implementada." def study_mode(self, message: str, user_id: str) -> str: return "Função de modo de estudo ainda não implementada." def get_tip(self, message: str, user_id: str) -> str: return self.coach.get_study_tip() def get_motivation(self, message: str, user_id: str) -> str: return self.coach.get_motivational_message() def get_summary(self, message: str, user_id: str) -> str: try: metrics = self.analytics.calculate_study_metrics(user_id) response = "\ud83d\udd27 Resumo do desempenho:\n" response += f"Total de horas estudadas: {metrics['total_horas']}\n" response += f"Dias consecutivos de estudo: {metrics['dias_consecutivos']}\n" for area, score in metrics['desempenho_por_area'].items(): response += f"{area}: {score:.2f}%\n" return response except Exception as e: logger.error(f"Erro ao gerar resumo: {e}") return "Erro ao gerar resumo." def help_command(self, message: str, user_id: str) -> str: return "\ud83d\udd27 Lista de comandos disponíveis: /start, /plano, /progresso, /questoes, /estudo, /dica, /motiva, /resumo, /ajuda." class MotivationalCoach: def __init__(self): self.frases_motivacionais = [ "\ud83c\udf1f Cada hora de estudo te aproxima mais do seu objetivo!", "\ud83d\udcaa Você está construindo seu futuro a cada dia!", "\ud83c\udfaf Mantenha o foco! O Revalida é só uma etapa da sua jornada de sucesso!", "\u2b50 Sua dedicação é inspiradora! Continue assim!", "\ud83c\udf08 Acredite no seu potencial! Você está no caminho certo!", "\ud83d\udcda Conhecimento é poder, e você está ficando mais forte a cada dia!", ] self.dicas_estudo = [ "\ud83d\udccc Faça pequenas pausas a cada 45 minutos de estudo", "\ud83d\udca1 Revise o conteúdo do dia antes de dormir", "\ud83c\udfaf Estabeleça metas diárias pequenas e alcançáveis", ] def get_motivational_message(self) -> str: return random.choice(self.frases_motivacionais) def get_study_tip(self) -> str: return random.choice(self.dicas_estudo) class StudyAnalytics: def __init__(self, db_connection): self.conn = db_connection def calculate_study_metrics(self, user_id: str) -> Dict: cursor = self.conn.cursor() try: cursor.execute(''' SELECT SUM(horas_estudadas) FROM study_progress WHERE user_id = ? ''', (user_id,)) total_horas = cursor.fetchone()[0] or 0 cursor.execute(''' SELECT topic, AVG(performance_score) FROM study_progress WHERE user_id = ? GROUP BY topic ''', (user_id,)) desempenho_por_area = dict(cursor.fetchall()) cursor.execute(''' SELECT date FROM study_progress WHERE user_id = ? ORDER BY date DESC ''', (user_id,)) datas = [row[0] for row in cursor.fetchall()] dias_consecutivos = self.calculate_streak(datas) cursor.execute(''' SELECT COUNT(DISTINCT date) as dias_estudo FROM study_progress WHERE user_id = ? ''', (user_id,)) dias_estudo = cursor.fetchone()[0] or 0 return { "total_horas": total_horas, "desempenho_por_area": desempenho_por_area, "dias_consecutivos": dias_consecutivos, "dias_estudo": dias_estudo } except sqlite3.Error as e: logger.error(f"Erro ao calcular métricas de estudo: {e}") return {} @staticmethod def calculate_streak(dates: List[str]) -> int: if not dates: return 0 dates = [datetime.strptime(d, '%Y-%m-%d').date() for d in dates] dates.sort(reverse=True) streak = 1 for i in range(len(dates)-1): if (dates[i] - dates[i+1]).days == 1: streak += 1 else: break return streak class StudyMaterialGenerator: def __init__(self, db_connection): self.db_connection = db_connection def gerar_material(self, tema: str) -> str: try: cursor = self.db_connection.cursor() query = "SELECT conteudo FROM materiais WHERE tema = ?" cursor.execute(query, (tema,)) resultado = cursor.fetchone() return resultado[0] if resultado else "Nenhum material encontrado para o tema especificado." except sqlite3.Error as e: logger.error(f"Erro ao gerar material: {e}") return "Erro ao buscar material." def create_interface(): bot = CRMJABot() with gr.Blocks(title="crmjaBot - Assistente Revalida") as interface: gr.Markdown("# \ud83c\udfe5 crmjaBot") gr.Markdown("### Seu mentor personalizado para o Revalida") with gr.Row(): with gr.Column(): user_id = gr.Textbox( label="Seu ID (email ou telefone)", placeholder="Digite seu ID único..." ) chatbot = gr.Chatbot() msg = gr.Textbox( placeholder="Digite sua mensagem ou comando aqui...", show_label=False ) clear = gr.ClearButton([msg, chatbot]) def respond(message, history): bot_message = bot.process_message(message, user_id.value or "default_user", history) history.append((message, bot_message)) return "", history msg.submit(respond, [msg, chatbot], [msg, chatbot]) return interface if __name__ == "__main__": interface = create_interface() interface.launch()