import asyncio import collections import os.path import pickle import random import traceback from subprocess import call import discord moduleFiles = "errors" class MainClass(): def saveObject(self, object, objectname): with open("storage/%s/" % moduleFiles + objectname + "tmp", "wb") as pickleFile: pickler = pickle.Pickler(pickleFile) pickler.dump(object) call(['mv', "storage/%s/" % moduleFiles + objectname + "tmp", "storage/%s/" % moduleFiles + objectname]) def loadObject(self, objectname): if self.saveExists(objectname): with open("storage/%s/" % moduleFiles + objectname, "rb") as pickleFile: unpickler = pickle.Unpickler(pickleFile) return unpickler.load() def saveExists(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.devchanids = [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://moriya.zapto.org/avatars/5?s=140" 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.authlist = [] self.color = 0xdb1348 self.help = """\ licorne => Crée une erreur. """ async def on_ready(self): if self.saveExists('errorsDeque'): self.errorsDeque = self.loadObject('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.saveObject(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)) messagelst = 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)) messagelst = [message.channel.id, message.id] self.errorsDeque.append(messagelst) except: try: message = args[1].channel.send( embed=embed.set_footer(text="Ce message s'autodétruira dans une minute.", icon_url=self.icon)) messagelst = [message.channel.id, message.id] self.errorsDeque.append(messagelst) except: pass for chanid in self.devchanids: 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.saveObject(self.errorsDeque, 'errorsDeque') await asyncio.sleep(60) try: channel = self.client.get_channel(messagelst[0]) delete_message = await channel.get_message(messagelst[1]) await delete_message.delete() except: raise finally: try: self.errorsDeque.remove(messagelst) except: pass self.saveObject(self.errorsDeque, 'errorsDeque')