tuxbot-bot/cogs/passport.py

223 lines
8.9 KiB
Python
Raw Normal View History

2018-11-18 02:05:22 +00:00
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))