Mercurial > pumpbridge
diff src/twitter.coffee @ 3:98a070c98982
add Twitter support
author | Mathias Gebbe <mgebbe@intevation.de> |
---|---|
date | Thu, 05 Jun 2014 18:02:25 +0200 |
parents | |
children | f352c74a6a5b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/twitter.coffee Thu Jun 05 18:02:25 2014 +0200 @@ -0,0 +1,157 @@ +# twitter.js +# +# data object representing twitter.com +# +# Copyright 2013, E14N (https://e14n.com/) +# all changes Copyright 2014, Intevation GmbH (https://intevation.org) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +_ = require("underscore") +async = require("async") +OAuth = require("oauth").OAuth +PumpIOClientApp = require("pump.io-client-app") +DatabankObject = require("databank").DatabankObject +RequestToken = PumpIOClientApp.RequestToken +Usermap = require("./usermap") +Pump = require("./pumpio") +ToESN = require("./toESN") + + +module.exports = (config) -> + client_id = config.twclient_id + client_secret = config.twclient_secret + request_token_endpoint = "https://api.twitter.com/oauth/request_token" + access_token_endpoint = "https://api.twitter.com/oauth/access_token" + authorization_endpoint = "https://api.twitter.com/oauth/authorize" + whoami_endpoint = "https://api.twitter.com/1.1/account/verify_credentials.json" + hostname = "twitter.com" + + Twitter = + getRequestToken: (site, callback) -> + oa = Twitter.getOAuth(site) + async.waterfall [ + (callback) -> + oa.getOAuthRequestToken callback + (token, secret, other, callback) -> + RequestToken.create + token: token + secret: secret + hostname: hostname + , callback + ], callback + return + + authorizeURL: (rt) -> + separator = undefined + if _.contains(authorization_endpoint, "?") + separator = "&" + else + separator = "?" + authorization_endpoint + separator + "oauth_token=" + rt.token + + getAccessToken: (site, rt, verifier, callback) -> + oa = Twitter.getOAuth(site) + oa.getOAuthAccessToken rt.token, rt.secret, verifier, callback + return + + whoami: (site, token, secret, callback) -> + oa = Twitter.getOAuth(site) + async.waterfall [(callback) -> + oa.get whoami_endpoint, token, secret, callback + return + ], (err, doc, response) -> + obj = undefined + if err + callback err, null + else + try + obj = JSON.parse(doc) + callback null, obj + catch e + callback e, null + return + + return + + sync: (user) -> + me = user.user_pumpio + id = user.user_ESN.substr(0,user.user_ESN.indexOf('@')) + token = user.oauth_token + secret = user.extra_token + util = require("util") + twitter = require("twitter") + twit = new twitter( + consumer_key: client_id + consumer_secret: client_secret + access_token_key: token + access_token_secret: secret + ) + + #twit.verifyCredentials((data) -> + # console.log util.inspect(data) + # return + #).updateStatus "Test tweet from pumpbridge using " + twitter.VERSION, (data) -> + # console.log util.inspect(data) + # return + + # GET PUBLIC PUMP POSTS AND POST THEM + async.waterfall [ + (callback) -> + Usermap.search {id: me + '_to_' + me}, callback + (user, callback) -> + Pump.getUserFeed(user[0],callback) + (feed, callback) -> + async.eachSeries feed.items, ((post, callback) -> + # do for each post + if (post.verb is "post" or post.verb is "share") and (post.object.objectType is "note" or post.object.objectType is "image") and (Pump.isPublicActivity(post)) and (typeof post.object.deleted is "undefined") + ToESN.search {uid: post.object.id + "@twitter"}, (err, result) -> + if result.length is 0 + text = post.object.content.replace(/<(?:.|\n)*?>/gm, '') + status = "" + if text.length <= 140 + status = text + else + status = text.substr(0, 140 - (post.object.url.length + 2)) + ".." + post.object.url + twit.verifyCredentials((data) -> + #console.log util.inspect(data) + return + ).updateStatus status, (data) -> + async.waterfall [ + (callback) -> + savePost = new ToESN() + savePost.uid = post.object.id + "@twitter" + savePost.sourceUser = post.actor.id + savePost.sourcePost = post.object.id + savePost.targetUser = user.user_ESN + savePost.targetPost = data.id + savePost.recipientUser = 'public' + savePost.updated = Date.now() + savePost.save callback + ], (err, result) -> + #console.log util.inspect(data) + return + callback null, 'done' + ), (err) -> + callback null, 'done' + ],(err, result) -> + #console.log 'done.' + + return + + getOAuth: (site) -> + new OAuth(request_token_endpoint, access_token_endpoint, client_id, client_secret, "1.0", site.url("/authorized-for-twitter"), "HMAC-SHA1", null, # nonce size; use default + "User-Agent": site.userAgent() + ) + + Twitter