Class: Adhearsion::Asterisk::QueueProxy

Inherits:
Object
  • Object
show all
Defined in:
lib/adhearsion/asterisk/queue_proxy.rb,
lib/adhearsion/asterisk/queue_proxy/agent_proxy.rb,
lib/adhearsion/asterisk/queue_proxy/queue_agents_list_proxy.rb

Defined Under Namespace

Classes: AgentProxy, QueueAgentsListProxy, QueueDoesNotExistError

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, environment) ⇒ QueueProxy

Returns a new instance of QueueProxy.



57
58
59
# File 'lib/adhearsion/asterisk/queue_proxy.rb', line 57

def initialize(name, environment)
  @name, @environment = name, environment
end

Instance Attribute Details

#environmentObject (readonly)

Returns the value of attribute environment.



55
56
57
# File 'lib/adhearsion/asterisk/queue_proxy.rb', line 55

def environment
  @environment
end

#nameObject (readonly)

Returns the value of attribute name.



55
56
57
# File 'lib/adhearsion/asterisk/queue_proxy.rb', line 55

def name
  @name
end

Class Method Details

.format_join_hash_key_arguments(options) ⇒ Object

Raises:

  • (ArgumentError)


9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/adhearsion/asterisk/queue_proxy.rb', line 9

def format_join_hash_key_arguments(options)
  bad_argument = lambda do |(key, value)|
    raise ArgumentError, "Unrecognize value for #{key.inspect} -- #{value.inspect}"
  end

  # Direct Queue() arguments:
  timeout        = options.delete :timeout
  announcement   = options.delete :announce

  # Terse single-character options
  ring_style     = options.delete :play
  allow_hangup   = options.delete :allow_hangup
  allow_transfer = options.delete :allow_transfer
  agi            = options.delete :agi

  raise ArgumentError, "Unrecognized args to join!: #{options.inspect}" if options.any?

  ring_style = case ring_style
  when :ringing then 'r'
  when :music then   ''
  when nil
  else bad_argument[:play => ring_style]
  end.to_s

  allow_hangup = case allow_hangup
  when :caller then   'H'
  when :agent then    'h'
  when :everyone then 'Hh'
  when nil
  else bad_argument[:allow_hangup => allow_hangup]
  end.to_s

  allow_transfer = case allow_transfer
  when :caller then   'T'
  when :agent then    't'
  when :everyone then 'Tt'
  when nil
  else bad_argument[:allow_transfer => allow_transfer]
  end.to_s

  terse_character_options = ring_style + allow_transfer + allow_hangup

  [terse_character_options, '', announcement, timeout, agi].map(&:to_s)
end

Instance Method Details

#agents(options = {}) ⇒ QueueAgentsListProxy

Get the agents associated with a queue

Parameters:

  • options (Hash) (defaults to: {})

Returns:

Raises:

  • (ArgumentError)


105
106
107
108
109
110
111
112
113
# File 'lib/adhearsion/asterisk/queue_proxy.rb', line 105

def agents(options = {})
  cached = options.has_key?(:cache) ? options.delete(:cache) : true
  raise ArgumentError, "Unrecognized arguments to #agents: #{options.inspect}" if options.keys.any?
  if cached
    @cached_proxy ||= QueueAgentsListProxy.new(self, true)
  else
    @uncached_proxy ||=  QueueAgentsListProxy.new(self, false)
  end
end

#any?Boolean

Check whether any calls are waiting in the queue

Returns:

  • (Boolean)


131
132
133
# File 'lib/adhearsion/asterisk/queue_proxy.rb', line 131

def any?
  waiting_count > 0
end

#empty?Boolean

Check whether the waiting count is zero

Returns:

  • (Boolean)


125
126
127
# File 'lib/adhearsion/asterisk/queue_proxy.rb', line 125

def empty?
  waiting_count == 0
end

#exists?Boolean

Check whether a queue exists/is defined in Asterisk

Returns:

  • (Boolean)


137
138
139
140
# File 'lib/adhearsion/asterisk/queue_proxy.rb', line 137

def exists?
  environment.execute('RemoveQueueMember', name, 'SIP/AdhearsionQueueExistenceCheck')
  environment.get_variable("RQMSTATUS") != 'NOSUCHQUEUE'
end

#join!(options = {}) ⇒ Object

Makes the current channel join the queue.

@example
  queue('sales').join!
@example
  queue('sales').join! :timeout => 1.minute
@example
  queue('sales').join! :play => :music
@example
  queue('sales').join! :play => :ringing
@example
  queue('sales').join! :announce => "custom/special-queue-announcement"
@example
  queue('sales').join! :allow_transfer => :caller
@example
  queue('sales').join! :allow_transfer => :agent
@example
  queue('sales').join! :allow_hangup   => :caller
@example
  queue('sales').join! :allow_hangup   => :agent
@example
  queue('sales').join! :allow_hangup   => :everyone
@example
  queue('sales').join! :agi            => 'agi://localhost/sales_queue_callback'
@example
  queue('sales').join! :allow_transfer => :agent, :timeout => 30.seconds,

Parameters:

  • options (Hash) (defaults to: {})

    :timeout - The number of seconds to wait for an agent to answer :play - Can be :ringing or :music. :announce - A sound file to play instead of the normal queue announcement. :allow_transfer - Can be :caller, :agent, or :everyone. Allow someone to transfer the call. :allow_hangup - Can be :caller, :agent, or :everyone. Allow someone to hangup with the * key. :agi - An AGI script to be called on the calling parties channel just before being connected.



96
97
98
99
# File 'lib/adhearsion/asterisk/queue_proxy.rb', line 96

def join!(options = {})
  environment.execute("queue", name, *self.class.format_join_hash_key_arguments(options))
  normalize_queue_status_variable environment.get_variable("QUEUESTATUS")
end

#waiting_countInteger

Check how many channels are waiting in the queue

Returns:

  • (Integer)

Raises:

  • QueueDoesNotExistError



118
119
120
121
# File 'lib/adhearsion/asterisk/queue_proxy.rb', line 118

def waiting_count
  raise QueueDoesNotExistError.new(name) unless exists?
  environment.get_variable("QUEUE_WAITING_COUNT(#{name})").to_i
end