From c78c78ea9643b73d619d02bfc423230cafa463e6 Mon Sep 17 00:00:00 2001 From: Mathew Hartley Date: Fri, 18 Oct 2013 15:19:06 +1300 Subject: [PATCH] Pulling out twitter rule code into it's own thing. --- .meteor/packages | 3 +- .meteor/release | 2 +- client/whatwhattwitterbot.scss | 5 +- .../.npm/package/npm-shrinkwrap.json | 12 +- packages/twitter-api/package.js | 8 +- packages/twitter-api/twitter-api.js | 31 +++- packages/twitter-bots/package.js | 3 +- packages/twitter-bots/twitter-rules.js | 31 ---- packages/twitter-rules/.gitignore | 1 + packages/twitter-rules/package.js | 20 +++ packages/twitter-rules/smart.json | 9 ++ packages/twitter-rules/twitter-rules.html | 51 ++++++ packages/twitter-rules/twitter-rules.js | 151 ++++++++++++++++++ packages/twitter-rules/twitter-rules_tests.js | 0 whatwhattwitterbot.html | 22 +-- whatwhattwitterbot.js | 5 + 16 files changed, 282 insertions(+), 72 deletions(-) delete mode 100644 packages/twitter-bots/twitter-rules.js create mode 100644 packages/twitter-rules/.gitignore create mode 100644 packages/twitter-rules/package.js create mode 100644 packages/twitter-rules/smart.json create mode 100644 packages/twitter-rules/twitter-rules.html create mode 100644 packages/twitter-rules/twitter-rules.js create mode 100644 packages/twitter-rules/twitter-rules_tests.js diff --git a/.meteor/packages b/.meteor/packages index 01a68ce..d8c472f 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -11,5 +11,6 @@ accounts-password accounts-ui twitter-bots scss -twitter-api browser-policy +twitter-api +twitter-rules diff --git a/.meteor/release b/.meteor/release index 05e8a45..f6895d2 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -0.6.6 +0.6.6.1 diff --git a/client/whatwhattwitterbot.scss b/client/whatwhattwitterbot.scss index 580f0a2..42e93c9 100644 --- a/client/whatwhattwitterbot.scss +++ b/client/whatwhattwitterbot.scss @@ -56,7 +56,7 @@ input[type=checkbox]:checked ~ .collapse { .rule { @include base-button; - input[type='checkbox'] { + [data-collapse] { float: left; margin-top: 7px; } @@ -65,6 +65,9 @@ input[type=checkbox]:checked ~ .collapse { padding-top: $vertical-padding; border-top: 1px solid $border-color; } + .pure-button { + background-color: $color1; + } } .schedule { @include base-button; diff --git a/packages/twitter-api/.npm/package/npm-shrinkwrap.json b/packages/twitter-api/.npm/package/npm-shrinkwrap.json index cfd5a47..3561337 100644 --- a/packages/twitter-api/.npm/package/npm-shrinkwrap.json +++ b/packages/twitter-api/.npm/package/npm-shrinkwrap.json @@ -1,16 +1,10 @@ { "dependencies": { - "twitter": { - "version": "0.1.18", + "twit": { + "version": "1.1.11", "dependencies": { "oauth": { - "version": "0.9.10" - }, - "cookies": { - "version": "0.3.6" - }, - "keygrip": { - "version": "0.2.4" + "version": "0.9.9" } } } diff --git a/packages/twitter-api/package.js b/packages/twitter-api/package.js index 1ee267e..08f02f7 100644 --- a/packages/twitter-api/package.js +++ b/packages/twitter-api/package.js @@ -1,11 +1,13 @@ Package.describe({ - summary: "Twitter official npm package" + summary: "Twit npm package" }); // file: package.js Npm.depends({ - 'twitter': '0.1.18' + 'twit': '1.1.11' }); Package.on_use(function(api) { - api.add_files('twitter-api.js', 'server'); + api.add_files('twitter-api.js', 'server'); + + api.export('twitApi'); }); diff --git a/packages/twitter-api/twitter-api.js b/packages/twitter-api/twitter-api.js index 47fc985..4e7d466 100644 --- a/packages/twitter-api/twitter-api.js +++ b/packages/twitter-api/twitter-api.js @@ -1,7 +1,32 @@ // file: twitter.js -twitter = Npm.require("twitter"); -twitterApi = { +var twit = Npm.require("twit"); +var options; +twitApi = { get: function(options) { - return new twitter(options); + return new twit(options); + }, + config: function (_options) { + options = _options; } }; + +if (Meteor.isServer) { + Meteor.startup(function() { + var Future = Npm.require('fibers/future'); + Meteor.methods({ + searchTwitterUser: function (username, currentBotId) { + var fut = new Future(); + var bot = TwitterBots.findOne({_id: currentBotId}); + var config = { + access_token: bot.accessToken, + access_token_secret: bot.accessTokenSecret + }; + var twitterClient = twitApi.get(_.extend(config, options)); + twitterClient.get('users/search', {q: username}, function (error, reply) { + fut['return'](reply); + }); + return fut.wait(); + } + }); + }); +} diff --git a/packages/twitter-bots/package.js b/packages/twitter-bots/package.js index 04d8703..8315d23 100644 --- a/packages/twitter-bots/package.js +++ b/packages/twitter-bots/package.js @@ -4,10 +4,9 @@ Package.describe({ Package.on_use(function (api, where) { api.use(['standard-app-packages', 'accounts-base', 'accounts-oauth', 'twitter', 'underscore'], ['client', 'server']); - api.add_files(['twitter-bots.js', 'twitter-rules.js'], ['client', 'server']); + api.add_files(['twitter-bots.js'], ['client', 'server']); api.export('TwitterBots'); - api.export('TwitterRules'); }); Package.on_test(function (api) { diff --git a/packages/twitter-bots/twitter-rules.js b/packages/twitter-bots/twitter-rules.js deleted file mode 100644 index 835901f..0000000 --- a/packages/twitter-bots/twitter-rules.js +++ /dev/null @@ -1,31 +0,0 @@ -TwitterRule = function () {}; - -TwitterRules = new Meteor.Collection('twitter-rules', { - transform: function (doc) { - return new TwitterRule(doc); - } -}); - -TwitterRules.allow({ - insert: function (userId, doc) { - if (TwitterRules.findOne({}, {type: doc.type, botId: doc.botId})) return false; - return (userId && doc.ownerId === userId); - }, - update: function (userId, doc, fields, modifier) { - // can only change your own documents - return doc.ownerId === userId; - }, - remove: function (userId, doc) { - // can only remove your own documents - return doc.ownerId === userId; - } -}); - -if (Meteor.isClient) { - Meteor.subscribe('twitter-rules'); -} -if (Meteor.isServer) { - Meteor.publish("twitter-rules", function () { - return TwitterRules.find({ownerId: this.userId}); - }); -} diff --git a/packages/twitter-rules/.gitignore b/packages/twitter-rules/.gitignore new file mode 100644 index 0000000..677a6fc --- /dev/null +++ b/packages/twitter-rules/.gitignore @@ -0,0 +1 @@ +.build* diff --git a/packages/twitter-rules/package.js b/packages/twitter-rules/package.js new file mode 100644 index 0000000..f578a49 --- /dev/null +++ b/packages/twitter-rules/package.js @@ -0,0 +1,20 @@ +Package.describe({ + summary: "/* fill me in */" +}); + +Package.on_use(function (api, where) { + api.use(['underscore'], ['client', 'server']); + api.use(['templating'], 'client'); + api.add_files('twitter-rules.js', ['client', 'server']); + + api.add_files('twitter-rules.html', 'client'); + + api.export('TwitterRules'); + +}); + +Package.on_test(function (api) { + api.use('twitter-rules'); + + api.add_files('twitter-rules_tests.js', ['client', 'server']); +}); diff --git a/packages/twitter-rules/smart.json b/packages/twitter-rules/smart.json new file mode 100644 index 0000000..915009c --- /dev/null +++ b/packages/twitter-rules/smart.json @@ -0,0 +1,9 @@ +{ + "name": "twitter-rules", + "description": "", + "homepage": "", + "author": "", + "version": "0.0.1", + "git": "", + "packages": {} +} \ No newline at end of file diff --git a/packages/twitter-rules/twitter-rules.html b/packages/twitter-rules/twitter-rules.html new file mode 100644 index 0000000..b405d80 --- /dev/null +++ b/packages/twitter-rules/twitter-rules.html @@ -0,0 +1,51 @@ + + + diff --git a/packages/twitter-rules/twitter-rules.js b/packages/twitter-rules/twitter-rules.js new file mode 100644 index 0000000..63a31b1 --- /dev/null +++ b/packages/twitter-rules/twitter-rules.js @@ -0,0 +1,151 @@ +TwitterRule = function (doc) { + _.extend(this, doc); +}; + +TwitterRepeatRule = function (doc) { + TwitterRule.call(this); +}; + +// inherit TwitterRule +TwitterRepeatRule.prototype = new TwitterRule(); + +// correct the constructor pointer because it points to Person +TwitterRepeatRule.prototype.constructor = TwitterRepeatRule; +TwitterRepeatRule.prototype.start = function () { + console.log("starting repeat rule"); + +}; + + +_.extend(TwitterRule.prototype, { + start: function () { + console.log("starting rule"); + }, + stop: function () { + console.log("stopping rule"); + } +}); + +TwitterRules = new Meteor.Collection('twitter-rules', { + transform: function (doc) { + switch (doc.type) { + case 'repeat': + return new TwitterRepeatRule(doc); + default: + return new TwitterRule(doc); + } + } +}); + +TwitterRules.allow({ + insert: function (userId, doc) { + if (TwitterRules.findOne({}, {type: doc.type, botId: doc.botId})) return false; + return (userId && doc.ownerId === userId); + }, + update: function (userId, doc, fields, modifier) { + // can only change your own documents + return doc.ownerId === userId; + }, + remove: function (userId, doc) { + // can only remove your own documents + return doc.ownerId === userId; + } +}); + +if (Meteor.isClient) { + Meteor.subscribe('twitter-rules'); + + var searchTwitterUser = _.debounce(function(value, callback){ + var currentBotId = Session.get('currentBotId'); + resultsArray = []; + Meteor.call('searchTwitterUser', value, currentBotId, function (error, result){ + resultsArray = result.map(function(item) { + return item.screen_name; + }); + callback(resultsArray); + }); + }, 1000); + Meteor.startup(function() { + var setRuleToSession = function (type) { + var rules = Session.get('rules') || {}; + var selectedRule = TwitterRules.findOne({type: type, botId: Session.get('currentBotId')}); + rules[type] = (selectedRule) ? selectedRule._id : undefined; + Session.set('rules', rules); + }; + + var getRuleFromSession = function(type) { + var rules = Session.get('rules') || {}; + return TwitterRules.findOne({_id: rules[type]}); + }; + + Template.ruleRepeat.created = function () { + setRuleToSession('repeat'); + }; + + Template.twitterRules.botName = function() { + var bot = TwitterBots.findOne({_id: Session.get('currentBotId')}); + if (!bot) return ""; + return "@" + bot.screenName; + }; + + Template.ruleRepeat.repeatSource = function () { + var rule = getRuleFromSession('repeat'); + return rule ? rule.repeatSource : ''; + }; + + Template.ruleRepeat.helpers({ + checkedHelper: function (objectName) { + var rule = getRuleFromSession('repeat'); + return (rule && rule[objectName]) ? "checked='checked'" : undefined; + } + }); + + Template.ruleRepeat.events({ + 'click [data-collapse]': function (event) { + var value = !!$(event.target).attr('checked'); + var currentBotId = Session.get('currentBotId'); + Meteor.call('updateRule', currentBotId, 'repeat', {active: value}); + }, + 'submit': function (event) { + event.preventDefault(); + var currentBotId = Session.get('currentBotId'); + var temp = $(event.target).serializeArray(); + var data = {}; + temp.map(function(x){data[x.name] = x.value;}); + Meteor.call('updateRule', currentBotId, 'repeat', data); + } + }); + }); +} + +if (Meteor.isServer) { + Meteor.publish("twitter-rules", function () { + return TwitterRules.find({ownerId: this.userId}); + }); + Meteor.startup(function() { + // var Future = Npm.require('fibers/future'); + Meteor.methods({ + updateRule: function (currentBotId, type, values) { + console.log("running update for " + type + " with values: " + console.dir(values)); + TwitterRules.upsert({ownerId: Meteor.userId(), botId: currentBotId, type: 'repeat'}, {$set: values}); + }, + clearRules: function() { + TwitterRules.remove({}); + } + }); + }); + + var repeatRules = TwitterRules.find({type: 'repeat'}); + var handle = repeatRules.observeChanges({ + added: function (id, fields) { + var rule = TwitterRules.findOne({_id: id}); + rule.start(); + }, + changed: function (id, fields) { + if (_.has(fields, 'active')) { + var rule = TwitterRules.findOne({_id: id}); + (fields.active) ? rule.start() : rule.stop(); + } + } + }); +} diff --git a/packages/twitter-rules/twitter-rules_tests.js b/packages/twitter-rules/twitter-rules_tests.js new file mode 100644 index 0000000..e69de29 diff --git a/whatwhattwitterbot.html b/whatwhattwitterbot.html index b9ad28a..ffb384d 100644 --- a/whatwhattwitterbot.html +++ b/whatwhattwitterbot.html @@ -33,27 +33,7 @@

Your bots

{{/if}} {{#if showRules}}
-
-

Your rules for {{botName}}

-
-
I want to copy @
-
-
-
Collapse
-
-
-
Collapse
-
-
-
Collapse
-
-
-
Collapse
-
-
-
Collapse
-
-
+ {{> twitterRules}}
{{/if}} {{#if showSchedules}} diff --git a/whatwhattwitterbot.js b/whatwhattwitterbot.js index f6a09f7..eb9ed9a 100644 --- a/whatwhattwitterbot.js +++ b/whatwhattwitterbot.js @@ -76,5 +76,10 @@ if (Meteor.isServer) { Accounts.loginServiceConfiguration.remove({}); var config = JSON.parse(Assets.getText('oauth.json')); Accounts.loginServiceConfiguration.insert(config); + var serverConfig = JSON.parse(Assets.getText('oauth.json')); + twitApi.config({ + consumer_key: serverConfig.consumerKey, + consumer_secret: serverConfig.secret, + }); }); }