def test_get_user(self, mock_query_website): # Success case mock_query_website.return_value = [{ "id": 29016, "username": "******" }] actual = get_user("qchrisd") self.assertEqual(actual, {"id": 29016, "username": "******"}) # Fail case mock_query_website.return_value = [] actual = get_user("qchrisd") self.assertEqual(actual, None)
def test_top_palyers(self): # fail case actual = get_user("qchrisd", lambda _: {"success": False}) self.assertEqual(actual, None) # success case actual = get_user( "qchrisd", lambda _: { "success": True, "players": [{ "rank": 1139, "id": 29016 }] }) self.assertEqual(actual, {"rank": 1139, "id": 29016})
async def elo(self, ctx, fault_name: str = None): """ Gets ELO for a player and sends an embed with the info. """ if fault_name == None: guild_id = str(ctx.guild.id) discord_name = f"{ctx.author.name}#{ctx.author.discriminator}" users_json = helpers.read_file("./bot/users.json") users_dict = helpers.decode_json(users_json) user = helpers.get_from_dict(users_dict, guild_id, discord_name) # Log log.info(f"Getting elo for {discord_name}.") if user == None: await ctx.send( f"I couldn't find any registered Fault user name for {discord_name} user. Try using /register to save one." ) log.error(f"Failed to find user {discord_name} in users.json.") return else: user = api.get_user(fault_name) if user == None: await ctx.send( f"I couldn't find {fault_name}. Check your spelling and try again." ) log.error( f"Failed to get user {fault_name} from Fault website.") return user_elo = api.get_elo(user) avatar_link = api.get_player_avatar(user) embed_message = helpers.embed_elo(user['username'], user_elo['eloTitle'], user_elo['MMR'], user_elo['ranking'], avatar_link['avatarURI']) # Adds rank image to embed. This uploads the image every time. # TODO figure out how to use a CDN to be able to pass a url and not upload images for every call rank_image = discord.File( f"./assets/icons_rank/{user_elo['eloTitle']}.png", filename=f"{user_elo['eloTitle']}.png") embed_message.set_thumbnail( url=f"attachment://{user_elo['eloTitle']}.png") await ctx.send(embed=embed_message, file=rank_image)
async def match(self, ctx, fault_name: str = None, number: int = None, match_id: str = None): """ Gets match information for a given user or registered user. Currently supports only one match. """ await ctx.send("Getting your match data...") if fault_name == None: guild_id = str(ctx.guild.id) discord_name = f"{ctx.author.name}#{ctx.author.discriminator}" users_json = helpers.read_file("./bot/users.json") users_dict = helpers.decode_json(users_json) user = helpers.get_from_dict(users_dict, guild_id, discord_name) # Log log.info(f"Getting elo for {discord_name}.") if user == None: await ctx.send( f"I couldn't find any registered Fault user name for {discord_name} user. Try using /register to save one." ) log.error(f"Failed to find user {discord_name} in users.json.") return else: user = api.get_user(fault_name) if user == None: await ctx.send( f"I couldn't find {fault_name}. Check your spelling and try again." ) log.error( f"Failed to get user {fault_name} from Fault website.") return user_match = api.get_matches(user) match = api.get_match_data(user_match['id']) _, id_to_hero = api.get_hero_dicts() embeds = helpers.embed_match(match, id_to_hero, fault_name) await ctx.send(embeds=embeds)
async def register_fault_username(self, ctx: slash_util.Context, fault_name: str): """ Registers or updates a discord user's name in a JSON for persistent storage. If the JSON is blank or doesn't exist it is created. If the JSON exists, it is updated and rewritten. """ # Some variables for easy access guild_id = str(ctx.guild.id) discord_name = f"{ctx.author.name}#{ctx.author.discriminator}" # Log log.info(f"Registering {discord_name}") users_json = helpers.read_file("./bot/users.json") users_dict = helpers.decode_json(users_json) fault_user = api.get_user(fault_name) if fault_user == None: await ctx.send( f"Sorry, I couldn't find **{fault_name}**. Check your spelling and try again." ) log.error(f"Failed to find {fault_name}.") return new_dict = helpers.update_dict(users_dict, guild_id, discord_name, fault_user) helpers.write_file("./bot/users.json", new_dict) # Send confirmation of completion to the messenger await ctx.send( f"Your Fault username has been updated to **{fault_user['username']}** (id: {fault_user['id']}). Use this command again if you would like to change it." )
def embed_match(match_details, id_to_hero, fault_name): """ Create two embeds, one for the winning team and one for the losing team. """ colors = {"win":0x00dc04, "lose":0xef0000} footer = {"text":f"{match_details['TimeLength']} - id:{match_details['ID']}"} team_win = match_details['Winner'] team_lose = int(not match_details['Winner']) embeds_win = [] embeds_lose = [] elo_win = 0 elo_lose = 0 for player in match_details['Players']: try: kda = (player['Kills']+player['Assists'])/player['Deaths'] except ZeroDivisionError as e: kda = player['Kills']+player['Assists'] fields = [] fields.append({"name":"ELO", "value":f"{player['MMR']} ({player['MMRChange']})", "inline":True}) fields.append({"name":"K/D/A", "value":f"{player['Kills']}/{player['Deaths']}/{player['Assists']} ({kda:.1f})", "inline":True}) fields.append({"name":"CS", "value":f"{player['CS']}", "inline":True}) author_icon_url = api.get_player_avatar(api.get_user(player['Username']))['avatarURI'] author_name = f"{player['Username']}" if author_name == fault_name: author_name += u" U+1F3AE" author = {"name":author_name, "icon_url":author_icon_url} thumbnail = {"url":api.get_image_hero_portrait(player['HeroID'])} title = f"{id_to_hero[player['HeroID']]} - lvl {player['HeroLevel']}" if player['Team'] == match_details['Winner']: elo_win += player['MMR'] embeds_win.append({ "color":colors['win'], "author":author, "thumbnail":thumbnail, "title":title, "fields":fields }) else: elo_lose += player['MMR'] embeds_lose.append({ "color":colors['lose'], "author":author, "thumbnail":thumbnail, "title":title, "fields":fields }) elo_win_average = elo_win/(len(match_details['Players'])/2) elo_lose_average = elo_lose/(len(match_details['Players'])/2) embeds = embeds_win + embeds_lose embeds = [discord.Embed.from_dict(x) for x in embeds] return embeds