import discord, pytz, time from discord.ext import commands from random import randint, shuffle from datetime import datetime from pytz import timezone import re import asyncio def setup(client): client.add_cog(Utils(client)) class Utils(commands.Cog): """Commandes essentielles.""" def __init__(self, client): self.client = client @commands.command(name='ping') async def _ping(self, ctx, *, question = '0'): """Affiche mon ping.⁢⁢⁢⁢⁢\n ➡ Syntaxe: .ping [help]⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢""" if question == 'help': return await ctx.send(embed = discord.Embed(color = randint(0, 0xFFFFFF), description = ":hourglass: correspond au temps entre deux battements de cœurs (en millisecondes)\n\n:stopwatch: correspond au temps que met le client a calculer le ping (en millisecondes)\n\n:heartbeat: correspond au temps que met le client a réagir au messages (en millisecondes)")) else: now = int(round(time.time() * 1000)) ping = now - int(round(ctx.message.created_at.timestamp() * 1000)) embed = discord.Embed(description = 'Pinging...') message = await ctx.send(embed = embed) ping2 = int(round(time.time() * 1000)) - now await message.edit(embed = discord.Embed(color = randint(0, 0xFFFFFF), description = f':hourglass: {round(self.client.latency * 1000)}ms\n\n:stopwatch: {ping2}ms\n\n:heartbeat: {ping}ms')) await ctx.message.add_reaction(emoji = '✅') @commands.command(name='avatar') async def _avatar(self, ctx, *, user = '0'): """Affiche ton avatar ou celui que tu mentionnes.\n ➡ Syntaxe: .avatar [user]""" if user == '0': user = ctx.author else: user = self.client.get_user(int(user[2:-1].replace("!",""))) await ctx.message.add_reaction(emoji = '✅') embed = discord.Embed(description = f"[lien vers la photo de profil]({user.avatar_url}) de {user.mention}", color = randint(0, 0xFFFFFF)) embed.set_author(name = f"Photo de profil de {user.name}") embed.set_image(url = user.avatar_url) await ctx.send(embed = embed) @commands.command(name='calc') async def _calc(self, ctx, *, msg): """Calculatrice.\n ➡ Syntaxe: .calc ⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢""" equation = msg.replace('^', '**').replace('x', '*').replace('×', '*').replace('÷', '/').replace('≥', '>=').replace('≤', '<=') try: try: if '=' in equation: if '<' in equation: left = eval(equation.split("<=")[0]) right = eval(equation.split("<=")[1]) answer = str(left <= right) elif '>' in equation: left = eval(equation.split(">=")[0]) right = eval(equation.split(">=")[1]) answer = str(left >= right) else: left = eval(equation.split("=")[0]) right = eval(equation.split("=")[1]) answer = str(left == right) else: answer = str(eval(equation)) except ZeroDivisionError: return await ctx.send("Tu ne peux pas divisé par 0.") except TypeError: return await ctx.send("Requête de calcul invalide.") if '.' in answer: aftercomma = answer.split(".")[1] if len(aftercomma) > 2: answer = str(round(float(answer),2)) equation = f"'{equation}' arrondi à 2" equation = equation.replace('*', '×').replace('/', '÷').replace('>=', '≥').replace('<=', '≤') embed = discord.Embed(color = randint(0, 0xFFFFFF), title = 'Calculatrice') embed.set_footer(text = ctx.author) embed.add_field(name = 'Calcul :', value = equation, inline = False) embed.add_field(name = 'Réponse :', value = answer.replace('False', 'Faux').replace('True', 'Vrai'), inline = False) await ctx.message.add_reaction(emoji = '✅') await ctx.send(content = None, embed = embed) @_calc.error async def _calc_error(self, ctx, error): await ctx.send("Tu n'as pas spécifié de calcul.") @commands.command(name='syntax') async def _syntax(self, ctx): """Informations pour bien éditer son texte.⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢""" syntaxe = "-----------------------------------------------------\n" syntaxe += discord.utils.escape_markdown("```Js\n") syntaxe += discord.utils.escape_markdown("//code en js (possible de remplacer 'js' par d'autres languages . adaptez le !)\n") syntaxe += discord.utils.escape_markdown('console.log("hi");\n') syntaxe += discord.utils.escape_markdown("```\n") syntaxe += "```Js\n" syntaxe += "//code en js (possible de remplacer 'js' par d'autres languages . adaptez le !)\n" syntaxe += 'console.log("hi");\n' syntaxe += "```\n" syntaxe += "Si ton code est trop long, mets le sur \n" syntaxe += "-----------------------------------------------------\n" syntaxe += discord.utils.escape_markdown("`code sur une seule ligne`\n") syntaxe += "`code sur une seule ligne`\n" syntaxe += "-----------------------------------------------------\n" syntaxe += discord.utils.escape_markdown("*texte en italique*\n") syntaxe += "*texte en italique*\n" syntaxe += "-----------------------------------------------------\n" syntaxe += discord.utils.escape_markdown("**text en gras**\n") syntaxe += "**text en gras**\n" syntaxe += "-----------------------------------------------------\n" syntaxe += discord.utils.escape_markdown("<>\n") syntaxe += "Un lien entre crochet, ça empêche Discord de rajouté son intégration automatique (mais le lien fonctionnera toujours).\n" syntaxe += "-----------------------------------------------------\n" syntaxe += discord.utils.escape_markdown("__texte souligné__\n") syntaxe += "__texte souligné__\n" syntaxe += "-----------------------------------------------------\n" syntaxe += discord.utils.escape_markdown("~~texte barré~~\n") syntaxe += "~~texte barré~~\n" syntaxe += "-----------------------------------------------------\n" syntaxe += discord.utils.escape_markdown("~~__***text en italique-gras-souligné-barré***__~~\n") syntaxe += "~~__***text en italique-gras-souligné-barré***__~~\n" syntaxe += "-----------------------------------------------------\n" syntaxe += discord.utils.escape_markdown("\:joy: <- l'emoji ne va pas fonctionné grâce au \ \n") syntaxe += "\:joy: <- l'emoji ne va pas fonctionné grâce au \ \n" syntaxe += "-----------------------------------------------------\n" syntaxe += discord.utils.escape_markdown("> cette ligne est cité\npas celle là\n") syntaxe += "> cette ligne est cité\npas celle là\n" syntaxe += "-----------------------------------------------------\n" syntaxe += discord.utils.escape_markdown(">>> cette ligne est cité\ncelle là aussi (et elles le seront toutes!)\n") syntaxe += ">>> cette ligne est cité\ncelle là aussi (et elles le seront toutes!)\n" await ctx.message.add_reaction(emoji = '✅') await ctx.send(syntaxe) @commands.command(name='memo', aliases = ['note']) async def _memo(self, ctx, *, text): """T'envoie un petit memo par message privé.\n ➡ Syntaxe: .memo/note ⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢""" if len(text) <= 5: await ctx.message.add_reaction(emoji = '❌') return await ctx.send("Ta note doit au moins faire 5 caractères.") elif len(text) >= 2048: await ctx.message.add_reaction(emoji = '❌') return await ctx.send("Ta note doit faire moins de 2048 caractères.") else: await ctx.message.delete() embed = discord.Embed(description = text, color = randint(0, 0xFFFFFF)) embed.set_author(name = "Mémo", icon_url = ctx.author.avatar_url) embed.set_footer(text = f'📝 le {datetime.now(pytz.timezone("Europe/Paris")).strftime("%d/%m/%Y à %H:%M:%S")}') await ctx.author.send(embed = embed) return await ctx.send("Tu viens de recevoir ton mémo !", delete_after = 5) @_memo.error async def _note_error(self, ctx, error): if str(error) == "text is a required argument that is missing.": await ctx.send("Vous devez renseigner un message : `.note/memo ⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢`.") @commands.command(name='infos', aliases = ['info']) async def _infos(self, ctx): """Donne des infos sur le bot.\n ➡ Syntaxe: .infos/info⁢""" appinfo = await self.client.application_info() embed = discord.Embed(color = randint(0, 0xFFFFFF)) embed.set_author(name = appinfo.name, icon_url = self.client.user.avatar_url) total_online = len({m.id for m in self.client.get_all_members() if m.status is discord.Status.online}) total_unique = len(self.client.users) voice_channels = [] text_channels = [] for guild in self.client.guilds: voice_channels.extend(guild.voice_channels) text_channels.extend(guild.text_channels) text = len(text_channels) voice = len(voice_channels) embed.add_field(name = "Dev", value = f"[{appinfo.owner}](https://github.com/Mylloon)") embed.add_field(name = "Serveurs", value = len(self.client.guilds)) embed.add_field(name = "Membres", value = f"{total_unique} au total\n{total_online} en ligne") embed.add_field(name = "Channels", value = f"{text} textuelles\n{voice} vocales") embed.set_footer(text = f"Basé sur discord.py {discord.__version__}") await ctx.message.add_reaction(emoji = '✅') await ctx.send(embed = embed) def _map_list_among_us(self, map): maps = {} maps["skeld"] = ["skeld", "the skeld", "theskeld"] maps["mira"] = ["mira", "mira hq", "mirahq"] maps["polus"] = ["polus"] if map == "all": return maps["skeld"] + maps["mira"] + maps["polus"] return maps[map] @commands.command(name='among', hidden = True) async def _among(self, ctx, *, args = ""): if not args == "": args = args.split() del args[0] args = " ".join(args) if args.lower() in self._map_list_among_us("all"): await ctx.invoke(self.client.get_command("amongus"), map=args) else: await ctx.invoke(self.client.get_command("amongus")) else: await ctx.message.add_reaction(emoji = '❓') @commands.command(name='amongus') async def _amongus(self, ctx, *, map = "0"): """Affiche la carte voulue d'Among Us.⁢⁢⁢⁢⁢\n ➡ Syntaxe: .amongus ⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢""" if map.lower() in self._map_list_among_us("mira"): image = "https://i.imgur.com/6ijrH1h.jpg" embed = discord.Embed(title = f"Map Mira HQ d'Among Us", color = randint(0, 0xFFFFFF), description = f"[lien de l'image]({image})") embed.set_image(url = image) await ctx.send(embed = embed) await ctx.message.add_reaction(emoji = '✅') elif map.lower() in self._map_list_among_us("polus"): image = "https://i.imgur.com/mhFmcw3.jpg" embed = discord.Embed(title = f"Map Polus d'Among Us", color = randint(0, 0xFFFFFF), description = f"[lien de l'image]({image})") embed.set_image(url = image) await ctx.send(embed = embed) await ctx.message.add_reaction(emoji = '✅') elif map.lower() in self._map_list_among_us("skeld"): image = "https://i.imgur.com/OSXI4Zv.jpg" embed = discord.Embed(title = f"Map The Skeld d'Among Us", color = randint(0, 0xFFFFFF), description = f"[lien de l'image]({image})") embed.set_image(url = image) await ctx.send(embed = embed) await ctx.message.add_reaction(emoji = '✅') else: await ctx.send("`.amongus `") @commands.command(name='whois') async def _whois(self, ctx, *user: discord.Member): """Affiche les infos sur l'utilisateur.⁢⁢⁢⁢⁢\n ➡ Syntaxe: .whois [user]⁢⁢⁢⁢⁢⁢⁢⁢⁢⁢""" if len(user) <= 1: if user == (): user = [ctx.author] nom = f"{user[0].name}#{user[0].discriminator}" if user[0].nick: nom = f"{user[0].nick} ({user[0].name}#{user[0].discriminator})" embed = discord.Embed(color = randint(0, 0xFFFFFF)).set_author(name = nom, icon_url = user[0].avatar_url) embed.add_field(name = "ID", value = user[0].id) value = str(user[0].created_at.astimezone(timezone('Europe/Paris')))[:-13].replace('-', '/').split() embed.add_field(name = "Compte créé le", value = f"{value[0][8:]}/{value[0][5:-3]}/{value[0][:4]} à {value[1]}") embed.add_field(name = "Âge du compte", value = self._age_layout(self._get_age(user[0].created_at))) embed.add_field(name = "Mention", value = user[0].mention) value = str(user[0].joined_at.astimezone(timezone('Europe/Paris')))[:-13].replace('-', '/').split() embed.add_field(name = "Serveur rejoint le", value = f"{value[0][8:]}/{value[0][5:-3]}/{value[0][:4]} à {value[1]}") embed.add_field(name = "Est sur le serveur depuis", value = self._age_layout(self._get_age(user[0].joined_at))) await ctx.message.add_reaction(emoji = '✅') return await ctx.send(embed = embed) await ctx.send("Tu mentionnes trop d'utilisateurs : `.whois [@Membre]`") def _get_age(self, date): joursRestants = datetime.now() - date years = joursRestants.total_seconds() / (365.242 * 24 * 3600) months = (years - int(years)) * 12 days = (months - int(months)) * (365.242 / 12) hours = (days - int(days)) * 24 minutes = (hours - int(hours)) * 60 seconds = (minutes - int(minutes)) * 60 return (int(years), int(months), int(days), int(hours), int(minutes), int(seconds)) def _age_layout(self, tuple): time = {} time[0], time[1], time[2], time[3], time[4], time[5] = "an", "mois", "jour", "heure", "minute", "seconde" for i in range(len(tuple)): if tuple[i] > 1 and i != 1: time[i] = time[i] + "s" message = "" if tuple[5] > 0: # pour les secondes affichage = [5] # on affiche que : seconde if tuple[4] > 0: affichage = [4, 5] # on affiche : minute + seconde if tuple[3] > 0: affichage = [3, 4, 5] # on affiche : heure + minute + seconde if tuple[2] > 0: affichage = [2, 3, 4] # on affiche : jour + heure + minute if tuple[1] > 0: affichage = [1, 2, 3] # on affiche : mois + jour + heure if tuple[0] > 0: affichage = [0, 1, 3] # on affiche : an + mois + heure for i in affichage: message = message + f", {tuple[i]} {time[i]}" return message[2:] @commands.command(name='sondage') async def _sondage(self, ctx, *args): """Fais un sondage.⁢⁢⁢⁢⁢\n ➡ Syntaxe: .sondage "" "" "" "" """ args = list(args) if len(args) > 2: question = args[0].replace("<@!", "").replace(">", "").replace("<@", "") for i in re.findall(r'\d+', question): ii = self.user_or_nick(ctx.author.guild.get_member(int(i))) try: question = question.replace(i, ii) except: pass propositions = args[1:] if len(propositions) <= 20: message = "" emojis = {} emojis[0] = ['1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣', '🔟'] emojis[1] = [ '🟤', '🔴', '🟠', '🟡', '🟢', '🔵', '🟣', '🔘', '❤', '💜', '🟫', '🟥', '🟧', '🟨', '🟩', '🟦', '🟪', '🔳', '🧡', '💙' ] mixable = True if len(propositions) <= 10: emojis_chosen = emojis[randint(0, len(emojis) - 1)] emojis_chosen = emojis_chosen[:10] if len(propositions) <= 8: emojis_chosen = emojis_chosen[:8] else: emojis_chosen = emojis[randint(1, len(emojis) - 1)] if emojis[0][0] in emojis_chosen: # rajouter ici les listes qui ne doivent pas être mélanger mixable = False if mixable: shuffle(emojis_chosen) for i in range(len(args[1:])): message += f"{emojis_chosen[i]} -> {propositions[i]}\n" embed = discord.Embed(title = question, description = message,color = randint(0, 0xFFFFFF)).set_footer(text = self.user_or_nick(ctx.author), icon_url = ctx.author.avatar_url) sondage = await ctx.send(embed = embed) for i in range(len(args[1:])): await sondage.add_reaction(emoji = emojis_chosen[i]) return await ctx.message.add_reaction(emoji = '✅') else: return await ctx.send(f"Désolé, mais tu as mis trop de possibilités (maximum : 20)") else: return await ctx.send(f'Désolé, mais il manque des arguments : `.sondage "" "" "" ""`') def user_or_nick(self, user): if user.nick: return f"{user.nick} ({user.name}#{user.discriminator})" else: return f"{user.name}#{user.discriminator}"