-
Notifications
You must be signed in to change notification settings - Fork 6
/
monitorYours.js
53 lines (40 loc) · 1.42 KB
/
monitorYours.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
const Discord = require('discord.js');
const delay = require('delay');
const superagent = require('superagent');
const { last } = require('lodash');
const { RichEmbed } = Discord;
const BASE_URL = 'https://www.yours.org/';
const TICK_INTERVAL = 30e3;
const redisKey = _ => `shilly.monitorYours.${_}`;
const monitorYours = async ({ say, redisClient }) => {
const tick = async () => {
const head = new Date(await redisClient.getAsync(redisKey('head')));
const { body: posts } = await superagent
.get(`${BASE_URL}api/contents/home/crypto/new/0`)
.retry();
const newPosts = posts.filter(_ => new Date(_.createdAt) > head).reverse();
for (const post of newPosts) {
const embed = new RichEmbed({
title: post.title,
thumbnail: post.thumbnailUrl && { url: post.thumbnailUrl },
url: `${BASE_URL}content/${post.titleUrlString}/`,
timestamp: new Date(post.createdAt),
description: 'Read more on yours.org',
});
await say({ embed });
}
if (newPosts.length) {
// Set head to the most recent post
await redisClient.setAsync(redisKey('head'), last(newPosts).createdAt);
}
};
const hasHead = await redisClient.existsAsync(redisKey('head'));
if (!hasHead) {
await redisClient.setAsync(redisKey('head'), new Date().toISOString());
}
while (true) {
await tick();
await delay(TICK_INTERVAL);
}
};
module.exports = monitorYours;