• Source
    1. 'use strict';
    2.  
    3. require('dotenv').config();
    4.  
    5. var Twitter = require('twit');
    6. var request = require('request');
    7. var config = {
    8. /* 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 */
    9. twitter: {
    10. consumer_key: process.env.CONSUMER_KEY,
    11. consumer_secret: process.env.CONSUMER_SECRET,
    12. access_token: process.env.ACCESS_TOKEN,
    13. access_token_secret: process.env.ACCESS_TOKEN_SECRET
    14. }
    15. };
    16.  
    17. var twitter = new Twitter(config.twitter);
    18.  
    19. var userStream = twitter.stream('user');
    20.  
    21. userStream.on('direct_message', function (eventMsg) {
    22. try {
    23. //console.log(eventMsg.direct_message.sender.screen_name);
    24. postTweet(eventMsg.direct_message.text, eventMsg.direct_message.id_str, eventMsg.direct_message.sender.screen_name);
    25. } catch (err) {
    26. console.log("Unexpected error handling direct Message : ", eventMsg.direct_message);
    27. }
    28. });
    29.  
    30. userStream.on('connect', function (response) {
    31. console.log("User Stream Opening Twitter streaming connection.");
    32. });
    33.  
    34. // Connection opened
    35. userStream.on("connected", function (response) {
    36. console.log("UserStream Streaming...");
    37. });
    38.  
    39. // Stream of @mentions for weather_account
    40. var stream = twitter.stream('statuses/filter', { track: process.env.BOT_ACCOUNT });
    41.  
    42. // Attempting connection to streaming API
    43. stream.on('connect', function (response) {
    44. console.log("Opening Twitter streaming connection.");
    45. });
    46.  
    47. // Connection opened
    48. stream.on("connected", function (response) {
    49. console.log("Streaming...");
    50. });
    51.  
    52. // The @mentions
    53. stream.on('tweet', function (tweet) {
    54. try {
    55. //console.log(tweet);
    56. handleTweet(tweet);
    57. } catch (err) {
    58. console.log("Unexpected error handling tweet: ", tweet)
    59. }
    60. });
    61.  
    62. function handleTweet(tweet) {
    63. // Remove its own tag before tweeting the text
    64. var status = tweet.text.replace('@perfmetrics_bot', '');
    65. postTweet(status, tweet.id_str, tweet.user.screen_name);
    66. }
    67.  
    68. function postTweet(text, inReplyTo, accountValidation) {
    69. var auth_accounts = process.env.AUTH_ACC.split(' ');
    70. var retweet = false;
    71. console.log(accountValidation);
    72. for (var i in auth_accounts) {
    73. if (accountValidation === auth_accounts[i]) {
    74. retweet = true;
    75. break;
    76. }
    77. }
    78. if (retweet) {
    79. console.log("Account {0} is authorized to retweet! Tweeting the text again...", auth_accounts[i]);
    80.  
    81. twitter.post('statuses/update', { status: text, in_reply_to_status_id: inReplyTo }, function (err, data, response) {
    82. if (err) {
    83. console.log(err);
    84. }
    85. });
    86. }
    87. }
    88.  
    89. function isBlockedAccount(accName) {
    90. var blocked_accounts = process.env.BLOCKED_ACCOUNTS.split(' ');
    91. for (var i in blocked_accounts) {
    92. if (accName === blocked_accounts[i]) {
    93. return true;
    94. }
    95. }
    96. return false;
    97. }
    98.  
    99. var express = require('express');
    100. var app = express();
    101.  
    102. app.use(express.static('public'));
    103.  
    104. // Just keep the bot running, we don't want you destroyed on heroku...
    105. var listener = app.listen(process.env.PORT, function () {
    106. console.log('Your bot is running on port ' + listener.address().port);
    107. retweetFromSearch();
    108. });
    109.  
    110. app.all("/" + process.env.BOT_ENDPOINT, function (request, response) {
    111. var resp = response;
    112. resp.sendStatus(200);
    113. });
    114.  
    115. function retweetFromSearch() {
    116. var query = {
    117. q: process.env.SEARCH_PHRASE,
    118. result_type: "recent"
    119. }
    120. twitter.get('search/tweets', query, function (err, data, response) {
    121. if (err) {
    122. console.log("Error retweeting from Search!" + err);
    123. } else {
    124. //console.log(data);
    125. if (data.search_metadata.count > 0) {
    126. for (var i = 0; i < data.search_metadata.count; i++) {
    127. if (isBlockedAccount(data.statuses[i].user.screen_name)) {
    128. //console.log("Blocked Account: " + data.statuses[i].user.screen_name + ". Retweet NULLIFIED...");
    129. continue;
    130. }
    131. /* Skip if there is RT in the text. i.e. I am not justing RTing stuff */
    132. if (data.statuses[i].text.includes("RT")) {
    133. continue;
    134. }
    135. /* All these tweets are only retweets hence...*/
    136. var id = {
    137. id: data.statuses[i].id_str
    138. }
    139. twitter.post('statuses/retweet/:id', id, function (error, response) {
    140. if (error) {
    141. console.log("Could not retweet" + error);
    142. }
    143. });
    144. }
    145. }
    146. }
    147. });
    148.  
    149. /* Lets play this game every set time */
    150. setInterval(retweetFromSearch, process.env.RETWEET_TIME_MIN * 60000);
    151. }