Class: SlackRubyBotServer::Service

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

Class Method Summary collapse

Instance Method Summary collapse

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
  @lock = Mutex.new
  @services = {}
end

Class Method Details

.instanceObject



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

def self.instance
  @instance ||= new
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

#deactivate!(team) ⇒ Object



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

def deactivate!(team)
  team.deactivate!
  @lock.synchronize do
    @services.delete(team.token)
  end
rescue Mongoid::Errors::Validations => e
  logger.error "#{team.name}: #{e.message}, error - #{e.document.class}, #{e.document.errors.to_hash}, ignored."
rescue StandardError => e
  logger.error "#{team.name}: #{e.class}, #{e.message}, ignored."
end

#reset!Object



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

def reset!
  @services.values.to_a.each do |server|
    stop!(server.team)
  end
end

#restart!(team, server, wait = 1) ⇒ Object



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

def restart!(team, server, wait = 1)
  server.start_async
rescue StandardError => e
  case e.message
  when 'account_inactive', 'invalid_auth' then
    logger.error "#{team.name}: #{e.message}, team will be deactivated."
    deactivate!(team)
  else
    logger.error "#{team.name}: #{e.message}, restarting in #{wait} second(s)."
    sleep(wait)
    restart! team, server, [wait * 2, 60].min
  end
end

#start!(team) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
# File 'lib/slack-ruby-bot-server/service.rb', line 21

def start!(team)
  fail 'Token already known.' if @services.key?(team.token)
  logger.info "Starting team #{team}."
  server = SlackRubyBotServer::Server.new(team: team)
  @lock.synchronize do
    @services[team.token] = server
  end
  restart!(team, server)
rescue StandardError => e
  logger.error e
end

#start_from_database!Object



44
45
46
47
48
# File 'lib/slack-ruby-bot-server/service.rb', line 44

def start_from_database!
  Team.active.each do |team|
    start!(team)
  end
end

#stop!(team) ⇒ Object



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

def stop!(team)
  @lock.synchronize do
    fail 'Token unknown.' unless @services.key?(team.token)
    logger.info "Stopping team #{team}."
    @services[team.token].stop!
    @services.delete(team.token)
  end
rescue StandardError => e
  logger.error e
end