problem: duplicate tags

This commit is contained in:
gsovereignty
2024-07-17 14:13:46 +08:00
parent adb4effe78
commit d7c56d182a
3 changed files with 53 additions and 12 deletions

View File

@@ -25,7 +25,6 @@
if (!$ndk.signer) { if (!$ndk.signer) {
throw new Error('no ndk signer found'); throw new Error('no ndk signer found');
} }
rocket.ndk = $ndk;
let author = $currentUser; let author = $currentUser;
if (!author) { if (!author) {
throw new Error('no current user'); throw new Error('no current user');
@@ -35,10 +34,11 @@
throw new Error('you are not the creator of this rocket'); throw new Error('you are not the creator of this rocket');
} }
let event = parsedRocket.UpsertProduct(product.id, price, max); let event = parsedRocket.UpsertProduct(product.id, price, max);
event.ndk = $ndk
event.publish().then((x) => { event.publish().then((x) => {
console.log(x); console.log(x);
goto(`${base}/products`); goto(`${base}/products`);
}); }).catch(()=>{ console.log("failed to publish", event.rawEvent())});
} }
</script> </script>

View File

@@ -1,15 +1,15 @@
<script lang="ts"> <script lang="ts">
import * as Breadcrumb from '$lib/components/ui/breadcrumb/index.js'; import * as Breadcrumb from '$lib/components/ui/breadcrumb/index.js';
import Button from '@/components/ui/button/button.svelte';
import * as Card from '@/components/ui/card'; import * as Card from '@/components/ui/card';
import type { NDKEvent } from '@nostr-dev-kit/ndk'; import type { NDKEvent } from '@nostr-dev-kit/ndk';
import CreateMeritRequest from './CreateMeritRequest.svelte'; import CreateMeritRequest from './CreateMeritRequest.svelte';
import CreateNewProduct from './CreateNewProduct.svelte'; import CreateNewProduct from './CreateNewProduct.svelte';
import MeritRequests from './MeritRequests.svelte';
import MeritsAndSatflow from './MeritsAndSatflow.svelte'; import MeritsAndSatflow from './MeritsAndSatflow.svelte';
import ProductFomo from './ProductFomo.svelte'; import ProductFomo from './ProductFomo.svelte';
import ProposedProducts from './ProposedProducts.svelte'; import ProposedProducts from './ProposedProducts.svelte';
import Todo from './Todo.svelte'; import Todo from './Todo.svelte';
import MeritRequests from './MeritRequests.svelte';
import Button from '@/components/ui/button/button.svelte';
export let rocket: NDKEvent; export let rocket: NDKEvent;
</script> </script>

View File

@@ -71,7 +71,7 @@ export class Rocket {
let hasInvalidSig = false; let hasInvalidSig = false;
if (request && request.Event && request.Event.sig && votes.Votes.length > 0) { if (request && request.Event && request.Event.sig && votes.Votes.length > 0) {
if (!request.Event.verifySignature(true)) { if (!request.Event.verifySignature(true)) {
hasInvalidSig = true hasInvalidSig = true;
} }
for (let v of votes.Votes) { for (let v of votes.Votes) {
if (!(v.Event.sig && v.Event.verifySignature(true))) { if (!(v.Event.sig && v.Event.verifySignature(true))) {
@@ -90,11 +90,11 @@ export class Rocket {
} }
} }
return proof; return proof;
//add the AMR to the rocket event, and also add a proof
} }
UpsertAMR(request: MeritRequest, signedProof: NDKEvent): NDKEvent | undefined { UpsertAMR(request: MeritRequest, signedProof: NDKEvent): NDKEvent | undefined {
let event: NDKEvent | undefined = undefined; let event: NDKEvent | undefined = undefined;
if (this.ValidateAMRProof(signedProof)) { if (this.ValidateAMRProof(signedProof)) {
this.PrepareForUpdate();
event = new NDKEvent(this.Event.ndk, this.Event.rawEvent()); event = new NDKEvent(this.Event.ndk, this.Event.rawEvent());
event.created_at = Math.floor(new Date().getTime() / 1000); event.created_at = Math.floor(new Date().getTime() / 1000);
event.tags.push(['merit', `${request.Pubkey}:${request.ID}:0:0:${request.Merits}`]); event.tags.push(['merit', `${request.Pubkey}:${request.ID}:0:0:${request.Merits}`]);
@@ -103,12 +103,8 @@ export class Rocket {
} }
return event; return event;
} }
// ApprovedMeritRequests():Map<string, MeritRequest> {
// let amr = new Map<string, MeritRequest>()
// return amr
// }
UpsertProduct(id: string, price: number, maxSales?: number): NDKEvent { UpsertProduct(id: string, price: number, maxSales?: number): NDKEvent {
this.PrepareForUpdate();
let event = new NDKEvent(this.Event.ndk, this.Event.rawEvent()); let event = new NDKEvent(this.Event.ndk, this.Event.rawEvent());
event.created_at = Math.floor(new Date().getTime() / 1000); event.created_at = Math.floor(new Date().getTime() / 1000);
let existingProducts = this.CurrentProducts(); let existingProducts = this.CurrentProducts();
@@ -129,7 +125,52 @@ export class Rocket {
CurrentProducts(): Map<string, RocketProduct> { CurrentProducts(): Map<string, RocketProduct> {
return getMapOfProductsFromRocket(this.Event); return getMapOfProductsFromRocket(this.Event);
} }
RemoveDuplicateTags() {
function iterate(event: NDKEvent): NDKEvent {
let purged = 0;
for (let i = 0; i < event.tags.length; i++) {
for (let j = i + 1; j < event.tags.length; j++) {
// quick elimination by comparing sub-array lengths
if (event.tags[i].length !== event.tags[j].length) {
continue;
}
// look for dupes
var dupe = true;
for (var k = 0; k < event.tags[i].length; k++) {
if (event.tags[i][k] !== event.tags[j][k]) {
dupe = false;
break;
}
}
// if a dupe then remove it
if (dupe) {
purged++;
event.tags.splice(j, 1);
}
}
}
if (purged > 0) {
return iterate(event);
} else {
return event;
}
}
this.Event = iterate(this.Event);
}
RemoveProofs() {
let newTags: NDKTag[] = [];
for (let t of this.Event.tags) {
if (!t[0].includes('proof') && t[0] != 'client') {
newTags.push(t);
}
}
this.Event.tags = newTags;
}
PrepareForUpdate() {
this.RemoveDuplicateTags();
this.RemoveProofs();
this.Event.sig = undefined
}
constructor(event: NDKEvent) { constructor(event: NDKEvent) {
this.Event = event; this.Event = event;
} }