Browse Source

kivy: port lightning ui to lnbase

regtest_lnd
Janus 7 years ago
committed by SomberNight
parent
commit
d290e62e9c
No known key found for this signature in database GPG Key ID: B33B5F232C6271E9
  1. 1
      electrum/gui/qt/main_window.py
  2. 30
      gui/kivy/uix/dialogs/lightning_channels.py
  3. 41
      gui/kivy/uix/dialogs/lightning_payer.py
  4. 3
      lib/lnbase.py

1
electrum/gui/qt/main_window.py

@ -2095,6 +2095,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
'util': util,
'bitcoin': bitcoin,
})
if self.config.get('lnbase', False): console.updateNamespace({'lightning' : self.wallet.lnworker.console_interface})
c = commands.Commands(self.config, self.wallet, self.network, lambda: self.console.set_json(True))
methods = {}

30
gui/kivy/uix/dialogs/lightning_channels.py

@ -3,16 +3,15 @@ from kivy.lang import Builder
from kivy.factory import Factory
from kivy.uix.popup import Popup
from kivy.clock import Clock
import electrum.lightning as lightning
from electrum_gui.kivy.uix.context_menu import ContextMenu
Builder.load_string('''
<LightningChannelItem@CardItem>
details: {}
active: False
channelPoint: '<channelPoint not set>'
channelId: '<channelId not set>'
Label:
text: root.channelPoint
text: root.channelId
<LightningChannelsDialog@Popup>:
name: 'lightning_channels'
@ -87,6 +86,7 @@ class LightningChannelsDialog(Factory.Popup):
self.clocks = []
self.app = app
self.context_menu = None
self.app.wallet.lnworker.subscribe_channel_list_updates_from_other_thread(self.rpc_result_handler)
def show_channel_details(self, obj):
p = Factory.ChannelDetailsPopup()
@ -94,8 +94,7 @@ class LightningChannelsDialog(Factory.Popup):
p.open()
def close_channel(self, obj):
print("asked to close channel", obj.channelPoint)
lightning.lightningCall(self.app.wallet.network.lightningrpc, "closechannel")(*([obj.channelPoint] + (["--force"] if not obj.active else [])))
print("UNIMPLEMENTED asked to close channel", obj.channelId) # TODO
def show_menu(self, obj):
self.hide_menu()
@ -108,24 +107,7 @@ class LightningChannelsDialog(Factory.Popup):
self.ids.box.remove_widget(self.context_menu)
self.context_menu = None
def open(self, *args, **kwargs):
super(LightningChannelsDialog, self).open(*args, **kwargs)
for i in self.clocks: i.cancel()
self.clocks.append(Clock.schedule_interval(self.fetch_channels, 10))
self.app.wallet.network.lightningrpc.subscribe(self.rpc_result_handler)
def dismiss(self, *args, **kwargs):
self.hide_menu()
super(LightningChannelsDialog, self).dismiss(*args, **kwargs)
self.app.wallet.network.lightningrpc.clearSubscribers()
def fetch_channels(self, dw):
lightning.lightningCall(self.app.wallet.network.lightningrpc, "listchannels")()
def rpc_result_handler(self, methodName, res):
print("got result", methodName)
if isinstance(res, Exception):
raise res
def rpc_result_handler(self, res):
channel_cards = self.ids.lightning_channels_container
channel_cards.clear_widgets()
if "channels" in res:
@ -133,7 +115,7 @@ class LightningChannelsDialog(Factory.Popup):
item = Factory.LightningChannelItem()
item.screen = self
print(i)
item.channelPoint = i["channel_point"].split(":")[0]
item.channelId = i["chan_id"]
item.active = i["active"]
item.details = i
channel_cards.add_widget(item)

41
gui/kivy/uix/dialogs/lightning_payer.py

@ -2,7 +2,7 @@ import binascii
from kivy.lang import Builder
from kivy.factory import Factory
from electrum_gui.kivy.i18n import _
import electrum.lightning as lightning
from kivy.clock import mainthread
from electrum.lightning_payencode.lnaddr import lndecode
Builder.load_string('''
@ -49,36 +49,45 @@ class LightningPayerDialog(Factory.Popup):
def __init__(self, app):
super(LightningPayerDialog, self).__init__()
self.app = app
def open(self, *args, **kwargs):
super(LightningPayerDialog, self).open(*args, **kwargs)
class FakeQtSignal:
def emit(self2, data):
self.app.show_info(data)
class MyConsole:
new_lightning_result = FakeQtSignal()
self.app.wallet.network.lightningrpc.setConsole(MyConsole())
def dismiss(self, *args, **kwargs):
super(LightningPayerDialog, self).dismiss(*args, **kwargs)
self.app.wallet.network.lightningrpc.setConsole(None)
#def open(self, *args, **kwargs):
# super(LightningPayerDialog, self).open(*args, **kwargs)
#def dismiss(self, *args, **kwargs):
# super(LightningPayerDialog, self).dismiss(*args, **kwargs)
def do_paste_xclip(self):
import subprocess
proc = subprocess.run(["xclip","-sel","clipboard","-o"], stdout=subprocess.PIPE)
self.invoice_data = proc.stdout.decode("ascii")
def do_paste(self):
contents = self.app._clipboard.paste()
if not contents:
self.app.show_info(_("Clipboard is empty"))
return
self.invoice_data = contents
def do_clear(self):
self.invoice_data = ""
def do_open_channel(self):
compressed_pubkey_bytes = lndecode(self.invoice_data).pubkey.serialize()
hexpubkey = binascii.hexlify(compressed_pubkey_bytes).decode("ascii")
local_amt = 100000
push_amt = 0
lightning.lightningCall(self.app.wallet.network.lightningrpc, "openchannel")(hexpubkey, local_amt, push_amt)
local_amt = 200000
push_amt = 100000
def on_success(pw):
# node_id, local_amt, push_amt, emit_function, get_password
self.app.wallet.lnworker.open_channel_from_other_thread(hexpubkey, local_amt, push_amt, mainthread(lambda parent: self.app.show_info(_("Channel open, waiting for locking..."))), lambda: pw)
if self.app.wallet.has_keystore_encryption():
# wallet, msg, on_success (Tuple[str, str] -> ()), on_failure (() -> ())
self.app.password_dialog(self.app.wallet, _("Password needed for opening channel"), on_success, lambda: self.app.show_error(_("Failed getting password from you")))
else:
on_success("")
def do_pay(self):
lightning.lightningCall(self.app.wallet.network.lightningrpc, "sendpayment")("--pay_req=" + self.invoice_data)
self.app.wallet.lnworker.pay_invoice_from_other_thread(self.invoice_data)
def on_lightning_qr(self, data):
self.invoice_data = str(data)

3
lib/lnbase.py

@ -1434,6 +1434,9 @@ class LNWorker:
def subscribe_invoice_added_from_other_thread(self, emit_function):
pass
def pay_invoice_from_other_thread(self, lnaddr):
pass
class ChannelInfo(PrintError):
def __init__(self, channel_announcement_payload):

Loading…
Cancel
Save