Usar IA para crear envoltorio de contenido oculto con BBCode

Usando un envoltorio genérico de bbcode, cree un componente de tema que oculte el contenido si no está en una cadena de grupo variable

Mostrar borradores

Creación de un envoltorio genérico de BBCode y un componente de tema
Comprender los requisitos
Según su solicitud, crearemos:
Un envoltorio genérico de BBCode que puede aceptar atributos personalizados.
Un componente de tema que oculta el contenido según una variable de cadena de grupo pasada al envoltorio de BBCode.
Implementación del envoltorio de BBCode
Crearemos un envoltorio de BBCode que pueda aceptar atributos arbitrarios. Estos atributos se pasarán al componente de tema para su evaluación.

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 el código con precaución.

Creación del componente de tema
El componente de tema verificará si el usuario actual pertenece a alguno de los grupos especificados en el atributo data-group-names. Si no es así, ocultará el contenido.

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(',');

    // Función para verificar si el usuario está en alguno de los grupos especificados
    const userIsInAnyGroup = (userId, groupNames) => {
      // Reemplace esto con su lógica para verificar la membresía del grupo de usuarios
      // Por ejemplo, usando la API de Discourse o lógica personalizada
      return groupNames.some(groupName => {
        // Verifique si el usuario está en el grupo llamado `groupName`
        // Devuelva verdadero si el usuario está en el grupo, de lo contrario falso
      });
    };

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

Use el código con precaución.

Uso del BBCode
Puede usar el BBCode de esta manera:

[hide_if_not_in_group groups="staff,moderators"]
Este contenido está oculto para los usuarios que no son personal ni moderadores.
[/hide_if_not_in_group]

Consideraciones importantes
Verificación de membresía de grupo: Reemplace la lógica de marcador de posición para verificar la membresía del grupo de usuarios con su implementación real. Es posible que necesite usar la API de Discourse o lógica personalizada para determinar la membresía del grupo.
Rendimiento: Para un gran número de usuarios o grupos, puede ser necesario optimizar la verificación de membresía de grupo.
Seguridad: Asegure la validación y el saneamiento adecuados de los nombres de grupo para evitar vulnerabilidades de seguridad.
Flexibilidad: Considere permitir atributos adicionales para el BBCode para controlar otros comportamientos (por ejemplo, mostrar un mensaje en lugar de ocultar contenido).
Siguiendo estos pasos, tendrá un envoltorio de BBCode y un componente de tema flexibles que pueden ocultar contenido según la membresía del grupo.


Usando Gemini. Pude obtener estos fragmentos de código anteriores. Sin embargo, tengo problemas para que funcionen.

Si alguien puede guiarme dónde colocarlo en un componente personalizado con las secciones para ingresar y corregir el código si es necesario.

El primer error que apareció cuando puse el JavaScript en común fue un error en “import” que esperaba un {

Error Pic

2 Me gusta

¡Eso es genial!

La advertencia, que probablemente sepas, es que el texto está disponible de varias maneras ya que simplemente está oculto con CSS. Una de ellas es esta ruta de publicación:

/posts/123/raw

2 Me gusta

De hecho. Había un componente personalizado que alguien creó utilizando una forma más compleja de eliminar contenido. Pero parece estar roto.

Si mal no recuerdo, ¿elimina el contenido del elemento cocido?

1 me gusta

Aquí está el tema donde un compañero creó un componente pero cuando lo probé no funcionaba y le envié un mensaje privado a DeV. Pero es posible que ya se haya ido.

Lo siento. Acabo de leer que no puedes hacer que funcione.

Lo que hay que hacer es usar el discourse_theme para generar un nuevo tema vacío. Luego busca otro componente de tema que tenga una sección “extiende componente”… Oh. No creo que funcione. Necesitarás que tu código apunte y modifique lo que ya está en el DOM. En realidad, no estoy del todo seguro de que eso sea correcto, ya que todavía soy bastante malo en eso.

Creo que puedes hacerlo solo con CSS si usas ese componente que añade la membresía del grupo al CSS.

Pero el markdown sin procesar está disponible en la ruta que mostré en mi última publicación. No veo cómo, incluso un plugin, puede hacerlo seguro de tal manera que sea imposible que la gente vea el texto oculto. Algo como las notas de usuario podría resolver tu problema, o si realmente necesitas que se dirija a las publicaciones, podrías usar las notas de usuario como modelo para hacer notas de publicación que añadirían un campo personalizado de publicación que solo el personal podría ver.

2 Me gusta

Sí, no puedes resolver esto correctamente sin cambiar la API, lo que significa que requeriría un plugin, no un componente de tema.

Si no estás usando susurros en tu sitio para moderación, ¿quizás podrías usar los que vienen listos para usar?

2 Me gusta

La aplicación para esto no estaría centrada en la seguridad.

Esto sería más para aplicaciones ligeras. En un tema anterior, alguien estaba buscando algo como esto para un juego de rol de mesa. Así, por ejemplo, el Dungeon Master podría necesitar acceder a la hoja de personaje de un jugador. La hoja de personaje sería visible para el Jugador y los maestros de juego.

El componente paraguas que hizo ese tipo se ve bien. Sin embargo, parece roto cuando lo probé. Pero, por supuesto, creo que incluso ese podría ser bastante fácil de comprometer. Si no me equivoco, como deshabilitar Java. O incluso una persona inteligente que conozca el modo seguro del sitio. ¿Se puede restringir el modo seguro al personal/administrador?

Cualquier componente, ya que son modificaciones del lado del cliente, por supuesto, no está diseñado para necesidades de seguridad. Incluso un script de Tampermonkey puede ser utilizado por los miembros de manera similar o igual que los temas/componentes temáticos.

Si se extiende esta idea, en teoría se podría ofuscar contenido basado en insignias, etc.

1 me gusta

sí. Deshabilitar esto hará que solo el personal pueda usar el modo seguro.

image

2 Me gusta