2024-02-28 16:49:44 +00:00
|
|
|
import {
|
|
|
|
Filter,
|
|
|
|
SimplePool,
|
|
|
|
VerifiedEvent,
|
|
|
|
kinds,
|
|
|
|
validateEvent,
|
2024-03-01 10:16:35 +00:00
|
|
|
verifyEvent,
|
|
|
|
Event
|
2024-02-28 16:49:44 +00:00
|
|
|
} from 'nostr-tools'
|
2024-03-01 10:16:35 +00:00
|
|
|
import { ProfileMetadata } from '../types'
|
|
|
|
import { NostrController } from '.'
|
|
|
|
import { toast } from 'react-toastify'
|
2024-02-28 16:49:44 +00:00
|
|
|
|
|
|
|
export class MetadataController {
|
2024-03-01 10:16:35 +00:00
|
|
|
private nostrController: NostrController
|
|
|
|
private specialMetadataRelay = 'wss://purplepag.es'
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
this.nostrController = NostrController.getInstance()
|
|
|
|
}
|
2024-02-28 16:49:44 +00:00
|
|
|
|
|
|
|
public findMetadata = async (hexKey: string) => {
|
|
|
|
const eventFilter: Filter = {
|
|
|
|
kinds: [kinds.Metadata],
|
|
|
|
authors: [hexKey]
|
|
|
|
}
|
|
|
|
|
|
|
|
const pool = new SimplePool()
|
|
|
|
|
2024-03-19 09:23:34 +00:00
|
|
|
const metadataEvent = await pool
|
|
|
|
.get([this.specialMetadataRelay], eventFilter)
|
|
|
|
.catch((err) => {
|
|
|
|
console.error(err)
|
|
|
|
return null
|
|
|
|
})
|
|
|
|
|
|
|
|
if (
|
|
|
|
metadataEvent &&
|
|
|
|
validateEvent(metadataEvent) &&
|
|
|
|
verifyEvent(metadataEvent)
|
|
|
|
) {
|
|
|
|
return metadataEvent
|
|
|
|
}
|
|
|
|
|
|
|
|
const mostPopularRelays = import.meta.env.VITE_MOST_POPULAR_RELAYS
|
|
|
|
const hardcodedPopularRelays = (mostPopularRelays || '').split(' ')
|
|
|
|
const relays = [...hardcodedPopularRelays]
|
|
|
|
|
2024-02-28 16:49:44 +00:00
|
|
|
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 {
|
2024-03-01 10:16:35 +00:00
|
|
|
return JSON.parse(event.content) as ProfileMetadata
|
2024-02-28 16:49:44 +00:00
|
|
|
} catch (error) {
|
|
|
|
console.log('error in parsing metadata event content :>> ', error)
|
|
|
|
return null
|
|
|
|
}
|
|
|
|
}
|
2024-03-01 10:16:35 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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)
|
|
|
|
|
2024-03-19 09:23:34 +00:00
|
|
|
// Metadata event to publish to the wss://purplepag.es relay
|
2024-03-01 10:16:35 +00:00
|
|
|
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)
|
2024-02-28 16:49:44 +00:00
|
|
|
}
|