#!/usr/bin/ruby # frozen_string_literal: true require "dhall" require "pg" require_relative "../lib/blather_notify" require_relative "../lib/to_form" CONFIG = Dhall.load(<<-DHALL).sync (#{ARGV[0]}) : { sgx_jmp: Text, notify_using: { jid: Text, password: Text, target: Text -> Text, body: Text -> Text -> Text } } DHALL using ToForm db = PG.connect(dbname: "jmp") db.type_map_for_results = PG::BasicTypeMapForResults.new(db) db.type_map_for_queries = PG::BasicTypeMapForQueries.new(db) BlatherNotify.start( CONFIG[:notify_using][:jid], CONFIG[:notify_using][:password] ) promises = [] db.exec( <<-SQL SELECT customer_id FROM customer_plans WHERE expires_at <= LOCALTIMESTAMP + '4 days' SQL ).each do |row| EM.next_tick do promises << BlatherNotify.execute( "customer info", { q: row["customer_id"] }.to_form(:submit) ).then { |iq| BlatherNotify.write_with_promise(BlatherNotify.command( "customer info", iq.sessionid )) }.then do |iq| unless iq.form.field("action") next "#{row["customer_id"]} not found" end BlatherNotify.write_with_promise(BlatherNotify.command( "customer info", iq.sessionid, action: :complete, form: { action: "bill_plan" }.to_form(:submit) )) end end end one = Queue.new def format(item) if item.respond_to?(:note) && item.note item.note.text elsif item.respond_to?(:to_xml) item.to_xml else item.inspect end end EM.add_timer(0) do EMPromise.all(promises).then( ->(all) { one << all }, ->(err) { one << RuntimeError.new(format(err)) } ) end result = one.pop raise result if result.is_a?(Exception) result.each do |item| puts format(item) end