problem: pubkeys without votepwoer can vote

This commit is contained in:
gsovereignty
2024-07-15 12:27:49 +08:00
parent a412c8ef12
commit 1fa7217674
4 changed files with 59 additions and 12 deletions

View File

@@ -10,11 +10,12 @@
import { Separator } from '$lib/components/ui/separator/index.js'; import { Separator } from '$lib/components/ui/separator/index.js';
import * as Table from '@/components/ui/table'; import * as Table from '@/components/ui/table';
import { RocketATagFilter } from '@/event_helpers/rockets'; import { Rocket, RocketATagFilter } from '@/event_helpers/rockets';
import { derived } from 'svelte/store'; import { derived } from 'svelte/store';
import { goto } from '$app/navigation'; import { goto } from '$app/navigation';
import { base } from '$app/paths'; import { base } from '$app/paths';
import { unixToRelativeTime } from '@/helpers'; import { unixToRelativeTime } from '@/helpers';
import RocketCard from './RocketCard.svelte';
export let merit: MeritRequest; export let merit: MeritRequest;
export let rocket: NDKEvent; export let rocket: NDKEvent;
@@ -30,7 +31,7 @@
let vMap = new Map<string, Vote>(); let vMap = new Map<string, Vote>();
for (let v of $_votes) { for (let v of $_votes) {
let vote = new Vote(v); let vote = new Vote(v);
if (vote.BasicValidation()) { if (vote.BasicValidation() && vote.ValidateAgainstRocket(new Rocket(rocket))) {
vMap.set(vote.ID, vote); vMap.set(vote.ID, vote);
} }
} }
@@ -107,7 +108,7 @@
console.log(vote.Event.rawEvent()); console.log(vote.Event.rawEvent());
goto(`${base}/rockets/merits/${vote.ID}`); goto(`${base}/rockets/merits/${vote.ID}`);
}} }}
class="cursor-pointer {vote.VoteDirection == "ratify"?"bg-lime-600":"bg-red-700"} " class="cursor-pointer {vote.VoteDirection == "ratify"?"bg-lime-600":"bg-red-700"} {vote.VoteDirection == "ratify"?"hover:bg-lime-700":"hover:bg-red-800"}"
> >
<Table.Cell> <Table.Cell>
<div class="flex flex-nowrap"> <div class="flex flex-nowrap">
@@ -135,6 +136,6 @@
> >
</Card.Header> </Card.Header>
<Card.Footer class="flex flex-row items-center border-t px-6 py-3"> <Card.Footer class="flex flex-row items-center border-t px-6 py-3">
<VoteOnMeritRequest {merit} {rocket} /> <VoteOnMeritRequest {merit} rocket={new Rocket(rocket)} />
</Card.Footer> </Card.Footer>
</Card.Root> </Card.Root>

View File

@@ -1,14 +1,16 @@
<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 } from '@/event_helpers/merits';
import type { Rocket } from '@/event_helpers/rockets';
import { ndk } from '@/ndk';
import { currentUser } from '@/stores/session'; import { currentUser } from '@/stores/session';
import { NDKEvent } from '@nostr-dev-kit/ndk'; 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';
import { ndk } from '@/ndk';
export let merit: MeritRequest; export let merit: MeritRequest;
export let rocket: NDKEvent; export let rocket: Rocket;
function publish(ndk: NDKSvelte, direction: string) { function publish(ndk: NDKSvelte, direction: string) {
if (!ndk.signer) { if (!ndk.signer) {
@@ -22,7 +24,7 @@
e.author = author; e.author = author;
e.kind = 1410; e.kind = 1410;
e.created_at = Math.floor(new Date().getTime() / 1000); e.created_at = Math.floor(new Date().getTime() / 1000);
e.tags.push(['a', `31108:${rocket.pubkey}:${rocket.dTag}`]); e.tags.push(['a', `31108:${rocket.Event.pubkey}:${rocket.Event.dTag}`]);
e.tags.push(['request', merit.ID]); e.tags.push(['request', merit.ID]);
e.tags.push(['e', merit.ID]); e.tags.push(['e', merit.ID]);
e.tags.push(['p', merit.Pubkey]); e.tags.push(['p', merit.Pubkey]);
@@ -32,6 +34,16 @@
console.log(x); console.log(x);
}); });
} }
$:currentUserHasVotepower = false;
$:{
if (currentUser && $currentUser) {
currentUserHasVotepower = (rocket.VotePowerForPubkey($currentUser.pubkey) > 0)
}
}
</script> </script>
{#if $currentUser} {#if $currentUser}
@@ -39,14 +51,23 @@
variant="default" variant="default"
class="m-2" class="m-2"
on:click={() => { on:click={() => {
publish($ndk, 'ratify'); if (currentUserHasVotepower) {
publish($ndk, 'ratify');
} else {
alert(`Your pubkey does not have votepower in ${rocket.Name()}`)
}
}}>Vote to Approve</Button }}>Vote to Approve</Button
> >
<Button <Button
variant="destructive" variant="destructive"
class="m-2" class="m-2"
on:click={() => { on:click={() => {
publish($ndk, 'ratify'); if (currentUserHasVotepower) {
publish($ndk, 'blackball');
} else {
alert(`Your pubkey does not have votepower in ${rocket.Name()}`)
}
}}>Vote to Reject</Button }}>Vote to Reject</Button
> >
{:else} {:else}

View File

@@ -1,5 +1,5 @@
import type { NDKEvent, NDKFilter, NDKTag } from '@nostr-dev-kit/ndk'; import type { NDKEvent, NDKFilter, NDKTag } from '@nostr-dev-kit/ndk';
import { getNumberFromTag, isValidUrl } from './rockets'; import { Rocket, getNumberFromTag, isValidUrl } from './rockets';
export class MeritRequest { export class MeritRequest {
ID: string; ID: string;
@@ -30,7 +30,7 @@ export class MeritRequest {
} }
return _solution; return _solution;
} }
IncludedInRocketState(rocket: NDKEvent): boolean { IncludedInRocketState(rocket: Rocket): boolean {
return true; return true;
} }
BasicValidation(): boolean { BasicValidation(): boolean {
@@ -105,6 +105,13 @@ export class Vote {
} }
return valid; return valid;
} }
ValidateAgainstRocket(rocket:Rocket):boolean {
let valid = true;
if (!(rocket.VotePowerForPubkey(this.Pubkey) > 0)) {
valid = false
}
return valid
}
RocketTag(): NDKTag | undefined { RocketTag(): NDKTag | undefined {
let tag: NDKTag | undefined = undefined; let tag: NDKTag | undefined = undefined;
if (this.BasicValidation()) { if (this.BasicValidation()) {

View File

@@ -1,4 +1,22 @@
import { NDKEvent, type NDKFilter, type NDKTag } from '@nostr-dev-kit/ndk'; import { NDKEvent, type NDKTag } from '@nostr-dev-kit/ndk';
export class Rocket {
Event: NDKEvent;
Name():string {
return this.Event.dTag!
}
VotePowerForPubkey(pubkey:string):number {
let votepower = 0
if (this.Event.pubkey == pubkey) {
//todo: calculate votepower for pubkey based on approved merit requests
votepower++
}
return votepower
}
constructor(event:NDKEvent) {
this.Event = event;
}
}
export class RocketProduct { export class RocketProduct {
ID: string; ID: string;