Skip to content
This repository was archived by the owner on Jun 8, 2021. It is now read-only.

Commit 0b0f856

Browse files
authored
Merge pull request #5 from heyudude/show-player-details
Show player details
2 parents 4649615 + c203682 commit 0b0f856

23 files changed

+411
-68
lines changed

.gitignore

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ __pycache__/
88

99
# vscode
1010
.vscode/*
11-
!.vscode/settings.json
12-
!.vscode/tasks.json
13-
!.vscode/launch.json
14-
!.vscode/extensions.json
11+
.vscode/settings.json
12+
.vscode/tasks.json
13+
.vscode/launch.json
14+
.vscode/extensions.json
1515
*.code-workspace
1616

1717
# Local History for Visual Studio Code

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"python.pythonPath": "/home/hans/repo/BrawlStars-Club-Tools/.env/bin/python3.8"
2+
"python.pythonPath": "bin/python"
33
}

README.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ optional arguments:
6868
Optional config file
6969
==================================================
7070

71-
bstools looks for a config file in your home directory called .bstools
71+
bstools looks by default for a config file in your home directory called /home/<name>/myclub/bstools.ini
7272

7373
This is an INI file. As of current version, there's only one possible
7474
parameter: api_key. The file should look like:

bstools/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from ._version import __version__
88
from .bstools import build_dashboard
99
from .config import load_config_file
10-
from .memberfactory import MemberFactory
10+
from .factory import MemberFactory, PlayerFactory, BrawlerFactory
1111
from .scorecalc import ScoreCalculator
1212

1313
logger = logging.getLogger(__name__)
@@ -58,7 +58,7 @@ def parse_args(argv):
5858

5959
return parser.parse_args(argv)
6060

61-
def get_config_from_args(args, check_config_file=True, config_default='~/.bstools'):
61+
def get_config_from_args(args, check_config_file=True, config_default='~/myclub/bstools.ini'):
6262
if args.version:
6363
print(__version__)
6464
exit(0)

bstools/_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.0.2"
1+
__version__ = "0.0.3"

bstools/api_wrapper.py

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,37 @@ def __init__(self, config):
2121
self.clubs = pybrawl.ClubsApi(pybrawl.ApiClient(api_config))
2222
self.players = pybrawl.PlayersApi(pybrawl.ApiClient(api_config))
2323

24-
def get_data_from_api(self): # pragma: no coverage
24+
def get_club_from_api(self): # pragma: no coverage
2525
try:
2626
# Get Club data from API
2727
club = self.clubs.get_club(self.config['api']['club_id'])
28-
player = self.players.get_player(self.config['api']['player_id'])
2928
logger.info('- Found Club: {} ({})'.format(club.tag, club.name))
29+
30+
return (club)
31+
except pybrawl.ApiException as e:
32+
if e.body:
33+
body = json.loads(e.body)
34+
if body['reason'] == 'accessDenied':
35+
logger.error('403: developer.brawlstars.com claims that your API key is invalid. Please make sure you are setting up bstools with a valid key.')
36+
elif body['reason'] == 'accessDenied.invalidIp':
37+
logger.error('developer.brawlstars.com says: {}'.format(body['message']))
38+
else:
39+
logger.error('error: {}'.format(body))
40+
else:
41+
logger.error('error: {}'.format(e))
42+
except pybrawl.OpenApiException as e:
43+
logger.error('Apiwrapper error: {}'.format(e))
44+
45+
# If we've gotten here, something has gone wrong. We need to abort the application.
46+
exit(0)
47+
48+
def get_player_from_api(self, player_tag): # pragma: no coverage
49+
try:
50+
# Get player data from API
51+
player = self.players.get_player(player_tag)
3052
logger.info('- Found Player: {} ({})'.format(player.tag, player.name))
3153

32-
return (club, player)
54+
return (player)
3355
except pybrawl.ApiException as e:
3456
if e.body:
3557
body = json.loads(e.body)
@@ -46,3 +68,33 @@ def get_data_from_api(self): # pragma: no coverage
4668

4769
# If we've gotten here, something has gone wrong. We need to abort the application.
4870
exit(0)
71+
72+
def get_brawlers_for_player(self, member_tag):
73+
74+
logger.debug("Getting brawlers for player {}".format(member_tag))
75+
try:
76+
# Get player data and brawlers from API.
77+
player = self.players.get_player(member_tag)
78+
79+
logger.debug("Player: {}".format(player.name))
80+
for brawler in player.brawlers:
81+
logger.debug("Brawler: {}".format(brawler.name))
82+
return
83+
84+
except pybrawl.ApiException as e:
85+
if e.body:
86+
body = json.loads(e.body)
87+
if body['reason'] == 'accessDenied':
88+
logger.error(
89+
'developer.brawlstars.com claims that your API key is invalid. Please make sure you are setting up crtools with a valid key.')
90+
elif body['reason'] == 'accessDenied.invalidIp':
91+
logger.error(
92+
'developer.brawlstars.com says: {}'.format(body['message']))
93+
else:
94+
logger.error('error: {}'.format(body))
95+
else:
96+
logger.error('error: {}'.format(e))
97+
except pyroyale.OpenApiException as e:
98+
logger.error('error: {}'.format(e))
99+
100+
return False

bstools/bstools.py

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
from bstools import fankit
2121
from bstools import io
2222
from bstools import discord
23-
from bstools.memberfactory import MemberFactory
24-
from bstools.models import FormerMember, ProcessedClub, ProcessedPlayer
23+
from bstools.factory import MemberFactory, PlayerFactory, BrawlerFactory
24+
from bstools.models import FormerMember, ProcessedClub, ProcessedPlayer, ProcessedBrawler
2525

2626
MAX_CLAN_SIZE = 100
2727

@@ -119,23 +119,50 @@ def process_members(config, club, member_history):
119119
api_config = pybrawl.Configuration()
120120
api_config.api_key['authorization'] = config['api']['api_key']
121121
api_config.access_token = config['api']['api_key']
122-
logger.debug("players instance")
123-
players = pybrawl.PlayersApi(pybrawl.ApiClient(api_config))
124-
factory = MemberFactory(
122+
123+
mfactory = MemberFactory(
125124
config=config,
126125
club=club,
127126
member_history=member_history)
128127
members_processed = []
129128
rank = 0
130129
for member_src in club.members:
131130
playertag = member_src.tag
132-
player = players.get_player(playertag)
133-
explevel = player.exp_level
134131
rank = rank + 1
135-
members_processed.append(factory.get_processed_member(member_src, rank, explevel))
132+
members_processed.append(mfactory.get_processed_member(member_src, rank))
136133

137134
return members_processed
138-
135+
136+
def process_players(config, club):
137+
""" Process player and brawlers list """
138+
139+
# process player with results from the API
140+
api_config = pybrawl.Configuration()
141+
api_config.api_key['authorization'] = config['api']['api_key']
142+
api_config.access_token = config['api']['api_key']
143+
api = ApiWrapper(config)
144+
145+
146+
# bfactory = BrawlerFactory(
147+
# config=config,
148+
# brawler=brawler)
149+
150+
players_processed = []
151+
for player_src in club.members:
152+
logger.debug("Process player: {}".format(player_src.name))
153+
player = api.get_player_from_api(player_src.tag)
154+
pfactory = PlayerFactory(
155+
config=config,
156+
player=player)
157+
players_processed.append(pfactory.get_processed_player(player))
158+
# for brawler_src in player.brawlers:
159+
# logger.debug("Process brawler: {}".format(brawler_src.name))
160+
# #player_tag = player_src.tag
161+
# brawler_tag = brawler_src.name
162+
# brawlers_processed.append(bfactory.get_processed_brawler(brawler_src))
163+
164+
return players_processed
165+
139166
def process_absent_members(config, historical_members):
140167
absent_members = []
141168

@@ -166,7 +193,7 @@ def build_dashboard(config): # pragma: no coverage
166193
print('- info: requesting info for Club id: {}'.format(config['api']['club_id']))
167194

168195
api = ApiWrapper(config)
169-
club, player = api.get_data_from_api()
196+
club = api.get_club_from_api()
170197

171198
# Create temporary directory. All file writes, until the very end,
172199
# will happen in this directory, so that no matter what we do, it
@@ -179,7 +206,8 @@ def build_dashboard(config): # pragma: no coverage
179206

180207
# process data from API
181208
club_processed = ProcessedClub(club, config)
182-
player_processed = ProcessedPlayer(player, config)
209+
players_processed = process_players(config, club)
210+
183211
member_history = history.get_member_history(club.members, config['bstools']['timestamp'], io.get_previous_history(output_path))
184212
members_processed = process_members(config, club, member_history)
185213
former_members = process_absent_members(config, member_history['members'])
@@ -190,6 +218,7 @@ def build_dashboard(config): # pragma: no coverage
190218
tempdir,
191219
club_processed,
192220
members_processed,
221+
players_processed,
193222
former_members,
194223
get_suggestions(config, members_processed, club_processed.required_trophies),
195224
get_scoring_rules(config)
@@ -202,8 +231,9 @@ def build_dashboard(config): # pragma: no coverage
202231
{
203232
'club' : club.to_dict(),
204233
'club-processed' : club_processed,
205-
'player-processed' : player_processed,
234+
'players-processed' : players_processed,
206235
'members-processed' : members_processed,
236+
'former-members' : former_members,
207237
}
208238
)
209239

bstools/config.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,12 +171,12 @@ def __localize_strings(locale_id):
171171
'labelMemberLastActivity' : _('Last Active'),
172172
'labelBeforeHistory' : _('Before recorded history'),
173173
'labelArena' : _('Arena'),
174-
'labelXpLevel' : _('XP Level'),
174+
'labelExpLevel' : _('Exp Level'),
175175
'labelScore' : _('Score'),
176176
'labelRank' : _('Rank'),
177177
'labelTrophies' : _('Trophies'),
178-
'labelDonations' : _('Dona&shy;tions'),
179-
'labelDonationsRecieved' : _('Donations received'),
178+
'labelDonations' : _('Donations'),
179+
'labelDonationsReceived' : _('Donations received'),
180180
'labelDaysInactive' : _('Days Inactive'),
181181
'labelDays' : _('Days'),
182182
'labelMonths' : _('Months'),
@@ -223,6 +223,12 @@ def __localize_strings(locale_id):
223223

224224
'dialogTitleMemberDetails' : _('Member Details'),
225225
'dialogLabelPlayerStats' : _('Player Stats and Info'),
226+
'dialogLabelPlayerDetails' : _('Brawlers'),
227+
'dialogLabelPlayerBra' : _('Brawler'),
228+
'dialogLabelPlayerBtr' : _('Trophies'),
229+
'dialogLabelPlayerBht' : _('Highest Trophies'),
230+
'dialogLabelPlayerBpo' : _('Power'),
231+
'dialogLabelPlayerBrn' : _('Rank'),
226232
'dialogMemberStatsRoyale' : _('See on BrawlStats'),
227233
'dialogMemberRoyaleApi' : _('See on BrawlStats'),
228234
'dialogLabelPlayerHistory' : _('Player History'),

bstools/memberfactory.py renamed to bstools/factory.py

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
from bstools.models import ProcessedPlayer
12
from datetime import datetime
23
import logging
34

4-
from bstools.models import Demerit, ProcessedMember
5+
from bstools.models import Demerit, ProcessedMember, ProcessedPlayer, ProcessedBrawler
56
from bstools import history
67
from bstools.scorecalc import ScoreCalculator
78

@@ -11,22 +12,20 @@ class MemberFactory:
1112
def __init__(self, config, club, member_history, days_from_donation_reset=0):
1213
self.config = config
1314
self.club = club
14-
# self.current_war = current_war
15-
# self.warlog = warlog
1615
self.member_history = member_history
1716
self.days_from_donation_reset = days_from_donation_reset
1817
self.now = config['bstools']['timestamp']
1918
self.history_start_timestamp = member_history['history_start']
2019
self.max_days_from_join = (self.now - datetime.fromtimestamp(self.history_start_timestamp)).days
2120

2221

23-
def get_processed_member(self, member, rank, explevel):
24-
processed_member = ProcessedMember(member, rank, explevel)
22+
def get_processed_member(self, member, rank):
23+
processed_member = ProcessedMember(member, rank)
2524

2625
self.enrich_member_with_history(processed_member, self.member_history['members'][processed_member.tag])
2726
self.calc_special_status(processed_member)
2827
self.calc_derived_member_stats(processed_member)
29-
28+
3029
return processed_member
3130

3231
def enrich_member_with_history(self, member, historical_member):
@@ -140,7 +139,6 @@ def calc_derived_member_stats(self, member):
140139
#member.donation_score = score_calc.get_member_donations_score(member) # TODO
141140
member.donation_score = 0
142141

143-
144142
# calculate score based on war participation # TODO
145143
member.war_score = 0
146144
# for war in member.warlog:
@@ -271,3 +269,29 @@ def calc_activity_status(self, days_inactive):
271269
return 'ok'
272270

273271
return 'normal'
272+
273+
# Process Players brawlers / battles
274+
class PlayerFactory:
275+
def __init__(self, config, player):
276+
self.config = config
277+
self.player = player
278+
279+
def get_processed_player(self, player):
280+
281+
processed_player = ProcessedPlayer(player)
282+
283+
return processed_player
284+
285+
# Process Players brawlers / battles
286+
class BrawlerFactory:
287+
def __init__(self, config, brawler):
288+
self.config = config
289+
self.brawler = brawler
290+
291+
def get_processed_brawler(self, brawler):
292+
293+
processed_brawler = ProcessedBrawler(brawler)
294+
295+
return processed_brawler
296+
297+
# EOF

bstools/io.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
'show_rank' : 'rank',
2020
'show_rank_previous' : 'rank.previous',
2121
'show_name' : 'name',
22-
'show_xp_level' : 'xp-level',
22+
'show_xp_level' : 'exp-level',
2323
'show_score' : 'score',
2424
'show_trophies' : 'trophies',
2525
'show_last_seen' : 'last-seen',
@@ -67,7 +67,7 @@ def copy_static_assets(tempdir, club_logo_path, favicon_path):
6767
shutil.copyfile(favicon_path, os.path.join(tempdir, FAVICON_FILENAME))
6868

6969

70-
def parse_templates(config, history, tempdir, club, members, former_members, suggestions, scoring_rules): # pragma: no coverage
70+
def parse_templates(config, history, tempdir, club, members, players, former_members, suggestions, scoring_rules): # pragma: no coverage
7171
# Create environment for template parser
7272
env = Environment(
7373
loader=PackageLoader('bstools', 'templates'),
@@ -86,6 +86,7 @@ def parse_templates(config, history, tempdir, club, members, former_members, sug
8686
strings = config['strings'],
8787
update_date = datetime.now().strftime('%c'),
8888
members = members,
89+
players = players,
8990
club = club,
9091
club_hero = config['paths']['description_html_src'],
9192
suggestions = suggestions,
@@ -111,6 +112,12 @@ def parse_templates(config, history, tempdir, club, members, former_members, sug
111112
write_object_to_file(os.path.join(tempdir, 'sitemap.xml'), sitemap_xml)
112113
write_object_to_file(os.path.join(tempdir, 'robots.txt'), robots_txt)
113114

115+
# test
116+
# p_html = env.get_template('p.html.j2').render(
117+
# players = players
118+
# )
119+
# write_object_to_file(os.path.join(tempdir, 'p.html'), p_html)
120+
114121
def dump_debug_logs(tempdir, objects_to_dump):
115122
""" archive outputs of API and other objects for debugging """
116123
log_path = os.path.join(tempdir, 'log')

0 commit comments

Comments
 (0)