from ast import match_case from urllib import response from disnake.ext import commands import disnake import db import requests import re from datetime import datetime, timedelta from loguru import logger class Calculate_Time(commands.Cog): def __init__(self,bot): self.bot = bot @commands.slash_command(description="Calculate your times like a pro") async def calculate_time(self,inter:disnake.ApplicationCommandInteraction): db.log_interaction(inter,f"Issued calculate_time") logger.info(f"{inter.author.display_name} Issued calculate time command") await inter.response.send_modal(timesModal()) @commands.Cog.listener() async def on_message_interaction(self,inter:disnake.MessageInteraction): if 'calc_time' in inter.component.custom_id: db.log_interaction(inter,f"Interracted with {inter.component.custom_id} on {inter.message.id}") match(inter.component.custom_id): case 'calc_time_delete': await inter.response.defer() await inter.message.delete() case 'calc_time_add': await inter.response.send_modal(timesModal(inter=inter)) case 'calc_time_new': await inter.response.send_modal(timesModal()) case 'calc_time_show_all': await inter.response.defer() await update_message(inter=inter,display_all_multipliers=True) case 'calc_time_multi': await inter.response.defer() with db.get_session()() as session: time_data_list = session.query(db.Time_Data).filter(db.Time_Data.message_id == inter.message.id).all() print(len(time_data_list)) for t in time_data_list: t.multiplier = int(inter.values[0][1]) session.commit() await update_message(inter=inter,time_data_list=time_data_list) def calc_times_from_modal(time_string,multi:int): #Split times timeList = re.split(',| ',time_string) times = [] try: for num,time_ in enumerate(timeList): if time_ == '': continue #Try and idiotproof some edge cases if time_.startswith((':',';','.')): temp_time = time_[1:] else: temp_time = time_ modifier = 0 if '|' in time_: temp = time_.split('|') name = temp[0] if name.startswith('>') or name.lower() == 'breaker': #Breaker if name.startswith('>'): name = name[1:] modifier = 10 temp_time = temp[1] else: name = f'{num+1}' time_components = [int(s) for s in re.split('\:|\;|\.',temp_time)] time_components.reverse() seconds = 0 for n,t in enumerate(time_components): seconds += t*60**n times.append({'name': name, 'seconds': seconds, 'multiplier': multi, 'modifier': modifier}) return times except: return [] class timesModal(disnake.ui.Modal): def __init__(self,multi=4,inter=None): self.inter = inter self.id = None if inter != None: self.id = inter.message.id components = [ disnake.ui.TextInput( label="name|hh:mm:ss or hh:mm:ss can add multiple", placeholder="Times to convert", custom_id="times", required=True, ), disnake.ui.TextInput( label="Time multiplier", placeholder="4", custom_id="multi_value", style= disnake.TextInputStyle.short, max_length=1, value = multi, ), ] super().__init__( title="Calculate attack times", custom_id="submit_calc", components=components ) async def callback(self, interaction: disnake.ModalInteraction): if self.id: await interaction.response.defer(ephemeral=True) else: await interaction.response.defer() times = interaction.text_values['times'] multi = int(interaction.text_values['multi_value']) #do tests on times: times_list = calc_times_from_modal(times,multi) if times_list: #Store relevant info time_data_list = [] if not self.id: message:disnake.Message = await interaction.followup.send("If you see this for long something went wrong") message_id = self.id or message.id with db.get_session()() as session: user:db.User = session.query(db.User).filter(db.User.discord_id == interaction.author.id).first() for t in times_list: time_data_list.append(db.Time_Data(message_id=message_id, user_id = user.id, **t)) session.add_all(time_data_list) session.commit() if self.id != None: await update_message(inter=interaction,override_inter=self.inter) else: await update_message(inter=interaction,time_data_list=time_data_list) else: await interaction.followup.send("Something went wrong.") return return async def update_message(inter:disnake.ApplicationCommandInteraction,time_data_list=None,display_all_multipliers=False,override_inter=None): if not time_data_list: with db.get_session()() as session: time_data_list = session.query(db.Time_Data).filter(db.Time_Data.message_id == inter.message.id).all() if not time_data_list: await inter.followup.edit("No time data found") return time_data_list.sort(key=lambda y: y.seconds) time_data_list.reverse() #Components components = [[],[]] components[0].append(disnake.ui.Select(placeholder="Change multiplier",options=["x2","x3","x4","x5","x6"],custom_id="calc_time_multi")) if len(time_data_list) == 1: components[1].append(disnake.ui.Button(label="Show All Multipliers", custom_id="calc_time_show_all")) components[1].append( disnake.ui.Button(label="Add time",custom_id="calc_time_add",style=disnake.ButtonStyle.green)) components[1].append( disnake.ui.Button(label="Create New",custom_id="calc_time_new",style=disnake.ButtonStyle.green)) components[1].append( disnake.ui.Button(label="Delete Message",custom_id="calc_time_delete",style=disnake.ButtonStyle.danger)) #Embed embed = disnake.Embed() embed.title = "Time Converter" embed.set_author(name='Storm Brigade',icon_url='https://i.imgur.com/Opk3fCq.png') embed.description = "Modifies any times to the desired card level\n Useful for prepping times from monk speeds" before_string = "" after_string = "" data: db.Time_Data if not display_all_multipliers: for data in time_data_list: emoji = '<:Captain:947543163608924181>' if data.modifier > 0: emoji = '<:Breaker:947543175025819709>' before_string += f"{emoji}**{data.name}**:{timedelta(seconds=data.seconds)} -**x{data.multiplier}**->\n" after_string += f"{timedelta(seconds=int(data.seconds/data.multiplier))}\n" else: for m in range(2,7): emoji = '<:Captain:947543163608924181>' before_string += f"{emoji}**{time_data_list[0].name}**:{timedelta(seconds=time_data_list[0].seconds)} -**x{m}**->\n" after_string += f"{timedelta(seconds=int(time_data_list[0].seconds/m))}\n" embed.add_field(name="Original",value=before_string) embed.add_field(name="Modified",value=after_string) if override_inter != None: await inter.followup.send("Added to the list, this message is required for now, sorry. Just dismiss it :)") await override_inter.edit_original_message(content="",embed=embed,components=components) else: await inter.edit_original_message(content="",embed=embed,components=components) def setup(bot): bot.add_cog(Calculate_Time(bot))