stormbrigade_sheriff/cogs_old/calculate_time.py

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