~singpolyma/sgx-jmp

9daaf10db0564b879282b13859f168c88919360e — Stephen Paul Weber 2 months ago 4b5310c
Refactor message limits, change to 500/day
1 files changed, 28 insertions(+), 20 deletions(-)

M sgx_jmp.rb
M sgx_jmp.rb => sgx_jmp.rb +28 -20
@@ 311,13 311,21 @@ def billable_message(m)
	(m.body && !m.body.empty?) || m.find("ns:x", ns: OOB.registered_ns).first
end

def notify_admin_of_usage(customer, usage, today)
	ExpiringLock.new("jmp_usage_notify-#{customer.customer_id}").with do
		BLATHER.join(CONFIG[:notify_admin], "sgx-jmp")
		BLATHER.say(
			CONFIG[:notify_admin], "#{customer.customer_id} has used " \
			"#{usage} messages since #{today - 30}", :groupchat
		)
class OverLimit < StandardError
	def initialize(customer, usage)
		super("Please contact support")
		@customer = customer
		@usage = usage
	end

	def notify_admin
		ExpiringLock.new("jmp_usage_notify-#{@customer.customer_id}").with do
			BLATHER.join(CONFIG[:notify_admin], "sgx-jmp")
			BLATHER.say(
				CONFIG[:notify_admin], "#{@customer.customer_id} has used " \
				"#{@usage} messages today", :groupchat
			)
		end
	end
end



@@ 329,19 337,19 @@ message do |m|
	CustomerRepo
		.new(set_user: sentry_hub.current_scope.method(:set_user))
		.find_by_jid(m.from.stripped).then { |customer|
			EMPromise.all([
				(customer.incr_message_usage if billable_message(m)),
				customer.message_usage((today..(today - 30))).then do |usage|
					if usage < 4500
						customer.stanza_from(m)
					else
						BLATHER << m.as_error(
							"policy-violation", :wait, "Please contact support"
						)
					end
					notify_admin_of_usage(customer, usage, today) if usage > 900
				end
			])
			next customer.stanza_from(m) unless billable_message(m)

			customer.message_usage((today..today)).then { |usage|
				raise OverLimit.new(customer, usage) if usage > 500
			}.then do
				EMPromise.all([
					customer.incr_message_usage,
					customer.stanza_from(m)
				])
			end
		}.catch_only(OverLimit) { |e|
			e.notify_admin
			BLATHER << m.as_error("policy-violation", :wait, e.message)
		}.catch_only(CustomerRepo::NotFound) { |e|
			BLATHER << m.as_error("forbidden", :auth, e.message)
		}.catch { |e| panic(e, sentry_hub) }