feat: nip-89
This commit is contained in:
@ -44,7 +44,7 @@ Snort supports the following NIP's:
|
|||||||
- [x] NIP-65: Relay List Metadata
|
- [x] NIP-65: Relay List Metadata
|
||||||
- [x] NIP-75: Zap Goals
|
- [x] NIP-75: Zap Goals
|
||||||
- [x] NIP-78: App specific data
|
- [x] NIP-78: App specific data
|
||||||
- [ ] NIP-89: App handlers
|
- [x] NIP-89: App handlers
|
||||||
- [x] NIP-94: File Metadata
|
- [x] NIP-94: File Metadata
|
||||||
- [x] NIP-96: HTTP File Storage Integration (Draft)
|
- [x] NIP-96: HTTP File Storage Integration (Draft)
|
||||||
- [x] NIP-98: HTTP Auth
|
- [x] NIP-98: HTTP Auth
|
||||||
|
@ -24,6 +24,7 @@ import { NoteProps } from "../EventComponent";
|
|||||||
import HiddenNote from "../HiddenNote";
|
import HiddenNote from "../HiddenNote";
|
||||||
import Poll from "../Poll";
|
import Poll from "../Poll";
|
||||||
import NoteFooter from "./NoteFooter/NoteFooter";
|
import NoteFooter from "./NoteFooter/NoteFooter";
|
||||||
|
import NoteAppHandler from "./NoteAppHandler";
|
||||||
|
|
||||||
const defaultOptions = {
|
const defaultOptions = {
|
||||||
showHeader: true,
|
showHeader: true,
|
||||||
@ -169,22 +170,9 @@ function Reaction({ ev }: { ev: TaggedNostrEvent }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function handleNonTextNote(ev: TaggedNostrEvent) {
|
function handleNonTextNote(ev: TaggedNostrEvent) {
|
||||||
const alt = findTag(ev, "alt");
|
if (ev.kind === EventKind.Reaction) {
|
||||||
if (alt) {
|
|
||||||
return (
|
|
||||||
<div className="note-quote">
|
|
||||||
<Text id={ev.id} content={alt} tags={[]} creator={ev.pubkey} />
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
} else if (ev.kind === EventKind.Reaction) {
|
|
||||||
return <Reaction ev={ev} />;
|
return <Reaction ev={ev} />;
|
||||||
} else {
|
} else {
|
||||||
return (
|
return <NoteAppHandler ev={ev} />;
|
||||||
<div className="card">
|
|
||||||
<CollapsedSection title={<FormattedMessage {...messages.UnknownEventKind} values={{ kind: ev.kind }} />}>
|
|
||||||
<pre className="text-xs">{JSON.stringify(ev, undefined, " ")}</pre>
|
|
||||||
</CollapsedSection>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
44
packages/app/src/Components/Event/Note/NoteAppHandler.tsx
Normal file
44
packages/app/src/Components/Event/Note/NoteAppHandler.tsx
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import { mapEventToProfile, NostrLink, TaggedNostrEvent } from "@snort/system";
|
||||||
|
import { FormattedMessage } from "react-intl";
|
||||||
|
|
||||||
|
import Icon from "@/Components/Icons/Icon";
|
||||||
|
import Avatar from "@/Components/User/Avatar";
|
||||||
|
import DisplayName from "@/Components/User/DisplayName";
|
||||||
|
import useAppHandler from "@/Hooks/useAppHandler";
|
||||||
|
|
||||||
|
export default function NoteAppHandler({ ev }: { ev: TaggedNostrEvent }) {
|
||||||
|
const handlers = useAppHandler(ev.kind);
|
||||||
|
const link = NostrLink.fromEvent(ev);
|
||||||
|
|
||||||
|
const profiles = handlers.apps
|
||||||
|
.map(a => ({ profile: mapEventToProfile(a), event: a }))
|
||||||
|
.filter(a => a.profile)
|
||||||
|
.slice(0, 5);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="card flex flex-col gap-2">
|
||||||
|
<small>
|
||||||
|
<FormattedMessage defaultMessage="Sorry, we dont understand this event kind, please try one of the following apps instead!" />
|
||||||
|
</small>
|
||||||
|
{profiles.map(a => (
|
||||||
|
<div className="flex justify-between items-center" key={a.event.id}>
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<Avatar size={40} pubkey={a.event.pubkey} user={a.profile} />
|
||||||
|
<div>
|
||||||
|
<DisplayName pubkey={a.event.pubkey} user={a.profile} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Icon
|
||||||
|
name="link"
|
||||||
|
onClick={() => {
|
||||||
|
const webHandler = a.event.tags.find(a => a[0] === "web" && a[2] === "nevent")?.[1];
|
||||||
|
if (webHandler) {
|
||||||
|
window.open(webHandler.replace("<bech32>", link.encode()), "_blank");
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
@ -12,9 +12,9 @@ interface DisplayNameProps {
|
|||||||
user?: UserMetadata | undefined;
|
user?: UserMetadata | undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
const DisplayName = ({ pubkey }: DisplayNameProps) => {
|
const DisplayName = ({ pubkey, user }: DisplayNameProps) => {
|
||||||
const profile = useUserProfile(pubkey);
|
const profile = useUserProfile(user ? undefined : pubkey);
|
||||||
const [name, isPlaceHolder] = useMemo(() => getDisplayNameOrPlaceHolder(profile, pubkey), [profile, pubkey]);
|
const [name, isPlaceHolder] = useMemo(() => getDisplayNameOrPlaceHolder(profile ?? user, pubkey), [profile, pubkey]);
|
||||||
|
|
||||||
return <span className={classNames({ placeholder: isPlaceHolder })}>{name}</span>;
|
return <span className={classNames({ placeholder: isPlaceHolder })}>{name}</span>;
|
||||||
};
|
};
|
||||||
|
31
packages/app/src/Hooks/useAppHandler.ts
Normal file
31
packages/app/src/Hooks/useAppHandler.ts
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import { EventKind, NostrLink, RequestBuilder } from "@snort/system";
|
||||||
|
import { useRequestBuilder } from "@snort/system-react";
|
||||||
|
|
||||||
|
import useFollowsControls from "./useFollowControls";
|
||||||
|
|
||||||
|
export default function useAppHandler(kind: EventKind) {
|
||||||
|
const { followList } = useFollowsControls();
|
||||||
|
|
||||||
|
const sub = new RequestBuilder(`app-handler:${kind}`);
|
||||||
|
sub
|
||||||
|
.withFilter()
|
||||||
|
.kinds([31990 as EventKind])
|
||||||
|
.tag("k", [kind.toString()]);
|
||||||
|
|
||||||
|
const dataApps = useRequestBuilder(sub);
|
||||||
|
|
||||||
|
const reccomendsSub = new RequestBuilder(`app-handler:${kind}:recommends`);
|
||||||
|
if (dataApps.length > 0 && followList.length > 0) {
|
||||||
|
reccomendsSub
|
||||||
|
.withFilter()
|
||||||
|
.kinds([31989 as EventKind])
|
||||||
|
.replyToLink(dataApps.map(a => NostrLink.fromEvent(a)))
|
||||||
|
.authors(followList);
|
||||||
|
}
|
||||||
|
|
||||||
|
const dataRecommends = useRequestBuilder(reccomendsSub);
|
||||||
|
return {
|
||||||
|
reccomends: dataRecommends,
|
||||||
|
apps: dataApps,
|
||||||
|
};
|
||||||
|
}
|
@ -1106,6 +1106,9 @@
|
|||||||
"TwyMau": {
|
"TwyMau": {
|
||||||
"defaultMessage": "Account"
|
"defaultMessage": "Account"
|
||||||
},
|
},
|
||||||
|
"TzeMlV": {
|
||||||
|
"defaultMessage": "Sorry, we dont understand this event kind, please try one of the following apps instead!"
|
||||||
|
},
|
||||||
"U1aPPi": {
|
"U1aPPi": {
|
||||||
"defaultMessage": "Stop listening"
|
"defaultMessage": "Stop listening"
|
||||||
},
|
},
|
||||||
|
@ -366,6 +366,7 @@
|
|||||||
"Tpy00S": "People",
|
"Tpy00S": "People",
|
||||||
"TvKqBp": "liked",
|
"TvKqBp": "liked",
|
||||||
"TwyMau": "Account",
|
"TwyMau": "Account",
|
||||||
|
"TzeMlV": "Sorry, we dont understand this event kind, please try one of the following apps instead!",
|
||||||
"U1aPPi": "Stop listening",
|
"U1aPPi": "Stop listening",
|
||||||
"UJTWqI": "Remove from my relays",
|
"UJTWqI": "Remove from my relays",
|
||||||
"ULXFfP": "Receive",
|
"ULXFfP": "Receive",
|
||||||
|
26
packages/system-wasm/Cargo.lock
generated
26
packages/system-wasm/Cargo.lock
generated
@ -346,9 +346,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itertools"
|
name = "itertools"
|
||||||
version = "0.11.0"
|
version = "0.13.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
|
checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"either",
|
"either",
|
||||||
]
|
]
|
||||||
@ -607,36 +607,36 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "secp256k1"
|
name = "secp256k1"
|
||||||
version = "0.28.0"
|
version = "0.29.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2acea373acb8c21ecb5a23741452acd2593ed44ee3d343e72baaa143bc89d0d5"
|
checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"secp256k1-sys",
|
"secp256k1-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "secp256k1-sys"
|
name = "secp256k1-sys"
|
||||||
version = "0.9.1"
|
version = "0.10.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4dd97a086ec737e30053fd5c46f097465d25bb81dd3608825f65298c4c98be83"
|
checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.188"
|
version = "1.0.193"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e"
|
checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde-wasm-bindgen"
|
name = "serde-wasm-bindgen"
|
||||||
version = "0.5.0"
|
version = "0.6.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f3b143e2833c57ab9ad3ea280d21fd34e285a42837aeb0ee301f4f41890fa00e"
|
checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"serde",
|
"serde",
|
||||||
@ -645,9 +645,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.188"
|
version = "1.0.193"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"
|
checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@ -706,7 +706,7 @@ dependencies = [
|
|||||||
"console_error_panic_hook",
|
"console_error_panic_hook",
|
||||||
"criterion",
|
"criterion",
|
||||||
"hex",
|
"hex",
|
||||||
"itertools 0.11.0",
|
"itertools 0.13.0",
|
||||||
"rand",
|
"rand",
|
||||||
"secp256k1",
|
"secp256k1",
|
||||||
"serde",
|
"serde",
|
||||||
|
@ -10,10 +10,10 @@ crate-type = ["cdylib", "rlib"]
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
console_error_panic_hook = "0.1.7"
|
console_error_panic_hook = "0.1.7"
|
||||||
hex = { version = "0.4.3", features = [], default-features = false }
|
hex = { version = "0.4.3", features = [], default-features = false }
|
||||||
itertools = "0.11.0"
|
itertools = "0.13.0"
|
||||||
secp256k1 = { version = "0.28.0", features = ["global-context"] }
|
secp256k1 = { version = "0.29.0", features = ["global-context"] }
|
||||||
serde = { version = "1.0.188", features = ["derive"], default-features = false }
|
serde = { version = "1.0.188", features = ["derive"], default-features = false }
|
||||||
serde-wasm-bindgen = "0.5.0"
|
serde-wasm-bindgen = "0.6.5"
|
||||||
serde_json = "1.0.105"
|
serde_json = "1.0.105"
|
||||||
sha256 = { version = "1.4.0", features = [], default-features = false }
|
sha256 = { version = "1.4.0", features = [], default-features = false }
|
||||||
wasm-bindgen = "0.2.87"
|
wasm-bindgen = "0.2.87"
|
||||||
|
8
packages/system-wasm/pkg/system_wasm.d.ts
vendored
8
packages/system-wasm/pkg/system_wasm.d.ts
vendored
@ -58,10 +58,10 @@ export interface InitOutput {
|
|||||||
readonly pow: (a: number, b: number, c: number) => void;
|
readonly pow: (a: number, b: number, c: number) => void;
|
||||||
readonly schnorr_verify: (a: number, b: number, c: number, d: number) => void;
|
readonly schnorr_verify: (a: number, b: number, c: number, d: number) => void;
|
||||||
readonly schnorr_verify_event: (a: number, b: number) => void;
|
readonly schnorr_verify_event: (a: number, b: number) => void;
|
||||||
readonly rustsecp256k1_v0_9_1_context_create: (a: number) => number;
|
readonly rustsecp256k1_v0_10_0_context_create: (a: number) => number;
|
||||||
readonly rustsecp256k1_v0_9_1_context_destroy: (a: number) => void;
|
readonly rustsecp256k1_v0_10_0_context_destroy: (a: number) => void;
|
||||||
readonly rustsecp256k1_v0_9_1_default_illegal_callback_fn: (a: number, b: number) => void;
|
readonly rustsecp256k1_v0_10_0_default_illegal_callback_fn: (a: number, b: number) => void;
|
||||||
readonly rustsecp256k1_v0_9_1_default_error_callback_fn: (a: number, b: number) => void;
|
readonly rustsecp256k1_v0_10_0_default_error_callback_fn: (a: number, b: number) => void;
|
||||||
readonly __wbindgen_malloc: (a: number, b: number) => number;
|
readonly __wbindgen_malloc: (a: number, b: number) => number;
|
||||||
readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
|
readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
|
||||||
readonly __wbindgen_add_to_stack_pointer: (a: number) => number;
|
readonly __wbindgen_add_to_stack_pointer: (a: number) => number;
|
||||||
|
@ -463,6 +463,14 @@ function __wbg_get_imports() {
|
|||||||
const ret = new Error(getStringFromWasm0(arg0, arg1));
|
const ret = new Error(getStringFromWasm0(arg0, arg1));
|
||||||
return addHeapObject(ret);
|
return addHeapObject(ret);
|
||||||
};
|
};
|
||||||
|
imports.wbg.__wbindgen_number_new = function (arg0) {
|
||||||
|
const ret = arg0;
|
||||||
|
return addHeapObject(ret);
|
||||||
|
};
|
||||||
|
imports.wbg.__wbindgen_string_new = function (arg0, arg1) {
|
||||||
|
const ret = getStringFromWasm0(arg0, arg1);
|
||||||
|
return addHeapObject(ret);
|
||||||
|
};
|
||||||
imports.wbg.__wbindgen_jsval_loose_eq = function (arg0, arg1) {
|
imports.wbg.__wbindgen_jsval_loose_eq = function (arg0, arg1) {
|
||||||
const ret = getObject(arg0) == getObject(arg1);
|
const ret = getObject(arg0) == getObject(arg1);
|
||||||
return ret;
|
return ret;
|
||||||
@ -478,23 +486,19 @@ function __wbg_get_imports() {
|
|||||||
getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret;
|
getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret;
|
||||||
getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret);
|
getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret);
|
||||||
};
|
};
|
||||||
imports.wbg.__wbindgen_number_new = function (arg0) {
|
imports.wbg.__wbindgen_as_number = function (arg0) {
|
||||||
const ret = arg0;
|
const ret = +getObject(arg0);
|
||||||
return addHeapObject(ret);
|
return ret;
|
||||||
};
|
};
|
||||||
imports.wbg.__wbindgen_object_clone_ref = function (arg0) {
|
imports.wbg.__wbindgen_object_clone_ref = function (arg0) {
|
||||||
const ret = getObject(arg0);
|
const ret = getObject(arg0);
|
||||||
return addHeapObject(ret);
|
return addHeapObject(ret);
|
||||||
};
|
};
|
||||||
imports.wbg.__wbindgen_string_new = function (arg0, arg1) {
|
imports.wbg.__wbg_getwithrefkey_edc2c8960f0f1191 = function (arg0, arg1) {
|
||||||
const ret = getStringFromWasm0(arg0, arg1);
|
|
||||||
return addHeapObject(ret);
|
|
||||||
};
|
|
||||||
imports.wbg.__wbg_getwithrefkey_5e6d9547403deab8 = function (arg0, arg1) {
|
|
||||||
const ret = getObject(arg0)[getObject(arg1)];
|
const ret = getObject(arg0)[getObject(arg1)];
|
||||||
return addHeapObject(ret);
|
return addHeapObject(ret);
|
||||||
};
|
};
|
||||||
imports.wbg.__wbg_set_841ac57cff3d672b = function (arg0, arg1, arg2) {
|
imports.wbg.__wbg_set_f975102236d3c502 = function (arg0, arg1, arg2) {
|
||||||
getObject(arg0)[takeObject(arg1)] = takeObject(arg2);
|
getObject(arg0)[takeObject(arg1)] = takeObject(arg2);
|
||||||
};
|
};
|
||||||
imports.wbg.__wbg_get_44be0491f933a435 = function (arg0, arg1) {
|
imports.wbg.__wbg_get_44be0491f933a435 = function (arg0, arg1) {
|
||||||
|
Binary file not shown.
@ -9,10 +9,10 @@ export function compress(a: number, b: number): void;
|
|||||||
export function pow(a: number, b: number, c: number): void;
|
export function pow(a: number, b: number, c: number): void;
|
||||||
export function schnorr_verify(a: number, b: number, c: number, d: number): void;
|
export function schnorr_verify(a: number, b: number, c: number, d: number): void;
|
||||||
export function schnorr_verify_event(a: number, b: number): void;
|
export function schnorr_verify_event(a: number, b: number): void;
|
||||||
export function rustsecp256k1_v0_9_1_context_create(a: number): number;
|
export function rustsecp256k1_v0_10_0_context_create(a: number): number;
|
||||||
export function rustsecp256k1_v0_9_1_context_destroy(a: number): void;
|
export function rustsecp256k1_v0_10_0_context_destroy(a: number): void;
|
||||||
export function rustsecp256k1_v0_9_1_default_illegal_callback_fn(a: number, b: number): void;
|
export function rustsecp256k1_v0_10_0_default_illegal_callback_fn(a: number, b: number): void;
|
||||||
export function rustsecp256k1_v0_9_1_default_error_callback_fn(a: number, b: number): void;
|
export function rustsecp256k1_v0_10_0_default_error_callback_fn(a: number, b: number): void;
|
||||||
export function __wbindgen_malloc(a: number, b: number): number;
|
export function __wbindgen_malloc(a: number, b: number): number;
|
||||||
export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number;
|
export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number;
|
||||||
export function __wbindgen_add_to_stack_pointer(a: number): number;
|
export function __wbindgen_add_to_stack_pointer(a: number): number;
|
||||||
|
@ -34,6 +34,8 @@ pub struct ReqFilter {
|
|||||||
pub a_tag: Option<HashSet<String>>,
|
pub a_tag: Option<HashSet<String>>,
|
||||||
#[serde(rename = "#g", skip_serializing_if = "Option::is_none")]
|
#[serde(rename = "#g", skip_serializing_if = "Option::is_none")]
|
||||||
pub g_tag: Option<HashSet<String>>,
|
pub g_tag: Option<HashSet<String>>,
|
||||||
|
#[serde(rename = "#k", skip_serializing_if = "Option::is_none")]
|
||||||
|
pub k_tag: Option<HashSet<String>>,
|
||||||
#[serde(rename = "relays", skip_serializing_if = "Option::is_none")]
|
#[serde(rename = "relays", skip_serializing_if = "Option::is_none")]
|
||||||
pub relays: Option<HashSet<String>>,
|
pub relays: Option<HashSet<String>>,
|
||||||
#[serde(rename = "search", skip_serializing_if = "Option::is_none")]
|
#[serde(rename = "search", skip_serializing_if = "Option::is_none")]
|
||||||
@ -75,6 +77,8 @@ pub struct FlatReqFilter {
|
|||||||
pub a_tag: Option<String>,
|
pub a_tag: Option<String>,
|
||||||
#[serde(rename = "#g", skip_serializing_if = "Option::is_none")]
|
#[serde(rename = "#g", skip_serializing_if = "Option::is_none")]
|
||||||
pub g_tag: Option<String>,
|
pub g_tag: Option<String>,
|
||||||
|
#[serde(rename = "#k", skip_serializing_if = "Option::is_none")]
|
||||||
|
pub k_tag: Option<String>,
|
||||||
#[serde(rename = "search", skip_serializing_if = "Option::is_none")]
|
#[serde(rename = "search", skip_serializing_if = "Option::is_none")]
|
||||||
pub search: Option<String>,
|
pub search: Option<String>,
|
||||||
#[serde(rename = "relay", skip_serializing_if = "Option::is_none")]
|
#[serde(rename = "relay", skip_serializing_if = "Option::is_none")]
|
||||||
@ -129,6 +133,7 @@ impl Distance for FlatReqFilter {
|
|||||||
ret += prop_dist(&self.r_tag, &b.r_tag);
|
ret += prop_dist(&self.r_tag, &b.r_tag);
|
||||||
ret += prop_dist(&self.t_tag, &b.t_tag);
|
ret += prop_dist(&self.t_tag, &b.t_tag);
|
||||||
ret += prop_dist(&self.g_tag, &b.g_tag);
|
ret += prop_dist(&self.g_tag, &b.g_tag);
|
||||||
|
ret += prop_dist(&self.k_tag, &b.k_tag);
|
||||||
|
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
@ -163,6 +168,7 @@ impl From<Vec<&FlatReqFilter>> for ReqFilter {
|
|||||||
array_prop_append(&x.r_tag, &mut acc.r_tag);
|
array_prop_append(&x.r_tag, &mut acc.r_tag);
|
||||||
array_prop_append(&x.a_tag, &mut acc.a_tag);
|
array_prop_append(&x.a_tag, &mut acc.a_tag);
|
||||||
array_prop_append(&x.g_tag, &mut acc.g_tag);
|
array_prop_append(&x.g_tag, &mut acc.g_tag);
|
||||||
|
array_prop_append(&x.k_tag, &mut acc.k_tag);
|
||||||
acc.search = x.search.to_owned();
|
acc.search = x.search.to_owned();
|
||||||
acc.since = x.since;
|
acc.since = x.since;
|
||||||
acc.until = x.until;
|
acc.until = x.until;
|
||||||
@ -188,6 +194,7 @@ impl From<Vec<&ReqFilter>> for ReqFilter {
|
|||||||
array_prop_append_vec(&x.r_tag, &mut acc.r_tag);
|
array_prop_append_vec(&x.r_tag, &mut acc.r_tag);
|
||||||
array_prop_append_vec(&x.a_tag, &mut acc.a_tag);
|
array_prop_append_vec(&x.a_tag, &mut acc.a_tag);
|
||||||
array_prop_append_vec(&x.g_tag, &mut acc.g_tag);
|
array_prop_append_vec(&x.g_tag, &mut acc.g_tag);
|
||||||
|
array_prop_append_vec(&x.k_tag, &mut acc.k_tag);
|
||||||
acc.search = x.search.to_owned();
|
acc.search = x.search.to_owned();
|
||||||
acc.since = x.since;
|
acc.since = x.since;
|
||||||
acc.until = x.until;
|
acc.until = x.until;
|
||||||
@ -281,6 +288,14 @@ impl Into<Vec<FlatReqFilter>> for &ReqFilter {
|
|||||||
inputs.push(t_ids);
|
inputs.push(t_ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(k_tags) = &self.k_tag {
|
||||||
|
let t_ids = k_tags
|
||||||
|
.iter()
|
||||||
|
.map(|z| StringOrNumberEntry::String(("k_tag", z)))
|
||||||
|
.collect();
|
||||||
|
inputs.push(t_ids);
|
||||||
|
}
|
||||||
|
|
||||||
for p in inputs.iter().multi_cartesian_product() {
|
for p in inputs.iter().multi_cartesian_product() {
|
||||||
ret.push(FlatReqFilter {
|
ret.push(FlatReqFilter {
|
||||||
id: p.iter().find_map(|q| {
|
id: p.iter().find_map(|q| {
|
||||||
@ -371,6 +386,14 @@ impl Into<Vec<FlatReqFilter>> for &ReqFilter {
|
|||||||
}
|
}
|
||||||
None
|
None
|
||||||
}),
|
}),
|
||||||
|
k_tag: p.iter().find_map(|q| {
|
||||||
|
if let StringOrNumberEntry::String((k, v)) = q {
|
||||||
|
if (*k).eq("k_tag") {
|
||||||
|
return Some((*v).to_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}),
|
||||||
search: self.search.to_owned(),
|
search: self.search.to_owned(),
|
||||||
since: self.since,
|
since: self.since,
|
||||||
until: self.until,
|
until: self.until,
|
||||||
@ -395,6 +418,8 @@ impl Distance for ReqFilter {
|
|||||||
ret += prop_dist_vec(&self.r_tag, &b.r_tag);
|
ret += prop_dist_vec(&self.r_tag, &b.r_tag);
|
||||||
ret += prop_dist_vec(&self.t_tag, &b.t_tag);
|
ret += prop_dist_vec(&self.t_tag, &b.t_tag);
|
||||||
ret += prop_dist_vec(&self.a_tag, &b.a_tag);
|
ret += prop_dist_vec(&self.a_tag, &b.a_tag);
|
||||||
|
ret += prop_dist_vec(&self.g_tag, &b.g_tag);
|
||||||
|
ret += prop_dist_vec(&self.k_tag, &b.k_tag);
|
||||||
|
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
|
2
packages/system/src/cache/index.ts
vendored
2
packages/system/src/cache/index.ts
vendored
@ -57,7 +57,7 @@ export interface UsersFollows {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function mapEventToProfile(ev: NostrEvent) {
|
export function mapEventToProfile(ev: NostrEvent) {
|
||||||
if (ev.kind !== 0) return;
|
if (ev.kind !== 0 && ev.kind !== 31990) return;
|
||||||
try {
|
try {
|
||||||
const data: UserMetadata = JSON.parse(ev.content);
|
const data: UserMetadata = JSON.parse(ev.content);
|
||||||
let ret = {
|
let ret = {
|
||||||
|
Reference in New Issue
Block a user