git ssb

0+

cel / ssb-activity



Tree: feae41682ef1f578382eaba8aa4f86e2e734f88b

Files: feae41682ef1f578382eaba8aa4f86e2e734f88b / run.js

2894 bytesRaw
1var fs = require('fs')
2var path = require('path')
3var pull = require('pull-stream')
4var File = require('pull-file')
5var Split = require('pull-split')
6var PNG = require('pngjs').PNG
7
8var start = new Date('2015-08-05').getTime()
9var startDay = Math.floor(start / 86400000)
10var startWeek = Math.floor(start / 86400000 / 7)
11var startMonth = Math.floor(start / 86400000 / 30.43666666666666666666)
12var startT
13
14var now = Date.now()
15var nowDay = Math.floor(now / 86400000)
16var nowWeek = Math.floor(now / 86400000 / 7)
17var nowMonth = Math.floor(now / 86400000 / 30.43666666666666666666)
18
19var series = process.argv[2]
20if (!series) throw new TypeError('Missing series argument')
21
22if (series === 'day') {
23 width = nowDay - startDay
24 startT = startDay
25} else if (series === 'week') {
26 width = nowWeek - startWeek
27 startT = startWeek
28} else if (series === 'month') {
29 width = nowMonth - startMonth
30 startT = startMonth
31} else {
32 throw new TypeError('Invalid series')
33}
34
35var info = JSON.parse(fs.readFileSync(path.join(__dirname, series + '.json')))
36var ids = JSON.parse(fs.readFileSync(path.join(__dirname, 'ids.json')))
37
38var width
39var height = info.max
40
41var png = new PNG({
42 width: width,
43 height: height,
44 colorType: 6
45})
46
47var colors20 = [
48 [255, 106, 152], [255, 98, 188], [250, 98, 219], [231, 107, 243],
49 [199, 124, 255], [149, 144, 255], [53, 162, 255], [0, 176, 246],
50 [0, 186, 224], [0, 191, 196], [0, 193, 163], [0, 191, 125],
51 [0, 187, 78], [57, 182, 0], [124, 174, 0], [163, 165, 0],
52 [192, 155, 0], [216, 144, 0], [234, 131, 49], [248, 118, 109],
53 [255, 106, 152]
54]
55
56function interpolate(a, b, n) {
57 if (!a) a = [0, 0, 0, 0]
58 if (!b) b = [0, 0, 0, 0]
59 var m = 1 - n
60 return [
61 a[0] * m + b[0] * n,
62 a[1] * m + b[1] * n,
63 a[2] * m + b[2] * n,
64 a[3] * m + b[3] * n,
65 ]
66}
67
68var userColors = {}
69var userNumbers = {}
70
71for (var i = 0; i < ids.length; i++) {
72 var id = ids[i]
73 userNumbers[id] = i
74 var x = i / ids.length
75 var colorI = Math.floor(x*20)
76 var inbetweenAmount = x*20 - colorI
77 var c = interpolate(colors20[colorI], colors20[colorI+1], inbetweenAmount)
78 c[3] = 255
79 userColors[id] = c
80}
81
82function setPixel(data, x, y, color) {
83 var i = (y * width + x) << 2
84 data[i] = color[0]
85 data[i+1] = color[1]
86 data[i+2] = color[2]
87 data[i+3] = color[3]
88}
89
90function compareIds(a, b) {
91 return userNumbers[a] - userNumbers[b]
92}
93
94pull(
95 File(path.join(__dirname, series + '.jsonp')),
96 Split(),
97 pull.filter(Boolean),
98 pull.map(JSON.parse),
99 pull.drain(function (interval) {
100 var x = interval.time - startT
101 var ids = interval.ids.sort(compareIds)
102 for (var i = 0; i < ids.length; i++) {
103 var id = ids[i]
104 var y = height - i
105 var color = userColors[id] || [0, 0, 0, 255]
106 setPixel(png.data, x, y, color)
107 }
108 }, function (err) {
109 if (err) throw err
110    png.pack().pipe(fs.createWriteStream(series + '.png'))
111 })
112)
113

Built with git-ssb-web