AI Online
🤖 Assistente Virtual
Online agora
👋 Olá
❓ Como funciona
🆘 Ajuda
${reply}
`
).join(”);
}
// AUTO-CONFIGURAÇÃO BASEADA NA URL
function autoConfigurePersonality() {
const url = window.location.href.toLowerCase();
if (url.includes(‘jobs’) || url.includes(‘trabalho’)) {
setPersonality(‘jobConsultant’);
} else if (url.includes(‘marriage’) || url.includes(‘relacionamento’)) {
setPersonality(‘relationshipCoach’);
} else if (url.includes(‘vip’) || url.includes(‘sorteio’)) {
setPersonality(‘communityManager’);
}
}
// INICIALIZAÇÃO AVANÇADA
document.addEventListener(‘DOMContentLoaded’, function() {
// Configurações existentes…
initializeChat();
setupEventListeners();
updateWelcomeTime();
// Novas configurações avançadas
autoConfigurePersonality();
FOLLOW_UP_SYSTEM.loadProfile();
requestNotificationPermission();
// Carregar personalidade salva
const savedPersonality = localStorage.getItem(‘chatbot_personality’);
if (savedPersonality) {
setPersonality(savedPersonality);
}
});
// SISTEMA DE ANALYTICS AVANÇADO
const ANALYTICS = {
sessionStart: Date.now(),
interactions: 0,
track: function(event, data = {}) {
this.interactions++;
const eventData = {
event: event,
timestamp: Date.now(),
sessionDuration: Date.now() – this.sessionStart,
interactions: this.interactions,
userAgent: navigator.userAgent,
url: window.location.href,
…data
};
// Enviar para Google Analytics
if (typeof gtag !== ‘undefined’) {
gtag(‘event’, event, {
custom_parameter_1: JSON.stringify(data),
value: this.interactions
});
}
// Enviar para seu backend
this.sendToBackend(eventData);
console.log(‘Analytics:’, eventData);
},
sendToBackend: async function(data) {
try {
await fetch(‘/api/chatbot-analytics’, {
method: ‘POST’,
headers: { ‘Content-Type’: ‘application/json’ },
body: JSON.stringify(data)
});
} catch (error) {
console.log(‘Analytics backend error:’, error);
}
}
};
// SISTEMA DE RATE LIMITING
const RATE_LIMITER = {
requests: [],
maxRequests: 10,
timeWindow: 60000, // 1 minuto
canMakeRequest: function() {
const now = Date.now();
this.requests = this.requests.filter(time => now – time < this.timeWindow);
if (this.requests.length >= this.maxRequests) {
return false;
}
this.requests.push(now);
return true;
},
getRemainingTime: function() {
if (this.requests.length === 0) return 0;
const oldestRequest = Math.min(…this.requests);
return Math.max(0, this.timeWindow – (Date.now() – oldestRequest));
}
};
// SISTEMA DE CACHE DE RESPOSTAS
const RESPONSE_CACHE = {
cache: new Map(),
maxSize: 100,
get: function(key) {
return this.cache.get(this.hashMessage(key));
},
set: function(key, value) {
const hashedKey = this.hashMessage(key);
if (this.cache.size >= this.maxSize) {
const firstKey = this.cache.keys().next().value;
this.cache.delete(firstKey);
}
this.cache.set(hashedKey, {
response: value,
timestamp: Date.now()
});
},
hashMessage: function(message) {
return message.toLowerCase().replace(/[^\w]/g, ”).substring(0, 50);
},
isValid: function(cachedItem) {
const maxAge = 300000; // 5 minutos
return Date.now() – cachedItem.timestamp < maxAge;
}
};
// FUNÇÃO PRINCIPAL MELHORADA
async function sendMessage() {
const message = chatInput.value.trim();
if (!message || isTyping) return;
// Rate limiting
if (!RATE_LIMITER.canMakeRequest()) {
const remainingTime = Math.ceil(RATE_LIMITER.getRemainingTime() / 1000);
addMessage(`Por favor, aguarde ${remainingTime} segundos antes de enviar outra mensagem. 😊`, 'bot');
return;
}
// Analytics
ANALYTICS.track('message_sent', { message_length: message.length });
// Detectar informações de contato
if (detectContactInfo(message)) {
ANALYTICS.track('contact_info_detected');
}
// Adicionar mensagem do usuário
addMessage(message, 'user');
chatInput.value = '';
chatInput.style.height = 'auto';
sendButton.disabled = true;
// Esconder quick replies após primeira mensagem
if (messageCount === 1) {
quickReplies.style.display = 'none';
}
// Verificar cache
const cachedResponse = RESPONSE_CACHE.get(message);
if (cachedResponse && RESPONSE_CACHE.isValid(cachedResponse)) {
addMessage(cachedResponse.response, 'bot');
ANALYTICS.track('response_from_cache');
return;
}
// Mostrar indicador de digitação
showTyping();
try {
// Usar sistema avançado de IA
const response = await sendToAIAdvanced(message);
// Cache da resposta
RESPONSE_CACHE.set(message, response);
hideTyping();
addMessage(response, 'bot');
ANALYTICS.track('ai_response_success');
} catch (error) {
hideTyping();
addMessage('Desculpe, ocorreu um erro. Tente novamente em alguns instantes. 😔', 'bot');
ANALYTICS.track('ai_response_error', { error: error.message });
console.error('Erro na IA:', error);
}
}
// SISTEMA DE BACKUP E RESTAURAÇÃO
const BACKUP_SYSTEM = {
save: function() {
const backupData = {
chatHistory: chatHistory,
userProfile: FOLLOW_UP_SYSTEM.userProfile,
messageCount: messageCount,
timestamp: Date.now()
};
localStorage.setItem('chatbot_backup', JSON.stringify(backupData));
},
restore: function() {
const backup = localStorage.getItem('chatbot_backup');
if (backup) {
const data = JSON.parse(backup);
// Restaurar apenas se for recente (menos de 1 hora)
if (Date.now() - data.timestamp < 3600000) {
chatHistory = data.chatHistory;
FOLLOW_UP_SYSTEM.userProfile = data.userProfile;
messageCount = data.messageCount;
this.rebuildChatUI();
return true;
}
}
return false;
},
rebuildChatUI: function() {
chatMessages.innerHTML = '';
chatHistory.forEach((msg, index) => {
if (msg.role !== ‘system’) {
const sender = msg.role === ‘user’ ? ‘user’ : ‘bot’;
const avatar = sender === ‘bot’ ? ‘🤖’ : ‘👤’;
const messageDiv = document.createElement(‘div’);
messageDiv.className = `message ${sender}`;
messageDiv.innerHTML = `
