# Système de tags zapwall.fr ## Vue d'ensemble Le système de tags de zapwall.fr utilise un système de tags personnalisé basé sur les tags standards de Nostr (kind 1 notes). Tous les événements sont des notes Nostr (kind 1), et le système utilise des tags en anglais pour identifier le type de contenu, la catégorie, et les métadonnées associées. ## Structure des tags ### Tags de base (tous les types) Tous les événements incluent ces tags de base : - **Type** : Tag simple (sans valeur) qui identifie le type de contenu - `#author` : Présentation d'auteur - `#series` : Série d'articles - `#publication` : Article/publication - `#quote` : Avis/review - **Catégorie** : Tag simple qui identifie la catégorie - `#sciencefiction` : Science-fiction - `#research` : Recherche scientifique - **Identifiant** : Tag avec valeur pour l'ID unique - `["id", ""]` : Identifiant unique de l'événement - **Service** : Tag avec valeur pour identifier la plateforme - `["service", "zapwall.fr"]` : Identifiant du service (toujours présent pour filtrer toutes les notes de zapwall.fr) - **Paywall** : Tag simple (optionnel) - `#paywall` : Indique que le contenu est payant - **Payment** : Tag simple (optionnel) - `#payment` : Indique qu'un paiement a été effectué ### Tags spécifiques par type #### Tags pour `#author` (présentation d'auteur) ```typescript ["author"] // Type ["sciencefiction"] ou ["research"] // Catégorie ["id", ""] // ID unique ["title", ""] // Titre de la présentation ["preview", ""] // Aperçu (optionnel) ["mainnet_address", ""] // Adresse Bitcoin mainnet pour le sponsoring ["total_sponsoring", ""] // Total du sponsoring reçu (en sats) ["picture", ""] // URL de la photo de profil (optionnel) ``` **Exemple de tags pour une présentation d'auteur :** ``` [ ["author"], ["sciencefiction"], ["id", "abc123..."], ["service", "zapwall.fr"], ["title", "Présentation de John Doe"], ["preview", "Aperçu de la présentation..."], ["mainnet_address", "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"], ["total_sponsoring", "0"], ["picture", "https://cdn.nostrcheck.me/..."] ] ``` #### Tags pour `#publication` (article) ```typescript ["publication"] // Type ["sciencefiction"] ou ["research"] // Catégorie ["id", ""] // ID unique ["title", ""] // Titre de l'article ["preview", ""] // Aperçu (optionnel) ["series", ""] // ID de la série (optionnel) ["banner", ""] // URL de la bannière (optionnel) ["zap", ""] // Montant en sats pour débloquer ["invoice", ""] // Facture BOLT11 (optionnel) ["payment_hash", ""] // Hash du paiement (optionnel) ["encrypted_key", ""] // Clé de chiffrement (optionnel) ``` #### Tags pour `#series` (série) ```typescript ["series"] // Type ["sciencefiction"] ou ["research"] // Catégorie ["id", ""] // ID unique ["title", ""] // Titre de la série ["description", ""] // Description de la série ["preview", ""] // Aperçu (optionnel) ["cover", ""] // URL de la couverture (optionnel) ``` #### Tags pour `#quote` (avis/review) ```typescript ["quote"] // Type ["article", ""] // ID de l'article commenté ["reviewer", ""] // Clé publique du reviewer (optionnel) ["title", ""] // Titre de l'avis (optionnel) ``` ## Filtrage et requêtes Le système utilise `buildTagFilter` pour construire des filtres de requête Nostr : ```typescript // Exemple : récupérer toutes les présentations d'auteurs de zapwall.fr buildTagFilter({ type: 'author', category: 'sciencefiction', service: 'zapwall.fr' }) // Résultat : { kinds: [1], "#author": [""], "#sciencefiction": [""], "#service": ["zapwall.fr"] } // Exemple : récupérer une présentation spécifique buildTagFilter({ type: 'author', authorPubkey: 'abc123...', service: 'zapwall.fr' }) // Résultat : { kinds: [1], "#author": [""], "#service": ["zapwall.fr"], authors: ["abc123..."] } // Exemple : récupérer toutes les notes de zapwall.fr buildTagFilter({ service: 'zapwall.fr' }) // Résultat : { kinds: [1], "#service": ["zapwall.fr"] } ``` ## Extraction des tags Le système utilise `extractTagsFromEvent` pour extraire les tags d'un événement : ```typescript const tags = extractTagsFromEvent(event) // Retourne un objet avec : // - type: 'author' | 'series' | 'publication' | 'quote' // - category: 'sciencefiction' | 'research' // - id: string // - paywall: boolean // - payment: boolean // - title, preview, mainnetAddress, etc. selon le type ``` ## Tag service Le tag `["service", "zapwall.fr"]` est utilisé pour identifier toutes les notes publiées par la plateforme zapwall.fr. Ce tag permet de : - **Filtrer toutes les notes de la plateforme** : `buildTagFilter({ service: 'zapwall.fr' })` - **Distinguer les notes zapwall.fr** des autres notes Nostr sur le réseau - **Améliorer les performances** en filtrant dès la source lors des requêtes **Note** : Aucun NIP (Nostr Improvement Proposal) ne spécifie actuellement un tag standardisé pour identifier un service/plateforme. Le tag `service` est donc une convention interne à zapwall.fr. Si un NIP standardisé émerge à l'avenir, le système pourra être adapté en conséquence. ## Avantages du système 1. **Standardisé** : Tous les événements sont des notes Nostr (kind 1), compatibles avec tous les clients Nostr 2. **Filtrable** : Les tags permettent de filtrer efficacement les événements par type, catégorie et service 3. **Extensible** : Facile d'ajouter de nouveaux types ou catégories 4. **Interopérable** : Les tags sont lisibles par n'importe quel client Nostr, même s'il ne comprend pas la structure complète 5. **Identifiable** : Le tag `service` permet de distinguer les notes zapwall.fr des autres notes Nostr ## Détection des auteurs Les auteurs sont détectés via le tag `#author` dans les événements. Le système souscrit aux événements avec : - `#author` : Pour identifier les présentations d'auteurs - `#publication` : Pour identifier les articles Cela permet de distinguer les auteurs (présentations) des articles (publications) dans le même flux d'événements.