From 15e89650ff29688a71089e7398ba531c13f04aa8 Mon Sep 17 00:00:00 2001
From: Alex Grintsvayg <grin@lbry.io>
Date: Wed, 26 Apr 2017 20:02:00 -0400
Subject: [PATCH] track more events

---
 lbrynet/analytics.py             | 14 +++++++++++++-
 lbrynet/conf.py                  |  7 +++++--
 lbrynet/lbrynet_daemon/Daemon.py | 30 ++++++++++++++++--------------
 3 files changed, 34 insertions(+), 17 deletions(-)

diff --git a/lbrynet/analytics.py b/lbrynet/analytics.py
index 43b44de16..ea3006c75 100644
--- a/lbrynet/analytics.py
+++ b/lbrynet/analytics.py
@@ -15,6 +15,9 @@ DOWNLOAD_STARTED = 'Download Started'
 DOWNLOAD_ERRORED = 'Download Errored'
 DOWNLOAD_FINISHED = 'Download Finished'
 HEARTBEAT = 'Heartbeat'
+CLAIM_ACTION = 'Claim Action'  # publish/create/update/abandon
+NEW_CHANNEL = 'New Channel'
+CREDITS_SENT = 'Credits Sent'
 
 BLOB_BYTES_UPLOADED = 'Blob Bytes Uploaded'
 BLOB_BYTES_AVAILABLE = 'Blob Bytes Available'
@@ -64,6 +67,15 @@ class Manager(object):
             self._event(DOWNLOAD_FINISHED, self._download_properties(id_, name, stream_info))
         )
 
+    def send_claim_action(self, action):
+        self.analytics_api.track(self._event(CLAIM_ACTION, {'action': action}))
+
+    def send_new_channel(self):
+        self.analytics_api.track(self._event(NEW_CHANNEL))
+
+    def send_credits_sent(self):
+        self.analytics_api.track(self._event(CREDITS_SENT))
+
     def _send_heartbeat(self):
         self.analytics_api.track(self._event(HEARTBEAT))
 
@@ -236,7 +248,7 @@ class Api(object):
         """Initialize an instance using values from the configuration"""
         session = Session()
         if enabled is None:
-            enabled = conf.settings['share_debug_info']
+            enabled = conf.settings['share_usage_data']
         return cls(
             session,
             conf.settings['ANALYTICS_ENDPOINT'],
diff --git a/lbrynet/conf.py b/lbrynet/conf.py
index f5654e65a..0047a498c 100644
--- a/lbrynet/conf.py
+++ b/lbrynet/conf.py
@@ -199,7 +199,7 @@ ADJUSTABLE_SETTINGS = {
     'run_on_startup': (bool, False),
     'run_reflector_server': (bool, False),
     'sd_download_timeout': (int, 3),
-    'share_debug_info': (bool, True),  # whether to share diagnostic info with LBRY
+    'share_usage_data': (bool, True),  # whether to share usage stats and diagnostic info with LBRY
     'peer_search_timeout': (int, 3),
     'search_servers': (list, ['lighthouse1.lbry.io:50005']),
     'search_timeout': (float, 5.0),
@@ -392,8 +392,11 @@ class Config(object):
         if 'startup_scripts' in settings_dict:
             del settings_dict['startup_scripts']
         if 'upload_log' in settings_dict:
-            settings_dict['share_debug_info'] = settings_dict['upload_log']
+            settings_dict['share_usage_data'] = settings_dict['upload_log']
             del settings_dict['upload_log']
+        if 'share_debug_info' in settings_dict:
+            settings_dict['share_usage_data'] = settings_dict['share_debug_info']
+            del settings_dict['share_debug_info']
         for key in settings_dict.keys():
             if not self._is_valid_setting(key):
                 log.warning('Ignoring invalid conf file setting: %s', key)
diff --git a/lbrynet/lbrynet_daemon/Daemon.py b/lbrynet/lbrynet_daemon/Daemon.py
index ee04565ed..6d810add2 100644
--- a/lbrynet/lbrynet_daemon/Daemon.py
+++ b/lbrynet/lbrynet_daemon/Daemon.py
@@ -441,7 +441,7 @@ class Daemon(AuthJSONRPCServer):
             'download_timeout': int,
             'search_timeout': float,
             'cache_time': int,
-            'share_debug_info': bool,
+            'share_usage_data': bool,
         }
 
         def can_update_key(settings, key, setting_type):
@@ -698,6 +698,7 @@ class Daemon(AuthJSONRPCServer):
                 d = reupload.reflect_stream(publisher.lbry_file)
                 d.addCallbacks(lambda _: log.info("Reflected new publication to lbry://%s", name),
                                log.exception)
+        self.analytics_manager.send_claim_action('publish')
         log.info("Success! Published to lbry://%s txid: %s nout: %d", name, claim_out['txid'],
                  claim_out['nout'])
         defer.returnValue(claim_out)
@@ -1710,6 +1711,7 @@ class Daemon(AuthJSONRPCServer):
             raise InsufficientFundsError()
 
         result = yield self.session.wallet.claim_new_channel(channel_name, amount)
+        self.analytics_manager.send_new_channel()
         log.info("Claimed a new channel! Result: %s", result)
         response = yield self._render_response(result)
         defer.returnValue(response)
@@ -1824,20 +1826,18 @@ class Daemon(AuthJSONRPCServer):
         # original format {'currency':{'address','amount'}}
         # add address to fee if unspecified {'version': ,'currency', 'address' , 'amount'}
         if 'fee' in metadata:
-            new_fee_dict = {}
             assert len(metadata['fee']) == 1, "Too many fees"
             currency, fee_dict = metadata['fee'].items()[0]
             if 'address' not in fee_dict:
                 address = yield self.session.wallet.get_new_address()
             else:
                 address = fee_dict['address']
-            new_fee_dict = {
+            metadata['fee'] = {
                 'version': '_0_0_1',
                 'currency': currency,
                 'address': address,
                 'amount': fee_dict['amount']
             }
-            metadata['fee'] = new_fee_dict
 
         log.info("Publish: %s", {
             'name': name,
@@ -1900,6 +1900,7 @@ class Daemon(AuthJSONRPCServer):
 
         try:
             abandon_claim_tx = yield self.session.wallet.abandon_claim(claim_id)
+            self.analytics_manager.send_claim_action('abandon')
             response = yield self._render_response(abandon_claim_tx)
         except BaseException as err:
             log.warning(err)
@@ -1913,10 +1914,9 @@ class Daemon(AuthJSONRPCServer):
     @AuthJSONRPCServer.auth_required
     def jsonrpc_abandon_name(self, **kwargs):
         """
-        DEPRECATED, use abandon_claim
+        DEPRECATED. Use `claim_abandon` instead
         """
-
-        return self.jsonrpc_abandon_claim(**kwargs)
+        return self.jsonrpc_claim_abandon(**kwargs)
 
     @AuthJSONRPCServer.auth_required
     def jsonrpc_support_claim(self, **kwargs):
@@ -1926,6 +1926,7 @@ class Daemon(AuthJSONRPCServer):
         return self.jsonrpc_claim_new_support(**kwargs)
 
     @AuthJSONRPCServer.auth_required
+    @defer.inlineCallbacks
     def jsonrpc_claim_new_support(self, name, claim_id, amount):
         """
         Support a name claim
@@ -1943,9 +1944,9 @@ class Daemon(AuthJSONRPCServer):
             }
         """
 
-        d = self.session.wallet.support_claim(name, claim_id, amount)
-        d.addCallback(lambda r: self._render_response(r))
-        return d
+        result = yield self.session.wallet.support_claim(name, claim_id, amount)
+        self.analytics_manager.send_claim_action('new_support')
+        defer.returnValue(result)
 
     # TODO: merge this into claim_list
     @AuthJSONRPCServer.auth_required
@@ -2203,6 +2204,7 @@ class Daemon(AuthJSONRPCServer):
         return d
 
     @AuthJSONRPCServer.auth_required
+    @defer.inlineCallbacks
     def jsonrpc_send_amount_to_address(self, amount, address):
         """
         Send credits to an address
@@ -2216,10 +2218,10 @@ class Daemon(AuthJSONRPCServer):
 
         reserved_points = self.session.wallet.reserve_points(address, amount)
         if reserved_points is None:
-            return defer.fail(InsufficientFundsError())
-        d = self.session.wallet.send_points_to_address(reserved_points, amount)
-        d.addCallback(lambda _: self._render_response(True))
-        return d
+            raise InsufficientFundsError()
+        yield self.session.wallet.send_points_to_address(reserved_points, amount)
+        self.analytics_manager.send_credits_sent()
+        defer.returnValue(True)
 
     def jsonrpc_get_block(self, **kwargs):
         """