git ssb

2+

ev / mvd



Tree: 1190ac6ab1feb04de6babb610f37493a683b6e5a

Files: 1190ac6ab1feb04de6babb610f37493a683b6e5a / tools.js

11425 bytesRaw
1var h = require('hyperscript')
2var human = require('human-time')
3var avatar = require('./avatar')
4var ref = require('ssb-ref')
5
6var ssbKeys = require('ssb-keys')
7
8var pull = require('pull-stream')
9
10var sbot = require('./scuttlebot')
11
12var config = require('./config')()
13
14var id = require('./keys').id
15
16module.exports.getFollowing = function (src) {
17 var followingCount = 0
18
19 var following = h('div.following', 'Following: ')
20
21 following.appendChild(h('span#followingcount', '0'))
22 following.appendChild(h('br'))
23
24 pull(
25 sbot.query({query: [{$filter: { value: { author: src, content: {type: 'contact'}}}}], live: true}),
26 pull.drain(function (msg) {
27 if (msg.value) {
28 if (msg.value.content.following == true) {
29 followingcount = document.getElementById('followingcount')
30 followingCount++
31 followingcount.textContent = followingCount
32 var gotIt = document.getElementById('following:' + msg.value.content.contact.substring(0, 44))
33 if (gotIt == null) {
34 following.appendChild(h('a#following:'+ msg.value.content.contact.substring(0, 44), {title: avatar.cachedName(msg.value.content.contact).textContent, href: '#' + msg.value.content.contact}, h('span.avatar--small', avatar.cachedImage(msg.value.content.contact))))
35 }
36 }
37 if (msg.value.content.following == false) {
38 followingcount = document.getElementById('followingcount')
39 followingCount--
40 followingcount.textContent = followingCount
41 var gotIt = document.getElementById('following:' + msg.value.content.contact.substring(0, 44))
42 if (gotIt != null) {
43 gotIt.outerHTML = ''
44 }
45 }
46 }
47 })
48 )
49 return following
50}
51
52module.exports.getFollowers = function (src) {
53 var followerCount = 0
54
55 var followers = h('div.followers', 'Followers: ')
56
57 followers.appendChild(h('span#followercount', '0'))
58 followers.appendChild(h('br'))
59
60 pull(
61 sbot.query({query: [{$filter: { value: { content: {type: 'contact', contact: src}}}}], live: true}),
62 pull.drain(function (msg) {
63 if (msg.value) {
64 if (msg.value.content.following == true) {
65 followcount = document.getElementById('followercount')
66 followerCount++
67 followcount.textContent = followerCount
68 var gotIt = document.getElementById('followers:' + msg.value.author.substring(0, 44))
69 if (gotIt == null) {
70 followers.appendChild(h('a#followers:'+ msg.value.author.substring(0, 44), {title: avatar.cachedName(msg.value.author).textContent, href: '#' + msg.value.author}, h('span.avatar--small', avatar.cachedImage(msg.value.author))))
71 }
72 }
73 if (msg.value.content.following == false) {
74 followcount = document.getElementById('followercount')
75 followerCount--
76 followcount.textContent = followerCount
77 var gotIt = document.getElementById('followers:' + msg.value.author.substring(0, 44))
78 if (gotIt != null) {
79 gotIt.outerHTML = ''
80 }
81 }
82 }
83 })
84 )
85
86 return followers
87}
88
89module.exports.follow = function (src) {
90 var button = h('span.button')
91
92 var followButton = h('button.btn', 'Follow ', avatar.name(src), {
93 onclick: function () {
94 var content = {
95 type: 'contact',
96 contact: src,
97 following: true
98 }
99 sbot.publish(content, function (err, publish) {
100 if (err) throw err
101 console.log(publish)
102 })
103 }
104 })
105
106 var unfollowButton = h('button.btn', 'Unfollow ', avatar.name(src), {
107 onclick: function () {
108 var content = {
109 type: 'contact',
110 contact: src,
111 following: false
112 }
113 sbot.publish(content, function (err, publish) {
114 if (err) throw err
115 console.log(publish)
116 })
117 }
118 })
119
120 pull(
121 sbot.query({query: [{$filter: { value: { author: id, content: {type: 'contact', contact: src}}}}], live: true}),
122 pull.drain(function (msg) {
123 if (msg.value) {
124 if (msg.value.content.following == true) {
125 button.removeChild(button.firstChild)
126 button.appendChild(unfollowButton)
127 }
128 if (msg.value.content.following == false) {
129 button.removeChild(button.firstChild)
130 button.appendChild(followButton)
131 }
132 }
133 })
134 )
135
136 button.appendChild(followButton)
137
138 return button
139}
140
141module.exports.box = function (content) {
142 return ssbKeys.box(content, content.recps.map(function (e) {
143 return ref.isFeed(e) ? e : e.link
144 }))
145}
146
147module.exports.publish = function (content, cb) {
148 if(content.recps)
149 content = exports.box(content)
150 sbot.publish(content, function (err, msg) {
151 if(err) throw err
152 console.log('Published!', msg)
153 if(cb) cb(err, msg)
154 })
155}
156
157module.exports.mute = function (src) {
158 if (!localStorage[src])
159 var cache = {mute: false}
160 else
161 var cache = JSON.parse(localStorage[src])
162
163 if (cache.mute == true) {
164 var mute = h('button.btn', 'Unmute', {
165 onclick: function () {
166 cache.mute = false
167 localStorage[src] = JSON.stringify(cache)
168 location.hash = '#'
169 location.hash = src
170 }
171 })
172 return mute
173 } else {
174 var mute = h('button.btn', 'Mute', {
175 onclick: function () {
176 cache.mute = true
177 localStorage[src] = JSON.stringify(cache)
178 location.hash = '#'
179 location.hash = src
180 }
181 })
182 return mute
183 }
184}
185
186module.exports.star = function (msg) {
187 var votebutton = h('span.star:' + msg.key.substring(0,44))
188
189 var vote = {
190 type: 'vote',
191 vote: { link: msg.key, expression: 'Star' }
192 }
193
194 if (msg.value.content.recps) {
195 vote.recps = msg.value.content.recps
196 }
197
198 var star = h('button.btn.right', 'Star ',
199 h('img.emoji', {src: config.emojiUrl + 'star.png'}), {
200 onclick: function () {
201 vote.vote.value = 1
202 if (vote.recps) {
203 vote = exports.box(vote)
204 }
205 sbot.publish(vote, function (err, voted) {
206 if(err) throw err
207 })
208 }
209 }
210 )
211
212 var unstar = h('button.btn.right ', 'Unstar ',
213 h('img.emoji', {src: config.emojiUrl + 'stars.png'}), {
214 onclick: function () {
215 vote.vote.value = -1
216 sbot.publish(vote, function (err, voted) {
217 if(err) throw err
218 })
219 }
220 }
221 )
222
223 votebutton.appendChild(star)
224
225 pull(
226 sbot.links({rel: 'vote', dest: msg.key, live: true}),
227 pull.drain(function (link) {
228 if (link.key) {
229 sbot.get(link.key, function (err, data) {
230 if (err) throw err
231 if (data.content.vote) {
232 if (data.author == id) {
233 if (data.content.vote.value == 1)
234 votebutton.replaceChild(unstar, star)
235 if (data.content.vote.value == -1)
236 votebutton.replaceChild(star, unstar)
237 }
238 }
239 })
240 }
241 })
242 )
243
244 return votebutton
245}
246
247function votes (msg) {
248 var votes = h('div.votes')
249 if (msg.key) {
250 pull(
251 sbot.links({rel: 'vote', dest: msg.key, live: true }),
252 pull.drain(function (link) {
253 if (link.key) {
254 sbot.get(link.key, function (err, data) {
255 if (err) throw err
256 if (data.content.vote) {
257 if (data.content.vote.value == 1) {
258 if (localStorage[data.author + 'name'])
259 name = localStorage[data.author + 'name']
260 else
261 name = data.author
262 votes.appendChild(h('a#vote:' + data.author.substring(0, 44), {href:'#' + data.author, title: name}, h('img.emoji', {src: config.emojiUrl + 'star.png'})))
263 }
264 else if (data.content.vote.value == -1) {
265 var lookFor = 'vote:' + data.author.substring(0, 44)
266 document.getElementById(lookFor, function (err, gotit) {
267 if (err) throw err
268 gotit.parentNode.removeChild(remove)
269 })
270 }
271 }
272 })
273 }
274 })
275 )
276 }
277 return votes
278}
279
280module.exports.timestamp = function (msg, edited) {
281 var timestamp
282 if (edited)
283 timestamp = h('span.timestamp', 'Edited by: ', h('a', {href: '#' + msg.value.author}, h('span.avatar--small', avatar.cachedImage(msg.value.author))), h('a', {href: '#' + msg.key}, human(new Date(msg.value.timestamp))))
284 else
285 timestamp = h('span.timestamp', h('a', {href: '#' + msg.key}, human(new Date(msg.value.timestamp))))
286 return timestamp
287}
288
289
290module.exports.mini = function (msg, content) {
291 var mini = h('div.mini')
292
293 mini.appendChild(
294 h('span.avatar',
295 h('a', {href: '#' + msg.value.author},
296 h('span.avatar--small', avatar.cachedImage(msg.value.author)),
297 avatar.cachedName(msg.value.author)
298 )
299 )
300 )
301 var lock = h('span.right', h('img.emoji', {src: config.emojiUrl + 'lock.png'}))
302
303
304 mini.appendChild(h('span', content))
305 mini.appendChild(exports.timestamp(msg))
306
307 if (msg.value.content.recps) {
308 mini.appendChild(lock)
309 }
310
311 if (typeof msg.value.content === 'string') {
312 mini.appendChild(lock)
313 }
314
315 return mini
316}
317
318
319module.exports.header = function (msg) {
320 var header = h('div.header')
321
322 header.appendChild(h('span.avatar',
323 h('a', {href: '#' + msg.value.author},
324 h('span.avatar--small', avatar.cachedImage(msg.value.author)),
325 avatar.cachedName(msg.value.author)
326 )
327 )
328 )
329
330 header.appendChild(exports.timestamp(msg))
331 header.appendChild(votes(msg))
332
333 if (msg.value.private)
334 header.appendChild(h('span.right', ' ', h('img.emoji', {src: config.emojiUrl + 'lock.png'})))
335
336 return header
337}
338
339var ref = require('ssb-ref')
340
341module.exports.messageName = function (id, cb) {
342 // gets the first few characters of a message, for message-link
343 function title (s) {
344 var m = /^\n*([^\n]{0,40})/.exec(s)
345 return m && (m[1].length == 40 ? m[1]+'...' : m[1])
346 }
347
348 sbot.get(id, function (err, value) {
349 if(err && err.name == 'NotFoundError')
350 return cb(null, id.substring(0, 10)+'...(missing)')
351 if(value.content.type === 'post' && 'string' === typeof value.content.text)
352 return cb(null, title(value.content.text))
353 else if('string' === typeof value.content.text)
354 return cb(null, value.content.type + ':'+title(value.content.text))
355 else
356 return cb(null, id.substring(0, 10)+'...')
357 })
358}
359
360var messageName = exports.messageName
361var ref = require('ssb-ref')
362
363module.exports.messageLink = function (id) {
364 if (ref.isMsg(id)) {
365 var link = h('a', {href: '#'+id}, id.substring(0, 10)+'...')
366 messageName(id, function (err, name) {
367 if(err) console.error(err)
368 else link.textContent = name
369 })
370 } else {
371 var link = id
372 }
373 return link
374}
375
376module.exports.rawJSON = function (obj) {
377 return JSON.stringify(obj, null, 2)
378 .split(/([%@&][a-zA-Z0-9\/\+]{43}=*\.[\w]+)/)
379 .map(function (e) {
380 if(ref.isMsg(e) || ref.isFeed(e) || ref.isBlob(e)) {
381 return h('a', {href: '#' + e}, e)
382 }
383 return e
384 })
385}
386
387var markdown = require('ssb-markdown')
388var config = require('./config')()
389
390module.exports.markdown = function (msg, md) {
391 return {innerHTML: markdown.block(msg, {toUrl: function (url, image) {
392 if(url[0] == '%' || url[0] == '@') return '#' + url
393 if(!image) return url
394 if(url[0] !== '&') return url
395 return config.blobsUrl + url
396 }})}
397}
398

Built with git-ssb-web