From b7acf5a84d5d8d505ba4b5483b05fabcef1e33ce Mon Sep 17 00:00:00 2001 From: Mark Veidemanis Date: Thu, 27 Jan 2022 12:08:26 +0000 Subject: [PATCH] Improve Agora error handling --- handler/agora.py | 82 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 15 deletions(-) diff --git a/handler/agora.py b/handler/agora.py index 7393894..9a4218d 100644 --- a/handler/agora.py +++ b/handler/agora.py @@ -14,6 +14,8 @@ from datetime import datetime # Project imports from settings import settings +log = Logger("agora.global") + def handle_exceptions(func): def inner_function(*args, **kwargs): @@ -21,10 +23,13 @@ def handle_exceptions(func): rtrn = func(*args, **kwargs) except (ReadTimeout, ReadError): return False - if "success" in rtrn: - if "message" in rtrn: - if not rtrn["success"] and rtrn["message"] == "API ERROR": - return False + if isinstance(rtrn, dict): + if "success" in rtrn: + if "message" in rtrn: + if not rtrn["success"] and rtrn["message"] == "API ERROR": + log.error("API error: {code}", code=rtrn["response"]["error"]["error_code"]) + return False + return rtrn return inner_function @@ -69,7 +74,7 @@ class Agora(object): @handle_exceptions def wrap_dashboard(self): dash = self.agora.dashboard_seller() - if not dash: + if dash is False: return False dash_tmp = {} if "data" not in dash["response"].keys(): @@ -100,8 +105,8 @@ class Agora(object): """ dash = self.wrap_dashboard() rtrn = [] - if not dash.items(): - return + if dash is False: + return False for contact_id, contact in dash.items(): reference = self.tx.tx_to_ref(contact_id) buyer = contact["data"]["buyer"]["username"] @@ -168,6 +173,8 @@ class Agora(object): :rtype: list or bool """ dash = self.agora.dashboard_seller() + if dash is False: + return False dash_tmp = [] if "data" not in dash["response"]: self.log.error("Data not in dashboard response: {content}", content=dash) @@ -200,6 +207,8 @@ class Agora(object): """ messages_tmp = {} messages = self.agora.recent_messages() + if messages is False: + return False if not messages["success"]: return False if "data" not in messages["response"]: @@ -241,6 +250,8 @@ class Agora(object): @handle_exceptions def enum_ad_ids(self, page=0): ads = self.agora._api_call(api_method="ads", query_values={"page": page}) + if ads is False: + return False ads_total = [] if not ads["success"]: return False @@ -249,13 +260,21 @@ class Agora(object): if "pagination" in ads["response"]: if "next" in ads["response"]["pagination"]: page += 1 - for ad in self.enum_ad_ids(page): + ads_iter = self.enum_ad_ids(page) + if ads_iter is None: + return False + if ads_iter is False: + return False + for ad in ads_iter: ads_total.append(ad) return ads_total @handle_exceptions def enum_ads(self, page=0): ads = self.agora._api_call(api_method="ads", query_values={"page": page}) + if ads is False: + print("enum ads is false for", page) + return False ads_total = [] if not ads["success"]: return False @@ -264,7 +283,15 @@ class Agora(object): if "pagination" in ads["response"]: if "next" in ads["response"]["pagination"]: page += 1 - for ad in self.enum_ads(page): + ads_iter = self.enum_ads(page) + print("ADS ITER", ads_iter) + if ads_iter is None: + print("enum ads iter is none for", page) + return False + if ads_iter is False: + print("enum ads iter is false for", page) + return False + for ad in ads_iter: ads_total.append([ad[0], ad[1], ad[2], ad[3]]) return ads_total @@ -289,7 +316,8 @@ class Agora(object): if coin == "bitcoin": coin = "bitcoins" ads = self.agora._api_call(api_method=f"buy-{coin}-online/{currency}/REVOLUT", query_values={"page": page}) - if not ads["success"]: + if ads is False: + print("public ads is false for", coin, currency) return False for ad in ads["response"]["data"]["ad_list"]: if ad["data"]["online_provider"] == "REVOLUT": @@ -301,7 +329,14 @@ class Agora(object): if "pagination" in ads["response"]: if "next" in ads["response"]["pagination"]: page += 1 - for ad in self.enum_public_ads(coin, currency, page): + ads_iter = self.enum_public_ads(coin, currency, page) + if ads_iter is None: + print("public ads iter is false for", coin, currency, page) + return False + if ads_iter is False: + print("public ads iter is none for", coin, currency, page) + return False + for ad in ads_iter: yield [ad[0], ad[1], ad[2]] def wrap_public_ads(self, asset, currency, rates=None): @@ -312,7 +347,11 @@ class Agora(object): coin = "monero" elif asset == "BTC": coin = "bitcoin" - ads = list(self.enum_public_ads(coin, currency.upper())) + ads_obj = self.enum_public_ads(coin, currency.upper()) + if ads_obj is False: + print("wrap public ads is false for", asset, currency) + return False + ads = list(ads_obj) if not rates: # Set the price based on the asset base_currency_price = self.cg.get_price(ids=coin, vs_currencies=currency)[coin][currency.lower()] @@ -333,6 +372,12 @@ class Agora(object): @handle_exceptions def update_prices(self, xmr=True, btc=True): our_ads = self.enum_ads() + if our_ads is None: + print("our ads is none for", xmr, btc) + return False + if our_ads is False: + print("our ads is false for", xmr, btc) + return False currencies = [x[3].lower() for x in our_ads] public_ad_dict_xmr = {} public_ad_dict_btc = {} @@ -343,8 +388,14 @@ class Agora(object): rates_btc = rates_crypto["bitcoin"][currency] if xmr: public_ad_dict_xmr[currency] = self.wrap_public_ads("XMR", currency, rates=rates_xmr) + if public_ad_dict_xmr[currency] is False: + print("public ad dict xmr is false for", currency) + return False if btc: public_ad_dict_btc[currency] = self.wrap_public_ads("BTC", currency, rates=rates_btc) + if public_ad_dict_btc[currency] is False: + print("public ad dict btc is false for", currency) + return False except KeyError: self.log.error("Error getting public ads for currency {currency}", currency=currency) continue @@ -370,7 +421,8 @@ class Agora(object): # Get all of our ads our_ads_list = [ad for ad in public_ads if ad[1] == settings.Agora.Username] if not len(our_ads_list) == 1: - self.log.error("More ads than expected: {ads}", ads=our_ads_list) + if not len(set([x[3] for x in our_ads_list])) == 1: + self.log.error("Our ads have different margins: {ads}", ads=our_ads_list) # Get one from the list, they're probably the same, if not we will deal with the other # ones in a later pass @@ -464,7 +516,7 @@ class Agora(object): """ ads = self.enum_ad_ids() return_ids = [] - if not ads: + if ads is False: return False for ad_id in ads: rtrn = self.agora.ad_delete(ad_id) @@ -580,7 +632,7 @@ class Agora(object): for asset in loads(settings.Agora.AssetList): for currency, countrycode in loads(settings.Agora.DistList): rtrn = self.create_ad(asset, countrycode, currency) - if not rtrn: + if rtrn is False: return False yield rtrn