problem: no voting notification for merit request

solution: after voting, also send a kind 1 event
This commit is contained in:
Bob
2024-07-29 21:42:22 +08:00
parent d13a9e5477
commit aadae07cd2
5 changed files with 130 additions and 47 deletions

View File

@@ -1,8 +1,8 @@
<script lang="ts"> <script lang="ts">
import * as Card from '$lib/components/ui/card/index.js'; import * as Card from '$lib/components/ui/card/index.js';
import { type MeritRequest } from '@/event_helpers/merits'; import { prepareMeritNoteEvent, type MeritRequest } from '@/event_helpers/merits';
import { ndk } from '@/ndk'; import { ndk } from '@/ndk';
import { NDKEvent, type NDKKind } from '@nostr-dev-kit/ndk'; import { NDKKind } from '@nostr-dev-kit/ndk';
import { Avatar, Name } from '@nostr-dev-kit/ndk-svelte-components'; import { Avatar, Name } from '@nostr-dev-kit/ndk-svelte-components';
import { onDestroy } from 'svelte'; import { onDestroy } from 'svelte';
@@ -14,6 +14,7 @@
import { currentUser } from '@/stores/session'; import { currentUser } from '@/stores/session';
import CornerDownLeft from 'lucide-svelte/icons/corner-down-left'; import CornerDownLeft from 'lucide-svelte/icons/corner-down-left';
import type NDKSvelte from '@nostr-dev-kit/ndk-svelte'; import type NDKSvelte from '@nostr-dev-kit/ndk-svelte';
export let merit: MeritRequest; export let merit: MeritRequest;
let comments = $ndk.storeSubscribe({ kinds: [1 as NDKKind], '#e': [merit.ID] }); let comments = $ndk.storeSubscribe({ kinds: [1 as NDKKind], '#e': [merit.ID] });
@@ -28,18 +29,16 @@
if (!ndk.signer) { if (!ndk.signer) {
throw new Error('no ndk signer found'); throw new Error('no ndk signer found');
} }
let e = new NDKEvent(ndk);
let author = $currentUser; let author = $currentUser;
if (!author) { if (!author) {
throw new Error('no current user'); throw new Error('no current user');
} }
e.author = author; const e = prepareMeritNoteEvent({
e.kind = 1; ndk,
e.created_at = Math.floor(new Date().getTime() / 1000); author,
e.content = content; merit,
e.tags.push(['p', merit.Pubkey]); content
e.tags.push(['e', merit.ID, 'root', merit.Pubkey]); });
console.log(e.rawEvent());
e.publish().then((x) => { e.publish().then((x) => {
console.log(x); console.log(x);
}); });

View File

@@ -1,38 +1,55 @@
<script lang="ts"> <script lang="ts">
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
import { MeritRequest } from '@/event_helpers/merits'; import {
MeritRequest,
prepareMeritNoteEvent,
prepareMeritVoteEvent,
type VoteDirection
} from '@/event_helpers/merits';
import type { Rocket } from '@/event_helpers/rockets'; import type { Rocket } from '@/event_helpers/rockets';
import { ndk } from '@/ndk'; import { ndk } from '@/ndk';
import { currentUser } from '@/stores/session'; import { currentUser } from '@/stores/session';
import { NDKEvent } from '@nostr-dev-kit/ndk';
import type NDKSvelte from '@nostr-dev-kit/ndk-svelte'; import type NDKSvelte from '@nostr-dev-kit/ndk-svelte';
import { Name } from '@nostr-dev-kit/ndk-svelte-components';
import Login from './Login.svelte'; import Login from './Login.svelte';
export let merit: MeritRequest; export let merit: MeritRequest;
export let rocket: Rocket; export let rocket: Rocket;
function publish(ndk: NDKSvelte, direction: string) { function publish(ndk: NDKSvelte, direction: VoteDirection) {
if (!ndk.signer) { if (!ndk.signer) {
throw new Error('no ndk signer found'); throw new Error('no ndk signer found');
} }
let e = new NDKEvent(ndk);
let author = $currentUser; let author = $currentUser;
if (!author) { if (!author) {
throw new Error('no current user'); throw new Error('no current user');
} }
e.author = author; prepareMeritVoteEvent({
e.kind = 1410; ndk,
e.created_at = Math.floor(new Date().getTime() / 1000); author,
e.tags.push(['a', `31108:${rocket.Event.pubkey}:${rocket.Event.dTag}`]); rocket,
e.tags.push(['request', merit.ID]); merit,
e.tags.push(['e', merit.ID]); direction
e.tags.push(['p', merit.Pubkey]); })
e.tags.push(['vote', direction]); .publish()
console.log(e.rawEvent()); .then((x) => {
e.publish().then((x) => { console.log(x);
console.log(x); });
}); let content;
if (direction === 'ratify') {
content = `I ratify your merit request: \n\n${merit.Problem()}`;
} else {
content = `I reject your merit request: \n\n${merit.Problem()}`;
}
prepareMeritNoteEvent({
ndk,
author,
merit,
content
})
.publish()
.then((x) => {
console.log(x);
});
} }
$: currentUserHasVotepower = false; $: currentUserHasVotepower = false;

View File

@@ -1,5 +1,7 @@
import type { NDKEvent, NDKFilter, NDKTag } from '@nostr-dev-kit/ndk'; import { NDKEvent, NDKKind, type NDKFilter, type NDKTag, type NDKUser } from '@nostr-dev-kit/ndk';
import { Rocket, getNumberFromTag, isValidUrl } from './rockets'; import { Rocket, getNumberFromTag, isValidUrl } from './rockets';
import type NDKSvelte from '@nostr-dev-kit/ndk-svelte';
import { prepareNostrEvent } from '@/helpers';
export class MeritRequest { export class MeritRequest {
ID: string; ID: string;
@@ -338,3 +340,42 @@ function pubkeyLatestVote(votes: Votes) {
} }
return new Votes([...pMap.values()]); return new Votes([...pMap.values()]);
} }
export function prepareMeritNoteEvent(args: {
ndk: NDKSvelte;
author: NDKUser;
merit: MeritRequest;
content: string;
}) {
const tags = [
['p', args.merit.Pubkey],
['e', args.merit.ID, 'root', args.merit.Pubkey]
];
return prepareNostrEvent({
...args,
kind: NDKKind.Text,
tags
});
}
export function prepareMeritVoteEvent(args: {
ndk: NDKSvelte;
author: NDKUser;
rocket: Rocket;
merit: MeritRequest;
direction: string;
}) {
const tags = [
['a', `31108:${args.rocket.Event.pubkey}:${args.rocket.Event.dTag}`],
['request', args.merit.ID],
['e', args.merit.ID],
['p', args.merit.Pubkey],
['vote', args.direction]
];
return prepareNostrEvent({
...args,
kind: 1410 as NDKKind,
tags,
content: ''
});
}

View File

@@ -1,4 +1,4 @@
import { NDKEvent, NDKZap, type NDKTag } from '@nostr-dev-kit/ndk'; import { NDKEvent, type NDKTag } from '@nostr-dev-kit/ndk';
import { MapOfVotes, MeritRequest, Votes } from './merits'; import { MapOfVotes, MeritRequest, Votes } from './merits';
import { getAuthorizedZapper } from '@/helpers'; import { getAuthorizedZapper } from '@/helpers';
@@ -12,7 +12,7 @@ export class Rocket {
for (let p of this.Event.getMatchingTags('product')) { for (let p of this.Event.getMatchingTags('product')) {
_products.push(new RocketProduct(p)); _products.push(new RocketProduct(p));
} }
return _products return _products;
} }
VotePowerForPubkey(pubkey: string): number { VotePowerForPubkey(pubkey: string): number {
let votepower = 0; let votepower = 0;
@@ -338,7 +338,6 @@ export class ZapPurchase {
return false; return false;
} }
Valid(rocket: NDKEvent): boolean { Valid(rocket: NDKEvent): boolean {
//todo: validate zapper pubkey is from a LSP specified in rocket //todo: validate zapper pubkey is from a LSP specified in rocket
let valid = true; let valid = true;
if (!this.ValidAmount(rocket)) { if (!this.ValidAmount(rocket)) {
@@ -411,19 +410,21 @@ export function RocketATagFilter(rocket: NDKEvent): string {
return `31108:${rocket.pubkey}:${rocket.dTag}`; return `31108:${rocket.pubkey}:${rocket.dTag}`;
} }
export async function ValidateZapPublisher(rocket:NDKEvent, zap:NDKEvent):Promise<boolean> { export async function ValidateZapPublisher(rocket: NDKEvent, zap: NDKEvent): Promise<boolean> {
return new Promise((resolve, reject)=>{ return new Promise((resolve, reject) => {
getAuthorizedZapper(rocket).then(pubkey=>{ getAuthorizedZapper(rocket)
if (pubkey == zap.pubkey) { .then((pubkey) => {
resolve(true) if (pubkey == zap.pubkey) {
} else { resolve(true);
reject() } else {
} reject();
}).catch(reject) }
})
.catch(reject);
// let z = new NDKZap({ ndk: rocket.ndk!, zappedEvent: rocket, zappedUser: rocket.author }); // let z = new NDKZap({ ndk: rocket.ndk!, zappedEvent: rocket, zappedUser: rocket.author });
// z.getZapEndpoint().then(x=>{ // z.getZapEndpoint().then(x=>{
// console.log(x) // console.log(x)
// resolve(true) // resolve(true)
// }).catch(()=>{reject(false)}) // }).catch(()=>{reject(false)})
}) });
} }

View File

@@ -1,4 +1,5 @@
import { NDKZap, type NDKEvent } from '@nostr-dev-kit/ndk'; import { NDKZap, NDKEvent, type NDKKind, type NDKTag, type NDKUser } from '@nostr-dev-kit/ndk';
import type NDKSvelte from '@nostr-dev-kit/ndk-svelte';
export function getRocketURL(e: NDKEvent): string { export function getRocketURL(e: NDKEvent): string {
let ignitionID = undefined; let ignitionID = undefined;
@@ -152,12 +153,36 @@ export async function getAuthorizedZapper(rocket: NDKEvent): Promise<string> {
if (url) { if (url) {
url = url.trim().replace('/callback', ''); url = url.trim().replace('/callback', '');
fetch(url).then((result) => { fetch(url).then((result) => {
result.json().then((j) => { result
resolve(j.nostrPubkey); .json()
}).catch(reject); .then((j) => {
resolve(j.nostrPubkey);
})
.catch(reject);
}); });
} else {(reject())} } else {
reject();
}
}) })
.catch(reject); .catch(reject);
}); });
} }
export function prepareNostrEvent(args: {
ndk: NDKSvelte;
author: NDKUser;
kind: NDKKind;
content: string;
tags?: NDKTag[];
}) {
let e = new NDKEvent(args.ndk);
e.author = args.author;
e.kind = args.kind;
e.created_at = Math.floor(new Date().getTime() / 1000);
e.content = args.content;
if (args.tags) {
e.tags = args.tags;
}
console.log(e.rawEvent());
return e;
}