import discord from discord.colour import Color from discord.ext import commands, tasks import sys import json from typing import Any, Dict, List, Sequence from discord import Message from discord.ext.commands.errors import ( ExtensionAlreadyLoaded, ExtensionFailed, ExtensionNotFound, NoEntryPointError, ) class ChristmasBot(commands.Bot): def __init__(self, config: Dict[Any, Any]): intents = discord.Intents( voice_states=True, guild_messages=True, guilds=True, messages=True ) self.rpc_is_help_message = True self.update_status.start() self.config = config self.initial_cog_names: List[str] = self.config.get("cogs", []) self.colors: Dict[str, Color] = self.process_colours(config.get("colors", [])) self.invite_link: str = "" super().__init__( command_prefix=self.prefix_callable, description=self.config["info"].get("description", ""), case_insensitive=False, fetch_offline_members=False, intents=intents, slash_commands=True, slash_command_guilds=[227431704426446848], ) self.loop.create_task(self.async_init()) async def async_init(self): await self.load_cogs(self.initial_cog_names) async def prefix_callable(self, _, msg: Message) -> List[str]: return commands.when_mentioned_or(*self.config["prefixes"])(self, msg) async def load_cogs(self, cog_names: Sequence[str]): for cog in cog_names: try: self.load_extension(cog) print(f"Succesfully loaded extension {cog}.") except ( ExtensionNotFound, ExtensionAlreadyLoaded, NoEntryPointError, ExtensionFailed, ) as e: print(f"Failed to load extension {cog}.\n\t{e}", file=sys.stderr) async def on_ready(self): self.invite_link = f"https://discord.com/oauth2/authorize?client_id={self.user.id}&permissions=3230720&scope=bot%20applications.commands" print(f"Logged in as: {self.user}") print(f"Version: {discord.__version__}") print(f"Invite: {self.invite_link}") def process_colours(self, colors: Dict[str, str]) -> Dict[str, Color]: colour_dict: Dict[str, Color] = {} for name, color in colors.items(): colour_dict[name] = Color(int(color, 16)) return colour_dict @tasks.loop(seconds=20) async def update_status(self): await self.wait_until_ready() title = "ck!connect | ck!help" if self.rpc_is_help_message: title = "Tfoe broer" self.rpc_is_help_message = not self.rpc_is_help_message await self.change_presence(activity=discord.Game(title)) if __name__ == "__main__": try: import uvloop uvloop.install() print("Succesfully initialized uvloop") except ModuleNotFoundError: pass config = json.load(open("config.json", "r", encoding="utf-8")) token = config.pop("token") ChristmasBot(config).run(token, reconnect=True)