import asyncio import collections import os.path import pickle import random import traceback from subprocess import call import discord moduleFiles = "errors" class MainClass: def save_object(self, object_instance, object_name): with open("storage/%s/" % moduleFiles + object_name + "tmp", "wb") as pickleFile: pickler = pickle.Pickler(pickleFile) pickler.dump(object_instance) call(['mv', "storage/%s/" % moduleFiles + object_name + "tmp", "storage/%s/" % moduleFiles + object_name]) def load_object(self, objectname): if self.save_exists(objectname): with open("storage/%s/" % moduleFiles + objectname, "rb") as pickleFile: unpickler = pickle.Unpickler(pickleFile) return unpickler.load() def save_exists(self, objectname): return os.path.isfile("storage/%s/" % moduleFiles + objectname) def __init__(self, client, modules, owners, prefix): if not os.path.isdir("storage/%s" % moduleFiles): call(['mkdir', 'storage/%s' % moduleFiles]) self.errorsDeque = None self.developpement_chan_id = [549662392120901633] self.memes = [ "https://cdn.discordapp.com/avatars/436105272310759426/6e6850c03fba976f45295a76410a6699.png?size=64", "https://cdn.discordapp.com/avatars/281166473102098433/6e92bff42c9f409334e1580c9f666228.png?size=64", "https://cdn.discordapp.com/avatars/318866596502306816/8e1792132f5b9ceaca6f7aea1fd489f0.png?size=64" ] self.icon = "https://cdn.discordapp.com/attachments/340620490009739265/431569015664803840/photo.png" self.client = client self.modules = modules self.owners = owners self.prefix = prefix self.events = ['on_error', 'on_message', 'on_ready'] # events list self.command = "%slicorne" % self.prefix # command prefix (can be empty to catch every single messages) self.name = "Error Handling" self.description = "Module de gestions des erreurs" self.interactive = True self.super_users_list = [431043517217898496] self.color = 0xdb1348 self.help = """\ licorne => Crée une erreur. """ async def on_ready(self): if self.save_exists('errorsDeque'): self.errorsDeque = self.load_object('errorsDeque') else: self.errorsDeque = collections.deque() for i in range(len(self.errorsDeque)): try: messagelst = self.errorsDeque.popleft() channel = self.client.get_channel(messagelst[0]) delete_message = await channel.get_message(messagelst[1]) await delete_message.delete() except: raise self.save_object(self.errorsDeque, 'errorsDeque') async def on_message(self, message): 5 / 0 async def on_error(self, event, *args, **kwargs): embed = discord.Embed(title="Aïe :/", description="```PYTHON\n{0}```".format(traceback.format_exc()), color=self.color).set_image(url=random.choice(self.memes)) message_list = None try: message = await args[0].channel.send( embed=embed.set_footer(text="Ce message s'autodétruira dans une minute.", icon_url=self.icon)) message_list = [message.channel.id, message.id] self.errorsDeque.append(message_list) except: try: message = args[1].channel.send( embed=embed.set_footer(text="Ce message s'autodétruira dans une minute.", icon_url=self.icon)) message_list = [message.channel.id, message.id] self.errorsDeque.append(message_list) except: pass for chanid in self.developpement_chan_id: try: await self.client.get_channel(chanid).send( embed=embed.set_footer(text="Ce message ne s'autodétruira pas.", icon_url=self.icon)) except: pass self.save_object(self.errorsDeque, 'errorsDeque') await asyncio.sleep(60) try: channel = self.client.get_channel(message_list[0]) delete_message = await channel.get_message(message_list[1]) await delete_message.delete() except: raise finally: try: self.errorsDeque.remove(message_list) except ValueError: pass self.save_object(self.errorsDeque, 'errorsDeque')