1
Fork 0
mirror of https://github.com/wlinator/luminara.git synced 2024-10-02 18:03:12 +00:00
Lumi/main.py

148 lines
4.1 KiB
Python

import os
import discord
from dotenv import load_dotenv
from handlers import LoggingHandler, ErrorHandler
from handlers.ReactionHandler import ReactionHandler
from handlers.XPHandler import XPHandler
from lib.embeds.greet import Greet
from services.Client import RacuBot
from services.GuildConfig import GuildConfig
from services.Help import RacuHelp
load_dotenv('.env')
instance = os.getenv("INSTANCE")
def get_prefix(bot, message):
try:
return GuildConfig.get_prefix(message.guild.id)
except AttributeError:
return "."
client = RacuBot(
owner_id=int(os.getenv('OWNER_ID')),
command_prefix=get_prefix,
intents=discord.Intents.all(),
status=discord.Status.online,
help_command=RacuHelp()
)
logs = LoggingHandler.setup_logger()
@client.listen()
async def on_message(message):
if (
message.author.bot or
message.guild is None or
instance.lower() != "main"
):
return
try:
xp_handler = XPHandler()
await xp_handler.process_xp(message)
reaction_handler = ReactionHandler()
await reaction_handler.handle_message(message)
except Exception as error:
logs.error(f"[EventHandler] on_message (check debug log): {error}", exc_info=False)
logs.debug(f"[EventHandler] on_message (w/ stacktrace): {error}", exc_info=True)
@client.event
async def on_member_join(member):
config = GuildConfig(member.guild.id)
if (not config.welcome_channel_id
# comment next line if debugging greetings
or instance.lower() != "main"
):
return
embed = Greet.message(member, config.welcome_message)
try:
await member.guild.get_channel(config.welcome_channel_id).send(embed=embed, content=member.mention)
except Exception as e:
logs.info(f"[GreetingHandler] Message not sent in '{member.guild.name}'. Channel ID may be invalid. {e}")
@client.listen()
async def on_command_completion(ctx) -> None:
"""
This code is executed when a slash_command has been successfully executed.
This technically serves as a CommandHandler function
:param ctx:
:return:
"""
full_command_name = ctx.command.qualified_name
split = full_command_name.split(" ")
executed_command = str(split[0])
if ctx.guild is not None:
# logs.info(
# f"Executed {executed_command} command in {ctx.guild.name} (ID: {ctx.guild.id}) "
# f"by {ctx.author} (ID: {ctx.author.id})"
# )
logs.info(f"[CommandHandler] {ctx.author.name} successfully did \"/{executed_command}\". "
f"| guild: {ctx.guild.name} ")
else:
# logs.info(
# f"Executed {executed_command} command by {ctx.author} (ID: {ctx.author.id}) in DMs."
# )
logs.info(f"[CommandHandler] {ctx.author.name} successfully did \"/{executed_command}\". | direct message")
@client.listen()
async def on_command_error(ctx, error) -> None:
await ErrorHandler.on_command_error(ctx, error)
@client.listen()
async def on_application_command_error(ctx, error) -> None:
await ErrorHandler.on_command_error(ctx, error)
@client.event
async def on_error(event: str, *args, **kwargs) -> None:
await ErrorHandler.on_error(event, *args, **kwargs)
def load_modules():
module_list = [d for d in os.listdir("modules") if os.path.isdir(os.path.join("modules", d))]
loaded_modules = set()
for module in module_list:
if module in loaded_modules:
continue # module is already loaded
try:
client.load_extension(f"modules.{module}")
loaded_modules.add(module)
logs.info(f"[MODULE] {module.upper()} loaded.")
except Exception as e:
logs.error(f"[MODULE] Failed to load module {module.upper()}: {e}")
if __name__ == '__main__':
"""
This code is only ran when main.py is the primary module,
thus NOT when main is imported from a cog. (sys.modules)
"""
logs.info("RACU IS BOOTING")
logs.info("\n")
load_modules()
# empty line to separate modules from system info in logs
logs.info("\n")
client.run(os.getenv('TOKEN'))