-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathtwitter.js
122 lines (98 loc) · 2.95 KB
/
twitter.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
'use strict';
var _ = require('lodash');
var async = require('async');
var Twitter = require('twitter');
var cache = require('memory-cache');
/* jshint camelcase: false */
var config = {
consumer_key: 'AuCTJJkwLGemXxxi2IPag',
consumer_secret: '4IIpSfjPbvUNEN3scPogNVuC5Wbseabn2T97kRR1tms',
access_token_key: '2296757942-WIkUaGQyHxHsSe6W4KsWnXStZo9Up6cw5LLqsQq',
access_token_secret: 'esTngppPSimuksCGoeb3UUjkDtYawzgGy3adwiO6eP1tX'
};
var twitter = new Twitter(config);
function parseUser(data) {
return _.extend({
id: _.uniqueId('user'),
/* jshint camelcase: false */
image: data.profile_image_url
}, _.pick(data, 'id_str', 'name', 'screen_name'));
}
function parseTweet(data) {
return _.extend({
id: _.uniqueId('tweet'),
user: parseUser(data.user),
/* jshint camelcase: false */
createdAt: +(new Date(data.created_at))
}, _.pick(data, 'id_str', 'text'));
}
var CACHE_TIME = 1e3 * 60 * 15; // 15 min cache time
exports.getTweets = function(cb) {
var CACHE_KEY = 'TWEETS';
var tweets = cache.get(CACHE_KEY);
if (tweets) {
return process.nextTick(function() {
cb(null, tweets);
});
}
/* jshint camelcase: false */
var opts = {
screen_name: 'nychtml5',
include_rts: true,
exclude_replies: false
};
// https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline
/* jshint camelcase: true */
twitter.get('/statuses/user_timeline.json', opts, function (data) {
if (!Array.isArray(data)) return cb(new Error('No twitter data available'));
tweets = data.map(parseTweet);
cache.put(CACHE_KEY, tweets, CACHE_TIME);
cb(null, tweets);
});
};
exports.getMentions = function(cb) {
var CACHE_KEY = 'MENTIONS';
var tweets = cache.get(CACHE_KEY);
if (tweets) {
return process.nextTick(function() {
cb(null, tweets);
});
}
/* jshint camelcase: false */
var opts = {
};
// https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline
/* jshint camelcase: true */
twitter.get('/statuses/mentions_timeline.json', opts, function (data) {
if (!Array.isArray(data)) return cb(new Error('No twitter data available'));
tweets = data.map(parseTweet);
cache.put(CACHE_KEY, tweets, CACHE_TIME);
cb(null, tweets);
});
};
exports.get = function(cb) {
function getTweets(done) {
exports.getTweets(function(err, t) {
if (err) t = [];
done(null, t);
});
}
function getMentions(done) {
exports.getMentions(function(err, t) {
if (err) t = [];
done(null, t);
});
}
// I think there is some sort of "mutable" bug for twitter api
// that doesn't allow parallel...so use series
async.series([getTweets, getMentions], function(err, results) {
if (err) return cb(err);
var tweets = _.flatten(results);
tweets.sort(function(a, b) {
/* jshint camelcase: false */
return a.createdAt < b.createdAt;
});
tweets = _.uniq(tweets, true, _.property('text'));
cb(null, tweets);
});
};