From 3fdd66ccbe925ca3695a92f805a7c3ceeabde7d2 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Sat, 31 Aug 2024 17:19:24 -0700 Subject: [PATCH] Use welshman follows/mutes --- src/app/shared/PersonStats.svelte | 14 +++- src/app/views/PersonFollows.svelte | 14 +++- src/engine/requests/index.ts | 10 +-- src/engine/state.ts | 128 +++++++---------------------- 4 files changed, 56 insertions(+), 110 deletions(-) diff --git a/src/app/shared/PersonStats.svelte b/src/app/shared/PersonStats.svelte index 85043407..deb3bace 100644 --- a/src/app/shared/PersonStats.svelte +++ b/src/app/shared/PersonStats.svelte @@ -1,21 +1,29 @@
diff --git a/src/app/views/PersonFollows.svelte b/src/app/views/PersonFollows.svelte index e6e0dde3..bdd77adb 100644 --- a/src/app/views/PersonFollows.svelte +++ b/src/app/views/PersonFollows.svelte @@ -1,12 +1,18 @@ - + diff --git a/src/engine/requests/index.ts b/src/engine/requests/index.ts index df602f8e..a1589857 100644 --- a/src/engine/requests/index.ts +++ b/src/engine/requests/index.ts @@ -44,7 +44,6 @@ import { getGroupReqInfo, getCommunityReqInfo, env, - getFollows, getFilterSelections, getFollowers, getUserCommunities, @@ -60,6 +59,7 @@ import { subscribe, subscribePersistent, sessionWithMeta, + getFollows, } from "src/engine/state" export * from "src/engine/requests/pubkeys" @@ -246,9 +246,9 @@ export const feedLoader = new FeedLoader({ const pubkeys = switcherFn(scope, { [Scope.Self]: () => ($pubkey ? [$pubkey] : []), - [Scope.Follows]: () => Array.from(getFollows($pubkey)), - [Scope.Network]: () => Array.from(getNetwork($pubkey)), - [Scope.Followers]: () => Array.from(getFollowers($pubkey)), + [Scope.Follows]: () => getFollows($pubkey), + [Scope.Network]: () => getNetwork($pubkey), + [Scope.Followers]: () => getFollowers($pubkey), }) return pubkeys.length === 0 ? env.DEFAULT_FOLLOWS : pubkeys @@ -490,7 +490,7 @@ export const loadHandlers = () => filters: [ addSinceToFilter({ kinds: [HANDLER_RECOMMENDATION], - authors: Array.from(getFollows(pubkey.get())), + authors: getFollows(pubkey.get()), }), addSinceToFilter({kinds: [HANDLER_INFORMATION]}), ], diff --git a/src/engine/state.ts b/src/engine/state.ts index 263ecd15..9f832dc8 100644 --- a/src/engine/state.ts +++ b/src/engine/state.ts @@ -50,7 +50,6 @@ import { HANDLER_RECOMMENDATION, INBOX_RELAYS, LABEL, - MUTES, RELAYS, SEEN_CONTEXT, SEEN_CONVERSATION, @@ -81,6 +80,7 @@ import { getRelayTags, getRelayTagValues, getPubkeyTagValues, + getListValues, } from "@welshman/util" import type {Filter, RouterScenario, TrustedEvent, SignedEvent, EventTemplate} from "@welshman/util" import {Nip59, Nip01Signer, decrypt} from "@welshman/signer" @@ -112,6 +112,9 @@ import { handles, profiles, displayProfileByPubkey, + follows, + mutesByPubkey, + followsByPubkey, } from "@welshman/app" import {parseJson, fromCsv, SearchHelper} from "src/util/misc" import {Collection as CollectionStore} from "src/util/store" @@ -131,7 +134,6 @@ import { RelayMode, displayFeed, EDITABLE_LIST_KINDS, - getSingletonValues, makeSingleton, ListSearch, profileHasName, @@ -437,78 +439,14 @@ export const profileSearch = derived( .map($p => ({...$p, nip05: $handles[$p.event.pubkey]?.nip05})), ), ) - -// Follows - -export const followListEvents = deriveEvents(repository, {filters: [{kinds: [FOLLOWS]}]}) - -export const followLists = withGetter( - derived([plaintext, followListEvents], ([$plaintext, $followListEvents]) => - $followListEvents.map(event => - readSingleton( - asDecryptedEvent(event, { - content: $plaintext[event.id], - }), - ), - ), - ), -) - -export const followListsByPubkey = withGetter( - derived( - followLists, - $ls => indexBy($l => $l.event.pubkey, $ls) as Map, - ), -) - -export const getFollowList = (pk: string) => - followListsByPubkey.get().get(pk) as PublishedSingleton | undefined - -export const deriveFollowList = (pk: string) => - derived(followListsByPubkey, m => m.get(pk) as PublishedSingleton | undefined) - -export const getFollows = (pk: string) => new Set(getSingletonValues("p", getFollowList(pk))) - -export const deriveFollows = (pk: string) => - derived(followListsByPubkey, m => new Set(getSingletonValues("p", m.get(pk)))) - -export const isFollowing = (pk: string, tpk: string) => getFollows(pk).has(tpk) - -// Mutes - -export const muteListEvents = deriveEvents(repository, {filters: [{kinds: [MUTES]}]}) - -export const muteLists = derived([plaintext, muteListEvents], ([$plaintext, $muteListEvents]) => - $muteListEvents.map(event => - readSingleton( - asDecryptedEvent(event, { - content: $plaintext[event.id], - }), - ), - ), -) - -export const muteListsByPubkey = withGetter( - derived(muteLists, $ls => indexBy($l => $l.event.pubkey, $ls)), -) - -export const getMuteList = (pk: string) => - muteListsByPubkey.get().get(pk) as PublishedSingleton | undefined - -export const deriveMuteList = (pk: string) => - derived(muteListsByPubkey, m => m.get(pk) as PublishedSingleton | undefined) - -export const getMutes = (pk: string) => new Set(getSingletonValues("p", getMuteList(pk))) - -export const deriveMutes = (pk: string) => - derived(muteListsByPubkey, m => new Set(getSingletonValues("p", m.get(pk)))) - -export const isMuting = (pk, tpk) => getMutes(pk).has(tpk) - // Network, followers, wot +export const getFollows = (pubkey: string) => getListValues("p", followsByPubkey.get().get(pubkey)) + +export const getMutes = (pubkey: string) => getListValues("p", mutesByPubkey.get().get(pubkey)) + export const getNetwork = simpleCache(([pk]) => { - const pubkeys = getFollows(pk) + const pubkeys = new Set(getFollows(pk)) const network = new Set() for (const follow of pubkeys) { @@ -519,29 +457,26 @@ export const getNetwork = simpleCache(([pk]) => { } } - return network + return Array.from(network) }) -export const getFollowers = simpleCache( - ([pk]) => - new Set( - followLists - .get() - .filter(l => getSingletonValues("p", l).includes(pk)) - .map(l => l.event.pubkey), - ), +export const getFollowers = simpleCache(([pk]) => + follows + .get() + .filter(l => getListValues("p", l).includes(pk)) + .map(l => l.event.pubkey), ) export const getFollowsWhoFollow = simpleCache( - ([pk, tpk]) => new Set(Array.from(getFollows(pk)).filter(other => isFollowing(other, tpk))), + ([pk, tpk]) => new Set(getFollows(pk).filter(other => getFollows(other).includes(tpk))), ) export const getFollowsWhoMute = simpleCache( - ([pk, tpk]) => new Set(Array.from(getFollows(pk)).filter(other => isMuting(other, tpk))), + ([pk, tpk]) => new Set(getFollows(pk).filter(other => getFollows(other).includes(tpk))), ) export const primeWotCaches = throttle(3000, pk => { - const userFollows = getFollows(pk) + const userFollows = new Set(getFollows(pk)) const mutes: Record = {} const follows: Record = {} @@ -577,7 +512,7 @@ export const maxWot = withGetter(writable(10)) export const getMinWot = () => getSetting("min_wot_score") / maxWot.get() export const getWotScore = (pk, tpk) => { - if (!pk) return getFollowers(tpk).size + if (!pk) return getFollowers(tpk).length const follows = getFollowsWhoFollow(pk, tpk) const mutes = getFollowsWhoMute(pk, tpk) @@ -590,20 +525,17 @@ export const getWotScore = (pk, tpk) => { // User follows/mutes/network -export const userFollowList = derived( - [followListsByPubkey, pubkey, anonymous], - ([$m, $pk, $anon]) => { - return $pk ? $m.get($pk) : makeSingleton({kind: FOLLOWS, publicTags: $anon.follows}) - }, -) +export const userFollowList = derived([followsByPubkey, pubkey, anonymous], ([$m, $pk, $anon]) => { + return $pk ? $m.get($pk) : makeSingleton({kind: FOLLOWS, publicTags: $anon.follows}) +}) -export const userFollows = derived(userFollowList, l => new Set(getSingletonValues("p", l))) +export const userFollows = derived(userFollowList, l => new Set(getListValues("p", l))) export const userNetwork = derived(userFollowList, l => getNetwork(l.event.pubkey)) -export const userMuteList = derived([muteListsByPubkey, pubkey], ([$m, $pk]) => $m.get($pk)) +export const userMuteList = derived([mutesByPubkey, pubkey], ([$m, $pk]) => $m.get($pk)) -export const userMutes = derived(userMuteList, l => new Set(getSingletonValues("p", l))) +export const userMutes = derived(userMuteList, l => new Set(getListValues("p", l))) // Communities @@ -629,7 +561,7 @@ export const communityListsByAddress = derived(communityLists, $communityLists = const m = new Map() for (const list of $communityLists) { - for (const a of getSingletonValues("a", list)) { + for (const a of getListValues("a", list)) { pushToMapKey(m, a, list) } } @@ -643,10 +575,10 @@ export const getCommunityList = (pk: string) => export const deriveCommunityList = (pk: string) => derived(communityListsByPubkey, m => m.get(pk) as PublishedSingleton | undefined) -export const getCommunities = (pk: string) => new Set(getSingletonValues("a", getCommunityList(pk))) +export const getCommunities = (pk: string) => new Set(getListValues("a", getCommunityList(pk))) export const deriveCommunities = (pk: string) => - derived(communityListsByPubkey, m => new Set(getSingletonValues("a", m.get(pk)))) + derived(communityListsByPubkey, m => new Set(getListValues("a", m.get(pk)))) // Groups @@ -1361,7 +1293,7 @@ export const feedFavoritesByAddress = withGetter( const $feedFavoritesByAddress = new Map() for (const singleton of $feedFavorites) { - for (const address of getSingletonValues("a", singleton)) { + for (const address of getListValues("a", singleton)) { pushToMapKey($feedFavoritesByAddress, address, singleton) } } @@ -1377,7 +1309,7 @@ export const userFeedFavorites = derived( ) export const userFavoritedFeeds = derived(userFeedFavorites, $singleton => - getSingletonValues("a", $singleton).map(repository.getEvent).filter(identity).map(readFeed), + getListValues("a", $singleton).map(repository.getEvent).filter(identity).map(readFeed), ) export class FeedSearch extends SearchHelper {