Utilizzare l'IA per creare il wrapper BBCode per nascondere il contenuto

Utilizzando un wrapper BBCode generico, crea un componente tema che nasconde il contenuto se non appartiene a una variabile stringa di gruppo

Mostra bozze

Creazione di un wrapper BBCode generico e di un componente tema
Comprensione dei requisiti
In base alla tua richiesta, creeremo:

Un wrapper BBCode generico che può accettare attributi personalizzati.
Un componente tema che nasconde il contenuto in base a una variabile stringa di gruppo passata al wrapper BBCode.
Implementazione del wrapper BBCode
Creeremo un wrapper BBCode che può accettare attributi arbitrari. Questi attributi verranno passati al componente tema per la valutazione.

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

Usa il codice con cautela.

Creazione del componente tema
Il componente tema verificherà se l’utente corrente appartiene a uno dei gruppi specificati nell’attributo data-group-names. In caso contrario, nasconderà il contenuto.

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

    // Funzione per verificare se l'utente appartiene a uno dei gruppi specificati
    const userIsInAnyGroup = (userId, groupNames) => {
      // Sostituisci questo con la tua logica per verificare l'appartenenza ai gruppi dell'utente
      // Ad esempio, utilizzando l'API di Discourse o una logica personalizzata
      return groupNames.some(groupName => {
        // Verifica se l'utente appartiene al gruppo denominato `groupName`
        // Restituisci true se l'utente appartiene al gruppo, altrimenti false
      });
    };

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

Usa il codice con cautela.

Utilizzo del BBCode
Puoi usare il BBCode in questo modo:

[hide_if_not_in_group groups="staff,moderators"]
Questo contenuto è nascosto agli utenti che non sono staff o moderatori.
[/hide_if_not_in_group]

Considerazioni importanti
Controllo dell’appartenenza ai gruppi: Sostituisci la logica segnaposto per il controllo dell’appartenenza ai gruppi dell’utente con la tua implementazione effettiva. Potrebbe essere necessario utilizzare l’API di Discourse o una logica personalizzata per determinare l’appartenenza ai gruppi.
Prestazioni: Per un gran numero di utenti o gruppi, potrebbe essere necessario ottimizzare il controllo dell’appartenenza ai gruppi.
Sicurezza: Assicurati una corretta convalida e sanificazione dei nomi dei gruppi per prevenire vulnerabilità di sicurezza.
Flessibilità: Considera la possibilità di consentire attributi aggiuntivi per il BBCode per controllare altri comportamenti (ad esempio, mostrare un messaggio invece di nascondere il contenuto).
Seguendo questi passaggi, avrai un wrapper BBCode e un componente tema flessibili che possono nascondere il contenuto in base all’appartenenza ai gruppi.


Utilizzando Gemini. Sono riuscito a ottenere questi snippet di codice sopra. Tuttavia, ho difficoltà a farli funzionare.

Se qualcuno può guidarmi su dove posizionare in un componente personalizzato con le sezioni per inserire e correggere il codice, se necessario.

Il primo errore che è apparso quando ho inserito il JavaScript in common è stato un errore su “import” che si aspettava un {

Errore Pic

2 Mi Piace

Fantastico!

L’avvertenza, che probabilmente conosci, è che il testo è disponibile in diversi modi poiché è semplicemente nascosto con CSS. Uno di questi è questo percorso di post:

/posts/123/raw

2 Mi Piace

Infatti. C’era un componente personalizzato creato da qualcuno che utilizzava un modo più complesso per rimuovere i contenuti. Ma sembra che sia rotto.

Se non ricordo male, rimuove il contenuto dall’elemento cotto?

1 Mi Piace

Ecco l’argomento in cui un utente ha creato un componente ma quando ho provato non ha funzionato e ho inviato un messaggio privato a DeV. Ma potrebbe essere andato avanti.

Mi dispiace. Ho appena letto che non riesci a farlo funzionare.

La cosa da fare è usare il discourse_theme per generare un nuovo tema vuoto. Poi cerca un altro componente del tema che abbia una sezione “extends component”… Oh. Non credo che funzionerà. Avrai bisogno che il tuo codice prenda di mira e modifichi ciò che è già nel DOM. In realtà, non sono del tutto sicuro che sia giusto, dato che sono ancora abbastanza scarso in questo.

Penso che tu possa farlo solo con il CSS se usi quel componente che aggiunge l’appartenenza al gruppo al CSS.

Ma il markdown grezzo è disponibile nel percorso che ho mostrato nel mio ultimo post. Non vedo come anche un plugin possa renderlo sicuro in modo che sia impossibile per le persone vedere il testo nascosto. Qualcosa come le note utente potrebbe risolvere il tuo problema, o se hai davvero bisogno che prenda di mira i post, potresti usare le note utente come modello per creare note sui post che aggiungerebbero un campo personalizzato del post che solo lo staff potrebbe vedere.

2 Mi Piace

Sì, non puoi risolvere questo problema correttamente senza cambiare l’API, il che significa che richiederebbe un plugin, non un componente del tema.

Se non utilizzi i sussurri sul tuo sito per la moderazione, forse potresti usare quelli già pronti?

2 Mi Piace

L’applicazione per questo non sarebbe incentrata sulla sicurezza.

Sarebbe più per applicazioni leggere. In un argomento precedente una persona stava cercando. Qualcosa del genere per i giochi di ruolo da tavolo. Quindi, ad esempio, il Dungeon Master potrebbe aver bisogno di accedere alla scheda del personaggio di un giocatore. La scheda del personaggio sarebbe visibile al giocatore e ai master di gioco.

Il componente ombrello che quel tizio ha realizzato sembra buono. Tuttavia, sembra rotto quando l’ho provato. Ma ovviamente credo che anche quello potrebbe essere compromesso abbastanza facilmente. Se non erro, come disabilitare Java. O anche una persona intelligente che conosce la modalità sicura del sito. La modalità sicura può essere limitata allo staff/amministratore?

Qualsiasi componente, essendo mod lato client, non è pensato per esigenze di sicurezza. Anche uno script Tampermonkey può essere utilizzato dai membri in modo simile o uguale ai temi/componenti a tema.

Estendendo ulteriormente questa idea, in teoria si potrebbe oscurare il contenuto in base ai badge, ecc.

1 Mi Piace

sì. disabilitando questa opzione, solo lo staff potrà utilizzare la modalità sicura.

image

2 Mi Piace