first use of Catapult: check number, return err/ok

Denver Gingerich created

Change summary

sgx-catapult.rb | 105 ++++++++++++++++++++++++++++++++++++++------------
1 file changed, 79 insertions(+), 26 deletions(-)

Detailed changes

sgx-catapult.rb 🔗

@@ -18,6 +18,9 @@
 # with sgx-catapult.  If not, see <http://www.gnu.org/licenses/>.
 
 require 'blather/client/dsl'
+require 'json'
+require 'net/http'
+require 'uri'
 
 if ARGV.size != 4 then
 	puts "Usage: sgx-catapult.rb <component_jid> <component_password> " +
@@ -32,6 +35,23 @@ module SGXcatapult
 		client.run
 	end
 
+	def self.error_msg(orig, query_node, type, name, text = nil)
+		orig.add_child(query_node)
+		orig.type = :error
+
+		error = Nokogiri::XML::Node.new 'error', orig.document
+		error['type'] = type
+		orig.add_child(error)
+
+		suberr = Nokogiri::XML::Node.new name, orig.document
+		suberr['xmlns'] = 'urn:ietf:params:xml:ns:xmpp-stanzas'
+		error.add_child(suberr)
+
+		# TODO: add some explanatory xml:lang='en' text (see text param)
+		puts "RESPONSE3: #{orig.inspect}"
+		return orig
+	end
+
 	setup ARGV[0], ARGV[1], ARGV[2], ARGV[3]
 
 	message :chat?, :body do |m|
@@ -74,43 +94,76 @@ module SGXcatapult
 		if i.type == :set
 			xn = qn.children.find { |v| v.element_name == "x" }
 
+			user_id = ''
+			api_token = ''
+			api_secret = ''
+			phone_num = ''
+
 			if xn.nil?
-				puts "id: " + qn.children.find {
+				user_id = qn.children.find {
 					|v| v.element_name == "nick" }
-				puts "token: " + qn.children.find {
+				api_token = qn.children.find {
 					|v| v.element_name == "username" }
-				puts "secret: " + qn.children.find {
+				api_secret = qn.children.find {
 					|v| v.element_name == "password" }
-				puts "phone num: " + qn.children.find {
+				phone_num = qn.children.find {
 					|v| v.element_name == "phone" }
-				next
-			end
-
-			for field in xn.children
-				if field.element_name == "field"
-					val = field.children.find { |v|
+			else
+				for field in xn.children
+					if field.element_name == "field"
+						val = field.children.find { |v|
 						v.element_name == "value" }
 
-					case field['var']
-					when 'nick'
-						puts "id: " + val.text
-					when 'username'
-						puts "token: " + val.text
-					when 'password'
-						puts "secret: " + val.text
-					when 'phone'
-						puts "phone num: " + val.text
-					when 'FORM_TYPE'
-						puts "FORM_TYPE: " + val.text
-					else
-						# TODO: error
-						puts "weird var: " +field['var']
+						case field['var']
+						when 'nick'
+							user_id = val.text
+						when 'username'
+							api_token = val.text
+						when 'password'
+							api_secret = val.text
+						when 'phone'
+							phone_num = val.text
+						else
+							# TODO: error
+							puts "?: " +field['var']
+						end
 					end
 				end
 			end
 
-			# success (for now)
-			write_to_stream i.reply
+			uri = URI.parse('https://api.catapult.inetwork.com')
+			http = Net::HTTP.new(uri.host, uri.port)
+			http.use_ssl = true
+			request = Net::HTTP::Get.new('/v1/users/' + user_id +
+				'/phoneNumbers/' + phone_num)
+			request.basic_auth api_token, api_secret
+			response = http.request(request)
+
+			puts 'API response: ' + response.to_s + ' with code ' +
+				response.code + ', body "' + response.body + '"'
+
+			if response.code == '200'
+				params = JSON.parse response.body
+				if params['numberState'] == 'enabled'
+					write_to_stream i.reply
+				else
+					# TODO: add text re number disabled
+					write_to_stream error_msg(i.reply, qn,
+						:modify, 'not-acceptable')
+				end
+			elsif response.code == '401'
+				# TODO: add text re bad credentials
+				write_to_stream error_msg(i.reply, qn, :auth,
+					'not-authorized')
+			elsif response.code == '404'
+				# TODO: add text re number not found or disabled
+				write_to_stream error_msg(i.reply, qn, :cancel,
+					'item-not-found')
+			else
+				# TODO: add text re misc error, and mention code
+				write_to_stream error_msg(i.reply, qn, :modify,
+					'not-acceptable')
+			end
 
 		elsif i.type == :get
 			orig = i.reply