async def METHOD_NAME(self, ctx: commands.Context) -> None:
    """
    Play Madlibs with the bot!
    Madlibs is a game where the player is asked to enter a word that
    fits a random part of speech (e.g. noun, adjective, verb, plural noun, etc.)
    a random amount of times, depending on the story chosen by the bot at the beginning.
    """
    random_template = choice(self.templates)
    def author_check(message: discord.Message) -> bool:
        return message.channel.id == ctx.channel.id and message.author.id == ctx.author.id
    self.checks.add(author_check)
    loading_embed = discord.Embed(
        title="Madlibs", description="Loading your Madlibs game...", color=Colours.python_blue
    )
    original_message = await ctx.send(embed=loading_embed)
    submitted_words = {}
    for i, part_of_speech in enumerate(random_template["blanks"]):
        inputs_left = len(random_template["blanks"]) - i
        madlibs_embed = self.madlibs_embed(part_of_speech, inputs_left)
        await original_message.edit(embed=madlibs_embed)
        try:
            message = await self.bot.wait_for("message", check=author_check, timeout=TIMEOUT)
        except TimeoutError:
            timeout_embed = discord.Embed(
                title=choice(NEGATIVE_REPLIES),
                description="Uh oh! You took too long to respond!",
                color=Colours.soft_red
            )
            await ctx.send(ctx.author.mention, embed=timeout_embed)
            for msg_id in submitted_words:
                self.edited_content.pop(msg_id, submitted_words[msg_id])
            self.checks.remove(author_check)
            return
        submitted_words[message.id] = message.content
    blanks = [self.edited_content.pop(msg_id, submitted_words[msg_id]) for msg_id in submitted_words]
    self.checks.remove(author_check)
    story = []
    for value, blank in zip(random_template["value"], blanks, strict=True):
        story.append(f"{value}__{blank}__")
    # In each story template, there is always one more "value"
    # (fragment from the story) than there are blanks (words that the player enters)
    # so we need to compensate by appending the last line of the story again.
    story.append(random_template["value"][-1])
    story_embed = discord.Embed(
        title=random_template["title"],
        description="".join(story),
        color=Colours.bright_green
    )
    story_embed.set_footer(text=f"Generated for {ctx.author}", icon_url=ctx.author.display_avatar.url)
    await ctx.send(embed=story_embed)