forked from iamstarkov/jsunderhood
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tweets-stats.js
40 lines (33 loc) · 1.3 KB
/
tweets-stats.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
const { is } = require('ramda');
const { twitterId } = require('../.underhoodrc.json');
const isSelfReply = (tweet) => tweet.in_reply_to_user_id === twitterId;
const isReply = (tweet) => !!tweet.in_reply_to_screen_name && !isSelfReply(tweet);
const isRetweet = (tweet) => !!tweet.retweeted_status;
const sumRetweeted = (state, tweet) => state + tweet.retweet_count;
const sumFavorited = (state, tweet) => state + tweet.favorite_count;
const isOwn = (tweet) => !isReply(tweet) && !isRetweet(tweet);
const getObject = (array, percent) => ({
total: array.length,
percent: Number(array.length / percent || 0).toFixed(2),
});
const getIntObject = (sum, divider) => ({
total: sum,
average: Number(sum / divider || 0).toFixed(2),
});
const tweetsStats = (input) => {
if (!input || !is(Array, input)) return null;
const tweets = input.length;
const percent = tweets / 100;
const own = input.filter(isOwn);
const replies = input.filter(isReply);
const retweets = input.filter(isRetweet);
return {
tweets,
own: getObject(own, percent),
replies: getObject(replies, percent),
retweets: getObject(retweets, percent),
retweeted: getIntObject(own.reduce(sumRetweeted, 0), own.length),
favorited: getIntObject(own.reduce(sumFavorited, 0), own.length),
};
};
module.exports = tweetsStats;