223 lines
8.9 KiB
Python
223 lines
8.9 KiB
Python
|
from discord.ext import commands
|
||
|
import discord
|
||
|
|
||
|
from PIL import Image
|
||
|
from PIL import ImageOps
|
||
|
|
||
|
from .utils import checks
|
||
|
from .utils import db
|
||
|
from .utils.passport_generator import generate_passport
|
||
|
from .utils.checks import get_user, check_date
|
||
|
|
||
|
import asyncio, aiohttp, io, time, imghdr, os, shutil, json, textwrap, re, math, datetime
|
||
|
|
||
|
class Passport:
|
||
|
"""Commandes des passeports ."""
|
||
|
|
||
|
def __init__(self, bot):
|
||
|
self.bot = bot
|
||
|
|
||
|
self.conn = db.connect_to_db(self)
|
||
|
self.cursor = self.conn.cursor()
|
||
|
|
||
|
self.cursor.execute("""SHOW TABLES LIKE 'passport'""")
|
||
|
result = self.cursor.fetchone()
|
||
|
|
||
|
if not result:
|
||
|
# Creation table Passport si premiere fois
|
||
|
sql = "CREATE TABLE passport ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, userid TEXT null, os TEXT null, config TEXT null, languages TEXT null, pays TEXT null, passportdate TEXT null, theme CHAR(5) DEFAULT 'dark');"
|
||
|
self.cursor.execute(sql)
|
||
|
|
||
|
@commands.group(pass_context=True)
|
||
|
async def passeport(self, ctx):
|
||
|
"""Passeport"""
|
||
|
|
||
|
if ctx.invoked_subcommand is None:
|
||
|
text = open('texts/passport-info.md').read()
|
||
|
em = discord.Embed(title='Commandes de carte de passeport de TuxBot', description=text, colour=0x89C4F9)
|
||
|
await ctx.send(embed=em)
|
||
|
|
||
|
@passeport.command(pass_context=True)
|
||
|
async def show(self, ctx, user: str = None):
|
||
|
self.conn = db.connect_to_db(self)
|
||
|
self.cursor = self.conn.cursor()
|
||
|
|
||
|
if user == None:
|
||
|
user = get_user(ctx.message, ctx.message.author.name)
|
||
|
else:
|
||
|
user = get_user(ctx.message, user)
|
||
|
|
||
|
wait_message = await ctx.send(f"Je vais chercher le passeport de {user.name} dans les archives, je vous prie de bien vouloir patienter...")
|
||
|
|
||
|
card = await generate_passport(self, user)
|
||
|
s = 'data/users/cards/{0}.png'.format(user.id)
|
||
|
|
||
|
card.save(s, 'png')
|
||
|
|
||
|
with open('data/users/cards/{0}.png'.format(user.id), 'rb') as g:
|
||
|
await ctx.message.channel.send(file=discord.File(g))
|
||
|
await wait_message.delete()
|
||
|
|
||
|
@passeport.command(name="config", pass_context=True)
|
||
|
async def passeport_config(self, ctx):
|
||
|
self.conn = db.connect_to_db(self)
|
||
|
self.cursor = self.conn.cursor()
|
||
|
|
||
|
await ctx.send('Un message privé vous a été envoyé pour configurer votre passeport.')
|
||
|
|
||
|
questions = ["Système(s) d'exploitation :", "Configuration Système :", "Langages de programmation préférés :", "Pays :"]
|
||
|
answers = {}
|
||
|
|
||
|
user_dm = await ctx.author.create_dm()
|
||
|
|
||
|
try:
|
||
|
await user_dm.send("Salut ! Je vais vous posez quelques questions afin de configurer votre passeport, si vous ne voulez pas répondre à une question, envoyez `skip` pour passer à la question suivante.")
|
||
|
except discord.HTTPException:
|
||
|
await ctx.send(f"{str(ctx.message.author.mention)}> il m'est impossible de vous envoyer les messages nécessaire a la configuration de votre passeport :sob:")
|
||
|
return
|
||
|
|
||
|
for x, question in enumerate(questions):
|
||
|
await user_dm.send(question)
|
||
|
|
||
|
def check(m):
|
||
|
return m.channel.id == user_dm.id and m.author.id == user_dm.recipient.id
|
||
|
|
||
|
answer = await self.bot.wait_for('message', check=check)
|
||
|
if answer.content.lower() == 'skip':
|
||
|
answers[x] = 'n/a'
|
||
|
else:
|
||
|
answers[x] = answer.content
|
||
|
try:
|
||
|
self.cursor.execute("""SELECT id, userid FROM passport WHERE userid = %s""", str(user_dm.recipient.id))
|
||
|
result = self.cursor.fetchone()
|
||
|
|
||
|
if result:
|
||
|
self.cursor.execute("""UPDATE passport SET os = %s, config = %s, languages = %s, pays = %s WHERE userid = %s""", (str(answers[0]), str(answers[1]), str(answers[2]), str(answers[3]), str(ctx.message.author.id)))
|
||
|
self.conn.commit()
|
||
|
else:
|
||
|
now = datetime.datetime.now()
|
||
|
|
||
|
self.cursor.execute("""INSERT INTO passport(userid, os, config, languages, pays, passportdate, theme) VALUES(%s, %s, %s, %s, %s, %s, %s)""", (str(ctx.message.author.id), str(answers[0]), str(answers[1]), str(answers[2]), str(answers[3]), now, "dark"))
|
||
|
self.conn.commit()
|
||
|
await user_dm.send('Configuration de votre passeport terminée avec succès, vous pouvez désormais la voir en faisant `.passeport show`.')
|
||
|
except Exception as e:
|
||
|
await user_dm.send(f':sob: Une erreur est survenue : \n {type(e).__name__}: {e}')
|
||
|
|
||
|
@passeport.command(name="background", pass_context=True)
|
||
|
async def passeport_background(self, ctx, *, url=""):
|
||
|
try:
|
||
|
background = ctx.message.attachments[0].url
|
||
|
except:
|
||
|
if url != "":
|
||
|
background = url
|
||
|
else:
|
||
|
em = discord.Embed(title='Une erreur est survenue', description="Image ou URL introuvable.", colour=0xDC3546)
|
||
|
await ctx.send(embed=em)
|
||
|
return
|
||
|
|
||
|
user = ctx.message.author
|
||
|
try:
|
||
|
async with aiohttp.ClientSession() as session:
|
||
|
async with session.get(background) as r:
|
||
|
image = await r.content.read()
|
||
|
except:
|
||
|
em = discord.Embed(title='Une erreur est survenue', description="Image ou URL introuvable.", colour=0xDC3546)
|
||
|
await ctx.send(embed=em)
|
||
|
return
|
||
|
|
||
|
with open(f"data/users/backgrounds/{str(user.id)}.png",'wb') as f:
|
||
|
f.write(image)
|
||
|
|
||
|
isImage = imghdr.what(f"data/users/backgrounds/{str(user.id)}.png")
|
||
|
|
||
|
if isImage == 'png' or isImage == 'jpeg' or isImage == 'jpg' or isImage == 'gif':
|
||
|
f.close()
|
||
|
em = discord.Embed(title='Configuration terminée', description="Fond d'écran enregistré et configuré avec succes", colour=0x28a745)
|
||
|
await ctx.send(embed=em)
|
||
|
else:
|
||
|
f.close()
|
||
|
os.remove(f"data/users/backgrounds/{str(user.id)}.png")
|
||
|
em = discord.Embed(title='Une erreur est survenue', description="Est-ce bien une image que vous avez envoyé ? :thinking:", colour=0xDC3546)
|
||
|
await ctx.send(embed=em)
|
||
|
|
||
|
@passeport.command(name="theme", aliases=["thème"], pass_context=True)
|
||
|
async def passeport_theme(self, ctx, theme: str = ""):
|
||
|
self.conn = db.connect_to_db(self)
|
||
|
self.cursor = self.conn.cursor()
|
||
|
|
||
|
possible_theme = ["dark", "light", "preview"]
|
||
|
|
||
|
if theme.lower() in possible_theme:
|
||
|
if theme.lower() == "dark":
|
||
|
self.cursor.execute("""UPDATE passport SET theme = %s WHERE userid = %s""", ("dark", str(ctx.message.author.id)))
|
||
|
self.conn.commit()
|
||
|
|
||
|
em = discord.Embed(title='Configuration terminée', description="Thème enregistré avec succes", colour=0x28a745)
|
||
|
await ctx.send(embed=em)
|
||
|
elif theme.lower() == "light":
|
||
|
self.cursor.execute("""UPDATE passport SET theme = %s WHERE userid = %s""", ("light", str(ctx.message.author.id)))
|
||
|
self.conn.commit()
|
||
|
|
||
|
em = discord.Embed(title='Configuration terminée', description="Thème enregistré avec succes", colour=0x28a745)
|
||
|
await ctx.send(embed=em)
|
||
|
else:
|
||
|
wait_message = await ctx.send(f"Laissez moi juste le temps de superposer les 2 passeports, je vous prie de bien vouloir patienter...")
|
||
|
cardbg = Image.new('RGBA', (1600, 500), (0, 0, 0, 255))
|
||
|
|
||
|
card_dark = await generate_passport(self, ctx.author, "dark")
|
||
|
card_dark.save(f'data/tmp/{ctx.author.id}_dark.png', 'png')
|
||
|
|
||
|
card_light = await generate_passport(self, ctx.author, "light")
|
||
|
card_light.save(f'data/tmp/{ctx.author.id}_light.png', 'png')
|
||
|
|
||
|
saved_card_dark = Image.open(f'data/tmp/{ctx.author.id}_dark.png')
|
||
|
saved_card_light = Image.open(f'data/tmp/{ctx.author.id}_light.png')
|
||
|
|
||
|
saved_card_dark = ImageOps.fit(saved_card_dark, (800, 500))
|
||
|
saved_card_light = ImageOps.fit(saved_card_light, (800, 500))
|
||
|
|
||
|
cardbg.paste(saved_card_dark, (0, 0))
|
||
|
cardbg.paste(saved_card_light, (800, 0))
|
||
|
|
||
|
cardbg.save(f'data/tmp/{ctx.author.id}.png', 'png')
|
||
|
|
||
|
with open(f'data/tmp/{ctx.author.id}.png', 'rb') as g:
|
||
|
await ctx.send(file=discord.File(g))
|
||
|
await wait_message.delete()
|
||
|
await ctx.send(f"Et voila {ctx.author.mention} ! à gauche votre passeport avec le thème \"dark\" et à droite avec le thème \"light\" :wink:")
|
||
|
|
||
|
shutil.rmtree("data/tmp")
|
||
|
os.mkdir("data/tmp")
|
||
|
|
||
|
else:
|
||
|
em = discord.Embed(title='Une erreur est survenue', description="Les choix possible pour cette commande sont : `dark`, `light`, `preview`", colour=0xDC3546)
|
||
|
await ctx.send(embed=em)
|
||
|
|
||
|
@passeport.command(name="delete", pass_context=True)
|
||
|
async def passeport_delete(self, ctx):
|
||
|
self.conn = db.connect_to_db(self)
|
||
|
self.cursor = self.conn.cursor()
|
||
|
|
||
|
self.cursor.execute("""SELECT id, userid FROM passport WHERE userid = %s""", str(ctx.author.id))
|
||
|
result = self.cursor.fetchone()
|
||
|
|
||
|
if result:
|
||
|
def check(m):
|
||
|
return m.author.id == ctx.author.id and \
|
||
|
m.channel.id == ctx.channel.id
|
||
|
|
||
|
await ctx.send(f"{str(ctx.message.author.mention)}> envoyez `CONFIRMER` afin de supprimer vos données conformément à l'article 17 du `règlement général sur la protection des données` sur le `Droit à l'effacement`")
|
||
|
response = await self.bot.wait_for('message', check=check, timeout=10.0 * 60.0)
|
||
|
if response.content == "CONFIRMER":
|
||
|
os.remove(f"data/users/backgrounds/{str(ctx.author.id)}.png")
|
||
|
self.cursor.execute("""DELETE FROM passport WHERE userid =%s""", (str(ctx.message.author.id)))
|
||
|
self.conn.commit()
|
||
|
|
||
|
em = discord.Embed(title='Suppression confirmée', description="Vos données ont été supprimées avec succès", colour=0x28a745)
|
||
|
await ctx.send(embed=em)
|
||
|
else:
|
||
|
await ctx.send("Déja configure ton passeport avant de la supprimer u_u (après c'est pas logique...)")
|
||
|
|
||
|
def setup(bot):
|
||
|
bot.add_cog(Passport(bot))
|