195 lines
8.3 KiB
Python
195 lines
8.3 KiB
Python
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)) |