Exemple #1
0
 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)
Exemple #2
0
 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})
Exemple #3
0
    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)
Exemple #4
0
    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)
Exemple #5
0
    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."
        )
Exemple #6
0
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