diff --git a/README.md b/README.md index b37fc8f..df0745b 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,11 @@ A basic wrapper for the [Brawl Stars API](https://developer.brawlstars.com/#/). ## Features - * Easy to use with OOP design + * Easy to use with OOP design and Context Manager * Get a player's profile and battle log by just a tag * Get a club and all its member - * Get the top 200 clubs , players, or a specific brawler in the world or a region - * Get Information about a map, event, brawler!!! + * Get the top 200 clubs, players, or a specific brawler in the world or a region + * Get Information about a map, event, brawler! ## Installation To install the library run the following command: @@ -22,7 +22,7 @@ pip install brawlpy ``` To install the development version run the following command: ``` -pip install git+https://github.com/PyStarr/BrawlPy +pip install git+https://github.com/BrandoDev/BrawlPy ``` ## Example @@ -34,7 +34,8 @@ import asyncio client = brawlpy.Client('your_api_key_here') # Enter your api key here async def main(): - player = await client.get_player("JP20RUR2") + async with client: + player = await client.get_player("JP20RUR2") print(player) @@ -51,7 +52,8 @@ import asyncio client = brawlpy.Client('your_api_key_here') # Enter your api key here async def brawlPy(): - club = await client.get_club("PVQ0RP90") + async with client: + club = await client.get_club("PVQ0RP90") print(club) diff --git a/brawlpy/API.py b/brawlpy/API.py index af099b4..e409a24 100644 --- a/brawlpy/API.py +++ b/brawlpy/API.py @@ -1,12 +1,9 @@ -from .errors import * - class API: - def __init__(self,version=1) -> None: - - self.BASE = 'https://api.brawlstars.com/v{}'.format(version) + def __init__(self, version=1) -> None: + self.BASE = "https://api.brawlstars.com/v{}".format(version) self.PLAYER = self.BASE + "/players/{playerTag}" self.CLUB = self.BASE + "/clubs/{clubTag}" self.RANKINGS = self.BASE + "/rankings/{countryCode}" self.BRAWLERS = self.BASE + "/brawlers" self.BRAWLER = self.BASE + "/brawlers/{id}" - self.EVENTS = self.BASE + "/events/rotation" \ No newline at end of file + self.EVENTS = self.BASE + "/events/rotation" diff --git a/brawlpy/__init__.py b/brawlpy/__init__.py index 6cd2dd9..00f34b1 100644 --- a/brawlpy/__init__.py +++ b/brawlpy/__init__.py @@ -8,10 +8,40 @@ from .API import API from .main import Client -from .objects import * +from .objects import ( + Player, + Club, + ClubMember, + ClubRanking, + PlayerRanking, + BrawlerRanking, + Event, + Brawler, + PlayerBrawler, + Gadget, + StarPower, + Gear, +) -__title__ = 'brawlpy' -__author__ = 'PyStarr' -__license__ = 'MIT' -__copyright__ = 'Copyright 2022-Present PyStarr' -__version__ = '1.2.5' +__all__ = [ + "API", + "Client", + "Player", + "Club", + "ClubMember", + "ClubRanking", + "PlayerRanking", + "BrawlerRanking", + "Event", + "Brawler", + "PlayerBrawler", + "Gadget", + "StarPower", + "Gear", +] + +__title__ = "brawlpy" +__author__ = "PyStarr" +__license__ = "MIT" +__copyright__ = "Copyright 2022-Present PyStarr" +__version__ = "1.3.0" diff --git a/brawlpy/errors.py b/brawlpy/errors.py index 8c440d6..1bbdfa5 100644 --- a/brawlpy/errors.py +++ b/brawlpy/errors.py @@ -1,12 +1,13 @@ class Errors(Exception): """The Base Class for all errors""" - def __init__(self,code,message): + def __init__(self, code, message): pass def __str__(self): return self.message + class Forbidden(Errors): """Raised If you API key is invalid""" @@ -16,63 +17,71 @@ def __init__(self, code, url, message): self.message = message super().__init__(self.code, self.message) + class TagNotFoundError(Errors): """Raised when a invalid player or club tag is passed""" def __init__(self, code, **kwargs): self.code = code self.message = "An Invalid Tag has been passed!" - self.reason = kwargs.pop('reason',None) - self.invalid_characters = kwargs.pop('invalid_characters', []) + self.reason = kwargs.pop("reason", None) + self.invalid_characters = kwargs.pop("invalid_characters", []) if self.reason: - self.message += ''.join(f"\n Reason : {self.reason}") + self.message += "".join(f"\n Reason : {self.reason}") elif self.invalid_characters: - self.message += ''.join(f"\n Invalid characters : {self.invalid_characters}") + self.message += "".join( + f"\n Invalid characters : {self.invalid_characters}" + ) super().__init__(self.code, self.message) + class RateLimitError(Errors): """Raised when the rate limit is reached.""" def __init__(self, code, url): self.code = code self.url = url - self.message = 'The rate limit has been reached.' + self.message = "The rate limit has been reached." super().__init__(self.code, self.message) + class UnexpectedError(Errors): """Raised if an unknown error has occured.""" def __init__(self, url, code, text): self.code = code self.url = url - self.message = f'An unexpected error has occured.\n{text}' + self.message = f"An unexpected error has occured.\n{text}" super().__init__(self.code, self.message) + class ServerError(Errors): """Raised if the API is down.""" def __init__(self, code, url): self.code = code self.url = url - self.message = 'The API is down. Please be patient and try again later.' + self.message = "The API is down. Please be patient and try again later." super().__init__(self.code, self.message) + class BrawlerNotFound(Errors): """Raised when Invalid brawlerID has been passed""" - def __init__(self,code,id = None): + def __init__(self, code, id=None): self.code = code if id: - self.message = 'Invalid ID passed! {}'.format(id) + self.message = "Invalid ID passed! {}".format(id) super().__init__(self.code, self.message) + class CountryNotFound(Errors): """Raised when Invalid countryCode has been passed""" - def __init__(self,code,countryCode = None): + def __init__(self, code, countryCode=None): self.code = code if id: - self.message = 'Invalid countryCode passed! {}'.format(countryCode) + self.message = "Invalid countryCode passed! {}".format(countryCode) - super().__init__(self.code, self.message) \ No newline at end of file + super().__init__(self.code, self.message) diff --git a/brawlpy/icons.py b/brawlpy/icons.py index fbca8cd..6db9cd4 100644 --- a/brawlpy/icons.py +++ b/brawlpy/icons.py @@ -1,56 +1,56 @@ brawlers = { - "16000000" : "https://drive.google.com/uc?export=view&id=1dAvFR908593LzntFYVsJXr_um4qiFRwz", - "16000001" : "https://drive.google.com/uc?export=view&id=1xHmMCxksAd3KWuifEpGKMVzLugYhmFvD", - "16000002" : "https://drive.google.com/uc?export=view&id=1SOMlveroyDJEXULdJ8_WkEKWtDp74kxa", - "16000003" : "https://drive.google.com/uc?export=view&id=10e3izEMpLRq5S_1g9REZZYFv6a_Lszg3", - "16000004" : "https://drive.google.com/uc?export=view&id=1WqsVnqCp5BhMSaXEAdVJMFhodl4x1c6S", - "16000005" : "https://drive.google.com/uc?export=view&id=1aW9_LnZYGbfIIAEMeRD-OUBUJ2o8zdCy", - "16000006" : "https://drive.google.com/uc?export=view&id=14Ln4niaVoZQS5U-kxHbjb_M3FeJQ4fcv", - "16000007" : "https://drive.google.com/uc?export=view&id=1i_XawzubrMsTwibnCleEGgILkZWJLPeJ", - "16000008" : "https://drive.google.com/uc?export=view&id=1rob9jd_cMT1Dj_qt7RRjWegwGQca1AKX", - "16000009" : "https://drive.google.com/uc?export=view&id=18ygqoJ2FKeKY5EqmhcBRTG5UQxry2qN_", - "16000010" : "https://drive.google.com/uc?export=view&id=17xoy5Aw4dpJJID97eKbcX_IcaG6OA9I7", - "16000011" : "https://drive.google.com/uc?export=view&id=1H0MZlrGvntFduEcqaSHm0TYgx5DE-Wlc", - "16000012" : "https://drive.google.com/uc?export=view&id=16tLAAVvb_KwhrEOqPRsFTG01D_E8lKye", - "16000013" : "https://drive.google.com/uc?export=view&id=1aQlEFbymNtxn0nkDP2GoZFDiKsMR9D4f", - "16000014" : "https://drive.google.com/uc?export=view&id=1Fkct5iCvdjMWi-g3KwdCck1_OXs3sHlC", - "16000015" : "https://drive.google.com/uc?export=view&id=15HiIxoF9194HOIFuxqUTQ-h5-YQSEoVG", - "16000016" : "https://drive.google.com/uc?export=view&id=1GeRdbB_T6QH4q77V5DZq_vkXnvfkZpYk", - "16000017" : "https://drive.google.com/uc?export=view&id=1LjGfus6pXt9A2hYEeOfBIcrcTSgiAN1_", - "16000018" : "https://drive.google.com/uc?export=view&id=1UTB7mep0PrUT9p1MsgW25YhNjda5gsg0", - "16000019" : "https://drive.google.com/uc?export=view&id=1EWAOzE0kNc3cw3DH7RfM-_6Jz-D9ALoo", - "16000020" : "https://drive.google.com/uc?export=view&id=1nQVBdJb6PkdwaV566CGM21uA7ttJDhvY", - "16000021" : "https://drive.google.com/uc?export=view&id=1mbICcY_h1YdUxvoSZIToS14JUaZvbE2l", - "16000022" : "https://drive.google.com/uc?export=view&id=1udUF9M8ino0A3ZIGw8ptSaZC0lh9LTWs", - "16000023" : "https://drive.google.com/uc?export=view&id=1Q2-FHGHUoNfmovn1ZObRjr_i6KJh610Q", - "16000024" : "https://drive.google.com/uc?export=view&id=1qfWtCalsrYzQckKFOIBvNY7nDKO8IuM9", - "16000025" : "https://drive.google.com/uc?export=view&id=1YNQMCne024WiNwklnhGsYXizuli7uoMl", - "16000026" : "https://drive.google.com/uc?export=view&id=1X0Fp62TTlIQ6PX8gipq0XuN9MCAdFlpa", - "16000027" : "https://drive.google.com/uc?export=view&id=1xLRF0bCblZkukyfM2h0p_N6NcPNOY77a", - "16000028" : "https://drive.google.com/uc?export=view&id=1Hzk5vLYHSb0TVGf0LjrX0G2TRyQqaIvc", - "16000029" : "https://drive.google.com/uc?export=view&id=14X3DhdU2XzzFU3sxOK2mIyfuqeuGIdO5", - "16000030" : "https://drive.google.com/uc?export=view&id=1qv2PjG2e-AU2Qhe0IGm7M7F0-urKN998", - "16000031" : "https://drive.google.com/uc?export=view&id=1U3neaBogNuy9oGY9EJqJ6wWnG_h4NRLk", - "16000032" : "https://drive.google.com/uc?export=view&id=1XjQA6HwUkQuJMLNKyT2Drcu8xtpKYz6m", - "16000034" : "https://drive.google.com/uc?export=view&id=1xsmR6sM71s7wwZThypyESVjvjBrN4c50", - "16000035" : "https://drive.google.com/uc?export=view&id=15NspTtmz6xrfr7lY-ewl7-686s64Xpaf", - "16000036" : "https://drive.google.com/uc?export=view&id=1xLvjeONLrU-wOUhxvv_FHZAqFCf03gtk", - "16000037" : "https://drive.google.com/uc?export=view&id=1rVLeFZpVz5Mi2-1d6smUHXVSvvWJzjFU", - "16000038" : "https://drive.google.com/uc?export=view&id=16jHS2sqJlDjy0byy4Rr3LZsWQJdfMHqJ", - "16000039" : "https://drive.google.com/uc?export=view&id=1K7Ah2vU0BbEn1AlYeMaynqUXdHxWNfgC", - "16000040" : "https://drive.google.com/uc?export=view&id=1V9rczuRWlZWcM-lTkNmQiPlGoAo-TkZK", - "16000041" : "https://drive.google.com/uc?export=view&id=1PRKXASBnSw1Z6Dg9UcVn9JhLq1guZQf6", - "16000042" : "https://drive.google.com/uc?export=view&id=1WP3X8pH_THrfXarX1gWUxyivV2h3uz3v", - "16000043" : "https://drive.google.com/uc?export=view&id=1-AA3rab9yKtXvtiU1HW3S-vwLNjPZofO", - "16000044" : "https://drive.google.com/uc?export=view&id=1ovyRjUNZGczg2KNIdvf-CkSjnMLdcgpL", - "16000045" : "https://drive.google.com/uc?export=view&id=12VBQqRTEDydB6DvUHTt6EZQAoci2pGe6", - "16000046" : "https://drive.google.com/uc?export=view&id=1idOjVsdgILT4ZFZ1Of7veixGNQYLcoEJ", - "16000047" : "https://drive.google.com/uc?export=view&id=1O6wdsVcUsB8-sLcfodAV5xRmwVaVo9eD", - "16000048" : "https://drive.google.com/uc?export=view&id=14Y-4BYVo2l2sn_3NEji_48FOCLNbeOKk", - "16000049" : "https://drive.google.com/uc?export=view&id=1EBqNyrgq2-RPVYIHXTgWjOfCevsCzGfA", - "16000050" : "https://drive.google.com/uc?export=view&id=1AQ32wTsnKM564EnGa1wEZ6n7dNnQ_L0A", - "16000051" : "https://drive.google.com/uc?export=view&id=1XbbWDTLTs5Ms3ogqLpKyOqfEwg6k7ED0", - "16000052" : "https://drive.google.com/uc?export=view&id=18dg1sJLDZc-pTBaKj4HTsSDkxypHfqNQ", - "16000053" : "https://drive.google.com/uc?export=view&id=1lQ_mZd65ctx6YuhstrUBclptIvoAS6yl", - "16000054" : "https://drive.google.com/uc?export=view&id=1Ujkutn8ovAs_9uEu9F590jhwNGCZRK-_" + "16000000": "https://drive.google.com/uc?export=view&id=1dAvFR908593LzntFYVsJXr_um4qiFRwz", + "16000001": "https://drive.google.com/uc?export=view&id=1xHmMCxksAd3KWuifEpGKMVzLugYhmFvD", + "16000002": "https://drive.google.com/uc?export=view&id=1SOMlveroyDJEXULdJ8_WkEKWtDp74kxa", + "16000003": "https://drive.google.com/uc?export=view&id=10e3izEMpLRq5S_1g9REZZYFv6a_Lszg3", + "16000004": "https://drive.google.com/uc?export=view&id=1WqsVnqCp5BhMSaXEAdVJMFhodl4x1c6S", + "16000005": "https://drive.google.com/uc?export=view&id=1aW9_LnZYGbfIIAEMeRD-OUBUJ2o8zdCy", + "16000006": "https://drive.google.com/uc?export=view&id=14Ln4niaVoZQS5U-kxHbjb_M3FeJQ4fcv", + "16000007": "https://drive.google.com/uc?export=view&id=1i_XawzubrMsTwibnCleEGgILkZWJLPeJ", + "16000008": "https://drive.google.com/uc?export=view&id=1rob9jd_cMT1Dj_qt7RRjWegwGQca1AKX", + "16000009": "https://drive.google.com/uc?export=view&id=18ygqoJ2FKeKY5EqmhcBRTG5UQxry2qN_", + "16000010": "https://drive.google.com/uc?export=view&id=17xoy5Aw4dpJJID97eKbcX_IcaG6OA9I7", + "16000011": "https://drive.google.com/uc?export=view&id=1H0MZlrGvntFduEcqaSHm0TYgx5DE-Wlc", + "16000012": "https://drive.google.com/uc?export=view&id=16tLAAVvb_KwhrEOqPRsFTG01D_E8lKye", + "16000013": "https://drive.google.com/uc?export=view&id=1aQlEFbymNtxn0nkDP2GoZFDiKsMR9D4f", + "16000014": "https://drive.google.com/uc?export=view&id=1Fkct5iCvdjMWi-g3KwdCck1_OXs3sHlC", + "16000015": "https://drive.google.com/uc?export=view&id=15HiIxoF9194HOIFuxqUTQ-h5-YQSEoVG", + "16000016": "https://drive.google.com/uc?export=view&id=1GeRdbB_T6QH4q77V5DZq_vkXnvfkZpYk", + "16000017": "https://drive.google.com/uc?export=view&id=1LjGfus6pXt9A2hYEeOfBIcrcTSgiAN1_", + "16000018": "https://drive.google.com/uc?export=view&id=1UTB7mep0PrUT9p1MsgW25YhNjda5gsg0", + "16000019": "https://drive.google.com/uc?export=view&id=1EWAOzE0kNc3cw3DH7RfM-_6Jz-D9ALoo", + "16000020": "https://drive.google.com/uc?export=view&id=1nQVBdJb6PkdwaV566CGM21uA7ttJDhvY", + "16000021": "https://drive.google.com/uc?export=view&id=1mbICcY_h1YdUxvoSZIToS14JUaZvbE2l", + "16000022": "https://drive.google.com/uc?export=view&id=1udUF9M8ino0A3ZIGw8ptSaZC0lh9LTWs", + "16000023": "https://drive.google.com/uc?export=view&id=1Q2-FHGHUoNfmovn1ZObRjr_i6KJh610Q", + "16000024": "https://drive.google.com/uc?export=view&id=1qfWtCalsrYzQckKFOIBvNY7nDKO8IuM9", + "16000025": "https://drive.google.com/uc?export=view&id=1YNQMCne024WiNwklnhGsYXizuli7uoMl", + "16000026": "https://drive.google.com/uc?export=view&id=1X0Fp62TTlIQ6PX8gipq0XuN9MCAdFlpa", + "16000027": "https://drive.google.com/uc?export=view&id=1xLRF0bCblZkukyfM2h0p_N6NcPNOY77a", + "16000028": "https://drive.google.com/uc?export=view&id=1Hzk5vLYHSb0TVGf0LjrX0G2TRyQqaIvc", + "16000029": "https://drive.google.com/uc?export=view&id=14X3DhdU2XzzFU3sxOK2mIyfuqeuGIdO5", + "16000030": "https://drive.google.com/uc?export=view&id=1qv2PjG2e-AU2Qhe0IGm7M7F0-urKN998", + "16000031": "https://drive.google.com/uc?export=view&id=1U3neaBogNuy9oGY9EJqJ6wWnG_h4NRLk", + "16000032": "https://drive.google.com/uc?export=view&id=1XjQA6HwUkQuJMLNKyT2Drcu8xtpKYz6m", + "16000034": "https://drive.google.com/uc?export=view&id=1xsmR6sM71s7wwZThypyESVjvjBrN4c50", + "16000035": "https://drive.google.com/uc?export=view&id=15NspTtmz6xrfr7lY-ewl7-686s64Xpaf", + "16000036": "https://drive.google.com/uc?export=view&id=1xLvjeONLrU-wOUhxvv_FHZAqFCf03gtk", + "16000037": "https://drive.google.com/uc?export=view&id=1rVLeFZpVz5Mi2-1d6smUHXVSvvWJzjFU", + "16000038": "https://drive.google.com/uc?export=view&id=16jHS2sqJlDjy0byy4Rr3LZsWQJdfMHqJ", + "16000039": "https://drive.google.com/uc?export=view&id=1K7Ah2vU0BbEn1AlYeMaynqUXdHxWNfgC", + "16000040": "https://drive.google.com/uc?export=view&id=1V9rczuRWlZWcM-lTkNmQiPlGoAo-TkZK", + "16000041": "https://drive.google.com/uc?export=view&id=1PRKXASBnSw1Z6Dg9UcVn9JhLq1guZQf6", + "16000042": "https://drive.google.com/uc?export=view&id=1WP3X8pH_THrfXarX1gWUxyivV2h3uz3v", + "16000043": "https://drive.google.com/uc?export=view&id=1-AA3rab9yKtXvtiU1HW3S-vwLNjPZofO", + "16000044": "https://drive.google.com/uc?export=view&id=1ovyRjUNZGczg2KNIdvf-CkSjnMLdcgpL", + "16000045": "https://drive.google.com/uc?export=view&id=12VBQqRTEDydB6DvUHTt6EZQAoci2pGe6", + "16000046": "https://drive.google.com/uc?export=view&id=1idOjVsdgILT4ZFZ1Of7veixGNQYLcoEJ", + "16000047": "https://drive.google.com/uc?export=view&id=1O6wdsVcUsB8-sLcfodAV5xRmwVaVo9eD", + "16000048": "https://drive.google.com/uc?export=view&id=14Y-4BYVo2l2sn_3NEji_48FOCLNbeOKk", + "16000049": "https://drive.google.com/uc?export=view&id=1EBqNyrgq2-RPVYIHXTgWjOfCevsCzGfA", + "16000050": "https://drive.google.com/uc?export=view&id=1AQ32wTsnKM564EnGa1wEZ6n7dNnQ_L0A", + "16000051": "https://drive.google.com/uc?export=view&id=1XbbWDTLTs5Ms3ogqLpKyOqfEwg6k7ED0", + "16000052": "https://drive.google.com/uc?export=view&id=18dg1sJLDZc-pTBaKj4HTsSDkxypHfqNQ", + "16000053": "https://drive.google.com/uc?export=view&id=1lQ_mZd65ctx6YuhstrUBclptIvoAS6yl", + "16000054": "https://drive.google.com/uc?export=view&id=1Ujkutn8ovAs_9uEu9F590jhwNGCZRK-_", } diff --git a/brawlpy/main.py b/brawlpy/main.py index 1008aa6..77c3bfd 100644 --- a/brawlpy/main.py +++ b/brawlpy/main.py @@ -1,130 +1,206 @@ from xml.dom import NotFoundErr from .API import API -from .errors import * -from .utils import * +from .errors import ( + Forbidden, + TagNotFoundError, + RateLimitError, + UnexpectedError, + ServerError, + BrawlerNotFound, + CountryNotFound, +) +from .utils import checkTag import aiohttp -import asyncio -import json -from .objects import * +from .objects import ( + Player, + Club, + ClubMember, + ClubRanking, + PlayerRanking, + BrawlerRanking, + Event, + Brawler, + PlayerBrawler, + Gadget, + StarPower, + Gear, +) -class Client: - def __init__(self,token): +class Client: + def __init__(self, token): self.TOKEN = token - self.loop = asyncio.get_event_loop() self.api = API() - self.headers = { - 'Authorization': 'Bearer {}'.format(token) - } + self.headers = {"Authorization": f"Bearer {token}"} + self.session = None + + async def initialize(self): + if self.session is None or self.session.closed: + self.session = aiohttp.ClientSession(headers=self.headers) + return self + + async def close(self): + if self.session: + await self.session.close() - self.session = aiohttp.ClientSession(loop=self.loop,headers=self.headers) + async def __aenter__(self): + await self.initialize() + return self - async def request(self,url): - async with self.session.get(url=url) as resp: + async def __aexit__(self, exc_type, exc, tb): + await self.close() + + async def request(self, url, method="GET", **kwargs): + if self.session is None: + raise RuntimeError( + "Session not initialized. Call await client.initialize()" + ) + + async with self.session.request(method, url, **kwargs) as resp: status = resp.status - data = await resp.json() - + try: + data = await resp.json() + except aiohttp.ContentTypeError: + data = await resp.text() return data, status - async def get_player(self,tag): + async def get_player(self, tag): """Get a player by tag""" Tag = checkTag(tag) - + url = self.api.PLAYER.format(playerTag=Tag) player, status = await self.request(url) if 300 > status >= 200: - c = player['club'] + c = player["club"] if len(c) < 1: cl = None else: - - cl = await self.get_club(c['tag']) - - brs = player['brawlers'] + cl = await self.get_club(c["tag"]) + + brs = player["brawlers"] brrs = [] for each in brs: grs = [] srs = [] gears = [] - for i in each['gadgets']: - gr = Gadget(i['name'],i['id']) + for i in each["gadgets"]: + gr = Gadget(i["name"], i["id"]) grs.append(gr) - for i in each['starPowers']: - sr = StarPower(i['name'],i['id']) + for i in each["starPowers"]: + sr = StarPower(i["name"], i["id"]) srs.append(sr) - for i in each['gears']: - gear = Gear(i['name'],i['id'],i['level']) + for i in each["gears"]: + gear = Gear(i["name"], i["id"], i["level"]) gears.append(gear) - br = PlayerBrawler(each['name'],each['id'],each['power'],each['rank'],each['trophies'],each['highestTrophies'],grs,gears,srs) + br = PlayerBrawler( + each["name"], + each["id"], + each["power"], + each["rank"], + each["trophies"], + each["highestTrophies"], + grs, + gears, + srs, + ) brrs.append(br) - battleLog = await self.get_battle_log(tag) - - Pl = Player(player['name'],player['tag'],player['nameColor'],player['icon']['id'],player['trophies'],player['expLevel'],player['expPoints'],cl,player['highestTrophies'],player['soloVictories'],player['duoVictories'],player['3vs3Victories'],player['bestRoboRumbleTime'],player['bestTimeAsBigBrawler'],brrs,battleLog) + Pl = Player( + player["name"], + player["tag"], + player["icon"]["id"], + player["trophies"], + player["expLevel"], + player["expPoints"], + cl, + player["highestTrophies"], + player["soloVictories"], + player["duoVictories"], + player["3vs3Victories"], + player["bestRoboRumbleTime"], + player["bestTimeAsBigBrawler"], + brrs, + ) return Pl elif status == 403: - raise Forbidden(status, url, player['message']) + raise Forbidden(status, url, player["message"]) elif status == 404: raise TagNotFoundError(status) elif status == 429: raise RateLimitError(status, url) elif status == 500: - raise UnexpectedError(status, url) + raise UnexpectedError(status, url, "") elif status == 503: raise ServerError(status, url) - async def get_battle_log(self,tag): + async def get_battle_log(self, tag): """Get a Player's battle log by there tag""" Tag = checkTag(tag) - + url = self.api.PLAYER.format(playerTag=Tag) + "/battlelog" log, status = await self.request(url) if 300 > status >= 200: - return log['items'] + return log["items"] elif status == 403: - raise Forbidden(status, url, log['message']) + raise Forbidden(status, url, log["message"]) elif status == 404: raise TagNotFoundError(status) elif status == 429: raise RateLimitError(status, url) elif status == 500: - raise UnexpectedError(status, url) + raise UnexpectedError(status, url, "") elif status == 503: raise ServerError(status, url) - async def get_club(self,tag): + async def get_club(self, tag): """Get a club by tag""" Tag = checkTag(tag) url = self.api.CLUB.format(clubTag=Tag) - club , status= await self.request(url) + club, status = await self.request(url) if 300 > status >= 200: cc_members = [] - for each in club['members']: - m = ClubMember(each['name'],each['icon']['id'],each['tag'],each['role'],each['nameColor'],each['trophies']) + for each in club["members"]: + m = ClubMember( + each["name"], + each["icon"]["id"], + each["tag"], + each["role"], + each["nameColor"], + each["trophies"], + ) cc_members.append(m) try: - dsc = club['description'] + dsc = club["description"] except KeyError: dsc = None - cl = Club(club['tag'],club['name'],dsc,club['type'],club['badgeId'],club['requiredTrophies'],club['trophies'],cc_members) + cl = Club( + club["tag"], + club["name"], + dsc, + club["type"], + club["badgeId"], + club["requiredTrophies"], + club["trophies"], + cc_members, + ) return cl - + elif status == 403: - raise Forbidden(status, url, club['message']) + raise Forbidden(status, url, club["message"]) elif status == 404: raise TagNotFoundError(status) elif status == 429: @@ -136,143 +212,170 @@ async def get_club(self,tag): async def brawlers(self): """Get a list of all the brawlers currently in the game""" - + url = self.api.BRAWLERS brawlers, status = await self.request(url) if 300 > status >= 200: - brss = brawlers['items'] + brss = brawlers["items"] brs = [] for b in brss: gadgets = [] srs = [] - - for each in b['gadgets']: - gr = Gadget(each['name'],each['id']) + + for each in b["gadgets"]: + gr = Gadget(each["name"], each["id"]) gadgets.append(gr) - - for each in b['starPowers']: - sr = StarPower(each['name'],each['id']) + + for each in b["starPowers"]: + sr = StarPower(each["name"], each["id"]) srs.append(sr) - brs.append(Brawler(b['name'],b['id'],srs,gadgets)) + brs.append(Brawler(b["name"], b["id"], srs, gadgets)) return brs elif status == 403: - raise Forbidden(status, url, brawlers['message']) + raise Forbidden(status, url, brawlers["message"]) elif status == 404: raise BrawlerNotFound(status) elif status == 429: raise RateLimitError(status, url) elif status == 500: - raise UnexpectedError(status, url) + raise UnexpectedError(status, url, "") elif status == 503: raise ServerError(status, url) async def events(self): """Get the list of all the events currently in rotation""" - + url = self.api.EVENTS events, status = await self.request(url) if 300 > status >= 200: - - List = [] + event_list = [] for each in events: - l = Event(each['event']['id'],each['event']['mode'],each['event']['map'],each['startTime'],each['endTime']) + event = Event( + each["event"]["id"], + each["event"]["mode"], + each["event"]["map"], + each["startTime"], + each["endTime"], + ) - List.append(l) + event_list.append(event) - return List + return event_list elif status == 403: - raise Forbidden(status, url, events['message']) + raise Forbidden(status, url, events["message"]) elif status == 404: raise NotFoundErr(status, "Not Found!") elif status == 429: raise RateLimitError(status, url) elif status == 500: - raise UnexpectedError(status, url) + raise UnexpectedError(status, url, "") elif status == 503: raise ServerError(status, url) - async def get_players_rankings(self,countryCode='global',limit=None): + async def get_players_rankings(self, countryCode="global", limit=None): """Get top players rankings""" url = self.api.RANKINGS.format(countryCode=countryCode) + "/players" if limit: url += "?limit={}".format(limit) - + rankings, status = await self.request(url) if 300 > status >= 200: - rankgs = [] - for each in rankings['items']: + for each in rankings["items"]: try: - cl = each['club'] + cl = each["club"] except KeyError: cl = None else: - cl = cl['name'] - rankgs.append(PlayerRanking(each['name'],each['tag'],each['nameColor'],each['icon']['id'],each['trophies'],each['rank'],cl)) + cl = cl["name"] + rankgs.append( + PlayerRanking( + each["name"], + each["tag"], + each["nameColor"], + each["icon"]["id"], + each["trophies"], + each["rank"], + cl, + ) + ) return rankgs elif status == 403: - raise Forbidden(status, url, rankings['message']) + raise Forbidden(status, url, rankings["message"]) elif status == 404: raise NotFoundErr(status, "Not Found!") elif status == 429: raise RateLimitError(status, url) elif status == 500: - raise UnexpectedError(status, url) + raise UnexpectedError(status, url, "") elif status == 503: raise ServerError(status, url) - async def get_brawlers_rankings(self,brawlerID,countryCode='global',limit=None): + async def get_brawlers_rankings(self, brawlerID, countryCode="global", limit=None): """Get top rankings based on brawlers""" - url = self.api.RANKINGS.format(countryCode=countryCode) + "/brawlers/{}".format(brawlerID) - + url = self.api.RANKINGS.format(countryCode=countryCode) + "/brawlers/{}".format( + brawlerID + ) + if limit: url += "?limit={}".format(limit) rankings, status = await self.request(url) - + if 300 > status >= 200: rankgs = [] - for each in rankings['items']: + for each in rankings["items"]: try: - cl = each['club'] + cl = each["club"] except KeyError: cl = None else: - cl = cl['name'] - rankgs.append(BrawlerRanking(each['tag'],each['name'],each['nameColor'],each['icon']['id'],each['trophies'],each['rank'],cl)) - + cl = cl["name"] + rankgs.append( + BrawlerRanking( + "", + each["tag"], + each["name"], + each["nameColor"], + each["icon"]["id"], + each["trophies"], + each["rank"], + cl, + ) + ) + return rankgs - + elif status == 403: - raise Forbidden(status, url, rankings['message']) + raise Forbidden(status, url, rankings["message"]) elif status == 404: raise BrawlerNotFound(status, brawlerID) elif status == 429: raise RateLimitError(status, url) elif status == 500: - raise UnexpectedError(status, url) + raise UnexpectedError(status, url, "") elif status == 503: raise ServerError(status, url) - async def get_club_rankings(self,countryCode='global',limit=None): + async def get_club_rankings(self, countryCode="global", limit=None): """Get top clubs rankings""" url = self.api.RANKINGS.format(countryCode=countryCode) + "/clubs" - + if limit: url += "?limit={}".format(limit) @@ -281,53 +384,69 @@ async def get_club_rankings(self,countryCode='global',limit=None): if 300 > status >= 200: clubs = [] - for each in rankings['items']: - clubs.append(ClubRanking(each['tag'],each['name'],each['badgeId'],each['trophies'],each['rank'],each['memberCount'])) + for each in rankings["items"]: + clubs.append( + ClubRanking( + each["tag"], + each["name"], + each["badgeId"], + each["trophies"], + each["rank"], + each["memberCount"], + ) + ) return clubs - + elif status == 403: - raise Forbidden(status, url, rankings['message']) + raise Forbidden(status, url, rankings["message"]) elif status == 404: raise CountryNotFound(status, countryCode) elif status == 429: raise RateLimitError(status, url) elif status == 500: - raise UnexpectedError(status, url) + raise UnexpectedError(status, url, "") elif status == 503: raise ServerError(status, url) async def get_club_members(self, clubTag): """Get members of a club""" - + tag = checkTag(clubTag) - url = self.api.CLUB.format(clubTag=tag) + '/members' + url = self.api.CLUB.format(clubTag=tag) + "/members" club, status = await self.request(url) if 300 > status >= 200: cc_members = [] - for each in club['items']: - m = ClubMember(each['name'],each['icon']['id'],each['tag'],each['role'],each['nameColor'],each['trophies']) + for each in club["items"]: + m = ClubMember( + each["name"], + each["icon"]["id"], + each["tag"], + each["role"], + each["nameColor"], + each["trophies"], + ) cc_members.append(m) return cc_members - + elif status == 403: - raise Forbidden(status, url, club['message']) + raise Forbidden(status, url, club["message"]) elif status == 404: raise TagNotFoundError(status) elif status == 429: raise RateLimitError(status, url) elif status == 500: - raise UnexpectedError(status, url) + raise UnexpectedError(status, url, "") elif status == 503: raise ServerError(status, url) - - async def get_brawler_byID(self, brawlerID : int): + + async def get_brawler_byID(self, brawlerID: int): """Get A brawler by id""" - + url = self.api.BRAWLER.format(id=brawlerID) b, status = await self.request(url) @@ -335,23 +454,23 @@ async def get_brawler_byID(self, brawlerID : int): if 300 > status >= 200: gadgets = [] srs = [] - - for each in b['gadgets']: - gr = Gadget(each['name'],each['id']) + + for each in b["gadgets"]: + gr = Gadget(each["name"], each["id"]) gadgets.append(gr) - - for each in b['starPowers']: - sr = StarPower(each['name'],each['id']) + + for each in b["starPowers"]: + sr = StarPower(each["name"], each["id"]) srs.append(sr) - br = Brawler(b['name'],b['id'],srs,gadgets) + br = Brawler(b["name"], b["id"], srs, gadgets) return br elif status == 403: - raise Forbidden(status, url, b['message']) + raise Forbidden(status, url, b["message"]) elif status == 404: - raise BrawlerNotFound(status, id = brawlerID) + raise BrawlerNotFound(status, id=brawlerID) elif status == 429: raise RateLimitError(status, url) elif status == 500: @@ -365,6 +484,5 @@ async def get_brawler_byName(client, name): brawlers = await client.brawlers() for br in brawlers: - if br.name.lower() == name.lower(): return br diff --git a/brawlpy/objects.py b/brawlpy/objects.py index 14a5853..2cbdef6 100644 --- a/brawlpy/objects.py +++ b/brawlpy/objects.py @@ -1,12 +1,9 @@ import os -import json -from .icons import brawlers as br_icons -__location__ = os.path.realpath( - os.path.join(os.getcwd(), os.path.dirname(__file__))) +__location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__))) -class Player: +class Player: """ Player object with all its attribute @@ -25,10 +22,26 @@ class Player: club - The club that the player is in """ - def __init__(self,name,tag,nameColor,icon_id,trophies,expLevel,expPoints,club,highestTrophies,soloVictories,duoVictories,teamVictories,bestRoboRumbleTime,bestTimeAsBigBrawler,brawlers,battleLog): + def __init__( + self, + name, + tag, + icon_id, + trophies, + expLevel, + expPoints, + club, + highestTrophies, + soloVictories, + duoVictories, + teamVictories, + bestRoboRumbleTime, + bestTimeAsBigBrawler, + brawlers, + ): self.name = name self.tag = tag - self.nameColor = nameColor + # self.nameColor = nameColor self.icon_id = icon_id self.trophies = trophies self.expLevel = expLevel @@ -41,7 +54,6 @@ def __init__(self,name,tag,nameColor,icon_id,trophies,expLevel,expPoints,club,hi self.bestRoboRumbleTime = bestRoboRumbleTime self.brawlers = brawlers self.club = club - self.battleLog = battleLog def __repr__(self): return "".format(self) @@ -49,8 +61,8 @@ def __repr__(self): def __str__(self): return "{0.name} ({0.tag})".format(self) -class Club: +class Club: """ Club object with all its attribute @@ -63,7 +75,9 @@ class Club: members - A list a all the members of the club """ - def __init__(self,tag,name,description,type,badgeID,requiredTrophies,trophies,members): + def __init__( + self, tag, name, description, type, badgeID, requiredTrophies, trophies, members + ): self.tag = tag self.name = name self.description = description @@ -79,8 +93,8 @@ def __repr__(self): def __str__(self): return "{0.name} ({0.tag})".format(self) -class ClubMember: +class ClubMember: """ ClubMember object with all its attribute @@ -92,14 +106,14 @@ class ClubMember: trophies - The total trophies of the member """ - def __init__(self,name,icon_id,tag,role,nameColor,trophies): + def __init__(self, name, icon_id, tag, role, nameColor, trophies): self.name = name self.icon_id = icon_id self.tag = tag self.role = role self.nameColor = nameColor self.trophies = trophies - + def __repr__(self): return "".format(self) @@ -108,7 +122,6 @@ def __str__(self): class ClubRanking: - """ ClubRanking object with all its attribute @@ -120,7 +133,7 @@ class ClubRanking: memberCount - The amount of the member the club has """ - def __init__(self,tag,name,badgeID,trophies,rank,memberCount): + def __init__(self, tag, name, badgeID, trophies, rank, memberCount): self.tag = tag self.name = name self.badgeID = badgeID @@ -134,8 +147,8 @@ def __repr__(self): def __str__(self): return "{0.rank}. {0.name} ({0.tag})".format(self) -class PlayerRanking: +class PlayerRanking: """ PlayerRanking object with all its attribute @@ -148,7 +161,7 @@ class PlayerRanking: clubName - The name of the club the player is in """ - def __init__(self,name,tag,nameColor,icon_id,trophies,rank,clubName): + def __init__(self, name, tag, nameColor, icon_id, trophies, rank, clubName): self.name = name self.tag = tag self.nameColor = nameColor @@ -165,7 +178,6 @@ def __str__(self): class BrawlerRanking: - """ BrawlerRanking object with all its attribute @@ -179,9 +191,19 @@ class BrawlerRanking: clubName - The Name of the player's Club """ - def __init__(self,brawler,playerTag,playerName,playerNameColor,playerIconID,trophies,rank,clubName): + def __init__( + self, + brawler, + playerTag, + playerName, + playerNameColor, + playerIconID, + trophies, + rank, + clubName, + ): self.brawler = brawler - self.playerTag = playerTag + self.playerTag = playerTag self.playerName = playerName self.playerNameColor = playerNameColor self.playerIconID = playerIconID @@ -190,13 +212,15 @@ def __init__(self,brawler,playerTag,playerName,playerNameColor,playerIconID,trop self.clubName = clubName def __repr__(self): - return "".format(self) + return "".format( + self + ) def __str__(self): return "{0.rank}. {0.playerName} ({0.playerTag}) => {0.brawler}".format(self) -class Event: +class Event: """ Event object with all its attribute @@ -207,21 +231,21 @@ class Event: endTime - The time when the event will be out of rotation """ - def __init__(self,id,mode,map,startTime,endTime): + def __init__(self, id, mode, map, startTime, endTime): self.id = id self.mode = mode self.map = map self.startTime = startTime self.endTime = endTime - + def __repr__(self): return "".format(self) def __str__(self): return "{0.mode} => {0.map} ({0.id})".format(self) -class Brawler: +class Brawler: """ Brawler object with all its attribute @@ -232,13 +256,13 @@ class Brawler: gadgets - A list of all the gagdets the brawler has """ - def __init__(self,name,id,starPowers,gadgets): + def __init__(self, name, id, starPowers, gadgets): self.name = name self.id = id self.starPowers = starPowers self.icon_url = self.get_icon_url() self.gadgets = gadgets - + def __repr__(self): return "".format(self) @@ -246,11 +270,10 @@ def __str__(self): return "{0.name} ({0.id})".format(self) def get_icon_url(self): - return None -class PlayerBrawler: +class PlayerBrawler: """ PlayerBrawler object with all its attribute @@ -265,7 +288,18 @@ class PlayerBrawler: gears - A list of all the gears the player has on this brawler """ - def __init__(self,name,id,power,rank,trophies,highestTrophies,gadgets,gears,starPowers): + def __init__( + self, + name, + id, + power, + rank, + trophies, + highestTrophies, + gadgets, + gears, + starPowers, + ): self.name = name self.id = id self.icon_id = self.get_icon_url() @@ -276,20 +310,20 @@ def __init__(self,name,id,power,rank,trophies,highestTrophies,gadgets,gears,star self.gadgets = gadgets self.gears = gears self.starPowers = starPowers - + def __repr__(self): - return "".format(self) + return "".format( + self + ) def __str__(self): return "{0.name} ({0.id})".format(self) def get_icon_url(self): - return None class Gadget: - """ Gadget object with all its attribute @@ -297,18 +331,18 @@ class Gadget: id - The ID of the gadget """ - def __init__(self,name,id): + def __init__(self, name, id): self.name = name self.id = id - + def __repr__(self): return "".format(self) def __str__(self): return "{0.name} ({0.id})".format(self) + class StarPower: - """ StarPower object with all its attribute @@ -316,18 +350,18 @@ class StarPower: id - The ID of the star power """ - def __init__(self,name,id): + def __init__(self, name, id): self.name = name self.id = id - + def __repr__(self): return "".format(self) def __str__(self): return "{0.name} ({0.id})".format(self) + class Gear: - """ Gear object with all its attribute @@ -336,13 +370,13 @@ class Gear: level - The level of the gear """ - def __init__(self,name,id,level): + def __init__(self, name, id, level): self.name = name self.id = id self.level = level - + def __repr__(self): return "".format(self) - + def __str__(self): return "level {0.level} gear {0.name} ({0.id})".format(self) diff --git a/brawlpy/utils.py b/brawlpy/utils.py index f16e473..0ddb69e 100644 --- a/brawlpy/utils.py +++ b/brawlpy/utils.py @@ -1,6 +1,7 @@ -from .errors import * +from .errors import TagNotFoundError -def checkTag(tag : str): + +def checkTag(tag: str): tag = tag.strip("#").upper() allowed_chars = "0289PYLQGRJCUV" @@ -8,9 +9,11 @@ def checkTag(tag : str): raise TagNotFoundError(404, reason="Tag can't be less then 3 characters!") invalid = [i for i in tag if i not in allowed_chars] if invalid: - raise TagNotFoundError(404, reason="An Invalid character has been passed!",invalid_characters=invalid) + raise TagNotFoundError( + 404, reason=f"An Invalid character has been passed! {invalid}" + ) if not tag.startswith("%23"): tag = "%23" + tag - return tag \ No newline at end of file + return tag diff --git a/examples/club.py b/examples/club.py index 45de8b5..96ae6bf 100644 --- a/examples/club.py +++ b/examples/club.py @@ -1,20 +1,22 @@ import brawlpy import asyncio -client = brawlpy.Client('your_token_here') # Enter your token here +client = brawlpy.Client("your_token_here") # Enter your token here + async def brawlPy(): - club = await client.get_club("PVQ0RP90") - + async with client: + club = await client.get_club("PVQ0RP90") + print(club) - print(club.name,club.tag, club.trophies) - + print(club.name, club.tag, club.trophies) + for member in club.members: - print(member) - + print(club.description) - + + loop = asyncio.get_event_loop() -loop.run_until_complete(brawlPy()) \ No newline at end of file +loop.run_until_complete(brawlPy()) diff --git a/examples/player.py b/examples/player.py index 7efeaf7..2aa6d45 100644 --- a/examples/player.py +++ b/examples/player.py @@ -1,23 +1,24 @@ import brawlpy import asyncio -client = brawlpy.Client('your_token_here') # Enter your token here +client = brawlpy.Client("your_token_here") # Enter your token here + async def brawlPy(): - player = await client.get_player("JP20RUR2") - + async with client: + player = await client.get_player("JP20RUR2") + print(player) - print(player.name,player.tag, player.trophies) - + print(player.name, player.tag, player.trophies) + for brawler in player.brawlers: - print(brawler) - print(player.battleLog) # A big fat list - - print(player.club) # returns None cuz I am not in a club :( , try changing the tag + # Note: battle log is not accessed here because the Player object does not expose a valid battleLog attribute. + + print(player.club) # returns None cuz I am not in a club :( , try changing the tag + - loop = asyncio.get_event_loop() -loop.run_until_complete(brawlPy()) \ No newline at end of file +loop.run_until_complete(brawlPy()) diff --git a/setup.py b/setup.py index 7549bcc..117c9b9 100644 --- a/setup.py +++ b/setup.py @@ -1,28 +1,29 @@ from setuptools import setup from pathlib import Path + this_directory = Path(__file__).parent long_description = (this_directory / "README.md").read_text() setup( - name = 'brawlpy', - packages = ['brawlpy'], - version = '1.2.5', - license='MIT', - description = 'A Basic wrapper for the Brawl Stars API', - author = 'PyStarr', - author_email = 'pystarrorg@gmail.com', - url = 'https://github.com/PyStarr/BrawlPy', - long_description=long_description, - long_description_content_type="text/markdown", - download_url = 'https://github.com/PyStarr/BrawlPy/archive/v1.2.5.tar.gz', - keywords = ['wrapper', 'brawlstars', 'api','brawlstarsApiWrapper'], - install_requires=[ - 'aiohttp', - ], - classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: MIT License', - ], -) \ No newline at end of file + name="brawlpy", + packages=["brawlpy"], + version="1.2.5", + license="MIT", + description="A Basic wrapper for the Brawl Stars API", + author="PyStarr", + author_email="pystarrorg@gmail.com", + url="https://github.com/PyStarr/BrawlPy", + long_description=long_description, + long_description_content_type="text/markdown", + download_url="https://github.com/PyStarr/BrawlPy/archive/v1.2.5.tar.gz", + keywords=["wrapper", "brawlstars", "api", "brawlstarsApiWrapper"], + install_requires=[ + "aiohttp", + ], + classifiers=[ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + ], +)