112 lines
4 KiB
Python
112 lines
4 KiB
Python
"""Main JARVIS package."""
|
|
import logging
|
|
from functools import partial
|
|
from typing import Any
|
|
|
|
import aioredis
|
|
import jurigged
|
|
import rook
|
|
from jarvis_core.db import connect
|
|
from jarvis_core.log import get_logger
|
|
from naff import Intents
|
|
|
|
from jarvis import const
|
|
from jarvis.client import Jarvis
|
|
from jarvis.cogs import __path__ as cogs_path
|
|
from jarvis.config import JarvisConfig
|
|
from jarvis.utils import get_extensions
|
|
|
|
__version__ = const.__version__
|
|
|
|
|
|
def jlogger(logger: logging.Logger, event: Any) -> None:
|
|
"""
|
|
Logging for jurigged
|
|
|
|
Args:
|
|
logger: Logger to use
|
|
event: Event to parse
|
|
"""
|
|
jlog = partial(logger.log, 11)
|
|
if isinstance(event, jurigged.live.WatchOperation):
|
|
jlog(f"[bold]Watch[/] {event.filename}", extra={"markup": True})
|
|
elif isinstance(event, jurigged.codetools.AddOperation):
|
|
event_str = f"{event.defn.parent.dotpath()}:{event.defn.stashed.lineno}"
|
|
if isinstance(event.defn, jurigged.codetools.LineDefinition):
|
|
event_str += f" | {event.defn.text}"
|
|
jlog(
|
|
f"[bold green]Run[/] {event_str}",
|
|
extra={"markup": True},
|
|
)
|
|
else:
|
|
jlog(f"[bold green]Add[/] {event_str}", extra={"markup": True})
|
|
elif isinstance(event, jurigged.codetools.UpdateOperation):
|
|
if isinstance(event.defn, jurigged.codetools.FunctionDefinition):
|
|
event_str = f"{event.defn.parent.dotpath()}:{event.defn.stashed.lineno}"
|
|
jlog(f"[bold yellow]Update[/] {event_str}", extra={"markup": True})
|
|
elif isinstance(event, jurigged.codetools.DeleteOperation):
|
|
event_str = f"{event.defn.parent.dotpath()}:{event.defn.stashed.lineno}"
|
|
if isinstance(event.defn, jurigged.codetools.LineDefinition):
|
|
event_str += f" | {event.defn.text}"
|
|
jlog(f"[bold red]Delete[/] {event_str}", extra={"markup": True})
|
|
elif isinstance(event, (Exception, SyntaxError)):
|
|
logger.exception("Jurigged encountered error", exc_info=True)
|
|
else:
|
|
jlog(event)
|
|
|
|
|
|
async def run() -> None:
|
|
"""Run JARVIS"""
|
|
# Configure logger
|
|
jconfig = JarvisConfig.from_yaml()
|
|
logger = get_logger("jarvis", show_locals=False) # jconfig.log_level == "DEBUG")
|
|
logger.setLevel(jconfig.log_level)
|
|
file_handler = logging.FileHandler(filename="jarvis.log", encoding="UTF-8", mode="w")
|
|
file_handler.setFormatter(
|
|
logging.Formatter("[%(asctime)s] [%(name)s] [%(levelname)8s] %(message)s")
|
|
)
|
|
logger.addHandler(file_handler)
|
|
|
|
# Configure client
|
|
intents = (
|
|
Intents.DEFAULT | Intents.MESSAGES | Intents.GUILD_MEMBERS | Intents.GUILD_MESSAGE_CONTENT
|
|
)
|
|
redis_config = jconfig.redis.copy()
|
|
redis_host = redis_config.pop("host")
|
|
|
|
redis = await aioredis.from_url(redis_host, decode_responses=True, **redis_config)
|
|
|
|
jarvis = Jarvis(
|
|
intents=intents,
|
|
sync_interactions=jconfig.sync,
|
|
delete_unused_application_cmds=True,
|
|
send_command_tracebacks=False,
|
|
redis=redis,
|
|
logger=logger,
|
|
)
|
|
|
|
# External modules
|
|
if jconfig.log_level == "DEBUG":
|
|
logging.addLevelName(11, "\033[35mJURIG\033[0m ")
|
|
jurigged.watch(pattern="jarvis/*.py", logger=partial(jlogger, logger))
|
|
if jconfig.rook_token:
|
|
rook.start(token=jconfig.rook_token, labels={"env": "dev"})
|
|
|
|
# Initialize bot
|
|
logger.info("Starting JARVIS")
|
|
logger.debug("Connecting to database")
|
|
connect(**jconfig.mongo["connect"], testing=jconfig.mongo["database"] != "jarvis")
|
|
logger.debug("Loading configuration from database")
|
|
# jconfig.get_db_config()
|
|
|
|
# Load extensions
|
|
logger.debug("Loading extensions")
|
|
for extension in get_extensions(cogs_path):
|
|
jarvis.load_extension(extension)
|
|
logger.debug("Loaded %s", extension)
|
|
logger.debug("Loading nafftrack")
|
|
jarvis.load_extension("nafftrack.extension")
|
|
|
|
jarvis.max_messages = jconfig.max_messages
|
|
logger.debug("Running JARVIS")
|
|
await jarvis.astart(jconfig.token)
|