175 lines
6.8 KiB
Python
175 lines
6.8 KiB
Python
"""Consumidor de eventos de Moderación desde RabbitMQ"""
|
|
import pika
|
|
import json
|
|
import logging
|
|
from datetime import datetime
|
|
from threading import Thread
|
|
from typing import Dict, Any
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class ModerationConsumer:
|
|
"""Consumidor de eventos de moderación desde RabbitMQ"""
|
|
|
|
def __init__(self, host: str = 'localhost', port: int = 5672):
|
|
self.host = host
|
|
self.port = port
|
|
self.queue_name = 'moderation_queue'
|
|
self.running = False
|
|
|
|
def start(self):
|
|
"""Inicia el consumidor en un thread separado"""
|
|
thread = Thread(target=self._consume, daemon=True)
|
|
thread.start()
|
|
logger.info("Moderation Consumer started")
|
|
|
|
def _consume(self):
|
|
"""Consume mensajes de RabbitMQ"""
|
|
try:
|
|
connection = pika.BlockingConnection(
|
|
pika.ConnectionParameters(host=self.host, port=self.port)
|
|
)
|
|
channel = connection.channel()
|
|
|
|
# Declarar cola
|
|
channel.queue_declare(queue=self.queue_name, durable=True)
|
|
|
|
# Configurar QoS
|
|
channel.basic_qos(prefetch_count=1)
|
|
|
|
# Configurar callback
|
|
channel.basic_consume(
|
|
queue=self.queue_name,
|
|
on_message_callback=self._process_message
|
|
)
|
|
|
|
logger.info(f"Moderation Consumer listening on {self.queue_name}")
|
|
self.running = True
|
|
channel.start_consuming()
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error in moderation consumer: {e}")
|
|
self.running = False
|
|
|
|
def _process_message(self, ch, method, properties, body):
|
|
"""Procesa un mensaje de moderación"""
|
|
try:
|
|
message = json.loads(body)
|
|
logger.info(f"Processing moderation event: {message.get('event_type')}")
|
|
|
|
event_type = message.get('event_type')
|
|
|
|
if event_type == 'moderation.delete_report':
|
|
self._handle_delete_report(message)
|
|
elif event_type == 'moderation.close_account':
|
|
self._handle_close_account(message)
|
|
elif event_type == 'moderation.ban_user':
|
|
self._handle_ban_user(message)
|
|
elif event_type == 'moderation.warn_user':
|
|
self._handle_warn_user(message)
|
|
elif event_type == 'moderation.review_content':
|
|
self._handle_review_content(message)
|
|
else:
|
|
logger.warning(f"Unknown moderation event type: {event_type}")
|
|
|
|
# Confirmar mensaje
|
|
ch.basic_ack(delivery_tag=method.delivery_tag)
|
|
|
|
except json.JSONDecodeError:
|
|
logger.error("Error decoding JSON message")
|
|
ch.basic_nack(delivery_tag=method.delivery_tag, requeue=False)
|
|
except Exception as e:
|
|
logger.error(f"Error processing moderation message: {e}")
|
|
ch.basic_nack(delivery_tag=method.delivery_tag, requeue=True)
|
|
|
|
def _handle_delete_report(self, message: Dict[str, Any]):
|
|
"""Maneja evento de eliminación de reporte"""
|
|
try:
|
|
action_id = message.get('action_id')
|
|
report_id = message.get('report_id')
|
|
reason = message.get('reason')
|
|
|
|
logger.info(f"Deleting report {report_id} (Action: {action_id})")
|
|
|
|
# Aquí implementarías la lógica para eliminar el reporte en la BD
|
|
# Por ahora solo registramos el evento
|
|
logger.info(f"Report {report_id} marked as deleted by moderator {message.get('moderator_id')}")
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error handling delete report: {e}")
|
|
raise
|
|
|
|
def _handle_close_account(self, message: Dict[str, Any]):
|
|
"""Maneja evento de cierre de cuenta"""
|
|
try:
|
|
action_id = message.get('action_id')
|
|
user_id = message.get('user_id')
|
|
is_permanent = message.get('is_permanent', True)
|
|
|
|
logger.info(f"Closing account for user {user_id} (Action: {action_id}, Permanent: {is_permanent})")
|
|
|
|
# Aquí implementarías la lógica para cerrar la cuenta en la BD
|
|
logger.info(f"Account for user {user_id} marked as closed")
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error handling close account: {e}")
|
|
raise
|
|
|
|
def _handle_ban_user(self, message: Dict[str, Any]):
|
|
"""Maneja evento de ban de usuario"""
|
|
try:
|
|
action_id = message.get('action_id')
|
|
user_id = message.get('user_id')
|
|
duration_days = message.get('duration_days')
|
|
is_permanent = message.get('is_permanent', False)
|
|
reason = message.get('reason')
|
|
|
|
logger.info(f"Banning user {user_id} (Action: {action_id}, Duration: {duration_days} days, Permanent: {is_permanent})")
|
|
|
|
# Aquí implementarías la lógica para banear al usuario
|
|
if is_permanent:
|
|
logger.info(f"User {user_id} permanently banned")
|
|
else:
|
|
logger.info(f"User {user_id} banned for {duration_days} days")
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error handling ban user: {e}")
|
|
raise
|
|
|
|
def _handle_warn_user(self, message: Dict[str, Any]):
|
|
"""Maneja evento de advertencia a usuario"""
|
|
try:
|
|
action_id = message.get('action_id')
|
|
user_id = message.get('user_id')
|
|
reason = message.get('reason')
|
|
|
|
logger.info(f"Warning user {user_id} (Action: {action_id}, Reason: {reason})")
|
|
|
|
# Aquí implementarías la lógica para registrar la advertencia
|
|
logger.info(f"Warning recorded for user {user_id}")
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error handling warn user: {e}")
|
|
raise
|
|
|
|
def _handle_review_content(self, message: Dict[str, Any]):
|
|
"""Maneja evento de revisión de contenido"""
|
|
try:
|
|
action_id = message.get('action_id')
|
|
report_id = message.get('report_id')
|
|
review_action = message.get('review_action') # approve, reject, needs_more_info
|
|
|
|
logger.info(f"Reviewing report {report_id} (Action: {action_id}, Decision: {review_action})")
|
|
|
|
# Aquí implementarías la lógica para procesar la revisión
|
|
logger.info(f"Report {report_id} review: {review_action}")
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error handling review content: {e}")
|
|
raise
|
|
|
|
|
|
# Crear instancia global
|
|
moderation_consumer = ModerationConsumer()
|