college-bot-v1/utils/client.py

106 lines
3.3 KiB
Python
Raw Normal View History

2023-02-23 10:29:30 +00:00
import asyncio
import sys
2023-02-22 15:17:53 +00:00
import discord
import config
from asyncio import Lock
from discord.ext import commands
from datetime import datetime, timezone
2023-02-23 10:29:30 +00:00
from typing import Optional, Dict, TYPE_CHECKING, Union
if TYPE_CHECKING:
from uvicorn import Server, Config
from asyncio import Task
2023-02-22 15:17:53 +00:00
__all__ = ("Bot", 'bot')
# noinspection PyAbstractClass
class Bot(commands.Bot):
2023-02-23 10:29:30 +00:00
if TYPE_CHECKING:
web: Optional[Dict[str, Union[Server, Config, Task]]]
2023-02-22 15:17:53 +00:00
def __init__(self, intents: discord.Intents, guilds: list[int], extensions: list[str]):
2023-04-02 17:02:26 +01:00
from .db import registry
2023-02-22 15:17:53 +00:00
from .console import console
super().__init__(
2023-02-23 11:08:57 +00:00
command_prefix=commands.when_mentioned_or("h!", "r!"),
2023-02-22 15:17:53 +00:00
debug_guilds=guilds,
allowed_mentions=discord.AllowedMentions.none(),
intents=intents,
2023-04-18 17:43:45 +01:00
max_messages=5000
2023-02-22 15:17:53 +00:00
)
self.loop.run_until_complete(registry.create_all())
self.training_lock = Lock()
self.started_at = datetime.now(tz=timezone.utc)
self.console = console
2023-04-02 17:02:26 +01:00
self.incidents = {}
2023-02-22 15:17:53 +00:00
for ext in extensions:
try:
self.load_extension(ext)
2023-05-02 14:48:55 +01:00
except (discord.ExtensionNotFound, discord.ExtensionFailed, OSError) as e:
2023-02-22 15:17:53 +00:00
console.log(f"[red]Failed to load extension {ext}: {e}")
if getattr(config, "dev", False):
console.print_exception()
else:
console.log(f"Loaded extension [green]{ext}")
if getattr(config, "CONNECT_MODE", None) == 2:
async def connect(self, *, reconnect: bool = True) -> None:
self.console.log("Exit target 2 reached, shutting down (not connecting to discord).")
return
2023-02-23 16:06:35 +00:00
async def on_error(self, event: str, *args, **kwargs):
e_type, e, tb = sys.exc_info()
2023-02-23 16:12:07 +00:00
if isinstance(e, discord.CheckFailure) and 'The global check once functions failed.' in str(e):
2023-02-23 16:06:35 +00:00
return
await super().on_error(event, *args, **kwargs)
2023-02-23 10:29:30 +00:00
async def close(self) -> None:
2023-02-24 08:40:25 +00:00
await self.http.close()
2023-02-23 10:29:30 +00:00
if getattr(self, "web", None) is not None:
self.console.log("Closing web server...")
await self.web["server"].shutdown()
2023-03-22 15:57:10 +00:00
if hasattr(self, "web"):
self.web["task"].cancel()
self.console.log("Web server closed.")
try:
await self.web["task"]
except asyncio.CancelledError:
pass
del self.web["server"]
del self.web["config"]
del self.web["task"]
del self.web
2023-02-23 10:29:30 +00:00
try:
2023-02-23 14:12:59 +00:00
await super().close()
2023-02-23 10:29:30 +00:00
except asyncio.TimeoutError:
self.console.log("Timed out while closing, forcing shutdown.")
sys.exit(1)
self.console.log("Finished shutting down.")
2023-02-22 15:17:53 +00:00
try:
from config import intents as _intents
except ImportError:
_intents = discord.Intents.all()
try:
from config import extensions as _extensions
except ImportError:
_extensions = [
"jishaku",
"cogs.verify",
"cogs.mod",
"cogs.events",
"cogs.assignments",
"cogs.timetable",
"cogs.other",
"cogs.starboard",
"cogs.uptime",
2023-05-02 14:47:04 +01:00
# "cogs.voice"
2023-02-22 15:17:53 +00:00
]
bot = Bot(_intents, config.guilds, _extensions)