From 7e1b1ca730b1cb0dd981cce21ea17b82338ede13 Mon Sep 17 00:00:00 2001
From: Oleg Silkin <o.silkin98@gmail.com>
Date: Tue, 31 Dec 2019 04:52:16 -0500
Subject: [PATCH] Adds `comment_edit` command

---
 lbry/extras/daemon/daemon.py | 55 ++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/lbry/extras/daemon/daemon.py b/lbry/extras/daemon/daemon.py
index 6f10da633..8bc5b34ab 100644
--- a/lbry/extras/daemon/daemon.py
+++ b/lbry/extras/daemon/daemon.py
@@ -4533,6 +4533,7 @@ class Daemon(metaclass=JSONRPCServerType):
                 "channel_name": (str) Name of the channel this was posted under, prepended with a '@',
                 "channel_id":   (str) The Channel Claim ID that this comment was posted under,
                 "signature":    (str) The signature of the comment,
+                "signing_ts":   (str) The timestamp used to sign the comment,
                 "channel_url":  (str) Channel's URI in the ClaimTrie,
                 "parent_id":    (str) Comment this is replying to, (None) if this is the root,
                 "timestamp":    (int) The time at which comment was entered into the server at, in nanoseconds.
@@ -4558,6 +4559,60 @@ class Daemon(metaclass=JSONRPCServerType):
             response['is_claim_signature_valid'] = comment_client.is_comment_signed_by_channel(response, channel)
         return response
 
+    @requires(WALLET_COMPONENT)
+    async def jsonrpc_comment_edit(self, comment, comment_id, wallet_id=None):
+        """
+        Edit a comment published as one of your channels.
+
+        Usage:
+            comment_edit (<comment> | --comment=<comment>)
+                         (<comment_id> | --comment_id=<comment_id>)
+                         [--wallet_id=<wallet_id>]
+
+        Options:
+            --comment=<comment>         : (str) New comment replacing the old one
+            --comment_id=<comment_id>   : (str) Hash identifying the comment to edit
+            --wallet_id=<wallet_id      : (str) restrict operation to specific wallet
+
+        Returns:
+            (dict) Comment object if edit was successful, (None) otherwise
+            {
+                "comment":      (str) The actual string as inputted by the user,
+                "comment_id":   (str) The Comment's unique identifier,
+                "channel_name": (str) Name of the channel this was posted under, prepended with a '@',
+                "channel_id":   (str) The Channel Claim ID that this comment was posted under,
+                "signature":    (str) The signature of the comment,
+                "signing_ts":   (str) Timestamp used to sign the most recent signature,
+                "channel_url":  (str) Channel's URI in the ClaimTrie,
+                "parent_id":    (str) Comment this is replying to, (None) if this is the root,
+                "timestamp":    (int) The time at which comment was entered into the server at, in nanoseconds.
+            }
+        """
+        channel = await comment_client.jsonrpc_post(
+            self.conf.comment_server,
+            'get_channel_from_comment_id',
+            comment_id=comment_id
+        )
+        if 'error' in channel:
+            return
+
+        wallet = self.wallet_manager.get_wallet_or_default(wallet_id)
+        # channel = await self.get_channel_or_none(wallet, None, **channel)
+        channel_claim = await self.get_channel_or_none(wallet, [], **channel)
+        if channel_claim is None:
+            return
+
+        edited_comment = {
+            'comment_id': comment_id,
+            'comment': comment,
+            'channel_id': channel_claim.claim_id,
+            'channel_name': channel_claim.claim_name
+        }
+        comment_client.sign_comment(edited_comment, channel_claim)
+        return await comment_client.jsonrpc_post(
+            self.conf.comment_server, 'edit_comment', edited_comment
+        )
+
     @requires(WALLET_COMPONENT)
     async def jsonrpc_comment_abandon(self, comment_id, wallet_id=None):
         """