mirror of
https://github.com/coracle-social/coracle.git
synced 2024-09-29 08:21:20 +00:00
Add more commands
This commit is contained in:
parent
232db45a3f
commit
dd39413208
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
})
|
||||
|
@ -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()
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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))
|
||||
}
|
||||
|
@ -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})
|
||||
|
@ -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"
|
||||
|
@ -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)
|
||||
|
16
src/engine2/commands/nip04.ts
Normal file
16
src/engine2/commands/nip04.ts
Normal 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]],
|
||||
})
|
||||
}
|
7
src/engine2/commands/nip28.ts
Normal file
7
src/engine2/commands/nip28.ts
Normal 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]] : [],
|
||||
})
|
3
src/engine2/commands/nip32.ts
Normal file
3
src/engine2/commands/nip32.ts
Normal file
@ -0,0 +1,3 @@
|
||||
import {publishEvent} from "./util"
|
||||
|
||||
export const publishLabel = opts => publishEvent(1985, opts)
|
@ -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)) || ""
|
||||
|
@ -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>
|
||||
|
||||
|
@ -4,4 +4,5 @@ export * from "./feed"
|
||||
export * from "./pubkeys"
|
||||
export * from "./subscription"
|
||||
export * from "./thread"
|
||||
export * from "./nip04"
|
||||
export * from "./nip59"
|
||||
|
14
src/engine2/requests/nip04.ts
Normal file
14
src/engine2/requests/nip04.ts
Normal 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]},
|
||||
],
|
||||
})
|
||||
}
|
Loading…
Reference in New Issue
Block a user