mirror of
https://github.com/aljazceru/hypergolic.git
synced 2025-12-18 22:14:21 +01:00
problem: no voting notification for merit request
solution: after voting, also send a kind 1 event
This commit is contained in:
@@ -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);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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: ''
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|||||||
@@ -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)})
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user