Exemple #1
0
 async def get_subcats(self, game_id, category):
     catdict = await self.get_cats(game_id)
     try:
         cat_id = catdict[pformat(category)]["id"]
     except KeyError:
         return
     data = await self.get(f"games/{game_id}/variables")
     data = data["data"]
     subcategory = {}
     for i in data:
         if (i["is-subcategory"] and i["scope"]["type"] == "full-game"
                 and i["category"] == cat_id):
             for e in i["values"]["values"]:
                 subcategory[pformat(i["values"]["values"][e]["label"])] = {
                     "name": i["values"]["values"][e]["label"],
                     "subcat_id": i["id"],
                     "id": e,
                 }
         if (i["is-subcategory"] and i["scope"]["type"] == "full-game"
                 and not i["category"]):
             for e in i["values"]["values"]:
                 subcategory[pformat(i["values"]["values"][e]["label"])] = {
                     "name": i["values"]["values"][e]["label"],
                     "subcat_id": i["id"],
                     "id": e,
                 }
     return {
         category: {
             "id": cat_id,
             "name": catdict[category]["name"],
             "sub_cats": subcategory,
         }
     }
Exemple #2
0
 async def get_cats(self, game_id):
     categories = {}
     data = await self.get(f"games/{game_id}/categories")
     data = data["data"]
     for category in data:
         if category["type"] == "per-game":
             categories[pformat(category["name"])] = {
                 "id": category["id"],
                 "name": category["name"],
             }
     return categories
Exemple #3
0
 async def categories(self, ctx, game):
     """Get speedrun categories for a specific game."""
     games = await self.src.get_games(game, embeds=["categories"])
     e = discord.Embed(
         title=f"{games[0].name} Categories",
         colour=discord.Colour.gold(),
     )
     e.set_author(
         name=f"speedrun.com",
         icon_url=self.LOGO,
     )
     e.set_thumbnail(url=str(games[0].assets["cover-large"]))
     for cat in games[0].categories:
         e.add_field(name=cat.name, value=pformat(cat.name), inline=False)
     await ctx.send(embed=e)
Exemple #4
0
    async def get_anime(self,
                        keyword: str,
                        page: int,
                        amount: int = 1,
                        _format: str = None):
        """
        Get anime from anilist, was called `search_ani`

        Parameter
        ---------
        keyword: str
            Name/ID of an anime.
        _format: str
            MediaFormat, format of the anime, MOVIE, TV Show, etc. [-]
        page: int
            Number of selected page.
        amount: int
            Anime per page. (default: 1)
        
        Note
        ----
        [-] -> Only for `>anime search` or `query.animeInfo`
        """
        _id = None
        try:
            _id = await self.fetch_id(keyword)
        except AnimeNotFound:
            pass

        if _id:
            q = await self.request(query.animeInfo, {"mediaId": _id})
            # maybe it's not id afterall?
            if not q:
                pass
            return q["data"]

        var = {"name": keyword, "page": page, "amount": amount}
        # Add aniformat if _type is not empty/None
        if _format:
            var["aniformat"] = str(
                difflib.get_close_matches(pformat(_format),
                                          self.format["anime"])[0]).upper()
        q = await self.request(query.searchAni, var)
        if not q:
            return
        return q["data"]
Exemple #5
0
    async def worldrecord(self,
                          ctx,
                          game,
                          category: str = None,
                          sub_category: str = None):
        """Get the world record for a specific game."""
        _ = game
        game = await self.get_game(game)
        if not game:
            return await ctx.send("There's no game called `{}`".format(_))
        game = game[0]
        link = f"games/{game['id']}/records?miscellaneous=no&scope=full-game&top=1"
        if category:
            cat_dict = await self.get_subcats(game["id"], pformat(category))
            if not cat_dict:
                return await ctx.send(
                    f"This game doesn't have a category called {category}")
            link = f"leaderboards/{game['id']}/category/{cat_dict[pformat(category)]['id']}?top=1"
        var_link = ""
        if (sub_category and pformat(sub_category)
                in cat_dict[pformat(category)]["sub_cats"]):
            sub_cats = cat_dict[pformat(category)]["sub_cats"]
            var_link = ("&var-" +
                        sub_cats[pformat(sub_category)]["subcat_id"] + "=" +
                        sub_cats[pformat(sub_category)]["id"])

        # Get data from speedrun.com api
        data = await self.get(link + var_link +
                              "&embed=game,category,players,platforms,regions")
        data = data["data"]
        if not category:
            data = data[0]
            category = data["category"]["data"]["name"]
            cat_dict = await self.get_subcats(game["id"], pformat(category))
        if not data:
            return

        players = []
        for i in data["players"]["data"]:
            try:
                players.append(i["names"]["international"])
            except KeyError:
                players.append(i["name"])

        e = discord.Embed(
            title=realtime(data["runs"][0]["run"]["times"]["primary_t"]) +
            " by " + ", ".join(players),
            colour=discord.Colour.gold(),
            url=data["runs"][0]["run"]["weblink"],
        )
        e.set_thumbnail(
            url=data["game"]["data"]["assets"]["cover-large"]["uri"])
        e.set_author(
            name=f"{game['name']} - {cat_dict[pformat(category)]['name']}",
            icon_url=self.LOGO,
        )
        e.add_field(name="Date Played",
                    value=data["runs"][0]["run"]["date"],
                    inline=False)
        e.add_field(name="Played On",
                    value=data["platforms"]["data"][0]["name"],
                    inline=False)
        await ctx.send(embed=e)
Exemple #6
0
    async def leaderboard(self,
                          ctx,
                          game: str,
                          category: str = None,
                          sub_category: str = None):
        """Get leaderboard for a specific game."""
        _ = game
        game = await self.get_game(game)
        if not game:
            return await ctx.send("There's no game called `{}`".format(_))
        game = game[0]
        link = f"games/{game['id']}/records?miscellaneous=no&scope=full-game&top=10"
        if category:
            cat_dict = await self.get_subcats(game["id"], pformat(category))
            if not cat_dict:
                return await ctx.send(
                    f"This game doesn't have a category called {category}")
            link = f"leaderboards/{game['id']}/category/{cat_dict[pformat(category)]['id']}?top=10"
        var_link = ""
        if (sub_category and pformat(sub_category)
                in cat_dict[pformat(category)]["sub_cats"]):
            sub_cats = cat_dict[pformat(category)]["sub_cats"]
            var_link = ("&var-" +
                        sub_cats[pformat(sub_category)]["subcat_id"] + "=" +
                        sub_cats[pformat(sub_category)]["id"])

        # Get data from speedrun.com api
        data = await self.get(link + var_link +
                              "&embed=game,category,players,platforms,regions")
        data = data["data"]
        if not category:
            data = data[0]
            category = data["category"]["data"]["name"]
            cat_dict = await self.get_subcats(game["id"], pformat(category))
        cat_name = data["category"]["data"]["name"]
        if not data:
            return

        # Get all players
        players = {}
        for player in data["players"]["data"]:
            try:
                players[player["id"]] = player["names"]["international"]
            except KeyError:
                players[player["name"]] = player["name"]

        # Get all platforms
        platforms = {}
        for platform in data["platforms"]["data"]:
            platforms[platform["id"]] = platform["name"]

        # Init discord Embed
        e = discord.Embed(
            title="Leaderboard",
            colour=discord.Colour.gold(),
            url=data["runs"][0]["run"]["weblink"],
        )

        e.set_author(
            name=cat_name,
            url=data["category"]["data"]["weblink"],
            icon_url=self.LOGO,
        )

        for run in data["runs"]:
            # Get run's players
            run_players = []
            for player in run["run"]["players"]:
                if player["rel"] == "user":
                    run_players.append(players[player["id"]])
                elif player["rel"] == "guest":
                    run_players.append(players[player["name"]])
                else:
                    # Something is wrong, lets just return None D:
                    return
            e.add_field(
                name=f"{run['place']}. " + ", ".join(run_players) + " in " +
                realtime(run["run"]["times"]["primary_t"]),
                value=f"Date Played `{run['run']['date']}` | " +
                f"Played on `{platforms[run['run']['system']['platform']]}` | "
                +
                f"[Watch the run]({await self.generate_tinyUrl(run['run']['weblink'])})",
                inline=False,
            )

        e.set_thumbnail(
            url=data["game"]["data"]["assets"]["cover-large"]["uri"])
        await ctx.send(embed=e)
Exemple #7
0
    async def mcbe_wrs(
        self,
        ctx,
        category: str = "any",
        seed: str = "set_seed",
        leaderboard: str = "main",
    ):
        """Get mcbe world records from speedrun.com"""

        if leaderboard == "main":
            leaderboard = "mcbe"
        elif leaderboard == "ext":
            leaderboard = "mcbece"
        else:
            await ctx.send(
                f"Usage: {ctx.prefix}mcbe wrs [category] [seed] [main/ext]")
            return

        # preparation
        game = await self.get_game(leaderboard)
        game = game[0]

        # fetch subcats
        category = pformat(category)
        subcats = await self.get_subcats(game["id"], category)

        # get category id and display_name also separate subcats
        cat_name = subcats[category]["name"]
        cat_id = subcats[category]["id"]
        subcats = subcats[category]["sub_cats"]

        # separate seeds and platforms
        seeds = {}
        platforms = {}
        for i in subcats:
            if "seed" in i.lower():
                seeds[pformat(i)] = subcats[i]
                # seeds.append({pformat(i): subcats[i]})
            else:
                platforms[pformat(i)] = subcats[i]
                # platforms.append({pformat(i): subcats[i]})

        # get the right seed type
        sel_seed = ""
        if seed in seeds:
            sel_seed = seed
        varlink = f"&var-{seeds[sel_seed]['subcat_id']}={seeds[sel_seed]['id']}"

        # init embed
        e = discord.Embed(title="World Records", colour=discord.Colour.gold())
        e.set_thumbnail(
            url=
            "https://raw.githubusercontent.com/null2264/null2264/master/assets/mcbe.png"
        )

        # get all platform wrs
        for platform in platforms:
            pf_varlink = (
                f"&var-{platforms[platform]['subcat_id']}={platforms[platform]['id']}"
            )
            data = await self.get(
                f"leaderboards/{game['id']}/category/{category}?top=1&embed=players{varlink}{pf_varlink}"
            )
            data = data["data"]
            rundata = data["runs"]
            runners = []
            for _runners in data["players"]["data"]:
                runners.append(_runners["names"]["international"])
            runners = ", ".join(runners)
            e.add_field(
                name=platforms[platform]["name"],
                value=
                f"{runners} (**[{realtime(rundata[0]['run']['times']['realtime_t'])}]({rundata[0]['run']['weblink']})**)",
                inline=False,
            )

        # finalize embed the send it
        e.set_author(
            name=f"MCBE - {cat_name} - {seeds[sel_seed]['name']}",
            icon_url=self.LOGO,
        )
        await ctx.send(embed=e)