command_list.rb

 1# frozen_string_literal: true
 2
 3class CommandList
 4	include Enumerable
 5
 6	def self.for(jid)
 7		Customer.for_jid(jid).catch { nil }.then do |customer|
 8			EMPromise.resolve(customer&.registered?).catch { nil }.then do |reg|
 9				next Registered.for(customer, reg.phone) if reg
10				CommandList.new
11			end
12		end
13	end
14
15	def each
16		yield node: "jabber:iq:register", name: "Register"
17	end
18
19	class Registered < CommandList
20		def self.for(customer, tel)
21			EMPromise.all([
22				REDIS.get("catapult_fwd-#{tel}"),
23				customer.plan_name ? customer.payment_methods : []
24			]).then do |(fwd, payment_methods)|
25				klass = Class.new(Registered)
26				klass.include(HasBilling) unless payment_methods.empty?
27				klass.include(HasForwarding) if fwd
28				klass.new
29			end
30		end
31
32		def each
33			super
34			yield node: "number-display", name: "Display JMP Number"
35			yield node: "configure-calls", name: "Configure Calls"
36			yield node: "usage", name: "Show Monthly Usage"
37			yield node: "reset sip account", name: "Create or Reset SIP Account"
38		end
39	end
40
41	module HasForwarding
42		def each
43			super
44			yield(
45				node: "record-voicemail-greeting",
46				name: "Record Voicemail Greeting"
47			)
48		end
49	end
50
51	module HasBilling
52		def each
53			super
54			yield node: "buy-credit", name: "Buy account credit"
55		end
56	end
57end