diff --git a/bot.py b/bot.py index 6771a9c..0a179a4 100755 --- a/bot.py +++ b/bot.py @@ -22,7 +22,6 @@ log = logging.getLogger(__name__) l_extensions = ( 'cogs.admin', - 'cogs.bascics', 'jishaku', ) diff --git a/cogs/admin.py b/cogs/admin.py old mode 100755 new mode 100644 index c5586f6..55052b1 --- a/cogs/admin.py +++ b/cogs/admin.py @@ -1,407 +1,26 @@ -import aiohttp from discord.ext import commands -import discord -from .utils import checks - -from .utils.checks import get_user +from bot import TuxBot class Admin(commands.Cog): - """Commandes secrètes d'administration.""" - def __init__(self, bot): + def __init__(self, bot: TuxBot): self.bot = bot - self._last_result = None - self.sessions = set() + + async def cog_check(self, ctx: commands.Context): + permissions = ctx.channel.permissions_for(ctx.author) + return permissions.administrator """---------------------------------------------------------------------""" - @checks.has_permissions(administrator=True) - @commands.command(name="upload", pass_context=True) - async def _upload(self, ctx, *, url=""): - if len(ctx.message.attachments) >= 1: - file = ctx.message.attachments[0].url - elif url != "": - file = url - else: - em = discord.Embed(title='Une erreur est survenue', - description="Fichier introuvable.", - colour=0xDC3546) - await ctx.send(embed=em) - return - - async with aiohttp.ClientSession() as session: - async with session.get(file) as r: - image = await r.content.read() - - with open(f"data/tmp/{str(ctx.author.id)}.png", 'wb') as f: - f.write(image) - f.close() - await ctx.send(file=discord.File(f"data/tmp/{str(ctx.author.id)}.png")) - - @checks.has_permissions(administrator=True) - @commands.command(name="ban", pass_context=True) - async def _ban(self, ctx, user, *, reason=""): - """Ban user""" - user = get_user(ctx.message, user) - if user and str(user.id) not in self.bot.config.unkickable_id: - 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(name="kick", pass_context=True) - async def _kick(self, ctx, user, *, reason=""): - """Kick a user""" - user = get_user(ctx.message, user) - if user and str(user.id) not in self.bot.config.unkickable_id: - 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 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 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, 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, 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, message_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.fetch_message(message_id) - except discord.errors.NotFound: - await ctx.send(f"Impossible de trouver le message avec l'id " - f"`{message_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, message_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.fetch_message(message_id) - except discord.errors.NotFound: - await ctx.send(f"Impossible de trouver le message avec l'id " - f"`{message_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, message_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.fetch_message(message_id) - except discord.errors.NotFound: - await ctx.send(f"Impossible de trouver le message avec l'id " - f"`{message_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: int): - """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.fetch_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() - - 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 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 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 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") - - await ctx.send(embed=embed) + async def _say(self, ctx: commands.Context, *, to_say: str): + # try: + await ctx.message.delete() + await ctx.send(to_say) + # except: + # await ctx.send(to_say) -def setup(bot): +def setup(bot: TuxBot): bot.add_cog(Admin(bot)) diff --git a/cogs/afk.py b/cogs/afk.py deleted file mode 100755 index d53d35f..0000000 --- a/cogs/afk.py +++ /dev/null @@ -1,68 +0,0 @@ -from discord.ext import commands -import discord -import random - - -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, action: str = ""): - - 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"] - - 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 - - user = message.author - - 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", - "a fini de faire caca", - "a fini d'uriner", - "n'est plus mort", - "est de nouveau sur son PC", - "a fini de manger sa poutine", - "a fini de danser", - "s'est réveillé", - "est de retour dans ce monde cruel"] - - await message.channel.send(f"**{user.mention}**" - f" {random.choice(msgs)}...") - - -def setup(bot): - bot.add_cog(AFK(bot)) diff --git a/cogs/atc.py b/cogs/atc.py deleted file mode 100755 index ea50ed3..0000000 --- a/cogs/atc.py +++ /dev/null @@ -1,124 +0,0 @@ -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 deleted file mode 100755 index 51b6d92..0000000 --- a/cogs/basics.py +++ /dev/null @@ -1,51 +0,0 @@ -import platform -import socket - -import discord -from discord.ext import commands -from discord.http import Route - - -class Basics(commands.Cog): - """Commandes générales.""" - - def __init__(self, bot: discord.ext.commands.AutoShardedBot): - self.bot = bot - - @commands.command() - async def ping(self, ctx: discord.ext.commands.context.Context): - delta = await ctx.send(self.bot.latency * 1000) - await ctx.send((delta.created_at-ctx.message.created_at) - .microseconds/1000) - - """---------------------------------------------------------------------""" - - @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().split("[split]") - for txt in text: - em = discord.Embed(title='Commandes de TuxBot', description=txt, - colour=0x89C4F9) - await ctx.send(embed=em) - - -def setup(bot): - bot.add_cog(Basics(bot)) diff --git a/cogs/ci.py b/cogs/ci.py deleted file mode 100755 index 17a14d1..0000000 --- a/cogs/ci.py +++ /dev/null @@ -1,311 +0,0 @@ -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 - - -class Identity(commands.Cog): - """Commandes des cartes d'identité .""" - - def __init__(self, bot): - self.bot = bot - - self.conn = db.connect_to_db(self) - self.cursor = self.conn.cursor() - - self.cursor.execute("""SHOW TABLES LIKE '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) - - """--------------------------------------------------------------------------------------------------------------------------""" - - @_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) - - 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() - - def isexist(var): - if not var: - return "Non renseigné." - else: - return var - - 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)) - - formated_user_birth = str(user_birth_day) + "/" + str(user_birth_month) + "/" + str(user_birth.year) - - 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_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 - - 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.') - - """--------------------------------------------------------------------------------------------------------------------------""" - - @_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() - - self.cursor.execute("""SELECT id, userid FROM users WHERE userid=%s""", (str(ctx.author.id))) - result = self.cursor.fetchone() - - if result: - await ctx.send("Mais tu as déja une carte d'identité ! u_u") - else: - now = datetime.datetime.now() - - 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 !") - - """--------------------------------------------------------------------------------------------------------------------------""" - - @_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("""SELECT id, userid FROM users WHERE userid=%s""", (str(ctx.author.id))) - result = self.cursor.fetchone() - - 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...)") - - """--------------------------------------------------------------------------------------------------------------------------""" - - @_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() - - try: - self.cursor.execute("""SELECT id, userid FROM users WHERE userid=%s""", (str(ctx.author.id))) - result = self.cursor.fetchone() - - if result: - self.cursor.execute("""SELECT cidate FROM users WHERE userid=%s""",(str(ctx.author.id))) - old_ci_date = 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') - - old_ci_date_day = check_date(str(old_ci_date.day)) - old_ci_date_month = check_date(str(old_ci_date.month)) - - new_ci_date = f"{str(old_ci_date.year)}-{str(old_ci_date_month)}-{str(old_ci_date_day)} 00:00:00.000000" - - await ctx.send("succes update") - - self.cursor.execute("""UPDATE users SET cidate = %s WHERE userid = %s""", (str(new_ci_date), str(ctx.author.id))) - self.conn.commit() - - 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 !") - - 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}') - - """--------------------------------------------------------------------------------------------------------------------------""" - - @_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 conf: - self.cursor.execute("""SELECT id, userid FROM users WHERE userid=%s""", (str(ctx.author.id))) - result = self.cursor.fetchone() - - 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 !") - - """--------------------------------------------------------------------------------------------------------------------------""" - - @_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 conf: - self.cursor.execute("""SELECT id, userid FROM users WHERE userid=%s""", (str(ctx.author.id))) - result = self.cursor.fetchone() - - 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 !") - - """--------------------------------------------------------------------------------------------------------------------------""" - - @_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 country: - self.cursor.execute("""SELECT id, userid FROM users WHERE userid=%s""", (str(ctx.author.id))) - result = self.cursor.fetchone() - - 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 !") - - """--------------------------------------------------------------------------------------------------------------------------""" - - @_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() - - self.cursor.execute("""SELECT id FROM users WHERE userid=%s""",(str(ctx.author.id))) - result = self.cursor.fetchone() - - 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...)") - - dm = await ctx.author.create_dm() - - try: - def is_exist(key, value): - self.cursor.execute("""SELECT * FROM sessions WHERE {}=%s""".format(str(key)), (str(value))) - return self.cursor.fetchone() - - 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() - - while is_exist('token', token): - token = ''.join(random.sample('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'*25, 25)) - - 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() - - 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) - - await ctx.send(f"{ctx.author.mention} ta clé d'édition t'a été envoyée en message privé") - - 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") - - """--------------------------------------------------------------------------------------------------------------------------""" - - @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() - - 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") - - 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}') - -def setup(bot): - bot.add_cog(Identity(bot)) diff --git a/cogs/filter_messages.py b/cogs/filter_messages.py deleted file mode 100755 index 396b47c..0000000 --- a/cogs/filter_messages.py +++ /dev/null @@ -1,60 +0,0 @@ -from discord.ext import commands -import re - - -class FilterMessages(commands.Cog): - """Flitre des messages""" - - def __init__(self, bot): - self.bot = bot - - @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 - - 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: - 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): - 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: - 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)) diff --git a/cogs/funs.py b/cogs/funs.py deleted file mode 100755 index 0ebd204..0000000 --- a/cogs/funs.py +++ /dev/null @@ -1,190 +0,0 @@ -from discord.ext import commands -import asyncio -import discord -import urllib.request -import json -import random -import requests - - -class Funs(commands.Cog): - """Commandes funs.""" - - def __init__(self, bot): - self.bot = bot - - """---------------------------------------------------------------------""" - - @commands.command() - async def avatar(self, ctx, user: discord.Member = None): - """Récuperer l'avatar de ...""" - - if user is None: - user = ctx.message.author - - embed = discord.Embed(title="Avatar de " + user.name, - description=f"[Ouvrir dans mon navigateur]" - f"({user.avatar_url_as(format='png')})") - embed.set_image(url=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(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=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 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)] - - 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..._"] - - 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) - - """---------------------------------------------------------------------""" - - @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) - - 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) - - 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 - - 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) - - -def setup(bot): - bot.add_cog(Funs(bot)) diff --git a/cogs/role.py b/cogs/role.py deleted file mode 100755 index c16169e..0000000 --- a/cogs/role.py +++ /dev/null @@ -1,152 +0,0 @@ -from discord.ext import commands -import discord - - -class Role(commands.Cog): - """Commandes role.""" - - def __init__(self, bot): - self.bot = bot - - self.ARCH_ROLE = 393077257826205706 - self.DEBIAN_ROLE = 393077933209550859 - self.RHEL_ROLE = 393078333245751296 - self.ANDROID_ROLE = 393087862972612627 - self.BSD_ROLE = 401791543708745738 - - @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(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(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(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(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(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""" - - 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)) diff --git a/cogs/search.py b/cogs/search.py deleted file mode 100755 index 536413f..0000000 --- a/cogs/search.py +++ /dev/null @@ -1,157 +0,0 @@ -from discord.ext import commands -import discord -import asyncio -import urllib.request -import wikipedia - -wikipedia.set_lang("fr") - - -class Search(commands.Cog): - """Commandes de WWW.""" - - def __init__(self, bot): - self.bot = bot - - @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="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="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) - - @_search.command(pass_context=True, name="wikipedia") - async def search_wikipedia(self, ctx: commands.Context, args): - """Fait une recherche sur wikipd""" - - wait = await ctx.send("_Je cherche..._") - results = wikipedia.search(args) - nbmr = 0 - mmssgg = "" - - for value in results: - nbmr = nbmr + 1 - mmssgg = mmssgg + "**{}**: {} \n".format(str(nbmr), value) - - 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() - - sending = ["1⃣", "2⃣", "3⃣", "4⃣", "5⃣", "6⃣", "7⃣", "8⃣", "9⃣", "🔟"] - - def check(reaction, user): - return user == ctx.author and reaction.emoji in sending and \ - reaction.message.id == msg.id - - async def waiter(future: asyncio.Future): - reaction, user = await self.bot.wait_for('reaction_add', - check=check) - future.set_result(reaction.emoji) - - emoji = asyncio.Future() - self.bot.loop.create_task(waiter(emoji)) - - msg = await ctx.send(embed=em) - for e in sending: - await msg.add_reaction(e) - if emoji.done(): - break - - while not emoji.done(): - await asyncio.sleep(0.1) - - page = int(sending.index(emoji.result())) - - args_ = results[page] - - 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) - - 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)) diff --git a/cogs/send_logs.py b/cogs/send_logs.py deleted file mode 100755 index 46c8952..0000000 --- a/cogs/send_logs.py +++ /dev/null @@ -1,105 +0,0 @@ -import datetime -import socket - -import discord -from discord.ext import commands - - -class SendLogs(commands.Cog): - """Send logs to a specific channel""" - - def __init__(self, bot): - - self.bot = bot - self.log_channel = None - self.main_server_id = int(self.bot.config.main_server_id) - - @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) - - @commands.Cog.listener() - async def on_ready(self): - self.log_channel = await self.bot.fetch_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) - - """---------------------------------------------------------------------""" - - @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) - - @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) - - """---------------------------------------------------------------------""" - - @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) - - @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) - - """---------------------------------------------------------------------""" - - @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 :" - 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) - - -def setup(bot): - bot.add_cog(SendLogs(bot)) diff --git a/cogs/sondage.py b/cogs/sondage.py deleted file mode 100755 index d113419..0000000 --- a/cogs/sondage.py +++ /dev/null @@ -1,98 +0,0 @@ -import asyncio - -import discord -from discord.ext import commands - - -class Sondage(commands.Cog): - """Commandes sondage.""" - - 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(" | ") - - times = [x for x in options if x.startswith("time=")] - - if times: - time = int(times[0].strip("time=")) - options.remove(times[0]) - else: - time = 0 - - 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 !") - - 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 += f"{emoji[idx]} - {option}\n" - to_react.append(emoji[idx]) - - confirmation_msg += "*Sondage proposé par* " + \ - str(ctx.message.author.mention) - if time == 0: - confirmation_msg += "" - else: - confirmation_msg += f"\n\nVous avez {time} secondes pour voter!" - - 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) - 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) - - -def setup(bot): - bot.add_cog(Sondage(bot)) diff --git a/cogs/utility.py b/cogs/utility.py deleted file mode 100755 index 30d5f49..0000000 --- a/cogs/utility.py +++ /dev/null @@ -1,363 +0,0 @@ -import datetime -import json -import pytz -import random -import urllib - -import discord -import requests -from discord.ext import commands -import socket - -class Utility(commands.Cog): - """Commandes utilitaires.""" - - 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""" - - 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) - - 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) - - 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) - - 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) - - 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) - - 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) - - 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." - - 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) - - 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) - - 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. " - - 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) - - 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) - - 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." - - 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) - - 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) - - 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) - - 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) - - """---------------------------------------------------------------------""" - - @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] - - if (ipaddress == "2602:fe53:b:1::87") and not ("gnous" in realipaddress): - await ctx.send("Erreur, cette adresse n'est pas disponible en IPv6.") - return - except Exception as e: - await ctx.send("Erreur, cette adresse n'est pas disponible en IPv6.") - print(e) - return - - 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""" - 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: - if "No address associated" in str(e): - await ctx.send("Erreur, aucune adresse n'est associé à ce nom d'hôte.") - return - if "timed out" in str(e): - await ctx.send("Erreur, l'adresse en question dépasse le délais d'attente :(") - return - if "SSL" in str(e): - await ctx.send("Erreur avec le certificat SSL, essayez sans ``https://`` !") - return - return - if "no host": - await ctx.send("Erreur, aucun nom d'hôte n'a été donné.") - return - if "not known": - await ctx.send("Erreur, nom de l'hôte inconnu.") - return - 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/gnouseu/tuxbot-bot" - 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='quote', pass_context=True) - async def _quote(self, ctx, quote_id): - global quoted_message - - async def get_message(message_id: int): - for channel in ctx.message.guild.channels: - if isinstance(channel, discord.TextChannel): - test_chan = await self.bot.fetch_channel(channel.id) - try: - return await test_chan.fetch_message(message_id) - except (discord.NotFound, discord.Forbidden): - pass - return None - - quoted_message = await get_message(int(quote_id)) - - if quoted_message is not None: - embed = discord.Embed(colour=quoted_message.author.colour, - description=quoted_message.clean_content, - timestamp=quoted_message.created_at) - embed.set_author(name=quoted_message.author.display_name, - icon_url=quoted_message.author.avatar_url_as( - format="jpg")) - if len(quoted_message.attachments) >= 1: - embed.set_image(url=quoted_message.attachments[0].url) - embed.add_field(name="**Original**", - value=f"[Go!]({quoted_message.jump_url})") - embed.set_footer(text="#" + quoted_message.channel.name) - - await ctx.send(embed=embed) - else: - await ctx.send("Impossible de trouver le message.") - - -def setup(bot): - bot.add_cog(Utility(bot)) diff --git a/cogs/vocal.py b/cogs/vocal.py deleted file mode 100755 index fc21169..0000000 --- a/cogs/vocal.py +++ /dev/null @@ -1,113 +0,0 @@ -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))