Files: feae41682ef1f578382eaba8aa4f86e2e734f88b / run.js
2894 bytesRaw
1 | var fs = require('fs') |
2 | var path = require('path') |
3 | var pull = require('pull-stream') |
4 | var File = require('pull-file') |
5 | var Split = require('pull-split') |
6 | var PNG = require('pngjs').PNG |
7 | |
8 | var start = new Date('2015-08-05').getTime() |
9 | var startDay = Math.floor(start / 86400000) |
10 | var startWeek = Math.floor(start / 86400000 / 7) |
11 | var startMonth = Math.floor(start / 86400000 / 30.43666666666666666666) |
12 | var startT |
13 | |
14 | var now = Date.now() |
15 | var nowDay = Math.floor(now / 86400000) |
16 | var nowWeek = Math.floor(now / 86400000 / 7) |
17 | var nowMonth = Math.floor(now / 86400000 / 30.43666666666666666666) |
18 | |
19 | var series = process.argv[2] |
20 | if (!series) throw new TypeError('Missing series argument') |
21 | |
22 | if (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 | |
35 | var info = JSON.parse(fs.readFileSync(path.join(__dirname, series + '.json'))) |
36 | var ids = JSON.parse(fs.readFileSync(path.join(__dirname, 'ids.json'))) |
37 | |
38 | var width |
39 | var height = info.max |
40 | |
41 | var png = new PNG({ |
42 | width: width, |
43 | height: height, |
44 | colorType: 6 |
45 | }) |
46 | |
47 | var 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 | |
56 | function 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 | |
68 | var userColors = {} |
69 | var userNumbers = {} |
70 | |
71 | for (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 | |
82 | function 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 | |
90 | function compareIds(a, b) { |
91 | return userNumbers[a] - userNumbers[b] |
92 | } |
93 | |
94 | pull( |
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