diff --git a/.gitignore b/.gitignore index 16ebab5..dfd455b 100644 --- a/.gitignore +++ b/.gitignore @@ -112,4 +112,6 @@ foBot_config/* # Pi file (too big) modules/pi/pi.txt -*.log* \ No newline at end of file +*.log* + +*.lock \ No newline at end of file diff --git a/Pipfile.lock b/Pipfile.lock deleted file mode 100644 index c1349f5..0000000 --- a/Pipfile.lock +++ /dev/null @@ -1,166 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "0a45806745c14c2eb4a5190e94d4093508347d44f685b6b7262259c46b5f7cb5" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.7" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "asn1crypto": { - "hashes": [ - "sha256:2f1adbb7546ed199e3c90ef23ec95c5cf3585bac7d11fb7eb562a3fe89c64e87", - "sha256:9d5c20441baf0cb60a4ac34cc447c6c189024b6b4c6cd7877034f4965c464e49" - ], - "version": "==0.24.0" - }, - "cffi": { - "hashes": [ - "sha256:151b7eefd035c56b2b2e1eb9963c90c6302dc15fbd8c1c0a83a163ff2c7d7743", - "sha256:1553d1e99f035ace1c0544050622b7bc963374a00c467edafac50ad7bd276aef", - "sha256:1b0493c091a1898f1136e3f4f991a784437fac3673780ff9de3bcf46c80b6b50", - "sha256:2ba8a45822b7aee805ab49abfe7eec16b90587f7f26df20c71dd89e45a97076f", - "sha256:3bb6bd7266598f318063e584378b8e27c67de998a43362e8fce664c54ee52d30", - "sha256:3c85641778460581c42924384f5e68076d724ceac0f267d66c757f7535069c93", - "sha256:3eb6434197633b7748cea30bf0ba9f66727cdce45117a712b29a443943733257", - "sha256:495c5c2d43bf6cebe0178eb3e88f9c4aa48d8934aa6e3cddb865c058da76756b", - "sha256:4c91af6e967c2015729d3e69c2e51d92f9898c330d6a851bf8f121236f3defd3", - "sha256:57b2533356cb2d8fac1555815929f7f5f14d68ac77b085d2326b571310f34f6e", - "sha256:770f3782b31f50b68627e22f91cb182c48c47c02eb405fd689472aa7b7aa16dc", - "sha256:79f9b6f7c46ae1f8ded75f68cf8ad50e5729ed4d590c74840471fc2823457d04", - "sha256:7a33145e04d44ce95bcd71e522b478d282ad0eafaf34fe1ec5bbd73e662f22b6", - "sha256:857959354ae3a6fa3da6651b966d13b0a8bed6bbc87a0de7b38a549db1d2a359", - "sha256:87f37fe5130574ff76c17cab61e7d2538a16f843bb7bca8ebbc4b12de3078596", - "sha256:95d5251e4b5ca00061f9d9f3d6fe537247e145a8524ae9fd30a2f8fbce993b5b", - "sha256:9d1d3e63a4afdc29bd76ce6aa9d58c771cd1599fbba8cf5057e7860b203710dd", - "sha256:a36c5c154f9d42ec176e6e620cb0dd275744aa1d804786a71ac37dc3661a5e95", - "sha256:a6a5cb8809091ec9ac03edde9304b3ad82ad4466333432b16d78ef40e0cce0d5", - "sha256:ae5e35a2c189d397b91034642cb0eab0e346f776ec2eb44a49a459e6615d6e2e", - "sha256:b0f7d4a3df8f06cf49f9f121bead236e328074de6449866515cea4907bbc63d6", - "sha256:b75110fb114fa366b29a027d0c9be3709579602ae111ff61674d28c93606acca", - "sha256:ba5e697569f84b13640c9e193170e89c13c6244c24400fc57e88724ef610cd31", - "sha256:be2a9b390f77fd7676d80bc3cdc4f8edb940d8c198ed2d8c0be1319018c778e1", - "sha256:ca1bd81f40adc59011f58159e4aa6445fc585a32bb8ac9badf7a2c1aa23822f2", - "sha256:d5d8555d9bfc3f02385c1c37e9f998e2011f0db4f90e250e5bc0c0a85a813085", - "sha256:e55e22ac0a30023426564b1059b035973ec82186ddddbac867078435801c7801", - "sha256:e90f17980e6ab0f3c2f3730e56d1fe9bcba1891eeea58966e89d352492cc74f4", - "sha256:ecbb7b01409e9b782df5ded849c178a0aa7c906cf8c5a67368047daab282b184", - "sha256:ed01918d545a38998bfa5902c7c00e0fee90e957ce036a4000a88e3fe2264917", - "sha256:edabd457cd23a02965166026fd9bfd196f4324fe6032e866d0f3bd0301cd486f", - "sha256:fdf1c1dc5bafc32bc5d08b054f94d659422b05aba244d6be4ddc1c72d9aa70fb" - ], - "version": "==1.11.5" - }, - "cryptography": { - "hashes": [ - "sha256:02602e1672b62e803e08617ec286041cc453e8d43f093a5f4162095506bc0beb", - "sha256:10b48e848e1edb93c1d3b797c83c72b4c387ab0eb4330aaa26da8049a6cbede0", - "sha256:17db09db9d7c5de130023657be42689d1a5f60502a14f6f745f6f65a6b8195c0", - "sha256:227da3a896df1106b1a69b1e319dce218fa04395e8cc78be7e31ca94c21254bc", - "sha256:2cbaa03ac677db6c821dac3f4cdfd1461a32d0615847eedbb0df54bb7802e1f7", - "sha256:31db8febfc768e4b4bd826750a70c79c99ea423f4697d1dab764eb9f9f849519", - "sha256:4a510d268e55e2e067715d728e4ca6cd26a8e9f1f3d174faf88e6f2cb6b6c395", - "sha256:6a88d9004310a198c474d8a822ee96a6dd6c01efe66facdf17cb692512ae5bc0", - "sha256:76936ec70a9b72eb8c58314c38c55a0336a2b36de0c7ee8fb874a4547cadbd39", - "sha256:7e3b4aecc4040928efa8a7cdaf074e868af32c58ffc9bb77e7bf2c1a16783286", - "sha256:8168bcb08403ef144ff1fb880d416f49e2728101d02aaadfe9645883222c0aa5", - "sha256:8229ceb79a1792823d87779959184a1bf95768e9248c93ae9f97c7a2f60376a1", - "sha256:8a19e9f2fe69f6a44a5c156968d9fc8df56d09798d0c6a34ccc373bb186cee86", - "sha256:8d10113ca826a4c29d5b85b2c4e045ffa8bad74fb525ee0eceb1d38d4c70dfd6", - "sha256:be495b8ec5a939a7605274b6e59fbc35e76f5ad814ae010eb679529671c9e119", - "sha256:dc2d3f3b1548f4d11786616cf0f4415e25b0fbecb8a1d2cd8c07568f13fdde38", - "sha256:e4aecdd9d5a3d06c337894c9a6e2961898d3f64fe54ca920a72234a3de0f9cb3", - "sha256:e79ab4485b99eacb2166f3212218dd858258f374855e1568f728462b0e6ee0d9", - "sha256:f995d3667301e1754c57b04e0bae6f0fa9d710697a9f8d6712e8cca02550910f" - ], - "version": "==2.3.1" - }, - "discord.py": { - "git": "https://github.com/Rapptz/discord.py", - "ref": "00a659c6526b2445162b52eaf970adbd22c6d35d" - }, - "fs.dropboxfs": { - "git": "https://github.com/rkhwaja/fs.dropboxfs.git", - "ref": "47268ea33d6cfa91e343cb84d6d7f6d8b44db3f8" - }, - "idna": { - "hashes": [ - "sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e", - "sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16" - ], - "version": "==2.7" - }, - "mysql-connector-python": { - "hashes": [ - "sha256:35a8f77b90d40cbf5bbb87bcfae02d63ca0383833187142ead963b1ad95ee958", - "sha256:364b97e225ddaab4438850e9c16495dba4c4ab0a995e7ad061bfb66c07489031", - "sha256:605d55f280b3496cf3b12c7c3751e59e69f80cd4515b39c11ee5f79dae13e407", - "sha256:6e90c766b9f144db8af3cac243e3f7b0e5f151ead6af017285d62f841e906b92", - "sha256:874a7443829183351b6f28a6a22796a738278da7d6a2cfa1cffb5bc0ceea04dd", - "sha256:95426961f4caa90960bf71776a1825e7facd9d3754511313d5c72401793addd6", - "sha256:9dee3c249f169363330a9feeb5bf60392778dbcf81f57c5265b8e75e7a4e45d5", - "sha256:a6f045807fb325369ff9520570a007952696889b6f97058b5ec820fb1462ba71", - "sha256:ce817f306eb0db50f424dc8a3f00b57a9bb78c02dcc5beb7014810e3d19356ca", - "sha256:d4ecde5a335697e240062f72ff4bcba1d51d04a8c73ea3ec69c46cde13e13082", - "sha256:e0fcb069f2916994599f2648e4b9d433087ebe8dacf13cf4d0dea4c0149b9723", - "sha256:eab88976e0cfe47a17ab625ea961ca53478788215cd000f31e22c1f3469685b4", - "sha256:f59ed1ff1b7ffb8343fecb02412628245ec802dd7ecce06f6e9b6863170bfbd1", - "sha256:f5f50d9a9e1690f541cb8c86be68dc62d5e5203ca85d8696807ef2df5e1c7fb1", - "sha256:fe895a5db555a5a5f90a195119e042e2275029012a0ca2a1a085d49b7bb954c9" - ], - "index": "pypi", - "version": "==8.0.12" - }, - "protobuf": { - "hashes": [ - "sha256:10394a4d03af7060fa8a6e1cbf38cea44be1467053b0aea5bbfcb4b13c4b88c4", - "sha256:1489b376b0f364bcc6f89519718c057eb191d7ad6f1b395ffd93d1aa45587811", - "sha256:1931d8efce896981fe410c802fd66df14f9f429c32a72dd9cfeeac9815ec6444", - "sha256:196d3a80f93c537f27d2a19a4fafb826fb4c331b0b99110f985119391d170f96", - "sha256:46e34fdcc2b1f2620172d3a4885128705a4e658b9b62355ae5e98f9ea19f42c2", - "sha256:59cd75ded98094d3cf2d79e84cdb38a46e33e7441b2826f3838dcc7c07f82995", - "sha256:5ee0522eed6680bb5bac5b6d738f7b0923b3cafce8c4b1a039a6107f0841d7ed", - "sha256:65917cfd5da9dfc993d5684643063318a2e875f798047911a9dd71ca066641c9", - "sha256:685bc4ec61a50f7360c9fd18e277b65db90105adbf9c79938bd315435e526b90", - "sha256:92e8418976e52201364a3174e40dc31f5fd8c147186d72380cbda54e0464ee19", - "sha256:9335f79d1940dfb9bcaf8ec881fb8ab47d7a2c721fb8b02949aab8bbf8b68625", - "sha256:a7ee3bb6de78185e5411487bef8bc1c59ebd97e47713cba3c460ef44e99b3db9", - "sha256:ceec283da2323e2431c49de58f80e1718986b79be59c266bb0509cbf90ca5b9e", - "sha256:fcfc907746ec22716f05ea96b7f41597dfe1a1c088f861efb8a0d4f4196a6f10" - ], - "markers": "python_version != '3.3.*' and python_version != '3.1.*' and python_version != '3.0.*' and python_version != '3.2.*' and python_version >= '2.7'", - "version": "==3.6.1" - }, - "pycparser": { - "hashes": [ - "sha256:99a8ca03e29851d96616ad0404b4aad7d9ee16f25c9f9708a11faf2810f7b226" - ], - "version": "==2.18" - }, - "pymysql": { - "hashes": [ - "sha256:95f057328357e0e13a30e67857a8c694878b0175797a9a203ee7adbfb9b1ec5f", - "sha256:9ec760cbb251c158c19d6c88c17ca00a8632bac713890e465b2be01fdc30713f" - ], - "index": "pypi", - "version": "==0.9.2" - }, - "six": { - "hashes": [ - "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", - "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb" - ], - "version": "==1.11.0" - } - }, - "develop": {} -} diff --git a/Procfile b/Procfile deleted file mode 100644 index b96cada..0000000 --- a/Procfile +++ /dev/null @@ -1 +0,0 @@ -worker: python main.py \ No newline at end of file diff --git a/app.json b/app.json deleted file mode 100644 index b2e2eba..0000000 --- a/app.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "foBot", - "description": "A simple bot for discord.", - "image": "heroku/python", - "repository": "https://github.com/Fomys/foBot", - "keywords": ["python", "discord", "rewrite"] -} diff --git a/main.py b/main.py index c2943a7..ad4edbe 100644 --- a/main.py +++ b/main.py @@ -1,32 +1,18 @@ +import datetime import importlib import json import logging import logging.config import re +import sys +import traceback + import discord import pymysql as mariadb import os -# Setup database -# db_connection = mariadb.connect(host=os.environ.get('FOBOT_DATABASE_HOST', '127.0.0.1'), -# port=os.environ.get('FOBOT_DATABASE_PORT', 3307), -# user=os.environ['FOBOT_DATABASE_USER'], -# password=os.environ['FOBOT_DATABASE_PASSWORD'], -# db=os.environ.get('FOBOT_DATABASE_NAME', 'fobot'), -# charset='utf8mb4', -# cursorclass=mariadb.cursors.DictCursor) - -db_connection = mariadb.connect(host='127.0.0.1', - port=3307, - user='root', - password='sfkr4m37', - db='fobot', - charset='utf8mb4', - cursorclass=mariadb.cursors.DictCursor) - - def to_str(entier): return str(entier).replace("1", "a").replace("2", "b").replace("3", "c").replace("4", "d").replace("5", "e") \ @@ -79,6 +65,27 @@ warning = log_foBot.warning error = log_foBot.error critical = log_foBot.critical +# Setup database +db_connection = None +try: + db_connection = mariadb.connect(host=os.environ['FOBOT_DATABASE_HOST'], + port=int(os.environ['FOBOT_DATABASE_PORT']), + user=os.environ['FOBOT_DATABASE_USER'], + password=os.environ['FOBOT_DATABASE_PASSWORD'], + db=os.environ['FOBOT_DATABASE_NAME'], + charset='utf8mb4', + cursorclass=mariadb.cursors.DictCursor) +except KeyError as e: + traceback.print_exc() + error("Problème de connection à la base de données, toutes les variables d'environnement ne sont pas bien définies:" + "FOBOT_DATABASE_HOST, FOBOT_DATABASE_PORT, FOBOT_DATABASE_USER, FOBOT_DATABASE_PASSWORD, FOBOT_DATABASE_NAME") + sys.exit() +except: + traceback.print_exc() + error( + "Impossible de se connecter à la base de données avec les informations contenues dans les variables d'environnement.") + sys.exit() + class Guild: def __init__(self, bot, guild_id): @@ -93,14 +100,22 @@ class Guild: self.load_config() self.update_modules() self.save_config() + self.create_log() + + def create_log(self): + try: + os.mkdir('logs') + os.mkdir(os.path.join("logs", str(self.id))) + except FileExistsError: + pass def load_config(self): with self.bot.database.cursor() as cursor: # Create guild table if it not exists sql_create = """CREATE TABLE IF NOT EXISTS {guild_id}main ( - id int(5) NOT NULL AUTO_INCREMENT PRIMARY KEY, - name varchar(50) NOT NULL, - content JSON CHECK (JSON_VALID(content)) + id INT(5) NOT NULL AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(50) NOT NULL, + content VARCHAR(20000) );""".format(guild_id=self.id) cursor.execute(sql_create) # Load config row @@ -158,7 +173,36 @@ class Guild: if not msg.author.bot: for module in self.modules: await module.on_message(msg) - print(msg.guild, msg.content) + log_path = os.path.join("logs", str(self.id), str(msg.channel.id)) + ".log" + with open(log_path, 'a') as file: + file.write("::".join(["create", + datetime.datetime.now().strftime("%d/%m/%y %H:%M"), + str(msg.id), + str(msg.author.id), + "attachment=" + str(len(msg.attachments)), + msg.content, ]) + "\n") + return + + async def on_message_delete(self, msg): + log_path = os.path.join("logs", str(self.id), str(msg.channel.id)) + ".log" + with open(log_path, 'a') as file: + file.write("::".join(["delete", + datetime.datetime.now().strftime("%d/%m/%y %H:%M"), + str(msg.id), + str(msg.author.id), + "attachment=" + str(len(msg.attachments)), + msg.content, ]) + "\n") + return + + async def on_message_edit(self, before, after): + log_path = os.path.join("logs", str(self.id), str(after.channel.id)) + ".log" + with open(log_path, 'a') as file: + file.write("::".join([" edit", + datetime.datetime.now().strftime("%d/%m/%y %H:%M"), + str(before.id), + str(after.author.id), + "attachment=" + str(len(after.attachments)), + after.content, ]) + "\n") return @@ -210,6 +254,12 @@ class FoBot(discord.Client): async def on_message(self, msg): await self.guilds_class[msg.guild.id].on_message(msg) + async def on_message_delete(self, msg): + await self.guilds_class[msg.guild.id].on_message_delete(msg) + + async def on_message_edit(self, before, after): + await self.guilds_class[before.guild.id].on_message_edit(before, after) + myBot = FoBot() -myBot.run(os.environ['DISCORD_TOKEN'], max_messages=100000000) +myBot.run(os.environ['FOBOT_DISCORD_TOKEN'], max_messages=100000000) diff --git a/runtime.txt b/runtime.txt deleted file mode 100644 index b16fb5e..0000000 --- a/runtime.txt +++ /dev/null @@ -1 +0,0 @@ -python-3.7.0 \ No newline at end of file diff --git a/traductions.py b/traductions.py index d3fd1fd..e4f4b29 100644 --- a/traductions.py +++ b/traductions.py @@ -120,8 +120,9 @@ tr = { "reload_optimizer": { "description": "Recharge les quantités deressources nécessaires, réservé aux admins", "example": [ - ("`{prefix}reload_optimizer`", "Recharge les quantités de ressources nécessaires pour faire " - "les différents items.") + ( + "`{prefix}reload_optimizer`", "Recharge les quantités de ressources nécessaires pour faire " + "les différents items.") ] } }, @@ -153,10 +154,10 @@ tr = { "pi": { "description": "Donne 2000 décimales de pi.", "examples": [ - ("`(prefix}pi`", "Affiche les 2000 premières décimales de pi."), + ("`{prefix}pi`", "Affiche les 2000 premières décimales de pi."), ("`{prefix}pi 2000`", "Affiche 2000 décimales de pi à partir de la 2000ème"), ], - },"fpi": { + }, "fpi": { "description": "Recherche l'expression régulière dans pi", "examples": [ ("`{prefix}fpi 12345`", "Affiche les 10 premières occurences de 12345 dans pi"), @@ -173,12 +174,12 @@ tr = { "sourcecode": { "description": "Donne un lien vers mon code source (il est là comme ca tu a pas retapper la \ commande :smile: https://github.com/Fomys/foBot", - "examples":[ + "examples": [ ("`prefix`sourcecode", "Affiche mon code source") ] }, }, - "sourcecode":"Mon code source est disponible sur github: https://github.com/Fomys/foBot", + "sourcecode": "Mon code source est disponible sur github: https://github.com/Fomys/foBot", }, "tools": { "description": "Commandes utiles", @@ -221,14 +222,14 @@ commande :smile: https://github.com/Fomys/foBot", " fois toutes les options ajoutées, utilisez la commande `{prefix}post_survey {id}` da" "ns le channel où vous voulez poster le sondage. Le sondage commencera lorsque vous fe" "rez la commande `{prefix}post_survey {id}`", - "post_survey":{ - "presentation":"Un nouveau sondage a été créé. Votez pour le choix que vous préférez avec la comman" - "de `{prefix}vote choix` en remplaçant choix par le numéro de l'option pour laquelle" - " vous votez. Ce sondage se termine dans {heures} heures. Bon vote!", + "post_survey": { + "presentation": "Un nouveau sondage a été créé. Votez pour le choix que vous préférez avec la comman" + "de `{prefix}vote choix` en remplaçant choix par le numéro de l'option pour laquelle" + " vous votez. Ce sondage se termine dans {heures} heures. Bon vote!", }, "vote": "<@{id_auteur}> votre vote a bien été pris en compte", "result": { - "text":"Voici les résultats pour le sondage" + "text": "Voici les résultats pour le sondage" } }, },