Ruby-Cogs/pokemonduel/data.py
2025-04-02 22:57:51 -04:00

107 lines
3.8 KiB
Python

import discord
from redbot.core.data_manager import bundled_data_path
import json
from .buttons import BattlePromptView, PreviewPromptView
async def find(ctx, db, filter):
"""Fetch all matching rows from a data file."""
path = str(bundled_data_path(ctx.cog) / db) + ".json"
with open(path) as f:
data = json.load(f)
results = []
for item in data:
success = True
for key, value in filter.items():
if isinstance(value, dict):
if "$nin" in value:
if item[key] in value["$nin"]:
success = False
break
else:
if item[key] != value:
success = False
break
if success:
results.append(item)
return results
async def find_one(ctx, db, filter):
"""Fetch the first matching row from a data file."""
results = await find(ctx, db, filter)
if results:
return results[0]
return None
async def generate_team_preview(battle):
"""Generates a message for trainers to preview their team."""
preview_view = PreviewPromptView(battle)
await battle.channel.send("Select a lead pokemon:", view=preview_view)
return preview_view
async def generate_main_battle_message(battle):
"""Generates a message representing the current state of the battle."""
desc = ""
if battle.weather._weather_type:
desc += f"Weather: {battle.weather._weather_type.title()}\n" # TODO: pretty this output
if battle.terrain.item:
desc += f"Terrain: {battle.terrain.item.title()}\n" # TODO: pretty this output
if battle.trick_room.active():
desc += "Trick Room: Active\n"
desc += "\n"
desc += f"{battle.trainer1.name}'s {battle.trainer1.current_pokemon.name}\n"
desc += f" HP: {battle.trainer1.current_pokemon.hp}/{battle.trainer1.current_pokemon.starting_hp}\n"
if battle.trainer1.current_pokemon.nv.current:
desc += f" Status: {battle.trainer1.current_pokemon.nv.current}\n"
if battle.trainer1.current_pokemon.substitute:
desc += " Behind a substitute!\n"
desc += "\n"
desc += f"{battle.trainer2.name}'s {battle.trainer2.current_pokemon.name}\n"
desc += f" HP: {battle.trainer2.current_pokemon.hp}/{battle.trainer2.current_pokemon.starting_hp}\n"
if battle.trainer2.current_pokemon.nv.current:
desc += f" Status: {battle.trainer2.current_pokemon.nv.current}\n"
if battle.trainer2.current_pokemon.substitute:
desc += " Behind a substitute!\n"
desc = f"```\n{desc.strip()}```"
e = discord.Embed(
title=f"Battle between {battle.trainer1.name} and {battle.trainer2.name}",
color=await battle.ctx.embed_color(),
description = desc,
)
e.set_footer(text="Who Wins!?")
try: #aiohttp 3.7 introduced a bug in dpy which causes this to error when rate limited. This catch just lets the bot continue when that happens.
battle_view = BattlePromptView(battle)
await battle.channel.send(embed=e, view=battle_view)
except RuntimeError:
pass
return battle_view
async def generate_text_battle_message(battle):
"""
Send battle.msg in a boilerplate embed.
Handles the message being too long.
"""
page = ""
pages = []
base_embed = discord.Embed(color=await battle.ctx.embed_color())
raw = battle.msg.strip().split("\n")
for part in raw:
if len(page + part) > 2000:
embed = base_embed.copy()
embed.description = page.strip()
pages.append(embed)
page = ""
page += part + "\n"
page = page.strip()
if page:
embed = base_embed.copy()
embed.description = page
pages.append(embed)
for page in pages:
await battle.channel.send(embed=page)
battle.msg = ""