aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/app.js7
-rw-r--r--lib/contact.js89
-rw-r--r--lib/serve.js55
3 files changed, 127 insertions, 24 deletions
diff --git a/lib/app.js b/lib/app.js
index bcbc118..e1383a8 100644
--- a/lib/app.js
+++ b/lib/app.js
@@ -6,7 +6,7 @@ var u = require('./util')
var pull = require('pull-stream')
var multicb = require('multicb')
var paramap = require('pull-paramap')
-var Contacts = require('ssb-contact')
+var getContacts = require('./contact')
var About = require('./about')
var Serve = require('./serve')
var Render = require('./render')
@@ -51,6 +51,7 @@ function App(sbot, config) {
sbot.blobs.size.bind(sbot.blobs))
this.getFollows = memo(this._getFollows.bind(this))
this.getVotes = memo({cache: lru(100)}, this._getVotes.bind(this))
+ this.getContacts = getContacts.bind(null, this.sbot)
this.unboxMsg = this.unboxMsg.bind(this)
@@ -462,10 +463,6 @@ App.prototype.streamMyChannels = function (id, opts) {
)
}
-App.prototype.createContactStreams = function (id) {
- return new Contacts(this.sbot).createContactStreams(id)
-}
-
function compareVoted(a, b) {
return b.value - a.value
}
diff --git a/lib/contact.js b/lib/contact.js
new file mode 100644
index 0000000..676c84a
--- /dev/null
+++ b/lib/contact.js
@@ -0,0 +1,89 @@
+var pull = require('pull-stream')
+var multicb = require('multicb')
+
+function accumulateNonNull(a, b) {
+ return b == null ? a : b
+}
+
+module.exports = function (sbot, id, cb) {
+ var followed = {}, followedBy = {}, blocked = {}, blockedBy = {}
+ var done = multicb({pluck: 1})
+ pull(
+ sbot.links2.read({
+ query: [
+ {$filter: {
+ source: id,
+ rel: [{$prefix: 'contact'}]
+ }},
+ {$reduce: {
+ id: 'dest',
+ following: {$collect: ['rel', 1]},
+ blocking: {$collect: ['rel', 2]}
+ }}
+ ]
+ }),
+ pull.drain(function (op) {
+ var following = op.following.reduce(accumulateNonNull, null)
+ var blocking = op.blocking.reduce(accumulateNonNull, null)
+ if (following != null) followed[op.id] = following
+ if (blocking != null) blocked[op.id] = blocking
+ }, done())
+ )
+ pull(
+ sbot.links2.read({
+ query: [
+ {$filter: {
+ dest: id,
+ rel: [{$prefix: 'contact'}]
+ }},
+ {$reduce: {
+ id: 'source',
+ following: {$collect: ['rel', 1]},
+ blocking: {$collect: ['rel', 2]}
+ }}
+ ]
+ }),
+ pull.drain(function (op) {
+ var following = op.following.reduce(accumulateNonNull, null)
+ var blocking = op.blocking.reduce(accumulateNonNull, null)
+ if (following != null) followedBy[op.id] = following
+ if (blocking != null) blockedBy[op.id] = blocking
+ }, done())
+ )
+
+ done(function (err) {
+ if (err) return cb(new Error(err.stack || err))
+ var id
+ var friendsList = []
+ var followingList = []
+ var blockingList = []
+ var followedByList = []
+ var blockedByList = []
+
+ for (id in followed) {
+ if (followed[id]) {
+ if (followedBy[id]) friendsList.push(id)
+ else followingList.push(id)
+ }
+ }
+ for (id in followedBy) {
+ if (followedBy[id] && !followed[id]) {
+ followedByList.push(id)
+ }
+ }
+ for (id in blocked) {
+ if (blocked[id]) blockingList.push(id)
+ }
+ for (id in blockedBy) {
+ if (blockedBy[id]) blockedByList.push(id)
+ }
+
+ cb(null, {
+ follows: followingList,
+ followers: followedByList,
+ friends: friendsList,
+ blocks: blockingList,
+ blockers: blockedByList
+ })
+ })
+}
diff --git a/lib/serve.js b/lib/serve.js
index 2bbc80d..e8313f4 100644
--- a/lib/serve.js
+++ b/lib/serve.js
@@ -794,10 +794,10 @@ Serve.prototype.channels = function (ext) {
Serve.prototype.contacts = function (path) {
var self = this
var id = String(path).substr(1)
- var contacts = self.app.createContactStreams(id)
- function renderFriendsList() {
+ function renderFriendsList(ids) {
return pull(
+ pull.values(ids),
paramap(function (id, cb) {
self.app.getAbout(id, function (err, about) {
var name = about && about.name || id.substr(0, 8) + '…'
@@ -812,23 +812,40 @@ Serve.prototype.contacts = function (path) {
)
}
- pull(
- cat([
- ph('section', {}, [
- ph('h3', {}, ['Contacts: ', self.phIdLink(id)]),
- ph('h4', {}, 'Friends'),
- renderFriendsList()(contacts.friends),
- ph('h4', {}, 'Follows'),
- renderFriendsList()(contacts.follows),
- ph('h4', {}, 'Followers'),
- renderFriendsList()(contacts.followers)
- ])
- ]),
- this.wrapPage('contacts: ' + id),
- this.respondSink(200, {
- 'Content-Type': ctype('html')
- })
- )
+ self.app.getContacts(id, function (err, contacts) {
+ if (err) return self.respond(500, err.stack || err)
+ pull(
+ cat([
+ ph('section', {}, [
+ ph('h3', {}, ['Contacts: ', self.phIdLink(id)]),
+ contacts.friends.length ? [
+ ph('h4', {}, 'Friends'),
+ renderFriendsList(contacts.friends),
+ ] : [],
+ contacts.follows.length ? [
+ ph('h4', {}, 'Follows'),
+ renderFriendsList(contacts.follows),
+ ] : [],
+ contacts.followers.length ? [
+ ph('h4', {}, 'Followers'),
+ renderFriendsList(contacts.followers),
+ ] : [],
+ contacts.blocks.length ? [
+ ph('h4', {}, 'Blocks'),
+ renderFriendsList(contacts.blocks),
+ ] : [],
+ contacts.blockers.length ? [
+ ph('h4', {}, 'Blocked by'),
+ renderFriendsList(contacts.blockers),
+ ] : [],
+ ])
+ ]),
+ self.wrapPage('contacts: ' + id),
+ self.respondSink(200, {
+ 'Content-Type': ctype('html')
+ })
+ )
+ })
}
Serve.prototype.about = function (path) {