- +138 −159 daemon.js
- +98 −0 db.js
- +3 −0 db/.gitignore
- +24 −0 logger.js
- +2 −1 package.json
- +23 −0 tumblr_actions.js
- +63 −0 twttr_actions.js
| @@ -0,0 +1,98 @@ | ||
| var dblite = require('dblite'), | ||
| util = require('util'); | ||
|
|
||
| var serializeQuery = function(obj) { | ||
| var pairs = []; | ||
| for (var prop in obj) { | ||
| if (!obj.hasOwnProperty(prop)) { continue } | ||
| pairs.push(prop + '=' + obj[prop]); | ||
| } | ||
| return pairs.join(','); | ||
| }; | ||
|
|
||
| function db(config) { | ||
| var table_name = config.twitter.screen_name + "_db", | ||
| database = new dblite('./' + config.twitter.screen_name + '.db'); | ||
|
|
||
| createQuery = util.format("CREATE TABLE IF NOT EXISTS %s (ROWID INTEGER PRIMARY KEY, message_id TEXT, user_id TEXT, screen_name TEXT, message_text TEXT, url TEXT, tumblr_id TEXT, tweet_id TEXT, favs INTEGER, retweets INTEGER, queued_at INTEGER, posted_at INTEGER, queue_state INTEGER)", table_name); | ||
| database.query(createQuery); | ||
|
|
||
| database.on('close', function (code) { | ||
| // Without this, it logs "Bye bye" every time it closes the db. | ||
| // console.log("Closing: " + code); | ||
| }); | ||
|
|
||
| var responseTemplate = { | ||
| record_id: Number, | ||
| message_id: String, | ||
| user_id: String, | ||
| screen_name: String, | ||
| message_text: String, | ||
| url: String, | ||
| tumblr_id: String, | ||
| tweet_id: String, | ||
| favs: Number, | ||
| retweets: Number, | ||
| queued_at: Number, | ||
| posted_at: Number, | ||
| queue_state: Number | ||
| }; | ||
|
|
||
| this.get = function(column, value, cb){ | ||
| query = util.format("SELECT * FROM %s WHERE %s = %s", table_name, column, value); | ||
| database.query(query, responseTemplate, function(err, res){ | ||
| if(typeof cb === "function"){ | ||
| cb(res); | ||
| }; | ||
| }); | ||
| }, | ||
| this.insert = function(values, cb){ | ||
| query = util.format("INSERT INTO %s VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ,?)", table_name); | ||
| database.query(query, values, function(err, res){ | ||
| database.lastRowID(table_name, function(rowid){ | ||
| if(typeof cb === "function"){ | ||
| cb(rowid); | ||
| }; | ||
| }); | ||
| }); | ||
| }, | ||
| this.update = function(update_vals, record_id, cb){ | ||
| values = serializeQuery(update_vals); | ||
| query = util.format("UPDATE %s SET %s WHERE rowid = %s", table_name, values, record_id); | ||
| database.query(query, responseTemplate, function(err, res){ | ||
| if(typeof cb === "function"){ | ||
| cb(record_id); | ||
| }; | ||
| }); | ||
| }, | ||
| this.getOldest = function(cb){ | ||
| query = util.format("SELECT * FROM %s WHERE queue_state = 0 ORDER BY ROWID ASC LIMIT 1", table_name); | ||
| database.query(query, responseTemplate, function(err, res){ | ||
| if(typeof cb === "function"){ | ||
| cb(res); | ||
| }; | ||
| }); | ||
| }, | ||
| this.getLastPosted = function(cb){ | ||
| query = util.format("SELECT * FROM %s WHERE queue_state = 1 ORDER BY posted_at DESC LIMIT 1", table_name); | ||
| database.query(query, responseTemplate, function(err, res){ | ||
| if(typeof cb === "function"){ | ||
| cb(res); | ||
| }; | ||
| }); | ||
| }, | ||
| this.close = function(){ | ||
| database.close(); | ||
| }; | ||
|
|
||
| // query = util.format("SELECT * FROM gifs_db"); | ||
| // database.query(query, responseTemplate, function(err, res){ | ||
| // console.log(res); | ||
| // }); | ||
|
|
||
| // query = util.format("DELETE FROM gifsdev_db where queue_state = 1 and posted_at is null"); | ||
| // database.query(query); | ||
|
|
||
| }; | ||
|
|
||
| module.exports = db; |
| @@ -0,0 +1,3 @@ | ||
| * | ||
|
|
||
| !.gitignore |
| @@ -0,0 +1,24 @@ | ||
| fs = require('fs'); | ||
|
|
||
| function logger(config){ | ||
| logfile = "./logs/" + config.twitter.screen_name + "-log.txt", // name of the file you want log messages to output to | ||
| this.timestamp = function() { | ||
| var d = new Date(); | ||
| var parts = d.toString().split(' '); | ||
| var day = parts[2]; | ||
| var month = parts[1]; | ||
| var time = parts[4]; | ||
| return [day, month, time].join(' '); | ||
| }, | ||
| this.epochTimestamp = function() { | ||
| return Date.now(); | ||
| }, | ||
| this.log = function(message) { | ||
| fs.appendFile(logfile, message + "\n", function (err) { | ||
| if (err) { throw err; } | ||
| console.log(message); | ||
| }); | ||
| } | ||
| } | ||
|
|
||
| module.exports = logger; |
| @@ -0,0 +1,23 @@ | ||
| tumblrwks = require("tumblrwks"); | ||
|
|
||
| function tumblr_actions(config){ | ||
| var tumblr = new tumblrwks({ | ||
| consumerKey: config.tumblr.consumer_key, | ||
| consumerSecret: config.tumblr.consumer_secret, | ||
| accessToken: config.tumblr.oauth_token, | ||
| accessSecret: config.tumblr.oauth_secret | ||
| }, config.tumblr.blog_name + ".tumblr.com"); | ||
|
|
||
| this.post = function(url, cb){ | ||
| tumblr.post('/post', { | ||
| type: 'text', | ||
| title: "#", // I don't like the permalink format, this negates them | ||
| body: "<a href=\"" + url + "\" target=\"_blank\"><img src=\"" + url + "\" class=\"inline-tweet-media\"/></a><br/><a href=\"" + url + "\">Source</a>" | ||
| }, function(err, post_data){ | ||
| cb(err, post_data); | ||
| }); | ||
| } | ||
|
|
||
| } | ||
|
|
||
| module.exports = tumblr_actions; |
| @@ -0,0 +1,63 @@ | ||
| twitter = require("twitter"), | ||
| loggr = require('./logger.js'); | ||
|
|
||
| function twttr_actions(config){ | ||
| var logger = new loggr(config); | ||
|
|
||
| var twttr = new twitter({ | ||
| consumer_key: config.twitter.consumer_key, | ||
| consumer_secret: config.twitter.consumer_secret, | ||
| access_token_key: config.twitter.oauth_token, | ||
| access_token_secret: config.twitter.oauth_secret, | ||
| rest_base: "https://api.twitter.com/1.1" | ||
| }); | ||
|
|
||
| this.dm = function(user_id, text) { | ||
| twttr.newDirectMessage({user_id: user_id}, text, function (data) { | ||
| if (data.recipient) { | ||
| logger.log(logger.timestamp() + " DM sent to @" + data.recipient.screen_name + ": " + data.text); | ||
| } else if (data.statusCode) { | ||
| logger.log(logger.timestamp() + " DM error: " + data.statusCode + ": " + data.message); | ||
| } | ||
| }) | ||
| }, | ||
| this.tweet = function(status, callback) { | ||
| twttr.updateStatus(status, | ||
| function (data) { | ||
| if (data.id_str) { | ||
| callback(data.id_str, data.text); | ||
| } else if (data.statusCode) { | ||
| logger.log(logger.timestamp() + " Tweet error: " + data.statusCode + ": " + data.message); | ||
| } | ||
| } | ||
| ) | ||
| }, | ||
| this.delete = function(statusid, callback) { | ||
| twttr.destroyStatus(statusid, | ||
| function (data) { | ||
| if (data.id_str) { | ||
| callback(data.id_str, data.text); | ||
| } else if (data.statusCode) { | ||
| logger.log(logger.timestamp() + " Tweet delete error: " + data.statusCode + ": " + data.message); | ||
| } | ||
| } | ||
| ) | ||
| }, | ||
| this.verify = function(callback) { | ||
| twttr.verifyCredentials(function(data) { | ||
| callback(data); | ||
| }); | ||
| }, | ||
| this.getUserTimeline = function(params, callback) { | ||
| twttr.getUserTimeline(params, function(data) { | ||
| callback(data); | ||
| }); | ||
| }, | ||
| this.rateLimitStatus = function(params, callback) { | ||
| twttr.rateLimitStatus(params, function(data) { | ||
| callback(data); | ||
| }); | ||
| } | ||
| } | ||
|
|
||
| module.exports = twttr_actions; |