Source code for i3pystatus.dota2wins

from dota2py import api
from i3pystatus import IntervalModule


[docs]class Dota2wins(IntervalModule): """ Displays the win/loss ratio of a given Dota account. Requires: dota2py """ settings = ( ("matches", "Number of recent matches to calculate"), ("steamid", "Steam ID or username to track"), ("steam_api_key", "Steam API key " "(http://steamcommunity.com/dev/apikey)"), ("good_threshold", "Win percentage (or higher) which you are happy " "with"), ("bad_threshold", "Win percentage you want to be alerted (difference " "between good_threshold and bad_threshold is cautious_threshold)"), ("interval", "Update interval (games usually last at least 20 min)."), ("good_color", "Color of text while win percentage is above " "good_threshold"), ("bad_color", "Color of text while win percentage is below " "bad_threshold"), ("caution_color", "Color of text while win precentage is between good " "and bad thresholds"), ("screenname", "If set to 'retrieve', requests for the users's " "screenname via API calls. Else, use the supplied string as the " "user's screename"), "format" ) required = ("steamid", "steam_api_key") good_color = "#00FF00" # green caution_color = "#FFFF00" # yellow bad_color = "#FF0000" # red good_threshold = 50 bad_threshold = 45 matches = 25 interval = 1800 screenname = 'retrieve' format = "{screenname} {wins}W:{losses}L {win_percent:.2f}%" def run(self): api.set_api_key(self.steam_api_key) if not isinstance(self.steamid, int): # find by username self.steamid = int(api.get_steam_id(self.steamid)['response']['steamid']) hist = api.get_match_history(account_id=self.steamid)['result'] recent_matches = [] while len(recent_matches) < self.matches: recent_matches.append(hist['matches'].pop(0)) player_team_per_match = [] # create a list of tuples where each tuple is: # [match_id, bool] # The bool will be true if the player is on Radiant and alse if they # are on Dire. for match in recent_matches: this_match = [match['match_id']] for player in match['players']: # 64bit player ID long_id = player['account_id'] + 76561197960265728 if long_id == self.steamid: if player['player_slot'] < 128: this_match.append(True) else: this_match.append(False) player_team_per_match.append(this_match) outcomes = [] for match in player_team_per_match: if api.get_match_details(match[0])['result']['radiant_win'] == match[1]: outcomes.append(1) else: outcomes.append(0) wins = outcomes.count(1) losses = outcomes.count(0) win_percent = float(sum(outcomes) / float(len(outcomes))) * 100 if win_percent >= float(self.good_threshold): color = self.good_color elif win_percent <= float(self.bad_threshold): color = self.bad_color else: color = self.caution_color if self.screenname == 'retrieve': from urllib.request import urlopen import json response = urlopen( 'http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=%s&steamids=%s' % (self.steam_api_key, self.steamid)) screenname = json.loads(bytes.decode(response.read()))['response']['players'][0]['personaname'] else: screenname = self.screenname cdict = { "screenname": screenname, "wins": wins, "losses": losses, "win_percent": win_percent, } self.output = { "full_text": self.format.format(**cdict), "color": color }