import { Filter, SimplePool, VerifiedEvent, kinds, validateEvent, verifyEvent, Event } from 'nostr-tools' import { ProfileMetadata } from '../types' import { NostrController } from '.' import { toast } from 'react-toastify' export class MetadataController { private nostrController: NostrController private specialMetadataRelay = 'wss://purplepag.es' constructor() { this.nostrController = NostrController.getInstance() } public findMetadata = async (hexKey: string) => { const mostPopularRelays = import.meta.env.VITE_MOST_POPULAR_RELAYS const hardcodedPopularRelays = (mostPopularRelays || '').split(' ') const relays = [...hardcodedPopularRelays, this.specialMetadataRelay] const eventFilter: Filter = { kinds: [kinds.Metadata], authors: [hexKey] } const pool = new SimplePool() const events = await pool.querySync(relays, eventFilter).catch((err) => { console.error(err) return null }) if (events && events.length) { events.sort((a, b) => b.created_at - a.created_at) for (const event of events) { if (validateEvent(event) && verifyEvent(event)) { return event } } } throw new Error('Mo metadata found.') } public extractProfileMetadataContent = (event: VerifiedEvent) => { try { return JSON.parse(event.content) as ProfileMetadata } catch (error) { console.log('error in parsing metadata event content :>> ', error) return null } } /** * Function will not sign provided event if the SIG exists */ public publishMetadataEvent = async (event: Event) => { let signedMetadataEvent = event if (event.sig.length < 1) { const timestamp = Math.floor(Date.now() / 1000) // Metadata event to publish to the nquiz relay const newMetadataEvent: Event = { ...event, created_at: timestamp } signedMetadataEvent = await this.nostrController.signEvent( newMetadataEvent ) } await this.nostrController .publishEvent(signedMetadataEvent, this.specialMetadataRelay) .then((res) => { toast.success(`Metadata: ${res}`) }) .catch((err) => { toast.error(err.message) }) } public validate = (event: Event) => validateEvent(event) && verifyEvent(event) }