Class: SlackRubyBotServer::Service

Inherits:
Object
  • Object
show all
Includes:
Loggable
Defined in:
lib/slack-ruby-bot-server/service.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Loggable

included

Constructor Details

#initializeService

Returns a new instance of Service.



16
17
18
19
# File 'lib/slack-ruby-bot-server/service.rb', line 16

def initialize
  @callbacks = Hash.new { |h, k| h[k] = [] }
  @intervals = Hash.new { |h, k| h[k] = [] }
end

Class Method Details

.instanceObject



12
13
14
# File 'lib/slack-ruby-bot-server/service.rb', line 12

def self.instance
  @instance ||= SlackRubyBotServer::Config.service_class.new
end

.reset!Object



103
104
105
# File 'lib/slack-ruby-bot-server/service.rb', line 103

def self.reset!
  @instance = nil
end

.start!Object



5
6
7
8
9
10
# File 'lib/slack-ruby-bot-server/service.rb', line 5

def self.start!
  Thread.new do
    Thread.current.abort_on_exception = true
    instance.start_from_database!
  end
end

Instance Method Details

#create!(team, options = {}) ⇒ Object



39
40
41
42
43
# File 'lib/slack-ruby-bot-server/service.rb', line 39

def create!(team, options = {})
  run_callbacks :creating, team, nil, options
  start!(team)
  run_callbacks :created, team, nil, options
end

#deactivate!(team) ⇒ Object



94
95
96
97
98
99
100
101
# File 'lib/slack-ruby-bot-server/service.rb', line 94

def deactivate!(team)
  run_callbacks :deactivating, team
  team.deactivate!
  run_callbacks :deactivated, team
rescue StandardError => e
  run_callbacks :error, team, e
  logger.error "#{team.name}: #{e.class}, #{e.message}, ignored."
end

#every(*intervals, &block) ⇒ Object



33
34
35
36
37
# File 'lib/slack-ruby-bot-server/service.rb', line 33

def every(*intervals, &block)
  Array(intervals).each do |interval|
    @intervals[_validate_interval(interval)] << [block, {}]
  end
end

#on(*types, &block) ⇒ Object



21
22
23
24
25
# File 'lib/slack-ruby-bot-server/service.rb', line 21

def on(*types, &block)
  Array(types).each do |type|
    @callbacks[type.to_s] << block
  end
end

#once_and_every(*intervals, &block) ⇒ Object



27
28
29
30
31
# File 'lib/slack-ruby-bot-server/service.rb', line 27

def once_and_every(*intervals, &block)
  Array(intervals).each do |interval|
    @intervals[_validate_interval(interval)] << [block, { run_on_start: true }]
  end
end

#restart!(team) ⇒ Object



54
55
56
57
58
59
60
61
# File 'lib/slack-ruby-bot-server/service.rb', line 54

def restart!(team)
  logger.info "Restarting team #{team}."
  run_callbacks :restarting, team
  run_callbacks :restarted, team
rescue StandardError => e
  run_callbacks :error, team, e
  logger.error e
end

#start!(team) ⇒ Object



45
46
47
48
49
50
51
52
# File 'lib/slack-ruby-bot-server/service.rb', line 45

def start!(team)
  logger.info "Starting team #{team}."
  run_callbacks :starting, team
  run_callbacks :started, team
rescue StandardError => e
  run_callbacks :error, team, e
  logger.error e
end

#start_from_database!Object



72
73
74
75
76
77
78
79
# File 'lib/slack-ruby-bot-server/service.rb', line 72

def start_from_database!
  Team.active.each do |team|
    run_callbacks :booting, team
    start!(team)
    run_callbacks :booted, team
  end
  start_intervals!
end

#start_intervals!Object



81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/slack-ruby-bot-server/service.rb', line 81

def start_intervals!
  ::Async::Reactor.run do
    @intervals.each_pair do |period, calls_with_options|
      calls_with_options.each do |call_with_options|
        call, options = *call_with_options
        _every period, options do
          call.call
        end
      end
    end
  end
end

#stop!(team) ⇒ Object



63
64
65
66
67
68
69
70
# File 'lib/slack-ruby-bot-server/service.rb', line 63

def stop!(team)
  logger.info "Stopping team #{team}."
  run_callbacks :stopping, team
  run_callbacks :stopped, team
rescue StandardError => e
  run_callbacks :error, team, e
  logger.error e
end