def build_slack_attachment(stats): """ Builds the JSON attachment for the Slack message """ message = {} name = stats['name'] message['author_name'] = '%s (Player Stats)' % name message['color'] = 'good' message['author_link'] = get_player_link(name) message['author_icon'] = get_avatar_link(name) text = 'Rank: `%s` Rating: `%s`\nKills: `%s` Deaths: `%s` KD: `%s`\nWools: `%s` Cores: `%s` Monuments: `%s`' % ( stats['rank'], stats['rating'], stats['kills'], stats['deaths'], stats['kd_ratio'], stats['wools'], stats['cores'], stats['monuments']) message['text'] = text message['mrkdwn_in'] = ['text'] return message
def scrape_stats(player_name): """ Scrapes Overcast Network Player Stats Based on code by @McSpider https://github.com/McSpider/Overcast-IRC-Bot/blob/master/_functions/player.py Updated to work with new Overcast Network ranked profiles """ result = { 'name': player_name, } if not valid_minecraft_username(player_name): raise PluginException(':warning: Invalid player name!') r = requests.get(get_player_link(player_name)) if r.status_code != requests.codes.ok: if r.status_code == 404: raise PluginException('404 - User not found') if r.status_code == 522: raise PluginException('522 - Request Timed Out') else: raise PluginException('Request Exception - Code: %s' % str(r.status_code)) else: soup = BeautifulSoup(r.text) if soup.find("h4", text=["Account Suspended"]): result['error'] = 'User Account Suspended' elif soup.find("p", text=["Page Exploded"]): result['error'] = '404 - User not found' elif soup.find("div", {'class': 'stats'}): # Check if user is unrated if soup.find('div', {'class': 'unqualified'}): result['rank'] = 'N/A' result['rating'] = 'N/A' # Else get their rank and rating else: rank = soup.find('div', text=['rank']).findNext('a').contents result['rank'] = '%s%s' % (rank[0].strip(), rank[1].text.strip()) result['rating'] = soup.find('div', text=['rating']).findNext('div').text.strip() # Get kills, deaths, and calculate kd ratio result['kills'] = soup.find('div', text=['kills']).findNext('div')['title'].split(' ')[0].strip() result['deaths'] = soup.find('div', text=['deaths']).findNext('div')['title'].split(' ')[0].strip() result['kd_ratio'] = '%.2f' % (float(result['kills']) / max(1, float(result['deaths']))) # Get objectives if there are any if soup.find('p', text=['No objectives completed']): result['wools'] = 0 result['cores'] = 0 result['monuments'] = 0 else: objectives = soup.find('div', {'id': 'objectives'}) result['wools'] = objectives.find('small', text=['wools placed']).parent.contents[0].strip() result['monuments'] = objectives.find('small', text=['monuments destroyed']).parent.contents[ 0].strip() result['cores'] = objectives.find('small', text=['cores leaked']).parent.contents[0].strip() else: raise PluginException('Invalid user!') return PlayerStats.build_slack_attachment(result)