GammaRPBot/perso_commands.py

93 lines
No EOL
4.4 KiB
Python

from discord import app_commands
import discord
from GammaRPBot_Define import GammaRPBot
import aiosqlite
import base64
_sql_table="""CREATE TABLE personnages (
nom_court varchar(255),
nom_complet text,
image blob,
histoire text,
pouvoirs text,
uuid TEXT,
age INTEGER,
sexe TEXT,
guild_id INTEGER NULL
)"""
async def setup(bot:GammaRPBot):
bot.tree.add_command(PersoCommands(bot))
class PersoCommands(app_commands.Group):
bot:GammaRPBot
def __init__(self,bot):
super().__init__(name="perso",description="Commandes pour les personnages")
self.bot=bot
@app_commands.command(name="créer",description="Crée un personnage")
@app_commands.describe(short_name="Le nom court du personnage (son ID)", full_name="Le nom complet du personnage",
story="L'histoire du personnage",powers="Les pouvoirs du personnage",age="L'âge du personnage",
sexe="Le sexe du personnage",guild_only="Personnage global ou uniquement sur ce serveur",image="L'image du personnage")
@app_commands.choices(guild_only=[app_commands.Choice(name="Global",value="global"),app_commands.Choice(name="Ce serveur uniquement", value="guild")])
async def create_character(self,interaction:discord.Interaction,short_name:str,full_name:str,image:discord.Attachment,story:str,powers:str,age:int,sexe:str,guild_only:app_commands.Choice[str]):
nom_court = short_name
nom_complet= full_name
if image.content_type!="image/png" and image.content_type!="image/jpeg":
await interaction.response.send_message("L'image doit être un fichier PNG ou JPEG",ephemeral=True)
return
histoire = story
pouvoirs = powers
uuid=interaction.user.id
guild_id = interaction.guild.id
image_blob_raw=await image.read()
image_blob_b64 = base64.b64encode(image_blob_raw).decode("utf-8")
ext = image.filename.split(".")[-1]
image_blob=f"data:image/{ext};base64,{image_blob_b64}"
print(nom_court,nom_complet,histoire,pouvoirs,age,sexe,uuid,guild_id)
print(image.filename)
print(image.url)
print(image_blob)
try:
res = await self.bot.db.execute("INSERT INTO personnages (nom_court,nom_complet,histoire,pouvoirs,age,sexe,uuid,guild_id,image) VALUES (?,?,?,?,?,?,?,?,?)",(nom_court,nom_complet,histoire,pouvoirs,age,sexe,uuid,guild_id,image_blob))
print(res)
await res.close()
await self.bot.db.commit()
except Exception as e:
print(e)
await interaction.response.send_message("Erreur lors de la création du personnage",ephemeral=True)
return
except aiosqlite.Warning as w:
print(w)
await interaction.response.send_message("Erreur lors de la création du personnage",ephemeral=True)
return
except aiosqlite.Error as e:
print(e)
await interaction.response.send_message("Erreur lors de la création du personnage",ephemeral=True)
return
await interaction.response.send_message("Personnage créé",ephemeral=True)
@app_commands.command(name="lister",description="Liste tous les personnages")
async def list_characters(self,interaction:discord.Interaction):
print("perso list")
res = await self.bot.db.execute("SELECT * FROM personnages")
rows = await res.fetchall()
await res.close()
embeds = []
for row in rows:
embeds.append(await perso_embed(row))
await interaction.response.send_message("Liste des personnages\n",embeds=embeds,ephemeral=True)
async def perso_embed(bot:GammaRPBot,perso_datas)->discord.embeds.Embed:
perso_image = perso_datas["image"] #data:image/png;base64,xxxxxx
perso_image_b64=perso_image.split(",")[1]
perso_image_raw = base64.b64decode(perso_image_b64)
a = await bot.get_guild(1037663859621765160).get_channel(1317876780635394068).send(file=discord.File(perso_image_raw,filename=f"perso.png"))
perso_image_url = a.attachments[0].url
embed = discord.Embed(title=perso_datas["nom_complet"],description=perso_datas["histoire"])
embed.add_field(name="Pouvoirs",value=perso_datas["pouvoirs"])
embed.add_field(name="Age",value=perso_datas["age"])
embed.add_field(name="Sexe",value=perso_datas["sexe"])
embed.set_footer(text=f"Nom court (ID): {perso_datas['nom_court']}")
embed.set_image(url=perso_image_url)
return embed