bot-base/modules/errors/__init__.py

110 lines
4.1 KiB
Python

import asyncio
import time
import datetime
import random
import traceback
import collections
import discord
from discord import Message
from modules.base import BaseClassPython
class MainClass(BaseClassPython):
name = "errors"
description = "Error handling"
interactive = True
authorized_users = [431043517217898496]
authorized_roles = []
color = 0xdb1348
help = {
"description": "Montre toutes les erreurs du bot dans discord.",
"commands": {
"`{prefix}{command}`": "Renvoie une erreur de test.",
}
}
command_text = "unicorn"
def __init__(self, client):
super().__init__(client)
self.config.init({"dev_chan": [], "memes": [""], "icon": ""})
self.errorsDeque = None
async def on_ready(self):
if self.objects.save_exists('errorsDeque'):
self.errorsDeque = self.objects.load_object('errorsDeque')
else:
self.errorsDeque = collections.deque()
for i in range(len(self.errorsDeque)):
try:
msg_id = self.errorsDeque.popleft()
channel = self.client.get_channel(msg_id["channel_id"])
to_delete = await channel.fetch_message(msg_id["msg_id"])
await to_delete.delete()
except:
raise
self.objects.save_object('errorsDeque', self.errorsDeque)
async def command(self, message, args, kwargs):
raise Exception("KERNEL PANIC!!!")
async def on_error(self, event, *args, **kwargs):
"""Send error message"""
# Search first channel instance found in arg, then search in kwargs
channel = None
for arg in args:
if type(arg) == Message:
channel = arg.channel
break
if type(arg) == discord.TextChannel:
channel = arg
break
if channel is None:
for _, v in kwargs.items():
if type(v) == discord.Message:
channel = v.channel
break
if type(v) == discord.TextChannel:
channel = v
break # Create embed
embed = discord.Embed(
title="[Erreur] Aïe :/",
description="```python\n{0}```".format(traceback.format_exc()),
color=self.color)
embed.set_image(url=random.choice(self.config["memes"]))
message_list = None
# Send message to dev channels
for chanid in self.config["dev_chan"]:
try:
await self.client.get_channel(chanid).send(
embed=embed.set_footer(text="Ce message ne s'autodétruira pas.", icon_url=self.config["icon"]))
except BaseException as e:
raise e
# Send message to current channel if exists
if channel is not None:
message = await channel.send(embed=embed.set_footer(text="Ce message va s'autodétruire dans une minute",
icon_url=self.config["icon"]))
msg_id = {"channel_id": message.channel.id, "msg_id": message.id}
self.errorsDeque.append(msg_id)
# Save message in errorsDeque now to keep them if a reboot happend during next 60 seconds
self.objects.save_object('errorsDeque', self.errorsDeque)
# Wait 60 seconds and delete message
await asyncio.sleep(60)
try:
channel = self.client.get_channel(msg_id["channel_id"])
delete_message = await channel.fetch_message(msg_id["msg_id"])
await delete_message.delete()
except:
raise
finally:
try:
self.errorsDeque.remove(msg_id)
except ValueError:
pass
# Save now to avoid deleting unkown message
self.objects.save_object('errorsDeque', self.errorsDeque)