customer_ogm.rb

 1# frozen_string_literal: true
 2
 3module CustomerOGM
 4	def self.for(url, fetch_vcard)
 5		return Media.new(url) if url
 6
 7		TTS.for(fetch_vcard)
 8	end
 9
10	class Media
11		def initialize(url)
12			@url = url
13		end
14
15		def to_render
16			[:voicemail_ogm_media, { locals: { url: @url } }]
17		end
18	end
19
20	class TTS
21		def self.for(fetch_vcard)
22			fetch_vcard.call.then { |vcard|
23				new(vcard.first.payload_node)
24			}.catch { new(Nokogiri::XML::Document.new) }
25		end
26
27		def initialize(vcard)
28			@vcard = vcard
29		end
30
31		def [](k)
32			value = @vcard.find_first(
33				"./ns:#{k.downcase}/ns:text",
34				ns: "urn:ietf:params:xml:ns:vcard-4.0"
35			)
36			return if !value || value.content.empty?
37
38			value.content
39		end
40
41		def fn
42			self["FN"] || self["NICKNAME"] || "a user of JMP.chat"
43		end
44
45		def to_render
46			[:voicemail_ogm_tts, { locals: { fn: fn } }]
47		end
48	end
49end