huginn/lib/google_calendar.rb

85 lines
2.3 KiB
Ruby

require 'googleauth'
require 'google/apis/calendar_v3'
class GoogleCalendar
def initialize(config, logger)
@config = config
if @config['google']['key'].present?
# https://github.com/google/google-auth-library-ruby/issues/65
# https://github.com/google/google-api-ruby-client/issues/370
ENV['GOOGLE_PRIVATE_KEY'] = @config['google']['key']
ENV['GOOGLE_CLIENT_EMAIL'] = @config['google']['service_account_email']
ENV['GOOGLE_ACCOUNT_TYPE'] = 'service_account'
elsif @config['google']['key_file'].present?
ENV['GOOGLE_APPLICATION_CREDENTIALS'] = @config['google']['key_file']
end
@logger ||= logger
# https://github.com/google/google-api-ruby-client/blob/master/MIGRATING.md
@calendar = Google::Apis::CalendarV3::CalendarService.new
# https://developers.google.com/api-client-library/ruby/auth/service-accounts
# https://developers.google.com/identity/protocols/application-default-credentials
scopes = [Google::Apis::CalendarV3::AUTH_CALENDAR]
@authorization = Google::Auth.get_application_default(scopes)
@logger.info("Setup")
@logger.debug @calendar.inspect
end
def self.open(*args, &block)
instance = new(*args)
block.call(instance)
ensure
instance.cleanup!
end
def auth_as
@authorization.fetch_access_token!
@calendar.authorization = @authorization
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
@logger.info("Attempting to create event for " + who)
@logger.debug details.to_yaml
event = Google::Apis::CalendarV3::Event.new(details.deep_symbolize_keys)
ret = @calendar.insert_event(
who,
event,
send_notifications: true
)
@logger.debug ret.to_yaml
ret.to_h
end
def events_as(who, date)
auth_as
date ||= Date.today
@logger.info("Attempting to receive events for "+who)
@logger.debug details.to_yaml
ret = @calendar.list_events(
who
)
@logger.debug ret.to_yaml
ret.to_h
end
def cleanup!
ENV.delete('GOOGLE_PRIVATE_KEY')
ENV.delete('GOOGLE_CLIENT_EMAIL')
ENV.delete('GOOGLE_ACCOUNT_TYPE')
ENV.delete('GOOGLE_APPLICATION_CREDENTIALS')
end
end