Necesito ayuda para limitar las publicaciones de los usuarios por categoría y período de tiempo

Hola a todos,

Estoy buscando orientación sobre cómo lograr una funcionalidad específica en Discourse. Estoy administrando una comunidad donde necesito implementar una regla que impida a los usuarios crear un nuevo tema en dos categorías específicas si ya han publicado en alguna de esas categorías en los últimos 14 días. Esta restricción debería aplicarse incluso si su publicación anterior fue eliminada.

Después de investigar un poco, me encontré con el plugin discourse-flexible-rate-limits, que parece ser un buen punto de partida. Permite límites de frecuencia flexibles basados en grupos de usuarios y acciones, pero parece centrarse en la frecuencia a corto plazo (minutos, horas, días) y no admite directamente:

  1. Comprobar publicaciones en múltiples categorías.
  2. Aplicar un período de tiempo de hasta 14 días.
  3. Incluir temas eliminados en la comprobación.

Antes de sumergirme en la personalización de este plugin o en la creación de algo desde cero, quería preguntar:

  • ¿Alguien conoce algún plugin o método existente que ya maneje este tipo de funcionalidad?
  • ¿Existen enfoques recomendados para modificar un plugin existente como discourse-flexible-rate-limits para incluir una restricción inter-categoría y a más largo plazo?
  • ¿Algún consejo general sobre cómo implementar esto de manera efectiva?

Agradecería cualquier información o sugerencia de esta increíble comunidad. Si hay interés, también estaré encantado de compartir actualizaciones sobre cómo termino implementando esto.

¡Muchas gracias de antemano por su ayuda!

No estoy seguro de entenderlo completamente, pero creo que quieres un plugin que elimine a un usuario de un grupo cuando publique en un conjunto de categorías (usando un hook de creación de temas) y luego ejecute un trabajo diario para agregarlo de nuevo al grupo después de un número de días desde su último tema en ese conjunto de categorías.

Probablemente 3-5 horas de trabajo, quizás un poco más con buenas especificaciones/pruebas.

2 Me gusta

Hola, @pfaffman, ¡felices fiestas y gracias por responder!

Intenté crear un diagrama de flujo para que quede claro:

flowchart TB
    A0(El usuario intenta crear un nuevo tema en la Categoría A o B) --> A1{¿Está el usuario en un grupo exento<br>Administrador, Moderador, TL3, TL4, Suscriptores?}
    A1 -- No --> B1(Verificar el último tema del usuario en las Categorías A, B o C,<br>incluyendo registros ocultos o eliminados)
    A1 -- Sí --> Z1(Permitir publicación)

    B1 --> B2{¿Se creó ese último tema<br>dentro de los 14 días?}
    B2 -- Sí --> C1(Bloquear publicación + mostrar error,<br>mostrar tiempo de espera,<br>enlace a las reglas)
    C1 --> E1(Guardar borrador +<br>deshabilitar botón de enviar) --> Fin(Fin)
    B2 -- No --> D1(Permitir publicación)

    D1 --> Fin(Fin)
    Z1 --> Fin(Fin)
Y también intenté crear una especificación simple para ayudar a aclarar
```mermaid
flowchart TB
    A0(El usuario intenta crear un nuevo tema en la Categoría A o B) --> A1{¿Está el usuario en un grupo exento<br>Administrador, Moderador, TL3, TL4, Suscriptores?}
    A1 -- No --> B1(Verificar el último tema del usuario en las Categorías A, B o C,<br>incluyendo registros ocultos o eliminados)
    A1 -- Sí --> Z1(Permitir publicación)

    B1 --> B2{¿Se creó ese último tema<br>dentro de los 14 días?}
    B2 -- Sí --> C1(Bloquear publicación + mostrar error,<br>mostrar tiempo de espera,<br>enlace a las reglas)
    C1 --> E1(Guardar borrador +<br>deshabilitar botón de enviar) --> Fin(Fin)
    B2 -- No --> D1(Permitir publicación)

    D1 --> Fin(Fin)
    Z1 --> Fin(Fin)

Explicación del Flujo

  1. A0: Un usuario intenta crear un nuevo tema en la Categoría A o B.

  2. A1: El sistema verifica si el usuario pertenece a algún grupo exento:

    • Administradores
    • Moderadores
    • Nivel de Confianza 3 (TL3)
    • Nivel de Confianza 4 (TL4)
    • Un grupo personalizado de “Suscriptores”
    • Si , omite la verificación del tiempo de espera y permite la publicación inmediatamente (Z1).
    • Si No, procede a B1.
  3. B1: El sistema recupera el último tema creado por el usuario en las Categorías A, B o C. Esta búsqueda debe incluir:

    • Temas eliminados suavemente (no eliminados permanentemente de la base de datos).
    • Temas movidos a categorías ocultas o de cumplimiento (por ejemplo, Categoría C).
  4. B2: El sistema verifica si la fecha de creación de ese último tema está dentro de los últimos 14 días.

    • → Continúa a C1 (la publicación se bloquea).
    • No → Procede a D1 (permite la publicación).
  5. C1: El sistema muestra un mensaje de error informando al usuario que todavía está en tiempo de espera. El mensaje debe incluir:

    • Una declaración simplificada de que aún no puede publicar.
    • El tiempo restante en días y horas (sin minutos).
    • Un enlace a la página de reglas de la comunidad (proporcionado a continuación).
  6. E1: Después de mostrar el error, el contenido del usuario se guarda automáticamente como borrador y el botón “Enviar” o “Crear Tema” se deshabilita.

  7. D1: Si han pasado más de 14 días desde el último tema del usuario, el sistema permite publicar el nuevo tema.

  8. Z1: El usuario pertenece a un grupo exento, por lo que puede publicar sin restricciones.

2. Especificación Detallada

2.1 Grupos Restringidos vs. Grupos Exentos

  • Grupos Restringidos:
    • Cualquier usuario no perteneciente a los siguientes grupos exentos (comúnmente TL0, TL1, TL2).
  • Grupos Exentos:
    1. Administradores
    2. Moderadores
    3. Nivel de Confianza 3 (TL3)
    4. Nivel de Confianza 4 (TL4)
    5. Suscriptores (un grupo personalizado)

Estos grupos exentos omiten la verificación de 14 días por completo.

2.2 Categorías Incluidas

  • Intento de Nuevo Tema:
    • Se activa cuando un usuario (en un grupo restringido) intenta crear un nuevo tema en la Categoría A o B.
  • Verificación del Último Tema:
    • El sistema verifica el último tema creado por el usuario en las Categorías A, B o C (donde C es la categoría “oculta” o de “cumplimiento”).

Nota: La Categoría C se incluye para capturar situaciones en las que el tema de un usuario se mueve para su eliminación/ocultación/cumplimiento. Si el usuario creó un tema en la Categoría C dentro de los últimos 14 días, también cuenta para el tiempo de espera.

2.3 Lógica de Tiempo de Espera de 14 Días

  • Si el tema más reciente del usuario (en A/B/C) se creó dentro de los 14 días, bloquea la creación de nuevos temas en A o B.
  • Si han pasado más de 14 días, permítelo.

Cálculo del Tiempo

  • Muestra el tiempo restante en días y horas (por ejemplo, “faltan 3 días y 12 horas”).
  • No es necesario mostrar minutos o segundos.

2.4 Bloqueo y Guardado de Borradores

  • Comportamiento de Bloqueo:

    • Cuando el usuario es bloqueado, muestra un mensaje de error (C1).
    • El sistema guarda automáticamente el contenido del usuario como un borrador.
    • El botón “Enviar” se deshabilita para que el usuario no pueda continuar.
  • Mensaje de Error de Ejemplo (simplificado):

    Lo sentimos, aún no puedes crear un nuevo tema en esta categoría.
    Tu último tema se publicó hace menos de 14 días,
    y te quedan {X días y Y horas} antes de que puedas volver a publicar.
    Para más detalles, consulta las reglas de nuestra comunidad:
    https://community.lezismore.org/t/topic/26/2

2.5 Flexibilidad Futura

  1. Categorías Adicionales:
    • Actualmente solo están configuradas A, B y C.
    • Si necesitas agregar o eliminar categorías de este tiempo de espera en el futuro, asegúrate de que el sistema o plugin pueda extenderse sin cambios importantes en el código.
  2. Períodos de Tiempo Diferentes:
    • El período de 14 días podría ser configurable en la configuración del plugin (en caso de que desees 7 días, 30 días, etc.).
  3. Asignaciones Dinámicas de Grupos:
    • Grupos exentos adicionales o menos (por ejemplo, si agregas “Suscriptores” o lo eliminas) deberían ser compatibles.

3. Resumen

  1. Los Grupos Restringidos (TL0, TL1, TL2, o cualquier usuario que no pertenezca a un grupo exento) están sujetos a un tiempo de espera de 14 días antes de crear otro tema en las Categorías A o B.
  2. Los Grupos Exentos (Admin, Moderador, TL3, TL4, “Suscriptores”) pueden publicar sin restricciones.
  3. El sistema verifica la creación del tema más reciente en las Categorías A, B o C (incluyendo eliminados suavemente u ocultos). Si se creó dentro de los 14 días, el nuevo tema se bloquea.
  4. Mensaje de Error: Muestra el tiempo restante en días/horas y enlaza a las reglas de la comunidad en:
  5. Borrador: Cuando se bloquea, la publicación del usuario se guarda como borrador y el botón de enviar se deshabilita.
  6. Esta especificación puede extenderse a categorías adicionales o plazos diferentes en el futuro.

¡Agradecería cualquier sugerencia!

1 me gusta

Eso es más o menos lo que estaba pensando. Mi solución es eliminarlos del grupo que permite publicar en esas categorías cuando publican. Eso deja claro de inmediato que no pueden publicar y no requiere ningún cambio de código especial en el funcionamiento de las publicaciones.

3 Me gusta

Ahora entiendo tu solución. :folded_hands: Si bien ese enfoque puede parecer sencillo, me preocupa lo siguiente:

  1. Acceso de lectura frente a publicación

    • Actualmente, los usuarios en TL1 (o superior) pueden tanto leer como publicar en las Categorías A y B.
    • Si eliminamos al usuario de TL1 cada vez que infringe la regla de los 14 días, también perderá el acceso de lectura. Pero solo queremos bloquearlos de publicar, no de leer.
  2. Necesidad de dividir grupos

    • Para resolver el escenario de “leer pero no poder publicar”, tendríamos que crear varios subgrupos:
    • TL1 limitado: puede leer y responder, pero no puede crear temas en A o B.
    • TL1 completo: puede leer, responder y crear temas.
    • Si un usuario infringe la regla de los 14 días, lo moveríamos de TL1 completo a TL1 limitado. Esto parece más complicado.
  3. Complejidad de la automatización

    • Incluso con grupos separados, tendríamos que mover automáticamente al usuario de vuelta al grupo “completo” una vez que expire su período de enfriamiento.
    • Esto significa que debemos implementar lógica (por ejemplo, un trabajo programado o código personalizado) que calcule cuándo termina el período de 14 días y luego reasigne al usuario de TL1 limitado de nuevo a TL1 completo.
    • Como no programador, no me siento seguro manejando una automatización tan compleja por mi cuenta.

En otras palabras, si bien eliminar a los usuarios de ciertos grupos podría evitar modificar la lógica de publicación directamente, crea grupos adicionales y reglas complejas. Solo queremos restringir la publicación durante 14 días, no el acceso de lectura u otros privilegios.

Muchas gracias por cualquier sugerencia o idea. He intentado integrar cosas a través de las API de Discourse y webhooks en n8n, pero dada mi limitada experiencia en codificación, ha sido bastante desafiante para mí.