Add more commands

This commit is contained in:
Jonathan Staab 2023-09-09 15:54:28 -07:00
parent 232db45a3f
commit dd39413208
17 changed files with 99 additions and 96 deletions

View File

@ -6,8 +6,8 @@
import ImageInput from "src/partials/ImageInput.svelte"
import Anchor from "src/partials/Anchor.svelte"
import {toast, modal} from "src/partials/state"
import {getUserRelayUrls} from "src/engine2"
import {Builder, Outbox, user} from "src/app/engine"
import {publishNip28ChannelMeta} from "src/engine2"
import {user} from "src/app/engine"
import {toastProgress} from "src/app/state"
export let channel = {name: null, id: null, about: null, picture: null}
@ -18,17 +18,13 @@
if (!channel.name) {
toast.show("error", "Please enter a name for your room.")
} else {
const relays = getUserRelayUrls("write")
const {id, ...content} = channel
const pub = publishNip28ChannelMeta({id, content})
if (channel.id) {
const event = Builder.updateChannel(channel)
Outbox.publish({relays, event, onProgress: toastProgress})
if (id) {
pub.on("progress", toastProgress)
} else {
const event = await Outbox.prep(Builder.createChannel(channel))
Outbox.publish({event, relays})
user.joinChannel(event.id)
user.joinChannel(pub.event.id)
}
modal.pop()

View File

@ -5,8 +5,8 @@
import Anchor from "src/partials/Anchor.svelte"
import Field from "src/partials/Field.svelte"
import MultiSelect from "src/partials/MultiSelect.svelte"
import {getUserRelayUrls} from "src/engine2"
import engine, {Builder, Outbox} from "src/app/engine"
import {getUserRelayUrls, publishLabel} from "src/engine2"
import engine from "src/app/engine"
export let note
@ -23,10 +23,7 @@
}
}
Outbox.publish({
event: Builder.createLabel({tagClient: false, tags}),
relays: getUserRelayUrls("write"),
})
publishLabel({tags, relays: getUserRelayUrls("write")})
toast.show("info", "Your tag has been saved!")
modal.pop()

View File

@ -7,18 +7,8 @@
import Channel from "src/partials/Channel.svelte"
import Anchor from "src/partials/Anchor.svelte"
import NoteContent from "src/app/shared/NoteContent.svelte"
import {getSetting} from "src/engine2"
import {
user,
Nip04,
Nip65,
Outbox,
Crypt,
Directory,
Builder,
Network,
Keys,
} from "src/app/engine"
import {publishNip04Message, loadNip04Messages} from "src/engine2"
import {user, Nip04, Directory, Keys} from "src/app/engine"
import {routes} from "src/app/state"
import PersonCircle from "src/app/shared/PersonCircle.svelte"
import PersonAbout from "src/app/shared/PersonAbout.svelte"
@ -26,33 +16,19 @@
export let entity
const pubkey = toHex(entity)
const relayLimit = getSetting("relay_limit")
const profile = Directory.profiles.key(pubkey).derived(defaultTo({pubkey}))
const messages = Nip04.messages.derived(filter(whereEq({contact: pubkey})))
user.setContactLastChecked(pubkey)
const getRelays = () =>
Nip65.mergeHints(relayLimit, [
Nip65.getPubkeyHints(relayLimit, pubkey, "read"),
Nip65.getPubkeyHints(relayLimit, Keys.pubkey.get(), "read"),
])
const sendMessage = async content => {
const cyphertext = await Crypt.encrypt(pubkey, content)
const event = Builder.createDirectMessage(pubkey, cyphertext)
const pub = await publishNip04Message(pubkey, {content})
await Outbox.publish({event, relays: getRelays()})
await pub.result
}
onMount(() => {
const sub = Network.subscribe({
relays: getRelays(),
filter: [
{kinds: [4], authors: [Keys.pubkey.get()], "#p": [pubkey]},
{kinds: [4], authors: [pubkey], "#p": [Keys.pubkey.get()]},
],
})
const sub = loadNip04Messages(pubkey)
return () => sub.close()
})

View File

@ -16,7 +16,7 @@
import RelayCard from "src/app/shared/RelayCard.svelte"
import NoteContent from "src/app/shared/NoteContent.svelte"
import RelaySearch from "src/app/shared/RelaySearch.svelte"
import {createNote, getUserRelayUrls} from "src/engine2"
import {publishNote, getUserRelayUrls} from "src/engine2"
import {Directory, Network, Builder, Nip65, Keys} from "src/app/engine"
import {modal} from "src/partials/state"
import {toastProgress} from "src/app/state"
@ -48,7 +48,7 @@
Network.publish({relays: $relays, event: quote})
}
createNote({tags, content, relays: $relays}).on("progress", toastProgress)
publishNote({tags, content, relays: $relays}).on("progress", toastProgress)
modal.clear()
}

View File

@ -10,7 +10,7 @@
import OnboardingRelays from "src/app/views/OnboardingRelays.svelte"
import OnboardingFollows from "src/app/views/OnboardingFollows.svelte"
import OnboardingNote from "src/app/views/OnboardingNote.svelte"
import {loadPubkeys, createNote} from "src/engine2"
import {loadPubkeys, publishNote} from "src/engine2"
import {Env, Builder, user, Keys} from "src/app/engine"
import {listenForNotifications} from "src/app/state"
import {modal} from "src/partials/state"
@ -59,7 +59,7 @@
await Promise.all([
user.setProfile(profile),
user.setPetnames(petnames),
noteContent && createNote({content: noteContent}),
noteContent && publishNote({content: noteContent}),
])
// Start our notifications listener

View File

@ -6,8 +6,7 @@
import Heading from "src/partials/Heading.svelte"
import Compose from "src/app/shared/Compose.svelte"
import Rating from "src/partials/Rating.svelte"
import {getUserRelayUrls} from "src/engine2"
import {Builder, Outbox} from "src/app/engine"
import {publishLabel} from "src/engine2"
export let url
@ -15,10 +14,8 @@
let rating
const onSubmit = () => {
const review = compose.parse()
const event = Builder.createLabel({
content: review,
tagClient: false,
publishLabel({
content: compose.parse(),
tags: [
["L", "social.coracle.ontology"],
["l", "review/relay", "social.coracle.ontology", JSON.stringify({quality: rating})],
@ -26,8 +23,6 @@
],
})
Outbox.publish({event, relays: getUserRelayUrls("write")})
modal.pop()
}
</script>

View File

@ -7,8 +7,8 @@
import Anchor from "src/partials/Anchor.svelte"
import Content from "src/partials/Content.svelte"
import Heading from "src/partials/Heading.svelte"
import {getUserRelayUrls} from "src/engine2"
import {Directory, Outbox, Keys, Builder} from "src/app/engine"
import {publishUserProfile} from "src/engine2"
import {Directory, Keys} from "src/app/engine"
import {routes} from "src/app/state"
import {toastProgress} from "src/app/state"
@ -18,11 +18,7 @@
"https://www.coindesk.com/markets/2020/06/29/many-bitcoin-developers-are-choosing-to-use-pseudonyms-for-good-reason/"
const submit = () => {
Outbox.publish({
event: Builder.setProfile(values),
relays: getUserRelayUrls("write"),
onProgress: toastProgress,
})
publishUserProfile({content: values}).on("progress", toastProgress)
navigate(routes.person($pubkey))
}

View File

@ -1,6 +1,6 @@
import {last, pick, uniqBy} from "ramda"
import {last, uniqBy} from "ramda"
import {doPipe, first} from "hurdak"
import {Tags, channelAttrs, findRoot, findReply} from "src/util/nostr"
import {Tags, findRoot, findReply} from "src/util/nostr"
import {parseContent} from "src/util/notes"
import type {Event, RelayPolicyEntry} from "src/engine/types"
import type {Engine} from "src/engine/Engine"
@ -114,15 +114,6 @@ export class Builder {
createList = (list: string[][]) => buildEvent(30001, {tags: list})
createChannel = (channel: Record<string, any>) =>
buildEvent(40, {content: JSON.stringify(pick(channelAttrs, channel))})
updateChannel = ({id, ...channel}: Record<string, any>) =>
buildEvent(41, {
content: JSON.stringify(pick(channelAttrs, channel)),
tags: [["e", id]],
})
createChatMessage = (channelId: string, content: string, url: string) =>
buildEvent(42, {content, tags: [["e", channelId, url, "root"]]})
@ -168,8 +159,6 @@ export class Builder {
deleteNaddrs = (naddrs: string[]) => buildEvent(5, {tags: naddrs.map(naddr => ["a", naddr])})
createLabel = (payload: EventOpts) => buildEvent(1985, payload)
createReport = (payload: EventOpts) => buildEvent(1984, payload)
nip98Auth = (tags: string[][]) => buildEvent(27235, {tags})

View File

@ -1,4 +1,7 @@
export * from "./session"
export * from "./nip01"
export * from "./nip04"
export * from "./nip24"
export * from "./nip28"
export * from "./nip32"
export * from "./nip95"

View File

@ -1,20 +1,6 @@
import {getUserRelayUrls, signer} from "src/engine2/queries"
import {Publisher} from "./publisher"
import {buildEvent, uniqTags, tagsFromContent} from "./util"
import {publishEvent} from "./util"
type CreateNoteOpts = {
content?: string
tags?: string[][]
relays?: string[]
}
export const publishUserProfile = ({content, ...opts}) =>
publishEvent(0, {...opts, content: JSON.stringify(content)})
export const createNote = ({content = "", tags = [], relays}: CreateNoteOpts) =>
Publisher.publish({
relays: relays || getUserRelayUrls("write"),
event: signer.get().signAsUser(
buildEvent(1, {
content,
tags: uniqTags([...tags, tagsFromContent(content)]),
})
),
})
export const publishNote = opts => publishEvent(1, opts)

View File

@ -0,0 +1,16 @@
import {user, nip04, getInboxHints, getSetting} from "src/engine2/queries"
import type {PublishOpts} from "./util"
import {publishEvent} from "./util"
export const publishNip04Message = async (
recipient,
{relays, content = "", tags = []}: PublishOpts
) => {
const pubkeys = [recipient, user.get().pubkey]
return publishEvent(4, {
relays: relays || getInboxHints(getSetting("relay_limit"), pubkeys),
content: await nip04.get().encryptAsUser(content, recipient),
tags: [...tags, ["p", recipient]],
})
}

View File

@ -0,0 +1,7 @@
import {publishEvent} from "./util"
export const publishNip28ChannelMeta = ({id = null, content}) =>
publishEvent(id ? 41 : 40, {
content: JSON.stringify(content),
tags: id ? [["e", id]] : [],
})

View File

@ -0,0 +1,3 @@
import {publishEvent} from "./util"
export const publishLabel = opts => publishEvent(1985, opts)

View File

@ -5,7 +5,9 @@ import {parseContent} from "src/util/notes"
import {now} from "src/util/misc"
import type {Event} from "src/engine2/model"
import {people} from "src/engine2/state"
import {signer, getUserRelayUrls} from "src/engine2/queries"
import {getEventHints, getPubkeyHints, displayPerson} from "src/engine2/queries"
import {Publisher} from "./publisher"
export type EventOpts = {
created_at?: number
@ -17,6 +19,22 @@ export function buildEvent(kind: number, {content = "", tags = [], created_at =
return {kind, content, tags, created_at: created_at || now()}
}
export type PublishOpts = EventOpts & {
relays?: string[]
}
export function publishEvent(kind: number, {relays, content = "", tags = []}: PublishOpts) {
return Publisher.publish({
relays: relays || getUserRelayUrls("write"),
event: signer.get().signAsUser(
buildEvent(kind, {
content,
tags: uniqTags([...tags, tagsFromContent(content)]),
})
),
})
}
export const uniqTags = uniqBy((t: string[]) => t.slice(0, 2).join(":"))
export const getEventHint = (event: Event) => first(getEventHints(1, event)) || ""

View File

@ -133,6 +133,12 @@ export const getPublishHints = (limit: number, event: Event, extraRelays: string
return mergeHints(limit, hintGroups.concat([extraRelays, authorRelays]))
}
export const getInboxHints = (limit: number, pubkeys: string[]) =>
mergeHints(
limit,
pubkeys.map(pk => getPubkeyHints(limit, pk, "read"))
)
export const mergeHints = (limit: number, groups: string[][]) => {
const scores = {} as Record<string, any>

View File

@ -4,4 +4,5 @@ export * from "./feed"
export * from "./pubkeys"
export * from "./subscription"
export * from "./thread"
export * from "./nip04"
export * from "./nip59"

View File

@ -0,0 +1,14 @@
import {user, getInboxHints, getSetting} from "src/engine2/queries"
import {Subscription} from "./subscription"
export function loadNip04Messages(contactPubkey: string) {
const {pubkey: userPubkey} = user.get()
return new Subscription({
relays: getInboxHints(getSetting("relay_limit"), [contactPubkey, userPubkey]),
filters: [
{kinds: [4], authors: [userPubkey], "#p": [contactPubkey]},
{kinds: [4], authors: [contactPubkey], "#p": [userPubkey]},
],
})
}