dragon-bot/app/cogs/tarkov.py
Luke Robles 2b35b320c9
All checks were successful
Build and push / changes (push) Successful in 7s
Build and push / Lint-Python (push) Successful in 2s
Build and push / Build-and-Push-Docker (push) Successful in 2m31s
Build and push / sync-argocd-app (push) Successful in 2s
Build and push / post-status-to-discord (push) Successful in 2s
Updating sokme wording and putting the rogues on the /spawns list
2025-01-16 15:10:27 -08:00

260 lines
8.5 KiB
Python
Executable File

from bs4 import BeautifulSoup
from datetime import datetime
from discord.ext import commands, tasks
import core_utils
import discord
import os
import json
import requests
import tarkov
if os.getenv("DRAGON_ENV") == "prod":
channel_id = 815310511776202773
time_limit = 600
else:
channel_id = 932476007439552522
time_limit = 10
class Tarkov(commands.Cog):
def __init__(self, bot):
self.bot: commands.Bot = bot
self.check_boss_spawns.start()
tarkov = discord.SlashCommandGroup("tarkov", "Tarkov related commands")
@tasks.loop(seconds=time_limit)
async def check_boss_spawns(self):
# Wait until the bot is ready before we actually start executing code
await self.bot.wait_until_ready()
local_spawn_rates = "/tmp/boss_spawns.json"
spawns_from_api = tarkov.get_tarkov_boss_info()
if os.path.exists(local_spawn_rates):
embed = discord.Embed(
description="-------", color=discord.Color.blue(), type="rich"
)
with open(local_spawn_rates, "r") as f:
known_spawns = json.load(f)
if spawns_from_api != known_spawns:
embed.set_author(name="🎲 Boss Spawn Rates Have Changed 🎲")
# Send both dicts to this method to see if any spawn rates have been updated
changes_dict = tarkov.compare_boss_spawns(known_spawns, spawns_from_api)
for level, boss in changes_dict.items():
if boss:
embed.add_field(
name=level,
value="\n".join(
f"{boss_name}: {change}"
for boss_name, change in boss.items()
),
inline=False,
)
await self.bot.get_channel(channel_id).send(embed=embed)
with open(local_spawn_rates, "w") as f:
json.dump(spawns_from_api, f)
else:
with open(local_spawn_rates, "w") as f:
json.dump(spawns_from_api, f)
async def get_all_bosses(ctx: discord.AutocompleteContext):
"""
Returns a list of boss names to be used in auto complete
"""
bosses = tarkov.request_wiki("Bosses", "Bosses")
return bosses
@tarkov.command(
guild_ids=core_utils.my_guilds,
name="kappa",
description="Posts an image with all kappa tasks",
)
async def post_kappa(self, ctx: commands.Context):
await ctx.respond(
"https://images-ext-1.discordapp.net/external/M0SEv0C3IG7r6Dk1ForyjA5wzKp3UBM1A05GL-NqVmA/%3Fwidth%3D1024%26auto%3Dwebp%26s%3D3450641f6d067dd839dc18b949077b6e2ef010fa/https/preview.redd.it/bw0njbz880nd1.png?format=webp&quality=lossless&width=1687&height=948"
)
@tarkov.command(
guild_ids=core_utils.my_guilds,
name="traders",
description="Time until trader resets",
)
async def trader_resets(self, ctx: commands.Context):
await ctx.defer()
embed = discord.Embed(
description="-------", color=discord.Color.blue(), type="rich"
)
embed.set_author(name="PVE Trader Reset Times")
embed.set_thumbnail(
url="https://static1.thegamerimages.com/wordpress/wp-content/uploads/2023/03/from-left-to-right-the-escape-from-tarkov-trader-jaeger-the-escape-from-trakov-trader-therapist-and-the-escape-from-tarkov-trader-peacekeeper.jpg"
)
query = """
{
traders(gameMode:pve) {
name
resetTime
}
}
"""
response = tarkov.query_tarkov_api(query)["traders"]
# Loop through the dataset
for entry in response:
trader_name = entry["name"]
if trader_name in ["Lightkeeper"]:
break
# Convert to datetime object
reset_time = datetime.fromisoformat(
entry["resetTime"].replace("Z", "+00:00")
)
# Print the name and formatted time until reset
embed.add_field(
name=trader_name,
value=discord.utils.format_dt(reset_time, style="R"),
inline=True,
)
await ctx.send_followup(embed=embed)
@tarkov.command(
guild_ids=core_utils.my_guilds,
name="spawns",
description="Boss Boss Spawn Rates",
)
async def boss_spawns(
self,
ctx: commands.Context,
boss_name: discord.Option(
str,
autocomplete=discord.utils.basic_autocomplete(get_all_bosses),
description="The boss you want to look up",
required=False,
),
):
await ctx.defer()
embed = discord.Embed(
description="-------",
color=discord.Color.blue(),
type="rich",
)
embed.set_author(name="🎲 Boss Spawn chances by map 🎲")
if boss_name:
embed.set_author(name=f"🎲 Spawn chance for {boss_name} 🎲")
embed.set_thumbnail(url="https://i.ytimg.com/vi/Yis5rmgo_bM/maxresdefault.jpg")
levels = tarkov.get_tarkov_boss_info()
if not boss_name:
for key, value in levels.items():
embed.add_field(
name=key,
value="\n".join(
f"{k}: {v['spawnChance']}" for k, v in value.items()
),
inline=False,
)
else:
for key, value in levels.items():
if boss_name in value:
embed.add_field(
name=key,
value=f"{boss_name}: {value[boss_name]['spawnChance']}",
inline=False,
)
# break
embed.set_footer(text="Pulled from the api")
await ctx.send_followup(embed=embed)
@tarkov.command(
guild_ids=core_utils.my_guilds,
name="boss",
description="Boss Info",
)
async def boss_info(
self,
ctx: commands.Context,
boss_name: discord.Option(
str, autocomplete=discord.utils.basic_autocomplete(get_all_bosses)
),
):
await ctx.defer()
embed = discord.Embed(
description="-------",
color=discord.Color.blue(),
type="rich",
title=f"Boss info for {boss_name}",
)
wiki_url = "https://escapefromtarkov.fandom.com/wiki/"
response = requests.get(wiki_url + boss_name).text
soup = BeautifulSoup(response, "html.parser")
# boss_info = tarkov.get_tarkov_boss_info()
# for k, v in boss_info.items():
# if boss_name in v:
# print(k, v)
# embed.set_thumbnail(url=v[boss_name]["picture"])
# embed.add_field(
# name="Followers", value=v[boss_name]["escorts"], inline=False
# )
# embed.add_field(
# name="Spawn Chance",
# value=f"{v[boss_name]['spawnChance']}",
# inline=False,
# )
# break
portraits = tarkov.query_tarkov_api(
"""{
bosses(lang: en, gameMode:pve) {
name
imagePortraitLink
}
}"""
)["bosses"]
for boss in portraits:
if boss["name"] == boss_name:
embed.set_thumbnail(url=boss["imagePortraitLink"])
break
health = soup.find("table", class_="wikitable").find_next("td").text.rstrip()
embed.add_field(name="Health", value=health, inline=False)
followers = "None"
if soup.find("span", id="Followers"):
# Find the amount of followers in the text
followers = soup.find("span", id="Followers").find_next("p").text
embed.add_field(name="Followers", value=followers, inline=False)
spawn_chance = "%\n".join(
soup.find("td", class_="va-infobox-label", string="Spawn chance")
.find_next("td", class_="va-infobox-content")
.text.split("%")
)
embed.add_field(name="Spawn Chance", value=f"**{spawn_chance}**", inline=False)
embed.add_field(name="Link", value=f"{wiki_url + boss_name}", inline=False)
await ctx.send_followup(embed=embed)
def setup(bot):
bot.add_cog(Tarkov(bot))