up
This commit is contained in:
@@ -127,7 +127,8 @@ class OptimizedWebhook {
|
||||
|
||||
foreach ($entry['changes'] as $change) {
|
||||
if (isset($change['value']['messages'])) {
|
||||
$this->queueMessages($change['value']['messages']);
|
||||
$contacts = $change['value']['contacts'] ?? [];
|
||||
$this->queueMessages($change['value']['messages'], $contacts);
|
||||
}
|
||||
|
||||
if (isset($change['value']['statuses'])) {
|
||||
@@ -156,7 +157,17 @@ class OptimizedWebhook {
|
||||
/**
|
||||
* Encolar mensajes para procesamiento asíncrono
|
||||
*/
|
||||
private function queueMessages($messages) {
|
||||
private function queueMessages($messages, $contacts = []) {
|
||||
// Extraer nombres de contactos del payload
|
||||
$contactNames = [];
|
||||
foreach ($contacts as $contact) {
|
||||
$waId = $contact['wa_id'] ?? null;
|
||||
$name = $contact['profile']['name'] ?? null;
|
||||
if ($waId && $name) {
|
||||
$contactNames[$waId] = $name;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($messages as $message) {
|
||||
try {
|
||||
$messageId = $message['id'] ?? null;
|
||||
@@ -178,9 +189,29 @@ class OptimizedWebhook {
|
||||
|
||||
// Obtener o crear usuario (rápido, solo DB lookup)
|
||||
$user = $this->getUserByPhone($phoneNumber);
|
||||
$contactName = $contactNames[$phoneNumber] ?? null;
|
||||
if (!$user) {
|
||||
$userId = $this->createUser($phoneNumber);
|
||||
$user = $this->getUserById($userId);
|
||||
// Guardar nombre del contacto de WhatsApp
|
||||
if ($contactName && $userId) {
|
||||
try {
|
||||
$this->db->update('users', ['name' => $contactName], 'id = ? AND (name IS NULL OR name = ? OR name = ?)', [$userId, '', $phoneNumber]);
|
||||
$user['name'] = $contactName;
|
||||
} catch (Exception $e) {
|
||||
$this->logger->warning('Error guardando nombre contacto: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Actualizar nombre si no tiene uno real (solo tiene el teléfono o vacío)
|
||||
if ($contactName && (empty($user['name']) || $user['name'] === $phoneNumber)) {
|
||||
try {
|
||||
$this->db->update('users', ['name' => $contactName], 'id = ? AND (name IS NULL OR name = ? OR name = ?)', [$user['id'], '', $phoneNumber]);
|
||||
$user['name'] = $contactName;
|
||||
} catch (Exception $e) {
|
||||
$this->logger->warning('Error actualizando nombre contacto: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Extraer tipo y contenido del mensaje
|
||||
@@ -249,7 +280,8 @@ class OptimizedWebhook {
|
||||
|
||||
case 'image':
|
||||
$text = $message['image']['caption'] ?? '';
|
||||
$mediaUrl = $message['image']['url'] ?? $message['image']['id'] ?? null;
|
||||
// Preferir media ID (estable) sobre URL (expira en minutos)
|
||||
$mediaUrl = $message['image']['id'] ?? $message['image']['url'] ?? null;
|
||||
|
||||
// Encolar descarga de media
|
||||
if ($mediaUrl) {
|
||||
@@ -259,7 +291,7 @@ class OptimizedWebhook {
|
||||
|
||||
case 'video':
|
||||
$text = $message['video']['caption'] ?? '';
|
||||
$mediaUrl = $message['video']['url'] ?? $message['video']['id'] ?? null;
|
||||
$mediaUrl = $message['video']['id'] ?? $message['video']['url'] ?? null;
|
||||
|
||||
if ($mediaUrl) {
|
||||
$this->queueMediaDownload($mediaUrl, $message['id'], 'video');
|
||||
@@ -267,7 +299,7 @@ class OptimizedWebhook {
|
||||
break;
|
||||
|
||||
case 'audio':
|
||||
$mediaUrl = $message['audio']['url'] ?? $message['audio']['id'] ?? null;
|
||||
$mediaUrl = $message['audio']['id'] ?? $message['audio']['url'] ?? null;
|
||||
|
||||
if ($mediaUrl) {
|
||||
$this->queueMediaDownload($mediaUrl, $message['id'], 'audio');
|
||||
@@ -276,7 +308,7 @@ class OptimizedWebhook {
|
||||
|
||||
case 'document':
|
||||
$text = $message['document']['filename'] ?? '';
|
||||
$mediaUrl = $message['document']['url'] ?? $message['document']['id'] ?? null;
|
||||
$mediaUrl = $message['document']['id'] ?? $message['document']['url'] ?? null;
|
||||
|
||||
if ($mediaUrl) {
|
||||
$this->queueMediaDownload($mediaUrl, $message['id'], 'document');
|
||||
|
||||
Reference in New Issue
Block a user