From 8cf4db83d8cec25e8e1fe51292c34c4defb07db4 Mon Sep 17 00:00:00 2001 From: Daniel Mullings Date: Fri, 26 Nov 2021 06:03:51 +0000 Subject: [PATCH 1/2] CODE REFACTORING/COMMENTING, HANDLING EXCEPTIONS --- api_market_handler.py | 64 +++++++++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/api_market_handler.py b/api_market_handler.py index 7937a9c..241a46e 100644 --- a/api_market_handler.py +++ b/api_market_handler.py @@ -1,5 +1,8 @@ -import json #PYTHON STANDARD LIBRARY - https://docs.python.org/3/library/json.html -import urllib.error #URLLIB v3.9 - THIRD PARTY LIBRARY - https://github.com/urllib3/urllib3 +#PYTHON STANDARD LIBRARY - https://docs.python.org/3/library/json.html - USED TO READ, WRITE JSON FILES STORKING MARKET DATA FROM API +import json +#URLLIB 3.9 - THIRD PARTY LIBRARY - https://github.com/urllib3/urllib3 - USED TO CATCH AND HANDLE HTTP ERRORS/EXCEPTIONS +import urllib.error +#URLLIB 3.9 - THIRD PARTY LIBRARY - https://github.com/urllib3/urllib3 - USED TO REQUEST JSON DATA FROM API URL from urllib.request import * release_state = True @@ -8,27 +11,33 @@ api_key = "x-api-key=9w3MIVAGdu84n6Db" api_url = "https://tarkov-market.com/api/v1/" -#JSON OBJECT, FILE SCOPE, STORES MARKET DATA FROM API/OFFLINE JSON FILE BACKUP +#PYTHON DICTIONARY, FILE SCOPE, STORES MARKET DATA FROM API/OFFLINE JSON FILE BACKUP marketData = None -#RETRIEVES MARKET DATA FROM API AS TYPE JSON OBJECT -#RETURNS MARKET DATA AS TYPE JSON OBJECT +#RETRIEVES MARKET DATA FROM API AS TYPE JSON FILE +#RETURNS MARKET DATA AS TYPE PYTHON DICTIONARY def FetchOnlineMarketData(): try: + ''' + REFERENCE (LINE NUMBERS: 32, 33): + + ONLINE TUTORIAL - https://www.geeksforgeeks.org/how-to-read-a-json-response-from-a-link-in-python/ - HOW TO OPEN JSON FILE FROM API + YOUTUBE TUTORIAL - https://youtu.be/aj4L7U7alNU?t=159 - HOW TO OPEN JSON FILE AND PARSE TO PYTHON DICTIONARY + ''' + #STORES DATA RETURNED FROM API (JSON FILE) USING "urlopen" IN "apiJsonFile" - #LOADS & STORES JSON FILE (apiJsonFile) AS JSON OBJECT (online_marketData) + #LOADS & STORES JSON FILE (apiJsonFile) AS PYTHON DICTIONARY (online_marketData) print("NOTICE: ATTEMPTING TO CONNECT TO API. . .") apiJsonFile = urlopen(api_url + "items/all?&" + api_key) online_marketData = json.load(apiJsonFile) print("NOTICE: API CONNECTION SUCCESSFUL") - #SAVES JSON OBJECT (CONTAINING LIVE DATA) AS JSON FILE (FOR OFFLINE USE) SaveOnlineMarketData(online_marketData) print("\nRelease State = " + str(release_state) + "! API Connected, Market Data Up-To-Date\n") - #RETURNS JSON OBJECT, TO BE STORED IN JSON OBJECT IN FILE SCOPE + #RETURNS PYTHON DICTIONARY, TO BE STORED IN PYTHON DICTIONARY IN FILE SCOPE return online_marketData #HANDLES HTTP RELATED ERRORS, "aka. HTTP ERROR 249: TOO MANY REQUEST" @@ -38,18 +47,26 @@ def FetchOnlineMarketData(): return FetchOfflineMarketData() #RETRIEVES MARKET DATA FROM SAVED JSON FILE -#REUTRNS MARKET DATA AS JSON OBJECT +#REUTRNS MARKET DATA AS PYTHON DICTIONARY def FetchOfflineMarketData(): print("Release State = " + str(release_state) + "!, API Not Connected, Market Data Outdated\n") - #LOADS JSON FILE, RETURNS IT AS A JSON OBJECT TO BE STORED IN JSON OBJECT IN FILE SCOPE + #LOADS JSON FILE, RETURNS IT AS A PYTHON DICTIONARY TO BE STORED IN PYTHON DICTIONARY IN FILE SCOPE offlineMarketData_Json_File = open("offlineMarketData.json", encoding="utf-8") return json.load(offlineMarketData_Json_File) -#TAKES MARKET DATA FROM API AS TYPE JSON OBJECT -#SAVES JSON OBJECT AS JSON FILE (FOR USE WHEN API CONNECTION FAILS) +#TAKES MARKET DATA FROM API AS TYPE PYTHON DICTIONARY +#SAVES PYTHON DICTIONARY AS JSON FILE (FOR USE WHEN API CONNECTION FAILS) def SaveOnlineMarketData(updatedMarketData): try: + ''' + REFERENCE (LINE NUMBERS: 70, 71): + + ONLINE TUTORIAL - https://stackoverflow.com/questions/12309269/how-do-i-write-json-data-to-a-file - HOW TO SAVE PYTHON DICTIONARY AS JSON FILE + MODIFIED CODE: + with open('data.json', 'w', encoding='utf-8') as f: + json.dump(data, f, ensure_ascii=False, indent=4) + ''' offlineMarketData_Json_File = open("offlineMarketData.json", "w", encoding="utf-8") json.dump(updatedMarketData, offlineMarketData_Json_File, ensure_ascii = False) print("NOTICE: OFFLINE MARKET DATA UPDATED & SAVED") @@ -68,17 +85,30 @@ else: #TAKES ITEM NAME AS TYPE str AND A USERS MESSAGE AS TYPE str #RETURNS WETHER THE ITEM NAME IS IN THE USER MESSAGE AS TYPE bool -def marketItem_In_userMessage(p_marketItemShortName, p_userMessage): - if (p_marketItemShortName.replace("-", "").replace(" ", "").lower() in p_userMessage.replace("-", "").replace(" ", "").lower()): +def MarketItem_In_userMessage(p_marketItemShortName, p_userMessage): + if (p_marketItemShortName.replace("-", "").lower() in p_userMessage.replace("-", "").lower()): return True return False +#TAKES ITEM NAME AS TYPE str +#RETURNS WETHER THE ITEM TAG CORRESPONDS TO PREVALIDATED TAGS (PROGRAM ONLY HANDLES CERTAIN ITEMS) AS TYPE bool +def MarketItemTagValid(p_marketItemShortName): + validTags = ["Weapon", "Ammo", "Armor_vests"] + for marketItem in marketData: + if (p_marketItemShortName == marketItem["shortName"]): + for tag in validTags: + if (tag in marketItem["tags"]): + return True + return False + + #TAKES A USERS MESSAGES AS TYPE str #RETURNS WETHER AN ITEM NAME (STORED IN THE API DATA) IS PRESENT IN THE USERS MESSAGE AS TYPE bool def isItemNamePresent(p_userMessage): for marketItem in marketData: - if (marketItem_In_userMessage(marketItem["shortName"], p_userMessage)): - return True + if (MarketItem_In_userMessage(marketItem["shortName"], p_userMessage)): + if (MarketItemTagValid(marketItem["shortName"])): + return True #ITEM NAME NOT PRESENT return False @@ -87,7 +117,7 @@ def isItemNamePresent(p_userMessage): #RETURNS ITEM NAME (AS IT APPEARS IN API DATA) AS TYPE str OR bool = False def getItemName(p_userMessage): for marketItem in marketData: - if (marketItem_In_userMessage(marketItem["shortName"], p_userMessage)): + if (MarketItem_In_userMessage(marketItem["shortName"], p_userMessage)): return marketItem["shortName"] #ITEM NAME NOT PRESENT From d2f3588b672dddfd58829b1eec3b840f4aff4e0f Mon Sep 17 00:00:00 2001 From: "Daniel Mullings (mullingsd)" Date: Fri, 26 Nov 2021 06:29:18 +0000 Subject: [PATCH 2/2] Update api_market_handler.py --- api_market_handler.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api_market_handler.py b/api_market_handler.py index 241a46e..a27beb7 100644 --- a/api_market_handler.py +++ b/api_market_handler.py @@ -47,7 +47,7 @@ def FetchOnlineMarketData(): return FetchOfflineMarketData() #RETRIEVES MARKET DATA FROM SAVED JSON FILE -#REUTRNS MARKET DATA AS PYTHON DICTIONARY +#RETURNS MARKET DATA AS PYTHON DICTIONARY def FetchOfflineMarketData(): print("Release State = " + str(release_state) + "!, API Not Connected, Market Data Outdated\n") @@ -147,4 +147,4 @@ def getItemTraderName(p_itemName): return marketItem["traderName"] #ITEM NAME NOT FOUND - return False \ No newline at end of file + return False