diff --git a/README b/README old mode 100644 new mode 100755 diff --git a/bot.py b/bot.py index 5458874..d42ae81 100755 --- a/bot.py +++ b/bot.py @@ -1,120 +1,133 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -__author__ = ["Romain", "Maël / Outout"] +__author__ = "Maël / Outout | Romain" __licence__ = "WTFPL Licence 2.0" -from discord.ext import commands +import copy +import datetime +import os +import sys +import traceback + +import aiohttp import discord +from discord.ext import commands + +import cogs.utils.cli_colors as colors +import config from cogs.utils import checks -import datetime -import json -import copy -import traceback -import sys -import os -import aiohttp - -import config -import cogs.utils.cli_colors as colors - -l_extensions = [ - - 'cogs.admin', - # 'cogs.afk', - 'cogs.basics', - 'cogs.ci', - 'cogs.cog_manager', - 'cogs.filter_messages', - 'cogs.funs', - 'cogs.passport', - 'cogs.role', - 'cogs.search', - 'cogs.send_logs', - 'cogs.sondage', - 'cogs.utility' -] +l_extensions = ( + 'cogs.admin', + 'cogs.afk', + 'cogs.atc', + 'cogs.basics', + 'cogs.ci', + 'cogs.cog_manager', + 'cogs.filter_messages', + 'cogs.funs', + 'cogs.passport', + 'cogs.role', + 'cogs.search', + 'cogs.send_logs', + 'cogs.sondage', + 'cogs.utility', + 'cogs.vocal', +) help_attrs = dict(hidden=True, in_help=True, name="DONOTUSE") class TuxBot(commands.Bot): - def __init__ (self): - self.config = config - super().__init__(command_prefix=self.config.prefix[0], - description=self.config.description, - pm_help=None, - help_attrs=help_attrs) + def __init__(self): + self.uptime = datetime.datetime.utcnow() + self.config = config + super().__init__(command_prefix=self.config.prefix[0], + description=self.config.description, + pm_help=None, + help_command = None + ) - self.client_id = self.config.client_id - self.session = aiohttp.ClientSession(loop=self.loop) - self._events = [] + self.client_id = self.config.client_id + self.session = aiohttp.ClientSession(loop=self.loop) + self._events = [] + + self.add_command(self.do) + + for extension in l_extensions: + try: + self.load_extension(extension) + print(f"{colors.text_colors.GREEN}\"{extension}\"" + f" chargé !{colors.ENDC}") + except Exception as e: + print(f"{colors.text_colors.RED}" + f"Impossible de charger l'extension {extension}\n" + f"{type(e).__name__}: {e}{colors.ENDC}", file=sys.stderr) + + async def on_command_error(self, ctx, error): + if isinstance(error, commands.NoPrivateMessage): + await ctx.author.send('Cette commande ne peut pas être utilisée ' + 'en message privé.') + elif isinstance(error, commands.DisabledCommand): + await ctx.author.send('Desolé mais cette commande est desactivée, ' + 'elle ne peut donc pas être utilisée.') + elif isinstance(error, commands.CommandInvokeError): + print(f'In {ctx.command.qualified_name}:', file=sys.stderr) + traceback.print_tb(error.original.__traceback__) + print(f'{error.original.__class__.__name__}: {error.original}', + file=sys.stderr) + + async def on_ready(self): + log_channel_id = self.get_channel(int(self.config.log_channel_id)) + + print('\n\n---------------------') + print('CONNECTÉ :') + print(f'Nom d\'utilisateur: {self.user} {colors.text_style.DIM}' + f'(ID: {self.user.id}){colors.ENDC}') + print(f'Salon de journalisation: {log_channel_id} {colors.text_style.DIM}' + f'(ID: {log_channel_id.id}){colors.ENDC}') + print(f'Prefix: {self.config.prefix[0]}') + print('Merci d\'utiliser TuxBot') + print('---------------------\n\n') + + await self.change_presence(status=discord.Status.dnd, + activity=discord.Game( + name=self.config.game), + ) + + @staticmethod + async def on_resumed(): + print('resumed...') + + async def on_message(self, message): + if message.author.bot: + return + + try: + await self.process_commands(message) + except Exception as e: + print(f'{colors.text_colors.RED}Erreur rencontré : \n' + f' {type(e).__name__}: {e}{colors.ENDC} \n \n') + + def run(self): + super().run(self.config.token, reconnect=True) + + @checks.has_permissions(administrator=True) + @commands.command(pass_context=True, hidden=True) + async def do(self, ctx, times: int, *, command): + """Repeats a command a specified number of times.""" + msg = copy.copy(ctx.message) + msg.content = command + for i in range(times): + await self.process_commands(msg) - self.add_command(self.do) - - for extension in l_extensions: - try: - self.load_extension(extension) - print(f"{colors.text_colors.GREEN}\"{extension}\" chargé !{colors.ENDC}") - except Exception as e: - print(f"{colors.text_colors.RED}Impossible de charger l'extension {extension}\n{type(e).__name__}: {e}{colors.ENDC}", file=sys.stderr) - - async def on_command_error(self, ctx, error): - if isinstance(error, commands.NoPrivateMessage): - await ctx.author.send('Cette commande ne peut pas être utilisee en message privee.') - elif isinstance(error, commands.DisabledCommand): - await ctx.author.send('Desoler mais cette commande est desactive, elle ne peut donc pas être utilisée.') - elif isinstance(error, commands.CommandInvokeError): - print(f'In {ctx.command.qualified_name}:', file=sys.stderr) - traceback.print_tb(error.original.__traceback__) - print(f'{error.original.__class__.__name__}: {error.original}', file=sys.stderr) - - async def on_ready(self): - if not hasattr(self, 'uptime'): - self.uptime = datetime.datetime.utcnow() - - log_channel_id = self.get_channel(int(self.config.log_channel_id)) - - print('\n\n---------------------') - print('CONNECTÉ :') - print(f'Nom d\'utilisateur: {self.user} {colors.text_style.DIM}(ID: {self.user.id}){colors.ENDC}') - print(f'Channel de log: {log_channel_id} {colors.text_style.DIM}(ID: {log_channel_id.id}){colors.ENDC}') - print(f'Prefix: {self.config.prefix[0]}') - print('Merci d\'utiliser TuxBot') - print('---------------------\n\n') - - await self.change_presence(status=discord.Status.dnd, activity=discord.Game(name=self.config.game)) - - async def on_resumed(): - print('resumed...') - - async def on_message(self, message): - if message.author.bot: - return - - try: - await self.process_commands(message) - except Exception as e: - print(f'{colors.text_colors.RED}Erreur rencontré : \n {type(e).__name__}: {e}{colors.ENDC} \n \n') - - def run(self): - super().run(self.config.token, reconnect=True) - - @checks.has_permissions(administrator=True) - @commands.command(pass_context=True, hidden=True) - async def do(ctx, times: int, *, command): - """Repeats a command a specified number of times.""" - msg = copy.copy(ctx.message) - msg.content = command - for i in range(times): - await bot.process_commands(msg) - -## LOAD ## if __name__ == '__main__': - if os.path.exists('config.py') is not True: - print(f"{colors.text_colors.RED}Veuillez créer le fichier config.py{colors.ENDC}"); exit() - - tuxbot = TuxBot() - tuxbot.run() + if os.path.exists('config.py') is not True: + print(f"{colors.text_colors.RED}" + f"Veuillez créer le fichier config.py{colors.ENDC}") + exit() + + tuxbot = TuxBot() + tuxbot.run() diff --git a/cogs/.DS_Store b/cogs/.DS_Store old mode 100644 new mode 100755 diff --git a/cogs/admin.py b/cogs/admin.py index 91b6e7c..a0b3bc5 100755 --- a/cogs/admin.py +++ b/cogs/admin.py @@ -1,336 +1,541 @@ from discord.ext import commands import discord -import aiohttp import asyncio -import time from .utils import checks from .utils.checks import get_user -import json -import random - -import datetime - -import requests +import traceback +import textwrap +from contextlib import redirect_stdout +import inspect +import io -class Admin: - """Commandes secrètes d'administration.""" +class Admin(commands.Cog): + """Commandes secrètes d'administration.""" + def __init__(self, bot): + self.bot = bot + self._last_result = None + self.sessions = set() - def __init__(self, bot): - self.bot = bot + @staticmethod + def cleanup_code(content): + if content.startswith('```') and content.endswith('```'): + return '\n'.join(content.split('\n')[1:-1]) + return content.strip('` \n') - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @checks.has_permissions(administrator=True) - @commands.command(pass_context=True) - async def ban(self, ctx, user, *, reason=""): - """Ban user""" - user = get_user(ctx.message, user) - if user: - try: - await user.ban(reason=reason) - return_msg = "`{}` a été banni\n".format(user.mention) - if reason: - return_msg += "raison : `{}`".format(reason) - return_msg += "." - await ctx.send(return_msg) - except discord.Forbidden: - await ctx.send('Impossible de bannir cet user, probleme de permission.') - else: - return await ctx.send('Impossible de trouver l\'user.') + @checks.has_permissions(administrator=True) + @commands.command(pass_context=True) + async def ban(self, ctx, user, *, reason=""): + """Ban user""" + user = get_user(ctx.message, user) + if user: + try: + await user.ban(reason=reason) + return_msg = f"`{user.mention}` a été banni\n" + if reason: + return_msg += f"raison : `{reason}`" + return_msg += "." + await ctx.send(return_msg) + except discord.Forbidden: + await ctx.send('Impossible de bannir cet user,' + ' probleme de permission.') + else: + return await ctx.send('Impossible de trouver l\'user.') - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @checks.has_permissions(administrator=True) - @commands.command(pass_context=True) - async def kick(self, ctx, user, *, reason=""): - """Kick a user""" - user = get_user(ctx.message, user) - if user: - try: - await user.kick(reason=reason) - return_msg = "`{}` a été kické\n".format(user.mention) - if reason: - return_msg += "raison : `{}`".format(reason) - return_msg += "." - await ctx.send(return_msg) - except discord.Forbidden: - await ctx.send('Impossible de kicker cet user, probleme de permission.') - else: - return await ctx.send('Impossible de trouver l\'user.') + @checks.has_permissions(administrator=True) + @commands.command(pass_context=True) + async def kick(self, ctx, user, *, reason=""): + """Kick a user""" + user = get_user(ctx.message, user) + if user: + try: + await user.kick(reason=reason) + return_msg = f"`{user.mention}` a été kické\n" + if reason: + return_msg += f"raison : `{reason}`" + return_msg += "." + await ctx.send(return_msg) + except discord.Forbidden: + await ctx.send('Impossible de kicker cet user,' + ' probleme de permission.') + else: + return await ctx.send('Impossible de trouver l\'user.') - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @checks.has_permissions(administrator=True) - @commands.command(name='clear', pass_context=True) - async def _clear(self, ctx, number: int, silent: str = True): - """Clear of message(s)""" - try: - await ctx.message.delete() - except: - print("Impossible de supprimer le message \"" + str(ctx.message.content) + "\"") - if number < 1000: - async for message in ctx.message.channel.history(limit=number): - try: - await message.delete() - except Exception as e: #TODO : A virer dans l'event on_error - if silent is not True: - await ctx.send(':sob: Une erreur est survenue : \n {}: {}'.format(type(e).__name__, e)) - if silent is not True: - await ctx.send("Hop voila j'ai viré des messages! Hello World") - print(str(number)+" messages ont été supprimés") - else: - await ctx.send('Trop de messages, entre un nombre < 1000') + @checks.has_permissions(administrator=True) + @commands.command(name='clear', pass_context=True) + async def _clear(self, ctx, number: int, silent: str = True): + """Clear of message(s)""" + try: + await ctx.message.delete() + except Exception: + print(f"Impossible de supprimer le message " + f"\"{str(ctx.message.content)}\"") + if number < 1000: + try: + await ctx.message.channel.purge(limit=number) + except Exception as e: # TODO : A virer dans l'event on_error + if silent is not True: + await ctx.send(f':sob: Une erreur est survenue : \n' + f' {type(e).__name__}: {e}') + if silent is not True: + await ctx.send("Hop voila j'ai viré des messages! Hello World") + print(f"{str(number)} messages ont été supprimés") + else: + await ctx.send('Trop de messages, entre un nombre < 1000') - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @checks.has_permissions(administrator=True) - @commands.command(name='say', pass_context=True) - async def _say(self, ctx, *, tosay:str): - """Say a message in the current channel""" - try: - try: - await ctx.message.delete() - except: - print("Impossible de supprimer le message \"" + str(ctx.message.content) + "\"") - await ctx.send(tosay) - except Exception as e: #TODO : A virer dans l'event on_error - await ctx.send(':sob: Une erreur est survenue : \n {}: {}'.format(type(e).__name__, e)) + @checks.has_permissions(administrator=True) + @commands.command(name='say', pass_context=True) + async def _say(self, ctx, *, tosay: str): + """Say a message in the current channel""" + try: + try: + await ctx.message.delete() + except Exception: + print(f"Impossible de supprimer le message " + f"\"{str(ctx.message.content)}\"") + await ctx.send(tosay) + except Exception as e: # TODO : A virer dans l'event on_error + await ctx.send(f':sob: Une erreur est survenue : \n' + f' {type(e).__name__}: {e}') - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @checks.has_permissions(administrator=True) - @commands.command(name='sayto', pass_context=True) - async def _sayto(self, ctx, id:int, *, tosay:str): - """Say a message in the channel""" - try: - chan = self.bot.get_channel(id) - try: - await ctx.message.delete() - except: - print("Impossible de supprimer le message \"" + str(ctx.message.content) + "\"") - try: - await chan.send(tosay) - except Exception as e: - print("Impossible d'envoyer le message dans " + str(id)) - except Exception as e: #TODO : A virer dans l'event on_error - await ctx.send(':sob: Une erreur est survenue : \n {}: {}'.format(type(e).__name__, e)) + @checks.has_permissions(administrator=True) + @commands.command(name='sayto', pass_context=True) + async def _sayto(self, ctx, channel_id: int, *, tosay: str): + """Say a message in the channel""" + try: + chan = self.bot.get_channel(channel_id) + try: + await ctx.message.delete() + except Exception: + print(f"Impossible de supprimer le message " + f"\"{str(ctx.message.content)}\"") + try: + await chan.send(tosay) + except Exception: + print(f"Impossible d'envoyer le message dans {str(channel_id)}") + except Exception as e: # TODO : A virer dans l'event on_error + await ctx.send(f':sob: Une erreur est survenue : \n' + f' {type(e).__name__}: {e}') - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @checks.has_permissions(administrator=True) - @commands.command(name='sayto_dm', pass_context=True) - async def _sayto_dm(self, ctx, id:int, *, tosay:str): - """Say a message to the user""" - try: - user = self.bot.get_user(id) - try: - await ctx.message.delete() - except: - print("Impossible de supprimer le message \"" + str(ctx.message.content) + "\"") - try: - await user.send(tosay) - except Exception as e: - print("Impossible d'envoyer le message dans " + str(id)) - except Exception as e: #TODO : A virer dans l'event on_error - await ctx.send(':sob: Une erreur est survenue : \n {}: {}'.format(type(e).__name__, e)) + @checks.has_permissions(administrator=True) + @commands.command(name='sayto_dm', pass_context=True) + async def _sayto_dm(self, ctx, user_id: int, *, tosay: str): + """Say a message to the user""" + try: + user = self.bot.get_user(user_id) + try: + await ctx.message.delete() + except Exception: + print(f"Impossible de supprimer le message " + f"\"{str(ctx.message.content)}\"") + try: + await user.send(tosay) + except Exception: + print(f"Impossible d'envoyer le message dans {str(user_id)}") + except Exception as e: # TODO : A virer dans l'event on_error + await ctx.send(f':sob: Une erreur est survenue : \n' + f' {type(e).__name__}: {e}') - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @checks.has_permissions(administrator=True) - @commands.command(name='editsay', pass_context=True) - async def _editsay(self, ctx, id:int, *, new_content:str): - """Edit a bot's message""" - try: - try: - await ctx.message.delete() - except: - print("Impossible de supprimer le message \"" + str(ctx.message.content) + "\"") - toedit = await ctx.channel.get_message(id) - except discord.errors.NotFound: - await ctx.send("Impossible de trouver le message avec l'id `{}` sur ce salon".format(id)) - return - try: - await toedit.edit(content=str(new_content)) - except discord.errors.Forbidden: - await ctx.send("J'ai po les perms pour editer mes messages :(") + @checks.has_permissions(administrator=True) + @commands.command(name='editsay', pass_context=True) + async def _editsay(self, ctx, id: int, *, new_content: str): + """Edit a bot's message""" + try: + try: + await ctx.message.delete() + except Exception: + print(f"Impossible de supprimer le message " + f"\"{str(ctx.message.content)}\"") + toedit = await ctx.channel.get_message(id) + except discord.errors.NotFound: + await ctx.send(f"Impossible de trouver le message avec l'id " + f"`{id}` sur ce salon") + return + try: + await toedit.edit(content=str(new_content)) + except discord.errors.Forbidden: + await ctx.send("J'ai po les perms pour editer mes messages :(") - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @checks.has_permissions(administrator=True) - @commands.command(name='addreaction', pass_context=True) - async def _addreaction(self, ctx, id:int, reaction:str): - """Add reactions to a message""" - try: - try: - await ctx.message.delete() - except: - print("Impossible de supprimer le message \"" + str(ctx.message.content) + "\"") - toadd = await ctx.channel.get_message(id) - except discord.errors.NotFound: - await ctx.send("Impossible de trouver le message avec l'id `{}` sur ce salon".format(id)) - return - try: - await toadd.add_reaction(reaction) - except discord.errors.Forbidden: - await ctx.send("J'ai po les perms pour ajouter des réactions :(") + @checks.has_permissions(administrator=True) + @commands.command(name='addreaction', pass_context=True) + async def _addreaction(self, ctx, id: int, reaction: str): + """Add reactions to a message""" + try: + try: + await ctx.message.delete() + except Exception: + print(f"Impossible de supprimer le message " + f"\"{str(ctx.message.content)}\"") + toadd = await ctx.channel.get_message(id) + except discord.errors.NotFound: + await ctx.send(f"Impossible de trouver le message avec l'id " + f"`{id}` sur ce salon") + return + try: + await toadd.add_reaction(reaction) + except discord.errors.Forbidden: + await ctx.send("J'ai po les perms pour ajouter des réactions :(") - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @checks.has_permissions(administrator=True) - @commands.command(name='delete', pass_context=True) - async def _delete(self, ctx, id:int): - """Delete message in current channel""" - try: - try: - await ctx.message.delete() - except: - print("Impossible de supprimer le message \"" + str(ctx.message.content) + "\"") - todelete = await ctx.channel.get_message(id) - except discord.errors.NotFound: - await ctx.send("Impossible de trouver le message avec l'id `{}` sur ce salon".format(id)) - return - try: - await todelete.delete() - except discord.errors.Forbidden: - await ctx.send("J'ai po les perms pour supprimer des messages :(") + @checks.has_permissions(administrator=True) + @commands.command(name='delete', pass_context=True) + async def _delete(self, ctx, id: int): + """Delete message in current channel""" + try: + try: + await ctx.message.delete() + except Exception: + print(f"Impossible de supprimer le message " + f"\"{str(ctx.message.content)}\"") + todelete = await ctx.channel.get_message(id) + except discord.errors.NotFound: + await ctx.send(f"Impossible de trouver le message avec l'id " + f"`{id}` sur ce salon") + return + try: + await todelete.delete() + except discord.errors.Forbidden: + await ctx.send("J'ai po les perms pour supprimer des messages :(") - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @checks.has_permissions(administrator=True) - @commands.command(name='deletefrom', pass_context=True) - async def _deletefrom(self, ctx, chan_id:int, *, message_id:str): - """Delete message in channel""" - try: - chan = self.bot.get_channel(chan_id) - try: - await ctx.message.delete() - except: - print("Impossible de supprimer le message \"" + str(ctx.message.content) + "\"") - todelete = await chan.get_message(message_id) - except discord.errors.NotFound: - await ctx.send("Impossible de trouver le message avec l'id `{}` sur le salon".format(id)) - return - try: - await todelete.delete() - except discord.errors.Forbidden: - await ctx.send("J'ai po les perms pour supprimer le message :(") + @checks.has_permissions(administrator=True) + @commands.command(name='deletefrom', pass_context=True) + async def _deletefrom(self, ctx, chan_id: int, *, message_id: str): + """Delete message in channel""" + try: + chan = self.bot.get_channel(chan_id) + try: + await ctx.message.delete() + except Exception: + print(f"Impossible de supprimer le message " + f"\"{str(ctx.message.content)}\"") + todelete = await chan.get_message(message_id) + except discord.errors.NotFound: + await ctx.send(f"Impossible de trouver le message avec l'id " + f"`{id}` sur le salon") + return + try: + await todelete.delete() + except discord.errors.Forbidden: + await ctx.send("J'ai po les perms pour supprimer le message :(") - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @checks.has_permissions(administrator=True) - @commands.command(name='embed', pass_context=True) - async def _embed(self, ctx, *, msg: str = "help"): - """Send an embed""" - if msg != "help": - ptext = title = description = image = thumbnail = color = footer = author = None - timestamp = discord.Embed.Empty - embed_values = msg.split('|') - for i in embed_values: - if i.strip().lower().startswith('ptext='): - ptext = i.strip()[6:].strip() - elif i.strip().lower().startswith('title='): - title = i.strip()[6:].strip() - elif i.strip().lower().startswith('description='): - description = i.strip()[12:].strip() - elif i.strip().lower().startswith('desc='): - description = i.strip()[5:].strip() - elif i.strip().lower().startswith('image='): - image = i.strip()[6:].strip() - elif i.strip().lower().startswith('thumbnail='): - thumbnail = i.strip()[10:].strip() - elif i.strip().lower().startswith('colour='): - color = i.strip()[7:].strip() - elif i.strip().lower().startswith('color='): - color = i.strip()[6:].strip() - elif i.strip().lower().startswith('footer='): - footer = i.strip()[7:].strip() - elif i.strip().lower().startswith('author='): - author = i.strip()[7:].strip() - elif i.strip().lower().startswith('timestamp'): - timestamp = ctx.message.created_at - else: - if description is None and not i.strip().lower().startswith('field='): - description = i.strip() + @checks.has_permissions(administrator=True) + @commands.command(name='embed', pass_context=True) + async def _embed(self, ctx, *, msg: str = "help"): + """Send an embed""" + if msg != "help": + ptext = title \ + = description \ + = image \ + = thumbnail \ + = color \ + = footer \ + = author \ + = None + timestamp = discord.Embed.Empty + embed_values = msg.split('|') + for i in embed_values: + if i.strip().lower().startswith('ptext='): + ptext = i.strip()[6:].strip() + elif i.strip().lower().startswith('title='): + title = i.strip()[6:].strip() + elif i.strip().lower().startswith('description='): + description = i.strip()[12:].strip() + elif i.strip().lower().startswith('desc='): + description = i.strip()[5:].strip() + elif i.strip().lower().startswith('image='): + image = i.strip()[6:].strip() + elif i.strip().lower().startswith('thumbnail='): + thumbnail = i.strip()[10:].strip() + elif i.strip().lower().startswith('colour='): + color = i.strip()[7:].strip() + elif i.strip().lower().startswith('color='): + color = i.strip()[6:].strip() + elif i.strip().lower().startswith('footer='): + footer = i.strip()[7:].strip() + elif i.strip().lower().startswith('author='): + author = i.strip()[7:].strip() + elif i.strip().lower().startswith('timestamp'): + timestamp = ctx.message.created_at + else: + if description is None and not i.strip()\ + .lower().startswith('field='): + description = i.strip() - if color: - if color.startswith('#'): - color = color[1:] - if not color.startswith('0x'): - color = '0x' + color + if color: + if color.startswith('#'): + color = color[1:] + if not color.startswith('0x'): + color = '0x' + color - if ptext is title is description is image is thumbnail is color is footer is author is None and 'field=' not in msg: - try: - await ctx.message.delete() - except: - print("Impossible de supprimer le message \"" + str(ctx.message.content) + "\"") - return await ctx.send(content=None, - embed=discord.Embed(description=msg)) + if ptext \ + is title \ + is description \ + is image \ + is thumbnail \ + is color \ + is footer \ + is author \ + is None \ + and 'field=' not in msg: + try: + await ctx.message.delete() + except Exception: + print("Impossible de supprimer le message \"" + str( + ctx.message.content) + "\"") + return await ctx.send(content=None, + embed=discord.Embed(description=msg)) - if color: - em = discord.Embed(timestamp=timestamp, title=title, description=description, color=int(color, 16)) - else: - em = discord.Embed(timestamp=timestamp, title=title, description=description) - for i in embed_values: - if i.strip().lower().startswith('field='): - field_inline = True - field = i.strip().lstrip('field=') - field_name, field_value = field.split('value=') - if 'inline=' in field_value: - field_value, field_inline = field_value.split('inline=') - if 'false' in field_inline.lower() or 'no' in field_inline.lower(): - field_inline = False - field_name = field_name.strip().lstrip('name=') - em.add_field(name=field_name, value=field_value.strip(), inline=field_inline) - if author: - if 'icon=' in author: - text, icon = author.split('icon=') - if 'url=' in icon: - em.set_author(name=text.strip()[5:], icon_url=icon.split('url=')[0].strip(), url=icon.split('url=')[1].strip()) - else: - em.set_author(name=text.strip()[5:], icon_url=icon) - else: - if 'url=' in author: - em.set_author(name=author.split('url=')[0].strip()[5:], url=author.split('url=')[1].strip()) - else: - em.set_author(name=author) + if color: + em = discord.Embed(timestamp=timestamp, title=title, + description=description, + color=int(color, 16)) + else: + em = discord.Embed(timestamp=timestamp, title=title, + description=description) + for i in embed_values: + if i.strip().lower().startswith('field='): + field_inline = True + field = i.strip().lstrip('field=') + field_name, field_value = field.split('value=') + if 'inline=' in field_value: + field_value, field_inline = field_value.split( + 'inline=') + if 'false' in field_inline.lower() \ + or 'no' in field_inline.lower(): + field_inline = False + field_name = field_name.strip().lstrip('name=') + em.add_field(name=field_name, value=field_value.strip(), + inline=field_inline) + if author: + if 'icon=' in author: + text, icon = author.split('icon=') + if 'url=' in icon: + em.set_author(name=text.strip()[5:], + icon_url=icon.split('url=')[0].strip(), + url=icon.split('url=')[1].strip()) + else: + em.set_author(name=text.strip()[5:], icon_url=icon) + else: + if 'url=' in author: + em.set_author(name=author.split('url=')[0].strip()[5:], + url=author.split('url=')[1].strip()) + else: + em.set_author(name=author) - if image: - em.set_image(url=image) - if thumbnail: - em.set_thumbnail(url=thumbnail) - if footer: - if 'icon=' in footer: - text, icon = footer.split('icon=') - em.set_footer(text=text.strip()[5:], icon_url=icon) - else: - em.set_footer(text=footer) + if image: + em.set_image(url=image) + if thumbnail: + em.set_thumbnail(url=thumbnail) + if footer: + if 'icon=' in footer: + text, icon = footer.split('icon=') + em.set_footer(text=text.strip()[5:], icon_url=icon) + else: + em.set_footer(text=footer) - try: - await ctx.message.delete() - except: - print("Impossible de supprimer le message \"" + str(ctx.message.content) + "\"") - await ctx.send(content=ptext, embed=em) + try: + await ctx.message.delete() + except Exception: + print("Impossible de supprimer le message \"" + str( + ctx.message.content) + "\"") + await ctx.send(content=ptext, embed=em) - else: - embed=discord.Embed(title="Aide sur l'utilisation de la commande .embed:") - embed.add_field(name="Titre:", value="title=", inline=True) - embed.add_field(name="Description:", value="description=", inline=True) - embed.add_field(name="Couleur:", value="color=", inline=True) - embed.add_field(name="Image:", value="image=", inline=True) - embed.add_field(name="Thumbnail:", value="thumbnail=", inline=True) - embed.add_field(name="Auteur:", value="author=", inline=True) - embed.add_field(name="Icon", value="icon=", inline=True) - embed.add_field(name="Footer", value="footer=", inline=True) - embed.set_footer(text="Exemple: .embed title=Un titre | description=Une description | color=3AB35E | field=name=test value=test") + else: + embed = discord.Embed( + title="Aide sur l'utilisation de la commande .embed:") + embed.add_field(name="Titre:", value="title=", + inline=True) + embed.add_field(name="Description:", + value="description=", inline=True) + embed.add_field(name="Couleur:", value="color=", + inline=True) + embed.add_field(name="Image:", + value="image=", + inline=True) + embed.add_field(name="Thumbnail:", + value="thumbnail=", inline=True) + embed.add_field(name="Auteur:", value="author=", + inline=True) + embed.add_field(name="Icon", value="icon=", + inline=True) + embed.add_field(name="Footer", value="footer=", + inline=True) + embed.set_footer(text="Exemple: .embed title=Un titre |" + " description=Une description |" + " color=3AB35E |" + " field=name=test value=test") - await ctx.send(embed=embed) + await ctx.send(embed=embed) - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" + + @checks.has_permissions(administrator=True) + @commands.command(pass_context=True, hidden=True) + async def repl(self, ctx): + """Launches an interactive REPL session.""" + variables = { + 'ctx': ctx, + 'bot': self.bot, + 'message': ctx.message, + 'guild': ctx.guild, + 'channel': ctx.channel, + 'author': ctx.author, + '_': None, + } + + if ctx.channel.id in self.sessions: + await ctx.send('Already running a REPL session in this channel.' + ' Exit it with `quit`.') + return + + self.sessions.add(ctx.channel.id) + await ctx.send( + 'Enter code to execute or evaluate. `exit()` or `quit` to exit.') + + def check(m): + return m.author.id == ctx.author.id and \ + m.channel.id == ctx.channel.id and \ + m.content.startswith('`') + + while True: + try: + response = await self.bot.wait_for('message', check=check, + timeout=10.0 * 60.0) + except asyncio.TimeoutError: + await ctx.send('Exiting REPL session.') + self.sessions.remove(ctx.channel.id) + break + + cleaned = self.cleanup_code(response.content) + + if cleaned in ('quit', 'exit', 'exit()'): + await ctx.send('Exiting.') + self.sessions.remove(ctx.channel.id) + return + + executor = exec + if cleaned.count('\n') == 0: + # single statement, potentially 'eval' + try: + code = compile(cleaned, '', 'eval') + except SyntaxError: + pass + else: + executor = eval + + if executor is exec: + try: + code = compile(cleaned, '', 'exec') + except SyntaxError as e: + await ctx.send(self.get_syntax_error(e)) + continue + + variables['message'] = response + + fmt = None + stdout = io.StringIO() + + try: + with redirect_stdout(stdout): + result = executor(code, variables) + if inspect.isawaitable(result): + result = await result + except Exception as e: + value = stdout.getvalue() + fmt = f'```py\n{value}{traceback.format_exc()}\n```' + else: + value = stdout.getvalue() + if result is not None: + fmt = f'```py\n{value}{result}\n```' + variables['_'] = result + elif value: + fmt = f'```py\n{value}\n```' + + try: + if fmt is not None: + if len(fmt) > 2000: + await ctx.send('Content too big to be printed.') + else: + await ctx.send(fmt) + except discord.Forbidden: + pass + except discord.HTTPException as e: + await ctx.send(f'Unexpected error: `{e}`') + + """---------------------------------------------------------------------""" + + @checks.has_permissions(administrator=True) + @commands.command(pass_context=True, hidden=True, name='eval') + async def _eval(self, ctx, *, body: str): + """Evaluates a code""" + + env = { + 'bot': self.bot, + 'ctx': ctx, + 'channel': ctx.channel, + 'author': ctx.author, + 'guild': ctx.guild, + 'message': ctx.message, + '_': self._last_result + } + + env.update(globals()) + + body = self.cleanup_code(body) + stdout = io.StringIO() + + to_compile = f'async def func():\n{textwrap.indent(body, " ")}' + + try: + exec(to_compile, env) + except Exception as e: + return await ctx.send(f'```py\n{e.__class__.__name__}: {e}\n```') + + func = env['func'] + try: + with redirect_stdout(stdout): + ret = await func() + except Exception: + value = stdout.getvalue() + await ctx.send(f'```py\n{value}{traceback.format_exc()}\n```') + else: + value = stdout.getvalue() + try: + await ctx.message.add_reaction('\u2705') + except Exception: + pass + + if ret is None: + if value: + await ctx.send(f'```py\n{value}\n```') + else: + self._last_result = ret + await ctx.send(f'```py\n{value}{ret}\n```') def setup(bot): - bot.add_cog(Admin(bot)) + bot.add_cog(Admin(bot)) diff --git a/cogs/afk.py b/cogs/afk.py index cb1151b..d53d35f 100755 --- a/cogs/afk.py +++ b/cogs/afk.py @@ -1,62 +1,53 @@ from discord.ext import commands +import discord import random -class AFK: +class AFK(commands.Cog): """Commandes utilitaires.""" def __init__(self, bot): self.bot = bot + self.afk_users = [] """---------------------------------------------------------------------""" @commands.command(pass_context=True) - async def afk(self, ctx): - - user = ctx.message.author + async def afk(self, ctx, action: str = ""): - try: - await user.edit(nick="[AFK] "+str(user.name)) - author = ctx.message.author - channel = await author.create_dm() - await channel.send("Ton pseudo a prit le prefix `[AFK]` pour " - "monter que tu es absent,") - await channel.send("tu auras juste a mettre un message pour que " - "je signale ton retour parmis nous et que je " - "retire le prefix `[AFK]` de ton pseudo 😉") + if action.lower() == "list": + try: + await ctx.send(*self.afk_users) + except discord.HTTPException: + await ctx.send("Il n'y a personne d'afk...") + else: + user = ctx.author + self.afk_users.append(user) + msgs = ["s'absente de discord quelques instants", + "se casse de son pc", + "va sortir son chien", + "reviens bientôt", + "va nourrir son cochon", + "va manger des cookies", + "va manger de la poutine", + "va faire caca", + "va faire pipi"] - except KeyError: - print('') - author = ctx.message.author - channel = await author.create_dm() - await channel.send("Tu auras juste a mettre un message pour que " - "je signale ton retour parmis nous 😉") - - msgs = ["s'absente de discord quelques instants", - "se casse de son pc", - "va sortir son chien", - "reviens bientôt", - "va nourrir son cochon", - "va manger des cookies", - "va manger de la poutine", - "va faire caca", - "va faire pipi"] - msg = random.choice(msgs) - - await ctx.send("**{}** {}...".format(ctx.message.author.mention, msg)) + await ctx.send(f"**{user.mention}** {random.choice(msgs)}...") """---------------------------------------------------------------------""" + @commands.Cog.listener() + async def on_message(self, message): + if message.author.bot \ + or message.guild.id != int(self.bot.config.main_server_id): + return -async def on_message(message): + user = message.author - ni = str(message.author.nick) - - if ni: - ni2 = ni.split(" ") - if "[AFK]" in ni2: - user = message.author - await user.edit(nick=None) + if user in self.afk_users \ + and message.content != self.bot.config.prefix[0] + "afk": + self.afk_users.remove(user) msgs = ["a réssuscité", "est de nouveau parmi nous", @@ -68,10 +59,9 @@ async def on_message(message): "a fini de danser", "s'est réveillé", "est de retour dans ce monde cruel"] - msg = random.choice(msgs) - await message.channel.send("**{}** {} !".format( - message.author.mention, msg)) + await message.channel.send(f"**{user.mention}**" + f" {random.choice(msgs)}...") def setup(bot): diff --git a/cogs/atc.py b/cogs/atc.py new file mode 100755 index 0000000..ea50ed3 --- /dev/null +++ b/cogs/atc.py @@ -0,0 +1,124 @@ +import asyncio + +from bs4 import BeautifulSoup +import requests +import re + +import discord +from discord.ext import commands + + +class ATC(commands.Cog): + + def __init__(self, bot): + self.bot = bot + self.playing = False + self.author = None + self.voice = None + + @staticmethod + async def extra(self, ctx, icao): + if icao == "stop_playing": + if self.playing and ( + ctx.author.id == self.author.id + or ctx.message.channel.permissions_for(ctx.message.author).administrator is True + ): + await self.voice.disconnect() + self.playing = False + await ctx.send("Écoute terminée !") + return "quit" + else: + await ctx.send("Veuillez specifier un icao") + return "quit" + if icao == "info": + em = discord.Embed(title=f"Infos sur les services utilisés par {self.bot.config.prefix[0]}atc") + em.add_field(name="Service pour les communications:", + value="[liveatc.net](https://www.liveatc.net/)", + inline=False) + em.add_field(name="Service pour les plans des aéroports:", + value="[universalweather.com](http://www.universalweather.com/)", + inline=False) + await ctx.send(embed=em) + return "quit" + + """---------------------------------------------------------------------""" + + @commands.command(name="atc", no_pm=True, pass_context=True) + async def _atc(self, ctx, icao="stop_playing"): + user = ctx.author + if not user.voice: + await ctx.send('Veuillez aller dans un channel vocal.') + return + + if await self.extra(self, ctx, icao) == "quit": + return + + if self.playing: + await ctx.send(f"Une écoute est déja en court, " + f"demandez à {self.author.mention} de faire " + f"`.atc stop_playing` pour l'arreter") + return + self.author = user + headers = { + 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.35 Safari/537.36', + } + req = requests.post("https://www.liveatc.net/search/", + data={'icao': icao}, + headers=headers) + html = BeautifulSoup(req.text, features="lxml") + regex = r"(javascript: pageTracker\._trackPageview\('\/listen\/)(.*)(\'\)\;)" + + possibilities = {} + emojis = ['1⃣', '2⃣', '3⃣', '4⃣', '5⃣', '6⃣', '7⃣', '8⃣', '9⃣', '🔟', + '0⃣', '🇦', '🇧', '🇨', '🇩', '🇪', '🇫', '🇬', '🇭', '🇮'] + to_react = [] + + idx = 0 + for a in html.findAll("a", onclick=True): + val = a.get('onclick') + for match in re.finditer(regex, val): + possibilities[idx] = f"{emojis[idx]} - {match.groups()[1]}\n" + to_react.append(emojis[idx]) + idx += 1 + + em = discord.Embed(title='Résultats pour : ' + icao, + description=str(''.join(possibilities.values())), + colour=0x4ECDC4) + em.set_image( + url=f"http://www.universalweather.com/regusers/mod-bin/uvtp_airport_image?icao={icao}") + + poll_msg = await ctx.send(embed=em) + for emote in to_react: + await poll_msg.add_reaction(emote) + + def check(reaction, user): + return user == ctx.author and reaction.emoji in to_react and \ + reaction.message.id == poll_msg.id + + async def waiter(future: asyncio.Future): + reaction, user = await self.bot.wait_for('reaction_add', + check=check) + + future.set_result(emojis.index(reaction.emoji)) + + added_emoji = asyncio.Future() + self.bot.loop.create_task(waiter(added_emoji)) + + while not added_emoji.done(): + await asyncio.sleep(0.1) + + freq = possibilities[added_emoji.result()].split('- ')[1] + + if possibilities: + self.playing = True + self.voice = await user.voice.channel.connect() + self.voice.play( + discord.FFmpegPCMAudio(f"http://yyz.liveatc.net/{freq}")) + await poll_msg.delete() + await ctx.send(f"Écoute de {freq}") + else: + await ctx.send(f"Aucun résultat trouvé pour {icao} {freq}") + + +def setup(bot): + bot.add_cog(ATC(bot)) diff --git a/cogs/basics.py b/cogs/basics.py index 066b6aa..a4dee76 100755 --- a/cogs/basics.py +++ b/cogs/basics.py @@ -1,67 +1,70 @@ -from discord.ext import commands -import discord import platform import socket - import subprocess +import discord +from discord.ext import commands +from discord.http import Route -class Basics: - """Commandes générales.""" - def __init__(self, bot): - self.bot = bot +class Basics(commands.Cog): + """Commandes générales.""" - @commands.command() - async def ping(self, ctx): - ping_res = str(subprocess.Popen(["/bin/ping", "-c1", "discordapp.com"], stdout=subprocess.PIPE).stdout.read()) - formated_res = [item for item in ping_res.split() if 'time=' in item] - result = str(formated_res[0])[5:] + def __init__(self, bot): + self.bot = bot - if float(result) >= 200: - em = discord.Embed(title="Ping : " + str(result) + "ms", - description="... c'est quoi ce ping !", - colour=0xFF1111) - await ctx.send(embed=em) - elif float(result) > 100 < 200: - em = discord.Embed(title="Ping : " + str(result) + "ms", - description="Ca va, ça peut aller, mais j'ai " - "l'impression d'avoir 40 ans !", - colour=0xFFA500) - await ctx.send(embed=em) - else: - em = discord.Embed(title="Ping : " + str(result) + "ms", - description="Wow c'te vitesse de réaction, " - "je m'épate moi-même !", - colour=0x11FF11) - await ctx.send(embed=em) + @commands.command() + async def ping(self, ctx): + ping_res = str(subprocess.Popen(["/bin/ping", "-c1", "discordapp.com"], + stdout=subprocess.PIPE).stdout.read()) + formated_res = [item for item in ping_res.split() if 'time=' in item] + result = str(formated_res[0])[5:] - """--------------------------------------------------------------------------------------------------------------------------""" + if float(result) >= 200: + em = discord.Embed(title="Ping : " + str(result) + "ms", + description="... c'est quoi ce ping !", + colour=0xFF1111) + await ctx.send(embed=em) + elif float(result) > 100 < 200: + em = discord.Embed(title="Ping : " + str(result) + "ms", + description="Ca va, ça peut aller, mais j'ai " + "l'impression d'avoir 40 ans !", + colour=0xFFA500) + await ctx.send(embed=em) + else: + em = discord.Embed(title="Ping : " + str(result) + "ms", + description="Wow c'te vitesse de réaction, " + "je m'épate moi-même !", + colour=0x11FF11) + await ctx.send(embed=em) - @commands.command() - async def info(self, ctx): - """Affiches des informations sur le bot""" - text = open('texts/info.md').read() - os_info = str(platform.system()) + " / " + str(platform.release()) - em = discord.Embed(title='Informations sur TuxBot', - description=text.format(os_info, - platform.python_version(), - socket.gethostname(), - discord.__version__), - colour=0x89C4F9) - em.set_footer(text="/home/****/bot.py") - await ctx.send(embed=em) + """---------------------------------------------------------------------""" - """--------------------------------------------------------------------------------------------------------------------------""" + @commands.command() + async def info(self, ctx): + """Affiches des informations sur le bot""" + text = open('texts/info.md').read() + os_info = str(platform.system()) + " / " + str(platform.release()) + em = discord.Embed(title='Informations sur TuxBot', + description=text.format(os_info, + platform.python_version(), + socket.gethostname(), + discord.__version__, + Route.BASE), + colour=0x89C4F9) + em.set_footer(text="/home/****/bot.py") + await ctx.send(embed=em) - @commands.command() - async def help(self, ctx): - """Affiches l'aide du bot""" - text = open('texts/help.md').read() - em = discord.Embed(title='Commandes de TuxBot', description=text, - colour=0x89C4F9) - await ctx.send(embed=em) + """---------------------------------------------------------------------""" + @commands.command() + async def help(self, ctx): + """Affiches l'aide du bot""" + text = open('texts/help.md').read() + text = text.split("[split]") + for text_result in text: + em = discord.Embed(title='Commandes de TuxBot', description=text_result,colour=0x89C4F9) + await ctx.send(embed=em) def setup(bot): - bot.add_cog(Basics(bot)) + bot.add_cog(Basics(bot)) diff --git a/cogs/ci.py b/cogs/ci.py index dc0a4cf..17a14d1 100755 --- a/cogs/ci.py +++ b/cogs/ci.py @@ -1,313 +1,311 @@ -from discord.ext import commands +import datetime +import random + import discord +import requests +from discord.ext import commands from .utils import checks from .utils import db from .utils.checks import get_user, check_date -import datetime -import random -import pymysql -import requests +class Identity(commands.Cog): + """Commandes des cartes d'identité .""" + def __init__(self, bot): + self.bot = bot -class Identity: - """Commandes des cartes d'identité .""" + self.conn = db.connect_to_db(self) + self.cursor = self.conn.cursor() - def __init__(self, bot): - self.bot = bot + self.cursor.execute("""SHOW TABLES LIKE 'users'""") + result = self.cursor.fetchone() - self.conn = db.connect_to_db(self) - self.cursor = self.conn.cursor() + if not result: + # Creation table Utilisateur si premiere fois + sql = "CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, userid TEXT null, username TEXT null, os TEXT null, config TEXT null, useravatar TEXT null, userbirth TEXT null, pays TEXT null, cidate TEXT null, cibureau TEXT null);" + self.cursor.execute(sql) - self.cursor.execute("""SHOW TABLES LIKE 'users'""") - result = self.cursor.fetchone() + """--------------------------------------------------------------------------------------------------------------------------""" - if not result: - # Creation table Utilisateur si premiere fois - sql = "CREATE TABLE users ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, userid TEXT null, username TEXT null, os TEXT null, config TEXT null, useravatar TEXT null, userbirth TEXT null, pays TEXT null, cidate TEXT null, cibureau TEXT null);" - self.cursor.execute(sql) + @commands.group(name="ci", no_pm=True, pass_context=True) + async def _ci(self, ctx): + """Cartes d'identité""" + + if ctx.invoked_subcommand is None: + text = open('texts/ci-info.md').read() + em = discord.Embed(title='Commandes de carte d\'identité de TuxBot', description=text, colour=0x89C4F9) + await ctx.send(embed=em) - """--------------------------------------------------------------------------------------------------------------------------""" + """--------------------------------------------------------------------------------------------------------------------------""" - @commands.group(name="ci", no_pm=True, pass_context=True) - async def _ci(self, ctx): - """Cartes d'identité""" - - if ctx.invoked_subcommand is None: - text = open('texts/ci-info.md').read() - em = discord.Embed(title='Commandes de carte d\'identité de TuxBot', description=text, colour=0x89C4F9) - await ctx.send(embed=em) + @_ci.command(pass_context=True, name="show") + async def ci_show(self, ctx, args: str = None): + self.conn = db.connect_to_db(self) + self.cursor = self.conn.cursor() - """--------------------------------------------------------------------------------------------------------------------------""" + if args == None: + user = get_user(ctx.message, ctx.author.name) + else: + user = get_user(ctx.message, args) - @_ci.command(pass_context=True, name="show") - async def ci_show(self, ctx, args: str = None): - self.conn = db.connect_to_db(self) - self.cursor = self.conn.cursor() + if user: + self.cursor.execute("""SELECT userid, username, useravatar, userbirth, cidate, cibureau, os, config, pays, id FROM users WHERE userid=%s""",(str(user.id))) + result = self.cursor.fetchone() - if args == None: - user = get_user(ctx.message, ctx.author.name) - else: - user = get_user(ctx.message, args) + def isexist(var): + if not var: + return "Non renseigné." + else: + return var - if user: - self.cursor.execute("""SELECT userid, username, useravatar, userbirth, cidate, cibureau, os, config, pays, id FROM users WHERE userid=%s""",(str(user.id))) - result = self.cursor.fetchone() + if not result: + await ctx.send(f"{ctx.author.mention}> :x: Désolé mais {user.mention} est sans papier !") + else: + try: + user_birth = datetime.datetime.fromisoformat(result[3]) + user_birth_day = check_date(str(user_birth.day)) + user_birth_month = check_date(str(user_birth.month)) - def isexist(var): - if not var: - return "Non renseigné." - else: - return var + formated_user_birth = str(user_birth_day) + "/" + str(user_birth_month) + "/" + str(user_birth.year) - if not result: - await ctx.send(f"{ctx.author.mention}> :x: Désolé mais {user.mention} est sans papier !") - else: - try: - user_birth = datetime.datetime.fromisoformat(result[3]) - user_birth_day = check_date(str(user_birth.day)) - user_birth_month = check_date(str(user_birth.month)) + try: ## a virer une fois le patch appliqué pour tout le monde + cidate = datetime.datetime.fromisoformat(result[4]) + cidate_day = check_date(str(cidate.day)) ## a garder + cidate_month = check_date(str(cidate.month)) ## a garder - formated_user_birth = str(user_birth_day) + "/" + str(user_birth_month) + "/" + str(user_birth.year) + formated_cidate = str(cidate_day) + "/" + str(cidate_month) + "/" + str(cidate.year) ## a garder + except ValueError: ## a virer une fois le patch appliqué pour tout le monde + formated_cidate = str(result[4]).replace('-', '/') ## a virer une fois le patch appliqué pour tout le monde + await ctx.send(f"{user.mention} vous êtes prié(e) de faire la commande `.ci update` afin de regler un probleme de date coté bdd") ## a virer une fois le patch appliqué pour tout le monde - try: ## a virer une fois le patch appliqué pour tout le monde - cidate = datetime.datetime.fromisoformat(result[4]) - cidate_day = check_date(str(cidate.day)) ## a garder - cidate_month = check_date(str(cidate.month)) ## a garder + embed=discord.Embed(title="Carte d'identité | Communisme Linuxien") + embed.set_author(name=result[1], icon_url=result[2]) + embed.set_thumbnail(url = result[2]) + embed.add_field(name="Nom :", value=result[1], inline=True) + embed.add_field(name="Système d'exploitation :", value=isexist(result[6]), inline=True) + embed.add_field(name="Configuration Système : ", value=isexist(result[7]), inline=True) + embed.add_field(name="Date de naissance sur discord : ", value=formated_user_birth, inline=True) + embed.add_field(name="Pays : ", value=isexist(result[8]), inline=True) + embed.add_field(name="Profil sur le web : ", value=f"https://tuxbot.gnous.eu/users/{result[9]}", inline=True) + embed.set_footer(text=f"Enregistré dans le bureau {result[5]} le {formated_cidate}.") + await ctx.send(embed=embed) + except Exception as e: + await ctx.send(f"{ctx.author.mention}> :x: Désolé mais la carte d'identité de {user.mention} est trop longue de ce fait je ne peux te l'envoyer, essaye de l'aléger, {user.mention} :wink: !") + await ctx.send(f':sob: Une erreur est survenue : \n {type(e).__name__}: {e}') + else: + return await ctx.send('Impossible de trouver l\'user.') - formated_cidate = str(cidate_day) + "/" + str(cidate_month) + "/" + str(cidate.year) ## a garder - except ValueError: ## a virer une fois le patch appliqué pour tout le monde - formated_cidate = str(result[4]).replace('-', '/') ## a virer une fois le patch appliqué pour tout le monde - await ctx.send(f"{user.mention} vous êtes prié(e) de faire la commande `.ci update` afin de regler un probleme de date coté bdd") ## a virer une fois le patch appliqué pour tout le monde + """--------------------------------------------------------------------------------------------------------------------------""" + + @_ci.command(pass_context=True, name="register") + async def ci_register(self, ctx): + self.conn = db.connect_to_db(self) + self.cursor = self.conn.cursor() - embed=discord.Embed(title="Carte d'identité | Communisme Linuxien") - embed.set_author(name=result[1], icon_url=result[2]) - embed.set_thumbnail(url = result[2]) - embed.add_field(name="Nom :", value=result[1], inline=True) - embed.add_field(name="Système d'exploitation :", value=isexist(result[6]), inline=True) - embed.add_field(name="Configuration Système : ", value=isexist(result[7]), inline=True) - embed.add_field(name="Date de naissance sur discord : ", value=formated_user_birth, inline=True) - embed.add_field(name="Pays : ", value=isexist(result[8]), inline=True) - embed.add_field(name="Profil sur le web : ", value=f"https://tuxbot.gnous.eu/users/{result[9]}", inline=True) - embed.set_footer(text=f"Enregistré dans le bureau {result[5]} le {formated_cidate}.") - await ctx.send(embed=embed) - except Exception as e: - await ctx.send(f"{ctx.author.mention}> :x: Désolé mais la carte d'identité de {user.mention} est trop longue de ce fait je ne peux te l'envoyer, essaye de l'aléger, {user.mention} :wink: !") - await ctx.send(f':sob: Une erreur est survenue : \n {type(e).__name__}: {e}') - else: - return await ctx.send('Impossible de trouver l\'user.') + self.cursor.execute("""SELECT id, userid FROM users WHERE userid=%s""", (str(ctx.author.id))) + result = self.cursor.fetchone() - """--------------------------------------------------------------------------------------------------------------------------""" - - @_ci.command(pass_context=True, name="register") - async def ci_register(self, ctx): - self.conn = db.connect_to_db(self) - self.cursor = self.conn.cursor() + if result: + await ctx.send("Mais tu as déja une carte d'identité ! u_u") + else: + now = datetime.datetime.now() - self.cursor.execute("""SELECT id, userid FROM users WHERE userid=%s""", (str(ctx.author.id))) - result = self.cursor.fetchone() + self.cursor.execute("""INSERT INTO users(userid, username, useravatar, userbirth, cidate, cibureau) VALUES(%s, %s, %s, %s, %s, %s)""", (str(ctx.author.id), str(ctx.author), str(ctx.author.avatar_url_as(format="jpg", size=512)), str(ctx.author.created_at), now, str(ctx.message.guild.name))) + self.conn.commit() + await ctx.send(f":clap: Bievenue à toi {ctx.author.name} dans le communisme {ctx.message.guild.name} ! Fait ``.ci`` pour plus d'informations !") - if result: - await ctx.send("Mais tu as déja une carte d'identité ! u_u") - else: - now = datetime.datetime.now() + """--------------------------------------------------------------------------------------------------------------------------""" + + @_ci.command(pass_context=True, name="delete") + async def ci_delete(self, ctx): + self.conn = db.connect_to_db(self) + self.cursor = self.conn.cursor() - self.cursor.execute("""INSERT INTO users(userid, username, useravatar, userbirth, cidate, cibureau) VALUES(%s, %s, %s, %s, %s, %s)""", (str(ctx.author.id), str(ctx.author), str(ctx.author.avatar_url_as(format="jpg", size=512)), str(ctx.author.created_at), now, str(ctx.message.guild.name))) - self.conn.commit() - await ctx.send(f":clap: Bievenue à toi {ctx.author.name} dans le communisme {ctx.message.guild.name} ! Fait ``.ci`` pour plus d'informations !") + self.cursor.execute("""SELECT id, userid FROM users WHERE userid=%s""", (str(ctx.author.id))) + result = self.cursor.fetchone() - """--------------------------------------------------------------------------------------------------------------------------""" - - @_ci.command(pass_context=True, name="delete") - async def ci_delete(self, ctx): - self.conn = db.connect_to_db(self) - self.cursor = self.conn.cursor() + if result: + self.cursor.execute("""DELETE FROM users WHERE userid =%s""", (str(ctx.author.id))) + self.conn.commit() + await ctx.send("Tu es maintenant sans papiers !") + else: + await ctx.send("Déja enregistre ta carte d'identité avant de la supprimer u_u (après c'est pas logique...)") - self.cursor.execute("""SELECT id, userid FROM users WHERE userid=%s""", (str(ctx.author.id))) - result = self.cursor.fetchone() + """--------------------------------------------------------------------------------------------------------------------------""" + + @_ci.command(pass_context=True, name="update") + async def ci_update(self, ctx): + self.conn = db.connect_to_db(self) + self.cursor = self.conn.cursor() - if result: - self.cursor.execute("""DELETE FROM users WHERE userid =%s""", (str(ctx.author.id))) - self.conn.commit() - await ctx.send("Tu es maintenant sans papiers !") - else: - await ctx.send("Déja enregistre ta carte d'identité avant de la supprimer u_u (après c'est pas logique...)") + try: + self.cursor.execute("""SELECT id, userid FROM users WHERE userid=%s""", (str(ctx.author.id))) + result = self.cursor.fetchone() - """--------------------------------------------------------------------------------------------------------------------------""" - - @_ci.command(pass_context=True, name="update") - async def ci_update(self, ctx): - self.conn = db.connect_to_db(self) - self.cursor = self.conn.cursor() + if result: + self.cursor.execute("""SELECT cidate FROM users WHERE userid=%s""",(str(ctx.author.id))) + old_ci_date = self.cursor.fetchone() - try: - self.cursor.execute("""SELECT id, userid FROM users WHERE userid=%s""", (str(ctx.author.id))) - result = self.cursor.fetchone() + try: + new_ci_date = datetime.datetime.fromisoformat(old_ci_date[0]) + except ValueError: + old_ci_date = datetime.datetime.strptime(old_ci_date[0].replace('/', '-'), '%d-%m-%Y') - if result: - self.cursor.execute("""SELECT cidate FROM users WHERE userid=%s""",(str(ctx.author.id))) - old_ci_date = self.cursor.fetchone() + old_ci_date_day = check_date(str(old_ci_date.day)) + old_ci_date_month = check_date(str(old_ci_date.month)) - try: - new_ci_date = datetime.datetime.fromisoformat(old_ci_date[0]) - except ValueError: - old_ci_date = datetime.datetime.strptime(old_ci_date[0].replace('/', '-'), '%d-%m-%Y') + new_ci_date = f"{str(old_ci_date.year)}-{str(old_ci_date_month)}-{str(old_ci_date_day)} 00:00:00.000000" - old_ci_date_day = check_date(str(old_ci_date.day)) - old_ci_date_month = check_date(str(old_ci_date.month)) + await ctx.send("succes update") - new_ci_date = f"{str(old_ci_date.year)}-{str(old_ci_date_month)}-{str(old_ci_date_day)} 00:00:00.000000" + self.cursor.execute("""UPDATE users SET cidate = %s WHERE userid = %s""", (str(new_ci_date), str(ctx.author.id))) + self.conn.commit() - await ctx.send("succes update") + self.cursor.execute("""UPDATE users SET useravatar = %s, username = %s, cibureau = %s WHERE userid = %s""", (str(ctx.author.avatar_url_as(format="jpg", size=512)), str(ctx.author), str(ctx.message.guild), str(ctx.author.id))) + self.conn.commit() + await ctx.send(f"{ctx.author.mention}> Tu viens, en quelques sortes, de renaitre !") + else: + await ctx.send(f"{ctx.author.mention}> :x: Veuillez enregistrer votre carte d'identité pour commencer !") - self.cursor.execute("""UPDATE users SET cidate = %s WHERE userid = %s""", (str(new_ci_date), str(ctx.author.id))) - self.conn.commit() + except Exception as e: #TODO : A virer dans l'event on_error + await ctx.send(':( Erreur veuillez contacter votre administrateur :') + await ctx.send(f'{type(e).__name__}: {e}') - self.cursor.execute("""UPDATE users SET useravatar = %s, username = %s, cibureau = %s WHERE userid = %s""", (str(ctx.author.avatar_url_as(format="jpg", size=512)), str(ctx.author), str(ctx.message.guild), str(ctx.author.id))) - self.conn.commit() - await ctx.send(f"{ctx.author.mention}> Tu viens, en quelques sortes, de renaitre !") - else: - await ctx.send(f"{ctx.author.mention}> :x: Veuillez enregistrer votre carte d'identité pour commencer !") + """--------------------------------------------------------------------------------------------------------------------------""" + + @_ci.command(pass_context=True, name="setconfig") + async def ci_setconfig(self, ctx, *, conf: str = None): + self.conn = db.connect_to_db(self) + self.cursor = self.conn.cursor() - except Exception as e: #TODO : A virer dans l'event on_error - await ctx.send(':( Erreur veuillez contacter votre administrateur :') - await ctx.send(f'{type(e).__name__}: {e}') + if conf: + self.cursor.execute("""SELECT id, userid FROM users WHERE userid=%s""", (str(ctx.author.id))) + result = self.cursor.fetchone() - """--------------------------------------------------------------------------------------------------------------------------""" - - @_ci.command(pass_context=True, name="setconfig") - async def ci_setconfig(self, ctx, *, conf: str = None): - self.conn = db.connect_to_db(self) - self.cursor = self.conn.cursor() + if result: + self.cursor.execute("""UPDATE users SET config = %s WHERE userid = %s""", (str(conf), str(ctx.author.id))) + self.conn.commit() + await ctx.send(f"{ctx.author.mention}> :ok_hand: Carte d'identité mise à jour !") + else: + await ctx.send(f"{ctx.author.mention}> :x: Veuillez enregistrer votre carte d'identité pour commencer !") + else: + await ctx.send(f"{ctx.author.mention}> :x: Il manque un paramètre !") - if conf: - self.cursor.execute("""SELECT id, userid FROM users WHERE userid=%s""", (str(ctx.author.id))) - result = self.cursor.fetchone() + """--------------------------------------------------------------------------------------------------------------------------""" + + @_ci.command(pass_context=True, name="setos") + async def ci_setos(self, ctx, *, conf: str = None): + self.conn = db.connect_to_db(self) + self.cursor = self.conn.cursor() - if result: - self.cursor.execute("""UPDATE users SET config = %s WHERE userid = %s""", (str(conf), str(ctx.author.id))) - self.conn.commit() - await ctx.send(f"{ctx.author.mention}> :ok_hand: Carte d'identité mise à jour !") - else: - await ctx.send(f"{ctx.author.mention}> :x: Veuillez enregistrer votre carte d'identité pour commencer !") - else: - await ctx.send(f"{ctx.author.mention}> :x: Il manque un paramètre !") + if conf: + self.cursor.execute("""SELECT id, userid FROM users WHERE userid=%s""", (str(ctx.author.id))) + result = self.cursor.fetchone() - """--------------------------------------------------------------------------------------------------------------------------""" - - @_ci.command(pass_context=True, name="setos") - async def ci_setos(self, ctx, *, conf: str = None): - self.conn = db.connect_to_db(self) - self.cursor = self.conn.cursor() + if result: + self.cursor.execute("""UPDATE users SET os = %s WHERE userid = %s""", (str(conf), str(ctx.author.id))) + self.conn.commit() + await ctx.send(f"{ctx.author.mention}> :ok_hand: Carte d'identité mise à jour !") + else: + await ctx.send(f"{ctx.author.mention}> :x: Veuillez enregistrer votre carte d'identité pour commencer !") + else: + await ctx.send(f"{ctx.author.mention}> :x: Il manque un paramètre !") - if conf: - self.cursor.execute("""SELECT id, userid FROM users WHERE userid=%s""", (str(ctx.author.id))) - result = self.cursor.fetchone() + """--------------------------------------------------------------------------------------------------------------------------""" + + @_ci.command(pass_context=True, name="setcountry") + async def ci_setcountry(self, ctx, *, country: str = None): + self.conn = db.connect_to_db(self) + self.cursor = self.conn.cursor() - if result: - self.cursor.execute("""UPDATE users SET os = %s WHERE userid = %s""", (str(conf), str(ctx.author.id))) - self.conn.commit() - await ctx.send(f"{ctx.author.mention}> :ok_hand: Carte d'identité mise à jour !") - else: - await ctx.send(f"{ctx.author.mention}> :x: Veuillez enregistrer votre carte d'identité pour commencer !") - else: - await ctx.send(f"{ctx.author.mention}> :x: Il manque un paramètre !") + if country: + self.cursor.execute("""SELECT id, userid FROM users WHERE userid=%s""", (str(ctx.author.id))) + result = self.cursor.fetchone() - """--------------------------------------------------------------------------------------------------------------------------""" - - @_ci.command(pass_context=True, name="setcountry") - async def ci_setcountry(self, ctx, *, country: str = None): - self.conn = db.connect_to_db(self) - self.cursor = self.conn.cursor() + if result: + self.cursor.execute("""UPDATE users SET pays = %s WHERE userid = %s""", (str(country), str(ctx.author.id))) + self.conn.commit() + await ctx.send(f"{ctx.author.mention}> :ok_hand: Carte d'identité mise à jour !") + else: + await ctx.send(f"{ctx.author.mention}> :x: Veuillez enregistrer votre carte d'identité pour commencer !") + else: + await ctx.send(f"{ctx.author.mention}> :x: Il manque un paramètre !") - if country: - self.cursor.execute("""SELECT id, userid FROM users WHERE userid=%s""", (str(ctx.author.id))) - result = self.cursor.fetchone() + """--------------------------------------------------------------------------------------------------------------------------""" + + @_ci.command(pass_context=True, name="online_edit") + async def ci_online_edit(self, ctx): + self.conn = db.connect_to_db(self) + self.cursor = self.conn.cursor() - if result: - self.cursor.execute("""UPDATE users SET pays = %s WHERE userid = %s""", (str(country), str(ctx.author.id))) - self.conn.commit() - await ctx.send(f"{ctx.author.mention}> :ok_hand: Carte d'identité mise à jour !") - else: - await ctx.send(f"{ctx.author.mention}> :x: Veuillez enregistrer votre carte d'identité pour commencer !") - else: - await ctx.send(f"{ctx.author.mention}> :x: Il manque un paramètre !") + self.cursor.execute("""SELECT id FROM users WHERE userid=%s""",(str(ctx.author.id))) + result = self.cursor.fetchone() - """--------------------------------------------------------------------------------------------------------------------------""" - - @_ci.command(pass_context=True, name="online_edit") - async def ci_online_edit(self, ctx): - self.conn = db.connect_to_db(self) - self.cursor = self.conn.cursor() + if not result: + return await ctx.send(f"Déja enregistre ta carte d'identité avant de l'éditer u_u (après c'est pas logique...)") - self.cursor.execute("""SELECT id FROM users WHERE userid=%s""",(str(ctx.author.id))) - result = self.cursor.fetchone() + dm = await ctx.author.create_dm() - if not result: - return await ctx.send(f"Déja enregistre ta carte d'identité avant de l'éditer u_u (après c'est pas logique...)") + try: + def is_exist(key, value): + self.cursor.execute("""SELECT * FROM sessions WHERE {}=%s""".format(str(key)), (str(value))) + return self.cursor.fetchone() - dm = await ctx.author.create_dm() + user_id = result[0] + is_admin = '1' if str(ctx.author.id) in self.bot.config.authorized_id else '0' + token = ''.join(random.sample('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'*25, 25)) + created_at = datetime.datetime.utcnow() - try: - def is_exist(key, value): - self.cursor.execute("""SELECT * FROM sessions WHERE {}=%s""".format(str(key)), (str(value))) - return self.cursor.fetchone() + while is_exist('token', token): + token = ''.join(random.sample('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'*25, 25)) - user_id = result[0] - is_admin = '1' if str(ctx.author.id) in self.bot.config.authorized_id else '0' - token = ''.join(random.sample('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'*25, 25)) - created_at = datetime.datetime.utcnow() + if is_exist('user_id', user_id): + self.cursor.execute("""UPDATE sessions SET is_admin = %s, token = %s, updated_at = %s WHERE user_id = %s""", (str(is_admin), str(token), str(created_at), str(user_id))) + self.conn.commit() + else: + self.cursor.execute("""INSERT INTO sessions(user_id, is_admin, token, created_at, updated_at) VALUES(%s, %s, %s, %s, %s)""", (str(user_id), str(is_admin), str(token), str(created_at), str(created_at))) + self.conn.commit() - while is_exist('token', token): - token = ''.join(random.sample('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'*25, 25)) + embed=discord.Embed(title="Clé d'édition pour tuxweb", description=f"Voici ta clé d'édition, vas sur [https://tuxbot.gnous.eu/fr/users/{user_id}](https://tuxbot.gnous.eu/fr/users/{user_id}) puis cliques sur `editer` et entre la clé afin de pouvoir modifier ta ci", colour=0x89C4F9) + embed.set_footer(text=f"Cette clé sera valide durant les 10 prochaines minutes, ne la communiques à personne !") + await dm.send(embed=embed) + await dm.send(token) - if is_exist('user_id', user_id): - self.cursor.execute("""UPDATE sessions SET is_admin = %s, token = %s, updated_at = %s WHERE user_id = %s""", (str(is_admin), str(token), str(created_at), str(user_id))) - self.conn.commit() - else: - self.cursor.execute("""INSERT INTO sessions(user_id, is_admin, token, created_at, updated_at) VALUES(%s, %s, %s, %s, %s)""", (str(user_id), str(is_admin), str(token), str(created_at), str(created_at))) - self.conn.commit() + await ctx.send(f"{ctx.author.mention} ta clé d'édition t'a été envoyée en message privé") - embed=discord.Embed(title="Clé d'édition pour tuxweb", description=f"Voici ta clé d'édition, vas sur [https://tuxbot.gnous.eu/fr/users/{user_id}](https://tuxbot.gnous.eu/fr/users/{user_id}) puis cliques sur `editer` et entre la clé afin de pouvoir modifier ta ci", colour=0x89C4F9) - embed.set_footer(text=f"Cette clé sera valide durant les 10 prochaines minutes, ne la communiques à personne !") - await dm.send(embed=embed) - await dm.send(token) + except Exception as e: + await ctx.send(f"{ctx.author.mention}, je ne peux pas t'envoyer de message privé :(. Penses à autoriser les messages privés provenant des membres du serveur pour que je puisse te donner ta clef d'édition") - await ctx.send(f"{ctx.author.mention} ta clé d'édition t'a été envoyée en message privé") + """--------------------------------------------------------------------------------------------------------------------------""" + + @checks.has_permissions(administrator=True) + @_ci.command(pass_context=True, name="list") + async def ci_list(self, ctx): + self.conn = db.connect_to_db(self) + self.cursor = self.conn.cursor() - except Exception as e: - await ctx.send(f"{ctx.author.mention}, je ne peux pas t'envoyer de message privé :(. Penses à autoriser les messages privés provenant des membres du serveur pour que je puisse te donner ta clef d'édition") + self.cursor.execute("""SELECT id, username FROM users""") + rows = self.cursor.fetchall() + msg = "" + try: + for row in rows: + row_id = row[0] + row_name = row[1].encode('utf-8') + msg += f"{str(row_id)} : {str(row_name)} \n" + post = requests.post("https://hastebin.com/documents", data=msg) + await ctx.send(f"{ctx.author.mention} liste posté avec succès sur :\nhttps://hastebin.com/{post.json()['key']}.txt") - """--------------------------------------------------------------------------------------------------------------------------""" - - @checks.has_permissions(administrator=True) - @_ci.command(pass_context=True, name="list") - async def ci_list(self, ctx): - self.conn = db.connect_to_db(self) - self.cursor = self.conn.cursor() + with open('ci_list.txt', 'w', encoding='utf-8') as fp: + for row in rows: + row_id = row[0] + row_name = row[1] - self.cursor.execute("""SELECT id, username FROM users""") - rows = self.cursor.fetchall() - msg = "" - try: - for row in rows: - row_id = row[0] - row_name = row[1].encode('utf-8') - msg += f"{str(row_id)} : {str(row_name)} \n" - post = requests.post("https://hastebin.com/documents", data=msg) - await ctx.send(f"{ctx.author.mention} liste posté avec succès sur :\nhttps://hastebin.com/{post.json()['key']}.txt") + fp.write(f"{str(row_id)} : {str(row_name)} \n") - with open('ci_list.txt', 'w', encoding='utf-8') as fp: - for row in rows: - row_id = row[0] - row_name = row[1] - - fp.write(f"{str(row_id)} : {str(row_name)} \n") - - except Exception as e: - await ctx.send(f':sob: Une erreur est survenue : \n {type(e).__name__}: {e}') + except Exception as e: + await ctx.send(f':sob: Une erreur est survenue : \n {type(e).__name__}: {e}') def setup(bot): - bot.add_cog(Identity(bot)) + bot.add_cog(Identity(bot)) diff --git a/cogs/cog_manager.py b/cogs/cog_manager.py index 1093882..6c4a7c9 100755 --- a/cogs/cog_manager.py +++ b/cogs/cog_manager.py @@ -4,107 +4,113 @@ from .utils import checks from .utils.paginator import HelpPaginator -class CogManager: - """Gestionnaire des cogs""" +class CogManager(commands.Cog): + """Gestionnaire des cogs""" - def __init__(self, bot): - self.bot = bot + def __init__(self, bot): + self.bot = bot + self.help = discord.Embed(title='Tuxbot - Commandes cogs', description="Tuxbot - Commandes cogs\n" + "-> .cogs *{cog}* : *{cog}*\n" + "-> .cogs : donne la liste de tous les cogs\n" + "-> .cogs : affiche cette aide", colour=0x89C4F9) - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @checks.has_permissions(administrator=True) - @commands.group(name="cogs", no_pm=True, pass_context=True, case_insensitive=True) - async def _cogs(self, ctx): - """show help about 'cogs' command""" + @checks.has_permissions(administrator=True) + @commands.group(name="cogs", no_pm=True, pass_context=True, + case_insensitive=True) + async def _cogs(self, ctx): + """show help about 'cogs' command""" - if ctx.invoked_subcommand is None: - text = "Tuxbot - Commandes cogs\n-> .cogs *{cog}* : *{cog}*\n-> .cogs : affiche cette aide" - em = discord.Embed(title='Tuxbot - Commandes cogs', description=text, colour=0x89C4F9) - await ctx.send(embed=em) + if ctx.invoked_subcommand is None: + await ctx.send(embed=self.help) - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @_cogs.command(name="load", pass_context=True) - async def cogs_load(self, ctx, cog: str = ""): - """load a cog""" - if cog != "": - try: - self.bot.load_extension(cog) + @_cogs.command(name="load", pass_context=True) + async def cogs_load(self, ctx, cog: str = ""): + """load a cog""" + if cog != "": + try: + self.bot.load_extension(cog) - await ctx.send('\N{OK HAND SIGN}') - print("cog : " + str(cog) + " chargé") - except Exception as e: - await ctx.send('\N{PISTOL}') - await ctx.send(f'{type(e).__name__}: {e}') - else: - text = "Tuxbot - Commandes cogs\n-> .cogs *{cog}* : *{cog}*\n-> .cogs : affiche cette aide" - em = discord.Embed(title='Tuxbot - Commandes cogs', description=text, colour=0x89C4F9) - await ctx.send(embed=em) + await ctx.send('\N{OK HAND SIGN}') + print("cog : " + str(cog) + " chargé") + except Exception as e: + await ctx.send('\N{PISTOL}') + await ctx.send(f'{type(e).__name__}: {e}') + else: + await ctx.send(embed=self.help) - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @_cogs.command(name="unload", pass_context=True) - async def cogs_unload(self, ctx, cog: str = ""): - """unload a cog""" - if cog != "": - try: - self.bot.unload_extension(cog) + @_cogs.command(name="unload", pass_context=True) + async def cogs_unload(self, ctx, cog: str = ""): + """unload a cog""" + if cog != "": + try: + self.bot.unload_extension(cog) - await ctx.send('\N{OK HAND SIGN}') - print("cog : " + str(cog) + " déchargé") - except Exception as e: - await ctx.send('\N{PISTOL}') - await ctx.send(f'{type(e).__name__}: {e}') - else: - text = "Tuxbot - Commandes cogs\n-> .cogs *{cog}* : *{cog}*\n-> .cogs : affiche cette aide" - em = discord.Embed(title='Tuxbot - Commandes cogs', description=text, colour=0x89C4F9) - await ctx.send(embed=em) + await ctx.send('\N{OK HAND SIGN}') + print("cog : " + str(cog) + " déchargé") + except Exception as e: + await ctx.send('\N{PISTOL}') + await ctx.send(f'{type(e).__name__}: {e}') + else: + await ctx.send(embed=self.help) - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @_cogs.command(name="reload", pass_context=True) - async def cogs_reload(self, ctx, cog: str = ""): - """reload a cog""" - if cog != "": - try: - self.bot.unload_extension(cog) - self.bot.load_extension(cog) + @_cogs.command(name="reload", pass_context=True) + async def cogs_reload(self, ctx, cog: str = ""): + """reload a cog""" + if cog != "": + try: + self.bot.unload_extension(cog) + self.bot.load_extension(cog) - await ctx.send('\N{OK HAND SIGN}') - print("cog : " + str(cog) + " rechargé") - except Exception as e: - await ctx.send('\N{PISTOL}') - await ctx.send(f'{type(e).__name__}: {e}') - else: - text = "Tuxbot - Commandes cogs\n-> .cogs *{cog}* : *{cog}*\n-> .cogs : affiche cette aide" - em = discord.Embed(title='Tuxbot - Commandes cogs', description=text, colour=0x89C4F9) - await ctx.send(embed=em) + await ctx.send('\N{OK HAND SIGN}') + print("cog : " + str(cog) + " rechargé") + except Exception as e: + await ctx.send('\N{PISTOL}') + await ctx.send(f'{type(e).__name__}: {e}') + else: + await ctx.send(embed=self.help) - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @_cogs.command(name="info", pass_context=True) - async def cogs_info(self, ctx, cog: str = ""): - """show info about a cog""" - if cog != "": - try: - entity = self.bot.get_cog(cog) + @_cogs.command(name="info", pass_context=True) + async def cogs_info(self, ctx, cog: str = ""): + """show info about a cog""" + if cog != "": + try: + entity = self.bot.get_cog(cog) - if entity is None: - clean = cog.replace('@', '@\u200b') - await ctx.send(f'Command or category "{clean}" not found.') - else: - p = await HelpPaginator.from_cog(ctx, entity) - await p.paginate() + if entity is None: + clean = cog.replace('@', '@\u200b') + await ctx.send(f'Command or category "{clean}" not found.') + else: + p = await HelpPaginator.from_cog(ctx, entity) + await p.paginate() + except Exception as e: + await ctx.send('\N{PISTOL}') + await ctx.send(f'{type(e).__name__}: {e}') + else: + await ctx.send(embed=self.help) - except Exception as e: - await ctx.send('\N{PISTOL}') - await ctx.send(f'{type(e).__name__}: {e}') - else: - text = "Tuxbot - Commandes cogs\n-> .cogs *{cog}* : *{cog}*\n-> .cogs : affiche cette aide" - em = discord.Embed(title='Tuxbot - Commandes cogs', description=text, colour=0x89C4F9) - await ctx.send(embed=em) + """---------------------------------------------------------------------""" + + @_cogs.command(name="list", pass_context=True) + async def cogs_list(self, ctx): + """list all cogs""" + + cogs = "" + for cog in self.bot.cogs: + cogs += f"{cog} *`({self.bot.cogs[cog].__module__})`*:" \ + f" {len(self.bot.get_cog_commands(cog))} commandes\n" + await ctx.send(cogs) def setup(bot): - bot.add_cog(CogManager(bot)) + bot.add_cog(CogManager(bot)) diff --git a/cogs/filter_messages.py b/cogs/filter_messages.py index b7752d0..396b47c 100755 --- a/cogs/filter_messages.py +++ b/cogs/filter_messages.py @@ -1,52 +1,60 @@ from discord.ext import commands -import discord -import asyncio -import discord - import re -class FilterMessages: - """Flitre des messages""" +class FilterMessages(commands.Cog): + """Flitre des messages""" - def __init__(self, bot): - self.bot = bot + def __init__(self, bot): + self.bot = bot - async def on_message(self, message): - no_pub_guild = [280805240977227776, 303633056944881686, 274247231534792704] - lien_channel = [280805783795662848, 508794201509593088] - sondage_channel = [394146769107419146, 477147964393914388] + @commands.Cog.listener() + async def on_message(self, message): + no_pub_guild = [280805240977227776, 303633056944881686, + 274247231534792704] + lien_channel = [280805783795662848, 508794201509593088, + 516017286948061204] + sondage_channel = [394146769107419146, 477147964393914388] - if message.author.bot \ - or str(message.author.id) in self.bot.config.authorized_id \ - or message.channel.permissions_for(message.author).administrator is True: - return + if message.author.bot \ + or str(message.author.id) in self.bot.config.authorized_id \ + or message.channel.permissions_for(message.author).administrator is True: + return - discord_invite_regex = re.compile(r"(discord\.(gg|io|me|li)|discordapp\.com\/invite)\/[0-9A-Za-z]*", re.IGNORECASE) - invalid_link_regex = re.compile(r"^(\[[^\]]+\]|<\:[a-z0-9]+\:[0-9]+>) .+ https?:\/\/\S*$", re.IGNORECASE) + discord_invite_regex = re.compile(r"(discord\.(gg|io|me|li)|discordapp\.com\/invite)\/[0-9A-Za-z]*", re.IGNORECASE) + invalid_link_regex = re.compile(r"^(\[[^\]]+\]|<\:[a-z0-9]+\:[0-9]+>) .+ https?:\/\/\S*$", re.IGNORECASE) - try: - if message.guild.id in no_pub_guild: ## discord invitation send by a non-admin and a non-authorized_id - if isinstance(discord_invite_regex.search(message.content), re.Match): - author = self.bot.get_user(message.author.id) - await message.delete() - await author.send("La pub pour les serveurs discord n'est pas autorisée ici") + try: + if message.guild.id in no_pub_guild: + if isinstance(discord_invite_regex.search(message.content), re.Match): + author = self.bot.get_user(message.author.id) + await message.delete() + await author.send("La pub pour les serveurs discord n'est pas autorisée ici") - if message.channel.id in lien_channel \ - and not isinstance(invalid_link_regex.search(message.content), re.Match): ## link send without pattern - author = self.bot.get_user(message.author.id) - await message.delete() - await author.send("Votre message `" + content + "` a été supprimé du channel `liens` car il ne respecte pas la structure définie. Pour partager un lien veuillez suivre la structure suivante : ` [Sujet] Descirption http(s)://....`") - await author.send("Si vous voulez commenter ou discuter à propos d'un lien, veuillez le faire dans le channel `#discussion-des-liens`.") + if message.channel.id in lien_channel \ + and not isinstance(invalid_link_regex.search(message.content), re.Match): + author = self.bot.get_user(message.author.id) + await message.delete() + await author.send(f"Votre message `{message.content}` a été " + f"supprimé du channel `liens` ou `projets` " + f"car il ne respecte pas la structure " + f"définie. Pour partager un lien veuillez " + f"suivre la structure suivante :" + f" ` [Sujet] Descirption http(s)://....`") + await author.send("Si vous voulez commenter ou discuter à " + "propos d'un lien ou d'un projet, veuillez " + "le faire dans le channel" + " `#discussion-des-liens` ou" + " `#discussion-projets`.") - if message.channel.id in sondage_channel: ## a non-sondage send by a non-admin - prefix_lenght = len(await self.bot.get_prefix(message)) - command = (message.content.split()[0])[prefix_lenght:] - if command != "sondage": - await message.delete() - except AttributeError: - pass + if message.channel.id in sondage_channel: + prefix_lenght = len(await self.bot.get_prefix(message)) + command = (message.content.split()[0])[prefix_lenght:] + if command != "sondage": + await message.delete() + except AttributeError: + pass def setup(bot): - bot.add_cog(FilterMessages(bot)) + bot.add_cog(FilterMessages(bot)) diff --git a/cogs/funs.py b/cogs/funs.py index a1d8ff1..f89f92a 100755 --- a/cogs/funs.py +++ b/cogs/funs.py @@ -7,182 +7,185 @@ import random import requests -class Funs: - """Commandes funs.""" +class Funs(commands.Cog): + """Commandes funs.""" - def __init__(self, bot): - self.bot = bot + def __init__(self, bot): + self.bot = bot - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @commands.command() - async def avatar(self, ctx, user: discord.Member = None): - """Récuperer l'avatar de ...""" + @commands.command() + async def avatar(self, ctx, user: discord.Member = None): + """Récuperer l'avatar de ...""" - if user == None: - user = ctx.message.author + if user is None: + user = ctx.message.author - embed = discord.Embed(title="Avatar de : " + user.name, - url=user.avatar_url_as(format="png"), - description=f"[Voir en plus grand]({user.avatar_url_as(format='png')})") - embed.set_thumbnail(url=user.avatar_url_as(format="png")) - await ctx.send(embed=embed) + embed = discord.Embed(title="Avatar de : " + user.name, + url=user.avatar_url_as(format="png"), + description=f"[Voir en plus grand]" + f"({user.avatar_url_as(format='png')})") + embed.set_thumbnail(url=user.user.avatar_url_as(format="png")) + await ctx.send(embed=embed) - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @commands.command(pass_context=True) - async def poke(self, ctx, user: discord.Member): - """Poke quelqu'un""" - await ctx.send(":clap: Hey {0} tu t'es fait poker par {1} !".format( - user.mention, ctx.message.author.name)) - await ctx.message.delete() + @commands.command(pass_context=True) + async def poke(self, ctx, user: discord.Member): + """Poke quelqu'un""" + await ctx.send(f":clap: Hey {user.mention} tu t'es fait poker par" + f" {ctx.message.author} !") + await ctx.message.delete() - """--------------------------------------------------------------------------------------------------------------------------""" - - @commands.command() - async def btcprice(self, ctx): - """Le prix du BTC""" - loading = await ctx.send("_réfléchis..._") - try: - url = urllib.request.urlopen("https://blockchain.info/fr/ticker") - btc = json.loads(url.read().decode()) - except KeyError: - btc = 1 + """---------------------------------------------------------------------""" - if btc == 1: - await loading.edit(content="Impossible d'accèder à l'API blockchain.info, " - "veuillez réessayer ultérieurment ! :c") - else: - frbtc = str(btc["EUR"]["last"]).replace(".", ",") - usbtc = str(btc["USD"]["last"]).replace(".", ",") - await loading.edit(content="Un bitcoin est égal à : {0}$US soit {1}€.".format(usbtc, frbtc)) + @commands.command() + async def btcprice(self, ctx): + """Le prix du BTC""" + loading = await ctx.send("_réfléchis..._") + try: + url = urllib.request.urlopen("https://blockchain.info/fr/ticker") + btc = json.loads(url.read().decode()) + except KeyError: + btc = 1 - """--------------------------------------------------------------------------------------------------------------------------""" + if btc == 1: + await loading.edit(content="Impossible d'accèder à l'API" + " blockchain.info, veuillez réessayer" + " ultérieurment ! :c") + else: + frbtc = str(btc["EUR"]["last"]).replace(".", ",") + usbtc = str(btc["USD"]["last"]).replace(".", ",") + await loading.edit(content=f"Un bitcoin est égal à :" + f" {usbtc}$US soit {frbtc}€.") - @commands.command() - async def joke(self, ctx, number:str = 0): - """Print a random joke in a json file""" - with open('texts/jokes.json') as js: - jk = json.load(js) + """---------------------------------------------------------------------""" - try: - if int(number) <= 15 and int(number) > 0: - clef = str(number) - else: - clef = str(random.randint(1,15)) - except: - clef = str(random.randint(1,15)) + @commands.command() + async def joke(self, ctx, number: str = 0): + """Print a random joke in a json file""" + with open('texts/jokes.json') as js: + jk = json.load(js) + try: + if 15 >= int(number) > 0: + clef = str(number) + else: + clef = str(random.randint(1, 15)) + except Exception: + clef = str(random.randint(1, 15)) - joke = jk["{}".format(clef)] + joke = jk["{}".format(clef)] - embed = discord.Embed(title="Blague _{}_ : ".format(clef), description=joke['content'], colour=0x03C9A9) - embed.set_footer(text="Par " + joke['author']) - embed.set_thumbnail(url='https://outout.tech/tuxbot/blobjoy.png') - await ctx.send(embed=embed) + embed = discord.Embed(title="Blague _{}_ : ".format(clef), + description=joke['content'], colour=0x03C9A9) + embed.set_footer(text="Par " + joke['author']) + embed.set_thumbnail(url='https://outout.tech/tuxbot/blobjoy.png') + await ctx.send(embed=embed) - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @commands.command() - async def ethylotest(self, ctx): - """Ethylotest simulator 2018""" - results_poulet = ["Désolé mais mon ethylotest est sous Windows Vista, " - "merci de patienter...", - "_(ethylotest)_ : Une erreur est survenue. Windows " - "cherche une solution à se problème.", - "Mais j'l'ai foutu où ce p\\*\\*\\* d'ethylotest de m\\*\\*\\* " - "bordel fait ch\\*\\*\\*", - "C'est pas possible z'avez cassé l'ethylotest !"] - results_client = ["D'accord, il n'y a pas de problème à cela je suis " - "complètement clean", - "Bien sur si c'est votre devoir !", "Suce bi\\*e !", - "J'ai l'air d'être bourré ?", - "_laissez moi prendre un bonbon à la menthe..._"] + @commands.command() + async def ethylotest(self, ctx): + """Ethylotest simulator 2018""" + results_poulet = ["Désolé mais mon ethylotest est sous Windows Vista, " + "merci de patienter...", + "_(ethylotest)_ : Une erreur est survenue. Windows " + "cherche une solution à se problème.", + "Mais j'l'ai foutu où ce p\\*\\*\\* d'ethylotest de m\\*\\*\\* " + "bordel fait ch\\*\\*\\*", + "C'est pas possible z'avez cassé l'ethylotest !"] + results_client = ["D'accord, il n'y a pas de problème à cela je suis " + "complètement clean", + "Bien sur si c'est votre devoir !", "Suce bi\\*e !", + "J'ai l'air d'être bourré ?", + "_laissez moi prendre un bonbon à la menthe..._"] - result_p = random.choice(results_poulet) - result_c = random.choice(results_client) + result_p = random.choice(results_poulet) + result_c = random.choice(results_client) - await ctx.send(":oncoming_police_car: Bonjour bonjour, contrôle " - "d'alcoolémie !") - await asyncio.sleep(0.5) - await ctx.send(":man: " + result_c) - await asyncio.sleep(1) - await ctx.send(":police_car: " + result_p) + await ctx.send(":oncoming_police_car: Bonjour bonjour, contrôle " + "d'alcoolémie !") + await asyncio.sleep(0.5) + await ctx.send(":man: " + result_c) + await asyncio.sleep(1) + await ctx.send(":police_car: " + result_p) - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @commands.command() - async def coin(self, ctx): - """Coin flip simulator 2025""" - starts_msg = ["Je lance la pièce !", "C'est parti !", "C'est une pièce" - " d'un cent faut" - " pas la perdre", - "C'est une pièce d'un euro faut pas la perdre", - "Je lance !"] - results_coin = ["{0} pile", "{0} face", "{1} Heu c'est quoi pile c'est" - " quoi face enfaite ?", - "{1} Oh shit, je crois que je l'ai perdue", - "{1} Et bim je te vol ta pièce !", - "{0} Oh une erreur d'impression il n'y a ni pile ni" - " face !"] + @commands.command() + async def coin(self, ctx): + """Coin flip simulator 2025""" + starts_msg = ["Je lance la pièce !", "C'est parti !", "C'est une pièce" + " d'un cent faut" + " pas la perdre", + "C'est une pièce d'un euro faut pas la perdre", + "Je lance !"] + results_coin = ["{0} pile", "{0} face", "{1} Heu c'est quoi pile c'est" + " quoi face enfaite ?", + "{1} Oh shit, je crois que je l'ai perdue", + "{1} Et bim je te vol ta pièce !", + "{0} Oh une erreur d'impression il n'y a ni pile ni" + " face !"] - start = random.choice(starts_msg) - result = random.choice(results_coin) + start = random.choice(starts_msg) + result = random.choice(results_coin) - await ctx.send(start) - await asyncio.sleep(0.6) - await ctx.send(result.format(":moneybag: Et la pièce retombe sur ...", - ":robot:")) + await ctx.send(start) + await asyncio.sleep(0.6) + await ctx.send(result.format(":moneybag: Et la pièce retombe sur ...", + ":robot:")) - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @commands.command() - async def pokemon(self, ctx): - """Random pokemon fight""" - with open('texts/pokemons.json') as js: - jk = json.load(js) + @commands.command() + async def pokemon(self, ctx): + """Random pokemon fight""" + with open('texts/pokemons.json') as js: + jk = json.load(js) - poke1 = jk[random.randint(1, 150)] - poke2 = jk[random.randint(1, 150)] + poke1 = jk[random.randint(1, 150)] + poke2 = jk[random.randint(1, 150)] - try: - if poke1['MaxHP'] > poke2['MaxHP']: - winer = poke1 - else: - winer = poke2 - except KeyError: - winer = poke1 + try: + if poke1['MaxHP'] > poke2['MaxHP']: + winer = poke1 + else: + winer = poke2 + except KeyError: + winer = poke1 - await ctx.send(":flag_white: **Le combat commence !**") - await asyncio.sleep(1) - await ctx.send(":loudspeaker: Les concurants sont {} contre {} ! Bonne" - " chance à eux !".format(poke1["Name"], poke2["Name"])) - await asyncio.sleep(0.5) - await ctx.send(":boom: {} commence et utilise {}".format( - poke1["Name"], poke1["Fast Attack(s)"][0]["Name"])) - await asyncio.sleep(1) - await ctx.send(":dash: {} réplique avec {}".format( - poke2["Name"], poke2["Fast Attack(s)"][0]["Name"])) - await asyncio.sleep(1.2) - await ctx.send("_le combat continue de se dérouler..._") - await asyncio.sleep(1.5) - await ctx.send(":trophy: Le gagnant est **{}** !".format( - winer["Name"])) + await ctx.send(":flag_white: **Le combat commence !**") + await asyncio.sleep(1) + await ctx.send(":loudspeaker: Les concurants sont {} contre {} ! Bonne" + " chance à eux !".format(poke1["Name"], poke2["Name"])) + await asyncio.sleep(0.5) + await ctx.send(":boom: {} commence et utilise {}".format( + poke1["Name"], poke1["Fast Attack(s)"][0]["Name"])) + await asyncio.sleep(1) + await ctx.send(":dash: {} réplique avec {}".format( + poke2["Name"], poke2["Fast Attack(s)"][0]["Name"])) + await asyncio.sleep(1.2) + await ctx.send("_le combat continue de se dérouler..._") + await asyncio.sleep(1.5) + await ctx.send(":trophy: Le gagnant est **{}** !".format( + winer["Name"])) - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @commands.command() - async def randomcat(self, ctx): - """Display a random cat""" - r = requests.get('http://aws.random.cat/meow') - cat = str(r.json()['file']) - embed = discord.Embed(title="Meow", - description="[Voir le chat plus grand]({})". - format(cat), colour=0x03C9A9) - embed.set_thumbnail(url=cat) - embed.set_author(name="Random.cat", url='https://random.cat/') - await ctx.send(embed=embed) + @commands.command() + async def randomcat(self, ctx): + """Display a random cat""" + r = requests.get('http://aws.random.cat/meow') + cat = str(r.json()['file']) + embed = discord.Embed(title="Meow", + description="[Voir le chat plus grand]({})". + format(cat), colour=0x03C9A9) + embed.set_thumbnail(url=cat) + embed.set_author(name="Random.cat", url='https://random.cat/') + await ctx.send(embed=embed) def setup(bot): - bot.add_cog(Funs(bot)) + bot.add_cog(Funs(bot)) diff --git a/cogs/passport.py b/cogs/passport.py index 95c8301..0bb933d 100755 --- a/cogs/passport.py +++ b/cogs/passport.py @@ -1,17 +1,19 @@ -from discord.ext import commands +import aiohttp +import datetime import discord - +import imghdr +import os +import shutil from PIL import Image from PIL import ImageOps +from discord.ext import commands -from .utils import checks from .utils import db +from .utils.checks import get_user 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: +class Passport(commands.Cog): """Commandes des passeports .""" def __init__(self, bot): diff --git a/cogs/role.py b/cogs/role.py index 47e3282..c16169e 100755 --- a/cogs/role.py +++ b/cogs/role.py @@ -1,127 +1,152 @@ from discord.ext import commands import discord -class Role: - """Commandes role.""" - def __init__(self, bot): - self.bot = bot +class Role(commands.Cog): + """Commandes role.""" - self.ARCH_ROLE = 393077257826205706 - self.DEBIAN_ROLE = 393077933209550859 - self.RHEL_ROLE = 393078333245751296 - self.ANDROID_ROLE = 393087862972612627 - self.BSD_ROLE = 401791543708745738 + def __init__(self, bot): + self.bot = bot - @commands.group(name="role", no_pm=True, pass_context=True, case_insensitive=True) - async def _role(self, ctx): - """Affiche l'aide sur la commande role""" - if ctx.message.guild.id != 280805240977227776: - return + self.ARCH_ROLE = 393077257826205706 + self.DEBIAN_ROLE = 393077933209550859 + self.RHEL_ROLE = 393078333245751296 + self.ANDROID_ROLE = 393087862972612627 + self.BSD_ROLE = 401791543708745738 - if ctx.invoked_subcommand is None: - text = open('texts/roles.md').read() - em = discord.Embed(title='Gestionnaires de rôles', description=text,colour=0x89C4F9) - await ctx.send(embed=em) + @commands.group(name="role", no_pm=True, pass_context=True, + case_insensitive=True) + async def _role(self, ctx): + """Affiche l'aide sur la commande role""" + if ctx.message.guild.id != 280805240977227776: + return - """--------------------------------------------------------------------------------------------------------------------------""" + if ctx.invoked_subcommand is None: + text = open('texts/roles.md').read() + em = discord.Embed(title='Gestionnaires de rôles', + description=text, colour=0x89C4F9) + await ctx.send(embed=em) - @_role.command(name="arch", aliases=["archlinux", "arch_linux"], pass_context=True) - async def role_arch(self, ctx): - """Ajoute/retire le role 'Arch user'""" - roles = ctx.message.author.roles - role_id = [] - for role in roles: - role_id.append(role.id) + """---------------------------------------------------------------------""" - user = ctx.message.author - if self.ARCH_ROLE in role_id: - await user.remove_roles(discord.Object(id=self.ARCH_ROLE)) - await ctx.send(ctx.message.author.mention + " > Pourquoi tu viens de supprimer Arch Linux, c'était trop compliqué pour toi ? <:sad:343723037331292170>") - else: - await user.add_roles(discord.Object(id=self.ARCH_ROLE)) - await ctx.send(ctx.message.author.mention + " > How un ArchLinuxien, c'est bon les ``yaourt`` ? <:hap:354275645574086656>") + @_role.command(name="arch", aliases=["archlinux", "arch_linux"], + pass_context=True) + async def role_arch(self, ctx): + """Ajoute/retire le role 'Arch user'""" + roles = ctx.message.author.roles + role_id = [] + for role in roles: + role_id.append(role.id) - """--------------------------------------------------------------------------------------------------------------------------""" + user = ctx.message.author + if self.ARCH_ROLE in role_id: + await user.remove_roles(discord.Object(id=self.ARCH_ROLE)) + await ctx.send(f"{ctx.message.author.mention} > Pourquoi tu viens " + f"de supprimer Arch Linux, c'était trop compliqué " + f"pour toi ? <:sad:343723037331292170>") + else: + await user.add_roles(discord.Object(id=self.ARCH_ROLE)) + await ctx.send(f"{ctx.message.author.mention} > How un " + f"ArchLinuxien, c'est bon les ``yaourt`` ? " + f"<:hap:354275645574086656>") - @_role.command(name="debian", pass_context=True) - async def role_debian(self, ctx): - """Ajoute/retire le role 'debian user'""" - roles = ctx.message.author.roles - role_id = [] - for role in roles: - role_id.append(role.id) + """---------------------------------------------------------------------""" - user = ctx.message.author - if self.DEBIAN_ROLE in role_id: - await user.remove_roles(discord.Object(id=self.DEBIAN_ROLE)) - await ctx.send(ctx.message.author.mention + " > Adieu ! Tu verras, APT te manquera ! ") - else: - await user.add_roles(discord.Object(id=self.DEBIAN_ROLE)) - await ctx.send(ctx.message.author.mention + " > Un utilisateur de Debian, encore et encore ! <:stuck_out_tongue:343723077412323339>") + @_role.command(name="debian", pass_context=True) + async def role_debian(self, ctx): + """Ajoute/retire le role 'debian user'""" + roles = ctx.message.author.roles + role_id = [] + for role in roles: + role_id.append(role.id) - """--------------------------------------------------------------------------------------------------------------------------""" + user = ctx.message.author + if self.DEBIAN_ROLE in role_id: + await user.remove_roles(discord.Object(id=self.DEBIAN_ROLE)) + await ctx.send(f"{ctx.message.author.mention} > Adieu ! Tu verras, " + f"APT te manquera ! ") + else: + await user.add_roles(discord.Object(id=self.DEBIAN_ROLE)) + await ctx.send(f"{ctx.message.author.mention} > Un utilisateur de " + f"Debian, encore et encore ! " + f"<:stuck_out_tongue:343723077412323339>") - @_role.command(name="rhel", pass_context=True) - async def role_rhel(self, ctx): - """Ajoute/retire le role 'rhel user'""" - roles = ctx.message.author.roles - role_id = [] - for role in roles: - role_id.append(role.id) + """---------------------------------------------------------------------""" - user = ctx.message.author - if self.RHEL_ROLE in role_id: - await user.remove_roles(discord.Object(id=self.RHEL_ROLE)) - await ctx.send(ctx.message.author.mention + " > Pourquoi tu t'en vas, il sont déjà assez seul là-bas <:sad:343723037331292170>") - else: - await user.add_roles(discord.Object(id=self.RHEL_ROLE)) - await ctx.send(ctx.message.author.mention + " > Mais, voila quelqu'un qui porte des chapeaux ! <:hap:354275645574086656>") + @_role.command(name="rhel", pass_context=True) + async def role_rhel(self, ctx): + """Ajoute/retire le role 'rhel user'""" + roles = ctx.message.author.roles + role_id = [] + for role in roles: + role_id.append(role.id) - """--------------------------------------------------------------------------------------------------------------------------""" + user = ctx.message.author + if self.RHEL_ROLE in role_id: + await user.remove_roles(discord.Object(id=self.RHEL_ROLE)) + await ctx.send(f"{ctx.message.author.mention} > Pourquoi tu t'en " + f"vas, il sont déjà assez seul là-bas " + f"<:sad:343723037331292170>") + else: + await user.add_roles(discord.Object(id=self.RHEL_ROLE)) + await ctx.send(f"{ctx.message.author.mention} > Mais, voila " + f"quelqu'un qui porte des chapeaux ! " + f"<:hap:354275645574086656>") - @_role.command(name="android", pass_context=True) - async def role_android(self, ctx): - """Ajoute/retire le role 'android user'""" - roles = ctx.message.author.roles - role_id = [] - for role in roles: - role_id.append(role.id) + """---------------------------------------------------------------------""" - user = ctx.message.author - if self.ANDROID_ROLE in role_id: - await user.remove_roles(discord.Object(id=self.ANDROID_ROLE)) - await ctx.send(ctx.message.author.mention + " > How, me dit pas que tu as compris que les Android's allaient exterminer le monde ? <:trollface:375327667160875008>") - else: - await user.add_roles(discord.Object(id=self.ANDROID_ROLE)) - await ctx.send(ctx.message.author.mention + " > Hey, un utilisateur d'Android, prêt à continuer l'extermination de WP et iOS ? <:stuck_out_tongue:343723077412323339>") + @_role.command(name="android", pass_context=True) + async def role_android(self, ctx): + """Ajoute/retire le role 'android user'""" + roles = ctx.message.author.roles + role_id = [] + for role in roles: + role_id.append(role.id) - """--------------------------------------------------------------------------------------------------------------------------""" + user = ctx.message.author + if self.ANDROID_ROLE in role_id: + await user.remove_roles(discord.Object(id=self.ANDROID_ROLE)) + await ctx.send(f"{ctx.message.author.mention} >How, me dit pas " + f"que tu as compris que les Android's allaient " + f"exterminer le monde ? " + f"<:trollface:375327667160875008>") + else: + await user.add_roles(discord.Object(id=self.ANDROID_ROLE)) + await ctx.send(f"{ctx.message.author.mention} > Hey, un utilisateur" + f" d'Android, prêt à continuer l'extermination de " + f"WP et iOS ? " + f"<:stuck_out_tongue:343723077412323339>") - @_role.command(name="bsd", pass_context=True) - async def role_bsd(self, ctx): - """Ajoute/retire le role 'BSD user'""" - roles = ctx.message.author.roles - role_id = [] - for role in roles: - role_id.append(role.id) + """---------------------------------------------------------------------""" - user = ctx.message.author - if self.BSD_ROLE in role_id: - await user.remove_roles(discord.Object(id=self.BSD_ROLE)) - await ctx.send(ctx.message.author.mention + " > Ohhhh fait gaffe ou le démon va te piquer") - else: - await user.add_roles(discord.Object(id=self.BSD_ROLE)) - await ctx.send(ctx.message.author.mention + " > Quelqu'un sous BSD ! Au moins il a pas besoin de mettre GNU devant son OS à chaque fois :d") + @_role.command(name="bsd", pass_context=True) + async def role_bsd(self, ctx): + """Ajoute/retire le role 'BSD user'""" + roles = ctx.message.author.roles + role_id = [] + for role in roles: + role_id.append(role.id) - """--------------------------------------------------------------------------------------------------------------------------""" + user = ctx.message.author + if self.BSD_ROLE in role_id: + await user.remove_roles(discord.Object(id=self.BSD_ROLE)) + await ctx.send(f"{ctx.message.author.mention} > Ohhhh fait gaffe " + f"ou le démon va te piquer") + else: + await user.add_roles(discord.Object(id=self.BSD_ROLE)) + await ctx.send(f"{ctx.message.author.mention} > Quelqu'un sous " + f"BSD ! Au moins il a pas besoin de mettre GNU " + f"devant son OS à chaque fois :d") - @_role.command(name="staff", pass_context=True, hidden=True) - async def role_staff(self, ctx): - """Easter egg""" - user = ctx.message.author - await ctx.send(ctx.message.author.mention + " > Vous n'avez pas le rôle staff, tu crois quoi :joy:") + """---------------------------------------------------------------------""" + + @_role.command(name="staff", pass_context=True, hidden=True) + async def role_staff(self, ctx): + """Easter egg""" + + await ctx.send(f"{ctx.message.author.mention} > Vous n'avez pas " + f"le rôle staff, tu crois quoi :joy:") def setup(bot): - bot.add_cog(Role(bot)) + bot.add_cog(Role(bot)) diff --git a/cogs/search.py b/cogs/search.py index fdb945f..536413f 100755 --- a/cogs/search.py +++ b/cogs/search.py @@ -4,165 +4,154 @@ import asyncio import urllib.request import wikipedia +wikipedia.set_lang("fr") -class Search: - """Commandes de WWW.""" - def __init__(self, bot): - self.bot = bot +class Search(commands.Cog): + """Commandes de WWW.""" - @commands.group(name="search", no_pm=True, pass_context=True) - async def _search(self, ctx): - """Rechercher sur le world wide web""" - if ctx.invoked_subcommand is None: - text = open('texts/search.md').read() - em = discord.Embed(title='Commandes de search TuxBot', - description=text, - colour=0x89C4F9) - await ctx.send(embed=em) + def __init__(self, bot): + self.bot = bot - @_search.command(pass_context=True, name="docubuntu") - async def search_docubuntu(self, ctx, args): - attends = await ctx.send("_Je te cherche ça {} !_".format( - ctx.author.mention)) - html = urllib.request.urlopen("https://doc.ubuntu-fr.org/" + - args).read() - if "avez suivi un lien" in str(html): - await attends.edit(content=":sob: Nooooon ! Cette page n'existe " - "pas, mais tu peux toujours la créer : " - "https://doc.ubuntu-fr.org/" + args) - else: - await attends.delete() - embed = discord.Embed(description="Voila j'ai trouvé ! Voici la " - "page ramenant à votre recherche," - " toujours aussi bien rédigée " - ":wink: : https://doc.ubuntu-fr." - "org/" + args, - url='http://doc.ubuntu-fr.org/') - embed.set_author(name="DocUbuntu-Fr", - url='http://doc.ubuntu-fr.org/', - icon_url='https://tuxbot.outout.xyz/data/ubuntu.png') - embed.set_thumbnail(url='https://tuxbot.outout.xyz/data/ubuntu.png') - embed.set_footer(text="Merci à ceux qui ont pris le temps d'écrire " - "cette documentation") - await ctx.send(embed=embed) + @commands.group(name="search", no_pm=True, pass_context=True) + async def _search(self, ctx): + """Rechercher sur le world wide web""" + if ctx.invoked_subcommand is None: + text = open('texts/search.md').read() + em = discord.Embed(title='Commandes de search TuxBot', + description=text, + colour=0x89C4F9) + await ctx.send(embed=em) - @_search.command(pass_context=True, name="docarch") - async def search_docarch(self, ctx, args): - attends = await ctx.send("_Je te cherche ça {} !_".format( - ctx.author.mention)) - html = urllib.request.urlopen("https://wiki.archlinux.org/index.php/" + - args).read() - if "There is currently no text in this page" in str(html): - await attends.edit(content=":sob: Nooooon ! Cette page n'existe " - "pas.") - else: - await attends.delete() - embed = discord.Embed(description="Voila j'ai trouvé ! Voici la " - "page ramenant à votre recherche," - " toujours aussi bien rédigée " - ":wink: : https://wiki.archlinux." - "org/index.php/" + args, - url='https://wiki.archlinux.org/index.php/') - embed.set_author(name="Doc ArchLinux", - url='https://wiki.archlinux.org/index.php/', - icon_url='https://tuxbot.outout.xyz/data/arch.png') - embed.set_thumbnail(url='https://tuxbot.outout.xyz/data/arch.png') - embed.set_footer(text="Merci à ceux qui ont pris le temps d'écrire " - "cette documentation") - await ctx.send(embed=embed) + @_search.command(pass_context=True, name="docubuntu") + async def search_docubuntu(self, ctx, args): + attends = await ctx.send("_Je te cherche ça {} !_".format( + ctx.message.author.mention)) + html = urllib.request.urlopen("https://doc.ubuntu-fr.org/" + + args).read() + if "avez suivi un lien" in str(html): + await attends.edit(content=":sob: Nooooon ! Cette page n'existe " + "pas, mais tu peux toujours la créer : " + "https://doc.ubuntu-fr.org/" + args) + else: + await attends.delete() + embed = discord.Embed(description="Voila j'ai trouvé ! Voici la " + "page ramenant à votre recherche," + " toujours aussi bien rédigée " + ":wink: : https://doc.ubuntu-fr." + "org/" + args, + url='http://doc.ubuntu-fr.org/') + embed.set_author(name="DocUbuntu-Fr", + url='http://doc.ubuntu-fr.org/', + icon_url='https://tuxbot.outout.xyz/data/ubuntu.png') + embed.set_thumbnail(url='https://tuxbot.outout.xyz/data/ubuntu.png') + embed.set_footer(text="Merci à ceux qui ont pris le temps d'écrire " + "cette documentation") + await ctx.send(embed=embed) - @_search.command(pass_context=True, name="wikipedia") - async def search_wikipedia(self, ctx: commands.Context, *, args): - """Fait une recherche sur wikipd""" + @_search.command(pass_context=True, name="docarch") + async def search_docarch(self, ctx, args): + attends = await ctx.send("_Je te cherche ça {} !_".format( + ctx.message.author.mention)) + html = urllib.request.urlopen("https://wiki.archlinux.org/index.php/" + + args).read() + if "There is currently no text in this page" in str(html): + await attends.edit(content=":sob: Nooooon ! Cette page n'existe " + "pas.") + else: + await attends.delete() + embed = discord.Embed(description="Voila j'ai trouvé ! Voici la " + "page ramenant à votre recherche," + " toujours aussi bien rédigée " + ":wink: : https://wiki.archlinux." + "org/index.php/" + args, + url='https://wiki.archlinux.org/index.php/') + embed.set_author(name="Doc ArchLinux", + url='https://wiki.archlinux.org/index.php/', + icon_url='https://tuxbot.outout.xyz/data/arch.png') + embed.set_thumbnail(url='https://tuxbot.outout.xyz/data/arch.png') + embed.set_footer(text="Merci à ceux qui ont pris le temps d'écrire " + "cette documentation") + await ctx.send(embed=embed) - params = args.split(" ") + @_search.command(pass_context=True, name="wikipedia") + async def search_wikipedia(self, ctx: commands.Context, args): + """Fait une recherche sur wikipd""" - lang = [x for x in params if x.startswith("lang=")] - if lang: - lang = lang[0] - params.remove(lang) - lang = lang.replace("lang=", "") - wikipedia.set_lang(lang) - else: - wikipedia.set_lang("fr") + wait = await ctx.send("_Je cherche..._") + results = wikipedia.search(args) + nbmr = 0 + mmssgg = "" - params = ' '.join(params) + for value in results: + nbmr = nbmr + 1 + mmssgg = mmssgg + "**{}**: {} \n".format(str(nbmr), value) - wait = await ctx.send("_Je cherche..._") - results = wikipedia.search(params) - nbmr = 0 - mmssgg = "" + em = discord.Embed(title='Résultats de : ' + args, + description = mmssgg, + colour=0x4ECDC4) + em.set_thumbnail(url="https://upload.wikimedia.org/wikipedia/commons/" + "2/26/Paullusmagnus-logo_%28large%29.png") + await wait.delete() - for value in results: - nbmr = nbmr + 1 - mmssgg = mmssgg + "**{}**: {} \n".format(str(nbmr), value) + sending = ["1⃣", "2⃣", "3⃣", "4⃣", "5⃣", "6⃣", "7⃣", "8⃣", "9⃣", "🔟"] - em = discord.Embed(title='Résultats de : ' + params, - description = mmssgg, - colour=0x4ECDC4) - em.set_thumbnail(url="https://upload.wikimedia.org/wikipedia/commons/" - "2/26/Paullusmagnus-logo_%28large%29.png") - await wait.delete() + def check(reaction, user): + return user == ctx.author and reaction.emoji in sending and \ + reaction.message.id == msg.id - sending = ["1⃣", "2⃣", "3⃣", "4⃣", "5⃣", "6⃣", "7⃣", "8⃣", "9⃣", "🔟"] + async def waiter(future: asyncio.Future): + reaction, user = await self.bot.wait_for('reaction_add', + check=check) + future.set_result(reaction.emoji) - def check(reaction, user): - return user == ctx.author and reaction.emoji in sending and \ - reaction.message.id == msg.id + emoji = asyncio.Future() + self.bot.loop.create_task(waiter(emoji)) - async def waiter(future: asyncio.Future): - reaction, user = await self.bot.wait_for('reaction_add', - check=check) - future.set_result(reaction.emoji) + msg = await ctx.send(embed=em) + for e in sending: + await msg.add_reaction(e) + if emoji.done(): + break - emoji = asyncio.Future() - self.bot.loop.create_task(waiter(emoji)) + while not emoji.done(): + await asyncio.sleep(0.1) - msg = await ctx.send(embed=em) - for e in sending: - await msg.add_reaction(e) - if emoji.done(): - break + page = int(sending.index(emoji.result())) - while not emoji.done(): - await asyncio.sleep(0.1) + args_ = results[page] - sPage = int(sending.index(emoji.result())) + try: + await msg.delete() + await ctx.trigger_typing() + wait = await ctx.send(ctx.message.author.mention + + " ah ok sympa cette recherche, je l'effectue de suite !") + wp = wikipedia.page(args_) + wp_contenu = wp.summary[:200] + "..." + em = discord.Embed(title='Wikipedia : ' + wp.title, + description = "{} \n_Lien_ : {} ".format( + wp_contenu, wp.url), + colour=0x9B59B6) + em.set_author(name="Wikipedia", + url='http://wikipedia.org', + icon_url='https://upload.wikimedia.org/wikipedia/' + 'commons/2/26/Paullusmagnus-logo_%28large' + '%29.png') + em.set_thumbnail(url = "https://upload.wikimedia.org/wikipedia/" + "commons/2/26/Paullusmagnus-logo_%28large" + "%29.png") + em.set_footer(text="Merci à eux de nous fournir une encyclopédie " + "libre !") + await wait.delete() + await ctx.send(embed=em) - args_ = results[sPage] - - try: - await msg.delete() - await ctx.trigger_typing() - wait = await ctx.send(ctx.author.mention + - " ah ok sympa cette recherche, je l'effectue de suite !") - wp = wikipedia.page(args_) - wp_contenu = wp.summary[:200] + "..." - em = discord.Embed(title='Wikipedia : ' + wp.title, - description = "{} \n_Lien_ : {} ".format( - wp_contenu, wp.url), - colour=0x9B59B6) - em.set_author(name="Wikipedia", - url='http://wikipedia.org', - icon_url='https://upload.wikimedia.org/wikipedia/' - 'commons/2/26/Paullusmagnus-logo_%28large' - '%29.png') - em.set_thumbnail(url = "https://upload.wikimedia.org/wikipedia/" - "commons/2/26/Paullusmagnus-logo_%28large" - "%29.png") - em.set_footer(text="Merci à eux de nous fournir une encyclopédie " - "libre !") - await wait.delete() - await ctx.send(embed=em) - - except wikipedia.exceptions.PageError: - # TODO : A virer dans l'event on_error - await ctx.send(":open_mouth: Une **erreur interne** est survenue," - " si cela ce reproduit contactez votre" - " administrateur ou faites une Issue sur" - " ``github`` !") + except wikipedia.exceptions.PageError: + # TODO : A virer dans l'event on_error + await ctx.send(":open_mouth: Une **erreur interne** est survenue," + " si cela ce reproduit contactez votre" + " administrateur ou faites une Issue sur" + " ``gitea`` !") def setup(bot): - bot.add_cog(Search(bot)) + bot.add_cog(Search(bot)) diff --git a/cogs/send_logs.py b/cogs/send_logs.py index e821e9e..93b328d 100755 --- a/cogs/send_logs.py +++ b/cogs/send_logs.py @@ -1,80 +1,105 @@ -from discord.ext import commands +import datetime +import socket + import discord +from discord.ext import commands -import datetime, socket -class SendLogs: - """Send logs to a specific channel""" +class SendLogs(commands.Cog): + """Send logs to a specific channel""" - def __init__(self, bot): + def __init__(self, bot): - self.bot = bot - self.log_channel = None - self.main_server_id = int(self.bot.config.main_server_id) + self.bot = bot + self.log_channel = None + self.main_server_id = int(self.bot.config.main_server_id) - async def on_resumed(self): - em = discord.Embed(title="Et hop je me reconnecte à l'api 😃", colour=0x5cb85c) - em.timestamp = datetime.datetime.utcnow() - await self.log_channel.send(embed=em) + @commands.Cog.listener() + async def on_resumed(self): + em = discord.Embed(title="Et hop je me reconnecte à l'api 😃", + colour=0x5cb85c) + em.timestamp = datetime.datetime.utcnow() + await self.log_channel.send(embed=em) - async def on_ready(self): - self.log_channel = self.bot.get_channel(int(self.bot.config.log_channel_id)) - em = discord.Embed(title="Je suis opérationnel 😃", description=f"*Instance lancée sur {socket.gethostname()}*", colour=0x5cb85c) - em.timestamp = datetime.datetime.utcnow() - await self.log_channel.send(embed=em) + @commands.Cog.listener() + async def on_ready(self): + self.log_channel = self.bot.get_channel(int(self.bot.config.log_channel_id)) + em = discord.Embed(title="Je suis opérationnel 😃", + description=f"*Instance lancée sur " + f"{socket.gethostname()}*", colour=0x5cb85c) + em.timestamp = datetime.datetime.utcnow() + await self.log_channel.send(embed=em) - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - async def on_guild_join(self, guild: discord.Guild): - em = discord.Embed(title=f"On m'a ajouté à : {str(guild.name)} 😃", colour=0x51A351) - em.timestamp = datetime.datetime.utcnow() - await self.log_channel.send(embed=em) + @commands.Cog.listener() + async def on_guild_join(self, guild: discord.Guild): + em = discord.Embed(title=f"On m'a ajouté à : {str(guild.name)} 😃", + colour=0x51A351) + em.timestamp = datetime.datetime.utcnow() + await self.log_channel.send(embed=em) - async def on_guild_remove(self, guild: discord.Guild): - em = discord.Embed(title=f"On m'a viré de : {str(guild.name)} 😦", colour=0xBD362F) - em.timestamp = datetime.datetime.utcnow() - await self.log_channel.send(embed=em) + @commands.Cog.listener() + async def on_guild_remove(self, guild: discord.Guild): + em = discord.Embed(title=f"On m'a viré de : {str(guild.name)} 😦", + colour=0xBD362F) + em.timestamp = datetime.datetime.utcnow() + await self.log_channel.send(embed=em) - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - async def on_member_join(self, member): - if member.guild.id == self.main_server_id: - em = discord.Embed(title=f"{str(member)} *`({str(member.id)})`* nous a rejoint 😃", colour=0x51A351) - em.set_footer(text="Compte crée le " + str(member.created_at), ) - em.timestamp = datetime.datetime.utcnow() - await self.log_channel.send(embed=em) + @commands.Cog.listener() + async def on_member_join(self, member): + if member.guild.id == self.main_server_id: + em = discord.Embed(title=f"{str(member)} *`({str(member.id)})`* " + f"nous a rejoint 😃", colour=0x51A351) + em.set_footer(text=f"Compte crée le {member.created_at}") + em.timestamp = datetime.datetime.utcnow() + await self.log_channel.send(embed=em) - async def on_member_remove(self, member): - if member.guild.id == self.main_server_id: - em = discord.Embed(title=f"{str(member)} *`({str(member.id)})`* nous a quitter 😦", colour=0xBD362F) - em.timestamp = datetime.datetime.utcnow() - await self.log_channel.send(embed=em) + @commands.Cog.listener() + async def on_member_remove(self, member): + if member.guild.id == self.main_server_id: + em = discord.Embed(title=f"{str(member)} *`({str(member.id)})`* " + f"nous a quitté 😦", colour=0xBD362F) + em.timestamp = datetime.datetime.utcnow() + await self.log_channel.send(embed=em) - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - async def on_message_delete(self, message): - if message.guild.id == self.main_server_id and not message.author.bot: - async def is_a_command(message): - prefix_lenght = len(await self.bot.get_prefix(message)) - command = (message.content.split()[0])[prefix_lenght:] - if command == '': - command = "not_a_command" + @commands.Cog.listener() + async def on_message_delete(self, message): + if message.guild.id == self.main_server_id and not message.author.bot: + async def is_a_command(message): + prefix_lenght = len(await self.bot.get_prefix(message)) + command = (message.content.split()[0])[prefix_lenght:] + if command == '': + command = "not_a_command" - return self.bot.get_command(str(command)) - - if await is_a_command(message) is None: - em = discord.Embed(title=f"Message supprimé dans : {str(message.channel.name)}", colour=0xBD362F) - em.add_field(name=f"{str(message.author)} *`({str(message.author.id)})`* a supprimé :", value=str(message.content)) - em.timestamp = datetime.datetime.utcnow() - await self.log_channel.send(embed=em) + return self.bot.get_command(str(command)) + + if await is_a_command(message) is None: + em = discord.Embed(title=f"Message supprimé dans :" + f" {str(message.channel.name)}", + colour=0xBD362F) + em.add_field(name=f"{str(message.author)} " + f"*`({str(message.author.id)})`* " + f"a supprimé :", value=str(message.content)) + em.timestamp = datetime.datetime.utcnow() + await self.log_channel.send(embed=em) + + @commands.Cog.listener() + async def on_message_edit(self, before, after): + if before.guild.id == self.main_server_id and not before.author.bot: + em = discord.Embed(title=f"Message edité dans : " + f"{before.channel.name}", colour=0x0088CC) + em.add_field(name=f"{str(before.author)} " + f"*`({str(before.author.id)})`* a" + f" edité :", value=str(before.content)) + em.add_field(name="Pour remplacer par :", value=str(after.content)) + em.timestamp = datetime.datetime.utcnow() + await self.log_channel.send(embed=em) - async def on_message_edit(self, before, after): - if before.guild.id == self.main_server_id and not before.author.bot: - em = discord.Embed(title="Message edité dans : " + str(before.channel.name), colour=0x0088CC) - em.add_field(name=f"{str(before.author)} *`({str(before.author.id)})`* a edité :", value=str(before.content)) - em.add_field(name="Pour remplacer par :", value=str(after.content)) - em.timestamp = datetime.datetime.utcnow() - await self.log_channel.send(embed=em) def setup(bot): - bot.add_cog(SendLogs(bot)) + bot.add_cog(SendLogs(bot)) diff --git a/cogs/sondage.py b/cogs/sondage.py index 4ceae3f..39fc95c 100755 --- a/cogs/sondage.py +++ b/cogs/sondage.py @@ -1,107 +1,111 @@ -from discord.ext import commands -import discord -import random import asyncio -import datetime + +import discord +from discord.ext import commands -class Sondage: - """Commandes sondage.""" +class Sondage(commands.Cog): + """Commandes sondage.""" - def __init__(self, bot): - self.bot = bot + def __init__(self, bot): + self.bot = bot - @commands.command(pass_context=True) - async def sondage(self, ctx, *, msg="help"): - if msg != "help": - await ctx.message.delete() - options = msg.split(" | ") - time = [x for x in options if x.startswith("time=")] - if time: - time = time[0] - options.remove(time) - time = int(time.strip("time=")) - else: - time = 0 - if len(options) <= 1: - raise commands.errors.MissingRequiredArgument - if len(options) >= 21: - return await ctx.send(ctx.author.mention + "> :octagonal_sign: Vous ne pouvez pas mettre plus de 20 réponses !") - emoji = ['1⃣', - '2⃣', - '3⃣', - '4⃣', - '5⃣', - '6⃣', - '7⃣', - '8⃣', - '9⃣', - '🔟', - '0⃣', - '🇦', - '🇧', - '🇨', - '🇩', - '🇪', - '🇫', - '🇬', - '🇭', - '🇮' - ] - to_react = [] - confirmation_msg = "**{}?**:\n\n".format(options[0].rstrip("?")) - for idx, option in enumerate(options[1:]): - confirmation_msg += "{} - {}\n".format(emoji[idx], option) - to_react.append(emoji[idx]) - confirmation_msg += "*Sondage proposé par* " + \ - str(ctx.author.mention) - if time == 0: - confirmation_msg += "" - else: - confirmation_msg += "\n\nVous avez {} secondes pour voter!".\ - format(time) - poll_msg = await ctx.send(confirmation_msg) - for emote in to_react: - await poll_msg.add_reaction(emote) + @commands.command(pass_context=True) + async def sondage(self, ctx, *, msg="help"): + if msg != "help": + await ctx.message.delete() + options = msg.split(" | ") + time = [x for x in options if x.startswith("time=")] + if time: + time = time[0] + if time: + options.remove(time) + if len(options) <= 1: + raise commands.errors.MissingRequiredArgument + if len(options) >= 22: + return await ctx.send(f"{ctx.message.author.mention}> " + f":octagonal_sign: Vous ne pouvez pas " + f"mettre plus de 20 réponses !") + if time: + time = int(time.strip("time=")) + else: + time = 0 + emoji = ['1⃣', + '2⃣', + '3⃣', + '4⃣', + '5⃣', + '6⃣', + '7⃣', + '8⃣', + '9⃣', + '🔟', + '0⃣', + '🇦', + '🇧', + '🇨', + '🇩', + '🇪', + '🇫', + '🇬', + '🇭', + '🇮' + ] + to_react = [] + confirmation_msg = f"**{options[0].rstrip('?')}?**:\n\n" + for idx, option in enumerate(options[1:]): + confirmation_msg += "{} - {}\n".format(emoji[idx], option) + to_react.append(emoji[idx]) + confirmation_msg += "*Sondage proposé par* " + \ + str(ctx.message.author.mention) + if time == 0: + confirmation_msg += "" + else: + confirmation_msg += "\n\nVous avez {} secondes pour voter!". \ + format(time) + poll_msg = await ctx.send(confirmation_msg) + for emote in to_react: + await poll_msg.add_reaction(emote) - if time != 0: - await asyncio.sleep(time) + if time != 0: + await asyncio.sleep(time) - if time != 0: - async for message in ctx.message.channel.history(): - if message.id == poll_msg.id: - poll_msg = message - results = {} - for reaction in poll_msg.reactions: - if reaction.emoji in to_react: - results[reaction.emoji] = reaction.count - 1 - end_msg = "Le sondage est términé. Les résultats sont:\n\n" - for result in results: - end_msg += "{} {} - {} votes\n".\ - format(result, - options[emoji.index(result)+1], - results[result]) - top_result = max(results, key=lambda key: results[key]) - if len([x for x in results - if results[x] == results[top_result]]) > 1: - top_results = [] - for key, value in results.items(): - if value == results[top_result]: - top_results.append(options[emoji.index(key)+1]) - end_msg += "\nLes gagnants sont : {}".\ - format(", ".join(top_results)) - else: - top_result = options[emoji.index(top_result)+1] - end_msg += "\n\"{}\" est le gagnant!".format(top_result) - await ctx.send(end_msg) - else: - await ctx.message.delete() + if time != 0: + async for message in ctx.message.channel.history(): + if message.id == poll_msg.id: + poll_msg = message + results = {} + for reaction in poll_msg.reactions: + if reaction.emoji in to_react: + results[reaction.emoji] = reaction.count - 1 + end_msg = "Le sondage est términé. Les résultats sont:\n\n" + for result in results: + end_msg += "{} {} - {} votes\n". \ + format(result, + options[emoji.index(result)+1], + results[result]) + top_result = max(results, key=lambda key: results[key]) + if len([x for x in results + if results[x] == results[top_result]]) > 1: + top_results = [] + for key, value in results.items(): + if value == results[top_result]: + top_results.append(options[emoji.index(key)+1]) + end_msg += "\nLes gagnants sont : {}". \ + format(", ".join(top_results)) + else: + top_result = options[emoji.index(top_result)+1] + end_msg += "\n\"{}\" est le gagnant!".format(top_result) + await ctx.send(end_msg) + else: + await ctx.message.delete() + + text = open('texts/rpoll.md').read() + em = discord.Embed(title='Aide sur le sondage', + description=text, + colour=0xEEEEEE) + await ctx.send(embed=em) - text = open('texts/rpoll.md').read() - em = discord.Embed(title='Aide sur le sondage', - description=text, - colour=0xEEEEEE) - await ctx.send(embed=em) def setup(bot): - bot.add_cog(Sondage(bot)) + bot.add_cog(Sondage(bot)) diff --git a/cogs/utility.py b/cogs/utility.py index c886116..8fe10b6 100755 --- a/cogs/utility.py +++ b/cogs/utility.py @@ -1,284 +1,323 @@ -from discord.ext import commands -import discord -import random +import datetime import json -import datetime, pytz -import calendar - -import requests +import pytz +import random import urllib +import socket + +import discord +import requests +from discord.ext import commands -class Utility: - """Commandes utilitaires.""" +class Utility(commands.Cog): + """Commandes utilitaires.""" - def __init__(self, bot): - self.bot = bot + def __init__(self, bot): + self.bot = bot - @commands.group(name="clock", pass_context=True, case_insensitive=True) - async def clock(self, ctx): - """Display hour in a country""" + @commands.group(name="clock", pass_context=True, case_insensitive=True) + async def clock(self, ctx): + """Display hour in a country""" - if ctx.invoked_subcommand is None: - text = open('texts/clocks.md').read() - em = discord.Embed(title='Liste des Horloges', description=text, colour=0xEEEEEE) - await ctx.send(embed=em) + if ctx.invoked_subcommand is None: + text = open('texts/clocks.md').read() + em = discord.Embed(title='Liste des Horloges', description=text, colour=0xEEEEEE) + await ctx.send(embed=em) - @clock.command(name="montréal", aliases=["mtl", "montreal"], pass_context=True) - async def clock_montreal(self, ctx): - then = datetime.datetime.now(pytz.utc) + @clock.command(name="montréal", aliases=["mtl", "montreal"], pass_context=True) + async def clock_montreal(self, ctx): + then = datetime.datetime.now(pytz.utc) - utc = then.astimezone(pytz.timezone('America/Montreal')) - site = "http://ville.montreal.qc.ca/" - img = "https://upload.wikimedia.org/wikipedia/commons/e/e0/Rentier_fws_1.jpg" - country = "au Canada, Québec" - description = "Montréal est la deuxième ville la plus peuplée du Canada. Elle se situe dans la région du Québec" + utc = then.astimezone(pytz.timezone('America/Montreal')) + site = "http://ville.montreal.qc.ca/" + img = "https://upload.wikimedia.org/wikipedia/commons/e/e0/Rentier_fws_1.jpg" + country = "au Canada, Québec" + description = "Montréal est la deuxième ville la plus peuplée du Canada. Elle se situe dans la région du Québec" - form = '%H heures %M' - tt = utc.strftime(form) + form = '%H heures %M' + tt = utc.strftime(form) - em = discord.Embed(title='Heure à Montréal', description=f"A [Montréal]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE) - em.set_thumbnail(url = img) - await ctx.send(embed=em) + em = discord.Embed(title='Heure à Montréal', description=f"A [Montréal]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE) + em.set_thumbnail(url = img) + await ctx.send(embed=em) - @clock.command(name="vancouver", pass_context=True) - async def clock_vancouver(self, ctx): - then = datetime.datetime.now(pytz.utc) + @clock.command(name="vancouver", pass_context=True) + async def clock_vancouver(self, ctx): + then = datetime.datetime.now(pytz.utc) - utc = then.astimezone(pytz.timezone('America/Vancouver')) - site = "http://vancouver.ca/" - img = "https://upload.wikimedia.org/wikipedia/commons/f/fe/Dock_Vancouver.JPG" - country = "au Canada" - description = "Vancouver, officiellement City of Vancouver, est une cité portuaire au Canada" + utc = then.astimezone(pytz.timezone('America/Vancouver')) + site = "http://vancouver.ca/" + img = "https://upload.wikimedia.org/wikipedia/commons/f/fe/Dock_Vancouver.JPG" + country = "au Canada" + description = "Vancouver, officiellement City of Vancouver, est une cité portuaire au Canada" - form = '%H heures %M' - tt = utc.strftime(form) + form = '%H heures %M' + tt = utc.strftime(form) - em = discord.Embed(title='Heure à Vancouver', description=f"A [Vancouver]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE) - em.set_thumbnail(url = img) - await ctx.send(embed=em) + em = discord.Embed(title='Heure à Vancouver', description=f"A [Vancouver]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE) + em.set_thumbnail(url = img) + await ctx.send(embed=em) - @clock.command(name="new-york",aliases=["ny", "n-y", "new york"], pass_context=True) - async def clock_new_york(self, ctx): - then = datetime.datetime.now(pytz.utc) + @clock.command(name="new-york",aliases=["ny", "n-y", "new york"], pass_context=True) + async def clock_new_york(self, ctx): + then = datetime.datetime.now(pytz.utc) - utc = then.astimezone(pytz.timezone('America/New_York')) - site = "http://www1.nyc.gov/" - img = "https://upload.wikimedia.org/wikipedia/commons/e/e3/NewYork_LibertyStatue.jpg" - country = "aux U.S.A." - description = "New York, est la plus grande ville des États-Unis en termes d'habitants et l'une des plus importantes du continent américain. " + utc = then.astimezone(pytz.timezone('America/New_York')) + site = "http://www1.nyc.gov/" + img = "https://upload.wikimedia.org/wikipedia/commons/e/e3/NewYork_LibertyStatue.jpg" + country = "aux U.S.A." + description = "New York, est la plus grande ville des États-Unis en termes d'habitants et l'une des plus importantes du continent américain. " - form = '%H heures %M' - tt = utc.strftime(form) + form = '%H heures %M' + tt = utc.strftime(form) - em = discord.Embed(title='Heure à New York', description=f"A [str(New York]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE) - em.set_thumbnail(url = img) - await ctx.send(embed=em) - - @clock.command(name="la", aliases=["los-angeles", "losangeles", "l-a", "los angeles"], pass_context=True) - async def clock_la(self, ctx): - then = datetime.datetime.now(pytz.utc) + em = discord.Embed(title='Heure à New York', description=f"A [str(New York]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE) + em.set_thumbnail(url = img) + await ctx.send(embed=em) + + @clock.command(name="la", aliases=["los-angeles", "losangeles", "l-a", "los angeles"], pass_context=True) + async def clock_la(self, ctx): + then = datetime.datetime.now(pytz.utc) - utc = then.astimezone(pytz.timezone('America/Los_Angeles')) - site = "https://www.lacity.org/" - img = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/LA_Skyline_Mountains2.jpg/800px-LA_Skyline_Mountains2.jpg" - country = "aux U.S.A." - description = "Los Angeles est la deuxième ville la plus peuplée des États-Unis après New York. Elle est située dans le sud de l'État de Californie, sur la côte pacifique." + utc = then.astimezone(pytz.timezone('America/Los_Angeles')) + site = "https://www.lacity.org/" + img = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/57/LA_Skyline_Mountains2.jpg/800px-LA_Skyline_Mountains2.jpg" + country = "aux U.S.A." + description = "Los Angeles est la deuxième ville la plus peuplée des États-Unis après New York. Elle est située dans le sud de l'État de Californie, sur la côte pacifique." - form = '%H heures %M' - tt = utc.strftime(form) + form = '%H heures %M' + tt = utc.strftime(form) - em = discord.Embed(title='Heure à Los Angeles', description=f"A [Los Angeles]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE) - em.set_thumbnail(url = img) - await ctx.send(embed=em) - - @clock.command(name="paris", aliases=["baguette"],pass_context=True) - async def clock_paris(self, ctx): - then = datetime.datetime.now(pytz.utc) + em = discord.Embed(title='Heure à Los Angeles', description=f"A [Los Angeles]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE) + em.set_thumbnail(url = img) + await ctx.send(embed=em) + + @clock.command(name="paris", aliases=["baguette"],pass_context=True) + async def clock_paris(self, ctx): + then = datetime.datetime.now(pytz.utc) - utc = then.astimezone(pytz.timezone('Europe/Paris')) - site = "http://www.paris.fr/" - img = "https://upload.wikimedia.org/wikipedia/commons/a/af/Tour_eiffel_at_sunrise_from_the_trocadero.jpg" - country = "en France" - description = "Paris est la capitale de la France. Elle se situe au cœur d'un vaste bassin sédimentaire aux sols fertiles et au climat tempéré, le bassin parisien." + utc = then.astimezone(pytz.timezone('Europe/Paris')) + site = "http://www.paris.fr/" + img = "https://upload.wikimedia.org/wikipedia/commons/a/af/Tour_eiffel_at_sunrise_from_the_trocadero.jpg" + country = "en France" + description = "Paris est la capitale de la France. Elle se situe au cœur d'un vaste bassin sédimentaire aux sols fertiles et au climat tempéré, le bassin parisien." - form = '%H heures %M' - tt = utc.strftime(form) + form = '%H heures %M' + tt = utc.strftime(form) - em = discord.Embed(title='Heure à Paris', description=f"A [Paris]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE) - em.set_thumbnail(url = img) - await ctx.send(embed=em) - - @clock.command(name="berlin", pass_context=True) - async def clock_berlin(self, ctx): - then = datetime.datetime.now(pytz.utc) + em = discord.Embed(title='Heure à Paris', description=f"A [Paris]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE) + em.set_thumbnail(url = img) + await ctx.send(embed=em) + + @clock.command(name="berlin", pass_context=True) + async def clock_berlin(self, ctx): + then = datetime.datetime.now(pytz.utc) - utc = then.astimezone(pytz.timezone('Europe/Berlin')) - site = "http://www.berlin.de/" - img = "https://upload.wikimedia.org/wikipedia/commons/9/91/Eduard_Gaertner_Schlossfreiheit.jpg" - country = "en Allemagne" - description = "Berlin est la capitale et la plus grande ville d'Allemagne. Située dans le nord-est du pays, elle compte environ 3,5 millions d'habitants. " + utc = then.astimezone(pytz.timezone('Europe/Berlin')) + site = "http://www.berlin.de/" + img = "https://upload.wikimedia.org/wikipedia/commons/9/91/Eduard_Gaertner_Schlossfreiheit.jpg" + country = "en Allemagne" + description = "Berlin est la capitale et la plus grande ville d'Allemagne. Située dans le nord-est du pays, elle compte environ 3,5 millions d'habitants. " - form = '%H heures %M' - tt = utc.strftime(form) + form = '%H heures %M' + tt = utc.strftime(form) - em = discord.Embed(title='Heure à Berlin', description=f"A [Berlin]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE) - em.set_thumbnail(url = img) - await ctx.send(embed=em) - - @clock.command(name="berne", aliases=["zurich", "bern"], pass_context=True) - async def clock_berne(self, ctx): - then = datetime.datetime.now(pytz.utc) + em = discord.Embed(title='Heure à Berlin', description=f"A [Berlin]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE) + em.set_thumbnail(url = img) + await ctx.send(embed=em) + + @clock.command(name="berne", aliases=["zurich", "bern"], pass_context=True) + async def clock_berne(self, ctx): + then = datetime.datetime.now(pytz.utc) - utc = then.astimezone(pytz.timezone('Europe/Zurich')) - site = "http://www.berne.ch/" - img = "https://upload.wikimedia.org/wikipedia/commons/d/db/Justitia_Statue_02.jpg" - country = "en Suisse" - description = "Berne est la cinquième plus grande ville de Suisse et la capitale du canton homonyme. Depuis 1848, Berne est la « ville fédérale »." + utc = then.astimezone(pytz.timezone('Europe/Zurich')) + site = "http://www.berne.ch/" + img = "https://upload.wikimedia.org/wikipedia/commons/d/db/Justitia_Statue_02.jpg" + country = "en Suisse" + description = "Berne est la cinquième plus grande ville de Suisse et la capitale du canton homonyme. Depuis 1848, Berne est la « ville fédérale »." - form = '%H heures %M' - tt = utc.strftime(form) + form = '%H heures %M' + tt = utc.strftime(form) - em = discord.Embed(title='Heure à Berne', description=f"A [Berne]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE) - em.set_thumbnail(url = img) - await ctx.send(embed=em) - - @clock.command(name="tokyo", pass_context=True) - async def clock_tokyo(self, ctx): - then = datetime.datetime.now(pytz.utc) + em = discord.Embed(title='Heure à Berne', description=f"A [Berne]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE) + em.set_thumbnail(url = img) + await ctx.send(embed=em) + + @clock.command(name="tokyo", pass_context=True) + async def clock_tokyo(self, ctx): + then = datetime.datetime.now(pytz.utc) - utc = then.astimezone(pytz.timezone('Asia/Tokyo')) - site = "http://www.gotokyo.org/" - img = "https://upload.wikimedia.org/wikipedia/commons/3/37/TaroTokyo20110213-TokyoTower-01.jpg" - country = "au Japon" - description = "Tokyo, anciennement Edo, officiellement la préfecture métropolitaine de Tokyo, est la capitale du Japon." + utc = then.astimezone(pytz.timezone('Asia/Tokyo')) + site = "http://www.gotokyo.org/" + img = "https://upload.wikimedia.org/wikipedia/commons/3/37/TaroTokyo20110213-TokyoTower-01.jpg" + country = "au Japon" + description = "Tokyo, anciennement Edo, officiellement la préfecture métropolitaine de Tokyo, est la capitale du Japon." - form = '%H heures %M' - tt = utc.strftime(form) + form = '%H heures %M' + tt = utc.strftime(form) - em = discord.Embed(title='Heure à Tokyo', description=f"A [Tokyo]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE) - em.set_thumbnail(url = img) - await ctx.send(embed=em) - - @clock.command(name="moscou", aliases=["moscow", "moskova"], pass_context=True) - async def clock_moscou(self, ctx): - then = datetime.datetime.now(pytz.utc) + em = discord.Embed(title='Heure à Tokyo', description=f"A [Tokyo]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE) + em.set_thumbnail(url = img) + await ctx.send(embed=em) + + @clock.command(name="moscou", aliases=["moscow", "moskova"], pass_context=True) + async def clock_moscou(self, ctx): + then = datetime.datetime.now(pytz.utc) - utc = then.astimezone(pytz.timezone('Europe/Moscow')) - site = "https://www.mos.ru/" - img = "https://upload.wikimedia.org/wikipedia/commons/f/f7/Andreyevsky_Zal.jpg" - country = "en Russie" - description = "Moscou est la capitale de la Fédération de Russie et la plus grande ville d'Europe. Moscou est situé sur la rivière Moskova. " + utc = then.astimezone(pytz.timezone('Europe/Moscow')) + site = "https://www.mos.ru/" + img = "https://upload.wikimedia.org/wikipedia/commons/f/f7/Andreyevsky_Zal.jpg" + country = "en Russie" + description = "Moscou est la capitale de la Fédération de Russie et la plus grande ville d'Europe. Moscou est situé sur la rivière Moskova. " - form = '%H heures %M' - tt = utc.strftime(form) + form = '%H heures %M' + tt = utc.strftime(form) - em = discord.Embed(title='Heure à Moscou', description=f"A [Moscou]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE) - em.set_thumbnail(url = img) - await ctx.send(embed=em) - + em = discord.Embed(title='Heure à Moscou', description=f"A [Moscou]({site}) {country}, Il est **{str(tt)}** ! \n {description} \n _source des images et du texte : [Wikimedia foundation](http://commons.wikimedia.org/)_", colour=0xEEEEEE) + em.set_thumbnail(url = img) + await ctx.send(embed=em) + - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @commands.command() - async def ytdiscover(self, ctx): - """Random youtube channel""" - with open('texts/ytb.json') as js: - ytb = json.load(js) + @commands.command() + async def ytdiscover(self, ctx): + """Random youtube channel""" + with open('texts/ytb.json') as js: + ytb = json.load(js) - clef = str(random.randint(0,12)) - chaine = ytb["{}".format(clef)] + clef = str(random.randint(0,12)) + chaine = ytb["{}".format(clef)] - embed = discord.Embed(title=chaine['name'], - url=chaine['url'], - description=f"**{chaine['name']}**, {chaine['desc']} \n[Je veux voir ça]({chaine['url']})") - embed.set_thumbnail(url='https://outout.tech/tuxbot/yt.png') - await ctx.send(embed=embed) + embed = discord.Embed(title=chaine['name'], + url=chaine['url'], + description=f"**{chaine['name']}**, {chaine['desc']} \n[Je veux voir ça]({chaine['url']})") + embed.set_thumbnail(url='https://outout.tech/tuxbot/yt.png') + await ctx.send(embed=embed) - """--------------------------------------------------------------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @commands.command(name='hastebin', pass_context=True) - async def _hastebin(self, ctx, *, data): - """Poster sur Hastebin.""" - await ctx.message.delete() + @commands.command(name='hastebin', pass_context=True) + async def _hastebin(self, ctx, *, data): + """Poster sur Hastebin.""" + await ctx.message.delete() - post = requests.post("https://hastebin.com/documents", data=data) + post = requests.post("https://hastebin.com/documents", data=data) - try: - await ctx.send(f"{ctx.message.author.mention} message posté avec succès sur :\nhttps://hastebin.com/{post.json()['key']}.txt") - except json.JSONDecodeError: - await ctx.send("Impossible de poster ce message. L'API doit être HS.") + try: + await ctx.send(f"{ctx.author.mention} message posté avec succès sur :\nhttps://hastebin.com/{post.json()['key']}.txt") + except json.JSONDecodeError: + await ctx.send("Impossible de poster ce message. L'API doit être HS.") - """---------------------------------------------------------------------""" + """---------------------------------------------------------------------""" - @commands.command(name='iplocalise', pass_context=True) - async def _iplocalise(self, ctx, ipaddress): - """Recup headers.""" - if ipaddress.startswith("http://"): - ipaddress = ipaddress.split("http://")[1] - if ipaddress.startswith("https://"): - ipaddress = ipaddress.split("https://")[1] - iploading = await ctx.send("_réfléchis..._") - ipapi = urllib.request.urlopen("http://ip-api.com/json/" + ipaddress) - ipinfo = json.loads(ipapi.read().decode()) + @commands.command(name='iplocalise', pass_context=True) + async def _iplocalise(self, ctx, ipaddress, iptype=""): + realipaddress = ipaddress + """Recup headers.""" + if ipaddress.startswith("http://"): + if ipaddress[-1:] == '/': + ipaddress = ipaddress[:-1] + ipaddress = ipaddress.split("http://")[1] + if ipaddress.startswith("https://"): + if ipaddress[-1:] == '/': + ipaddress = ipaddress[:-1] + ipaddress = ipaddress.split("https://")[1] + + if(iptype=="ipv6" or iptype=="v6"): + try: + ipaddress = socket.getaddrinfo(ipaddress, None, socket.AF_INET6)[1][4][0] + except: + await ctx.send("Erreur, cette adresse n'est pas disponible en IPv6.") + return - if ipinfo["status"] != "fail": - await iploading.edit(content="L'adresse IP ``{query}`` appartient à ``{org}`` et se situe à ``{city}``, dans ``{regionName}``, ``{country}``.".format(**ipinfo)) - else: - await iploading.edit(content=f"Erreur, impossible d'avoir des informations sur l'adresse IP {ipinfo['query']}") + iploading = await ctx.send("_réfléchis..._") + ipapi = urllib.request.urlopen("http://ip-api.com/json/" + ipaddress) + ipinfo = json.loads(ipapi.read().decode()) + + if ipinfo["status"] != "fail": + if ipinfo['query']: + embed = discord.Embed(title=f"Informations pour ``{realipaddress}`` *`({ipinfo['query']})`*", color=0x5858d7) + + if ipinfo['org']: + embed.add_field(name="Appartient à :", value=ipinfo['org'], inline = False) + + if ipinfo['city']: + embed.add_field(name="Se situe à :", value=ipinfo['city'], inline = True) + + + if ipinfo['country']: + if ipinfo['regionName']: + regionName = ipinfo['regionName'] + else: + regionName = "N/A" + embed.add_field(name="Region :", value=f"{regionName} ({ipinfo['country']})", inline = True) + + embed.set_thumbnail(url=f"https://www.countryflags.io/{ipinfo['countryCode']}/flat/64.png") + await ctx.send(embed=embed) + else: + await ctx.send(content=f"Erreur, impossible d'avoir des informations sur l'adresse IP ``{ipinfo['query']}``") + await iploading.delete() + + """---------------------------------------------------------------------""" + @commands.command(name='getheaders', pass_context=True) + async def _getheaders(self, ctx, *, adresse): + """Recuperer les HEADERS :d""" + print("Loaded") + if adresse.startswith("http://") != True and adresse.startswith("https://") != True: + adresse = "http://" + adresse + if len(adresse) > 200: + await ctx.send("{0} Essaye d'entrer une adresse de moins de 200 caractères plutôt.".format(ctx.author.mention)) + elif adresse.startswith("http://") or adresse.startswith("https://") or adresse.startswith("ftp://"): + try: + get = urllib.request.urlopen(adresse, timeout = 1) + embed = discord.Embed(title="Entêtes de {0}".format(adresse), color=0xd75858) + embed.add_field(name="Code Réponse", value=get.getcode(), inline = True) + embed.set_thumbnail(url="https://http.cat/{}".format(str(get.getcode()))) + if get.getheader('location'): + embed.add_field(name="Redirection vers", value=get.getheader('location'), inline=True) + if get.getheader('server'): + embed.add_field(name="Serveur", value=get.getheader('server'), inline=True) + if get.getheader('content-type'): + embed.add_field(name="Type de contenu", value = get.getheader('content-type'), inline = True) + if get.getheader('x-content-type-options'): + embed.add_field(name="x-content-type", value= get.getheader('x-content-type-options'), inline=True) + if get.getheader('x-frame-options'): + embed.add_field(name="x-frame-options", value= get.getheader('x-frame-options'), inline=True) + if get.getheader('cache-control'): + embed.add_field(name="Controle du cache", value = get.getheader('cache-control'), inline = True) + await ctx.send(embed=embed) + except urllib.error.HTTPError as e: + embed = discord.Embed(title="Entêtes de {0}".format(adresse), color=0xd75858) + embed.add_field(name="Code Réponse", value=e.getcode(), inline = True) + embed.set_thumbnail(url="https://http.cat/{}".format(str(e.getcode()))) + await ctx.send(embed=embed) + print('''An error occurred: {} The response code was {}'''.format(e, e.getcode())) + except urllib.error.URLError as e: + print("ERROR @ getheaders @ urlerror : {} - adress {}".format(e, adresse)) + await ctx.send('[CONTACTER ADMIN] URLError: {}'.format(e.reason)) + except Exception as e: + print("ERROR @ getheaders @ Exception : {} - adress {}".format(e, adresse)) + await ctx.send("{0} Impossible d'accèder à {1}, es-tu sur que l'adresse {1} est correcte et que le serveur est allumé ?".format(ctx.author.mention, adresse)) + else: + await ctx.send("{0} Merci de faire commencer {1} par ``https://``, ``http://`` ou ``ftp://``.".format(ctx.author.mention, adresse)) + + """---------------------------------------------------------------------""" + + @commands.command(name='git', pass_context=True) + async def _git(self, ctx): + """Pour voir mon code""" + text = "How tu veux voir mon repos Gitea pour me disséquer ? " \ + "Pas de soucis ! Je suis un Bot, je ne ressens pas la " \ + "douleur !\n https://git.gnous.eu/gnous/tuxbot" + em = discord.Embed(title='Repos TuxBot-Bot', description=text, colour=0xE9D460) + em.set_author(name='Gnous', icon_url="https://cdn.discordapp.com/" + "icons/280805240977227776/" + "9ba1f756c9d9bfcf27989d0d0abb3862" + ".png") + await ctx.send(embed=em) - """--------------------------------------------------------------------------------------------------------------------------""" - @commands.command(name='getheaders', pass_context=True) - async def _getheaders(self, ctx, *, adresse): - """Recuperer les HEADERS :d""" - print("Loaded") - if adresse.startswith("http://") != True and adresse.startswith("https://") != True: - adresse = "http://" + adresse - if len(adresse) > 200: - await ctx.send("{0} Essaye d'entrer une adresse de moins de 200 caractères plutôt.".format(ctx.author.mention)) - elif adresse.startswith("http://") or adresse.startswith("https://") or adresse.startswith("ftp://"): - try: - get = urllib.request.urlopen(adresse, timeout = 1) - embed = discord.Embed(title="Entêtes de {0}".format(adresse), color=0xd75858) - embed.add_field(name="Code Réponse", value=get.getcode(), inline = True) - embed.set_thumbnail(url="https://http.cat/{}".format(str(get.getcode()))) - if get.getheader('location'): - embed.add_field(name="Redirection vers", value=get.getheader('location'), inline=True) - if get.getheader('server'): - embed.add_field(name="Serveur", value=get.getheader('server'), inline=True) - if get.getheader('content-type'): - embed.add_field(name="Type de contenu", value = get.getheader('content-type'), inline = True) - if get.getheader('x-content-type-options'): - embed.add_field(name="x-content-type", value= get.getheader('x-content-type-options'), inline=True) - if get.getheader('x-frame-options'): - embed.add_field(name="x-frame-options", value= get.getheader('x-frame-options'), inline=True) - if get.getheader('cache-control'): - embed.add_field(name="Controle du cache", value = get.getheader('cache-control'), inline = True) - await ctx.send(embed=embed) - except urllib.error.HTTPError as e: - embed = discord.Embed(title="Entêtes de {0}".format(adresse), color=0xd75858) - embed.add_field(name="Code Réponse", value=e.getcode(), inline = True) - embed.set_thumbnail(url="https://http.cat/{}".format(str(e.getcode()))) - await ctx.send(embed=embed) - print('''An error occurred: {} The response code was {}'''.format(e, e.getcode())) - except urllib.error.URLError as e: - print("ERROR @ getheaders @ urlerror : {} - adress {}".format(e, adresse)) - await ctx.send('[CONTACTER ADMIN] URLError: {}'.format(e.reason)) - except Exception as e: - print("ERROR @ getheaders @ Exception : {} - adress {}".format(e, adresse)) - await ctx.send("{0} Impossible d'accèder à {1}, es-tu sur que l'adresse {1} est correcte et que le serveur est allumé ?".format(ctx.author.mention, adresse)) - else: - await ctx.send("{0} Merci de faire commencer {1} par ``https://``, ``http://`` ou ``ftp://``.".format(ctx.message.author.mention, adresse)) - - """--------------------------------------------------------------------------------------------------------------------------""" - - @commands.command(name='github', pass_context=True) - async def _github(ctx): - """Pour voir mon code""" - text = "How tu veux voir mon repos Github pour me disséquer ? Pas de soucis ! Je suis un Bot, je ne ressens pas la douleur !\n https://github.com/outout14/tuxbot-bot" - em = discord.Embed(title='Repos TuxBot-Bot', description=text, colour=0xE9D460) - em.set_author(name='Outout', icon_url="https://avatars0.githubusercontent.com/u/14958554?v=3&s=400") - await ctx.send(embed=em) def setup(bot): - bot.add_cog(Utility(bot)) + bot.add_cog(Utility(bot)) diff --git a/cogs/utils/cli_colors.py b/cogs/utils/cli_colors.py old mode 100644 new mode 100755 diff --git a/cogs/utils/config.py b/cogs/utils/config.py deleted file mode 100755 index 1e9f51f..0000000 --- a/cogs/utils/config.py +++ /dev/null @@ -1,67 +0,0 @@ -import json -import os -import uuid -import asyncio - -class Config: - """The "database" object. Internally based on ``json``.""" - - def __init__(self, name, **options): - self.name = name - self.object_hook = options.pop('object_hook', None) - self.encoder = options.pop('encoder', None) - self.loop = options.pop('loop', asyncio.get_event_loop()) - self.lock = asyncio.Lock() - if options.pop('load_later', False): - self.loop.create_task(self.load()) - else: - self.load_from_file() - - def load_from_file(self): - try: - with open(self.name, 'r') as f: - self._db = json.load(f, object_hook=self.object_hook) - except FileNotFoundError: - self._db = {} - - async def load(self): - with await self.lock: - await self.loop.run_in_executor(None, self.load_from_file) - - def _dump(self): - temp = '%s-%s.tmp' % (uuid.uuid4(), self.name) - with open(temp, 'w', encoding='utf-8') as tmp: - json.dump(self._db.copy(), tmp, ensure_ascii=True, cls=self.encoder, separators=(',', ':')) - - # atomically move the file - os.replace(temp, self.name) - - async def save(self): - with await self.lock: - await self.loop.run_in_executor(None, self._dump) - - def get(self, key, *args): - """Retrieves a config entry.""" - return self._db.get(key, *args) - - async def put(self, key, value, *args): - """Edits a config entry.""" - self._db[key] = value - await self.save() - - async def remove(self, key): - """Removes a config entry.""" - del self._db[key] - await self.save() - - def __contains__(self, item): - return item in self._db - - def __getitem__(self, item): - return self._db[item] - - def __len__(self): - return len(self._db) - - def all(self): - return self._db diff --git a/cogs/utils/db.py b/cogs/utils/db.py index a5431f4..502d11a 100755 --- a/cogs/utils/db.py +++ b/cogs/utils/db.py @@ -1,24 +1,29 @@ import pymysql -def connect_to_db(self): - mysqlHost = self.bot.config.mysql["host"] - mysqlUser = self.bot.config.mysql["username"] - mysqlPass = self.bot.config.mysql["password"] - mysqlDB = self.bot.config.mysql["dbname"] - try: - return pymysql.connect(host=mysqlHost, user=mysqlUser, passwd=mysqlPass, db=mysqlDB, charset='utf8') - except KeyError: - print("Rest in peperoni, Impossible de se connecter a la base de données.") - print(str(KeyError)) - return +def connect_to_db(self): + mysqlHost = self.bot.config.mysql["host"] + mysqlUser = self.bot.config.mysql["username"] + mysqlPass = self.bot.config.mysql["password"] + mysqlDB = self.bot.config.mysql["dbname"] + + try: + return pymysql.connect(host=mysqlHost, user=mysqlUser, + passwd=mysqlPass, db=mysqlDB, charset='utf8') + except KeyError: + print( + "Rest in peperoni, Impossible de se connecter a la base de données.") + print(str(KeyError)) + return + def reconnect_to_db(self): - if not self.conn: - mysqlHost = self.bot.config.mysql["host"] - mysqlUser = self.bot.config.mysql["username"] - mysqlPass = self.bot.config.mysql["password"] - mysqlDB = self.bot.config.mysql["dbname"] + if not self.conn: + mysqlHost = self.bot.config.mysql["host"] + mysqlUser = self.bot.config.mysql["username"] + mysqlPass = self.bot.config.mysql["password"] + mysqlDB = self.bot.config.mysql["dbname"] - return pymysql.connect(host=mysqlHost, user=mysqlUser, passwd=mysqlPass, db=mysqlDB, charset='utf8') - return self.conn \ No newline at end of file + return pymysql.connect(host=mysqlHost, user=mysqlUser, + passwd=mysqlPass, db=mysqlDB, charset='utf8') + return self.conn diff --git a/cogs/utils/menu.py b/cogs/utils/menu.py old mode 100644 new mode 100755 diff --git a/cogs/utils/passport_generator.py b/cogs/utils/passport_generator.py old mode 100644 new mode 100755 diff --git a/cogs/vocal.py b/cogs/vocal.py new file mode 100755 index 0000000..fc21169 --- /dev/null +++ b/cogs/vocal.py @@ -0,0 +1,113 @@ +import asyncio +import os +import re +import subprocess +import uuid + +import discord +from discord.ext import commands +from gtts import gTTS + + +class Vocal(commands.Cog): + + def __init__(self, bot): + self.bot = bot + self.playing = False + self.author = None + self.voice = None + + """---------------------------------------------------------------------""" + + @staticmethod + def get_duration(file): + popen = subprocess.Popen(("ffprobe", + "-show_entries", + "format=duration", + "-i", file), + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + output, err = popen.communicate() + match = re.search(r"[-+]?\d*\.\d+|\d+", str(output)) + return float(match.group()) + + @commands.command(name="voc", no_pm=True, pass_context=True) + async def _voc(self, ctx, *, message=""): + if message == "": + await ctx.send("Veuillez écrire un message...") + return + if message == "stop_playing" \ + and ( + ctx.author.id == self.author.id + or ctx.message.channel.permissions_for( + ctx.message.author + ).administrator is True + ) \ + and self.playing is True: + + await ctx.send('stop') + await self.voice.disconnect() + self.playing = False + return + + if self.playing is True: + await ctx.send("Je suis déja en train de parler," + " merci de réenvoyer ton message" + " quand j'aurais fini.") + return + + user = ctx.author + self.author = user + + if user.voice: + self.playing = True + filename = f"data/tmp/voc/{uuid.uuid1()}.mp3" + lang = [x for x in message.split(" ") if x.startswith("lang=")] + + loading = await ctx.send("*Chargement du message en cours...*") + + if lang: + choice_lang = (lang[0])[5:] + message = f"{user.display_name} à dit: {message.strip(lang[0])}" if len(ctx.author.voice.channel.members) >= 4 else message.strip(lang[0]) + + try: + tts = gTTS( + text=message, + lang=str(choice_lang)) + except ValueError: + tts = gTTS( + text=message, + lang="fr") + await ctx.send("La langue n'est pas supportée," + " le francais a donc été choisi") + else: + message = f"{user.display_name} à dit: {message}" if len(ctx.author.voice.channel.members) >= 4 else message + tts = gTTS(text=message, + lang="fr") + + tts.save(filename) + + self.voice = await user.voice.channel.connect() + self.voice.play(discord.FFmpegPCMAudio(filename)) + counter = 0 + duration = self.get_duration(filename) + while not counter >= duration: + if self.playing: + await loading.edit( + content=f"Lecture du message de {self.author.display_name} en cours : {counter}sec/{duration}sec") + await asyncio.sleep(1) + counter += 1 + else: + break + await self.voice.disconnect() + + await loading.edit(content="Lecture terminée") + self.voice = None + os.remove(filename) + self.playing = False + else: + await ctx.send('Veuillez aller dans un channel vocal.') + + +def setup(bot): + bot.add_cog(Vocal(bot)) diff --git a/config.py.example b/config.py.example old mode 100755 new mode 100644 diff --git a/data/.DS_Store b/data/.DS_Store old mode 100644 new mode 100755 diff --git a/data/images/.DS_Store b/data/images/.DS_Store old mode 100644 new mode 100755 diff --git a/data/images/roles/android.png b/data/images/roles/android.png old mode 100644 new mode 100755 diff --git a/data/images/roles/redhat.png b/data/images/roles/redhat.png new file mode 100755 index 0000000..c4ce3af Binary files /dev/null and b/data/images/roles/redhat.png differ diff --git a/data/images/roles/small/android.png b/data/images/roles/small/android.png old mode 100644 new mode 100755 diff --git a/init.sh b/init.sh new file mode 100755 index 0000000..a7dbd9b --- /dev/null +++ b/init.sh @@ -0,0 +1,3 @@ +#pip install -U "https://github.com/Rapptz/discord.py/archive/rewrite.zip#egg=discord.py[voice]" +python3 -m pip install -U discord.py[voice] +pip install -r requirements.txt diff --git a/launch.py b/launch.py deleted file mode 100644 index 1d94f5a..0000000 --- a/launch.py +++ /dev/null @@ -1,43 +0,0 @@ -#! /usr/bin/env python3 - -import locale -from dialog import Dialog -from subprocess import call -import os - -locale.setlocale(locale.LC_ALL, '') -d = Dialog(dialog="dialog") -d.set_background_title("Tuxbot Manager v0.5a") - -while True: - - mmenu, rmenu = d.menu("Que souhaitez vous faire ?", choices = [("(1)", "Lancer Tuxbot"), ("(2)", "Eteindre Tuxbot"), ("(3)", "Mettre à jour Tuxbot"), ("(4)", "Quitter")]) - - if rmenu == "(1)": - d.gauge_start("Lancement") - d.gauge_update(10) -# try: -# call(["screen", "-S", "tuxbot", "-X","quit"]) -# except: -# d.gauge_update(35) - d.gauge_update(40) - call(["screen","-S","tuxbot", "-d", "-m", "python3", "bot.py"]) - d.gauge_update(100) - d.gauge_stop() - d.msgbox("Tuxbot est correctement lancé ! Merci de faire .ping sur discord pour vérifier.") - - if rmenu == "(2)": - d.gauge_start("Arrêt") - d.gauge_update(10) - call(["screen", "-S", "tuxbot", "-X","quit"]) - d.gauge_update(100) - d.gauge_stop() - d.msgbox("Tuxbot s'est correctement arrêté. Faites vite ;-) !") - - if rmenu == "(4)": - d.pause("A bientôt !\n(C) 2018 Gnous.EU Dev Team.", seconds=2) - call(["clear"]) - exit() - - if rmenu == "(3)": - d.msgbox("Fonctionnalité indisponible pour le moment du fait que le serveur GIT de tuxbot est hors service.") diff --git a/params.json b/params.json deleted file mode 100755 index d6e0599..0000000 --- a/params.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "token": "bot token", - "bots_key": "not required", - "client_id": "client id (Pas obligatoire)", - "game": "Eating apples - .help", - "prefix": [ - "." - ] -} diff --git a/readme.md b/readme.md index babe253..908be65 100755 --- a/readme.md +++ b/readme.md @@ -6,7 +6,7 @@ Ici ce trouve le code source du bot provenant du serveur Discord ["Gnous.eu"](h [Voir le guide d'installation](https://wiki.gnous.eu/wiki/Tuxbot/Install) ## Fabriqué avec -* [PyCharm](https://www.jetbrains.com/pycharm/) - Editeur de texte payant :3 +* [PyCharm](https://www.jetbrains.com/pycharm/) - IDE payant :3 * [discord.py](https://github.com/Rapptz/discord.py) - API Python pour discord ## Versions @@ -14,7 +14,7 @@ Liste des versions : [Cliquer pour afficher](https://github.com/outout14/tuxbot- ## Auteurs * **Maël** _alias_ [@outout14](https://github.com/outout14) -* **Romain** _alias_ [Romain](https://github.com/Rom194) +* **Romain** _alias_ [Romain](https://git.gnous.eu/Romain) ## License Ce projet est sous licence ``Creative Commons BY-NC-SA 4.0`` - voir le fichier [LICENSE.md](LICENSE.md) pour plus d'informations diff --git a/requirements.txt b/requirements.txt index fb72858..d55b962 100755 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,9 @@ -git+https://github.com/Rapptz/discord.py@rewrite -asyncio +pymysql +gtts beautifulsoup4 +lxml==4.2.4 bs4 pytz requests wikipedia -pymysql pillow \ No newline at end of file diff --git a/texts/help.md b/texts/help.md index c991137..ec6a86a 100755 --- a/texts/help.md +++ b/texts/help.md @@ -11,16 +11,17 @@ -> .sondage : Affiche l'aide pour la commande sondage -> .role _nomdurole_ : Ajoute/Retire le rôle en question -> .iplocalise _IP ou NDD_ : affiche la localisation et le propriétaire de l'ip (ou de l'IP lié a un nom de domaine) +-> .iplocalise _IP ou NDD_ **ipv6**: affiche la localisation et le propriétaire de l'ip en forçant sur l'IPv6 (ou de l'IP lié a un nom de domaine) -> .getheaders _IP ou NDD_ : affiche les en-têtes (headers) d'une IP/Nom de domaine via HTTP/HTTPS/FTP -> .btcprice : Affiche le prix du bitcoin - +[split] **Commandes Funs** -> .joke : Affiche une blague aléatoire -> .ethylotest : Simule un ethylotest détraqué -> .pokemon : Lance un combat de pokémons -> .coin : Simule un pile ou face -> .randomcat : Affiche des image de chats :3 - +[split] **Commandes Carte d'Identité** -> .ci : Affiche l'aide sur les cartes d'identité -> .ci show _pseudo_ : Affiche la carte d'identité de _pseudo_ @@ -30,10 +31,10 @@ -> .ci setcountry : Défini votre pays -> .ci update : Met à jour votre image si vous l'avez changé :wink: -> .ci delete : Supprime votre carte d'identité **a tous jamais** - +[split] **Commandes diverses** : -> .info : Affiche des informations sur le bot -> .help : Affiche ce message -> .clock : Affiche la liste des horloges des villes -> .ping : Ping le bot --> .github : Affiche le repos Github du Bot :heart: +-> .git : Affiche le repos Gitea du Bot :heart: diff --git a/texts/info.md b/texts/info.md index 17aefbf..58104cd 100755 --- a/texts/info.md +++ b/texts/info.md @@ -1,24 +1,24 @@ -<:stafftools:314348604095594498> **Développement** : +:tools: **Développement** : └> Outout : [outout.xyz](https://outout.xyz/) - └> Romain : [son github](http://git.dyjix.eu/Romain) + └> Romain : [son github](http://git.gnous.eu/Romain) └> Langage : [Python3](http://www.python.org/) └> Api : [discord.py {3}](https://github.com/Rapptz/discord.py) + └> Discord Api : [{4}]({4}) └> En se basant sur : [RobotDanny](https://github.com/Rapptz/RoboDanny) -<:server:334347432835940352> **Hébergé sur "{2}"**: +<:server:577916597239283742> **Hébergé sur "{2}"**: └> <:tux:282212977627758593> OS : {0} - └> <:python:334346615366221825> Version : {1} + └> Version : {1} -<:contact:334347787200233483> **Contact** : - └> <:discord:314003252830011395> : Outout#8406 - └> <:twitter:314349922877046786> : [@outoutxyz](https://twitter.com/outouxyz) - └> <:mail:334345653419245571> : [mael@gnous.eu](mailto:mael@gnous.eu) - └> <:discord:314003252830011395> : Romain#5117 +:telephone: **Contact** : + └> <:DiscordLogoColor:577915413573402624> : Outout#8406 + └> <:twitter:577915119032336387> : [@outoutxyz](https://twitter.com/outouxyz) + └> :mailbox: : [mael@gnous.eu](mailto:mael@gnous.eu) + └> <:DiscordLogoColor:577915413573402624> : Romain#5117 -<:discord:314003252830011395> **Serveurs** : - └> :tux: Serveur de TuxBot : [rejoindre](https://discord.gg/5UZy8Pn) - └> <:tux:514930485751971866> Serveur GNU/Linux-Fr : [rejoindre](https://discord.gg/B5TzW7x) +<:DiscordLogoColor:577915413573402624> **Serveur** : + └> Serveur GnousEU : [rejoindre](https://discord.gg/NFW3EeS) diff --git a/texts/rpoll.md b/texts/rpoll.md old mode 100644 new mode 100755