Ruby-Cogs/pokecord/dev.py

204 lines
6.7 KiB
Python

import json
import pprint
from typing import Optional
import discord
import tabulate
from redbot.core import commands
from redbot.core.i18n import Translator
from redbot.core.utils.chat_formatting import *
from .abc import MixinMeta
from .statements import *
poke = MixinMeta.poke
_ = Translator("Pokecord", __file__)
class Dev(MixinMeta):
"""Ava's Pokemon Development Commands"""
@poke.group(hidden=True)
@commands.is_owner()
async def dev(self, ctx):
"""Ava's Pokemon Development Commands"""
@dev.command(name="spawn")
async def dev_spawn(self, ctx, *pokemon):
"""Spawn a pokemon by name or random"""
pokemon = " ".join(pokemon).strip().lower()
if pokemon is "":
await self.spawn_pokemon(ctx.channel)
return
else:
for i, pokemondata in enumerate(self.pokemondata):
name = (
pokemondata.get("alias").lower()
if pokemondata.get("alias")
else pokemondata["name"]["english"].lower()
)
if name == pokemon:
await self.spawn_pokemon(ctx.channel, pokemon=self.pokemondata[i])
return
await ctx.send("No pokemon found.")
async def get_pokemon(self, ctx, user: discord.Member, pokeid: int) -> list:
"""Returns pokemons from user list if exists"""
if pokeid <= 0:
return await ctx.send("The ID must be greater than 0!")
async with ctx.typing():
result = await self.cursor.fetch_all(query=SELECT_POKEMON, values={"user_id": user.id})
pokemons = [None]
for data in result:
pokemons.append([json.loads(data[0]), data[1]])
if not pokemons:
return await ctx.send("You don't have any pokémon, trainer!")
if pokeid >= len(pokemons):
return await ctx.send("There's no pokemon at that slot.")
return pokemons[pokeid]
@dev.command(name="ivs")
async def dev_ivs(
self,
ctx,
user: Optional[discord.Member],
pokeid: int,
hp: int,
attack: int,
defence: int,
spatk: int,
spdef: int,
speed: int,
):
"""Manually set a pokemons IVs"""
if user is None:
user = ctx.author
pokemon = await self.get_pokemon(ctx, user, pokeid)
if not isinstance(pokemon, list):
return
pokemon[0]["ivs"] = {
"HP": hp,
"Attack": attack,
"Defence": defence,
"Sp. Atk": spatk,
"Sp. Def": spdef,
"Speed": speed,
}
await self.cursor.execute(
query=UPDATE_POKEMON,
values={
"user_id": user.id,
"message_id": pokemon[1],
"pokemon": json.dumps(pokemon[0]),
},
)
await ctx.tick()
@dev.command(name="stats")
async def dev_stats(
self,
ctx,
user: Optional[discord.Member],
pokeid: int,
hp: int,
attack: int,
defence: int,
spatk: int,
spdef: int,
speed: int,
):
"""Manually set a pokemons stats"""
if user is None:
user = ctx.author
pokemon = await self.get_pokemon(ctx, user, pokeid)
if not isinstance(pokemon, list):
return
pokemon[0]["stats"] = {
"HP": hp,
"Attack": attack,
"Defence": defence,
"Sp. Atk": spatk,
"Sp. Def": spdef,
"Speed": speed,
}
await self.cursor.execute(
query=UPDATE_POKEMON,
values={
"user_id": user.id,
"message_id": pokemon[1],
"pokemon": json.dumps(pokemon[0]),
},
)
await ctx.tick()
@dev.command(name="level")
async def dev_lvl(self, ctx, user: Optional[discord.Member], pokeid: int, lvl: int):
"""Manually set a pokemons level"""
if user is None:
user = ctx.author
pokemon = await self.get_pokemon(ctx, user, pokeid)
if not isinstance(pokemon, list):
return
pokemon[0]["level"] = lvl
await self.cursor.execute(
query=UPDATE_POKEMON,
values={
"user_id": user.id,
"message_id": pokemon[1],
"pokemon": json.dumps(pokemon[0]),
},
)
await ctx.tick()
@dev.command(name="reveal")
async def dev_reveal(self, ctx, user: Optional[discord.Member], pokeid: int):
"""Shows raw info for an owned pokemon"""
if user is None:
user = ctx.author
pokemon = await self.get_pokemon(ctx, user, pokeid)
if not isinstance(pokemon, list):
return
await ctx.send(content=pprint.pformat(pokemon[0]))
@dev.command(name="strip")
async def dev_strip(self, ctx, user: discord.Member, id: int):
"""Forcably removes a pokemone from user"""
if id <= 0:
return await ctx.send("The ID must be greater than 0!")
async with ctx.typing():
result = await self.cursor.fetch_all(query=SELECT_POKEMON, values={"user_id": user.id})
pokemons = [None]
for data in result:
pokemons.append([json.loads(data[0]), data[1]])
if not pokemons:
return await ctx.send(f"{user.display_name} don't have any pokémon!")
if id >= len(pokemons):
return await ctx.send("There's no pokemon at that slot.")
pokemon = pokemons[id]
msg = ""
userconf = await self.user_is_global(user)
pokeid = await userconf.pokeid()
if id < pokeid:
msg += _(
"\nTheir default pokemon may have changed. I have tried to account for this change."
)
await userconf.pokeid.set(pokeid - 1)
elif id == pokeid:
msg += _(
"\nYou have released their selected pokemon. I have reset their selected pokemon to their first pokemon."
)
await userconf.pokeid.set(1)
if len(pokemons) == 2: # it was their last pokemon, resets starter
await userconf.has_starter.set(False)
msg = _(
f"\n{user.display_name} has no pokemon left. I have granted them another chance to pick a starter."
)
await self.cursor.execute(
query="DELETE FROM users where message_id = :message_id",
values={"message_id": pokemon[1]},
)
name = self.get_name(pokemon[0]["name"], user)
await ctx.send(
_(f"{user.display_name}'s {name} has been freed.{msg}").format(name=name, msg=msg)
)