You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
3.9 KiB
131 lines
3.9 KiB
import asyncio
|
|
import functools
|
|
import logging
|
|
|
|
import discord
|
|
import launchlibrary as ll
|
|
from redbot.core import Config, commands
|
|
from redbot.core.bot import Red
|
|
|
|
from launchlib.countrymapper import country_mapping
|
|
|
|
log = logging.getLogger("red.fox_v3.launchlib")
|
|
|
|
|
|
class LaunchLib(commands.Cog):
|
|
"""
|
|
Cog Description
|
|
|
|
Less important information about the cog
|
|
"""
|
|
|
|
def __init__(self, bot: Red):
|
|
super().__init__()
|
|
self.bot = bot
|
|
self.config = Config.get_conf(
|
|
self, identifier=7697117110991047610598, force_registration=True
|
|
)
|
|
|
|
default_guild = {}
|
|
|
|
self.config.register_guild(**default_guild)
|
|
|
|
self.api = ll.Api()
|
|
|
|
async def red_delete_data_for_user(self, **kwargs):
|
|
"""Nothing to delete"""
|
|
return
|
|
|
|
async def _embed_launch_data(self, launch: ll.AsyncLaunch):
|
|
status: ll.AsyncLaunchStatus = await launch.get_status()
|
|
|
|
rocket: ll.AsyncRocket = launch.rocket
|
|
|
|
title = launch.name
|
|
description = status.description
|
|
|
|
urls = launch.vid_urls + launch.info_urls
|
|
if not urls and rocket:
|
|
urls = rocket.info_urls + [rocket.wiki_url]
|
|
if urls:
|
|
url = urls[0]
|
|
else:
|
|
url = None
|
|
|
|
color = discord.Color.green() if status.id in [1, 3] else discord.Color.red()
|
|
|
|
em = discord.Embed(title=title, description=description, url=url, color=color)
|
|
|
|
if rocket and rocket.image_url and rocket.image_url != "Array":
|
|
em.set_image(url=rocket.image_url)
|
|
|
|
agency = getattr(launch, "agency", None)
|
|
if agency is not None:
|
|
em.set_author(
|
|
name=agency.name,
|
|
url=agency.wiki_url,
|
|
icon_url=f"https://www.countryflags.io/{country_mapping(agency.country_code)}/flat/64.png",
|
|
)
|
|
|
|
field_options = [
|
|
("failreason", "Fail Reason"),
|
|
("holdreason", "Hold Reason"),
|
|
("id", "ID"),
|
|
("hashtag", "Hashtag"),
|
|
]
|
|
for f in field_options:
|
|
data = getattr(launch, f[0], None)
|
|
if data is not None and data:
|
|
em.add_field(name=f[1], value=data)
|
|
|
|
if launch.missions:
|
|
field_options = [
|
|
("description", "Mission Description"),
|
|
("typeName", "Mission Type"),
|
|
("name", "Mission Name"),
|
|
]
|
|
for mission in launch.missions:
|
|
for f in field_options:
|
|
data = mission.get(f[0], None)
|
|
if data is not None and data:
|
|
em.add_field(name=f[1], value=data)
|
|
|
|
if rocket and rocket.family:
|
|
em.add_field(name="Rocket Family", value=rocket.family)
|
|
|
|
em.timestamp = launch.windowstart
|
|
|
|
em.set_footer()
|
|
|
|
return em
|
|
|
|
@commands.group()
|
|
async def launchlib(self, ctx: commands.Context):
|
|
if ctx.invoked_subcommand is None:
|
|
pass
|
|
|
|
@launchlib.command()
|
|
async def next(self, ctx: commands.Context, num_launches: int = 1):
|
|
# launches = await api.async_next_launches(num_launches)
|
|
# loop = asyncio.get_running_loop()
|
|
#
|
|
# launches = await loop.run_in_executor(
|
|
# None, functools.partial(self.api.fetch_launch, num=num_launches)
|
|
# )
|
|
#
|
|
launches = await self.api.async_fetch_launch(num=num_launches)
|
|
|
|
async with ctx.typing():
|
|
for x, launch in enumerate(launches):
|
|
if x >= num_launches:
|
|
return
|
|
|
|
em = await self._embed_launch_data(launch)
|
|
if em is not None:
|
|
try:
|
|
await ctx.send(embed=em)
|
|
except discord.HTTPException:
|
|
await ctx.send(str(launch))
|
|
log.exception("Failed to send embed")
|
|
await asyncio.sleep(2)
|