Bring back reports via tagr. Fixes #355

This commit is contained in:
Jon Staab 2024-06-12 13:39:16 -07:00
parent 2f0a5def6f
commit dadf27d058
7 changed files with 66 additions and 43 deletions

BIN
package-lock.json generated

Binary file not shown.

View File

@ -56,10 +56,10 @@
"@getalby/bitcoin-connect": "^3.2.2",
"@scure/base": "^1.1.6",
"@welshman/content": "^0.0.5",
"@welshman/feeds": "^0.0.10",
"@welshman/feeds": "^0.0.11",
"@welshman/lib": "^0.0.9",
"@welshman/net": "^0.0.12",
"@welshman/util": "^0.0.13",
"@welshman/net": "^0.0.13",
"@welshman/util": "^0.0.14",
"classnames": "^2.5.1",
"compressorjs": "^1.2.1",
"date-picker-svelte": "^2.12.0",

View File

@ -221,6 +221,11 @@
entity: asNote,
},
})
router.register("/notes/:entity/report", import("src/app/views/ReportCreate.svelte"), {
serializers: {
entity: asNote,
},
})
router.register("/notes/:entity/thread", import("src/app/views/ThreadDetail.svelte"), {
serializers: {
entity: asNote,

View File

@ -53,6 +53,7 @@
export let showLoading = false
export let showMuted = false
export let showGroup = false
export let showMedia = getSetting("show_media")
export let contextAddress = null
let zapper, unsubZapper
@ -63,7 +64,7 @@
let showMutedReplies = false
let actions = null
let collapsed = depth === 0
let context = repository.query([{'#e': [event.id]}]).filter(e => isChildOf(e, event))
let context = repository.query([{"#e": [event.id]}]).filter(e => isChildOf(e, event))
let showHiddenReplies = anchor === getIdOrAddress(event)
const showEntire = showHiddenReplies
@ -296,7 +297,7 @@
}}>Show</Anchor>
</p>
{:else}
<NoteContent note={event} {showEntire} />
<NoteContent note={event} {showEntire} {showMedia} />
{/if}
<div class="cy-note-click-target h-[2px]" />
<NoteActions

View File

@ -98,6 +98,8 @@
const quote = () => router.at("notes/create").cx({quote: note}).open()
const report = () => router.at("notes").of(note.id).at("report").open()
const react = async content => {
if (isSignedEvent(note)) {
publish({event: note, relays: hints.PublishEvent(note).getUrls()})
@ -208,6 +210,8 @@
} else {
actions.push({label: "Mute", icon: "microphone-slash", onClick: muteNote})
}
actions.push({label: "Report", icon: "triangle-exclamation", onClick: report})
}
if (!$env.FORCE_GROUP && $env.PLATFORM_RELAYS.length === 0 && isSignedEvent(note)) {

View File

@ -1,60 +1,67 @@
<script lang="ts">
import {identity} from "ramda"
import {seconds} from "hurdak"
import {now} from "@welshman/lib"
import {fuzzy} from "src/util/misc"
import {asSignedEvent, createEvent} from "@welshman/util"
import type {SignedEvent} from "@welshman/util"
import {generatePrivateKey} from "src/util/nostr"
import {showInfo} from "src/partials/Toast.svelte"
import Heading from "src/partials/Heading.svelte"
import FlexColumn from "src/partials/FlexColumn.svelte"
import Anchor from "src/partials/Anchor.svelte"
import Field from "src/partials/Field.svelte"
import SearchSelect from "src/partials/SearchSelect.svelte"
import Textarea from "src/partials/Textarea.svelte"
import PersonLink from "src/app/shared/PersonLink.svelte"
import Note from "src/app/shared/Note.svelte"
import {router} from "src/app/util/router"
import {createAndPublish, hints} from "src/engine"
import {repository, nip59, loadPubkeys, publish, hints} from "src/engine"
export let eid
export let pubkey
const searchContentWarnings = fuzzy(["nudity", "profanity", "illegal", "spam", "impersonation"])
const event = repository.getEvent(eid)
const submit = () => {
const tags = [
["p", pubkey],
["expiration", String(now() + seconds(7, "day"))],
]
const tagr = "56d4b3d6310fadb7294b7f041aab469c5ffc8991b1b1b331981b96a246f6ae65"
if (flags.length > 0) {
for (const flag of flags) {
tags.push(["e", eid, flag])
}
}
const submit = async () => {
const content = JSON.stringify({
reporterText: message,
reportedEvent: asSignedEvent(event as SignedEvent),
})
const template = createEvent(1, {content})
const rumor = await $nip59.wrap(template, {
author: generatePrivateKey(),
wrap: {
author: generatePrivateKey(),
recipient: tagr,
},
})
publish({
event: rumor.wrap,
relays: hints
.merge([hints.fromRelays(["wss://relay.nos.social"]), hints.PublishMessage(tagr)])
.getUrls(),
forcePlatform: false,
})
createAndPublish({kind: 1984, tags, relays: hints.WriteRelays().getUrls()})
showInfo("Your report has been sent!")
router.pop()
}
let flags = []
let message = ""
loadPubkeys([tagr])
</script>
<form on:submit|preventDefault={submit}>
<FlexColumn>
<Heading class="text-center">File a Report</Heading>
<div class="flex w-full flex-col gap-8">
<Field label="Content Warnings">
<SearchSelect
multiple
autofocus
search={searchContentWarnings}
bind:value={flags}
termToItem={identity}>
<div slot="item" let:item>
<strong>{item}</strong>
</div>
</SearchSelect>
<div slot="info">Flag this content as sensitive so other people can avoid it.</div>
</Field>
<Anchor button tag="button" type="submit">Save</Anchor>
</div>
<Field label="Why are you reporting this content?">
<Textarea bind:value={message} />
<div slot="info">
Reports are sent to <PersonLink pubkey={tagr} /> for review. No identifying information is included
with the report.
</div>
</Field>
<Note note={event} showMedia={false} />
<Anchor button tag="button" type="submit">Save</Anchor>
</FlexColumn>
</form>

View File

@ -295,6 +295,10 @@ export const ensureMessagePlaintext = async (e: TrustedEvent) => {
return getPlaintext(e)
}
export const canUnwrap = (event: TrustedEvent) =>
isGiftWrap(event) &&
(getSession(Tags.fromEvent(event).get("p")?.value()) || getRecipientKey(event))
export const ensureUnwrapped = async (event: TrustedEvent) => {
if (!isGiftWrap(event)) {
return event
@ -1588,10 +1592,12 @@ export const publish = ({forcePlatform = true, ...request}: MyPublishRequest) =>
const pub = basePublish(request)
// Add the event to projections
ensureUnwrapped(request.event).then(projections.push)
if (canUnwrap(request.event)) {
ensureUnwrapped(request.event).then(projections.push)
}
// Listen to updates and update our publish queue
if (isGiftWrap(request.event) || request.event.pubkey === pubkey.get()) {
if (canUnwrap(request.event) || request.event.pubkey === pubkey.get()) {
const pubInfo = omit(["emitter", "result"], pub)
pub.emitter.on("*", t => publishes.key(pubInfo.id).set(pubInfo))