Como personalizar / substituir o tópico guardião através de um plugin

Estou desenvolvendo um plugin que adicionará um valor booleano, baseado em alguma lógica personalizada, à tabela user_custom_fields para cada usuário que não tem permissão para criar um novo tópico.

user.custom_fields['can_create_topic'] = false;

O que eu quero fazer?
Quero ocultar o botão “+ Novo Tópico” para alguns usuários com base em lógica personalizada.

Pergunta
É possível personalizar o can_create_topic no guardian para que ele realize uma verificação adicional em um user_custom_field e determine se um usuário tem permissão para criar um novo tópico ou não?

Sim, claro que você pode modificar classes Ruby com plugins. É software, facilmente modificável, não é viagem interestelar usando velas solares ou buracos de minhoca, então, claro, é possível modificar o comportamento do Discourse com um plugin:

Não sei qual é o seu caso de uso, mas a maneira fácil e segura de fazer isso seria adicionar ou remover esses usuários de um grupo com permissão para criar tópicos.

@pfaffman Essa também é uma boa ideia. Mas acho que, se eu puder sobrescrever o método can_create_topic? na classe TopicGuardian, seria uma solução mais limpa. Existe algum plugin que eu possa consultar que tenha uma alteração semelhante?

O que eu não sei é como fazer minha subclasse TopicGuardian do plugin substituir o TopicGuardian na classe Guardian, já que ele está sendo misturado (mixed in) em vez de injetado como dependência.

Certo. Acho que encontrei a resposta. Só preciso implementar o método “can_create_topic?” no module ::TopicGuardian, e isso alterará automaticamente o comportamento do TopicGuardian, sem a necessidade de injetá-lo ou registrá-lo em algum lugar. Além disso, posso usar o método super dentro do meu método sobrescrito, para não ter que mantê-lo manualmente sincronizado com o método original caso ele seja alterado.

Obtive ajuda neste tópico: Overriding user_guardian.rb in a plugin (no fork necessary!)