#!/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