| // Load configs | |
| var config_file = require("./config.json"), // See config-sample.json | |
| environment = "prod", // 'dev' for development or 'prod' for production | |
| config = config_file[environment], | |
| tweet_rate = 20; // Minutes between Tweets | |
| // Load node libs | |
| var util = require("util"), | |
| fs = require('fs'), | |
| path = require('path'), | |
| request = require('request'), | |
| logger = require('./logger.js'), | |
| database = require('./db.js'), | |
| twttr_actions = require('./twttr_actions.js'), | |
| tumblr_actions = require("./tumblr_actions.js"), | |
| request = require('request'); | |
| // Init helpers | |
| var logger = new logger(config), | |
| db = new database(config), | |
| twitter = new twttr_actions(config), | |
| tumblr = new tumblr_actions(config), | |
| Queue_Timer = {}; | |
| var twitter_update_with_media = require('./twttr_media.js'); | |
| var tuwm = new twitter_update_with_media({ | |
| consumer_key: config.twitter.consumer_key, | |
| consumer_secret: config.twitter.consumer_secret, | |
| token: config.twitter.oauth_token, | |
| token_secret: config.twitter.oauth_secret | |
| }); | |
| function expandURL (u, cb) { | |
| console.log(logger.timestamp() + " Fetching " + u); | |
| var result = {}; | |
| var tweeturl = /twitter.com\/\w+\/status\/(\d+)/; | |
| if(u.match(tweeturl)) { | |
| var statusId = u.match(tweeturl)[1] | |
| twitter.show(statusId, function(status, err){ | |
| if (status && status.id_str) { | |
| var media_entities = status.entities.media[0]; | |
| var media_type = media_entities.media_url.match(/tweet_video_thumb/) ? "image/gif" : "invalid"; | |
| var source_url = "https://twitter.com/" + status.user.screen_name + "/statuses/" + status.id_str; | |
| result = { | |
| url: media_entities.display_url, | |
| type: media_type, | |
| size: 9999999999, | |
| twittergif: true, | |
| source_url: source_url | |
| } | |
| if (status.user.screen_name.toUpperCase() === config.twitter.screen_name.toUpperCase()){ | |
| result.type = "invalid"; | |
| } | |
| cb(null, result); | |
| } else { | |
| cb(err, null); | |
| } | |
| }); | |
| } else { | |
| request({ method: "HEAD", url: u, followAllRedirects: true }, function(err, response, body) { | |
| result = { | |
| url: response.request.href, | |
| type: response.request.response.headers['content-type'], | |
| size: response.request.response.headers['content-length'], | |
| twittergif: false | |
| } | |
| if (err) { | |
| logger.log(logger.timestamp() + " Expand error"); | |
| cb(err, null); | |
| } | |
| cb(null, result); | |
| }); | |
| } | |
| } | |
| function postTumblr(url, queue_id, cb){ | |
| var post_id = ""; | |
| var post_url = ""; | |
| var pictwitter = /twitter.com\/\S+\/status\/\d+\/photo\/1/; | |
| if(url.match(pictwitter)) { | |
| cb(""); | |
| } else { | |
| tumblr.post(url, function(err, post_data){ | |
| if (err){ | |
| console.log(logger.timestamp() + " Tumblr err: " + err); | |
| } else { | |
| post_id = post_data.id; | |
| post_url = "http://" + config.tumblr.blog_url + "/post/" + post_id; | |
| var updateVals = { | |
| "tumblr_id": post_id | |
| }; | |
| db.update(updateVals, queue_id, function(){ | |
| if(typeof cb === "function"){ | |
| cb(post_url); | |
| }; | |
| }); | |
| } | |
| }); | |
| } | |
| } | |
| function postFromQueue(){ | |
| db.getOldest(function(queue_item){ | |
| console.log(logger.timestamp() + " Processing " + queue_item.rowid); | |
| var hashtags = (queue_item.hashtags && queue_item.hashtags.length > 0) ? queue_item.hashtags + "\n" : ""; | |
| expandURL(queue_item.url, function(error, expanded){ | |
| if (error) { | |
| console.log(logger.timestamp() + " Expand error (" + (queue_item.rowid) + "): " + error); | |
| twitter.dm(queue_item.user_id, "Expand error (" + (queue_item.rowid) + "): " + error); | |
| var updateVals = { | |
| "queue_state": 5, | |
| "posted_at": logger.epochTimestamp() | |
| }; | |
| db.update(updateVals, queue_item.rowid); | |
| } else if (expanded) { | |
| console.log(logger.timestamp() + " " + expanded.type + " " + expanded.url + " " + expanded.size); | |
| if (expanded.type != "image/gif") { | |
| var msg = logger.timestamp() + " Not a GIF: " + expanded.url; | |
| twitter.dm(queue_item.user_id, msg); | |
| var updateVals = { | |
| "queue_state": 3, | |
| "posted_at": logger.epochTimestamp() | |
| }; | |
| db.update(updateVals, queue_item.rowid); | |
| } else { | |
| if (expanded.twittergif){ | |
| var attribution = (queue_item.post_attr == 1) ? "via @" + queue_item.screen_name + "\n" : "" | |
| var item_data = { | |
| id: queue_item.rowid, | |
| text: hashtags + attribution, | |
| url: expanded.url, | |
| filesize: expanded.size | |
| } | |
| twitter.tweet(item_data.text + "\n" + expanded.source_url + "\n" + expanded.url, function(tweet, error) { | |
| if(error) { | |
| logger.log(logger.timestamp() + "Tweet error"); | |
| updateVals = { | |
| "queue_state": 4, | |
| "posted_at": logger.epochTimestamp(), | |
| "tweet_id": null, | |
| "image_hash": null | |
| }; | |
| db.update(updateVals, queue_item.rowid); | |
| } | |
| if (tweet && tweet.id_str){ | |
| var tweet_id = tweet.id_str, | |
| updateVals = { | |
| "queue_state": 1, | |
| "posted_at": logger.epochTimestamp(), | |
| "tweet_id": tweet_id, | |
| "image_hash": null | |
| }; | |
| db.update(updateVals, queue_item.rowid); | |
| var msg = logger.timestamp() + " Posted (" + queue_item.rowid + "): https://twitter.com/" + config.twitter.screen_name + "/status/" + tweet_id; | |
| twitter.dm(queue_item.user_id, msg); | |
| } | |
| }); | |
| } else { | |
| postTumblr(expanded.url, queue_item.rowid, function(tumblr_url){ | |
| console.log("tumblr_url: " + tumblr_url) | |
| var msg = logger.timestamp() + " Posted to Tumblr (" + queue_item.rowid + "): \n" + tumblr_url; | |
| var attribution = (queue_item.post_attr == 1) ? "via @" + queue_item.screen_name + "\n" : "" | |
| console.log(msg); | |
| // logger.log(msg); | |
| var item_data = { | |
| id: queue_item.rowid, | |
| text: hashtags + attribution + tumblr_url, | |
| url: expanded.url, | |
| filesize: expanded.size | |
| } | |
| var upload_limit = 5242880; | |
| if (item_data.filesize && item_data.filesize > upload_limit){ | |
| twitter.tweet(item_data.text + "\n" + item_data.url, function(tweet, error) { | |
| if(error) { | |
| logger.log(logger.timestamp() + "Tweet error"); | |
| updateVals = { | |
| "queue_state": 4, | |
| "posted_at": logger.epochTimestamp(), | |
| "tweet_id": null, | |
| "image_hash": null | |
| }; | |
| db.update(updateVals, queue_item.rowid); | |
| } | |
| if (tweet && tweet.id_str){ | |
| var tweet_id = tweet.id_str, | |
| updateVals = { | |
| "queue_state": 1, | |
| "posted_at": logger.epochTimestamp(), | |
| "tweet_id": tweet_id, | |
| "image_hash": null | |
| }; | |
| db.update(updateVals, queue_item.rowid); | |
| var msg = logger.timestamp() + " Posted (" + queue_item.rowid + "): https://twitter.com/" + config.twitter.screen_name + "/status/" + tweet_id; | |
| twitter.dm(queue_item.user_id, msg); | |
| } | |
| }); | |
| } else { | |
| twitter.tweet_media(item_data, function(tweet, error) { | |
| if(error) { | |
| logger.log(logger.timestamp() + "Tweet with media error"); | |
| updateVals = { | |
| "queue_state": 4, | |
| "posted_at": logger.epochTimestamp(), | |
| "tweet_id": null, | |
| "image_hash": null | |
| }; | |
| db.update(updateVals, queue_item.rowid); | |
| } | |
| if (tweet && tweet.id_str){ | |
| var tweet_id = tweet.id_str, | |
| updateVals = { | |
| "queue_state": 1, | |
| "posted_at": logger.epochTimestamp(), | |
| "tweet_id": tweet_id, | |
| "image_hash": null | |
| }; | |
| db.update(updateVals, queue_item.rowid); | |
| var msg = logger.timestamp() + " Posted (" + queue_item.rowid + "):\nhttps://twitter.com/" + config.twitter.screen_name + "/status/" + tweet_id; | |
| twitter.dm(queue_item.user_id, msg); | |
| } | |
| }); | |
| } | |
| }); | |
| } | |
| } | |
| } | |
| }); | |
| }); | |
| }; | |
| function processQueue(){ | |
| console.log(logger.timestamp() + " Running..."); | |
| checkQueue(); | |
| setInterval(function(){ | |
| checkQueue(); | |
| }, 120000); | |
| }; | |
| function checkQueue(){ | |
| console.log("Checking queue...") | |
| db.getLastPosted(function(last_post){ | |
| var system_date = Date.now(); | |
| var last_post_time = last_post.posted_at || 0; | |
| var since_last = Math.floor((system_date - last_post_time) / 60000); | |
| console.log(logger.timestamp() + " Last post was " + since_last + " minutes ago"); | |
| if (since_last >= tweet_rate){ | |
| db.get("queue_state", 0, function(tweet_queue){ | |
| if (tweet_queue.length > 0){ | |
| postFromQueue(); | |
| } | |
| }); | |
| } else { | |
| console.log(logger.timestamp() + " Last Tweet was too recent..."); | |
| } | |
| }); | |
| } | |
| processQueue(); |