From 4978093f4664b4eae16c973c5b588625fa23b2ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl?= Date: Sun, 2 Dec 2018 20:26:23 -0400 Subject: [PATCH] Passeport --- .DS_Store | Bin 0 -> 10244 bytes .gitignore | 8 + README | 39 ++ bot.py | 205 +++++----- cogs/.DS_Store | Bin 0 -> 6148 bytes cogs/admin.py | 387 +++++++++++++++---- cogs/afk.py | 78 ++++ cogs/basics.py | 109 +++--- cogs/ci.py | 375 +++++++++++-------- cogs/cog_manager.py | 110 ++++++ cogs/dev.py | 24 ++ cogs/filter_messages.py | 52 +++ cogs/funs.py | 263 +++++++------ cogs/passport.py | 222 +++++++++++ cogs/role.py | 127 +++++++ cogs/search.py | 231 +++++++----- cogs/send_logs.py | 80 ++++ cogs/sondage.py | 109 ++++++ cogs/utility.py | 452 +++++++++++++---------- cogs/utils/checks.py | 142 ++++--- cogs/utils/cli_colors.py | 43 +++ cogs/utils/db.py | 24 ++ cogs/utils/passport_generator.py | 245 ++++++++++++ config.py.example | 26 ++ data/.DS_Store | Bin 0 -> 6148 bytes data/fonts/NotoSansCJK-Bold.ttc | Bin 0 -> 19319840 bytes data/fonts/NotoSansCJK-Regular.ttc | Bin 0 -> 18748872 bytes data/images/.DS_Store | Bin 0 -> 6148 bytes data/images/background_default.light.png | Bin 0 -> 642034 bytes data/images/background_default.png | Bin 0 -> 1356276 bytes data/images/roles/android.png | Bin 0 -> 1012 bytes data/images/roles/antergos.png | Bin 0 -> 1634 bytes data/images/roles/arch.png | Bin 0 -> 763 bytes data/images/roles/bsd.png | Bin 0 -> 845 bytes data/images/roles/debian.png | Bin 0 -> 1041 bytes data/images/roles/elementary.png | Bin 0 -> 2071 bytes data/images/roles/fedora.png | Bin 0 -> 962 bytes data/images/roles/gentoo.png | Bin 0 -> 1302 bytes data/images/roles/linuxmint.png | Bin 0 -> 1255 bytes data/images/roles/manjaro.png | Bin 0 -> 239 bytes data/images/roles/opensuse.png | Bin 0 -> 1163 bytes data/images/roles/rhel.png | Bin 0 -> 1104 bytes data/images/roles/small/android.png | Bin 0 -> 518 bytes data/images/roles/small/antergos.png | Bin 0 -> 2448 bytes data/images/roles/small/arch.png | Bin 0 -> 1746 bytes data/images/roles/small/bsd.png | Bin 0 -> 1619 bytes data/images/roles/small/debian.png | Bin 0 -> 2027 bytes data/images/roles/small/elementaryOS.png | Bin 0 -> 478 bytes data/images/roles/small/fedora.png | Bin 0 -> 2033 bytes data/images/roles/small/gentoo.png | Bin 0 -> 2220 bytes data/images/roles/small/macos.png | Bin 0 -> 610 bytes data/images/roles/small/manjaro.png | Bin 0 -> 1082 bytes data/images/roles/small/mint.png | Bin 0 -> 2080 bytes data/images/roles/small/opensuse.png | Bin 0 -> 2524 bytes data/images/roles/small/other.png | Bin 0 -> 917 bytes data/images/roles/small/rhel.png | Bin 0 -> 1641 bytes data/images/roles/small/ubuntu.png | Bin 0 -> 2340 bytes data/images/roles/small/void.png | Bin 0 -> 2250 bytes data/images/roles/small/windows.png | Bin 0 -> 261 bytes data/images/roles/ubuntu.png | Bin 0 -> 1311 bytes data/images/roles/void.png | Bin 0 -> 911 bytes launch.py | 43 +++ readme.md | 35 +- requirements.txt | 2 + texts/ci-info.md | 4 +- texts/help.md | 12 +- texts/info.md | 13 +- texts/passport-info.md | 9 + texts/roles.md | 13 + texts/search.md | 2 +- 70 files changed, 2572 insertions(+), 912 deletions(-) create mode 100644 .DS_Store create mode 100644 .gitignore create mode 100644 README create mode 100644 cogs/.DS_Store create mode 100755 cogs/afk.py create mode 100755 cogs/cog_manager.py create mode 100644 cogs/dev.py create mode 100755 cogs/filter_messages.py create mode 100755 cogs/passport.py create mode 100755 cogs/role.py create mode 100755 cogs/send_logs.py create mode 100755 cogs/sondage.py create mode 100644 cogs/utils/cli_colors.py create mode 100755 cogs/utils/db.py create mode 100644 cogs/utils/passport_generator.py create mode 100755 config.py.example create mode 100644 data/.DS_Store create mode 100755 data/fonts/NotoSansCJK-Bold.ttc create mode 100755 data/fonts/NotoSansCJK-Regular.ttc create mode 100644 data/images/.DS_Store create mode 100755 data/images/background_default.light.png create mode 100755 data/images/background_default.png create mode 100644 data/images/roles/android.png create mode 100755 data/images/roles/antergos.png create mode 100755 data/images/roles/arch.png create mode 100755 data/images/roles/bsd.png create mode 100755 data/images/roles/debian.png create mode 100755 data/images/roles/elementary.png create mode 100755 data/images/roles/fedora.png create mode 100755 data/images/roles/gentoo.png create mode 100755 data/images/roles/linuxmint.png create mode 100755 data/images/roles/manjaro.png create mode 100755 data/images/roles/opensuse.png create mode 100755 data/images/roles/rhel.png create mode 100644 data/images/roles/small/android.png create mode 100755 data/images/roles/small/antergos.png create mode 100755 data/images/roles/small/arch.png create mode 100755 data/images/roles/small/bsd.png create mode 100755 data/images/roles/small/debian.png create mode 100755 data/images/roles/small/elementaryOS.png create mode 100755 data/images/roles/small/fedora.png create mode 100755 data/images/roles/small/gentoo.png create mode 100755 data/images/roles/small/macos.png create mode 100755 data/images/roles/small/manjaro.png create mode 100755 data/images/roles/small/mint.png create mode 100755 data/images/roles/small/opensuse.png create mode 100755 data/images/roles/small/other.png create mode 100755 data/images/roles/small/rhel.png create mode 100755 data/images/roles/small/ubuntu.png create mode 100755 data/images/roles/small/void.png create mode 100755 data/images/roles/small/windows.png create mode 100755 data/images/roles/ubuntu.png create mode 100755 data/images/roles/void.png create mode 100644 launch.py create mode 100755 texts/passport-info.md create mode 100755 texts/roles.md diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7a1d78d3b9e40b1caced3e893f6b2f43cb64e96a GIT binary patch literal 10244 zcmeHNUvCpf5T6YpIVV6aA!!Jr(g~{)60`~_Do7Q=IEkp$(xh<|5<+V3d>iM=dDp!= zCnO=2U-|)fLsWc#KJ^1ss``ld0z6fG1d#gFr*`&_9s3f$BINE$yEC^pGw1!y&Yot@ z06_9}|0;k302X#Z?Nc}$)5LwzkF-8LGl7(#K0pn23n4FiA@`0*n+bz}LBJqj5HJWB z1U>`=@SQE1HLR!^4FU!MgFp)baXvWM1UiG~;z)CvHWXFrK$JQV{bZsu6e6FFdX5wal2g=-1_6V>Q3OQp zJ^&tYNZ_+n{w_l4OYE2al}#%5Lm6c&5Vz&|LhjdYa^6l{)AfK?UM&pbWP18F={wPX za$wN1hOD8}LmR~{zEe!xq#ozpXkA<_y2+NO`DM<-7Vmm10o^It?um z$b)+U^Z8Dm*O?znJ4JQFvNBetWKZqye|qD_%oXR_%*??RXaD;3Y2-iu;@}`-O@4Cq zX5nFVcW?j6!B5ZST7l@p21e9%Yy1Vd77{^uTd$D((Olsh+itEgGc4;u%K@vbCiHPq4EAWr9!rTX zQUCkHspZ`o%8VaQNON~0N}05`u(=u2WVK|E#N~*G;UbTNB;ahV?e5xx7;!Hov|3=B z9G|$2I4{(MSiC}`80iuH)ipPYTvnm^-Hp)oXt==gJV|&}ND6CZ&K4soEUgB}i?w8L zy;Cq|b6+=^ONy}}s~CW6Zs||STQ*r{oY71sn_JX(Ew~J~;V!JeBiMtd@B)5=-{B?v z1#jUWGDxP#MRJ*3BR9z{@)h}xERkihM(&e!rQg@|>c`riCd5ak<<;$C#6r$0I49&s z<-TXI2?6eY87VkYcnmI7F>XSjoe@EPMy+QZk>jIm0&Ys~?{0EE961_^6vi1u(Sh!{)ZDt2r;UIVa%9=Hv27?UXd;CEV=Z=CkHv8Be3 zxGw_92|b2!Bz|9l@t36Z#ha*I|0GI@I7N+4Nh0<~7s;OWd>a}m-y;~N83YUh1_6VB zLBJr;^9Y^9@IOjeyEOTKtIB2ae_bi){rvww D#E}Ns literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..02eb697 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +#Don't track user data +data/users/ + +#Python +__pycache__/ +*.pyc +.env +config.py diff --git a/README b/README new file mode 100644 index 0000000..23ef5a9 --- /dev/null +++ b/README @@ -0,0 +1,39 @@ +TuxBot, un bot discord écrit en Python. +Ici ce trouve le code source du bot provenant du serveur Discord [Aide GNU/Linux-Fr"](https://discord.gg/79943dJ "Rejoindre le serveur"), il à été créé spécialement pour ce discord, si vous souhaitez l'utiliser il vous faudra modifier ``params.json`` et ``cogs/utils/checks.py`` ;) + +### Pré-requis + +Il vous faut : + +- Un ordinateur sous **GNU/Linux** avec une connexion à internet; +- Python3.5 ou + ; +- Installer ``requirements.txt`` (avec ``pip install -r requirements.txt`` par ex) + +### Installation + +Une fois les pré-requis installés et ``params.json`` édité, placez vous dans le repertoire de tuxbot et lancez ``bot.py`` avec python3 (ex: ``python3 bot.py``) + +## Démarrage + +Placez vous dans le repertoire de tuxbot et exécutez ``bot.py`` avec python3 (ex: ``python3 bot.py``) + +## Fabriqué avec +* [PyCharm](https://www.jetbrains.com/pycharm/) - Editeur de texte payant :3 +* [discord.py](https://github.com/Rapptz/discord.py) - API Python pour discord + +## Versions +Liste des versions : [Cliquer pour afficher](https://github.com/outout14/tuxbot-bot/tags) + +## Auteurs +* **Maël** _alias_ [@outout14](https://github.com/outout14) +* **Romain** _alias_ [Romain le malchanceux](https://github.com/Rom194) + +## License + +Ce projet est sous licence ``Creative Commons BY-NC-SA 4.0`` - voir le fichier [LICENSE.md](LICENSE.md) pour plus d'informations + + + +## Support on Beerpay +Hey dude! Help me out for a couple of :beers:! + diff --git a/bot.py b/bot.py index 7121d2c..5458874 100755 --- a/bot.py +++ b/bot.py @@ -1,149 +1,120 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -__author__ = "Maël / Outout" +__author__ = ["Romain", "Maël / Outout"] __licence__ = "WTFPL Licence 2.0" from discord.ext import commands import discord from cogs.utils import checks -import datetime, re -import json, asyncio + +import datetime +import json import copy -import logging -from logging.handlers import RotatingFileHandler import traceback import sys -from collections import Counter +import os +import aiohttp -description = """ -Je suis TuxBot, le bot qui vit de l'OpenSource ! ;) -""" +import config +import cogs.utils.cli_colors as colors l_extensions = [ - 'cogs.basics', - #'cogs.test', - 'cogs.admin', - 'cogs.funs', - 'cogs.utility', - 'cogs.search', - 'cogs.ci' + 'cogs.admin', + # 'cogs.afk', + 'cogs.basics', + 'cogs.ci', + 'cogs.cog_manager', + 'cogs.filter_messages', + 'cogs.funs', + 'cogs.passport', + 'cogs.role', + 'cogs.search', + 'cogs.send_logs', + 'cogs.sondage', + 'cogs.utility' ] -# DISCORD LOGGER # -discord_logger = logging.getLogger('discord') -discord_logger.setLevel(logging.CRITICAL) -log = logging.getLogger() -log.setLevel(logging.INFO) -handler = logging.FileHandler(filename='logs/discord.log', encoding='utf-8', mode='w') -log.addHandler(handler) - help_attrs = dict(hidden=True, in_help=True, name="DONOTUSE") -# CREDENTIALS # -try: - def load_credentials(): - with open('params.json') as f: - return json.load(f) -except: - print("Le fichier de paramètre est introuvable, veuillez le créer et le configurer.") +class TuxBot(commands.Bot): + def __init__ (self): + self.config = config + super().__init__(command_prefix=self.config.prefix[0], + description=self.config.description, + pm_help=None, + help_attrs=help_attrs) -credentials = load_credentials() -prefix = credentials.get("prefix", ["."]) -bot = commands.Bot(command_prefix=prefix, description=description, pm_help=None, help_attrs=help_attrs) + self.client_id = self.config.client_id + self.session = aiohttp.ClientSession(loop=self.loop) + self._events = [] -@bot.event -async def on_command_error(error, ctx): - if isinstance(error, commands.NoPrivateMessage): - await bot.send_message(ctx.message.author, 'Cette commande ne peut pas être utilisée en message privée.') - elif isinstance(error, commands.DisabledCommand): - await bot.send_message(ctx.message.author, 'Désoler mais cette commande est désactivé, elle ne peut donc pas être utilisée.') - elif isinstance(error, commands.CommandInvokeError): - print('In {0.command.qualified_name}:'.format(ctx), file=sys.stderr) - traceback.print_tb(error.original.__traceback__) - print('{0.__class__.__name__}: {0}'.format(error.original), file=sys.stderr) -@bot.event -async def on_ready(): - print('---------------------') - print('CONNECTÉ :') - print(""" Nom d\'utilisateur : {0.name}#{0.discriminator} - ID : {0.id}""".format(bot.user)) - print('Merci d\'utiliser TuxBot') - print('---------------------') - await bot.change_presence(game=discord.Game(name=credentials.get("game", "Manger des pommes | .help")), status=discord.Status("dnd"), afk=False) - if bot.client_id == None: - bot.client_id = bot.user.id - if not hasattr(bot, 'uptime'): - bot.uptime = datetime.datetime.utcnow() + self.add_command(self.do) -@bot.event -async def on_resumed(): - print('resumed...') + for extension in l_extensions: + try: + self.load_extension(extension) + print(f"{colors.text_colors.GREEN}\"{extension}\" chargé !{colors.ENDC}") + except Exception as e: + print(f"{colors.text_colors.RED}Impossible de charger l'extension {extension}\n{type(e).__name__}: {e}{colors.ENDC}", file=sys.stderr) -@bot.event -async def on_message(message): - if message.author.bot: - return + async def on_command_error(self, ctx, error): + if isinstance(error, commands.NoPrivateMessage): + await ctx.author.send('Cette commande ne peut pas être utilisee en message privee.') + elif isinstance(error, commands.DisabledCommand): + await ctx.author.send('Desoler mais cette commande est desactive, elle ne peut donc pas être utilisée.') + elif isinstance(error, commands.CommandInvokeError): + print(f'In {ctx.command.qualified_name}:', file=sys.stderr) + traceback.print_tb(error.original.__traceback__) + print(f'{error.original.__class__.__name__}: {error.original}', file=sys.stderr) - try: - await bot.process_commands(message) - except Exception as e: - print('Erreur rencontré : \n {}: {} \n \n'.format(type(e).__name__, e)) + async def on_ready(self): + if not hasattr(self, 'uptime'): + self.uptime = datetime.datetime.utcnow() -@bot.command(pass_context=True, hidden=True) -@checks.is_owner() -async def do(ctx, times : int, *, command): - """Repeats a command a specified number of times.""" - msg = copy.copy(ctx.message) - msg.content = command - for i in range(times): - await bot.process_commands(msg) + log_channel_id = self.get_channel(int(self.config.log_channel_id)) -@bot.command(pass_context=True) -async def github(ctx): - """Pour voir mon code""" - text = "How tu veux voir mon repos Github pour me disséquer ? Pas de soucis ! Je suis un Bot, je ne ressens pas la douleur !\n https://github.com/outout14/tuxbot-bot" - em = discord.Embed(title='Repos TuxBot-Bot', description=text, colour=0xE9D460) - em.set_author(name='Outout', icon_url="https://avatars0.githubusercontent.com/u/14958554?v=3&s=400") - await ctx.send(embed=em) + print('\n\n---------------------') + print('CONNECTÉ :') + print(f'Nom d\'utilisateur: {self.user} {colors.text_style.DIM}(ID: {self.user.id}){colors.ENDC}') + print(f'Channel de log: {log_channel_id} {colors.text_style.DIM}(ID: {log_channel_id.id}){colors.ENDC}') + print(f'Prefix: {self.config.prefix[0]}') + print('Merci d\'utiliser TuxBot') + print('---------------------\n\n') -async def on_command_error(self, ctx, error): - if isinstance(error, commands.NoPrivateMessage): - await ctx.author.send('Cette commande ne peut pas être utilisée en message privée.') - elif isinstance(error, commands.DisabledCommand): - await ctx.author.send('Désoler mais cette commande est désactivé, elle ne peut donc pas être utilisée.') - elif isinstance(error, commands.CommandInvokeError): - print(f'In {ctx.command.qualified_name}:', file=sys.stderr) - traceback.print_tb(error.original.__traceback__) - print(f'{error.original.__class__.__name__}: {error.original}', file=sys.stderr) + await self.change_presence(status=discord.Status.dnd, activity=discord.Game(name=self.config.game)) + + async def on_resumed(): + print('resumed...') + + async def on_message(self, message): + if message.author.bot: + return + + try: + await self.process_commands(message) + except Exception as e: + print(f'{colors.text_colors.RED}Erreur rencontré : \n {type(e).__name__}: {e}{colors.ENDC} \n \n') + + def run(self): + super().run(self.config.token, reconnect=True) + + @checks.has_permissions(administrator=True) + @commands.command(pass_context=True, hidden=True) + async def do(ctx, times: int, *, command): + """Repeats a command a specified number of times.""" + msg = copy.copy(ctx.message) + msg.content = command + for i in range(times): + await bot.process_commands(msg) ## LOAD ## if __name__ == '__main__': - try: - credentials = load_credentials() - token = credentials.get('token') - if token is None: - print("/!\ Le token est manquant dans le fichier params.json...") - bot.client_id = credentials.get('client_id', None) - except: - print("Impossible de démarer TuxBot dû à une erreur inconnue.") - - - for extension in l_extensions: - try: - bot.load_extension(extension) - except Exception as e: - print('Impossible de charger l\'extension {}\n{}: {}'.format(extension, type(e).__name__, e)) - - try: - bot.run(token) - except: - print("Une erreur est survenue avec votre Token, merci de le vérifier.") - - handlers = log.handlers[:] - for hdlr in handlers: - hdlr.close() - log.removeHandler(hdlr) + if os.path.exists('config.py') is not True: + print(f"{colors.text_colors.RED}Veuillez créer le fichier config.py{colors.ENDC}"); exit() + + tuxbot = TuxBot() + tuxbot.run() diff --git a/cogs/.DS_Store b/cogs/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..53a1d1e76fe74997b5f4862844151b5be1ed19d8 GIT binary patch literal 6148 zcmeHKu};G<5IsXn(-uL+0%JxdBxaVVDg!egP}(LyL}^gdBD!VaANU2nj}L%%_Nh%$ zcSQ)@N%nJ{_iW!&V%J1u`pfu|s7FKr3S*;#$`kyY%U0}3&oR*0F=li@FSNRuW|J+p zcBljDz+ZEKzukaF6w@=MRQi6$(`<}qyfJ*DoPXOui|7FSdwSY@>l>~)t#R8l20O>t z6V&V7p`>`PDVkuWUglSgc?4!g4>ZKuM_Bs^?S$q&EnPwTQOO|&_tnege9PPuWSi2I z7It)=EkQ21%;(RFeJGF7!Wc`e(a&ZN%Iq$7QFbi{X2@vaTc=?^%BmKa8P=Kj*zAA_ zN)EI!dV*QzaPiTrfDaYLp;gTAt_(2?JMYg1xmR=@@G|5ci(@<9f|_QDtl9Mxxbm%! z^RH-{aM)>bK7lsxn9cpIlsk;m;4_;e=sMI|9Z(0k zw+*!UF9T~r!AP)hh$jf+q(CP%a>X!Cj{Z=1kznD_$;rs&!^q4=ZYajij`2fFClfi; zS{+aast)YCpFKYRuXo@7t0MiS4yXhF$^p|D+z$FkNzT@-#>= g+Xf%SXDBxCEaV0-5-c2|2cdritPNVJ1HbCP4|A5