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]):
|
|
|
|
from .db import JimmyBans, registry
|
|
|
|
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,
|
|
|
|
)
|
|
|
|
self.loop.run_until_complete(registry.create_all())
|
|
|
|
self.training_lock = Lock()
|
|
|
|
self.started_at = datetime.now(tz=timezone.utc)
|
|
|
|
self.bans = JimmyBans()
|
|
|
|
self.console = console
|
|
|
|
for ext in extensions:
|
|
|
|
try:
|
|
|
|
self.load_extension(ext)
|
|
|
|
except discord.ExtensionFailed as e:
|
|
|
|
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:
|
|
|
|
if getattr(self, "web", None) is not None:
|
|
|
|
await self.http.close()
|
|
|
|
self.console.log("Closing web server...")
|
|
|
|
await self.web["server"].shutdown()
|
|
|
|
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
|
|
|
|
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",
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
bot = Bot(_intents, config.guilds, _extensions)
|