Preciso de ajuda para limitar as postagens dos usuários por categoria e período de tempo

Olá a todos,

Estou procurando orientação sobre como alcançar uma funcionalidade específica no Discourse. Estou gerenciando uma comunidade onde preciso implementar uma regra que impeça os usuários de criar um novo tópico em duas categorias específicas se eles já postaram em qualquer uma dessas categorias nos últimos 14 dias. Essa restrição deve ser aplicada mesmo que o tópico anterior tenha sido excluído.

Após alguma pesquisa, encontrei o plugin discourse-flexible-rate-limits, que parece ser um bom ponto de partida. Ele permite limites de taxa flexíveis com base em grupos de usuários e ações, mas parece focar na frequência de curto prazo (minutos, horas, dias) e não suporta diretamente:

  1. Verificar postagens em várias categorias.
  2. Aplicar um período de tempo de até 14 dias.
  3. Incluir tópicos excluídos na verificação.

Antes de me aprofundar na personalização deste plugin ou na criação de algo do zero, eu queria perguntar:

  • Alguém conhece algum plugin ou método existente que já possa lidar com esse tipo de funcionalidade?
  • Existem abordagens recomendadas para modificar um plugin existente como o discourse-flexible-rate-limits para incluir uma restrição de longo prazo e entre categorias?
  • Algum conselho geral sobre como implementar isso de forma eficaz?

Agradeceria qualquer insight ou sugestão desta comunidade incrível. Se houver interesse, também ficarei feliz em compartilhar atualizações sobre como acabei implementando isso.

Muito obrigado desde já pela ajuda!

Não tenho certeza se entendi completamente, mas acho que você quer um plugin que remova um usuário de um grupo quando ele postar em um conjunto de categorias (usando um hook de criação de tópico) e, em seguida, execute um trabalho diário para adicioná-lo de volta ao grupo após um certo número de dias desde o último tópico dele nesse conjunto de categorias.

Provavelmente 3-5 horas de trabalho, talvez um pouco mais com boas especificações/testes.

2 curtidas

Olá, @pfaffman, boas festas e obrigado pela resposta!

Tentei criar um fluxograma para deixar mais claro:

flowchart TB
    A0(Usuário tenta criar um novo tópico na Categoria A ou B) -- --> A1{Usuário pertence a um grupo isento<br>Admin, Mod, TL3, TL4, Assinantes?}
    A1 -- Não --> B1(Verificar último tópico do usuário nas Categorias A, B ou C,<br>incluindo registros ocultos ou excluídos)
    A1 -- Sim --> Z1(Permitir postagem)

    B1 -- --> B2{Último tópico criado<br>há menos de 14 dias?}
    B2 -- Sim --> C1(Bloquear postagem + mostrar erro,<br>exibir cooldown,<br>link para regras)
    C1 -- --> E1(Salvar rascunho +<br>desabilitar botão de envio) ---> Fim(Fim)
    B2 -- Não --> D1(Permitir postagem)

    D1 -- --> Fim(Fim)
    Z1 -- --> Fim(Fim)
E também tentei criar uma especificação simples para ajudar a esclarecer
```mermaid
flowchart TB
    A0(Usuário tenta criar um novo tópico na Categoria A ou B) -- --> A1{Usuário pertence a um grupo isento<br>Admin, Mod, TL3, TL4, Assinantes?}
    A1 -- Não --> B1(Verificar último tópico do usuário nas Categorias A, B ou C,<br>incluindo registros ocultos ou excluídos)
    A1 -- Sim --> Z1(Permitir postagem)

    B1 -- --> B2{Último tópico criado<br>há menos de 14 dias?}
    B2 -- Sim --> C1(Bloquear postagem + mostrar erro,<br>exibir cooldown,<br>link para regras)
    C1 -- --> E1(Salvar rascunho +<br>desabilitar botão de envio) ---> Fim(Fim)
    B2 -- Não --> D1(Permitir postagem)

    D1 -- --> Fim(Fim)
    Z1 -- --> Fim(Fim)

Explicação do Fluxo

  1. A0: Um usuário tenta criar um novo tópico na Categoria A ou B.

  2. A1: O sistema verifica se o usuário pertence a algum grupo isento:

    • Administradores
    • Moderadores
    • Nível de Confiança 3 (TL3)
    • Nível de Confiança 4 (TL4)
    • Um grupo personalizado de “Assinantes”
    • Se Sim, pula a verificação de cooldown e permite a postagem imediatamente (Z1).
    • Se Não, prossegue para B1.
  3. B1: O sistema recupera o último tópico criado pelo usuário nas Categorias A, B ou C. Essa busca deve incluir:

    • Tópicos com exclusão lógica (não removidos permanentemente do banco de dados).
    • Tópicos movidos para categorias ocultas ou de conformidade (por exemplo, Categoria C).
  4. B2: O sistema verifica se a data de criação desse último tópico está dentro dos últimos 14 dias.

    • Sim → Continua para C1 (a postagem é bloqueada).
    • Não → Prossegue para D1 (permite a postagem).
  5. C1: O sistema exibe uma mensagem de erro informando ao usuário que ele ainda está em cooldown. A mensagem deve incluir:

    • Uma declaração simplificada de que ele ainda não pode postar.
    • O tempo restante em dias e horas (sem minutos).
    • Um link para a página de regras da comunidade (fornecida abaixo).
  6. E1: Após exibir o erro, o conteúdo do usuário é salvo automaticamente como rascunho, e o botão “Enviar” ou “Criar Tópico” é desabilitado.

  7. D1: Se mais de 14 dias se passaram desde o último tópico do usuário, o sistema permite que o novo tópico seja postado.

  8. Z1: O usuário pertence a um grupo isento, portanto, pode postar sem restrições.

2. Especificação Detalhada

2.1 Grupos Restritos vs. Isentos

  • Grupos Restritos:
    • Qualquer usuário não pertencente aos seguintes grupos isentos (comumente TL0, TL1, TL2).
  • Grupos Isentos:
    1. Administradores
    2. Moderadores
    3. Nível de Confiança 3 (TL3)
    4. Nível de Confiança 4 (TL4)
    5. Assinantes (um grupo personalizado)

Esses grupos isentos pulam a verificação de 14 dias completamente.

2.2 Categorias em Escopo

  • Tentativa de Novo Tópico:
    • Ativada quando um usuário (em um grupo restrito) tenta criar um novo tópico na Categoria A ou B.
  • Verificação do Último Tópico:
    • O sistema verifica o último tópico criado pelo usuário nas Categorias A, B ou C (onde C é a categoria “oculta” ou de “conformidade”).

Observação: A Categoria C é incluída para capturar situações em que o tópico de um usuário é movido para exclusão/ocultação/conformidade. Se o usuário criou um tópico na Categoria C nos últimos 14 dias, isso também conta para o cooldown.

2.3 Lógica de Cooldown de 14 Dias

  • Se o tópico mais recente do usuário (em A/B/C) foi criado dentro de 14 dias, bloqueia a criação de um novo tópico em A ou B.
  • Se mais de 14 dias se passaram, permite.

Cálculo de Tempo

  • Exibe o tempo restante em dias e horas (por exemplo, “3 dias e 12 horas restantes”).
  • Não é necessário mostrar minutos ou segundos.

2.4 Bloqueio e Salvamento de Rascunho

  • Comportamento de Bloqueio:
    • Quando o usuário é bloqueado, exibe uma mensagem de erro (C1).
    • O sistema salva automaticamente o conteúdo do usuário como um rascunho.
    • O botão “Enviar” fica desabilitado, para que o usuário não possa prosseguir.
  • Mensagem de Erro de Exemplo (simplificada):
Desculpe, você ainda não pode criar um novo tópico nesta categoria.
Seu último tópico foi postado há menos de 14 dias,
e faltam {X dias e Y horas} antes que você possa postar novamente.
Para mais detalhes, consulte nossas regras da comunidade:
https://community.lezismore.org/t/topic/26/2

2.5 Flexibilidade Futura

  1. Categorias Adicionais:

    • Atualmente, apenas A, B e C estão configuradas.
    • Se você precisar adicionar ou remover categorias desta regra de cooldown no futuro, certifique-se de que o sistema ou plugin possa ser estendido sem grandes alterações de código.
  2. Períodos de Tempo Diferentes:

    • O período de 14 dias pode ser configurável nas configurações do plugin (caso você queira 7 dias, 30 dias, etc.).
  3. Atribuições Dinâmicas de Grupo:

    • Grupos isentos adicionais ou menos (por exemplo, se você adicionar “Assinantes” ou removê-lo) devem ser suportados.

3. Resumo

  1. Grupos Restritos (TL0, TL1, TL2, ou qualquer usuário não em um grupo isento) estão sujeitos a um cooldown de 14 dias antes de criar outro tópico nas Categorias A ou B.
  2. Grupos Isentos (Admin, Moderador, TL3, TL4, “Assinantes”) podem postar sem restrições.
  3. O sistema verifica a criação do tópico mais recente nas Categorias A, B ou C (incluindo exclusões lógicas ou ocultas). Se foi criado dentro de 14 dias, o novo tópico é bloqueado.
  4. Mensagem de Erro: Exibe o tempo restante em dias/horas e links para as regras da comunidade em:
  5. Rascunho: Quando bloqueado, a postagem do usuário é salva como rascunho e o botão de envio é desabilitado.
  6. Esta especificação pode ser estendida para categorias adicionais ou prazos diferentes no futuro.

Agradeceria quaisquer sugestões!

1 curtida

É basicamente o que eu estava pensando. Minha solução é removê-los do grupo que permite postar nessas categorias quando eles postarem. Isso deixa claro imediatamente que eles não podem postar e não requer nenhuma alteração especial no código que muda a forma como a postagem funciona.

3 curtidas

Entendi sua solução agora. :folded_hands: Embora essa abordagem possa parecer direta, estou preocupado com o seguinte:

  1. Acesso de Leitura vs. Publicação

    • Atualmente, usuários no TL1 (ou superior) podem tanto ler quanto postar nas Categorias A e B.
    • Se removermos o usuário do TL1 sempre que ele violar a regra de 14 dias, ele perderá o acesso de leitura também. Mas queremos apenas bloqueá-lo de postar, não de ler.
  2. Necessidade de Dividir Grupos

    • Para resolver o cenário de “ler, mas não poder postar”, teríamos que criar vários subgrupos:
    • TL1 limitado – pode ler e responder, mas não pode criar tópicos em A ou B.
    • TL1 completo – pode ler, responder e criar tópicos.
    • Se um usuário violar a regra de 14 dias, nós o moveríamos de TL1 completo para TL1 limitado. Isso parece mais complicado.
  3. Complexidade da Automação

    • Mesmo com grupos separados, teríamos que mover automaticamente o usuário de volta para o grupo “completo” assim que o período de espera expirar.
    • Isso significa que devemos implementar lógica (por exemplo, um trabalho agendado ou código personalizado) que calcule quando o período de 14 dias termina e, em seguida, reatribua o usuário do TL1 limitado de volta para o TL1 completo.
    • Como não sou programador, não me sinto confiante em lidar com uma automação tão complexa sozinho.

Em outras palavras, embora remover usuários de certos grupos possa evitar a modificação direta da lógica de postagem, isso cria grupos adicionais e regras complexas. Queremos apenas restringir a postagem por 14 dias, não o acesso de leitura ou outros privilégios.

Muito obrigado por quaisquer sugestões ou ideias. Tentei integrar as coisas por meio das APIs do Discourse e webhooks no n8n, mas, dada a minha formação limitada em programação, tem sido bastante desafiador para mim.