from bs4 import BeautifulSoup from discord import option from discord.ext import commands import discord import os import requests from functools import lru_cache 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: discord.ApplicationContext): 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: discord.ApplicationContext): 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) @staticmethod @lru_cache(maxsize=300) 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. Cached to reduce repeated web requests. """ 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: discord.ApplicationContext, 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) @staticmethod @lru_cache(maxsize=1) async def get_all_commodities(ctx: discord.AutocompleteContext): """ Returns a list of commodities 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: discord.ApplicationContext, 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="Optional how much SCU to fill", required=False, min_value=1, max_value=98304, ) async def calculate_trade_profits( self, ctx: discord.ApplicationContext, 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: discord.ApplicationContext, 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))