Beispiel #1
0
async def no_bento(user, ctx, difference):
    currency_number = user.crepes
    if currency_number is None:
        currency_number = 0

    emoji = get_emoji("crepe")

    title = "You are back already?"

    minutes_left = int(difference / 60)

    description = "Sorry, I don't have anything ready for you, " + mention_author(
        ctx) + "..."
    #description += " Please come back again later!"
    description += " Please come back again in **" + str(
        minutes_left) + "** min!"

    if currency_number > 1:
        footer = "There are " + str(
            currency_number) + " " + emoji.plural + " left in your bento box!"
    else:
        footer = "There is " + str(
            currency_number) + " " + emoji.name + " left in your bento box!"

    embed = discord.Embed()
    embed.color = Status.KO.value
    embed.title = title
    embed.description = description
    embed.set_footer(text=footer)
    embed.set_image(url="attachment://nope.png")
    await ctx.send(embed=embed, file=discord.File("./images/bento/nope.png"))
Beispiel #2
0
async def no_gacha(user, currency_number, ctx):
    emoji = get_emoji("crepe")
    emojiStr = emoji.toString(ctx)

    title = "Hold on! Who goes there?"

    description = "What do you think you are doing, " + mention_author(ctx) + "?"
    description += " Come back when you have something for me!"

    if currency_number == 1:
        footer = "There is " + str(currency_number) + " " + emoji.name + " left in your bento box!"
    else:
        footer = "There are " + str(currency_number) + " " + emoji.plural + " left in your bento box!"

    embed = discord.Embed()
    embed.color = Status.KO.value
    embed.title = title
    embed.description = description
    embed.set_footer(text=footer)
    embed.set_image(url="attachment://nope.png")
    await ctx.send(embed=embed, file=discord.File("./images/gacha/nope.png"))
Beispiel #3
0
async def pull_messages(ctx, currency_number, pulls, gacha_mode):
    emoji = get_emoji("crepe")
    emojiStr = emoji.toString(ctx)

    #title = "Hold on! Who goes there?"
    #description = "I guess I could let you pull if you share your " + emoji.name + " with me. But please, don't get addicted."
    #description += "\n" + mention_author(ctx) + " has shared one " + emojiStr + " with Ais!"

    title = "Nom nom... Fuwa fuwa! ♡"

    description = "The crepe was really good, " + mention_author(
        ctx) + "! Please take this:" + "\n"
    for pull in pulls:
        description += "🌟" * pull.stars + " [" + pull.unit_label + "] " + pull.character_name + "\n"

    if currency_number == 1:
        footer = "There is " + str(
            currency_number) + " " + emoji.name + " left in your bento box!"
    else:
        footer = "There are " + str(
            currency_number) + " " + emoji.plural + " left in your bento box!"

    if gacha_mode == GachaModes.IMG.value:
        img_path = "./images/gacha.png"
        create_image(img_path, pulls)
        await ctx.send(file=discord.File(img_path))
    else:
        #per_line = 5
        gif_path = "./images/gacha.gif"
        ms_per_frame = 500
        create_gif(gif_path, pulls, ms_per_frame)
        await ctx.send(file=discord.File(gif_path))

    embed = discord.Embed()
    embed.color = Status.OK.value
    embed.title = title
    embed.description = description
    embed.set_footer(text=footer)
    embed.set_image(url="attachment://yes.png")
    await ctx.send(embed=embed, file=discord.File("./images/gacha/yes.png"))
Beispiel #4
0
async def pageASHandler(client, ctx, temp_embed: discord.Embed, file_list,
                        stats_dict):
    """This handles the logic of the page handling for the single result assist

    Arguments:
        client {discord.client} -- the discord bot object
        ctx {discord.context} -- command message context
        temp_embed {discord.embed} -- assist stats/skills page
        file_list {list of pictures} -- images to be displayed for pages
        stats_dict {dict} -- the stats of the current unit
    """
    MAXLB = 5
    current_page = 0
    current_limitbreak = 0
    current_ha = 0
    page_list = [temp_embed]
    temp_embed.set_footer(text="Page {} of {}".format(current_page +
                                                      1, len(page_list)))

    limit_break_add = get_emoji("square_on").toString(ctx)
    limit_break_sub = get_emoji("square_off").toString(ctx)

    async def updateStats():
        temp_embed.description = limit_break_add * current_limitbreak + limit_break_sub * (
            MAXLB - current_limitbreak)
        # Stats
        temp_embed.set_field_at(0,
                                name="Stats",
                                value=await
                                assembleStats(stats_dict, current_limitbreak,
                                              "", current_ha),
                                inline=True)
        # Abilities
        temp_embed.set_field_at(1,
                                name="Abilities",
                                value=await
                                assembleAbilities(stats_dict,
                                                  current_limitbreak, "",
                                                  current_ha),
                                inline=True)

    await updateStats()
    msg = await ctx.send(files=file_list, embed=page_list[current_page])
    await msg.add_reaction(limit_break_sub)
    await msg.add_reaction(limit_break_add)

    # set_field_at(index, *, name, value, inline=True)
    def check(payload):
        return (
            str(payload.emoji) == limit_break_add
            or str(payload.emoji) == limit_break_sub
        ) and payload.user_id != client.user.id and payload.message_id == msg.id

    def wait_for_reaction(event_name):
        return client.wait_for(event_name, check=check)

    while True:
        pending_tasks = [
            wait_for_reaction("raw_reaction_add"),
            wait_for_reaction("raw_reaction_remove")
        ]
        done_tasks, pending_tasks = await asyncio.wait(
            pending_tasks, timeout=60.0, return_when=asyncio.FIRST_COMPLETED)

        timeout = len(done_tasks) == 0

        if not timeout:
            task = done_tasks.pop()

            reaction = await task

        for remaining in itertools.chain(done_tasks, pending_tasks):
            remaining.cancel()

        if timeout:
            page_list[current_page].color = Status.KO.value
            await msg.edit(embed=page_list[current_page])
            break

        if str(reaction.emoji) == limit_break_sub:
            if (current_limitbreak > 0):
                current_limitbreak = current_limitbreak - 1
            else:
                current_limitbreak = MAXLB
            await updateStats()
        if str(reaction.emoji) == limit_break_add:
            if (current_limitbreak < MAXLB):
                current_limitbreak = current_limitbreak + 1
            else:
                current_limitbreak = 0
            await updateStats()
        page_list[current_page].set_footer(
            text="Page {} of {}".format(current_page + 1, len(page_list)))
        await msg.edit(embed=page_list[current_page])
Beispiel #5
0
async def pageAdHandler(client, ctx, temp_embed: discord.Embed, file_list,
                        dev_embed, stats_dict, unit_type, ascended):
    """This handles the logic of the page handling for the single result adventurer

    Arguments:
        client {discord.client} -- the discord bot object
        ctx {discord.context} -- command message context
        temp_embed {discord.embed} -- adventurer stats/skills page
        file_list {list of pictures} -- images to be displayed for pages
        dev_embed {discord.embed} -- the adventurer development page
        stats_dict {dict} -- the stats of the current unit
        unit_type {string} -- balance,physical,magical for stats calculation
        ascended {bool} -- adventurer has hero ascension or not
    """
    MAXLB = 5
    MAXHA = 6
    current_page = 0
    current_limitbreak = 0
    current_ha = 0
    page_list = [temp_embed, dev_embed]
    temp_embed.set_footer(text="Page {} of {}".format(current_page +
                                                      1, len(page_list)))

    emoji1 = '\u2b05'
    emoji2 = '\u27a1'
    limit_break_add = get_emoji("square_on").toString(ctx)
    limit_break_sub = get_emoji("square_off").toString(ctx)
    hero_ascend_add = get_emoji("star_on").toString(ctx)
    hero_ascend_sub = get_emoji("star_off").toString(ctx)

    async def updateStats():
        temp_embed.description = limit_break_add * current_limitbreak + limit_break_sub * (
            MAXLB - current_limitbreak)
        if (ascended):
            temp_embed.description = temp_embed.description + "    " + hero_ascend_add * current_ha + hero_ascend_sub * (
                MAXHA - current_ha)
        # Stats
        temp_embed.set_field_at(0,
                                name="Stats",
                                value=await
                                assembleStats(stats_dict, current_limitbreak,
                                              unit_type, current_ha),
                                inline=True)
        # Abilities
        temp_embed.set_field_at(1,
                                name="Abilities",
                                value=await
                                assembleAbilities(stats_dict,
                                                  current_limitbreak,
                                                  unit_type, current_ha),
                                inline=True)

    await updateStats()
    if (file_list != None):
        msg = await ctx.send(files=file_list, embed=page_list[current_page])
    else:
        msg = await ctx.send(embed=page_list[current_page])
    await msg.add_reaction(emoji1)
    await msg.add_reaction(emoji2)
    await msg.add_reaction(limit_break_sub)
    await msg.add_reaction(limit_break_add)
    if (ascended):
        await msg.add_reaction(hero_ascend_sub)
        await msg.add_reaction(hero_ascend_add)

    # set_field_at(index, *, name, value, inline=True)
    def check(payload):

        return (
            str(payload.emoji) == emoji2 or str(payload.emoji) == emoji1
            or str(payload.emoji) == hero_ascend_add or str(payload.emoji)
            == hero_ascend_sub or str(payload.emoji) == limit_break_add
            or str(payload.emoji) == limit_break_sub
        ) and payload.user_id != client.user.id and payload.message_id == msg.id

    def wait_for_reaction(event_name):
        return client.wait_for(event_name, check=check)

    while True:
        pending_tasks = [
            wait_for_reaction("raw_reaction_add"),
            wait_for_reaction("raw_reaction_remove")
        ]
        done_tasks, pending_tasks = await asyncio.wait(
            pending_tasks, timeout=60.0, return_when=asyncio.FIRST_COMPLETED)

        timeout = len(done_tasks) == 0

        if not timeout:
            task = done_tasks.pop()

            reaction = await task

        for remaining in itertools.chain(done_tasks, pending_tasks):
            remaining.cancel()

        if timeout:
            page_list[current_page].color = Status.KO.value
            await msg.edit(embed=page_list[current_page])
            break

        # left
        if str(reaction.emoji) == emoji1:
            if (current_page > 0):
                current_page = current_page - 1
            else:
                current_page = len(page_list) - 1
        # right
        if str(reaction.emoji) == emoji2:
            if (current_page + 1 < len(page_list)):
                current_page = current_page + 1
            else:
                current_page = 0
        if str(reaction.emoji) == limit_break_sub:
            if (current_limitbreak > 0):
                current_limitbreak = current_limitbreak - 1
            else:
                current_limitbreak = MAXLB
            await updateStats()
        if str(reaction.emoji) == limit_break_add:
            if (current_limitbreak < MAXLB):
                current_limitbreak = current_limitbreak + 1
            else:
                current_limitbreak = 0
            await updateStats()
        if str(reaction.emoji) == hero_ascend_sub and ascended:
            if (current_ha > 0):
                current_ha = current_ha - 1
            else:
                current_ha = MAXHA
            await updateStats()
        if str(reaction.emoji) == hero_ascend_add and ascended:
            if (current_ha < MAXHA):
                current_ha = current_ha + 1
            else:
                current_ha = 0
            await updateStats()
        page_list[current_page].set_footer(
            text="Page {} of {}".format(current_page + 1, len(page_list)))
        await msg.edit(embed=page_list[current_page])
Beispiel #6
0
async def detailed_message(user, client, ctx, *args):
    crepes = user.crepes
    if crepes is None:
        crepes = 0

    currency_lines = []
    currency_line = str(crepes) + " x " + get_emoji("crepe").toString(
        ctx) + "\n"
    currency_lines.append(currency_line)

    units = []
    if user.units is not None:
        for key in user.units:
            units.append(user.units[key])
    print(units)

    units = sorted(units, key=operator.itemgetter("character_name"))
    units = sorted(units, key=operator.itemgetter("unit_label"))
    units = sorted(units, key=operator.itemgetter("unit_type"))
    units = sorted(units, key=operator.itemgetter("stars"), reverse=True)

    units_lines = []
    for unit in units:
        units_line = "🌟" * unit["stars"]
        if unit["unit_type"] == "adventurer":
            units_line += " " + get_emoji("ad_filter").toString(ctx)
        elif unit["unit_type"] == "assist":
            units_line += " " + get_emoji("as_filter").toString(ctx)
        units_line += " [" + unit["unit_label"] + "] " + unit[
            "character_name"] + ": " + str(unit["number"]) + "\n"
        units_lines.append(units_line)

    title = get_author(ctx) + "'s profile"

    current_page = 0
    per_page = 20
    number_pages = math.ceil(len(units_lines) / per_page)
    if number_pages == 0:
        number_pages = 1

    description = build_description(currency_lines, units_lines, current_page,
                                    per_page)

    footer_number = "Total distinct number: " + str(len(units_lines))
    footer_page = "Page {} of {}".format(current_page + 1, number_pages)
    footer = footer_number + "\n" + footer_page

    embed = discord.Embed()
    embed.color = Status.OK.value
    embed.set_thumbnail(url=ctx.message.author.avatar_url)
    embed.title = title
    embed.description = description
    embed.set_footer(text=footer)
    msg = await ctx.send(embed=embed)

    if number_pages == 1:
        return

    # update description with reactions
    emoji_left_arrow = "\u2b05"
    emoji_right_arrow = "\u27a1"
    emojis = [emoji_left_arrow, emoji_right_arrow]
    for emoji in emojis:
        await msg.add_reaction(emoji)

    while True:
        pending_tasks = [
            wait_for_reaction(client, msg.id, emojis, "reaction_add"),
            wait_for_reaction(client, msg.id, emojis, "reaction_remove")
        ]
        done_tasks, pending_tasks = await asyncio.wait(
            pending_tasks, timeout=60.0, return_when=asyncio.FIRST_COMPLETED)

        timeout = len(done_tasks) == 0

        if not timeout:
            task = done_tasks.pop()

            reaction, user = await task

        for remaining in itertools.chain(done_tasks, pending_tasks):
            remaining.cancel()

        if timeout:
            embed.color = Status.KO.value
            await msg.edit(embed=embed)
            break

        emoji = str(reaction.emoji)

        if emoji == emoji_left_arrow:
            current_page = (current_page - 1) % number_pages
        elif emoji == emoji_right_arrow:
            current_page = (current_page + 1) % number_pages

        embed.description = build_description(currency_lines, units_lines,
                                              current_page, per_page)

        footer_page = "Page {} of {}".format(current_page + 1, number_pages)
        footer = footer_number + "\n" + footer_page
        embed.set_footer(text=footer)

        await msg.edit(embed=embed)
Beispiel #7
0
async def summary_message(user, client, ctx, *args):
    crepes = user.crepes
    if crepes is None:
        crepes = 0

    currency_lines = []
    currency_line = str(crepes) + " x " + get_emoji("crepe").toString(
        ctx) + "\n"
    currency_lines.append(currency_line)

    units = []
    if user.units is not None:
        for key in user.units:
            units.append(user.units[key])
    print(units)

    units = sorted(units, key=operator.itemgetter("number"), reverse=True)
    units = sorted(units, key=operator.itemgetter("unit_type"))
    units = sorted(units, key=operator.itemgetter("stars"), reverse=True)

    sorted_categories = []
    previous_category = None
    previous_number = None
    for unit in units:
        category = "🌟" * unit["stars"]
        if unit["unit_type"] == "adventurer":
            category += " " + get_emoji("ad_filter").toString(ctx)
        elif unit["unit_type"] == "assist":
            category += " " + get_emoji("as_filter").toString(ctx)
        if unit["number"] > 1:
            number = min(unit["number"] - 1, 5)
            category += " " + get_emoji("limitbreak_" +
                                        str(number)).toString(ctx)

        if category == previous_category:
            previous_number += 1
            sorted_categories[-1] = (category, previous_number)
        else:
            previous_category = category
            previous_number = 1
            sorted_categories.append((category, previous_number))

    title = get_author(ctx) + "'s summary profile"

    units_lines = []
    for item in sorted_categories:
        units_line = item[0] + " x " + str(item[1]) + "\n"
        units_lines.append(units_line)

    description = ""
    for line in currency_lines:
        description += line
    for i in range(len(units_lines)):
        description += units_lines[i]

    footer = "Total distinct number: " + str(user.units_distinct_number) + "\n"
    footer += "Score: " + str(user.units_score)

    embed = discord.Embed()
    embed.color = Status.OK.value
    embed.set_thumbnail(url=ctx.message.author.avatar_url)
    embed.title = title
    embed.description = description
    embed.set_footer(text=footer)
    await ctx.send(embed=embed)
Beispiel #8
0
async def skillSearchRotatingPage(client, ctx, search, page_list,
                                  total_results, icons):
    """This handles the message scrolling of the skill search and all the other
    page logic

    Arguments:
        client {discord.client} -- the discord bot object
        ctx {discord.context} -- command message context
        search {string} -- the search query
        page_list {list of list} -- list of pages, Pages are lists with skills. Skills are tuples with [TITLE + NAME, SKILL INFO, FILTERS]
        total_results {int} -- total number of results from the query
        icons {BytesIO} -- image for the characters being searched
    """
    filters = []
    current_page_list = page_list
    current_page = 0

    def filterAddRemove(name):
        if name in filters:
            filters.remove(name)
        else:
            filters.append(name)
        current_page_list = []
        print(filters)
        temp_page = []
        current_page_list.append(temp_page)
        for pages in page_list:
            for skills in pages:
                is_filtered = True
                for items in filters:
                    if (not (items in skills[2])):
                        is_filtered = False
                if is_filtered:
                    temp_page.append(skills)
                if len(temp_page) == 4:
                    temp_page = []
                    current_page_list.append(temp_page)
        print(current_page_list)
        # remove last empty list
        if (len(current_page_list[len(current_page_list) - 1]) == 0):
            current_page_list.pop(len(current_page_list) - 1)
        return current_page_list

    temp_image_url = "attachment://"
    # set up
    temp_embed = discord.Embed()
    temp_embed.set_image(url=temp_image_url + "temp.png")

    temp_embed.color = 3066993
    temp_embed.title = "{} results for {}".format(str(total_results), search)
    if (len(current_page_list) == 0):
        current_page_list.append(
            [["No relevant skills to display", "End of List"]])
    temp_embed.set_footer(
        text="Page {} of {}".format(current_page + 1, len(current_page_list)))

    def clearSetField(temp_embed: discord.Embed, field_list):
        temp_embed.description = "**Current Filters:** {}".format(str(filters))
        temp_embed.clear_fields()
        for skills in field_list:
            temp_embed.add_field(value=skills[1], name=skills[0], inline=False)
        return temp_embed

    temp_embed = clearSetField(temp_embed,
                               field_list=current_page_list[current_page])
    msg = await ctx.send(embed=temp_embed,
                         file=discord.File(icons, filename="temp.png"))
    emoji1 = '\u2b05'
    emoji2 = '\u27a1'
    ad_filter = get_emoji("ad_filter").toString(ctx)
    as_filter = get_emoji("as_filter").toString(ctx)
    await msg.add_reaction(emoji1)
    await msg.add_reaction(emoji2)
    await msg.add_reaction(ad_filter)
    await msg.add_reaction(as_filter)

    emojis = [emoji1, emoji2]

    def check(reaction, user):
        return (str(reaction.emoji) == emoji2 or str(reaction.emoji) == emoji1
                or str(reaction.emoji) == ad_filter
                or str(reaction.emoji) == as_filter
                ) and user != client.user and reaction.message.id == msg.id

    def wait_for_reaction(event_name):
        return client.wait_for(event_name, check=check)

    while True:
        pending_tasks = [
            wait_for_reaction("reaction_add"),
            wait_for_reaction("reaction_remove")
        ]
        done_tasks, pending_tasks = await asyncio.wait(
            pending_tasks, timeout=60.0, return_when=asyncio.FIRST_COMPLETED)

        timeout = len(done_tasks) == 0

        if not timeout:
            task = done_tasks.pop()

            reaction, user = await task

        for remaining in itertools.chain(done_tasks, pending_tasks):
            remaining.cancel()

        if timeout:
            temp_embed.color = Status.KO.value
            await msg.edit(embed=temp_embed)
            break

        # left
        if str(reaction.emoji) == emoji1:
            if (current_page > 0):
                current_page = current_page - 1
            else:
                current_page = len(current_page_list) - 1
        # right
        if str(reaction.emoji) == emoji2:
            if (current_page + 1 < len(current_page_list)):
                current_page = current_page + 1
            else:
                current_page = 0
        # FILTERS
        if str(reaction.emoji) == ad_filter:
            current_page_list = filterAddRemove("adventurer")
            current_page = 0
        if str(reaction.emoji) == as_filter:
            current_page_list = filterAddRemove("assist")
            current_page = 0
        if (len(current_page_list) == 0):
            current_page_list.append(
                [["No relevant skills to display", "End of List"]])
        temp_embed.set_footer(
            text="Page {} of {}".format(current_page +
                                        1, len(current_page_list)))
        temp_embed = clearSetField(temp_embed,
                                   field_list=current_page_list[current_page])
        await msg.edit(embed=temp_embed)
Beispiel #9
0
async def run(db_config, ctx):
    author = str(ctx.message.author)
    authorUniqueId = str(ctx.message.author.id)
    content = ctx.message.content

    print("\nReceived message from '" + author + "(" + authorUniqueId +
          ")' with content '" + content + "'")

    user = User.get_user(db_config, author, authorUniqueId)

    now = datetime.datetime.now(datetime.timezone.utc)

    previous_bento = user.last_bento_date
    if previous_bento is not None:
        next_bracket = previous_bento.replace(microsecond=0,
                                              second=0,
                                              minute=0)
        if previous_bento.hour % 2 == 0:
            next_bracket += datetime.timedelta(hours=1)
        else:
            next_bracket += datetime.timedelta(hours=2)

        print("previous_bento:", previous_bento)
        print("next_bracket:", next_bracket)
        next_bracket = next_bracket.replace(tzinfo=datetime.timezone.utc)
        print("next_bracket aware:", next_bracket)

        difference = (next_bracket - now).total_seconds()
        print("now:", now)
        print("difference:", difference)
        if difference > 0:
            await no_bento(user, ctx, difference)
            return

    currency_number = user.crepes
    if currency_number is None:
        currency_number = 0
    currency_number += 1

    user.crepes = currency_number
    user.last_bento_date = now

    user.update_user(db_config, now, content)

    emoji = get_emoji("crepe")
    emoji_str = emoji.toString(ctx)

    title = "Wait! Are you going to the dungeon today? Please take this with you! >///<"

    description = mention_author(ctx) + " has received a " + emoji_str + "!"

    if currency_number == 1:
        footer = "There is " + str(
            currency_number) + " " + emoji.name + " left in their bento box!"
    else:
        footer = "There are " + str(
            currency_number) + " " + emoji.plural + " left in their bento box!"

    embed = discord.Embed()
    embed.color = Status.OK.value
    embed.title = title
    embed.description = description
    embed.set_footer(text=footer)
    embed.set_image(url="attachment://yes.png")
    await ctx.send(embed=embed, file=discord.File("./images/bento/yes.png"))