import discord from discord.ext import commands from discord import app_commands import sqlite3 import aiohttp import io import os from PIL import Image, ImageDraw, ImageFont from datetime import datetime, timezone class Goodbye(commands.Cog): def __init__(self, bot): self.bot = bot self.db_path = os.path.join(os.path.dirname(__file__), "..", "config.db") def humanize_time_delta(self, date): if date is None: return "date inconnue" if date.tzinfo is None: date = date.replace(tzinfo=timezone.utc) now = datetime.now(timezone.utc) delta = now - date total_days = delta.total_seconds() / (3600 * 24) rounded_days = round(total_days) years = rounded_days // 365 months = rounded_days // 30 weeks = rounded_days // 7 days = rounded_days if years > 0: return f"il y a {years} {'an' if years == 1 else 'ans'}" elif months > 0: return f"il y a {months} mois" elif weeks > 0: return f"il y a {weeks} {'semaine' if weeks == 1 else 'semaines'}" elif days > 0: return f"il y a {days} {'jour' if days == 1 else 'jours'}" elif delta.seconds // 3600 > 0: hours = delta.seconds // 3600 return f"il y a {hours} {'heure' if hours == 1 else 'heures'}" elif (delta.seconds % 3600) // 60 > 0: minutes = (delta.seconds % 3600) // 60 return f"il y a {minutes} {'minute' if minutes == 1 else 'minutes'}" else: seconds = delta.seconds % 60 return f"il y a {seconds} {'seconde' if seconds <= 1 else 'secondes'}" async def create_goodbye_image(self, username, avatar_url): current_dir = os.path.dirname(__file__) base_dir = os.path.abspath(os.path.join(current_dir, "..")) async with aiohttp.ClientSession() as session: async with session.get(avatar_url) as resp: avatar_bytes = await resp.read() background = Image.open(os.path.join(base_dir, 'background_template_goodbye.png')) draw = ImageDraw.Draw(background) font_large = ImageFont.truetype(os.path.join(base_dir, 'custom_font_large.otf'), 70) font_small = ImageFont.truetype(os.path.join(base_dir, 'custom_font_small.otf'), 50) font_large_omega = ImageFont.truetype(os.path.join(base_dir, 'custom_font_large.otf'), 55) draw.text((325, 70), "A Bientot", font=font_large, fill=(255,255,255)) draw.text((325, 135), f"{username} chez", font=font_small, fill=(255,255,255)) draw.text((325, 195), "OMEGA KUBE", font=font_large_omega, fill=(255,255,255)) avatar = Image.open(io.BytesIO(avatar_bytes)).convert("RGBA").resize((224, 224), Image.LANCZOS) mask = Image.new('L', avatar.size, 0) mask_draw = ImageDraw.Draw(mask) mask_draw.ellipse((12, 12, 212, 212), fill=255) background.paste(avatar, (40, 40), mask) img_byte_arr = io.BytesIO() background.save(img_byte_arr, format='PNG') img_byte_arr.seek(0) return img_byte_arr @commands.Cog.listener() async def on_member_remove(self, member): conn = sqlite3.connect(self.db_path) cursor = conn.cursor() cursor.execute('SELECT goodbye_channel FROM server_configs WHERE server_id = ?', (member.guild.id,)) result = cursor.fetchone() conn.close() if result and result[0]: channel = member.guild.get_channel(result[0]) if channel: img = await self.create_goodbye_image(member.name, member.avatar.url if member.avatar else member.default_avatar.url) joined_message = self.humanize_time_delta(member.joined_at) embed = discord.Embed(title=f"{member} viens de nous quitter.", description="Nous espérons vous revoir bientôt ", color=discord.Color.dark_magenta()) embed.set_footer(text=f"Avait rejoint {joined_message}") embed.set_image(url="attachment://goodbye.png") await channel.send(embed=embed, file=discord.File(img, filename="goodbye.png")) @app_commands.command(name="setgoodbye", description="Définit le salon d'aurevoir") @app_commands.checks.has_permissions(administrator=True) async def set_goodbye(self, interaction: discord.Interaction, channel: discord.TextChannel): conn = sqlite3.connect(self.db_path) cursor = conn.cursor() cursor.execute('''INSERT INTO server_configs (server_id, goodbye_channel) VALUES (?, ?) ON CONFLICT(server_id) DO UPDATE SET goodbye_channel=excluded.goodbye_channel''', (interaction.guild_id, channel.id)) conn.commit() conn.close() await interaction.response.send_message(f"Salon d'aurevoir défini sur {channel.mention}", ephemeral=True) async def setup(bot): await bot.add_cog(Goodbye(bot))