Skip to content

Commit 7fb1d70

Browse files
committed
add dotenv
clean up package.json add standard as a dev dependency remove sentiment api key
1 parent da80966 commit 7fb1d70

File tree

8 files changed

+112
-126
lines changed

8 files changed

+112
-126
lines changed

.env

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
CONSUMER_KEY=AmMSbu2vMs9sjo5Nh4BcdMhxg
2+
CONSUMER_SECRET=eQUfMrHbtlXVC9dhXUzwkFNNj1H107PFv1mvWwEM6CZH0fjymV
3+
ACCESS_TOKEN=744878492-uEcacdl7HJ1Xb7vAyNpSecKpi90bFhdsGG2N7iII
4+
ACCESS_TOKEN_SECRET=77vGPTt20x4lsEQZ0mw2ZAU8wNKAPU8Qz2c0PhOo43cGO
5+
SENTIMENT_KEY=QqtO3XbGhFmshEmKBxy58FqKLvG3p1rx61ijsnaHTstuRd3jp0

index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
require('./src/bot')
1+
require('./src/bot')

package.json

+7-3
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,19 @@
2424
},
2525
"license": "MIT",
2626
"dependencies": {
27+
"dotenv": "^4.0.0",
2728
"fs-extra": "2.0.0",
28-
"level": "*",
29+
"level": "^1.6.0",
2930
"twit": "2.2.5",
30-
"unique-random-array": "*",
31+
"unique-random-array": "1.0.0",
3132
"unirest": "0.5.1"
3233
},
3334
"repository": {
3435
"type": "git",
3536
"url": "https://github.com/freeCodeCamp/100DaysOfCode-twitter-bot.git"
3637
},
37-
"homepage": "https://github.com/freeCodeCamp/100DaysOfCode"
38+
"homepage": "https://github.com/freeCodeCamp/100DaysOfCode",
39+
"devDependencies": {
40+
"standard": "^8.6.0"
41+
}
3842
}

src/bot.js

+44-57
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
/**
22
* DEPENDENCIES
33
*/
4-
"use strict" // c9 use
5-
var twit = require('twit')
4+
'use strict' // c9 use
5+
var Twit = require('twit')
66
var ura = require('unique-random-array')
77
var config = require('./config')
88
var sentiment = require('./helpers/sentiment')
99
var db = require('./helpers/db')
1010
var strings = require('./helpers/strings')
1111

12-
var Twitter = new twit(config)
12+
var Twitter = new Twit(config)
1313

1414
// Frequency in minutes
1515
var retweetFrequency = 30
@@ -23,34 +23,30 @@ console.log('Welcome to #100DaysOfCode')
2323

2424
// RETWEET
2525
// find latest tweets according to #100DaysOfCode
26-
var retweet = function() {
26+
var retweet = function () {
2727
var params = {
2828
q: queryString,
2929
result_type: 'recent',
3030
lang: 'en'
3131
}
3232
// for more parameters options, see: https://dev.twitter.com/rest/reference/get/search/tweets
33-
Twitter.get('search/tweets', params, function(err, data) {
33+
Twitter.get('search/tweets', params, function (err, data) {
3434
// if no errors
3535
if (!err) {
3636
// grab ID of tweet to retweet
3737
var retweetId = data.statuses[0].id_str
3838
// Tell Twitter to retweet
3939
Twitter.post('statuses/retweet/:id', {
4040
id: retweetId
41-
}, function(err, response) {
41+
}, function (err, response) {
4242
// if error while retweet
4343
if (err) {
4444
console.log('While Retweet. ERROR!...Maybe Duplicate Tweet')
45-
}
46-
else {
45+
} else {
4746
console.log('Retweet. SUCCESS!')
4847
}
49-
5048
})
51-
}
52-
// if unable to search a tweet
53-
else {
49+
} else { // if unable to search a tweet
5450
console.log('Cannot Search Tweet. ERROR!')
5551
}
5652
})
@@ -62,7 +58,7 @@ setInterval(retweet, 1000 * 60 * retweetFrequency)
6258

6359
// FAVORITE ==============================
6460
// find a random tweet using querySring and 'favorite' it
65-
var favoriteTweet = function() {
61+
var favoriteTweet = function () {
6662
var params = {
6763
q: queryString,
6864
result_type: 'recent',
@@ -71,22 +67,21 @@ var favoriteTweet = function() {
7167
// for more parameters, see: https://dev.twitter.com/rest/reference
7268

7369
// find a tweet
74-
Twitter.get('search/tweets', params, function(err, data) {
70+
Twitter.get('search/tweets', params, function (err, data) {
7571
// find tweets randomly
7672
var tweet = data.statuses
77-
var randomTweet = ranDom(tweet) //pick a random tweet
73+
var randomTweet = ranDom(tweet) // pick a random tweet
7874

79-
//if random tweet is found
80-
if (typeof randomTweet != 'undefined') {
75+
// if random tweet is found
76+
if (typeof randomTweet !== 'undefined') {
8177
// Tell Twitter to 'favorite' it
8278
Twitter.post('favorites/create', {
8379
id: randomTweet.id_str
84-
}, function(err, response) {
80+
}, function (err, response) {
8581
// if error while 'favorite'
8682
if (err) {
8783
console.log('Cannot Favorite. ERROR!')
88-
}
89-
else {
84+
} else {
9085
console.log('Favorite Done. SUCCESS!')
9186
}
9287
})
@@ -107,7 +102,7 @@ var userStream = Twitter.stream('user')
107102
userStream.on('follow', followed)
108103

109104
// ...trigger the callback
110-
function followed(event) {
105+
function followed (event) {
111106
console.log('Follow Event now RUNNING')
112107
// get USER's twitter handler (screen name)
113108
var name = event.source.name
@@ -117,15 +112,14 @@ function followed(event) {
117112
}
118113

119114
// function definition to tweet back to USER who followed
120-
function tweetNow(tweetTxt) {
115+
function tweetNow (tweetTxt) {
121116
var tweet = {
122117
status: tweetTxt
123118
}
124-
Twitter.post('statuses/update', tweet, function(err, data, response) {
119+
Twitter.post('statuses/update', tweet, function (err, data, response) {
125120
if (err) {
126-
console.log("Cannot Reply to Follower. ERROR!")
127-
}
128-
else {
121+
console.log('Cannot Reply to Follower. ERROR!')
122+
} else {
129123
console.log('Reply to follower. SUCCESS!')
130124
}
131125
})
@@ -137,14 +131,13 @@ const hashtagStream = Twitter.stream('statuses/filter', {
137131
})
138132

139133
// Function that checks if day 1 or day 100
140-
var checkIfFirstOrLastDay = function() {
134+
var checkIfFirstOrLastDay = function () {
141135
hashtagStream.on('tweet', (tweet) => {
142136
if (checkIfLastDay(tweet)) {
143137
console.log(`Sending a congrats to @${tweet.user.screen_name}`)
144138
tweetNow(`WOOT! You did it @${tweet.user.screen_name}! Party Time!`)
145-
}
146-
else if (checkIfFirstDay(tweet)) {
147-
console.log('Sending a congrats to @${tweet.user.screen_name}')
139+
} else if (checkIfFirstDay(tweet)) {
140+
console.log(`Sending a congrats to @${tweet.user.screen_name}`)
148141
tweetNow(`Congrats on your first day @${tweet.user.screen_name}! Keep it up!`)
149142
}
150143
})
@@ -154,7 +147,7 @@ setImmediate(checkIfFirstOrLastDay, 1000 * 60 * firstOrLastDayFrequency)
154147

155148
// NOTE: String elements in firstDay & lastDay are case insensitive
156149

157-
function checkIfFirstDay(tweet) {
150+
function checkIfFirstDay (tweet) {
158151
const firstDay = ['first day', 'day one', 'day 1/100']
159152
const firstdayRegex = /\bday\s?0?1\b/i
160153
console.log(`Checking if first day`)
@@ -165,7 +158,7 @@ function checkIfFirstDay(tweet) {
165158
}
166159
}
167160

168-
function checkIfLastDay(tweet) {
161+
function checkIfLastDay (tweet) {
169162
const lastDay = ['#day100', 'final day', 'day 100', 'one hundred', '100/100']
170163
const lastdayRegex = /\bday\s?100\b/i
171164
console.log(`Checking if Last day`)
@@ -176,28 +169,26 @@ function checkIfLastDay(tweet) {
176169
}
177170
}
178171

179-
function checkTweetForText(tweetText, value) {
172+
function checkTweetForText (tweetText, value) {
180173
return tweetText.toLowerCase().indexOf(value) > -1 && tweetText.toLowerCase().indexOf('100daysofcode') > -1
181174
}
182175

183-
function ranDom(arr) {
176+
function ranDom (arr) {
184177
var index = Math.floor(Math.random() * arr.length)
185178
return arr[index]
186179
}
187180

188181
// PROJECT OF THE DAY TWEET
189-
function tweetProjectOfTheDay() {
190-
182+
function tweetProjectOfTheDay () {
191183
var projectOfTheDay = ura(strings.projectOfTheDay)
192184

193185
var message = 'Todays #100DaysOfCode #301DaysOfCode #ProjectOfTheDay, ' + projectOfTheDay()
194186

195187
Twitter.post('statuses/update', {
196188
status: message
197-
}, function(err, data, response) {
189+
}, function (err, data, response) {
198190
console.log('POST PROJECT OF THE DAY!')
199191
})
200-
201192
}
202193

203194
// // post random project of the day
@@ -210,42 +201,38 @@ const hashtagStream2 = Twitter.stream('statuses/filter', {
210201
track: '#100DaysOfCode'
211202
})
212203

213-
var sentimentBot = function() {
204+
var sentimentBot = function () {
214205
hashtagStream2.on('tweet', (tweet) => {
215206
console.log(`Sentiment Bot Running`)
216207
// Setup the http call
217208
var httpCall = sentiment.init()
218209

219210
// Don't do anything if it's the bot tweet
220-
if (tweet.user.screen_name == '_100DaysOfCode') return
221-
222-
httpCall.send("txt=" + tweet.text).end(function(result) {
211+
if (tweet.user.screen_name === '_100DaysOfCode') return
223212

213+
httpCall.send('txt=' + tweet.text).end(function (result) {
224214
var sentim = result.body.result.sentiment
225215
var confidence = parseFloat(result.body.result.confidence)
226216

227217
// if sentiment is Negative and the confidence is above 75%
228-
if (sentim == 'Negative' && confidence >= 75) {
229-
218+
if (sentim === 'Negative' && confidence >= 75) {
230219
// get a random quote
231220
var phrase = sentiment.randomQuote()
232-
var screen_name = tweet.user.screen_name
221+
var screenName = tweet.user.screen_name
233222

234223
// Check key isn't in db already, key being the screen_name
235-
db.get(screen_name, function(err, value) {
236-
237-
if (typeof(value) !== 'undefined') {
238-
console.log('ALREADY IN DB USER ', screen_name)
239-
}
240-
else {
241-
// Put a user name and that they have been encouraged
242-
db.put(screen_name, 'encourage', function(err) {
224+
db.get(screenName, function (err, value) {
225+
if (typeof (value) !== 'undefined') {
226+
console.log('ALREADY IN DB USER ', screenName)
227+
} else {
228+
// Put a user name and that they have been encouraged
229+
db.put(screenName, 'encourage', function (err) {
243230
if (err) return console.log('Ooops!', err) // some kind of I/O error
244231

245-
console.log('LOGGED USER ', screen_name)
232+
console.log('LOGGED USER ', screenName)
246233

247234
// tweet a random encouragement phrase
248-
tweetNow('@' + screen_name + ' ' + phrase)
235+
tweetNow('@' + screenName + ' ' + phrase)
249236
})
250237
}
251238
})
@@ -256,10 +243,10 @@ var sentimentBot = function() {
256243

257244
sentimentBot()
258245

259-
var refreshDB = function() {
246+
var refreshDB = function () {
260247
var fs = require('fs-extra')
261248

262-
fs.remove('./blacklistUsersDb', function(err) {
249+
fs.remove('./blacklistUsersDb', function (err) {
263250
if (err) return console.error(err)
264251

265252
console.log('success!')

src/config.js

+7-12
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,8 @@
1-
/*
2-
* TWITTER APP CONFIGURATION
3-
* consumer_key
4-
* consumer_secret
5-
* access_token
6-
* access_token_secret
7-
*/
1+
require('dotenv').config()
2+
83
module.exports = {
9-
consumer_key: 'OPVPonGhy0xxiXJoMDDgzk9rr',
10-
consumer_secret: 'aBNYfBwUjkytAeOPtuIaJcZPuvsRck0DhMqQ615Et71KItFZwp',
11-
access_token: '744776302591303680-fdydcRgorbFTv6uZjorJ6kGx631ft06',
12-
access_token_secret: 'nz024mf9DYXPq2g6s8NbMlrGIX0QlM8mZUWE0UhavuYQg'
13-
};
4+
consumer_key: process.env.CONSUMER_KEY,
5+
consumer_secret: process.env.CONSUMER_SECRET,
6+
access_token: process.env.ACCESS_TOKEN,
7+
access_token_secret: process.env.ACCESS_TOKEN_SECRET
8+
}

src/helpers/db.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
var level = require('level');
2-
var path = require('path');
1+
var level = require('level')
2+
var path = require('path')
33

4-
var dbPath = process.env.DB_PATH || path.join(__dirname, 'blacklistUsersDb');
5-
var db = level(dbPath);
4+
var dbPath = process.env.DB_PATH || path.join(__dirname, 'blacklistUsersDb')
5+
var db = level(dbPath)
66

7-
module.exports = db;
7+
module.exports = db

src/helpers/sentiment.js

+10-15
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,30 @@
1-
const unirest = require('unirest');
2-
const fs = require("fs");
1+
const unirest = require('unirest')
2+
const fs = require('fs')
33

44
/*
55
Get a new API key at https://market.mashape.com/vivekn/sentiment-3
66
*/
77

8-
9-
// Sentiment 3 Mashape API key
10-
var apiKey = "QqtO3XbGhFmshEmKBxy58FqKLvG3p1rx61ijsnaHTstuRd3jp0"
11-
128
var sentiment = {}
139

1410
sentiment.init = function () {
15-
return unirest.post("https://community-sentiment.p.mashape.com/text/")
16-
.header("X-Mashape-Key", apiKey)
17-
.header("Content-Type", "application/x-www-form-urlencoded")
18-
.header("Accept", "application/json")
11+
return unirest.post('https://community-sentiment.p.mashape.com/text/')
12+
.header('X-Mashape-Key', process.env.SENTIMENT_KEY)
13+
.header('Content-Type', 'application/x-www-form-urlencoded')
14+
.header('Accept', 'application/json')
1915
}
2016

21-
2217
sentiment.randomQuote = function () {
2318
// Get content from file
24-
var contents = fs.readFileSync("./src/helpers/quotes.json");
19+
var contents = fs.readFileSync('./src/helpers/quotes.json')
2520

2621
// Define to JSON type
27-
var jsonContent = JSON.parse(contents);
22+
var jsonContent = JSON.parse(contents)
2823

2924
// Random number
30-
var randomIndex = Math.floor(Math.random() * jsonContent.quotes.length)
25+
var randomIndex = Math.floor(Math.random() * jsonContent.quotes.length)
3126

32-
return jsonContent.quotes[randomIndex]
27+
return jsonContent.quotes[randomIndex]
3328
}
3429

3530
module.exports = sentiment

0 commit comments

Comments
 (0)