sigit.io/src/controllers/MetadataController.ts

93 lines
2.3 KiB
TypeScript
Raw Normal View History

import {
Filter,
SimplePool,
VerifiedEvent,
kinds,
validateEvent,
2024-03-01 10:16:35 +00:00
verifyEvent,
Event
} from 'nostr-tools'
2024-03-01 10:16:35 +00:00
import { ProfileMetadata } from '../types'
import { NostrController } from '.'
import { toast } from 'react-toastify'
export class MetadataController {
2024-03-01 10:16:35 +00:00
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(' ')
2024-03-01 10:16:35 +00:00
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 {
2024-03-01 10:16:35 +00:00
return JSON.parse(event.content) as ProfileMetadata
} 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)
// 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)
}