dragon-bot/app/cogs/star_citizen.py

266 lines
7.8 KiB
Python
Executable File

from bs4 import BeautifulSoup
from discord import option
from discord.ext import commands
import discord
import os
import requests
import core_utils
import star_citizen
if os.getenv("DRAGON_ENV") == "prod":
channel_id = 1097567909640929340
else:
channel_id = 932476007439552522
class StarCitizen(commands.Cog):
def __init__(self, bot):
self.bot: commands.Bot = bot
# self.poll_status_page.start()
starcitizen = discord.SlashCommandGroup(
"starcitizen", "StarCitizen related commands"
)
@starcitizen.command(
guild_ids=core_utils.my_guilds,
name="medpens",
description="Posts an infographic about which medpens to use for which injuries in Star Citizen",
)
async def post_medpen_guide(self, ctx: commands.Context):
await ctx.respond("https://i.redd.it/lfswlf5c13t71.png")
@starcitizen.command(
guild_ids=core_utils.my_guilds,
name="drugs",
description="Returns a list of all the drugs in game sorted by their price",
)
async def post_drugs(self, ctx: commands.Context):
headers = {"api_key": os.getenv("uexcorp_key")}
response = requests.get(
"https://portal.uexcorp.space/api/commodities/", headers=headers
)
all_commodities = [x for x in response.json()["data"]]
all_drugs = {
item["name"]: item["trade_price_sell"]
for item in all_commodities
if item["kind"] == "Drug" or "Gasping" in item["name"]
}
sorted_dict = dict(sorted(all_drugs.items(), key=lambda item: item[1]))
embed = discord.Embed(
description="-------", color=discord.Color.orange(), type="rich"
)
embed.set_thumbnail(
url="https://media.starcitizen.tools/3/31/ViceCommodity_E%27tam.jpg"
)
embed.set_author(name="Ranking of drugs by sell price")
for k, v in sorted_dict.items():
embed.add_field(
name=k,
value=f"${v:,}",
inline=False,
)
await ctx.defer()
await ctx.send_followup(embed=embed)
async def get_all_ships(ctx: discord.AutocompleteContext):
"""
returns a list of all ships in the game, which can then be passed to the /ship command for auto complete
"""
url = "https://starcitizen.tools/Category:Ships"
response = requests.get(url, timeout=25).text
soup = BeautifulSoup(response, "html.parser")
h2_heading = soup.find("h2", string='Pages in category "Ships"')
return [link.text for link in h2_heading.find_next("div").find_all("a")]
@starcitizen.command(
guild_ids=core_utils.my_guilds,
name="ship",
description="Query the star citizen database about a ship",
)
async def get_ship(
self,
ctx: commands.Context,
ship: discord.Option(
str,
autocomplete=discord.utils.basic_autocomplete(get_all_ships),
description="The ship to look up",
),
):
await ctx.defer()
embed = await star_citizen.get_ship(ship_name=ship)
await ctx.send_followup(embed=embed)
async def get_all_commodities(ctx: discord.AutocompleteContext):
"""
Returns a list of commododites that can be used for autocomplete
for the /trade function.
Turning off its call to the API just to save key usage / i hear the devs
took data out of the game files so this may go away soon
"""
# headers = {"api_key": os.getenv("uexcorp_key")}
# response = requests.get(
# "https://portal.uexcorp.space/api/commodities/", headers=headers
# )
# all_commodities = [x["name"] for x in response.json()["data"]]
all_commodities = [
"Agricultural Supplies",
"Agricium",
"Agricium (Ore)",
"Altruciatoxin",
"Aluminum",
"Aluminum (Ore)",
"Amioshi Plague",
"Aphorite",
"Astatine",
"Audio Visual Equipment",
"Beryl (Raw)",
"Beryl",
"Bexalite",
"Bexalite (Raw)",
"Borase",
"Borase (Ore)",
"Chlorine",
"Construction Materials",
"Compboard",
"Copper",
"Copper (Ore)",
"Corundum",
"Corundum (Raw)",
"Degnous Root",
"Diamond",
"Diamond (Ore)",
"Distilled Spirits",
"Dolivine",
"E'tam",
"Fireworks",
"Fluorine",
"Gasping Weevil Eggs",
"Genalite",
"Golden Medmon",
"Gold",
"Gold (Ore)",
"Hadanite",
"Helium",
"Hephaestanite",
"Hephaestanite (Raw)",
"Heart of the Woods",
"Hydrogen",
"Inert Materials",
"Iodine",
"Iron",
"Janalite",
"Laranite",
"Laranite (Ore)",
"Luminalia Gift",
"Maze",
"Medical Supplies",
"Neon",
"Osoian Hides",
"Party Favors",
"Pitambu",
"Processed Food",
"Prota",
"Quartz (Raw)",
"Quantainium",
"Quartz",
"Quantainium (Raw)",
"Ranta Dung",
"Recycled Material Composite",
"Red Festival Envelope",
"Revenant Pod",
"Revenant Tree Pollen",
"Stone Bug Shell",
"Scrap",
"SLAM",
"Stims",
"Sunset Berries",
"Souvenirs",
"Taranite",
"Taranite (Raw)",
"Titanium",
"Titanium (Ore)",
"Tungsten",
"Tungsten (Ore)",
"Waste",
"WiDoW",
]
return all_commodities
@starcitizen.command(
guild_ids=core_utils.my_guilds,
name="price",
description="Returns the price of Items in Star Citizen",
)
@option(
name="scu",
description="How much SCU you found",
required=True,
min_value=1,
max_value=98304,
)
async def get_price(
self,
ctx: commands.Context,
commodity: discord.Option(
str, autocomplete=discord.utils.basic_autocomplete(get_all_commodities)
),
scu: int,
):
await ctx.defer()
embed = await star_citizen.get_price(commodity=commodity, scu=scu)
await ctx.send_followup(embed=embed)
@starcitizen.command(
guild_ids=core_utils.my_guilds,
name="trade",
description="Calculates the most profitable route for a given commodity",
)
@option(
name="scu",
description="Optinal how much SCU to fill",
required=False,
min_value=1,
max_value=98304,
)
async def calculate_trade_profits(
self,
ctx: commands.Context,
commodity: discord.Option(
str, autocomplete=discord.utils.basic_autocomplete(get_all_commodities)
),
scu: int,
):
await ctx.defer()
embed = await star_citizen.calculate_trade_profits(commodity=commodity, scu=scu)
await ctx.send_followup(embed=embed)
@starcitizen.command(
guild_ids=core_utils.my_guilds,
name="rsifind",
description="Pull up info about a player from their RSI profile",
)
@option(
name="player",
description="The player name to search for",
required=True,
)
async def rsi_find(self, ctx: commands.Context, player: str):
await ctx.defer()
embed = await star_citizen.rsi_find(player=player)
await ctx.send_followup(embed=embed)
def setup(bot):
bot.add_cog(StarCitizen(bot))