Usando IA para criar envoltório de conteúdo Hide em bbcode

Usando um wrapper BBCode genérico, crie um componente de tema que oculta o conteúdo se não estiver em uma variável de string de grupo

Mostrar rascunhos

Criando um Wrapper BBCode Genérico e um Componente de Tema
Entendendo os Requisitos
Com base em sua solicitação, criaremos:
Um wrapper BBCode genérico que pode aceitar atributos personalizados.
Um componente de tema que oculta o conteúdo com base em uma variável de string de grupo passada para o wrapper BBCode.
Implementando o Wrapper BBCode
Criaremos um wrapper BBCode que pode aceitar atributos arbitrários. Esses atributos serão passados para o componente de tema para avaliação.

Ruby

# config/initializers/bbcode.rb
Discourse::Plugins::BBCode.add_parser(:hide_if_not_in_group) do |tag, content|
  attributes = tag.attributes || {}
  "<div class='hide-if-not-in-group' data-group-names='#{attributes[:groups]}'>#{content}</div>"
end

Use código com cautela.

Criando o Componente de Tema
O componente de tema verificará se o usuário atual pertence a algum dos grupos especificados no atributo data-group-names. Caso contrário, ele ocultará o conteúdo.

JavaScript

// app/assets/javascripts/discourse/components/hide-if-not-in-group.js
import Component from 'discourse/components/component';

export default Component.extend({
  tagName: 'div',
  classNames: ['hide-if-not-in-group'],

  didInsertElement() {
    const currentUserId = Discourse.currentUser.id;
    const groupNames = this.element.dataset.groupNames.split(',');

    // Função para verificar se o usuário está em algum dos grupos especificados
    const userIsInAnyGroup = (userId, groupNames) => {
      // Substitua isso pela sua lógica para verificar a associação do usuário a grupos
      // Por exemplo, usando a API do Discourse ou lógica personalizada
      return groupNames.some(groupName => {
        // Verifique se o usuário está no grupo chamado `groupName`
        // Retorne true se o usuário estiver no grupo, caso contrário, retorne false
      });
    };

    if (!userIsInAnyGroup(currentUserId, groupNames)) {
      this.element.style.display = 'none';
    }
  }
});

Use código com cautela.

Usando o BBCode
Você pode usar o BBCode assim:

[hide_if_not_in_group groups="staff,moderators"]
Este conteúdo é oculto para usuários que não são staff ou moderadores.
[/hide_if_not_in_group]

Considerações Importantes
Verificação de associação a grupos: Substitua a lógica de placeholder para verificar a associação a grupos do usuário por sua implementação real. Pode ser necessário usar a API do Discourse ou lógica personalizada para determinar a associação a grupos.
Desempenho: Para um grande número de usuários ou grupos, otimizar a verificação de associação a grupos pode ser necessário.
Segurança: Garanta a validação e sanitização adequadas dos nomes dos grupos para evitar vulnerabilidades de segurança.
Flexibilidade: Considere permitir atributos adicionais para o BBCode para controlar outros comportamentos (por exemplo, exibir uma mensagem em vez de ocultar o conteúdo).
Seguindo estas etapas, você terá um wrapper BBCode e um componente de tema flexíveis que podem ocultar conteúdo com base na associação a grupos.


Usando Gemini. Consegui obter os trechos de código acima. No entanto, estou tendo problemas para fazê-los funcionar.

Se alguém puder me guiar onde colocar em um componente personalizado com as seções para entrada e correção de código, se necessário.

O primeiro erro que apareceu quando coloquei o JavaScript em common foi um erro em "import" esperando um {

Erro Pic

2 curtidas

Que legal!

A ressalva, que você provavelmente sabe, é que o texto está disponível de várias maneiras, já que está apenas oculto com CSS. Uma delas é esta rota de postagem:

/posts/123/raw

2 curtidas

De fato. Havia um componente personalizado que alguém criou usando uma maneira mais complexa de remover conteúdo. Mas parece que está quebrado.

Se não me engano, ele remove o conteúdo do elemento cozido?

1 curtida

Aqui está o tópico onde um colega criou um componente, mas quando tentei, não funcionou e enviei uma mensagem privada para o DeV. Mas ele pode ter seguido em frente.

Desculpe. Acabei de ler que você não consegue fazer funcionar.

A coisa a fazer é usar o discourse_theme para gerar um novo tema vazio. Em seguida, procure outro componente de tema que tenha uma seção “estende componente”… Ah. Acho que não vai funcionar. Você precisará que seu código selecione e modifique o que já está no DOM. Na verdade, não tenho certeza se isso está certo, pois ainda sou muito ruim nisso.

Acho que você pode fazer isso apenas com CSS se usar aquele componente que adiciona a associação de grupo ao CSS.

Mas o markdown bruto está disponível na rota que mostrei em minha última postagem. Não vejo como, mesmo um plugin, pode torná-lo seguro de forma que seja impossível para as pessoas verem o texto oculto. Algo como notas do usuário pode resolver seu problema, ou se você realmente precisar que ele selecione posts, você pode usar notas do usuário como um modelo para fazer notas de postagem que adicionariam um campo personalizado de postagem que apenas a equipe poderia ver.

2 curtidas

Sim, você não pode resolver isso adequadamente sem alterar a API, o que significa que exigiria um plugin, não um componente de tema.

Se você não estiver usando sussurros em seu site para moderação, talvez possa usar aqueles que já vêm prontos?

2 curtidas

A aplicação para isso não seria focada em segurança.

Isso seria mais para aplicações leves. Em um tópico anterior, alguém estava procurando algo assim para RPG de mesa. Então, por exemplo, o Mestre do Jogo pode precisar acessar a ficha de personagem de um jogador. A ficha de personagem seria visível para o Jogador e para os mestres do jogo.

O componente “umbrella” que um colega fez parece bom. No entanto, parece quebrado quando o testei. Mas, é claro, acredito que mesmo esse poderia ser bastante fácil de comprometer. Se não me engano, como desabilitar o Java. Ou mesmo uma pessoa inteligente que conhece o modo de segurança do site. O modo de segurança pode ser restrito a Staff/Admin?

Qualquer componente, como são mods do lado do cliente, não é destinado a necessidades de segurança. Mesmo um script Tampermonkey pode ser usado por membros de forma semelhante ou igual a temas/componentes de tema.

Expandindo essa ideia ainda mais, você poderia, em teoria, obscurecer o conteúdo com base em Emblemas, etc.

1 curtida

sim. desabilitar isso fará com que somente a equipe possa usar o modo seguro.

image

2 curtidas