mirror of
https://github.com/wlinator/luminara.git
synced 2024-10-02 20:23:12 +00:00
Merge pull request 'loguru' (#85) from loguru into main
Reviewed-on: #85
This commit is contained in:
commit
767833dd99
23 changed files with 159 additions and 174 deletions
16
Client.py
16
Client.py
|
@ -1,24 +1,20 @@
|
|||
import logging
|
||||
import os
|
||||
import platform
|
||||
from loguru import logger
|
||||
|
||||
import discord
|
||||
from discord.ext import bridge
|
||||
|
||||
from lib import metadata
|
||||
|
||||
logs = logging.getLogger('Lumi.Core')
|
||||
|
||||
|
||||
class LumiBot(bridge.Bot):
|
||||
async def on_ready(self):
|
||||
logs.info("-------------------------------------------------------")
|
||||
logs.info(f"[INFO] {metadata.__title__} v{metadata.__version__}")
|
||||
logs.info(f"[INFO] Logged in with ID {self.user.id}")
|
||||
logs.info(f"[INFO] discord.py API version: {discord.__version__}")
|
||||
logs.info(f"[INFO] Python version: {platform.python_version()}")
|
||||
logs.info(f"[INFO] Running on: {platform.system()} {platform.release()} ({os.name})")
|
||||
logs.info("-------------------------------------------------------")
|
||||
logger.info(f"{metadata.__title__} v{metadata.__version__}")
|
||||
logger.info(f"Logged in with ID {self.user.id}")
|
||||
logger.info(f"discord.py API version: {discord.__version__}")
|
||||
logger.info(f"Python version: {platform.python_version()}")
|
||||
logger.info(f"Running on: {platform.system()} {platform.release()} ({os.name})")
|
||||
|
||||
"""
|
||||
https://docs.pycord.dev/en/stable/api/events.html#discord.on_ready
|
||||
|
|
25
Luminara.py
25
Luminara.py
|
@ -1,14 +1,25 @@
|
|||
import os
|
||||
import sys
|
||||
|
||||
import discord
|
||||
from loguru import logger
|
||||
|
||||
import Client
|
||||
import config.parser
|
||||
import services.config_service
|
||||
import services.help_service
|
||||
import services.logging_service
|
||||
|
||||
_logs = services.logging_service.setup_logger()
|
||||
# Remove the default logger configuration
|
||||
logger.remove()
|
||||
|
||||
# Add a new logger configuration with colors and a short datetime format
|
||||
log_format = (
|
||||
"<green>{time:YY-MM-DD HH:mm:ss}</green> | "
|
||||
"<level>{level: <8}</level> | "
|
||||
# "<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - "
|
||||
"<level>{message}</level>"
|
||||
)
|
||||
logger.add(sys.stdout, format=log_format, colorize=True, level="DEBUG")
|
||||
|
||||
|
||||
async def get_prefix(bot, message):
|
||||
|
@ -46,10 +57,10 @@ def load_modules():
|
|||
try:
|
||||
client.load_extension(f"{directory}.{item}")
|
||||
loaded.add(item)
|
||||
_logs.info(f'[{directory.capitalize()}] {item.upper()} loaded.')
|
||||
logger.debug(f'{item.upper()} loaded.')
|
||||
|
||||
except Exception as e:
|
||||
_logs.error(f'[{directory.capitalize()}] Failed to load {item.upper()}: {e}')
|
||||
logger.error(f'Failed to load {item.upper()}: {e}')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
@ -58,8 +69,7 @@ if __name__ == '__main__':
|
|||
so NOT when main is imported from a cog. (sys.modules)
|
||||
"""
|
||||
|
||||
_logs.info("LUMI IS BOOTING")
|
||||
_logs.info("\n")
|
||||
logger.info("LUMI IS BOOTING")
|
||||
|
||||
# cache all JSON
|
||||
[config.parser.JsonCache.read_json(file[:-5]) for file in os.listdir("config/JSON") if file.endswith(".json")]
|
||||
|
@ -67,7 +77,4 @@ if __name__ == '__main__':
|
|||
# load command and listener cogs
|
||||
load_modules()
|
||||
|
||||
# empty line to separate modules from system info in logs
|
||||
_logs.info("\n")
|
||||
|
||||
client.run(os.environ.get('LUMI_TOKEN'))
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
import json
|
||||
import logging
|
||||
|
||||
logs = logging.getLogger('Lumi.Core')
|
||||
from loguru import logger
|
||||
|
||||
|
||||
class JsonCache:
|
||||
|
@ -13,6 +11,6 @@ class JsonCache:
|
|||
if path not in JsonCache._cache:
|
||||
with open(f"config/JSON/{path}.json", 'r') as file:
|
||||
JsonCache._cache[path] = json.load(file)
|
||||
logs.info(f"[JsonParser] {path}.json was loaded and cached.")
|
||||
logger.debug(f"{path}.json was loaded and cached.")
|
||||
|
||||
return JsonCache._cache[path]
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
import logging
|
||||
from loguru import logger
|
||||
import os
|
||||
|
||||
import mariadb
|
||||
|
||||
_logs = logging.getLogger('Lumi.Core')
|
||||
|
||||
|
||||
def create_connection_pool(name: str, size: int) -> mariadb.ConnectionPool:
|
||||
pool = mariadb.ConnectionPool(
|
||||
|
@ -23,7 +21,7 @@ def create_connection_pool(name: str, size: int) -> mariadb.ConnectionPool:
|
|||
try:
|
||||
_cnxpool = create_connection_pool("core-pool", 25)
|
||||
except mariadb.Error as e:
|
||||
_logs.critical(f"[CRITICAL] Couldn't create MariaDB connection pool: {e}")
|
||||
logger.critical(f"Couldn't create the MariaDB connection pool: {e}")
|
||||
raise e
|
||||
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import logging
|
||||
import sys
|
||||
import traceback
|
||||
from loguru import logger
|
||||
|
||||
import discord
|
||||
from discord.ext import commands
|
||||
|
@ -9,8 +9,6 @@ from discord.ext.commands import Cog
|
|||
from lib.embeds.error import GenericErrors, BdayErrors
|
||||
from lib.exceptions import LumiExceptions
|
||||
|
||||
_logs = logging.getLogger('Lumi.Core')
|
||||
|
||||
|
||||
async def on_command_error(ctx, error):
|
||||
if isinstance(error, commands.CommandNotFound):
|
||||
|
@ -55,12 +53,12 @@ async def on_command_error(ctx, error):
|
|||
|
||||
else:
|
||||
await ctx.respond(embed=GenericErrors.default_exception(ctx))
|
||||
traceback.print_tb(error.__traceback__)
|
||||
logger.error(f"on_command_error: errors.command.{ctx.command.qualified_name} | user: {ctx.author.name}")
|
||||
|
||||
|
||||
async def on_error(event: str, *args, **kwargs) -> None:
|
||||
_logs.error(f"[EventHandler] on_error INFO: errors.event.{event} | '*args': {args} | '**kwargs': {kwargs}")
|
||||
_logs.error(f"[EventHandler] on_error EXCEPTION: {sys.exc_info()}")
|
||||
logger.exception(f"on_error INFO: errors.event.{event} | '*args': {args} | '**kwargs': {kwargs}")
|
||||
logger.exception(f"on_error EXCEPTION: {sys.exc_info()}")
|
||||
traceback.print_exc()
|
||||
|
||||
|
||||
|
@ -76,26 +74,32 @@ class ErrorListener(Cog):
|
|||
if not isinstance(error, LumiExceptions.NotAllowedInChannel):
|
||||
await on_command_error(ctx, error)
|
||||
|
||||
log_msg = '[CommandHandler] %s executed .%s | PREFIX' % (ctx.author.name, ctx.command.qualified_name)
|
||||
log_msg = '%s executed .%s' % (ctx.author.name, ctx.command.qualified_name)
|
||||
|
||||
if ctx.guild is not None:
|
||||
log_msg += f" | guild: {ctx.guild.name} "
|
||||
else:
|
||||
log_msg += f" | in DMs"
|
||||
log_msg += " in DMs"
|
||||
|
||||
_logs.info(f"{log_msg} | FAILED: {error}")
|
||||
# make error shorter than full screen width
|
||||
if len(str(error)) > 80:
|
||||
error = str(error)[:80] + "..."
|
||||
logger.warning(f"{log_msg} | FAILED: {error}")
|
||||
|
||||
@Cog.listener()
|
||||
async def on_application_command_error(self, ctx, error) -> None:
|
||||
await on_command_error(ctx, error)
|
||||
log_msg = '[CommandHandler] %s executed /%s | SLASH' % (ctx.author.name, ctx.command.qualified_name)
|
||||
log_msg = '%s executed /%s' % (ctx.author.name, ctx.command.qualified_name)
|
||||
|
||||
if ctx.guild is not None:
|
||||
log_msg += f" | guild: {ctx.guild.name} "
|
||||
else:
|
||||
log_msg += f" | in DMs"
|
||||
log_msg += " in DMs"
|
||||
|
||||
_logs.info(f"{log_msg} | FAILED: {error}")
|
||||
# make error shorter than full screen width
|
||||
if len(str(error)) > 80:
|
||||
error = str(error)[:80] + "..."
|
||||
logger.warning(f"{log_msg} | FAILED: {error}")
|
||||
|
||||
@Cog.listener()
|
||||
async def on_error(self, event: str, *args, **kwargs) -> None:
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
# noinspection PyInterpreter
|
||||
import logging
|
||||
from loguru import logger
|
||||
|
||||
from discord.ext.commands import Cog
|
||||
|
||||
|
@ -7,8 +6,6 @@ import lib.embeds.boost
|
|||
from lib.embeds.greet import Greet
|
||||
from services.config_service import GuildConfig
|
||||
|
||||
_logs = logging.getLogger('Lumi.Core')
|
||||
|
||||
|
||||
class EventHandler(Cog):
|
||||
def __init__(self, client):
|
||||
|
@ -26,7 +23,7 @@ class EventHandler(Cog):
|
|||
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}")
|
||||
logger.warning(f"Greet message not sent in '{member.guild.name}'. Channel ID may be invalid. {e}")
|
||||
|
||||
@Cog.listener()
|
||||
async def on_member_update(self, before, after):
|
||||
|
@ -45,25 +42,25 @@ class EventHandler(Cog):
|
|||
try:
|
||||
await member.guild.get_channel(config.boost_channel_id).send(embed=embed, content=member.mention)
|
||||
except Exception as e:
|
||||
_logs.info(f"[BoostHandler] Message not sent in '{member.guild.name}'. Channel ID may be invalid. {e}")
|
||||
logger.warning(f"Boost message not sent in '{member.guild.name}'. Channel ID may be invalid. {e}")
|
||||
|
||||
@Cog.listener()
|
||||
async def on_command_completion(self, ctx) -> None:
|
||||
log_msg = '[CommandHandler] %s executed .%s | PREFIX' % (ctx.author.name, ctx.command.qualified_name)
|
||||
log_msg = '%s executed .%s' % (ctx.author.name, ctx.command.qualified_name)
|
||||
|
||||
if ctx.guild is not None:
|
||||
_logs.info(f"{log_msg} | guild: {ctx.guild.name} ")
|
||||
logger.debug(f"{log_msg} | guild: {ctx.guild.name} ")
|
||||
else:
|
||||
_logs.info(f"{log_msg} | in DMs")
|
||||
logger.debug(f"{log_msg} in DMs")
|
||||
|
||||
@Cog.listener()
|
||||
async def on_application_command_completion(self, ctx) -> None:
|
||||
log_msg = '[CommandHandler] %s executed /%s | SLASH' % (ctx.author.name, ctx.command.qualified_name)
|
||||
log_msg = '%s executed /%s' % (ctx.author.name, ctx.command.qualified_name)
|
||||
|
||||
if ctx.guild is not None:
|
||||
_logs.info(f"{log_msg} | guild: {ctx.guild.name} ")
|
||||
logger.debug(f"{log_msg} | guild: {ctx.guild.name} ")
|
||||
else:
|
||||
_logs.info(f"{log_msg} | in DMs")
|
||||
logger.debug(f"{log_msg} in DMs")
|
||||
|
||||
|
||||
def setup(client):
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
import asyncio
|
||||
import logging
|
||||
import random
|
||||
import time
|
||||
|
||||
|
@ -13,7 +12,6 @@ from services.xp_service import XpService, XpRewardService
|
|||
|
||||
_strings = JsonCache.read_json("strings")
|
||||
_messages = JsonCache.read_json("levels")
|
||||
_logs = logging.getLogger('Lumi.Core')
|
||||
|
||||
|
||||
class XPHandler:
|
||||
|
|
|
@ -150,9 +150,14 @@ class MiscErrors:
|
|||
return embed
|
||||
|
||||
@staticmethod
|
||||
def intro_no_guild(ctx):
|
||||
def intro_no_guild(ctx, client_side=False):
|
||||
embed = clean_error_embed(ctx)
|
||||
embed.description += "you're not in a server that supports introductions."
|
||||
|
||||
if not client_side:
|
||||
embed.description += "you're not in a server that supports introductions."
|
||||
else:
|
||||
embed.description += "I'm not in a server that supports introductions."
|
||||
|
||||
embed.set_footer(text="this will be updated soon, stay tuned",
|
||||
icon_url=exclaim_icon)
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
from loguru import logger
|
||||
import asyncio
|
||||
import logging
|
||||
import random
|
||||
|
||||
import discord
|
||||
|
@ -12,7 +12,6 @@ from modules.birthdays import birthday
|
|||
from services.birthday_service import Birthday
|
||||
from services.config_service import GuildConfig
|
||||
|
||||
_logs = logging.getLogger('Lumi.Core')
|
||||
_data = JsonCache.read_json("birthday")
|
||||
_months = _data["months"]
|
||||
_messages = _data["birthday_messages"]
|
||||
|
@ -48,7 +47,7 @@ class Birthdays(commands.Cog):
|
|||
async def daily_birthday_check(self):
|
||||
|
||||
wait_time = time.seconds_until(7, 0)
|
||||
_logs.info(f"[BirthdayHandler] Waiting until 7 AM Eastern for daily check: {round(wait_time)}s")
|
||||
logger.debug(f"Waiting until 7 AM Eastern for the daily birthday check: {round(wait_time)}s left.")
|
||||
await asyncio.sleep(wait_time)
|
||||
|
||||
embed = discord.Embed(color=discord.Color.embed_background())
|
||||
|
@ -61,17 +60,17 @@ class Birthdays(commands.Cog):
|
|||
guild_config = GuildConfig(guild.id)
|
||||
|
||||
if not guild_config.birthday_channel_id:
|
||||
_logs.info(f"[BirthdayHandler] Guild with ID {guild.id} skipped: no birthday channel defined.")
|
||||
logger.debug(f"Birthday announcements in guild with ID {guild.id} skipped: no birthday channel.")
|
||||
return
|
||||
|
||||
message = random.choice(_messages)
|
||||
embed.description = message.format(member.name)
|
||||
channel = await self.client.get_or_fetch_channel(guild, guild_config.birthday_channel_id)
|
||||
await channel.send(embed=embed, content=member.mention)
|
||||
_logs.info(f"[BirthdayHandler] Success! user/guild/channel ID: {member.id}/{guild.id}/{channel.id}")
|
||||
logger.debug(f"Birthday announcement Success! user/guild/chan ID: {member.id}/{guild.id}/{channel.id}")
|
||||
|
||||
except Exception:
|
||||
_logs.info(f"[BirthdayHandler] Skipped processing user/guild {user_id}/{guild_id}")
|
||||
except Exception as e:
|
||||
logger.warning(f"Birthday announcement skipped processing user/guild {user_id}/{guild_id} | {e}")
|
||||
|
||||
# wait one second to avoid rate limits
|
||||
await asyncio.sleep(1)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import logging
|
||||
|
||||
|
||||
import discord
|
||||
from discord.commands import SlashCommandGroup
|
||||
|
@ -13,7 +13,6 @@ from modules.config import config, set_prefix, xp_reward
|
|||
from services.config_service import GuildConfig
|
||||
|
||||
strings = JsonCache.read_json("strings")
|
||||
logs = logging.getLogger('Lumi.Core')
|
||||
|
||||
|
||||
class Config(commands.Cog):
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import logging
|
||||
from loguru import logger
|
||||
import random
|
||||
from datetime import datetime
|
||||
|
||||
|
@ -14,7 +14,6 @@ from services.currency_service import Currency
|
|||
from services.stats_service import BlackJackStats
|
||||
|
||||
resources = JsonCache.read_json("resources")
|
||||
logs = logging.getLogger('Lumi.Core')
|
||||
est = pytz.timezone('US/Eastern')
|
||||
active_blackjack_games = {}
|
||||
|
||||
|
@ -170,7 +169,7 @@ async def cmd(ctx, bet: int):
|
|||
|
||||
except Exception as e:
|
||||
await ctx.respond(embed=GenericErrors.default_exception(ctx))
|
||||
logs.error("[CommandHandler] Something went wrong in the gambling command: ", e)
|
||||
logger.error("Something went wrong in the blackjack command: ", e)
|
||||
|
||||
finally:
|
||||
# remove player from active games list
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
import logging
|
||||
from datetime import datetime
|
||||
|
||||
import discord
|
||||
|
@ -7,8 +6,6 @@ from services.currency_service import Currency
|
|||
from services.daily_service import Dailies
|
||||
from services.xp_service import XpService
|
||||
|
||||
logs = logging.getLogger('Lumi.Core')
|
||||
|
||||
|
||||
async def cmd(ctx):
|
||||
xp_lb = XpService.load_leaderboard(ctx.guild.id)
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
import datetime
|
||||
|
||||
import discord
|
||||
from discord.commands import SlashCommandGroup
|
||||
from discord.ext import commands, bridge, tasks
|
||||
|
||||
from lib import checks
|
||||
from lib.embeds.info import MiscInfo
|
||||
from modules.config import set_prefix
|
||||
from modules.misc import introduction, invite, backup, info, xkcd
|
||||
from modules.misc import avatar, introduction, invite, backup, info, xkcd
|
||||
|
||||
|
||||
class Misc(commands.Cog):
|
||||
|
@ -18,7 +19,19 @@ class Misc(commands.Cog):
|
|||
|
||||
@tasks.loop(hours=1)
|
||||
async def do_backup(self):
|
||||
await backup.backup(self)
|
||||
await backup.backup()
|
||||
|
||||
@bridge.bridge_command(
|
||||
name="avatar",
|
||||
aliases=["av"],
|
||||
description="Get a user's avatar.",
|
||||
help="Get a user's avatar.",
|
||||
guild_only=True,
|
||||
)
|
||||
@commands.guild_only()
|
||||
@checks.allowed_in_channel()
|
||||
async def avatar(self, ctx, *, user: discord.Member | None = None):
|
||||
return await avatar.get_avatar(ctx, user)
|
||||
|
||||
@bridge.bridge_command(
|
||||
name="ping",
|
||||
|
|
58
modules/misc/avatar.py
Normal file
58
modules/misc/avatar.py
Normal file
|
@ -0,0 +1,58 @@
|
|||
from io import BytesIO
|
||||
|
||||
import discord
|
||||
import httpx
|
||||
from loguru import logger
|
||||
|
||||
client = httpx.AsyncClient()
|
||||
|
||||
|
||||
async def get_avatar(ctx, member: discord.Member | None = None) -> None:
|
||||
"""
|
||||
Get the avatar of a member.
|
||||
|
||||
Parameters:
|
||||
-----------
|
||||
interaction : discord.Interaction
|
||||
The discord interaction object.
|
||||
member : discord.Member
|
||||
The member to get the avatar of.
|
||||
"""
|
||||
if member is None:
|
||||
member = ctx.author
|
||||
|
||||
guild_avatar = member.guild_avatar.url if member.guild_avatar else None
|
||||
profile_avatar = member.avatar.url if member.avatar else None
|
||||
|
||||
files = [
|
||||
await create_avatar_file(avatar)
|
||||
for avatar in [guild_avatar, profile_avatar]
|
||||
if avatar
|
||||
]
|
||||
|
||||
if files:
|
||||
await ctx.respond(files=files)
|
||||
else:
|
||||
await ctx.respond(content="Member has no avatar.")
|
||||
|
||||
|
||||
async def create_avatar_file(url: str) -> discord.File:
|
||||
"""
|
||||
Create a discord file from an avatar url.
|
||||
|
||||
Parameters:
|
||||
-----------
|
||||
url : str
|
||||
The url of the avatar.
|
||||
|
||||
Returns:
|
||||
--------
|
||||
discord.File
|
||||
The discord file.
|
||||
"""
|
||||
response = await client.get(url, timeout=10)
|
||||
response.raise_for_status()
|
||||
image_data = response.content
|
||||
image_file = BytesIO(image_data)
|
||||
image_file.seek(0)
|
||||
return discord.File(image_file, filename="avatar.png")
|
|
@ -1,12 +1,10 @@
|
|||
import logging
|
||||
from loguru import logger
|
||||
import os
|
||||
import subprocess
|
||||
from datetime import datetime
|
||||
|
||||
import dropbox
|
||||
|
||||
logs = logging.getLogger('Lumi.Core')
|
||||
|
||||
oauth2_refresh_token = os.environ.get("LUMI_DBX_OAUTH2_REFRESH_TOKEN")
|
||||
app_key = os.environ.get("LUMI_DBX_APP_KEY")
|
||||
app_secret = os.environ.get("LUMI_DBX_APP_SECRET")
|
||||
|
@ -48,16 +46,16 @@ async def backup_cleanup():
|
|||
_dbx.files_delete_v2('/' + file)
|
||||
|
||||
|
||||
async def backup(self):
|
||||
async def backup():
|
||||
if instance.lower() == "main":
|
||||
logger.debug("Backing up the database.")
|
||||
try:
|
||||
await create_db_backup()
|
||||
await backup_cleanup()
|
||||
|
||||
logs.info("[BACKUP] database backup success.")
|
||||
logger.debug("The database was backed up successfully.")
|
||||
|
||||
except Exception as error:
|
||||
logs.error(f"[BACKUP] database backup failed. {error}")
|
||||
logs.info(f"[BACKUP] Dropbox failure: {error}")
|
||||
logger.error(f"database backup failed. {error}")
|
||||
else:
|
||||
logs.info("[BACKUP] No backup was made, instance not \"MAIN\".")
|
||||
logger.debug("No backup was made, instance not \"MAIN\".")
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import logging
|
||||
import os
|
||||
import platform
|
||||
from loguru import logger
|
||||
|
||||
import discord
|
||||
import psutil
|
||||
|
@ -10,7 +10,6 @@ from lib import metadata
|
|||
from services.currency_service import Currency
|
||||
from services.stats_service import BlackJackStats
|
||||
|
||||
_logs = logging.getLogger('Lumi.Core')
|
||||
_art = JsonCache.read_json("art")
|
||||
_data = JsonCache.read_json("resources")
|
||||
|
||||
|
@ -38,4 +37,4 @@ async def cmd(command, ctx, unix_timestamp):
|
|||
embed.add_field(name="API", value=f"v{discord.__version__}")
|
||||
embed.add_field(name="Database", value=f"{total_rows} records")
|
||||
|
||||
return await ctx.respond(embed=embed)
|
||||
await ctx.respond(embed=embed)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import asyncio
|
||||
import logging
|
||||
from loguru import logger
|
||||
|
||||
import discord
|
||||
|
||||
|
@ -9,7 +9,6 @@ from lib.embeds.error import MiscErrors, IntroErrors
|
|||
from lib.embeds.intro import General, Questions
|
||||
|
||||
resources = JsonCache.read_json("resources")
|
||||
logs = logging.getLogger('Lumi.Core')
|
||||
|
||||
|
||||
async def cmd(self, ctx: discord.ApplicationContext):
|
||||
|
@ -21,10 +20,13 @@ async def cmd(self, ctx: discord.ApplicationContext):
|
|||
Therefore, we check if the user is in that guild.
|
||||
"""
|
||||
guild = self.client.get_guild(int(resources["guild_specific"]["guild_id"]))
|
||||
|
||||
try:
|
||||
_ = await guild.fetch_member(ctx.author.id)
|
||||
except discord.HTTPException:
|
||||
return await ctx.respond(embed=MiscErrors.intro_no_guild(ctx))
|
||||
except AttributeError:
|
||||
return await ctx.respond(embed=MiscErrors.intro_no_guild(ctx, client_side=True))
|
||||
|
||||
"""
|
||||
A list of questions and corresponding field names
|
||||
|
@ -72,9 +74,7 @@ async def cmd(self, ctx: discord.ApplicationContext):
|
|||
await channel.send(embed=preview, content=f"Introduction by {ctx.author.mention}")
|
||||
await ctx.send(embed=General.post_confirmation(ctx, channel))
|
||||
|
||||
logs.info(f"[CommandHandler] {ctx.author.name} introduction was submitted "
|
||||
f"in guild {guild.name} ({guild.id}).")
|
||||
|
||||
logger.debug(f"Introduction by {ctx.author.name} was submitted in guild {guild.name} ({guild.id}).")
|
||||
return
|
||||
|
||||
else:
|
||||
|
|
|
@ -1,11 +1,8 @@
|
|||
import logging
|
||||
|
||||
import discord
|
||||
from discord.ui import View
|
||||
|
||||
from lib.embeds.info import MiscInfo
|
||||
|
||||
logs = logging.getLogger('Lumi.Core')
|
||||
url = "https://discord.com/oauth2/authorize?client_id=1038050427272429588&permissions=8&scope=bot"
|
||||
|
||||
|
||||
|
|
|
@ -1,13 +1,9 @@
|
|||
import logging
|
||||
|
||||
import discord
|
||||
|
||||
from lib import formatter
|
||||
from lib.embeds.moderation import ModEmbeds, ModErrors
|
||||
from modules.moderation import functions
|
||||
|
||||
_logs = logging.getLogger('Lumi.Core')
|
||||
|
||||
|
||||
async def ban_user(cog, ctx, target: discord.User, reason):
|
||||
# see if user is in guild
|
||||
|
|
|
@ -4,4 +4,5 @@ pytz==2024.1
|
|||
dropbox==11.36.2
|
||||
mariadb==1.1.10
|
||||
psutil==5.9.8
|
||||
httpx==0.27.0
|
||||
httpx==0.27.0
|
||||
loguru==0.7.2
|
|
@ -1,10 +1,8 @@
|
|||
import logging
|
||||
from loguru import logger
|
||||
|
||||
from db import database
|
||||
from services import item_service
|
||||
|
||||
logs = logging.getLogger('Lumi.Core')
|
||||
|
||||
|
||||
class Inventory:
|
||||
def __init__(self, user_id):
|
||||
|
@ -76,5 +74,5 @@ class Inventory:
|
|||
return item_names
|
||||
|
||||
except Exception as e:
|
||||
logs.error(e)
|
||||
logger.error(e)
|
||||
return []
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
import logging
|
||||
import sqlite3
|
||||
from loguru import logger
|
||||
|
||||
from db import database
|
||||
|
||||
logs = logging.getLogger('Lumi.Core')
|
||||
|
||||
|
||||
class Item:
|
||||
def __init__(self, item_id):
|
||||
|
@ -62,7 +60,7 @@ class Item:
|
|||
return item_names
|
||||
|
||||
except sqlite3.Error:
|
||||
logs.error(sqlite3.Error)
|
||||
logger.error(sqlite3.Error)
|
||||
return []
|
||||
|
||||
@staticmethod
|
||||
|
|
|
@ -1,70 +0,0 @@
|
|||
import logging
|
||||
import os
|
||||
import re
|
||||
from datetime import datetime
|
||||
from logging.handlers import RotatingFileHandler
|
||||
|
||||
import pytz
|
||||
|
||||
|
||||
class LumiFormatter(logging.Formatter):
|
||||
def __init__(self, fmt=None, dateformat=None):
|
||||
super().__init__(fmt, dateformat)
|
||||
self.timezone = pytz.timezone('US/Eastern')
|
||||
|
||||
def format(self, record):
|
||||
message = record.getMessage()
|
||||
message = re.sub(r'\n', '', message) # Remove newlines
|
||||
message = re.sub(r'\s+', ' ', message) # Remove multiple spaces
|
||||
message = message.strip() # Remove leading and trailing spaces
|
||||
|
||||
record.msg = message
|
||||
return super().format(record)
|
||||
|
||||
def formatTime(self, record, dateformat=None):
|
||||
timestamp = self.timezone.localize(datetime.fromtimestamp(record.created))
|
||||
if dateformat:
|
||||
return timestamp.strftime(dateformat)
|
||||
else:
|
||||
return str(timestamp)
|
||||
|
||||
|
||||
def setup_logger():
|
||||
logs_folder = 'logs'
|
||||
if not os.path.exists(logs_folder):
|
||||
os.makedirs(logs_folder)
|
||||
|
||||
debug_log_file = os.path.join(logs_folder, 'debug.log')
|
||||
|
||||
with open(debug_log_file, 'w'):
|
||||
pass
|
||||
|
||||
# Initialize the logger
|
||||
logger = logging.getLogger('Lumi.Core')
|
||||
|
||||
if logger.handlers:
|
||||
# Handlers already exist, no need to add more
|
||||
return logger
|
||||
|
||||
logger.setLevel(logging.DEBUG)
|
||||
|
||||
# CONSOLE HANDLER
|
||||
console_handler = logging.StreamHandler()
|
||||
console_handler.setLevel(logging.INFO)
|
||||
console_formatter = LumiFormatter('[%(asctime)s] [%(name)s] %(message)s')
|
||||
|
||||
console_handler.setFormatter(console_formatter)
|
||||
logger.addHandler(console_handler)
|
||||
|
||||
# DEBUG LOG TO FILE HANDLER
|
||||
max_log_size_bytes = 10 * 1024 * 1024 # max. 10 MB
|
||||
debug_file_handler = RotatingFileHandler(debug_log_file, maxBytes=max_log_size_bytes, backupCount=5)
|
||||
debug_file_handler.setLevel(logging.DEBUG)
|
||||
debug_file_formatter = LumiFormatter('[%(asctime)s] [%(name)s] [%(levelname)s] %(message)s')
|
||||
debug_file_handler.setFormatter(debug_file_formatter)
|
||||
logger.addHandler(debug_file_handler)
|
||||
|
||||
logger.propagate = False
|
||||
logging.captureWarnings(True)
|
||||
|
||||
return logger
|
Loading…
Reference in a new issue