from pyforgejo import AuthenticatedClient from pyforgejo.api.miscellaneous import get_version import discord from discord.ext import commands import json import logging import os from typing import TypedDict class BotConfiguration(TypedDict): instanceApiUrl: str token: str forgejoApiToken: str noreplyEmail: str log = logging.getLogger("nijika") cogs = ("cogs.core", "cogs.user", "cogs.org", "cogs.repo") class Nijika(commands.Bot): """Nijika my beloved <3""" def __init__(self): self.configuration: BotConfiguration = json.load(open("config.json")) self.forgejoClient: AuthenticatedClient = AuthenticatedClient( base_url=self.configuration["instanceApiUrl"], raise_on_unexpected_status=True, follow_redirects=True, token=self.configuration["forgejoApiToken"]) self.accent_color = 0xecd97a self.error_color = 0xbb3955 super().__init__( command_prefix="=", # unused intents=discord.Intents.default(), allowed_mentions=discord.AllowedMentions( everyone=False, users=False, roles=False)) async def checkConnectivity(self): """Checks connectivity to Instance's Forgejo API""" log.info("Checking connectivity to Forgejo API") resp = await get_version.asyncio_detailed(client=self.forgejoClient) log.info("Forgejo version: %s", json.loads(resp.content)["version"]) async def setup_hook(self): await self.checkConnectivity() async def on_ready(self): for cog in cogs: try: await self.load_extension(cog) except Exception: log.exception("Cannot load cog: %s", cog) if not os.path.exists(".initDone"): log.info("Initializing first run hooks.") # this bot fully uses slash commands. sync them on # first run await self.tree.sync() open(".initDone", "w").write("") log.info("Done.") log.info("Bot %s (%d) is up and running!", self.user, self.user.id) log.info("Invite the bot to your server: %s", discord.utils.oauth_url(self.application_id, permissions=discord.Permissions( send_messages=True, embed_links=True, attach_files=True ))) async def start(self): """Start up Codeijika""" await super().start(self.configuration["token"]) async def stop(self): """Stop Codeijika""" await self.close()