92 lines
2.5 KiB
Ruby
92 lines
2.5 KiB
Ruby
require "rqrcode"
|
|
|
|
class Services::LightningController < ApplicationController
|
|
before_action :authenticate_user!
|
|
before_action :authenticate_with_lndhub
|
|
before_action :set_current_section
|
|
before_action :fetch_balance
|
|
|
|
def index
|
|
@wallet_url = "lndhub://#{current_user.ln_account}:#{current_user.ln_password}@#{ENV['LNDHUB_PUBLIC_URL']}"
|
|
|
|
qrcode = RQRCode::QRCode.new(@wallet_url)
|
|
@svg = qrcode.as_svg(
|
|
color: "000",
|
|
shape_rendering: "crispEdges",
|
|
module_size: 6,
|
|
standalone: true,
|
|
use_path: true,
|
|
svg_attributes: {
|
|
class: 'inline-block'
|
|
}
|
|
)
|
|
end
|
|
|
|
def transactions
|
|
@transactions = fetch_transactions
|
|
end
|
|
|
|
private
|
|
|
|
def authenticate_with_lndhub(options={})
|
|
if session[:ln_auth_token].present? && !options[:force_reauth]
|
|
@ln_auth_token = session[:ln_auth_token]
|
|
else
|
|
lndhub = Lndhub.new
|
|
auth_token = lndhub.authenticate(current_user)
|
|
session[:ln_auth_token] = auth_token
|
|
@ln_auth_token = auth_token
|
|
end
|
|
rescue
|
|
# TODO add exception tracking
|
|
end
|
|
|
|
def set_current_section
|
|
@current_section = :services
|
|
end
|
|
|
|
def fetch_balance
|
|
lndhub = Lndhub.new
|
|
data = lndhub.balance @ln_auth_token
|
|
@balance = data["BTC"]["AvailableBalance"] rescue nil
|
|
rescue
|
|
authenticate_with_lndhub(force_reauth: true)
|
|
return nil if @fetch_balance_retried
|
|
@fetch_balance_retried = true
|
|
fetch_balance
|
|
end
|
|
|
|
def fetch_transactions
|
|
lndhub = Lndhub.new
|
|
txs = lndhub.gettxs @ln_auth_token
|
|
invoices = lndhub.getuserinvoices(@ln_auth_token).select{|i| i["ispaid"]}
|
|
process_transactions(txs + invoices)
|
|
rescue
|
|
authenticate_with_lndhub(force_reauth: true)
|
|
return [] if @fetch_transactions_retried
|
|
@fetch_transactions_retried = true
|
|
fetch_transactions
|
|
end
|
|
|
|
def process_transactions(txs)
|
|
txs.collect do |tx|
|
|
if tx["type"] == "bitcoind_tx"
|
|
tx["amount_sats"] = (tx["amount"] * 100000000).to_i
|
|
tx["datetime"] = Time.at(tx["time"].to_i)
|
|
tx["title"] = "Received"
|
|
tx["description"] = "On-chain topup"
|
|
tx["received"] = true
|
|
else
|
|
tx["amount_sats"] = tx["value"] || tx["amt"]
|
|
tx["fee"] = tx["type"] == "paid_invoice" ? tx["fee"] : nil
|
|
tx["datetime"] = Time.at(tx["timestamp"].to_i)
|
|
tx["title"] = tx["type"] == "paid_invoice" ? "Sent" : "Received"
|
|
tx["description"] = tx["memo"] || tx["description"]
|
|
tx["received"] = tx["type"] == "user_invoice"
|
|
end
|
|
end
|
|
|
|
txs.sort{ |a,b| b["datetime"] <=> a["datetime"] }
|
|
end
|
|
end
|