diff src/google.coffee @ 0:b73191efc65b

Initial import of pumpbridge (bloody bloody alpha)
author Mathias Gebbe <mgebbe@intevation.de>
date Thu, 05 Jun 2014 10:35:15 +0200
parents
children 98a070c98982
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/google.coffee	Thu Jun 05 10:35:15 2014 +0200
@@ -0,0 +1,287 @@
+# Copyright (C) 2014 by Intevation GmbH
+# Author: Mathias Gebbe <mgebbe@intevation.de>
+#
+# This file is Free Software under the Apache License, Version 2.0
+# (the "License"); and comes with ABSOLUTELY NO WARRANTY!
+# You may not use this file except in compliance with the License.
+# See LICENSE for details.
+
+https = require("https")
+async = require("async")
+_ = require("underscore")
+Sync = require("./sync")
+Routes = require("./routes")
+querystring = require("querystring")
+EdgeControl = require("./edgecontrol")
+Edge = require("./edge")
+Pump = require("./pumpio")
+FromESN = require("./fromESN")
+Config = require("./config")
+querystring = require('querystring')
+
+config = Config.config
+
+bridgeid = config.bridgeid
+API_KEY = config.gpAPI_KEY
+CLIENTID = config.gpCLIENTID
+CLIENTSECRET = config.gpCLIENTSECRET
+
+###############
+# google sync #
+###############
+sync = (user) ->
+  return if not (user?)
+  me = user.user_pumpio
+  id = user.user_ESN.substr(0,user.user_ESN.indexOf('@'))
+
+  async.waterfall [
+    (callback) ->
+      updateToken(user,callback)
+    (updateuser,callback) ->
+      user = updateuser
+      getUser(user)
+      getFriends(user,callback)
+  ], (err, friends) ->
+    # für jeden Freunde tue dies: hier bewusst von  async.eachSeries friends, ((friend, callback) -> auf async.each gewechselt
+    async.each friends, ((friend, callback) ->
+      async.waterfall [
+        (callback) ->
+          getStream(user, friend, callback)
+        (stream, callback) ->
+          _.each stream.items, (post) ->
+            async.waterfall [
+              (callback) ->
+                FromESN.search {uid: post.id + "@google_to_" + me, recipientUser: me}, callback
+              (result, callback) ->
+                return if result.length isnt 0
+                Sync.postParser post, null, 'google', callback
+              (parsed, callback) ->
+                Pump.postUser bridgeid, me, parsed, callback
+              (pumppost, callback) ->
+                pumppost = JSON.parse(pumppost)
+                FromESN.create
+                  postid: post.id + "@google"
+                  sourceUser: post.actor.id
+                  sourcePost: post.url
+                  pumpPost: pumppost.object.id
+                  recipientUser: me
+                  created: Date.now()
+                , callback
+            ], (err, result) ->
+                 #console.log err
+                 #console.log result
+          return
+          callback null, null
+      ], (err,  result) ->
+        #console.log 'done.'
+      callback null, 'done'
+    ), (err) ->
+      if err
+        console.log 'one post fail to process'
+      else
+        console.log 'all google friends processed'
+      return
+  return
+
+
+#######################################
+###### get user info googleplus  ######
+#######################################
+getUser = (user) ->
+  data = ""
+  id = user.user_ESN.substr(0,user.user_ESN.indexOf('@'))
+  token = user.oauth_token.substr(0,user.oauth_token.indexOf(';'))
+  options =
+   host: "www.googleapis.com"
+   port: 443
+   path: "/plus/v1/people/" + id + '?access_token=' + token
+
+  https.get(options, (res) ->
+    #console.log "Got response: " + res.statusCode
+    res.on "data", (chunk) ->
+      data += chunk
+      return
+
+    res.on "end", () ->
+      user = JSON.parse(data)
+      Routes.updateUserDB(user.id+'@google',user.displayName,user.displayName,user.url,user.image.url) unless typeof user.id is "undefined"
+
+  ).on "error", (e) ->
+    console.log "Got error: " + e.message
+    return
+  return
+
+
+#######################################
+###### get google friends        ######
+#######################################
+getFriends = (user, callback) ->
+  return if typeof user is "undefined"
+  data = ""
+  friends = new Array()
+  me = user.user_pumpio
+  id = user.user_ESN.substr(0,user.user_ESN.indexOf('@'))
+  if user.oauth_token.indexOf(';') isnt -1
+    token = user.oauth_token.substr(0,user.oauth_token.indexOf(';'))
+  else
+    token = user.oauth_token
+  options =
+   host: "www.googleapis.com"
+   port: 443
+   path: "/plus/v1/people/me/people/visible?key=" + API_KEY + "&"
+   headers:
+     "Authorization": "Bearer " + token
+
+  https.get(options, (res) ->
+    #console.log "Got response: " + res.statusCode
+    res.on "data", (chunk) ->
+      data +=chunk
+
+    res.on "end", () ->
+      async.waterfall [
+        (callback) ->
+          users = JSON.parse(decodeURI(data))
+          return if (users.error?)
+          callback null,users
+        (users, callback) ->
+          EdgeControl.removeEdges(me,'@google')
+          _.each users.items, (user) ->
+            friends.push(user.id)
+            Routes.updateUserDB(user.id+'@google',user.displayName,user.displayName,user.url,user.image.url) unless typeof user.id is "undefined"
+            EdgeControl.addEdge(me,user.id+'@google') unless typeof user.id is "undefined"
+          callback null, friends
+      ], (err, friends) ->
+        callback null, friends
+       return
+
+  ).on "error", (e) ->
+    console.log "Got error: " + e.message
+
+  return
+
+#######################################
+###### get google stream         ######
+#######################################
+getStream = (user, targetid, callback) ->
+  data = ""
+  max_results = 3
+  me = user.user_pumpio
+  id = user.user_ESN.substr(0,user.user_ESN.indexOf('@'))
+  if user.oauth_token.indexOf(';') isnt -1
+    token = user.oauth_token.substr(0,user.oauth_token.indexOf(';'))
+  else
+    token = user.oauth_token
+  options =
+   host: "www.googleapis.com"
+   port: 443
+   path: "/plus/v1/people/" + targetid + "/activities/public?maxResults="+max_results+"&key=" + API_KEY
+   headers:
+     "Authorization": "Bearer " + token
+
+  https.get(options, (res) ->
+    #console.log "Got response: " + res.statusCode
+    res.on "data", (chunk) ->
+      data +=chunk
+
+    res.on "end", () ->
+      data = JSON.parse(data)
+      callback null, data
+
+  ).on "error", (e) ->
+    console.log "Got error: " + e.message
+
+  return
+
+getRefreshToken = (user, callback) ->
+  if user.oauth_token.indexOf(';') isnt -1
+    token = user.oauth_token.substr(0,user.oauth_token.indexOf(';'))
+  else
+    token = user.oauth_token
+  code = user.oauth_token.substr(user.oauth_token.indexOf(';')+1 ,user.oauth_token.lenght)
+  data = ""
+  post_data = querystring.stringify(
+    "code": code
+    "client_id": CLIENTID
+    "client_secret": CLIENTSECRET
+    "grant_type": "authorization_code"
+    "redirect_uri": "postmessage"
+  )
+
+  headers =
+    "Authorization": "Bearer " + token
+    "Content-Type": "application/x-www-form-urlencoded"
+    'Content-Length': post_data.length
+
+  options =
+    host: "accounts.google.com"
+    port: 443
+    path: "/o/oauth2/token"
+    method: "POST"
+    headers: headers
+
+  req = https.request(options, (res) ->
+    res.setEncoding "utf8"
+    res.on "data", (d) ->
+      data += d
+
+    res.on "end", () ->
+      #console.log data
+      data = decodeURI(data)
+      data = JSON.parse(data)
+      callback null, data
+      #console.log '\n\n' + JSON.stringify(data.refresh_token)
+      # usermap updaten und später mit extra arbeiten
+    return
+  )
+  req.write post_data
+  req.end()
+
+
+  return
+
+updateToken = (user, callback) ->
+  token = user.oauth_token.substr(0,user.oauth_token.indexOf(';'))
+  extra = user.extra_token
+  data = ""
+  post_data = querystring.stringify(
+    "refresh_token": extra
+    "client_id": CLIENTID
+    "client_secret": CLIENTSECRET
+    "grant_type": "refresh_token"
+  )
+
+  headers =
+    "Authorization": "Bearer " + token
+    "Content-Type": "application/x-www-form-urlencoded"
+    'Content-Length': post_data.length
+
+  options =
+    host: "accounts.google.com"
+    port: 443
+    path: "/o/oauth2/token"
+    method: "POST"
+    headers: headers
+
+  req = https.request(options, (res) ->
+    res.setEncoding "utf8"
+    res.on "data", (d) ->
+      data += d
+
+    res.on "end", () ->
+      data = decodeURI(data)
+      data = JSON.parse(data)
+      Routes.saveUsermap(user.user_pumpio,user.user_ESN,data.access_token, user.extra_token, callback)
+      #console.log '\n\n' + JSON.stringify(data.refresh_token)
+      # usermap updaten und später mit extra arbeiten
+    return
+  )
+  req.write post_data
+  req.end()
+
+
+  return
+
+exports.sync = sync
+exports.getUser = getUser
+exports.getRefreshToken = getRefreshToken
+exports.getFriends = getFriends
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)