facebook.rb 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. # Copyright (C) 2012-2015 Zammad Foundation, http://zammad-foundation.org/
  2. require 'facebook'
  3. class Channel::Driver::Facebook
  4. =begin
  5. instance = Channel::Driver::Facebook.new
  6. instance.fetch(channel.options, channel)
  7. =end
  8. def fetch(options, channel)
  9. @channel = channel
  10. @sync = options['sync']
  11. @pages = options['pages']
  12. Rails.logger.debug 'facebook fetch started'
  13. fetch_feed
  14. disconnect
  15. Rails.logger.debug 'facebook fetch completed'
  16. notice = ''
  17. {
  18. result: 'ok',
  19. notice: notice,
  20. }
  21. end
  22. def send(options, fb_object_id, article, _notification = false)
  23. access_token = nil
  24. options['pages'].each { |page|
  25. next if page['id'].to_s != fb_object_id.to_s
  26. access_token = page['access_token']
  27. }
  28. if !access_token
  29. raise "No access_token found for fb_object_id: #{fb_object_id}"
  30. end
  31. client = Facebook.new(access_token)
  32. client.from_article(article)
  33. end
  34. =begin
  35. instance = Channel::Driver::Facebook.new
  36. instance.fetchable?(channel)
  37. =end
  38. def fetchable?(channel)
  39. return true if Rails.env.test?
  40. # because of new page rate limit - https://developers.facebook.com/blog/post/2016/06/16/page-level-rate-limits/
  41. # only fetch once in 5 minutes
  42. return true if !channel.preferences
  43. return true if !channel.preferences[:last_fetch]
  44. return false if channel.preferences[:last_fetch] > Time.zone.now - 5.minutes
  45. true
  46. end
  47. def disconnect
  48. end
  49. private
  50. def get_page(page_id)
  51. @pages.each { |page|
  52. return page if page['id'].to_s == page_id.to_s
  53. }
  54. nil
  55. end
  56. def fetch_feed
  57. return if !@sync
  58. return if !@sync['pages']
  59. older_import = 0
  60. older_import_max = 12
  61. @sync['pages'].each { |page_to_sync_id, page_to_sync_params|
  62. page = get_page(page_to_sync_id)
  63. next if !page
  64. next if !page_to_sync_params['group_id']
  65. next if page_to_sync_params['group_id'].empty?
  66. page_client = Facebook.new(page['access_token'])
  67. posts = page_client.client.get_connection('me', 'feed', fields: 'id,from,to,message,created_time,permalink_url,comments{id,from,to,message,created_time}')
  68. posts.each { |post|
  69. # ignore older messages
  70. if (@channel.created_at - 15.days) > Time.zone.parse(post['created_time']) || older_import >= older_import_max
  71. older_import += 1
  72. Rails.logger.debug "post to old: #{post['id']}/#{post['created_time']}"
  73. next
  74. end
  75. page_client.to_group(post, page_to_sync_params['group_id'], @channel, page)
  76. }
  77. }
  78. true
  79. end
  80. end