-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
120 lines (106 loc) · 3.92 KB
/
index.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
// process.env.NODE_ENV = 'testing';
process.env.NODE_ENV = 'production';
const Snooper = require('reddit-snooper');
const request = require('request');
const moment = require('moment');
const config = require('config')
const events = require('events');
const database = require('./database');
const botName = 'darnbot';
const accounts = JSON.parse(JSON.stringify(config.get('accounts')));
const multiName = config.get('multiName');
var counter = 0;
var subsList = [];
var subs = '';
console.log('Available accounts:', Object.keys(accounts));
console.log('botName: '+ botName);
console.log('multiName: '+ multiName);
const snooper = new Snooper(accounts[botName]);
module.exports = new events.EventEmitter();
function getSubs() {
return new Promise(function(resolve, reject) {
snooper.api.get(`/api/multi/user/${botName}/m/${multiName}`, {}, function (err, statusCode, res) {
if (err) {
console.log(err);
reject(err);
}
res.data.subreddits.forEach(function(sub) {
subsList.push(sub.name)
});
subs = subsList.join('+');
module.exports.emit('updateSubs', subsList);
console.log(`Listening on (${subsList.length}):`, subsList);
resolve();
});
});
}
async function getLatestCount() {
var count, after;
while (!count) {
console.log(`Trying to find count after ${after}`);
await new Promise(function(resolve, reject) {
request(`https://www.reddit.com/user/${botName}/comments.json` + (after ? `?after=${after}`: ''), (err, res, body) => {
if (err) {
console.error(err);
reject(err);
}
var data = JSON.parse(body);
// var re = /Darn[ \^]*Counter:[ \^]*(\d+)/gi;
var re = /Darn ?Counter: ?(\d+)/gi;
var result = re.exec(body);
console.log('Regex match:', !!result);
if (!result) {
after = data.data.after;
return resolve();
} else {
count = parseInt(result[1]);
return resolve();
}
});
});
}
console.log('Setting counter to', count);
counter = count;
module.exports.emit('updateCounter', count);
}
function listenForComments() {
snooper.watcher.getCommentWatcher(subs).on('comment', function(comment) {
if (comment.data.author == botName) {return;}
console.log('u/' + comment.data.author + ' posted', comment.data.body.replace(/[\n\r]/gm,'').substring(0, 20));
var count = (comment.data.body.match(/darn[^(ell)]?/gi) || []).length;
if (count) {
comment.data.created_iso = moment.unix(comment.data.created_utc).toISOString();
comment.data.darnCount = count;
var commentToSave = new database.Comment(comment.data);
commentToSave.save(function (err, comment) {
if (err) return console.error(err);
console.log('Saved comment', comment.id);
});
counter += count;
console.log(count, 'Darn(s)! Updating counter to', counter);
module.exports.emit('updateCounter', counter);
module.exports.emit('newComment', {body: comment.data.body, link: 'https://www.reddit.com'+comment.data.permalink, author: comment.data.author});
postComment(comment);
}
}).on('error', console.error);
}
function postComment(ref) {
snooper.api.post("/api/comment", {
api_type: "json",
text: `What a ***darn*** shame...\n\n---\n^^DarnCounter:${counter} ^^| ^^DM ^^me ^^with: ^^'blacklist-me' ^^to ^^be ^^ignored ^^| ^^More ^^stats ^^available ^^at ^^**[https://darnbot.ml](https://darnbot.ml)**`,
thing_id: ref.data.name
}, function (err, statusCode, data) {
if (!err) {
console.log('Replied to comment: ' + ref.data.name)
} else {
console.log(err);
}
})
}
database.emitter.on('newStats', function(stats) {
module.exports.emit('newStats', stats);
});
database.emitter.on('GBBB', function(res) {
module.exports.emit('GBBB', res);
});
getSubs().then(getLatestCount).then(listenForComments).catch(e => console.error(err));