mirror of
https://github.com/AustinKelsay/plebdevs.git
synced 2025-04-23 01:01:28 +00:00
217 lines
6.2 KiB
JavaScript
217 lines
6.2 KiB
JavaScript
import { nip19 } from "nostr-tools";
|
|
|
|
export const findKind0Fields = async (kind0) => {
|
|
let fields = {}
|
|
|
|
const usernameProperties = ['name', 'displayName', 'display_name', 'username', 'handle', 'alias'];
|
|
|
|
const pubkeyProperties = ['pubkey', 'npub', '_pubkey'];
|
|
|
|
const findTruthyPropertyValue = (object, properties) => {
|
|
for (const property of properties) {
|
|
if (object?.[property]) {
|
|
return object[property];
|
|
}
|
|
}
|
|
return null;
|
|
};
|
|
|
|
const username = findTruthyPropertyValue(kind0, usernameProperties);
|
|
|
|
if (username) {
|
|
fields.username = username;
|
|
}
|
|
|
|
const avatar = findTruthyPropertyValue(kind0, ['picture', 'avatar', 'profilePicture', 'profile_picture', 'image']);
|
|
|
|
if (avatar) {
|
|
fields.avatar = avatar;
|
|
}
|
|
|
|
const pubkey = findTruthyPropertyValue(kind0, pubkeyProperties);
|
|
|
|
if (pubkey) {
|
|
fields.pubkey = pubkey;
|
|
}
|
|
|
|
const lud16 = findTruthyPropertyValue(kind0, ['lud16', 'lightning', 'lnurl', 'lnurlp', 'lnurlw']);
|
|
|
|
if (lud16) {
|
|
fields.lud16 = lud16;
|
|
}
|
|
|
|
return fields;
|
|
}
|
|
|
|
export const parseMessageEvent = (event) => {
|
|
const eventData = {
|
|
id: event.id,
|
|
pubkey: event.pubkey || '',
|
|
content: event.content || '',
|
|
kind: event.kind || '',
|
|
type: 'message',
|
|
};
|
|
|
|
return eventData;
|
|
}
|
|
|
|
|
|
export const parseEvent = (event) => {
|
|
// Initialize an object to store the extracted data
|
|
const eventData = {
|
|
id: event.id,
|
|
pubkey: event.pubkey || '',
|
|
content: event.content || '',
|
|
kind: event.kind || '',
|
|
additionalLinks: [],
|
|
title: '',
|
|
summary: '',
|
|
image: '',
|
|
published_at: '',
|
|
topics: [], // Added to hold all topics
|
|
type: 'document', // Default type
|
|
};
|
|
|
|
// Iterate over the tags array to extract data
|
|
event.tags.forEach(tag => {
|
|
switch (tag[0]) { // Check the key in each key-value pair
|
|
case 'title':
|
|
eventData.title = tag[1];
|
|
break;
|
|
case 'summary':
|
|
eventData.summary = tag[1];
|
|
break;
|
|
case 'description':
|
|
eventData.summary = tag[1];
|
|
break;
|
|
case 'name':
|
|
eventData.title = tag[1];
|
|
break;
|
|
case 'image':
|
|
eventData.image = tag[1];
|
|
break;
|
|
case 'published_at':
|
|
eventData.published_at = tag[1];
|
|
break;
|
|
case 'author':
|
|
eventData.author = tag[1];
|
|
break;
|
|
case 'price':
|
|
eventData.price = tag[1];
|
|
break;
|
|
// How do we get topics / tags?
|
|
case 'l':
|
|
// Grab index 1 and any subsequent elements in the array
|
|
tag.slice(1).forEach(topic => {
|
|
eventData.topics.push(topic);
|
|
});
|
|
break;
|
|
case 'd':
|
|
eventData.d = tag[1];
|
|
break;
|
|
case 't':
|
|
if (tag[1] === 'video') {
|
|
eventData.type = 'video';
|
|
} else if (tag[1] !== "plebdevs") {
|
|
eventData.topics.push(tag[1]);
|
|
}
|
|
break;
|
|
case 'r':
|
|
eventData.additionalLinks.push(tag[1]);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
});
|
|
|
|
// if published_at is an empty string, then set it to event.created_at
|
|
if (!eventData.published_at) {
|
|
eventData.published_at = event.created_at;
|
|
}
|
|
|
|
return eventData;
|
|
};
|
|
|
|
export const parseCourseEvent = (event) => {
|
|
// Initialize an object to store the extracted data
|
|
const eventData = {
|
|
id: event.id,
|
|
pubkey: event.pubkey || '',
|
|
content: event.content || '',
|
|
kind: event.kind || '',
|
|
name: '',
|
|
description: '',
|
|
image: '',
|
|
published_at: '',
|
|
created_at: event.created_at,
|
|
topics: [],
|
|
d: '',
|
|
tags: event.tags,
|
|
type: 'course',
|
|
};
|
|
|
|
// Iterate over the tags array to extract data
|
|
event.tags.forEach(tag => {
|
|
switch (tag[0]) { // Check the key in each key-value pair
|
|
case 'name':
|
|
eventData.name = tag[1];
|
|
break;
|
|
case 'description':
|
|
eventData.description = tag[1];
|
|
break;
|
|
case 'image':
|
|
eventData.image = tag[1];
|
|
break;
|
|
case 'picture':
|
|
eventData.image = tag[1];
|
|
break;
|
|
case 'published_at':
|
|
eventData.published_at = tag[1];
|
|
break;
|
|
case 'd':
|
|
eventData.d = tag[1];
|
|
break;
|
|
case 'price':
|
|
eventData.price = tag[1];
|
|
break;
|
|
// How do we get topics / tags?
|
|
case 'l':
|
|
// Grab index 1 and any subsequent elements in the array
|
|
tag.slice(1).forEach(topic => {
|
|
eventData.topics.push(topic);
|
|
});
|
|
break;
|
|
case 'r':
|
|
eventData.additionalLinks.push(tag[1]);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
});
|
|
|
|
return eventData;
|
|
}
|
|
|
|
export const hexToNpub = (hex) => {
|
|
return nip19.npubEncode(hex);
|
|
}
|
|
|
|
export function validateEvent(event) {
|
|
if (typeof event.kind !== "number") return "Invalid kind";
|
|
if (typeof event.content !== "string") return "Invalid content";
|
|
if (typeof event.created_at !== "number") return "Invalid created_at";
|
|
if (typeof event.pubkey !== "string") return "Invalid pubkey";
|
|
if (!event.pubkey.match(/^[a-f0-9]{64}$/)) return "Invalid pubkey format";
|
|
|
|
if (!Array.isArray(event.tags)) return "Invalid tags";
|
|
for (let i = 0; i < event.tags.length; i++) {
|
|
const tag = event.tags[i];
|
|
if (!Array.isArray(tag)) return "Invalid tag structure";
|
|
for (let j = 0; j < tag.length; j++) {
|
|
if (typeof tag[j] === "object") return "Invalid tag value";
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|