Skip to content

Instantly share code, notes, and snippets.

@Roach

Roach/queue_handler.js Secret

Created Mar 12, 2016
Embed
What would you like to do?
// 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();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.