index.jsView |
---|
1 | 1 … | const FlumeView = require('flumeview-search') |
2 | 2 … | const pull = require('pull-stream') |
3 | | -const { isBlobId } = require('ssb-ref') |
4 | 3 … | const Validator = require('is-my-json-valid') |
5 | 4 … | |
6 | | -const hasBlobMention = Validator(require('../schema/mentions')) |
| 5 … | +const isBlobMention = Validator(require('./schema/mention')) |
7 | 6 … | |
8 | | -const INDEX_VERSION = 2 |
| 7 … | +const INDEX_VERSION = 1 |
9 | 8 … | |
10 | 9 … | module.exports = { |
11 | 10 … | name: 'meme', |
12 | 11 … | version: require('./package.json').version, |
18 | 17 … | const view = sbot._flumeUse('meme', FlumeView(INDEX_VERSION, 3, map)) |
19 | 18 … | |
20 | 19 … | return { |
21 | 20 … | query: view.query, |
22 | | - search: (opts, cb) => { |
23 | | - if (typeof opts === 'string') opts = { query: opts } |
| 21 … | + search |
| 22 … | + } |
24 | 23 … | |
25 | | - pull( |
26 | | - view.query(opts), |
27 | | - pull.map(m => m.value.content.mentions), |
28 | | - pull.collect((err, data) => { |
29 | | - if (err) return cb(err) |
| 24 … | + function search (opts, cb) { |
| 25 … | + if (typeof opts === 'string') opts = { query: opts } |
30 | 26 … | |
31 | | - const result = data.reduce((soFar, mentions) => { |
32 | | - mentions |
33 | | - .filter(m => isBlobId(m.link)) |
34 | | - .filter(m => m.name.indexOf(opts.query) > -1) |
35 | | - .forEach(({ link, name }) => { |
36 | | - if (!soFar[link]) soFar[link] = [name] |
37 | | - else soFar[link].push(name) |
38 | | - }) |
| 27 … | + pull( |
| 28 … | + view.query(opts), |
| 29 … | + pull.collect((err, data) => { |
| 30 … | + if (err) return cb(err) |
39 | 31 … | |
40 | | - return soFar |
41 | | - }, {}) |
| 32 … | + const result = data.reduce((soFar, msg) => { |
| 33 … | + getMentions(msg) |
| 34 … | + .filter(isBlobMention) |
| 35 … | + .filter(m => m.name.indexOf(opts.query) > -1) |
| 36 … | + .forEach(({ link, name }) => { |
| 37 … | + if (!soFar[link]) soFar[link] = [] |
42 | 38 … | |
43 | | - cb(null, result) |
44 | | - }) |
45 | | - ) |
46 | | - } |
| 39 … | + soFar[link].push({ name, author: getAuthor(msg), msg: msg.key }) |
| 40 … | + }) |
| 41 … | + |
| 42 … | + return soFar |
| 43 … | + }, {}) |
| 44 … | + |
| 45 … | + cb(null, result) |
| 46 … | + }) |
| 47 … | + ) |
47 | 48 … | } |
48 | 49 … | } |
49 | 50 … | } |
50 | 51 … | |
51 | 52 … | const imgExtRegEx = /\.(jpg|jpeg|png|gif|bmp|svg)$/i |
52 | | -const spaceCharRegex = /(-|\.|_|\/|~|\s)/g |
| 53 … | +const spaceCharRegex = /(-|\.|_|\/|~)/g |
53 | 54 … | |
54 | 55 … | function map (msg) { |
55 | | - var mentions = msg.value.content.mentions || [] |
56 | | - if (!Array.isArray(mentions)) mentions = [mentions] |
57 | | - |
58 | | - |
59 | | - |
60 | | - return mentions |
61 | | - |
62 | | - |
63 | | - .filter(m => isBlobId(m.link)) |
64 | | - .map(m => m.name) |
65 | | - .filter(Boolean) |
66 | | - .map(m => m.replace(imgExtRegEx, '').replace(spaceCharRegex, ' ')) |
| 56 … | + return getMentions(msg) |
| 57 … | + .filter(isBlobMention) |
| 58 … | + |
| 59 … | + .map(n => n.replace(imgExtRegEx, '').replace(spaceCharRegex, ' ')) |
67 | 60 … | .join(' ') |
68 | 61 … | } |
| 62 … | + |
| 63 … | +function getMentions (msg) { |
| 64 … | + if (!msg.value.content.mentions) return [] |
| 65 … | + else if (!Array.isArray(msg.value.content.mentions)) return [msg.value.content.mentions] |
| 66 … | + else return msg.value.content.mentions |
| 67 … | +} |
| 68 … | + |
| 69 … | +function getAuthor (msg) { |
| 70 … | + return msg.value.author |
| 71 … | +} |