remove userrelays and use the profile event instead + fixes.

This commit is contained in:
fiatjaf 2022-02-12 20:14:40 -03:00
parent 42e9848c85
commit 12dfed7e31
7 changed files with 45 additions and 80 deletions

View File

@ -11,7 +11,7 @@
<script>
import helpersMixin from '../utils/mixin'
import {cleanEvent} from '../utils/helpers'
import {cleanEvent} from '../utils/event'
export default {
name: 'RawEventData',

View File

@ -67,13 +67,11 @@ export default {
// add last 4 pubkeys mentioned
let pubkeys = usableTags.filter(([t, v]) => t === 'p').map(([_, v]) => v)
for (let i = 0; i < Math.min(4, pubkeys.length); i++) {
tags.push(
await getPubKeyTagWithRelay('p', pubkeys[pubkeys.length - 1 - i])
)
tags.push(await getPubKeyTagWithRelay(pubkeys[pubkeys.length - 1 - i]))
}
// plus the author of the note being replied to, if not present already
if (!tags.find(([_, v]) => v === this.event.pubkey)) {
tags.push(await getPubKeyTagWithRelay('p', this.event.pubkey))
tags.push(await getPubKeyTagWithRelay(this.event.pubkey))
}
// add the first and the last event ids

View File

@ -4,11 +4,8 @@ import {Notify, LocalStorage} from 'quasar'
import {pool, signAsynchronously} from '../pool'
import {dbSave, dbGetProfile, dbGetContactList} from '../db'
import {
metadataFromEvent,
processMentions,
getPubKeyTagWithRelay
} from '../utils/helpers'
import {processMentions, getPubKeyTagWithRelay} from '../utils/helpers'
import {metadataFromEvent} from '../utils/event'
export function initKeys(store, keys) {
store.commit('setKeys', keys)
@ -339,7 +336,7 @@ export async function publishContactList(store) {
// tags that we don't want to replace
store.state.following.forEach(async pubkey => {
if (!tags.find(([t, v]) => t === 'p' && v === pubkey)) {
tags.push(await getPubKeyTagWithRelay('p', pubkey))
tags.push(await getPubKeyTagWithRelay(pubkey))
}
})

View File

@ -11,7 +11,8 @@ const getMainnetRelays = () => {
const optional = [
['wss://nostr.rocks', {read: true, write: true}],
['wss://relayer.fiatjaf.com', {read: true, write: true}],
['wss://nostrrr.bublina.eu.org', {read: true, write: true}],
['wss://nostr.onsats.org', {read: true, write: true}],
['wss://nostr-relay.untethr.me ', {read: true, write: true}],
['wss://nostr-relay.wlvs.space', {read: true, write: true}],
['wss://nostr.bitcoiner.social', {read: true, write: true}],
['wss://nostr-relay.freeberty.net', {read: true, write: true}]
@ -28,13 +29,14 @@ const getMainnetRelays = () => {
}
const getTorRelays = () => ({
'ws://jgqaglhautb4k6e6i2g34jakxiemqp6z4wynlirltuukgkft2xuglmqd.onion': {read: true, write: true},
'ws://jgqaglhautb4k6e6i2g34jakxiemqp6z4wynlirltuukgkft2xuglmqd.onion': {
read: true,
write: true
}
})
export default function () {
const relays = isClientUsingTor()
? getTorRelays()
: getMainnetRelays()
const relays = isClientUsingTor() ? getTorRelays() : getMainnetRelays()
return {
keys: LocalStorage.getItem('keys') || {}, // {priv, pub }

21
src/utils/event.js Normal file
View File

@ -0,0 +1,21 @@
export function cleanEvent(event) {
return {
id: event.id,
pubkey: event.pubkey,
created_at: event.created_at,
kind: event.kind,
tags: event.tags,
content: event.content,
sig: event.sig
}
}
export function metadataFromEvent(event) {
try {
let metadata = JSON.parse(event.content)
metadata.pubkey = event.pubkey
return metadata
} catch (_) {
return {}
}
}

View File

@ -1,4 +1,4 @@
import {dbGetRelayForPubKey} from '../db'
import {dbGetProfile} from '../db'
export function shorten(str) {
return str ? str.slice(0, 3) + '…' + str.slice(-4) : ''
@ -18,28 +18,6 @@ export function isElementFullyScrolled(element) {
)
}
export function cleanEvent(event) {
return {
id: event.id,
pubkey: event.pubkey,
created_at: event.created_at,
kind: event.kind,
tags: event.tags,
content: event.content,
sig: event.sig
}
}
export function metadataFromEvent(event) {
try {
let metadata = JSON.parse(event.content)
metadata.pubkey = event.pubkey
return metadata
} catch (_) {
return {}
}
}
export function addSorted(list, newItem, compare) {
for (let i = 0; i < list.length; i++) {
let item = list[i]
@ -55,16 +33,15 @@ export function addSorted(list, newItem, compare) {
export async function processMentions(event) {
const mentionRegex = /\B@(?<p>[a-f0-9]{64})\b/g
let matches = event.content.matchAll(mentionRegex)
var profileTagIndexMap = {}
for (let i = 0; i < matches.length; i++) {
let pubkey = matches[i].groups.p
for (let match of event.content.matchAll(mentionRegex)) {
let pubkey = match.groups.p
let idx = event.tags.findIndex(([t, v]) => t === 'p' && v === pubkey)
if (idx) {
if (idx !== -1) {
profileTagIndexMap[pubkey] = idx
} else {
event.tags.push(await getPubKeyTagWithRelay('p', pubkey))
event.tags.push(await getPubKeyTagWithRelay(pubkey))
profileTagIndexMap[pubkey] = event.tags.length - 1
}
}
@ -79,9 +56,10 @@ export async function processMentions(event) {
export async function getPubKeyTagWithRelay(pubkey) {
var base = ['p', pubkey]
let relay = await dbGetRelayForPubKey(pubkey)
if (relay) {
base.push(relay)
let event = await dbGetProfile(pubkey)
if (event && event.seen_on && event.seen_on.length) {
let random = event.seen_on[Math.floor(Math.random() * event.seen_on.length)]
base.push(random)
}
return base
}

View File

@ -5,7 +5,7 @@ import PouchDBUpsert from 'pouchdb-upsert'
import PouchDBMapReduce from 'pouchdb-mapreduce'
import PouchDBAdapterIDB from 'pouchdb-adapter-idb'
import {cleanEvent} from './utils/helpers'
import {cleanEvent} from './utils/event'
PouchDB.plugin(PouchDBAdapterIDB).plugin(PouchDBMapReduce).plugin(PouchDBUpsert)
@ -18,7 +18,7 @@ const db = new PouchDB('nostr-events', {
// db schema (views)
// ~
const DESIGN_VERSION = 6
const DESIGN_VERSION = 7
db.upsert('_design/main', current => {
if (current && current.version >= DESIGN_VERSION) return false
@ -94,13 +94,6 @@ db.upsert('_design/main', current => {
}
}
}.toString()
},
userrelays: {
map: function (event) {
event.seen_on.forEach(relay => {
emit([event.pubkey, event.created_at], relay)
})
}.toString()
}
}
}
@ -414,30 +407,6 @@ const methods = {
return sorted[0].doc
}
}
},
async dbGetRelayForPubKey(pubkey) {
let result = await db.query('main/userrelays', {
include_docs: false,
startkey: [pubkey, null],
endkey: [pubkey, {}]
})
let scores = {}
let top = {score: 0, relay: null}
for (let i = 0; i < result.rows.length; i++) {
let {
key: [_, time],
value: relay
} = result.rows[i]
let newScore = (scores[relay] || 0) + time - 1644269009
scores[relay] = newScore
if (newScore > top.score) {
top = {score: newScore, relay}
}
}
return top.relay
}
}