'use strict';
require('dotenv').config();
var Twitter = require('twit');
var request = require('request');
var config = {
/* Be sure to update the .env file with your API keys. See how to get them: https://botwiki.org/tutorials/how-to-create-a-twitter-app */
twitter: {
consumer_key: process.env.CONSUMER_KEY,
consumer_secret: process.env.CONSUMER_SECRET,
access_token: process.env.ACCESS_TOKEN,
access_token_secret: process.env.ACCESS_TOKEN_SECRET
}
};
var twitter = new Twitter(config.twitter);
var userStream = twitter.stream('user');
userStream.on('direct_message', function (eventMsg) {
try {
//console.log(eventMsg.direct_message.sender.screen_name);
postTweet(eventMsg.direct_message.text, eventMsg.direct_message.id_str, eventMsg.direct_message.sender.screen_name);
} catch (err) {
console.log("Unexpected error handling direct Message : ", eventMsg.direct_message);
}
});
userStream.on('connect', function (response) {
console.log("User Stream Opening Twitter streaming connection.");
});
// Connection opened
userStream.on("connected", function (response) {
console.log("UserStream Streaming...");
});
// Stream of @mentions for weather_account
var stream = twitter.stream('statuses/filter', { track: process.env.BOT_ACCOUNT });
// Attempting connection to streaming API
stream.on('connect', function (response) {
console.log("Opening Twitter streaming connection.");
});
// Connection opened
stream.on("connected", function (response) {
console.log("Streaming...");
});
// The @mentions
stream.on('tweet', function (tweet) {
try {
//console.log(tweet);
handleTweet(tweet);
} catch (err) {
console.log("Unexpected error handling tweet: ", tweet)
}
});
function handleTweet(tweet) {
// Remove its own tag before tweeting the text
var status = tweet.text.replace('@perfmetrics_bot', '');
postTweet(status, tweet.id_str, tweet.user.screen_name);
}
function postTweet(text, inReplyTo, accountValidation) {
var auth_accounts = process.env.AUTH_ACC.split(' ');
var retweet = false;
console.log(accountValidation);
for (var i in auth_accounts) {
if (accountValidation === auth_accounts[i]) {
retweet = true;
break;
}
}
if (retweet) {
console.log("Account {0} is authorized to retweet! Tweeting the text again...", auth_accounts[i]);
twitter.post('statuses/update', { status: text, in_reply_to_status_id: inReplyTo }, function (err, data, response) {
if (err) {
console.log(err);
}
});
}
}
function isBlockedAccount(accName) {
var blocked_accounts = process.env.BLOCKED_ACCOUNTS.split(' ');
for (var i in blocked_accounts) {
if (accName === blocked_accounts[i]) {
return true;
}
}
return false;
}
var express = require('express');
var app = express();
app.use(express.static('public'));
// Just keep the bot running, we don't want you destroyed on heroku...
var listener = app.listen(process.env.PORT, function () {
console.log('Your bot is running on port ' + listener.address().port);
retweetFromSearch();
});
app.all("/" + process.env.BOT_ENDPOINT, function (request, response) {
var resp = response;
resp.sendStatus(200);
});
function retweetFromSearch() {
var query = {
q: process.env.SEARCH_PHRASE,
result_type: "recent"
}
twitter.get('search/tweets', query, function (err, data, response) {
if (err) {
console.log("Error retweeting from Search!" + err);
} else {
//console.log(data);
if (data.search_metadata.count > 0) {
for (var i = 0; i < data.search_metadata.count; i++) {
if (isBlockedAccount(data.statuses[i].user.screen_name)) {
//console.log("Blocked Account: " + data.statuses[i].user.screen_name + ". Retweet NULLIFIED...");
continue;
}
/* Skip if there is RT in the text. i.e. I am not justing RTing stuff */
if (data.statuses[i].text.includes("RT")) {
continue;
}
/* All these tweets are only retweets hence...*/
var id = {
id: data.statuses[i].id_str
}
twitter.post('statuses/retweet/:id', id, function (error, response) {
if (error) {
console.log("Could not retweet" + error);
}
});
}
}
}
});
/* Lets play this game every set time */
setInterval(retweetFromSearch, process.env.RETWEET_TIME_MIN * 60000);
}