huginn_scheduler.rb 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. require 'rufus/scheduler'
  2. class HuginnScheduler
  3. attr_accessor :mutex
  4. def initialize
  5. @rufus_scheduler = Rufus::Scheduler.new
  6. end
  7. def stop
  8. @rufus_scheduler.stop
  9. end
  10. def run_schedule(time)
  11. with_mutex do
  12. puts "Queuing schedule for #{time}"
  13. Agent.delay.run_schedule(time)
  14. end
  15. end
  16. def propagate!
  17. with_mutex do
  18. puts "Queuing event propagation"
  19. Agent.delay.receive!
  20. end
  21. end
  22. def cleanup_expired_events!
  23. with_mutex do
  24. puts "Running event cleanup"
  25. Event.delay.cleanup_expired!
  26. end
  27. end
  28. def with_mutex
  29. ActiveRecord::Base.connection_pool.with_connection do
  30. mutex.synchronize do
  31. yield
  32. end
  33. end
  34. end
  35. def run!
  36. self.mutex = Mutex.new
  37. tzinfo_friendly_timezone = ActiveSupport::TimeZone::MAPPING[ENV['TIMEZONE'].present? ? ENV['TIMEZONE'] : "Pacific Time (US & Canada)"]
  38. # Schedule event propagation.
  39. @rufus_scheduler.every '1m' do
  40. propagate!
  41. end
  42. # Schedule event cleanup.
  43. @rufus_scheduler.cron "0 0 * * * " + tzinfo_friendly_timezone do
  44. cleanup_expired_events!
  45. end
  46. # Schedule repeating events.
  47. %w[1m 2m 5m 10m 30m 1h 2h 5h 12h 1d 2d 7d].each do |schedule|
  48. @rufus_scheduler.every schedule do
  49. run_schedule "every_#{schedule}"
  50. end
  51. end
  52. # Schedule events for specific times.
  53. # Times are assumed to be in PST for now. Can store a user#timezone later.
  54. 24.times do |hour|
  55. @rufus_scheduler.cron "0 #{hour} * * * " + tzinfo_friendly_timezone do
  56. if hour == 0
  57. run_schedule "midnight"
  58. elsif hour < 12
  59. run_schedule "#{hour}am"
  60. elsif hour == 12
  61. run_schedule "noon"
  62. else
  63. run_schedule "#{hour - 12}pm"
  64. end
  65. end
  66. end
  67. @rufus_scheduler.join
  68. end
  69. end