clean up event cutoff commands and tweak cutoff embed appearance
This commit is contained in:
parent
1c3eee0440
commit
7be3fd3170
@ -1,4 +1,5 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
|
import datetime
|
||||||
import datetime as dt
|
import datetime as dt
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
@ -182,39 +183,35 @@ class Event(commands.Cog):
|
|||||||
|
|
||||||
if state == EventState.Upcoming:
|
if state == EventState.Upcoming:
|
||||||
time_delta_heading = 'Time Until Start'
|
time_delta_heading = 'Time Until Start'
|
||||||
time_delta = event.start_datetime - dt.datetime.now(dt.timezone.utc)
|
delta = event.start_datetime - dt.datetime.now(dt.timezone.utc)
|
||||||
date_heading = 'Start Date'
|
date_heading = 'Start Date'
|
||||||
date_value = event.start_datetime
|
date_value = event.start_datetime
|
||||||
elif state == EventState.Open:
|
elif state == EventState.Open:
|
||||||
time_delta_heading = 'Time Until Close'
|
time_delta_heading = 'Time Until Close'
|
||||||
time_delta = event.reception_close_datetime - dt.datetime.now(dt.timezone.utc)
|
delta = event.reception_close_datetime - dt.datetime.now(dt.timezone.utc)
|
||||||
progress = 1 - (time_delta / (event.reception_close_datetime - event.start_datetime))
|
progress = 1 - (delta / (event.reception_close_datetime - event.start_datetime))
|
||||||
date_heading = 'Close Date'
|
date_heading = 'Close Date'
|
||||||
date_value = event.reception_close_datetime
|
date_value = event.reception_close_datetime
|
||||||
elif state in (EventState.Closing, EventState.Ranks_Fixed):
|
elif state in (EventState.Closing, EventState.Ranks_Fixed):
|
||||||
time_delta_heading = 'Time Until Results'
|
time_delta_heading = 'Time Until Results'
|
||||||
time_delta = event.result_announcement_datetime - dt.datetime.now(dt.timezone.utc)
|
delta = event.result_announcement_datetime - dt.datetime.now(dt.timezone.utc)
|
||||||
date_heading = 'Results Date'
|
date_heading = 'Results Date'
|
||||||
date_value = event.result_announcement_datetime
|
date_value = event.result_announcement_datetime
|
||||||
elif state == EventState.Results:
|
elif state == EventState.Results:
|
||||||
time_delta_heading = 'Time Until End'
|
time_delta_heading = 'Time Until End'
|
||||||
time_delta = event.end_datetime - dt.datetime.now(dt.timezone.utc)
|
delta = event.end_datetime - dt.datetime.now(dt.timezone.utc)
|
||||||
date_heading = 'End Date'
|
date_heading = 'End Date'
|
||||||
date_value = event.end_datetime
|
date_value = event.end_datetime
|
||||||
else:
|
else:
|
||||||
time_delta_heading = 'Time Since End'
|
time_delta_heading = 'Time Since End'
|
||||||
time_delta = dt.datetime.now(dt.timezone.utc) - event.end_datetime
|
delta = dt.datetime.now(dt.timezone.utc) - event.end_datetime
|
||||||
date_heading = 'End Date'
|
date_heading = 'End Date'
|
||||||
date_value = event.end_datetime
|
date_value = event.end_datetime
|
||||||
|
|
||||||
date_value = date_value.astimezone(timezone)
|
date_value = date_value.astimezone(timezone)
|
||||||
|
|
||||||
days = time_delta.days
|
|
||||||
hours, rem = divmod(time_delta.seconds, 3600)
|
|
||||||
minutes, seconds = divmod(rem, 60)
|
|
||||||
|
|
||||||
embed.add_field(name=time_delta_heading,
|
embed.add_field(name=time_delta_heading,
|
||||||
value=f'{days}d {hours}h {minutes}m',
|
value=self.format_timedelta(delta),
|
||||||
inline=True)
|
inline=True)
|
||||||
embed.add_field(name='Progress',
|
embed.add_field(name='Progress',
|
||||||
value=f'{round(progress * 100, 2)}%' if progress is not None else 'N/A',
|
value=f'{round(progress * 100, 2)}%' if progress is not None else 'N/A',
|
||||||
@ -225,6 +222,13 @@ class Event(commands.Cog):
|
|||||||
|
|
||||||
await ctx.send(embed=embed)
|
await ctx.send(embed=embed)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def format_timedelta(delta: datetime.timedelta):
|
||||||
|
days = delta.days
|
||||||
|
hours, rem = divmod(delta.seconds, 3600)
|
||||||
|
minutes, seconds = divmod(rem, 60)
|
||||||
|
return f'{days}d {hours}h {minutes}m'
|
||||||
|
|
||||||
@commands.command(name='t20',
|
@commands.command(name='t20',
|
||||||
aliases=['top20', 'top_20'],
|
aliases=['top20', 'top_20'],
|
||||||
description='Displays the top 20 in the main leaderboard',
|
description='Displays the top 20 in the main leaderboard',
|
||||||
@ -240,61 +244,88 @@ class Event(commands.Cog):
|
|||||||
nl = "\n"
|
nl = "\n"
|
||||||
update_date = dateutil.parser.isoparse(leaderboard[0]["date"]).replace(microsecond=0)
|
update_date = dateutil.parser.isoparse(leaderboard[0]["date"]).replace(microsecond=0)
|
||||||
update_date = update_date.astimezone(pytz.timezone('Asia/Tokyo'))
|
update_date = update_date.astimezone(pytz.timezone('Asia/Tokyo'))
|
||||||
header = f'Updated {update_date}\n\nRank {"Points".ljust(max_points_digits)} Name'
|
header = f'Updated {update_date}\n\nRank {"Points":<{max_points_digits}} Name'
|
||||||
listing = [
|
listing = [
|
||||||
f'{str(player["rank"]).ljust(4)} {str(player["points"]).ljust(max_points_digits)} {player["name"].replace(nl, "")}'
|
f'{player["rank"]:<4} {player["points"]:<{max_points_digits}} {player["name"].replace(nl, "")}'
|
||||||
for player in leaderboard]
|
for player in leaderboard]
|
||||||
paged = run_paged_message(ctx, embed, listing, header=header, page_size=10, numbered=False)
|
paged = run_paged_message(ctx, embed, listing, header=header, page_size=10, numbered=False)
|
||||||
asyncio.ensure_future(paged)
|
asyncio.ensure_future(paged)
|
||||||
validtiers = [50,100,500,1000,2000,5000,10000,20000,30000,50000]
|
|
||||||
async def get_tier_data(self, ctx: commands.Context):
|
valid_tiers = {50, 100, 500, 1000, 2000, 5000, 10000, 20000, 30000, 50000}
|
||||||
async with aiohttp.ClientSession() as session:
|
|
||||||
async with session.get('http://www.projectdivar.com/eventdata/t20?chart=true') as resp:
|
@commands.command(name='cutoff',
|
||||||
leaderboard = await resp.json(encoding='utf-8')
|
aliases=['co', 't50', 't100', 't500', 't1000', 't2000', 't5000',
|
||||||
def parse_tier_arg(tier_arg):
|
't10000', 't20000', 't30000', 't50000',
|
||||||
|
't1k', 't2k', 't5k', 't10k', 't20k', 't30k', 't50k'],
|
||||||
|
description=f'Displays the cutoffs at different tiers. Valid tiers: {str(valid_tiers)}',
|
||||||
|
help='!cutoff 50')
|
||||||
|
async def cutoff(self, ctx: commands.Context, tier: str = ''):
|
||||||
|
def process_tier_arg(tier_arg):
|
||||||
if tier_arg[0] == 't':
|
if tier_arg[0] == 't':
|
||||||
tier_arg = tier_arg[1:]
|
tier_arg = tier_arg[1:]
|
||||||
if tier_arg[-1] == 'k':
|
if tier_arg[-1] == 'k':
|
||||||
return str(round(1000 * float(tier_arg[:-1])))
|
return str(round(1000 * float(tier_arg[:-1])))
|
||||||
return tier_arg
|
return tier_arg
|
||||||
arg = parse_tier_arg(ctx.invoked_with)
|
|
||||||
event = self.bot.asset_filters.events.get_latest_event(ctx)
|
if ctx.invoked_with in ['cutoff', 'co']:
|
||||||
embed = discord.Embed(title=f'{event.name} t'+arg)
|
tier = process_tier_arg(tier)
|
||||||
embed.set_thumbnail(url=self.bot.asset_url + get_event_logo_path(event))
|
if not tier.isnumeric():
|
||||||
#max_points_digits = len(str(leaderboard[statistics]))
|
await ctx.send(f'Invalid tier: {tier}.')
|
||||||
nl = "\n"
|
|
||||||
# update_date = dateutil.parser.isoparse(leaderboard[0]["date"]).replace(microsecond=0)
|
|
||||||
# update_date = update_date.astimezone(pytz.timezone('Asia/Tokyo'))
|
|
||||||
# Muni-chan AWESOME!
|
|
||||||
header = f'------------'
|
|
||||||
if arg in leaderboard["statistics"]:
|
|
||||||
data = leaderboard["statistics"][arg]
|
|
||||||
else:
|
|
||||||
await ctx.send("No data available for top "+arg)
|
|
||||||
return
|
return
|
||||||
embed.add_field(name="Points",
|
else:
|
||||||
value=f'{data["points"]}',
|
tier = process_tier_arg(ctx.invoked_with)
|
||||||
|
|
||||||
|
embed = await self.get_tier_embed(tier, self.bot.asset_filters.events.get_latest_event(ctx))
|
||||||
|
|
||||||
|
if embed:
|
||||||
|
await ctx.send(embed=embed)
|
||||||
|
else:
|
||||||
|
await ctx.send(f'No data available for tier {tier}.')
|
||||||
|
|
||||||
|
async def get_tier_embed(self, tier: str, event: EventMaster):
|
||||||
|
async with aiohttp.ClientSession() as session:
|
||||||
|
async with session.get('http://www.projectdivar.com/eventdata/t20?chart=true') as resp:
|
||||||
|
leaderboard = await resp.json(encoding='utf-8')
|
||||||
|
|
||||||
|
data = leaderboard['statistics'].get(tier)
|
||||||
|
if not data:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if event.state() == EventState.Open:
|
||||||
|
delta = event.reception_close_datetime - dt.datetime.now(dt.timezone.utc)
|
||||||
|
time_left = self.format_timedelta(delta)
|
||||||
|
progress = f'{round(100 * (1 - (delta / (event.reception_close_datetime - event.start_datetime))), 2)}%'
|
||||||
|
else:
|
||||||
|
time_left = 'N/A'
|
||||||
|
progress = 'N/A'
|
||||||
|
|
||||||
|
embed = discord.Embed(title=f'{event.name} [t{tier}]', timestamp=dt.datetime.now(dt.timezone.utc))
|
||||||
|
embed.set_thumbnail(url=self.bot.asset_url + get_event_logo_path(event))
|
||||||
|
embed.add_field(name='Points',
|
||||||
|
value=data['points'],
|
||||||
inline=True)
|
inline=True)
|
||||||
embed.add_field(name="Last Update",
|
embed.add_field(name='Last Update',
|
||||||
value=f'{data["lastUpdate"]}',
|
value=data['lastUpdate'],
|
||||||
inline=True)
|
inline=True)
|
||||||
embed.add_field(name="Current Estimate",
|
embed.add_field(name='Rate',
|
||||||
value=f'{data["estimate"]}',
|
|
||||||
inline=True)
|
|
||||||
embed.add_field(name="Final Prediction",
|
|
||||||
value=f'{data["prediction"]}',
|
|
||||||
inline=True)
|
|
||||||
embed.add_field(name="Rate",
|
|
||||||
value=f'{data["rate"]} pts/hr',
|
value=f'{data["rate"]} pts/hr',
|
||||||
inline=True)
|
inline=True)
|
||||||
await ctx.send(embed=embed)
|
embed.add_field(name='Current Estimate',
|
||||||
@commands.command(name='t50',
|
value=data['estimate'],
|
||||||
aliases=['t100', 't500', 't1000', 't2000', 't5000', 't10000', 't20000', 't30000', 't50000',
|
inline=True)
|
||||||
't1k','t2k','t5k','t10k','t20k','t30k','t50k'],
|
embed.add_field(name='Final Prediction',
|
||||||
description='Displays the cutoffs at different tiers. Valid tiers: '+str(validtiers),
|
value=data['prediction'],
|
||||||
help='!t50 Valid tiers are: '+str(validtiers))
|
inline=True)
|
||||||
async def t(self, ctx: commands.Context):
|
embed.add_field(name='\u200b',
|
||||||
await self.get_tier_data(ctx)
|
value='\u200b',
|
||||||
|
inline=True)
|
||||||
|
embed.add_field(name='Time Left',
|
||||||
|
value=time_left,
|
||||||
|
inline=True)
|
||||||
|
embed.add_field(name='Progress',
|
||||||
|
value=progress,
|
||||||
|
inline=True)
|
||||||
|
return embed
|
||||||
|
|
||||||
|
|
||||||
def setup(bot):
|
def setup(bot):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user