-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
130 lines (92 loc) · 3.16 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# DEPENDENCIAS ################################################################
# fmt: off
from dotenv import load_dotenv # noqa E402
load_dotenv(override=True)
import config as cfg # noqa E402
import logging
logger = logging.getLogger("main")
import discord as ds # noqa E402
from discord.ext import commands, tasks # noqa E402
import mongoengine as mongo # noqa E402
from colecciones import Espacios
import requests
from utils import ( # noqa E402
ERRORES,
array_natural,
actualizar_presencia,
attr2dict
)
# fmt: on
# INICIALIZACIÓN ##############################################################
# Comando de ayuda personalizado que hereda del comando por defecto.
class Ayuda(commands.DefaultHelpCommand):
pass
# Conexión a la base de datos.
mongo.connect(db=cfg.DB_NAME, host=cfg.MONGODB_URI)
bot = ds.Bot(
command_prefix=["."],
intents=ds.Intents.all(),
debug_guilds=cfg.DEBUG_GUILDS,
)
# Cargar extensiones por defecto
for ext in cfg.EXT_DEFAULT:
bot.load_extension(f"{cfg.EXT}.{ext}")
# MONITOREO ###################################################################
@tasks.loop(minutes=5)
async def heartbeat():
if bot.is_closed():
logger.error("La conexión a Discord está cerrada")
return
r = requests.post(cfg.HEARTBEAT_URL)
if r.status_code == 200:
logger.debug("Heartbeat enviado.")
else:
logger.error(f"Error al enviar heartbeat: {r.status_code}")
r.close()
# EVENTOS #####################################################################
@bot.event
async def on_ready():
logger.info(f"Sesión iniciada como {bot.user} (ID: {bot.user.id})")
if cfg.HEARTBEAT_URL:
try:
heartbeat.start() # Iniciar monitoreo al iniciar sesión
except Exception as e:
logger.error(e)
await actualizar_presencia(bot)
@bot.event
async def on_resume():
await actualizar_presencia(bot)
@bot.event
async def on_guild_join(guild: ds.Guild):
espacio = Espacios.objects(_id=guild.id).first()
if not espacio:
espacio = Espacios(_id=guild.id)
espacio.save()
logger.info(f'Espacio "{guild.name}" añadido a la base de datos')
else:
logger.info(f'El espacio "{guild.name}" ya estaba en la base de datos')
"""
¿Debería eliminar todos los datos de la base de datos o eso debería ser un
comando (por ejemplo, `restablecer_bot`)?
Respuesta: comando
"""
@bot.event
async def on_command_error(ctx, error):
# TODO: Traducir todos los errores.
# await ctx.send(error)
logger.debug(error) # debug
try:
await ctx.respond(ERRORES[error.__class__.__name__].format(**attr2dict(error)))
except Exception as e:
logger.debug(e) # debug
@bot.event
async def on_application_error(ctx, error):
logger.debug(error) # debug
try:
await ctx.respond(ERRORES[error.__class__.__name__].format(**attr2dict(error)))
except Exception as e:
logger.debug(e) # debug
# EJECUCIÓN ###################################################################
bot.run(cfg.BOT_TOKEN)
logger.info("Ejecutado: main.py")
# EOF #########################################################################