瀏覽代碼

Add a service account based helper library for publishing google calendar events.

Daniel O'Connor 10 年之前
父節點
當前提交
604581cf7e
共有 1 個文件被更改,包括 68 次插入0 次删除
  1. 68 0
      lib/google_calendar.rb

+ 68 - 0
lib/google_calendar.rb

@@ -0,0 +1,68 @@
+require "google-api-client"
+
+class GoogleCalendar
+
+  def initialize(config, logger)
+    @config = config
+    @key = Google::APIClient::PKCS12.load_key(@config['google']['key_file'], @config['google']['key_secret'])
+    @client = Google::APIClient.new(application_name: "Huginn", application_version: "0.0.1")
+    @client.retries = 2
+    @logger ||= logger
+
+    @calendar = @client.discovered_api('calendar','v3')
+
+    @logger.info("Setup")
+    @logger.debug @calendar.inspect
+  end
+
+  def auth_as(who)
+    @client.authorization = Signet::OAuth2::Client.new({
+      token_credential_uri: 'https://accounts.google.com/o/oauth2/token',
+      audience:             'https://accounts.google.com/o/oauth2/token',
+      scope:                'https://www.googleapis.com/auth/calendar',
+      issuer:               @config['google']['service_account_email'],
+      signing_key:          @key,
+      person:               who # Who are we emulating?
+    });
+
+    @client.authorization.fetch_access_token!
+  end
+
+  # who - String: email of user to add event
+  # details - JSON String: see https://developers.google.com/google-apps/calendar/v3/reference/events/insert
+  def publish_as(who, details)
+    auth_as(who)
+
+    @logger.info("Attempting to create event for " + who)
+    @logger.debug details.to_yaml
+
+    ret = @client.execute(
+      api_method: @calendar.events.insert,
+      parameters: {'calendarId' => who, 'sendNotifications' => true},
+      body: details,
+      headers: {'Content-Type' => 'application/json'}
+    )
+    @logger.debug ret.to_yaml
+    ret
+  end
+
+  def events_as(who, date)
+    auth_as(who)
+
+    date ||= Date.today
+
+    @logger.info("Attempting to receive events for "+who)
+    @logger.debug details.to_yaml
+
+    ret = @client.execute(
+      api_method: @calendar.events.list,
+      parameters: {'calendarId' => who, 'sendNotifications' => true},
+      body: details,
+      headers: {'Content-Type' => 'application/json'}
+    )
+
+    @logger.debug ret.to_yaml
+    ret    
+  end
+
+end