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"))
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"))
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"))
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])
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])
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)
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)
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)
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"))