Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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
Expand All @@ -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)

Expand All @@ -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)

Expand Down
9 changes: 3 additions & 6 deletions brawlpy/API.py
Original file line number Diff line number Diff line change
@@ -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"
self.EVENTS = self.BASE + "/events/rotation"
42 changes: 36 additions & 6 deletions brawlpy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
35 changes: 22 additions & 13 deletions brawlpy/errors.py
Original file line number Diff line number Diff line change
@@ -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"""

Expand All @@ -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."""
Copy link

Copilot AI Jan 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Spelling error: "occured" should be "occurred" (double 'r').

Copilot uses AI. Check for mistakes.

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}"
Copy link

Copilot AI Jan 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Spelling error: "occured" should be "occurred" (double 'r').

Copilot uses AI. Check for mistakes.
super().__init__(self.code, self.message)
Comment on lines 51 to 55
Copy link

Copilot AI Jan 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The UnexpectedError constructor signature has inconsistent parameter order. The init method defines parameters as (url, code, text), but all call sites in main.py pass them as (status, url, ""). This will cause url to be assigned to code and "" to be assigned to url, breaking error reporting.

Copilot uses AI. Check for mistakes.


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)
Comment on lines +71 to 76
Copy link

Copilot AI Jan 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The BrawlerNotFound exception doesn't initialize self.message when id is None or falsy. This will cause an AttributeError when the exception is raised without an id parameter, since str tries to access self.message.

Copilot uses AI. Check for mistakes.


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:
Copy link

Copilot AI Jan 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The condition uses 'id' instead of 'countryCode'. This is a copy-paste error from the BrawlerNotFound exception above. It should check 'if countryCode:' to properly set the error message.

Suggested change
if id:
if countryCode:

Copilot uses AI. Check for mistakes.
self.message = 'Invalid countryCode passed! {}'.format(countryCode)
self.message = "Invalid countryCode passed! {}".format(countryCode)

super().__init__(self.code, self.message)
super().__init__(self.code, self.message)
108 changes: 54 additions & 54 deletions brawlpy/icons.py
Original file line number Diff line number Diff line change
@@ -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-_",
}
Loading