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				Registered.new(*[
26					(HAS_CREDIT_CARD unless payment_methods.empty?),
27					(HAS_CURRENCY if customer.currency),
28					(HAS_FORWARDING if fwd)
29				].compact)
30			end
31		end
32
33		def initialize(*args)
34			@extra = args
35		end
36
37		ALWAYS = [
38			{ node: "number-display", name: "Display JMP Number" },
39			{ node: "configure-calls", name: "Configure Calls" },
40			{ node: "usage", name: "Show Monthly Usage" },
41			{ node: "reset sip account", name: "Create or Reset SIP Account" },
42			{
43				node: "credit cards",
44				name: "Credit Card Settings and Management"
45			}
46		].freeze
47
48		def each
49			super
50			([ALWAYS] + @extra).each do |commands|
51				commands.each { |x| yield x }
52			end
53		end
54	end
55
56	HAS_CURRENCY = [
57		node: "alt top up",
58		name: "Buy Account Credit by Bitcoin, Mail, or Interac eTransfer"
59	].freeze
60
61	HAS_FORWARDING = [
62		node: "record-voicemail-greeting",
63		name: "Record Voicemail Greeting"
64	].freeze
65
66	HAS_CREDIT_CARD = [
67		node: "top up", name: "Buy Account Credit by Credit Card"
68	].freeze
69end