mgebbe@0: # Copyright (C) 2014 by Intevation GmbH mgebbe@0: # Author: Mathias Gebbe mgebbe@0: # mgebbe@3: # This file is Free Software under the Apache License, Version 2.0; mgebbe@3: # and comes with NO WARRANTY! mgebbe@3: # See the documentation coming with pumpbridge for details. mgebbe@0: mgebbe@0: https = require("https") mgebbe@0: async = require("async") mgebbe@0: _ = require("underscore") mgebbe@0: Sync = require("./sync") mgebbe@0: Routes = require("./routes") mgebbe@0: querystring = require("querystring") mgebbe@0: EdgeControl = require("./edgecontrol") mgebbe@0: Edge = require("./edge") mgebbe@0: Pump = require("./pumpio") mgebbe@0: FromESN = require("./fromESN") mgebbe@0: Config = require("./config") mgebbe@0: querystring = require('querystring') mgebbe@0: mgebbe@0: config = Config.config mgebbe@0: mgebbe@0: bridgeid = config.bridgeid mgebbe@7: interval = config.interval mgebbe@0: CLIENTID = config.gpCLIENTID mgebbe@0: CLIENTSECRET = config.gpCLIENTSECRET mgebbe@0: mgebbe@0: ############### mgebbe@0: # google sync # mgebbe@0: ############### mgebbe@0: sync = (user) -> mgebbe@0: return if not (user?) mgebbe@0: me = user.user_pumpio mgebbe@0: id = user.user_ESN.substr(0,user.user_ESN.indexOf('@')) mgebbe@7: if not (interval?) mgebbe@7: interval = 15 * 60 * 1000 # 900 000 ms (15min) mgebbe@0: mgebbe@0: async.waterfall [ mgebbe@0: (callback) -> mgebbe@0: updateToken(user,callback) mgebbe@0: (updateuser,callback) -> mgebbe@0: user = updateuser mgebbe@18: #getUser(user) mgebbe@0: getFriends(user,callback) mgebbe@0: ], (err, friends) -> mgebbe@0: # für jeden Freunde tue dies: hier bewusst von async.eachSeries friends, ((friend, callback) -> auf async.each gewechselt mgebbe@22: async.eachLimit friends, 10, ((friend, callback) -> mgebbe@0: async.waterfall [ mgebbe@0: (callback) -> mgebbe@0: getStream(user, friend, callback) mgebbe@0: (stream, callback) -> mgebbe@19: return if not stream? or not stream.items? or stream.items.length is 0 mgebbe@22: async.eachLimit stream.items, 10, ((post, cb) -> mgebbe@0: async.waterfall [ mgebbe@0: (callback) -> mgebbe@22: FromESN.search {uid: post.id + "@google_to_" + me}, callback mgebbe@0: (result, callback) -> mgebbe@0: return if result.length isnt 0 mgebbe@7: ti = new Date().getTime() - interval mgebbe@7: ts = Date.parse(post.published) mgebbe@7: if (ts >= ti) mgebbe@7: Sync.postParser post, null, 'google', callback mgebbe@7: else mgebbe@7: return mgebbe@0: (parsed, callback) -> mgebbe@0: Pump.postUser bridgeid, me, parsed, callback mgebbe@0: (pumppost, callback) -> mgebbe@0: pumppost = JSON.parse(pumppost) mgebbe@0: FromESN.create mgebbe@0: postid: post.id + "@google" mgebbe@0: sourceUser: post.actor.id mgebbe@0: sourcePost: post.url mgebbe@0: pumpPost: pumppost.object.id mgebbe@0: recipientUser: me mgebbe@0: created: Date.now() mgebbe@0: , callback mgebbe@0: ], (err, result) -> mgebbe@0: #console.log err mgebbe@0: #console.log result mgebbe@17: cb() mgebbe@18: return mgebbe@17: ), (err) -> mgebbe@17: callback null, 'done' mgebbe@0: ], (err, result) -> mgebbe@0: #console.log 'done.' mgebbe@0: callback null, 'done' mgebbe@0: ), (err) -> mgebbe@0: if err mgebbe@0: console.log 'one post fail to process' mgebbe@0: else mgebbe@0: console.log 'all google friends processed' mgebbe@18: return mgebbe@0: return mgebbe@0: mgebbe@0: mgebbe@0: ####################################### mgebbe@0: ###### get user info googleplus ###### mgebbe@0: ####################################### mgebbe@0: getUser = (user) -> mgebbe@0: data = "" mgebbe@0: id = user.user_ESN.substr(0,user.user_ESN.indexOf('@')) mgebbe@0: token = user.oauth_token.substr(0,user.oauth_token.indexOf(';')) mgebbe@0: options = mgebbe@0: host: "www.googleapis.com" mgebbe@0: port: 443 mgebbe@0: path: "/plus/v1/people/" + id + '?access_token=' + token mgebbe@0: mgebbe@0: https.get(options, (res) -> mgebbe@0: #console.log "Got response: " + res.statusCode mgebbe@0: res.on "data", (chunk) -> mgebbe@0: data += chunk mgebbe@0: return mgebbe@0: mgebbe@0: res.on "end", () -> mgebbe@0: user = JSON.parse(data) mgebbe@4: Routes.updateUserDB(user.id+'@google',user.displayName,user.displayName,user.url,user.image.url) if user.id? mgebbe@0: mgebbe@0: ).on "error", (e) -> mgebbe@0: console.log "Got error: " + e.message mgebbe@0: return mgebbe@0: return mgebbe@0: mgebbe@0: mgebbe@0: ####################################### mgebbe@0: ###### get google friends ###### mgebbe@0: ####################################### mgebbe@0: getFriends = (user, callback) -> mgebbe@4: return if not user? mgebbe@0: data = "" mgebbe@0: friends = new Array() mgebbe@0: me = user.user_pumpio mgebbe@0: id = user.user_ESN.substr(0,user.user_ESN.indexOf('@')) mgebbe@0: if user.oauth_token.indexOf(';') isnt -1 mgebbe@0: token = user.oauth_token.substr(0,user.oauth_token.indexOf(';')) mgebbe@0: else mgebbe@0: token = user.oauth_token mgebbe@0: options = mgebbe@0: host: "www.googleapis.com" mgebbe@0: port: 443 mgebbe@10: path: "/plus/v1/people/me/people/visible?key=" + CLIENTID + "&" mgebbe@0: headers: mgebbe@0: "Authorization": "Bearer " + token mgebbe@0: mgebbe@0: https.get(options, (res) -> mgebbe@0: #console.log "Got response: " + res.statusCode mgebbe@0: res.on "data", (chunk) -> mgebbe@0: data +=chunk mgebbe@0: mgebbe@0: res.on "end", () -> mgebbe@0: async.waterfall [ mgebbe@0: (callback) -> mgebbe@18: users = JSON.parse(decodeURI(data)) mgebbe@18: return if (users.error?) mgebbe@18: callback null,users mgebbe@0: (users, callback) -> mgebbe@18: #EdgeControl.removeEdges(me,'@google') mgebbe@22: async.eachLimit 10, users.items, ((user,cb) -> mgebbe@4: if user.id? mgebbe@4: friends.push(user.id) mgebbe@18: #Routes.updateUserDB(user.id+'@google',user.displayName,user.displayName,user.url,user.image.url) mgebbe@18: #EdgeControl.addEdge(me,user.id+'@google') mgebbe@18: cb() mgebbe@18: ), (err) -> mgebbe@18: callback null, friends mgebbe@0: ], (err, friends) -> mgebbe@0: callback null, friends mgebbe@0: return mgebbe@0: mgebbe@0: ).on "error", (e) -> mgebbe@0: console.log "Got error: " + e.message mgebbe@0: mgebbe@0: return mgebbe@0: mgebbe@0: ####################################### mgebbe@0: ###### get google stream ###### mgebbe@0: ####################################### mgebbe@0: getStream = (user, targetid, callback) -> mgebbe@0: data = "" mgebbe@0: max_results = 3 mgebbe@0: me = user.user_pumpio mgebbe@0: id = user.user_ESN.substr(0,user.user_ESN.indexOf('@')) mgebbe@0: if user.oauth_token.indexOf(';') isnt -1 mgebbe@0: token = user.oauth_token.substr(0,user.oauth_token.indexOf(';')) mgebbe@0: else mgebbe@0: token = user.oauth_token mgebbe@0: options = mgebbe@0: host: "www.googleapis.com" mgebbe@0: port: 443 mgebbe@10: path: "/plus/v1/people/" + targetid + "/activities/public?maxResults="+max_results+"&key=" + CLIENTID mgebbe@0: headers: mgebbe@0: "Authorization": "Bearer " + token mgebbe@0: mgebbe@0: https.get(options, (res) -> mgebbe@0: #console.log "Got response: " + res.statusCode mgebbe@0: res.on "data", (chunk) -> mgebbe@0: data +=chunk mgebbe@0: mgebbe@0: res.on "end", () -> mgebbe@0: data = JSON.parse(data) mgebbe@0: callback null, data mgebbe@0: mgebbe@0: ).on "error", (e) -> mgebbe@0: console.log "Got error: " + e.message mgebbe@0: mgebbe@0: return mgebbe@0: mgebbe@0: getRefreshToken = (user, callback) -> mgebbe@0: if user.oauth_token.indexOf(';') isnt -1 mgebbe@0: token = user.oauth_token.substr(0,user.oauth_token.indexOf(';')) mgebbe@3: code = user.oauth_token.substr(user.oauth_token.indexOf(';')+1 ,user.oauth_token.length) mgebbe@0: else mgebbe@0: token = user.oauth_token mgebbe@0: data = "" mgebbe@0: post_data = querystring.stringify( mgebbe@0: "code": code mgebbe@0: "client_id": CLIENTID mgebbe@0: "client_secret": CLIENTSECRET mgebbe@0: "grant_type": "authorization_code" mgebbe@0: "redirect_uri": "postmessage" mgebbe@0: ) mgebbe@0: mgebbe@0: headers = mgebbe@0: "Authorization": "Bearer " + token mgebbe@0: "Content-Type": "application/x-www-form-urlencoded" mgebbe@0: 'Content-Length': post_data.length mgebbe@0: mgebbe@0: options = mgebbe@0: host: "accounts.google.com" mgebbe@0: port: 443 mgebbe@0: path: "/o/oauth2/token" mgebbe@0: method: "POST" mgebbe@0: headers: headers mgebbe@0: mgebbe@0: req = https.request(options, (res) -> mgebbe@0: res.setEncoding "utf8" mgebbe@0: res.on "data", (d) -> mgebbe@0: data += d mgebbe@0: mgebbe@0: res.on "end", () -> mgebbe@0: #console.log data mgebbe@0: data = decodeURI(data) mgebbe@0: data = JSON.parse(data) mgebbe@0: callback null, data mgebbe@0: #console.log '\n\n' + JSON.stringify(data.refresh_token) mgebbe@0: # usermap updaten und später mit extra arbeiten mgebbe@0: return mgebbe@0: ) mgebbe@0: req.write post_data mgebbe@0: req.end() mgebbe@0: mgebbe@0: mgebbe@0: return mgebbe@0: mgebbe@0: updateToken = (user, callback) -> mgebbe@0: token = user.oauth_token.substr(0,user.oauth_token.indexOf(';')) mgebbe@0: extra = user.extra_token mgebbe@0: data = "" mgebbe@0: post_data = querystring.stringify( mgebbe@0: "refresh_token": extra mgebbe@0: "client_id": CLIENTID mgebbe@0: "client_secret": CLIENTSECRET mgebbe@0: "grant_type": "refresh_token" mgebbe@0: ) mgebbe@0: mgebbe@0: headers = mgebbe@0: "Authorization": "Bearer " + token mgebbe@0: "Content-Type": "application/x-www-form-urlencoded" mgebbe@0: 'Content-Length': post_data.length mgebbe@0: mgebbe@0: options = mgebbe@0: host: "accounts.google.com" mgebbe@0: port: 443 mgebbe@0: path: "/o/oauth2/token" mgebbe@0: method: "POST" mgebbe@0: headers: headers mgebbe@0: mgebbe@0: req = https.request(options, (res) -> mgebbe@0: res.setEncoding "utf8" mgebbe@0: res.on "data", (d) -> mgebbe@0: data += d mgebbe@0: mgebbe@0: res.on "end", () -> mgebbe@0: data = decodeURI(data) mgebbe@0: data = JSON.parse(data) mgebbe@0: Routes.saveUsermap(user.user_pumpio,user.user_ESN,data.access_token, user.extra_token, callback) mgebbe@0: #console.log '\n\n' + JSON.stringify(data.refresh_token) mgebbe@0: # usermap updaten und später mit extra arbeiten mgebbe@0: return mgebbe@0: ) mgebbe@0: req.write post_data mgebbe@0: req.end() mgebbe@0: mgebbe@0: mgebbe@0: return mgebbe@0: mgebbe@0: exports.sync = sync mgebbe@0: exports.getUser = getUser mgebbe@0: exports.getRefreshToken = getRefreshToken mgebbe@0: exports.getFriends = getFriends