Offer LNURL QR code for download on Lightning info page #135
1
Gemfile
1
Gemfile
@ -57,6 +57,7 @@ gem "sentry-rails"
|
||||
|
||||
# Services
|
||||
gem 'discourse_api'
|
||||
gem "lnurl"
|
||||
gem 'nostr', git: 'https://gitea.kosmos.org/kosmos/nostr-gem.git', branch: 'feature/ruby_2.7_compat'
|
||||
|
||||
group :development, :test do
|
||||
|
@ -206,6 +206,8 @@ GEM
|
||||
listen (3.8.0)
|
||||
rb-fsevent (~> 0.10, >= 0.10.3)
|
||||
rb-inotify (~> 0.9, >= 0.9.10)
|
||||
lnurl (1.0.1)
|
||||
bech32 (~> 1.1)
|
||||
lockbox (1.2.0)
|
||||
loofah (2.21.3)
|
||||
crass (~> 1.0.2)
|
||||
@ -430,6 +432,7 @@ DEPENDENCIES
|
||||
letter_opener
|
||||
letter_opener_web
|
||||
listen (~> 3.2)
|
||||
lnurl
|
||||
lockbox
|
||||
net-ldap
|
||||
nostr!
|
||||
|
@ -1,4 +1,5 @@
|
||||
require "rqrcode"
|
||||
require "lnurl"
|
||||
|
||||
class Services::LightningController < ApplicationController
|
||||
before_action :authenticate_user!
|
||||
@ -8,9 +9,56 @@ class Services::LightningController < ApplicationController
|
||||
|
||||
def index
|
||||
@wallet_url = "lndhub://#{current_user.ln_account}:#{current_user.ln_password}@#{ENV['LNDHUB_PUBLIC_URL']}"
|
||||
initialize_lndhub_qr_code
|
||||
end
|
||||
|
||||
qrcode = RQRCode::QRCode.new(@wallet_url)
|
||||
@svg = qrcode.as_svg(
|
||||
def transactions
|
||||
@transactions = fetch_transactions
|
||||
end
|
||||
|
||||
def qr_lnurlp
|
||||
lnurlp_url = "https://kosmos.org/.well-known/lnurlp/#{current_user.cn}"
|
||||
lnurlp_bech32 = Lnurl.new(lnurlp_url).to_bech32
|
||||
qr_code = RQRCode::QRCode.new("lightning:" + lnurlp_bech32)
|
||||
|
||||
respond_to do |format|
|
||||
raucao marked this conversation as resolved
Outdated
|
||||
format.svg do
|
||||
qr_svg = qr_code.as_svg(
|
||||
color: "000",
|
||||
shape_rendering: "crispEdges",
|
||||
module_size: 6,
|
||||
standalone: true,
|
||||
use_path: true,
|
||||
svg_attributes: {
|
||||
class: 'inline-block'
|
||||
}
|
||||
)
|
||||
send_data(
|
||||
qr_svg,
|
||||
filename: "bitcoin-lightning-#{current_user.address}.svg",
|
||||
raucao marked this conversation as resolved
Outdated
bumi
commented
does this need a does this need a `disposition` attribute? 🤔
raucao
commented
Disposition should default to attachment, i.e. download. It works exactly as intended in FF, maybe you could test manually in another browser? Disposition should default to attachment, i.e. download. It works exactly as intended in FF, maybe you could test manually in another browser?
|
||||
type: "image/svg+xml"
|
||||
)
|
||||
end
|
||||
format.png do
|
||||
qr_png = qr_code.as_png(
|
||||
fill: "white",
|
||||
color: "black",
|
||||
size: 1024,
|
||||
)
|
||||
send_data(
|
||||
qr_png,
|
||||
filename: "bitcoin-lightning-#{current_user.address}.png",
|
||||
type: "image/png"
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def initialize_lndhub_qr_code
|
||||
qr_code = RQRCode::QRCode.new(@wallet_url)
|
||||
@lndhub_qr_svg = qr_code.as_svg(
|
||||
color: "000",
|
||||
shape_rendering: "crispEdges",
|
||||
module_size: 6,
|
||||
@ -22,12 +70,6 @@ class Services::LightningController < ApplicationController
|
||||
)
|
||||
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]
|
||||
|
@ -7,13 +7,25 @@
|
||||
|
||||
<section>
|
||||
<h3>Lightning Address</h3>
|
||||
<p>
|
||||
<p class="mb-6">
|
||||
Your Kosmos user address is also a
|
||||
<a class="ks-text-link" href="https://lightningaddress.com/" target="_blank">Lightning Address</a>!
|
||||
The easiest way to receive sats is by just giving out your address:
|
||||
</p>
|
||||
<p>
|
||||
<strong><%= current_user.address %></strong>
|
||||
<p data-controller="clipboard" class="flex gap-1 sm:w-2/5">
|
||||
<input type="text" id="user_address" class="grow"
|
||||
value=<%= current_user.address %> disabled="disabled"
|
||||
data-clipboard-target="source" />
|
||||
<button id="copy-user-address" class="btn-md btn-icon btn-blue shrink-0"
|
||||
data-clipboard-target="trigger" data-action="clipboard#copy"
|
||||
title="Copy to clipboard">
|
||||
<span class="content-initial">
|
||||
<%= render partial: "icons/copy", locals: { custom_class: "text-white h-4 w-4 inline" } %>
|
||||
</span>
|
||||
<span class="content-active hidden">
|
||||
<%= render partial: "icons/check", locals: { custom_class: "text-white h-4 w-4 inline" } %>
|
||||
</span>
|
||||
</button>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
@ -39,7 +51,7 @@
|
||||
<button id="hide-setup-code" class="hidden btn-md btn-blue w-full sm:w-auto">Hide setup QR code</button>
|
||||
</p>
|
||||
<p id="setup-code" class="hidden my-10 w-full text-center">
|
||||
<%= raw @svg %>
|
||||
<%= raw @lndhub_qr_svg %>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
@ -88,6 +100,24 @@
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="mb-12">
|
||||
<h3>QR Code for Donations/Tips</h3>
|
||||
<p>
|
||||
You can print out or publish a QR code for people to scan with their
|
||||
wallet apps, so they can send you sats without a direct personal
|
||||
interaction (for example at a concert, or on your website).
|
||||
</p>
|
||||
<p class="my-6 text-center md:text-left">
|
||||
<%= link_to "Download SVG file",
|
||||
qr_lnurlp_services_lightning_index_path(format: "svg"),
|
||||
class: "btn-md btn-blue w-full sm:w-auto"%>
|
||||
<span class="mx-2 my-2 md:my-0 block md:inline">or</span>
|
||||
<%= link_to "Download PNG file",
|
||||
qr_lnurlp_services_lightning_index_path(format: "png"),
|
||||
class: "btn-md btn-blue w-full sm:w-auto"%>
|
||||
</p>
|
||||
</section>
|
||||
<% end %>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
@ -24,6 +24,7 @@ Rails.application.routes.draw do
|
||||
resources :lightning, only: [:index] do
|
||||
collection do
|
||||
get 'transactions'
|
||||
get 'qr_lnurlp'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Loading…
x
Reference in New Issue
Block a user
why don't you use
respond_to
here?Good question. Should've done so to begin with. Refactored and pushed.
I'd move the logic out of this block and only have