dragon-bot/app/cogs/star_citizen.py

319 lines
10 KiB
Python
Executable File

from bs4 import BeautifulSoup
from discord import option
from discord.ext import commands, tasks
import discord
import os
import requests
import json
import star_citizen
class StarCitizen(commands.Cog):
def __init__(self, bot):
self.bot: commands.Bot = bot
self.poll_status_page.start()
@commands.slash_command(
guild_ids=None,
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")
@commands.slash_command(
guild_ids=None,
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"
}
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://i.ebayimg.com/images/g/IvQAAOSwjyhaOTZN/s-l1200.webp"
)
embed.set_author(name="Ranking of drugs by sell price")
for k, v in sorted_dict.items():
embed.add_field(
name=k,
value="${:20,}".format(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).text
soup = BeautifulSoup(response, "html.parser")
all_ships = [
a.text for a in soup.select("div.mw-category.mw-category-columns a")
]
return all_ships
@commands.slash_command(
guild_ids=None,
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)
),
):
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
@commands.slash_command(
guild_ids=None,
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_profies(
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_profies(commodity=commodity, scu=scu)
await ctx.send_followup(embed=embed)
@tasks.loop(seconds=5)
async def poll_status_page(self):
# Wait until the bot is ready before we actually start executing code
await self.bot.wait_until_ready()
status_url = "https://status.robertsspaceindustries.com"
response = requests.get(status_url).text
soup = BeautifulSoup(response, "html.parser")
current_status = soup.find("div", {"class": "global-status"}).findNext("span")
rsi_incident_file = "/tmp/rsi_incident"
if current_status.text != "Operational":
# Find the lastest incident
latest_incident = current_status.findNext("h2")
current_incident_url = status_url + latest_incident.findNext("a")["href"]
details = latest_incident.findNext("div", {"class": "markdown"}).text
if os.path.exists(rsi_incident_file):
file_contents = json.loads(open(rsi_incident_file).read())
deets = file_contents["details"]
incident_link = file_contents["incident_link"]
if current_incident_url == incident_link:
if deets != details:
embed = discord.Embed(
description="-------",
color=discord.Color.yellow(),
type="rich",
)
embed.set_thumbnail(
url="https://media.robertsspaceindustries.com/t0q21kbb3zrpt/source.png"
)
embed.set_author(
name="⚠️ THERE HAS BEEN AN UPDATE TO THE ONGOING INCIDENT ⚠️"
)
# embed.set_image(
# url="https://media.giphy.com/media/WWIZJyXHXscn8JC1e0/giphy.gif"
# )
embed.add_field(name="Details", value=deets, inline=True)
embed.add_field(
name="LINK",
value=incident_link,
inline=False,
)
await self.bot.get_channel(1097567909640929340).send(
embed=embed
)
# Testing channel
# await self.bot.get_channel(932476007439552522).send(
# embed=embed
# )
star_citizen.write_incident_file(
file_path=rsi_incident_file,
url=current_incident_url,
details=details,
)
else:
# Write the incident's body to a json file to read later
star_citizen.write_incident_file(
file_path=rsi_incident_file,
url=current_incident_url,
details=details,
)
embed = discord.Embed(
description="-------", color=discord.Color.red(), type="rich"
)
embed.set_thumbnail(
url="https://media.robertsspaceindustries.com/t0q21kbb3zrpt/source.png"
)
embed.set_author(name="🚨 OH NO THERES AN INCIDENT 🚨")
embed.set_image(
url="https://media.giphy.com/media/WWIZJyXHXscn8JC1e0/giphy.gif"
)
embed.add_field(name="Details", value=details, inline=True)
embed.add_field(
name="LINK",
value=current_incident_url,
inline=False,
)
await self.bot.get_channel(1097567909640929340).send(embed=embed)
# Testing channel
# await self.bot.get_channel(932476007439552522).send(
# embed=embed
# )
def setup(bot):
bot.add_cog(StarCitizen(bot))