diff --git a/contrib/plugins/helloworld.py b/contrib/plugins/helloworld.py index 372d369d7..214ac74e9 100755 --- a/contrib/plugins/helloworld.py +++ b/contrib/plugins/helloworld.py @@ -1,111 +1,28 @@ #!/usr/bin/env python3 -"""Simple plugin to show how to build new plugins for c-lightning +from lightning import Plugin -It demonstrates how a plugin communicates with c-lightning, how it -registers command line arguments that should be passed through and how -it can register JSON-RPC commands. We communicate with the main daemon -through STDIN and STDOUT, reading and writing JSON-RPC requests. -""" -import json -import sys +plugin = Plugin(autopatch=True) -greeting = "World" +@plugin.method("hello") +def hello(name, plugin): + """This is the documentation string for the hello-function. + It gets reported as the description when registering the function + as a method with `lightningd`. -def json_hello(request, name): - greeting = "Hello {}".format(name) - return greeting - - -def json_fail(request): - raise ValueError("This will fail") - - -def json_getmanifest(request): - global greeting - return { - "options": [ - {"name": "greeting", - "type": "string", - "default": greeting, - "description": "What name should I call you?"}, - ], - "rpcmethods": [ - { - "name": "hello", - "description": "Returns a personalized greeting for {name}", - }, - { - "name": "fail", - "description": "Always returns a failure for testing", - }, - ] - } - - -def plugin_log(message, level="info"): - payload = { - "jsonrpc": "2.0", - "method": "log", - "params": { - "level": level, - "message": message, - } - } - json.dump(payload, fp=sys.stdout) - sys.stdout.write('\n\n') - sys.stdout.flush() - - -def json_init(request, options, configuration): - """The main daemon is telling us the relevant cli options """ - global greeting - greeting = request['params']['options']['greeting'] - plugin_log("Plugin helloworld.py initialized with greeting \"{}\"".format(greeting), "debug") - - return "ok" - - -methods = { - 'hello': json_hello, - 'fail': json_fail, - 'getmanifest': json_getmanifest, - 'init': json_init, -} + greeting = plugin.get_option('greeting') + s = '{} {}'.format(greeting, name) + plugin.log(s) + return s -partial = "" -for l in sys.stdin: - try: - partial += l - request = json.loads(partial) - except Exception: - continue +@plugin.method("init") +def init(options, configuration, plugin): + plugin.log("Plugin helloworld.py initialized") - result = None - method = methods[request['method']] - params = request['params'] - try: - if isinstance(params, dict): - result = method(request, **params) - else: - result = method(request, *params) - result = { - "jsonrpc": "2.0", - "result": result, - "id": request['id'] - } - except Exception: - result = { - "jsonrpc": "2.0", - "error": "Error while processing {}".format(request['method']), - "id": request['id'] - } - json.dump(result, fp=sys.stdout) - sys.stdout.write('\n') - sys.stdout.flush() - partial = "" +plugin.add_option('greeting', 'Hello', 'The greeting I should use.') +plugin.run() diff --git a/contrib/pylightning/lightning/plugin.py b/contrib/pylightning/lightning/plugin.py index 58e9b72a7..12d8d7227 100644 --- a/contrib/pylightning/lightning/plugin.py +++ b/contrib/pylightning/lightning/plugin.py @@ -180,7 +180,6 @@ class Plugin(object): def _getmanifest(self): methods = [] - for name, func in self.methods.items(): # Skip the builtin ones, they don't get reported if name in ['getmanifest', 'init']: diff --git a/tests/test_plugin.py b/tests/test_plugin.py index c8760f15c..6b9d15360 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -28,7 +28,7 @@ def test_option_passthrough(node_factory): # Now try to see if it gets accepted, would fail to start if the # option didn't exist - n = node_factory.get_node(options={'plugin': plugin_path, 'greeting': 'Mars'}) + n = node_factory.get_node(options={'plugin': plugin_path, 'greeting': 'Ciao'}) n.stop() @@ -40,7 +40,7 @@ def test_rpc_passthrough(node_factory): """ plugin_path = 'contrib/plugins/helloworld.py' - n = node_factory.get_node(options={'plugin': plugin_path, 'greeting': 'Mars'}) + n = node_factory.get_node(options={'plugin': plugin_path, 'greeting': 'Ciao'}) # Make sure that the 'hello' command that the helloworld.py plugin # has registered is available. @@ -52,8 +52,8 @@ def test_rpc_passthrough(node_factory): assert n.daemon.is_in_log('Plugin helloworld.py initialized') # Now try to call it and see what it returns: - greet = n.rpc.hello(name='Sun') - assert(greet == "Hello Sun") + greet = n.rpc.hello(name='World') + assert(greet == "Ciao World") with pytest.raises(RpcError): n.rpc.fail()