90 lines
2.2 KiB
JavaScript
90 lines
2.2 KiB
JavaScript
var h = require('hyperscript')
|
|
var app = require('../app')
|
|
var com = require('./index')
|
|
|
|
module.exports = function (from, to, opts) {
|
|
var container = h('.connection-graph')
|
|
opts = opts || {}
|
|
opts.w = opts.w || 3
|
|
opts.h = opts.h || 1
|
|
app.ssb.friends.all(function (err, friends) {
|
|
|
|
// generate graph
|
|
var graph = { nodes: [], edges: [] }
|
|
for (var id in friends) {
|
|
// add node
|
|
var inbounds = countInbounds(friends, id)
|
|
if (id == from) {
|
|
graph.nodes.push({
|
|
id: id,
|
|
type: 'square',
|
|
label: com.userName(id),
|
|
x: 0.05 * opts.w,
|
|
y: 0.5 * opts.h,
|
|
size: inbounds+1,
|
|
color: '#970'
|
|
})
|
|
} else if (id == to) {
|
|
graph.nodes.push({
|
|
id: id,
|
|
type: 'square',
|
|
label: com.userName(id),
|
|
x: 0.95 * opts.w,
|
|
y: 0.5 * opts.h,
|
|
size: inbounds+1,
|
|
color: '#970'
|
|
})
|
|
} else if (onpath(friends, from, to, id)) {
|
|
var xr = Math.random() * 0.2
|
|
var yr = Math.random()
|
|
graph.nodes.push({
|
|
id: id,
|
|
type: 'square',
|
|
label: com.userName(id),
|
|
x: (0.4 + xr) * opts.w,
|
|
y: yr * opts.h,
|
|
size: inbounds+1,
|
|
color: '#790'
|
|
})
|
|
} else {
|
|
continue;
|
|
}
|
|
|
|
// show edges related to from/to
|
|
for (var id2 in friends[id]) {
|
|
if (id == from && onpath(friends, from, to, id2) || id2 == to && onpath(friends, from, to, id) || id == from && id2 == to) {
|
|
graph.edges.push({
|
|
id: id+'->'+id2,
|
|
source: id,
|
|
target: id2,
|
|
size: (id == from && id2 == to) ? 1 : 0.1,
|
|
color: (id == from && id2 == to) ? '#97a' : (id == from) ? '#c93' : '#9a3'
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
// render
|
|
var s = new sigma({
|
|
graph: graph,
|
|
renderer: { container: container, type: 'canvas' },
|
|
settings: opts
|
|
})
|
|
})
|
|
return container
|
|
}
|
|
|
|
function countInbounds (graph, id) {
|
|
var n=0
|
|
for (var id2 in graph) {
|
|
if (id in graph[id2])
|
|
n++
|
|
}
|
|
return n
|
|
}
|
|
|
|
function onpath (graph, from, to, id) {
|
|
if (graph[from] && graph[from][id] && graph[id] && graph[id][to])
|
|
return true
|
|
return false
|
|
} |