Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Dockerfile-api
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,4 +30,4 @@ ENV HOME="/api" \
PATH="/api/.venv/bin:$PATH"

EXPOSE ${FLASK_RUN_PORT}
CMD ["sh", "-c", "exec gunicorn -w 2 --timeout 60 --graceful-timeout 30 --access-logfile - --error-logfile - -b 0.0.0.0:${FLASK_RUN_PORT} --chdir /api/src/api 'api:create_app()'"]
CMD ["sh", "-c", "exec gunicorn -w 2 --timeout 60 --graceful-timeout 30 --access-logfile - --error-logfile - -b 0.0.0.0:${FLASK_RUN_PORT} --chdir /api 'src.api.api:create_app()'"]
17 changes: 9 additions & 8 deletions src/api/api.py
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
import logging
import os

from __logger__ import setup_logger
from core.db_helper import DB
from flask import Flask, jsonify
from routes.healthchecks import health_checks
from routes.logging import logs
from routes.parameters import parameters
from routes.points import points
from routes.roles import role
from routes.settings import settings
from werkzeug.exceptions import HTTPException

from src.api.__logger__ import setup_logger
Comment thread
Xarlos89 marked this conversation as resolved.
from src.api.core.db_helper import DB
from src.api.routes.healthchecks import health_checks
from src.api.routes.logging import logs
from src.api.routes.parameters import parameters
from src.api.routes.points import points
from src.api.routes.roles import role
from src.api.routes.settings import settings

logger = logging.getLogger(__name__)

TROOPHY = {"1", "true", "yes", "on"}
Expand Down
2 changes: 1 addition & 1 deletion src/bot/botrunner.sh
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env bash

export GIT_HASH=$(cat /commit_hash.txt)
uv run --frozen --no-cache --no-dev --package eos-bot python src/bot/main.py
uv run --frozen --no-cache --no-dev --package eos-bot python -m src.bot.main
27 changes: 27 additions & 0 deletions src/bot/cogs/__init__.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
from __future__ import annotations

from typing import TYPE_CHECKING

from discord.ext import commands

if TYPE_CHECKING:
from logging import Logger


__all__ = ("BaseCog",)


class BaseCog(commands.Cog):
"""The base cog which comes along with basic logging."""

def __init__(self, logger: None | Logger = None) -> None:
super().__init__()
self.logger: None | Logger = logger

async def cog_load(self) -> None:
if self.logger:
self.logger.info(f"Cog: {self.qualified_name} has been loaded.")

async def cog_unload(self) -> None:
if self.logger:
self.logger.info(f"Cog: {self.qualified_name} has been unloaded.")
6 changes: 5 additions & 1 deletion src/bot/cogs/admin/healthchecks.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -30,8 +32,10 @@ def embed_hc(api, db, uptime, git_hash):
return embed


class Health(commands.Cog):
class Health(BaseCog):
def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@commands.hybrid_command()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/points.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,8 @@
import discord
from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)

Expand All@@ -23,7 +24,7 @@ def embed_info(title, message, color):
return embed


class Points(commands.Cog):
class Points(BaseCog):
"""
This cog manages a points-based system for Discord guild members.

Expand All@@ -40,6 +41,8 @@ class Points(commands.Cog):

def __init__(self, bot: commands.Bot) -> None:
"""Initialization of the points Class"""
super().__init__(logger)

self.bot = bot

@is_admin()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/settings.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,8 @@
import discord
from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)

Expand All@@ -18,12 +19,14 @@ def sanitize_string(input_string):
return "".join(char for char in input_string if ord(char) < 128)


class Settings(commands.Cog):
class Settings(BaseCog):
"""
Settings Cog for managing various settings of the bot.
"""

def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@is_master_guild()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/sync.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,13 +2,16 @@

from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)


class CommandSync(commands.Cog):
class CommandSync(BaseCog):
def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@commands.command(name="sync")
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/general_catfact.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,15 +7,19 @@
import aiohttp
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class GeneralCatFact(commands.Cog):
class GeneralCatFact(BaseCog):
"""
# Hits the catfact API and returns the response.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot

@commands.hybrid_command(name="catfact")
Expand Down
5 changes: 4 additions & 1 deletion src/bot/cogs/features/general_google.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,15 +6,18 @@

from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class GeneralSarcasticGoogle(commands.Cog):
class GeneralSarcasticGoogle(BaseCog):
"""
# Creates a link to the Let me google that for you site.
"""

def __init__(self, bot):
super().__init__(logger)
self.bot = bot

@commands.hybrid_command(name="google")
Expand Down
11 changes: 9 additions & 2 deletions src/bot/cogs/features/latex.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,7 +10,8 @@
from discord import app_commands
from discord.ext import commands

from ..constants import LATEX_COLORS
from src.bot.cogs import BaseCog
from src.bot.cogs.constants import LATEX_COLORS

logger = logging.getLogger(__name__)

Expand All@@ -29,19 +30,25 @@ def embed_info(title: str, message: str, image_url: str | None = None) -> discor
return embed


class LaTeX(commands.Cog):
class LaTeX(BaseCog):
"""
# Generates a LaTeX equation image using the CodeCogs API and displays it in an embed.
"""

def __init__(self, bot: commands.Bot):
super().__init__(logger)

self.bot = bot
self.session: aiohttp.ClientSession | None = None

async def cog_load(self) -> None:
await super().cog_load()

self.session = aiohttp.ClientSession()

async def cog_unload(self) -> None:
await super().cog_unload()

if self.session:
await self.session.close()

Expand Down
12 changes: 9 additions & 3 deletions src/bot/cogs/features/monthly_yapathon.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,9 +6,11 @@
import logging
import os

from discord.ext import commands, tasks
from discord.ext import tasks
from discord.utils import get

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -17,20 +19,24 @@
DATE = 1


class MonthlyYapathon(commands.Cog):
class MonthlyYapathon(BaseCog):
"""
This cog deals with all the stuff of monthly yapathon.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.yapper_role_id = self.bot.api.get_one_role("8")["role"]["value"]
self.announcement_channel_id = self.bot.api.get_one_setting("5")["setting"][
"value"
]
self.appoint_monthly_yapper.start()

def cog_unload(self):
async def cog_unload(self):
await super().cog_unload()

self.appoint_monthly_yapper.cancel()

@tasks.loop(time=TIME)
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/run_code.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,6 +11,8 @@
from discord.ext.commands import Bot, Context
from ultra_piston import File, PistonClient

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)

TRUNCATED_MESSAGE: str = "\n```\n```\nOutput too long. Message truncated.\n```"
Expand All@@ -20,10 +22,12 @@
# Discord character limit is 4096, but to prevent spamming, we reduce it to 1K


class UtilityRunCode(commands.Cog):
class UtilityRunCode(BaseCog):
"""Uses PistonAPI to run code in the server."""

def __init__(self, bot: Bot):
super().__init__(logger)

self.bot = bot
PISTON_API_TOKEN = os.environ.get("PISTON_API_TOKEN")
if not PISTON_API_TOKEN:
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/ticket.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,15 +8,19 @@
from discord import app_commands
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class AddTicketButton(commands.Cog):
class AddTicketButton(BaseCog):
"""
This is the slash command that sends our UI element.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot

@app_commands.command(description="Make a ticket and contact the Staff.")
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_avatars.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -27,12 +29,14 @@ def embed_avatar(before, after):
return embed


class LoggingAvatars(commands.Cog):
class LoggingAvatars(BaseCog):
"""
Simple listener to on_user_update
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.user_log = self.bot.api.get_one_log_setting("4") # User_log

Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_member_ban.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -25,13 +27,15 @@ def embed_ban(some_member, audit_log_entry):
return embed


class LoggingBans(commands.Cog):
class LoggingBans(BaseCog):
"""
Simple listener to on_member_remove
then checks the audit log for exact details
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.verification_role = self.bot.api.get_one_role("6")["role"][
"value"
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_member_kick.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -26,13 +28,15 @@ def embed_kick(some_member, audit_log_entry):
return embed


class LoggingKicks(commands.Cog):
class LoggingKicks(BaseCog):
"""
Simple listener to on_member_remove
then checks the audit log for exact details
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.verification_role = self.bot.api.get_one_role("6")["role"][
"value"
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
[BUG FIX]: Implicit import errors & cog_load method of MonthlyYappathon by Jiggly-Balls · Pull Request #149 · practical-python-org/Eos · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Dockerfile-api
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,4 +30,4 @@ ENV HOME="/api" \
PATH="/api/.venv/bin:$PATH"

EXPOSE ${FLASK_RUN_PORT}
CMD ["sh", "-c", "exec gunicorn -w 2 --timeout 60 --graceful-timeout 30 --access-logfile - --error-logfile - -b 0.0.0.0:${FLASK_RUN_PORT} --chdir /api/src/api 'api:create_app()'"]
CMD ["sh", "-c", "exec gunicorn -w 2 --timeout 60 --graceful-timeout 30 --access-logfile - --error-logfile - -b 0.0.0.0:${FLASK_RUN_PORT} --chdir /api 'src.api.api:create_app()'"]
17 changes: 9 additions & 8 deletions src/api/api.py
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
import logging
import os

from __logger__ import setup_logger
from core.db_helper import DB
from flask import Flask, jsonify
from routes.healthchecks import health_checks
from routes.logging import logs
from routes.parameters import parameters
from routes.points import points
from routes.roles import role
from routes.settings import settings
from werkzeug.exceptions import HTTPException

from src.api.__logger__ import setup_logger
Comment thread
Xarlos89 marked this conversation as resolved.
from src.api.core.db_helper import DB
from src.api.routes.healthchecks import health_checks
from src.api.routes.logging import logs
from src.api.routes.parameters import parameters
from src.api.routes.points import points
from src.api.routes.roles import role
from src.api.routes.settings import settings

logger = logging.getLogger(__name__)

TROOPHY = {"1", "true", "yes", "on"}
Expand Down
2 changes: 1 addition & 1 deletion src/bot/botrunner.sh
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env bash

export GIT_HASH=$(cat /commit_hash.txt)
uv run --frozen --no-cache --no-dev --package eos-bot python src/bot/main.py
uv run --frozen --no-cache --no-dev --package eos-bot python -m src.bot.main
27 changes: 27 additions & 0 deletions src/bot/cogs/__init__.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
from __future__ import annotations

from typing import TYPE_CHECKING

from discord.ext import commands

if TYPE_CHECKING:
from logging import Logger


__all__ = ("BaseCog",)


class BaseCog(commands.Cog):
"""The base cog which comes along with basic logging."""

def __init__(self, logger: None | Logger = None) -> None:
super().__init__()
self.logger: None | Logger = logger

async def cog_load(self) -> None:
if self.logger:
self.logger.info(f"Cog: {self.qualified_name} has been loaded.")

async def cog_unload(self) -> None:
if self.logger:
self.logger.info(f"Cog: {self.qualified_name} has been unloaded.")
6 changes: 5 additions & 1 deletion src/bot/cogs/admin/healthchecks.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -30,8 +32,10 @@ def embed_hc(api, db, uptime, git_hash):
return embed


class Health(commands.Cog):
class Health(BaseCog):
def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@commands.hybrid_command()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/points.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,8 @@
import discord
from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)

Expand All@@ -23,7 +24,7 @@ def embed_info(title, message, color):
return embed


class Points(commands.Cog):
class Points(BaseCog):
"""
This cog manages a points-based system for Discord guild members.

Expand All@@ -40,6 +41,8 @@ class Points(commands.Cog):

def __init__(self, bot: commands.Bot) -> None:
"""Initialization of the points Class"""
super().__init__(logger)

self.bot = bot

@is_admin()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/settings.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,8 @@
import discord
from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)

Expand All@@ -18,12 +19,14 @@ def sanitize_string(input_string):
return "".join(char for char in input_string if ord(char) < 128)


class Settings(commands.Cog):
class Settings(BaseCog):
"""
Settings Cog for managing various settings of the bot.
"""

def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@is_master_guild()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/sync.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,13 +2,16 @@

from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)


class CommandSync(commands.Cog):
class CommandSync(BaseCog):
def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@commands.command(name="sync")
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/general_catfact.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,15 +7,19 @@
import aiohttp
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class GeneralCatFact(commands.Cog):
class GeneralCatFact(BaseCog):
"""
# Hits the catfact API and returns the response.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot

@commands.hybrid_command(name="catfact")
Expand Down
5 changes: 4 additions & 1 deletion src/bot/cogs/features/general_google.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,15 +6,18 @@

from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class GeneralSarcasticGoogle(commands.Cog):
class GeneralSarcasticGoogle(BaseCog):
"""
# Creates a link to the Let me google that for you site.
"""

def __init__(self, bot):
super().__init__(logger)
self.bot = bot

@commands.hybrid_command(name="google")
Expand Down
11 changes: 9 additions & 2 deletions src/bot/cogs/features/latex.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,7 +10,8 @@
from discord import app_commands
from discord.ext import commands

from ..constants import LATEX_COLORS
from src.bot.cogs import BaseCog
from src.bot.cogs.constants import LATEX_COLORS

logger = logging.getLogger(__name__)

Expand All@@ -29,19 +30,25 @@ def embed_info(title: str, message: str, image_url: str | None = None) -> discor
return embed


class LaTeX(commands.Cog):
class LaTeX(BaseCog):
"""
# Generates a LaTeX equation image using the CodeCogs API and displays it in an embed.
"""

def __init__(self, bot: commands.Bot):
super().__init__(logger)

self.bot = bot
self.session: aiohttp.ClientSession | None = None

async def cog_load(self) -> None:
await super().cog_load()

self.session = aiohttp.ClientSession()

async def cog_unload(self) -> None:
await super().cog_unload()

if self.session:
await self.session.close()

Expand Down
12 changes: 9 additions & 3 deletions src/bot/cogs/features/monthly_yapathon.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,9 +6,11 @@
import logging
import os

from discord.ext import commands, tasks
from discord.ext import tasks
from discord.utils import get

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -17,20 +19,24 @@
DATE = 1


class MonthlyYapathon(commands.Cog):
class MonthlyYapathon(BaseCog):
"""
This cog deals with all the stuff of monthly yapathon.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.yapper_role_id = self.bot.api.get_one_role("8")["role"]["value"]
self.announcement_channel_id = self.bot.api.get_one_setting("5")["setting"][
"value"
]
self.appoint_monthly_yapper.start()

def cog_unload(self):
async def cog_unload(self):
await super().cog_unload()

self.appoint_monthly_yapper.cancel()

@tasks.loop(time=TIME)
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/run_code.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,6 +11,8 @@
from discord.ext.commands import Bot, Context
from ultra_piston import File, PistonClient

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)

TRUNCATED_MESSAGE: str = "\n```\n```\nOutput too long. Message truncated.\n```"
Expand All@@ -20,10 +22,12 @@
# Discord character limit is 4096, but to prevent spamming, we reduce it to 1K


class UtilityRunCode(commands.Cog):
class UtilityRunCode(BaseCog):
"""Uses PistonAPI to run code in the server."""

def __init__(self, bot: Bot):
super().__init__(logger)

self.bot = bot
PISTON_API_TOKEN = os.environ.get("PISTON_API_TOKEN")
if not PISTON_API_TOKEN:
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/ticket.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,15 +8,19 @@
from discord import app_commands
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class AddTicketButton(commands.Cog):
class AddTicketButton(BaseCog):
"""
This is the slash command that sends our UI element.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot

@app_commands.command(description="Make a ticket and contact the Staff.")
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_avatars.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -27,12 +29,14 @@ def embed_avatar(before, after):
return embed


class LoggingAvatars(commands.Cog):
class LoggingAvatars(BaseCog):
"""
Simple listener to on_user_update
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.user_log = self.bot.api.get_one_log_setting("4") # User_log

Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_member_ban.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -25,13 +27,15 @@ def embed_ban(some_member, audit_log_entry):
return embed


class LoggingBans(commands.Cog):
class LoggingBans(BaseCog):
"""
Simple listener to on_member_remove
then checks the audit log for exact details
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.verification_role = self.bot.api.get_one_role("6")["role"][
"value"
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_member_kick.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -26,13 +28,15 @@ def embed_kick(some_member, audit_log_entry):
return embed


class LoggingKicks(commands.Cog):
class LoggingKicks(BaseCog):
"""
Simple listener to on_member_remove
then checks the audit log for exact details
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.verification_role = self.bot.api.get_one_role("6")["role"][
"value"
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [BUG FIX]: Implicit import errors & cog_load method of MonthlyYappathon by Jiggly-Balls · Pull Request #149 · practical-python-org/Eos · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Dockerfile-api
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,4 +30,4 @@ ENV HOME="/api" \
PATH="/api/.venv/bin:$PATH"

EXPOSE ${FLASK_RUN_PORT}
CMD ["sh", "-c", "exec gunicorn -w 2 --timeout 60 --graceful-timeout 30 --access-logfile - --error-logfile - -b 0.0.0.0:${FLASK_RUN_PORT} --chdir /api/src/api 'api:create_app()'"]
CMD ["sh", "-c", "exec gunicorn -w 2 --timeout 60 --graceful-timeout 30 --access-logfile - --error-logfile - -b 0.0.0.0:${FLASK_RUN_PORT} --chdir /api 'src.api.api:create_app()'"]
17 changes: 9 additions & 8 deletions src/api/api.py
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
import logging
import os

from __logger__ import setup_logger
from core.db_helper import DB
from flask import Flask, jsonify
from routes.healthchecks import health_checks
from routes.logging import logs
from routes.parameters import parameters
from routes.points import points
from routes.roles import role
from routes.settings import settings
from werkzeug.exceptions import HTTPException

from src.api.__logger__ import setup_logger
Comment thread
Xarlos89 marked this conversation as resolved.
from src.api.core.db_helper import DB
from src.api.routes.healthchecks import health_checks
from src.api.routes.logging import logs
from src.api.routes.parameters import parameters
from src.api.routes.points import points
from src.api.routes.roles import role
from src.api.routes.settings import settings

logger = logging.getLogger(__name__)

TROOPHY = {"1", "true", "yes", "on"}
Expand Down
2 changes: 1 addition & 1 deletion src/bot/botrunner.sh
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env bash

export GIT_HASH=$(cat /commit_hash.txt)
uv run --frozen --no-cache --no-dev --package eos-bot python src/bot/main.py
uv run --frozen --no-cache --no-dev --package eos-bot python -m src.bot.main
27 changes: 27 additions & 0 deletions src/bot/cogs/__init__.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
from __future__ import annotations

from typing import TYPE_CHECKING

from discord.ext import commands

if TYPE_CHECKING:
from logging import Logger


__all__ = ("BaseCog",)


class BaseCog(commands.Cog):
"""The base cog which comes along with basic logging."""

def __init__(self, logger: None | Logger = None) -> None:
super().__init__()
self.logger: None | Logger = logger

async def cog_load(self) -> None:
if self.logger:
self.logger.info(f"Cog: {self.qualified_name} has been loaded.")

async def cog_unload(self) -> None:
if self.logger:
self.logger.info(f"Cog: {self.qualified_name} has been unloaded.")
6 changes: 5 additions & 1 deletion src/bot/cogs/admin/healthchecks.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -30,8 +32,10 @@ def embed_hc(api, db, uptime, git_hash):
return embed


class Health(commands.Cog):
class Health(BaseCog):
def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@commands.hybrid_command()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/points.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,8 @@
import discord
from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)

Expand All@@ -23,7 +24,7 @@ def embed_info(title, message, color):
return embed


class Points(commands.Cog):
class Points(BaseCog):
"""
This cog manages a points-based system for Discord guild members.

Expand All@@ -40,6 +41,8 @@ class Points(commands.Cog):

def __init__(self, bot: commands.Bot) -> None:
"""Initialization of the points Class"""
super().__init__(logger)

self.bot = bot

@is_admin()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/settings.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,8 @@
import discord
from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)

Expand All@@ -18,12 +19,14 @@ def sanitize_string(input_string):
return "".join(char for char in input_string if ord(char) < 128)


class Settings(commands.Cog):
class Settings(BaseCog):
"""
Settings Cog for managing various settings of the bot.
"""

def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@is_master_guild()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/sync.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,13 +2,16 @@

from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)


class CommandSync(commands.Cog):
class CommandSync(BaseCog):
def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@commands.command(name="sync")
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/general_catfact.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,15 +7,19 @@
import aiohttp
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class GeneralCatFact(commands.Cog):
class GeneralCatFact(BaseCog):
"""
# Hits the catfact API and returns the response.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot

@commands.hybrid_command(name="catfact")
Expand Down
5 changes: 4 additions & 1 deletion src/bot/cogs/features/general_google.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,15 +6,18 @@

from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class GeneralSarcasticGoogle(commands.Cog):
class GeneralSarcasticGoogle(BaseCog):
"""
# Creates a link to the Let me google that for you site.
"""

def __init__(self, bot):
super().__init__(logger)
self.bot = bot

@commands.hybrid_command(name="google")
Expand Down
11 changes: 9 additions & 2 deletions src/bot/cogs/features/latex.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,7 +10,8 @@
from discord import app_commands
from discord.ext import commands

from ..constants import LATEX_COLORS
from src.bot.cogs import BaseCog
from src.bot.cogs.constants import LATEX_COLORS

logger = logging.getLogger(__name__)

Expand All@@ -29,19 +30,25 @@ def embed_info(title: str, message: str, image_url: str | None = None) -> discor
return embed


class LaTeX(commands.Cog):
class LaTeX(BaseCog):
"""
# Generates a LaTeX equation image using the CodeCogs API and displays it in an embed.
"""

def __init__(self, bot: commands.Bot):
super().__init__(logger)

self.bot = bot
self.session: aiohttp.ClientSession | None = None

async def cog_load(self) -> None:
await super().cog_load()

self.session = aiohttp.ClientSession()

async def cog_unload(self) -> None:
await super().cog_unload()

if self.session:
await self.session.close()

Expand Down
12 changes: 9 additions & 3 deletions src/bot/cogs/features/monthly_yapathon.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,9 +6,11 @@
import logging
import os

from discord.ext import commands, tasks
from discord.ext import tasks
from discord.utils import get

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -17,20 +19,24 @@
DATE = 1


class MonthlyYapathon(commands.Cog):
class MonthlyYapathon(BaseCog):
"""
This cog deals with all the stuff of monthly yapathon.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.yapper_role_id = self.bot.api.get_one_role("8")["role"]["value"]
self.announcement_channel_id = self.bot.api.get_one_setting("5")["setting"][
"value"
]
self.appoint_monthly_yapper.start()

def cog_unload(self):
async def cog_unload(self):
await super().cog_unload()

self.appoint_monthly_yapper.cancel()

@tasks.loop(time=TIME)
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/run_code.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,6 +11,8 @@
from discord.ext.commands import Bot, Context
from ultra_piston import File, PistonClient

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)

TRUNCATED_MESSAGE: str = "\n```\n```\nOutput too long. Message truncated.\n```"
Expand All@@ -20,10 +22,12 @@
# Discord character limit is 4096, but to prevent spamming, we reduce it to 1K


class UtilityRunCode(commands.Cog):
class UtilityRunCode(BaseCog):
"""Uses PistonAPI to run code in the server."""

def __init__(self, bot: Bot):
super().__init__(logger)

self.bot = bot
PISTON_API_TOKEN = os.environ.get("PISTON_API_TOKEN")
if not PISTON_API_TOKEN:
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/ticket.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,15 +8,19 @@
from discord import app_commands
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class AddTicketButton(commands.Cog):
class AddTicketButton(BaseCog):
"""
This is the slash command that sends our UI element.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot

@app_commands.command(description="Make a ticket and contact the Staff.")
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_avatars.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -27,12 +29,14 @@ def embed_avatar(before, after):
return embed


class LoggingAvatars(commands.Cog):
class LoggingAvatars(BaseCog):
"""
Simple listener to on_user_update
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.user_log = self.bot.api.get_one_log_setting("4") # User_log

Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_member_ban.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -25,13 +27,15 @@ def embed_ban(some_member, audit_log_entry):
return embed


class LoggingBans(commands.Cog):
class LoggingBans(BaseCog):
"""
Simple listener to on_member_remove
then checks the audit log for exact details
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.verification_role = self.bot.api.get_one_role("6")["role"][
"value"
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_member_kick.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -26,13 +28,15 @@ def embed_kick(some_member, audit_log_entry):
return embed


class LoggingKicks(commands.Cog):
class LoggingKicks(BaseCog):
"""
Simple listener to on_member_remove
then checks the audit log for exact details
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.verification_role = self.bot.api.get_one_role("6")["role"][
"value"
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [BUG FIX]: Implicit import errors & cog_load method of MonthlyYappathon by Jiggly-Balls · Pull Request #149 · practical-python-org/Eos · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Dockerfile-api
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,4 +30,4 @@ ENV HOME="/api" \
PATH="/api/.venv/bin:$PATH"

EXPOSE ${FLASK_RUN_PORT}
CMD ["sh", "-c", "exec gunicorn -w 2 --timeout 60 --graceful-timeout 30 --access-logfile - --error-logfile - -b 0.0.0.0:${FLASK_RUN_PORT} --chdir /api/src/api 'api:create_app()'"]
CMD ["sh", "-c", "exec gunicorn -w 2 --timeout 60 --graceful-timeout 30 --access-logfile - --error-logfile - -b 0.0.0.0:${FLASK_RUN_PORT} --chdir /api 'src.api.api:create_app()'"]
17 changes: 9 additions & 8 deletions src/api/api.py
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
import logging
import os

from __logger__ import setup_logger
from core.db_helper import DB
from flask import Flask, jsonify
from routes.healthchecks import health_checks
from routes.logging import logs
from routes.parameters import parameters
from routes.points import points
from routes.roles import role
from routes.settings import settings
from werkzeug.exceptions import HTTPException

from src.api.__logger__ import setup_logger
Comment thread
Xarlos89 marked this conversation as resolved.
from src.api.core.db_helper import DB
from src.api.routes.healthchecks import health_checks
from src.api.routes.logging import logs
from src.api.routes.parameters import parameters
from src.api.routes.points import points
from src.api.routes.roles import role
from src.api.routes.settings import settings

logger = logging.getLogger(__name__)

TROOPHY = {"1", "true", "yes", "on"}
Expand Down
2 changes: 1 addition & 1 deletion src/bot/botrunner.sh
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env bash

export GIT_HASH=$(cat /commit_hash.txt)
uv run --frozen --no-cache --no-dev --package eos-bot python src/bot/main.py
uv run --frozen --no-cache --no-dev --package eos-bot python -m src.bot.main
27 changes: 27 additions & 0 deletions src/bot/cogs/__init__.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
from __future__ import annotations

from typing import TYPE_CHECKING

from discord.ext import commands

if TYPE_CHECKING:
from logging import Logger


__all__ = ("BaseCog",)


class BaseCog(commands.Cog):
"""The base cog which comes along with basic logging."""

def __init__(self, logger: None | Logger = None) -> None:
super().__init__()
self.logger: None | Logger = logger

async def cog_load(self) -> None:
if self.logger:
self.logger.info(f"Cog: {self.qualified_name} has been loaded.")

async def cog_unload(self) -> None:
if self.logger:
self.logger.info(f"Cog: {self.qualified_name} has been unloaded.")
6 changes: 5 additions & 1 deletion src/bot/cogs/admin/healthchecks.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -30,8 +32,10 @@ def embed_hc(api, db, uptime, git_hash):
return embed


class Health(commands.Cog):
class Health(BaseCog):
def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@commands.hybrid_command()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/points.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,8 @@
import discord
from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)

Expand All@@ -23,7 +24,7 @@ def embed_info(title, message, color):
return embed


class Points(commands.Cog):
class Points(BaseCog):
"""
This cog manages a points-based system for Discord guild members.

Expand All@@ -40,6 +41,8 @@ class Points(commands.Cog):

def __init__(self, bot: commands.Bot) -> None:
"""Initialization of the points Class"""
super().__init__(logger)

self.bot = bot

@is_admin()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/settings.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,8 @@
import discord
from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)

Expand All@@ -18,12 +19,14 @@ def sanitize_string(input_string):
return "".join(char for char in input_string if ord(char) < 128)


class Settings(commands.Cog):
class Settings(BaseCog):
"""
Settings Cog for managing various settings of the bot.
"""

def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@is_master_guild()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/sync.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,13 +2,16 @@

from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)


class CommandSync(commands.Cog):
class CommandSync(BaseCog):
def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@commands.command(name="sync")
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/general_catfact.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,15 +7,19 @@
import aiohttp
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class GeneralCatFact(commands.Cog):
class GeneralCatFact(BaseCog):
"""
# Hits the catfact API and returns the response.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot

@commands.hybrid_command(name="catfact")
Expand Down
5 changes: 4 additions & 1 deletion src/bot/cogs/features/general_google.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,15 +6,18 @@

from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class GeneralSarcasticGoogle(commands.Cog):
class GeneralSarcasticGoogle(BaseCog):
"""
# Creates a link to the Let me google that for you site.
"""

def __init__(self, bot):
super().__init__(logger)
self.bot = bot

@commands.hybrid_command(name="google")
Expand Down
11 changes: 9 additions & 2 deletions src/bot/cogs/features/latex.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,7 +10,8 @@
from discord import app_commands
from discord.ext import commands

from ..constants import LATEX_COLORS
from src.bot.cogs import BaseCog
from src.bot.cogs.constants import LATEX_COLORS

logger = logging.getLogger(__name__)

Expand All@@ -29,19 +30,25 @@ def embed_info(title: str, message: str, image_url: str | None = None) -> discor
return embed


class LaTeX(commands.Cog):
class LaTeX(BaseCog):
"""
# Generates a LaTeX equation image using the CodeCogs API and displays it in an embed.
"""

def __init__(self, bot: commands.Bot):
super().__init__(logger)

self.bot = bot
self.session: aiohttp.ClientSession | None = None

async def cog_load(self) -> None:
await super().cog_load()

self.session = aiohttp.ClientSession()

async def cog_unload(self) -> None:
await super().cog_unload()

if self.session:
await self.session.close()

Expand Down
12 changes: 9 additions & 3 deletions src/bot/cogs/features/monthly_yapathon.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,9 +6,11 @@
import logging
import os

from discord.ext import commands, tasks
from discord.ext import tasks
from discord.utils import get

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -17,20 +19,24 @@
DATE = 1


class MonthlyYapathon(commands.Cog):
class MonthlyYapathon(BaseCog):
"""
This cog deals with all the stuff of monthly yapathon.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.yapper_role_id = self.bot.api.get_one_role("8")["role"]["value"]
self.announcement_channel_id = self.bot.api.get_one_setting("5")["setting"][
"value"
]
self.appoint_monthly_yapper.start()

def cog_unload(self):
async def cog_unload(self):
await super().cog_unload()

self.appoint_monthly_yapper.cancel()

@tasks.loop(time=TIME)
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/run_code.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,6 +11,8 @@
from discord.ext.commands import Bot, Context
from ultra_piston import File, PistonClient

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)

TRUNCATED_MESSAGE: str = "\n```\n```\nOutput too long. Message truncated.\n```"
Expand All@@ -20,10 +22,12 @@
# Discord character limit is 4096, but to prevent spamming, we reduce it to 1K


class UtilityRunCode(commands.Cog):
class UtilityRunCode(BaseCog):
"""Uses PistonAPI to run code in the server."""

def __init__(self, bot: Bot):
super().__init__(logger)

self.bot = bot
PISTON_API_TOKEN = os.environ.get("PISTON_API_TOKEN")
if not PISTON_API_TOKEN:
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/ticket.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,15 +8,19 @@
from discord import app_commands
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class AddTicketButton(commands.Cog):
class AddTicketButton(BaseCog):
"""
This is the slash command that sends our UI element.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot

@app_commands.command(description="Make a ticket and contact the Staff.")
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_avatars.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -27,12 +29,14 @@ def embed_avatar(before, after):
return embed


class LoggingAvatars(commands.Cog):
class LoggingAvatars(BaseCog):
"""
Simple listener to on_user_update
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.user_log = self.bot.api.get_one_log_setting("4") # User_log

Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_member_ban.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -25,13 +27,15 @@ def embed_ban(some_member, audit_log_entry):
return embed


class LoggingBans(commands.Cog):
class LoggingBans(BaseCog):
"""
Simple listener to on_member_remove
then checks the audit log for exact details
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.verification_role = self.bot.api.get_one_role("6")["role"][
"value"
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_member_kick.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -26,13 +28,15 @@ def embed_kick(some_member, audit_log_entry):
return embed


class LoggingKicks(commands.Cog):
class LoggingKicks(BaseCog):
"""
Simple listener to on_member_remove
then checks the audit log for exact details
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.verification_role = self.bot.api.get_one_role("6")["role"][
"value"
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' [BUG FIX]: Implicit import errors & cog_load method of MonthlyYappathon by Jiggly-Balls · Pull Request #149 · practical-python-org/Eos · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Dockerfile-api
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,4 +30,4 @@ ENV HOME="/api" \
PATH="/api/.venv/bin:$PATH"

EXPOSE ${FLASK_RUN_PORT}
CMD ["sh", "-c", "exec gunicorn -w 2 --timeout 60 --graceful-timeout 30 --access-logfile - --error-logfile - -b 0.0.0.0:${FLASK_RUN_PORT} --chdir /api/src/api 'api:create_app()'"]
CMD ["sh", "-c", "exec gunicorn -w 2 --timeout 60 --graceful-timeout 30 --access-logfile - --error-logfile - -b 0.0.0.0:${FLASK_RUN_PORT} --chdir /api 'src.api.api:create_app()'"]
17 changes: 9 additions & 8 deletions src/api/api.py
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
import logging
import os

from __logger__ import setup_logger
from core.db_helper import DB
from flask import Flask, jsonify
from routes.healthchecks import health_checks
from routes.logging import logs
from routes.parameters import parameters
from routes.points import points
from routes.roles import role
from routes.settings import settings
from werkzeug.exceptions import HTTPException

from src.api.__logger__ import setup_logger
Comment thread
Xarlos89 marked this conversation as resolved.
from src.api.core.db_helper import DB
from src.api.routes.healthchecks import health_checks
from src.api.routes.logging import logs
from src.api.routes.parameters import parameters
from src.api.routes.points import points
from src.api.routes.roles import role
from src.api.routes.settings import settings

logger = logging.getLogger(__name__)

TROOPHY = {"1", "true", "yes", "on"}
Expand Down
2 changes: 1 addition & 1 deletion src/bot/botrunner.sh
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env bash

export GIT_HASH=$(cat /commit_hash.txt)
uv run --frozen --no-cache --no-dev --package eos-bot python src/bot/main.py
uv run --frozen --no-cache --no-dev --package eos-bot python -m src.bot.main
27 changes: 27 additions & 0 deletions src/bot/cogs/__init__.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
from __future__ import annotations

from typing import TYPE_CHECKING

from discord.ext import commands

if TYPE_CHECKING:
from logging import Logger


__all__ = ("BaseCog",)


class BaseCog(commands.Cog):
"""The base cog which comes along with basic logging."""

def __init__(self, logger: None | Logger = None) -> None:
super().__init__()
self.logger: None | Logger = logger

async def cog_load(self) -> None:
if self.logger:
self.logger.info(f"Cog: {self.qualified_name} has been loaded.")

async def cog_unload(self) -> None:
if self.logger:
self.logger.info(f"Cog: {self.qualified_name} has been unloaded.")
6 changes: 5 additions & 1 deletion src/bot/cogs/admin/healthchecks.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -30,8 +32,10 @@ def embed_hc(api, db, uptime, git_hash):
return embed


class Health(commands.Cog):
class Health(BaseCog):
def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@commands.hybrid_command()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/points.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,8 @@
import discord
from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)

Expand All@@ -23,7 +24,7 @@ def embed_info(title, message, color):
return embed


class Points(commands.Cog):
class Points(BaseCog):
"""
This cog manages a points-based system for Discord guild members.

Expand All@@ -40,6 +41,8 @@ class Points(commands.Cog):

def __init__(self, bot: commands.Bot) -> None:
"""Initialization of the points Class"""
super().__init__(logger)

self.bot = bot

@is_admin()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/settings.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,8 @@
import discord
from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)

Expand All@@ -18,12 +19,14 @@ def sanitize_string(input_string):
return "".join(char for char in input_string if ord(char) < 128)


class Settings(commands.Cog):
class Settings(BaseCog):
"""
Settings Cog for managing various settings of the bot.
"""

def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@is_master_guild()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/sync.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,13 +2,16 @@

from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)


class CommandSync(commands.Cog):
class CommandSync(BaseCog):
def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@commands.command(name="sync")
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/general_catfact.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,15 +7,19 @@
import aiohttp
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class GeneralCatFact(commands.Cog):
class GeneralCatFact(BaseCog):
"""
# Hits the catfact API and returns the response.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot

@commands.hybrid_command(name="catfact")
Expand Down
5 changes: 4 additions & 1 deletion src/bot/cogs/features/general_google.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,15 +6,18 @@

from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class GeneralSarcasticGoogle(commands.Cog):
class GeneralSarcasticGoogle(BaseCog):
"""
# Creates a link to the Let me google that for you site.
"""

def __init__(self, bot):
super().__init__(logger)
self.bot = bot

@commands.hybrid_command(name="google")
Expand Down
11 changes: 9 additions & 2 deletions src/bot/cogs/features/latex.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,7 +10,8 @@
from discord import app_commands
from discord.ext import commands

from ..constants import LATEX_COLORS
from src.bot.cogs import BaseCog
from src.bot.cogs.constants import LATEX_COLORS

logger = logging.getLogger(__name__)

Expand All@@ -29,19 +30,25 @@ def embed_info(title: str, message: str, image_url: str | None = None) -> discor
return embed


class LaTeX(commands.Cog):
class LaTeX(BaseCog):
"""
# Generates a LaTeX equation image using the CodeCogs API and displays it in an embed.
"""

def __init__(self, bot: commands.Bot):
super().__init__(logger)

self.bot = bot
self.session: aiohttp.ClientSession | None = None

async def cog_load(self) -> None:
await super().cog_load()

self.session = aiohttp.ClientSession()

async def cog_unload(self) -> None:
await super().cog_unload()

if self.session:
await self.session.close()

Expand Down
12 changes: 9 additions & 3 deletions src/bot/cogs/features/monthly_yapathon.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,9 +6,11 @@
import logging
import os

from discord.ext import commands, tasks
from discord.ext import tasks
from discord.utils import get

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -17,20 +19,24 @@
DATE = 1


class MonthlyYapathon(commands.Cog):
class MonthlyYapathon(BaseCog):
"""
This cog deals with all the stuff of monthly yapathon.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.yapper_role_id = self.bot.api.get_one_role("8")["role"]["value"]
self.announcement_channel_id = self.bot.api.get_one_setting("5")["setting"][
"value"
]
self.appoint_monthly_yapper.start()

def cog_unload(self):
async def cog_unload(self):
await super().cog_unload()

self.appoint_monthly_yapper.cancel()

@tasks.loop(time=TIME)
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/run_code.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,6 +11,8 @@
from discord.ext.commands import Bot, Context
from ultra_piston import File, PistonClient

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)

TRUNCATED_MESSAGE: str = "\n```\n```\nOutput too long. Message truncated.\n```"
Expand All@@ -20,10 +22,12 @@
# Discord character limit is 4096, but to prevent spamming, we reduce it to 1K


class UtilityRunCode(commands.Cog):
class UtilityRunCode(BaseCog):
"""Uses PistonAPI to run code in the server."""

def __init__(self, bot: Bot):
super().__init__(logger)

self.bot = bot
PISTON_API_TOKEN = os.environ.get("PISTON_API_TOKEN")
if not PISTON_API_TOKEN:
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/ticket.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,15 +8,19 @@
from discord import app_commands
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class AddTicketButton(commands.Cog):
class AddTicketButton(BaseCog):
"""
This is the slash command that sends our UI element.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot

@app_commands.command(description="Make a ticket and contact the Staff.")
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_avatars.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -27,12 +29,14 @@ def embed_avatar(before, after):
return embed


class LoggingAvatars(commands.Cog):
class LoggingAvatars(BaseCog):
"""
Simple listener to on_user_update
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.user_log = self.bot.api.get_one_log_setting("4") # User_log

Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_member_ban.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -25,13 +27,15 @@ def embed_ban(some_member, audit_log_entry):
return embed


class LoggingBans(commands.Cog):
class LoggingBans(BaseCog):
"""
Simple listener to on_member_remove
then checks the audit log for exact details
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.verification_role = self.bot.api.get_one_role("6")["role"][
"value"
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_member_kick.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -26,13 +28,15 @@ def embed_kick(some_member, audit_log_entry):
return embed


class LoggingKicks(commands.Cog):
class LoggingKicks(BaseCog):
"""
Simple listener to on_member_remove
then checks the audit log for exact details
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.verification_role = self.bot.api.get_one_role("6")["role"][
"value"
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [BUG FIX]: Implicit import errors & cog_load method of MonthlyYappathon by Jiggly-Balls · Pull Request #149 · practical-python-org/Eos · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Dockerfile-api
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,4 +30,4 @@ ENV HOME="/api" \
PATH="/api/.venv/bin:$PATH"

EXPOSE ${FLASK_RUN_PORT}
CMD ["sh", "-c", "exec gunicorn -w 2 --timeout 60 --graceful-timeout 30 --access-logfile - --error-logfile - -b 0.0.0.0:${FLASK_RUN_PORT} --chdir /api/src/api 'api:create_app()'"]
CMD ["sh", "-c", "exec gunicorn -w 2 --timeout 60 --graceful-timeout 30 --access-logfile - --error-logfile - -b 0.0.0.0:${FLASK_RUN_PORT} --chdir /api 'src.api.api:create_app()'"]
17 changes: 9 additions & 8 deletions src/api/api.py
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
import logging
import os

from __logger__ import setup_logger
from core.db_helper import DB
from flask import Flask, jsonify
from routes.healthchecks import health_checks
from routes.logging import logs
from routes.parameters import parameters
from routes.points import points
from routes.roles import role
from routes.settings import settings
from werkzeug.exceptions import HTTPException

from src.api.__logger__ import setup_logger
Comment thread
Xarlos89 marked this conversation as resolved.
from src.api.core.db_helper import DB
from src.api.routes.healthchecks import health_checks
from src.api.routes.logging import logs
from src.api.routes.parameters import parameters
from src.api.routes.points import points
from src.api.routes.roles import role
from src.api.routes.settings import settings

logger = logging.getLogger(__name__)

TROOPHY = {"1", "true", "yes", "on"}
Expand Down
2 changes: 1 addition & 1 deletion src/bot/botrunner.sh
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env bash

export GIT_HASH=$(cat /commit_hash.txt)
uv run --frozen --no-cache --no-dev --package eos-bot python src/bot/main.py
uv run --frozen --no-cache --no-dev --package eos-bot python -m src.bot.main
27 changes: 27 additions & 0 deletions src/bot/cogs/__init__.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
from __future__ import annotations

from typing import TYPE_CHECKING

from discord.ext import commands

if TYPE_CHECKING:
from logging import Logger


__all__ = ("BaseCog",)


class BaseCog(commands.Cog):
"""The base cog which comes along with basic logging."""

def __init__(self, logger: None | Logger = None) -> None:
super().__init__()
self.logger: None | Logger = logger

async def cog_load(self) -> None:
if self.logger:
self.logger.info(f"Cog: {self.qualified_name} has been loaded.")

async def cog_unload(self) -> None:
if self.logger:
self.logger.info(f"Cog: {self.qualified_name} has been unloaded.")
6 changes: 5 additions & 1 deletion src/bot/cogs/admin/healthchecks.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -30,8 +32,10 @@ def embed_hc(api, db, uptime, git_hash):
return embed


class Health(commands.Cog):
class Health(BaseCog):
def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@commands.hybrid_command()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/points.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,8 @@
import discord
from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)

Expand All@@ -23,7 +24,7 @@ def embed_info(title, message, color):
return embed


class Points(commands.Cog):
class Points(BaseCog):
"""
This cog manages a points-based system for Discord guild members.

Expand All@@ -40,6 +41,8 @@ class Points(commands.Cog):

def __init__(self, bot: commands.Bot) -> None:
"""Initialization of the points Class"""
super().__init__(logger)

self.bot = bot

@is_admin()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/settings.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,8 @@
import discord
from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)

Expand All@@ -18,12 +19,14 @@ def sanitize_string(input_string):
return "".join(char for char in input_string if ord(char) < 128)


class Settings(commands.Cog):
class Settings(BaseCog):
"""
Settings Cog for managing various settings of the bot.
"""

def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@is_master_guild()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/sync.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,13 +2,16 @@

from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)


class CommandSync(commands.Cog):
class CommandSync(BaseCog):
def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@commands.command(name="sync")
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/general_catfact.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,15 +7,19 @@
import aiohttp
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class GeneralCatFact(commands.Cog):
class GeneralCatFact(BaseCog):
"""
# Hits the catfact API and returns the response.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot

@commands.hybrid_command(name="catfact")
Expand Down
5 changes: 4 additions & 1 deletion src/bot/cogs/features/general_google.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,15 +6,18 @@

from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class GeneralSarcasticGoogle(commands.Cog):
class GeneralSarcasticGoogle(BaseCog):
"""
# Creates a link to the Let me google that for you site.
"""

def __init__(self, bot):
super().__init__(logger)
self.bot = bot

@commands.hybrid_command(name="google")
Expand Down
11 changes: 9 additions & 2 deletions src/bot/cogs/features/latex.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,7 +10,8 @@
from discord import app_commands
from discord.ext import commands

from ..constants import LATEX_COLORS
from src.bot.cogs import BaseCog
from src.bot.cogs.constants import LATEX_COLORS

logger = logging.getLogger(__name__)

Expand All@@ -29,19 +30,25 @@ def embed_info(title: str, message: str, image_url: str | None = None) -> discor
return embed


class LaTeX(commands.Cog):
class LaTeX(BaseCog):
"""
# Generates a LaTeX equation image using the CodeCogs API and displays it in an embed.
"""

def __init__(self, bot: commands.Bot):
super().__init__(logger)

self.bot = bot
self.session: aiohttp.ClientSession | None = None

async def cog_load(self) -> None:
await super().cog_load()

self.session = aiohttp.ClientSession()

async def cog_unload(self) -> None:
await super().cog_unload()

if self.session:
await self.session.close()

Expand Down
12 changes: 9 additions & 3 deletions src/bot/cogs/features/monthly_yapathon.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,9 +6,11 @@
import logging
import os

from discord.ext import commands, tasks
from discord.ext import tasks
from discord.utils import get

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -17,20 +19,24 @@
DATE = 1


class MonthlyYapathon(commands.Cog):
class MonthlyYapathon(BaseCog):
"""
This cog deals with all the stuff of monthly yapathon.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.yapper_role_id = self.bot.api.get_one_role("8")["role"]["value"]
self.announcement_channel_id = self.bot.api.get_one_setting("5")["setting"][
"value"
]
self.appoint_monthly_yapper.start()

def cog_unload(self):
async def cog_unload(self):
await super().cog_unload()

self.appoint_monthly_yapper.cancel()

@tasks.loop(time=TIME)
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/run_code.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,6 +11,8 @@
from discord.ext.commands import Bot, Context
from ultra_piston import File, PistonClient

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)

TRUNCATED_MESSAGE: str = "\n```\n```\nOutput too long. Message truncated.\n```"
Expand All@@ -20,10 +22,12 @@
# Discord character limit is 4096, but to prevent spamming, we reduce it to 1K


class UtilityRunCode(commands.Cog):
class UtilityRunCode(BaseCog):
"""Uses PistonAPI to run code in the server."""

def __init__(self, bot: Bot):
super().__init__(logger)

self.bot = bot
PISTON_API_TOKEN = os.environ.get("PISTON_API_TOKEN")
if not PISTON_API_TOKEN:
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/ticket.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,15 +8,19 @@
from discord import app_commands
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class AddTicketButton(commands.Cog):
class AddTicketButton(BaseCog):
"""
This is the slash command that sends our UI element.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot

@app_commands.command(description="Make a ticket and contact the Staff.")
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_avatars.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -27,12 +29,14 @@ def embed_avatar(before, after):
return embed


class LoggingAvatars(commands.Cog):
class LoggingAvatars(BaseCog):
"""
Simple listener to on_user_update
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.user_log = self.bot.api.get_one_log_setting("4") # User_log

Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_member_ban.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -25,13 +27,15 @@ def embed_ban(some_member, audit_log_entry):
return embed


class LoggingBans(commands.Cog):
class LoggingBans(BaseCog):
"""
Simple listener to on_member_remove
then checks the audit log for exact details
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.verification_role = self.bot.api.get_one_role("6")["role"][
"value"
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_member_kick.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -26,13 +28,15 @@ def embed_kick(some_member, audit_log_entry):
return embed


class LoggingKicks(commands.Cog):
class LoggingKicks(BaseCog):
"""
Simple listener to on_member_remove
then checks the audit log for exact details
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.verification_role = self.bot.api.get_one_role("6")["role"][
"value"
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [BUG FIX]: Implicit import errors & cog_load method of MonthlyYappathon by Jiggly-Balls · Pull Request #149 · practical-python-org/Eos · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Dockerfile-api
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,4 +30,4 @@ ENV HOME="/api" \
PATH="/api/.venv/bin:$PATH"

EXPOSE ${FLASK_RUN_PORT}
CMD ["sh", "-c", "exec gunicorn -w 2 --timeout 60 --graceful-timeout 30 --access-logfile - --error-logfile - -b 0.0.0.0:${FLASK_RUN_PORT} --chdir /api/src/api 'api:create_app()'"]
CMD ["sh", "-c", "exec gunicorn -w 2 --timeout 60 --graceful-timeout 30 --access-logfile - --error-logfile - -b 0.0.0.0:${FLASK_RUN_PORT} --chdir /api 'src.api.api:create_app()'"]
17 changes: 9 additions & 8 deletions src/api/api.py
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
import logging
import os

from __logger__ import setup_logger
from core.db_helper import DB
from flask import Flask, jsonify
from routes.healthchecks import health_checks
from routes.logging import logs
from routes.parameters import parameters
from routes.points import points
from routes.roles import role
from routes.settings import settings
from werkzeug.exceptions import HTTPException

from src.api.__logger__ import setup_logger
Comment thread
Xarlos89 marked this conversation as resolved.
from src.api.core.db_helper import DB
from src.api.routes.healthchecks import health_checks
from src.api.routes.logging import logs
from src.api.routes.parameters import parameters
from src.api.routes.points import points
from src.api.routes.roles import role
from src.api.routes.settings import settings

logger = logging.getLogger(__name__)

TROOPHY = {"1", "true", "yes", "on"}
Expand Down
2 changes: 1 addition & 1 deletion src/bot/botrunner.sh
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env bash

export GIT_HASH=$(cat /commit_hash.txt)
uv run --frozen --no-cache --no-dev --package eos-bot python src/bot/main.py
uv run --frozen --no-cache --no-dev --package eos-bot python -m src.bot.main
27 changes: 27 additions & 0 deletions src/bot/cogs/__init__.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
from __future__ import annotations

from typing import TYPE_CHECKING

from discord.ext import commands

if TYPE_CHECKING:
from logging import Logger


__all__ = ("BaseCog",)


class BaseCog(commands.Cog):
"""The base cog which comes along with basic logging."""

def __init__(self, logger: None | Logger = None) -> None:
super().__init__()
self.logger: None | Logger = logger

async def cog_load(self) -> None:
if self.logger:
self.logger.info(f"Cog: {self.qualified_name} has been loaded.")

async def cog_unload(self) -> None:
if self.logger:
self.logger.info(f"Cog: {self.qualified_name} has been unloaded.")
6 changes: 5 additions & 1 deletion src/bot/cogs/admin/healthchecks.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -30,8 +32,10 @@ def embed_hc(api, db, uptime, git_hash):
return embed


class Health(commands.Cog):
class Health(BaseCog):
def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@commands.hybrid_command()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/points.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,8 @@
import discord
from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)

Expand All@@ -23,7 +24,7 @@ def embed_info(title, message, color):
return embed


class Points(commands.Cog):
class Points(BaseCog):
"""
This cog manages a points-based system for Discord guild members.

Expand All@@ -40,6 +41,8 @@ class Points(commands.Cog):

def __init__(self, bot: commands.Bot) -> None:
"""Initialization of the points Class"""
super().__init__(logger)

self.bot = bot

@is_admin()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/settings.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,8 @@
import discord
from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)

Expand All@@ -18,12 +19,14 @@ def sanitize_string(input_string):
return "".join(char for char in input_string if ord(char) < 128)


class Settings(commands.Cog):
class Settings(BaseCog):
"""
Settings Cog for managing various settings of the bot.
"""

def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@is_master_guild()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/sync.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,13 +2,16 @@

from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)


class CommandSync(commands.Cog):
class CommandSync(BaseCog):
def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@commands.command(name="sync")
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/general_catfact.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,15 +7,19 @@
import aiohttp
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class GeneralCatFact(commands.Cog):
class GeneralCatFact(BaseCog):
"""
# Hits the catfact API and returns the response.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot

@commands.hybrid_command(name="catfact")
Expand Down
5 changes: 4 additions & 1 deletion src/bot/cogs/features/general_google.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,15 +6,18 @@

from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class GeneralSarcasticGoogle(commands.Cog):
class GeneralSarcasticGoogle(BaseCog):
"""
# Creates a link to the Let me google that for you site.
"""

def __init__(self, bot):
super().__init__(logger)
self.bot = bot

@commands.hybrid_command(name="google")
Expand Down
11 changes: 9 additions & 2 deletions src/bot/cogs/features/latex.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,7 +10,8 @@
from discord import app_commands
from discord.ext import commands

from ..constants import LATEX_COLORS
from src.bot.cogs import BaseCog
from src.bot.cogs.constants import LATEX_COLORS

logger = logging.getLogger(__name__)

Expand All@@ -29,19 +30,25 @@ def embed_info(title: str, message: str, image_url: str | None = None) -> discor
return embed


class LaTeX(commands.Cog):
class LaTeX(BaseCog):
"""
# Generates a LaTeX equation image using the CodeCogs API and displays it in an embed.
"""

def __init__(self, bot: commands.Bot):
super().__init__(logger)

self.bot = bot
self.session: aiohttp.ClientSession | None = None

async def cog_load(self) -> None:
await super().cog_load()

self.session = aiohttp.ClientSession()

async def cog_unload(self) -> None:
await super().cog_unload()

if self.session:
await self.session.close()

Expand Down
12 changes: 9 additions & 3 deletions src/bot/cogs/features/monthly_yapathon.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,9 +6,11 @@
import logging
import os

from discord.ext import commands, tasks
from discord.ext import tasks
from discord.utils import get

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -17,20 +19,24 @@
DATE = 1


class MonthlyYapathon(commands.Cog):
class MonthlyYapathon(BaseCog):
"""
This cog deals with all the stuff of monthly yapathon.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.yapper_role_id = self.bot.api.get_one_role("8")["role"]["value"]
self.announcement_channel_id = self.bot.api.get_one_setting("5")["setting"][
"value"
]
self.appoint_monthly_yapper.start()

def cog_unload(self):
async def cog_unload(self):
await super().cog_unload()

self.appoint_monthly_yapper.cancel()

@tasks.loop(time=TIME)
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/run_code.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,6 +11,8 @@
from discord.ext.commands import Bot, Context
from ultra_piston import File, PistonClient

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)

TRUNCATED_MESSAGE: str = "\n```\n```\nOutput too long. Message truncated.\n```"
Expand All@@ -20,10 +22,12 @@
# Discord character limit is 4096, but to prevent spamming, we reduce it to 1K


class UtilityRunCode(commands.Cog):
class UtilityRunCode(BaseCog):
"""Uses PistonAPI to run code in the server."""

def __init__(self, bot: Bot):
super().__init__(logger)

self.bot = bot
PISTON_API_TOKEN = os.environ.get("PISTON_API_TOKEN")
if not PISTON_API_TOKEN:
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/ticket.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,15 +8,19 @@
from discord import app_commands
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class AddTicketButton(commands.Cog):
class AddTicketButton(BaseCog):
"""
This is the slash command that sends our UI element.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot

@app_commands.command(description="Make a ticket and contact the Staff.")
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_avatars.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -27,12 +29,14 @@ def embed_avatar(before, after):
return embed


class LoggingAvatars(commands.Cog):
class LoggingAvatars(BaseCog):
"""
Simple listener to on_user_update
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.user_log = self.bot.api.get_one_log_setting("4") # User_log

Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_member_ban.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -25,13 +27,15 @@ def embed_ban(some_member, audit_log_entry):
return embed


class LoggingBans(commands.Cog):
class LoggingBans(BaseCog):
"""
Simple listener to on_member_remove
then checks the audit log for exact details
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.verification_role = self.bot.api.get_one_role("6")["role"][
"value"
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_member_kick.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -26,13 +28,15 @@ def embed_kick(some_member, audit_log_entry):
return embed


class LoggingKicks(commands.Cog):
class LoggingKicks(BaseCog):
"""
Simple listener to on_member_remove
then checks the audit log for exact details
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.verification_role = self.bot.api.get_one_role("6")["role"][
"value"
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); [BUG FIX]: Implicit import errors & cog_load method of MonthlyYappathon by Jiggly-Balls · Pull Request #149 · practical-python-org/Eos · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Dockerfile-api
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,4 +30,4 @@ ENV HOME="/api" \
PATH="/api/.venv/bin:$PATH"

EXPOSE ${FLASK_RUN_PORT}
CMD ["sh", "-c", "exec gunicorn -w 2 --timeout 60 --graceful-timeout 30 --access-logfile - --error-logfile - -b 0.0.0.0:${FLASK_RUN_PORT} --chdir /api/src/api 'api:create_app()'"]
CMD ["sh", "-c", "exec gunicorn -w 2 --timeout 60 --graceful-timeout 30 --access-logfile - --error-logfile - -b 0.0.0.0:${FLASK_RUN_PORT} --chdir /api 'src.api.api:create_app()'"]
17 changes: 9 additions & 8 deletions src/api/api.py
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
import logging
import os

from __logger__ import setup_logger
from core.db_helper import DB
from flask import Flask, jsonify
from routes.healthchecks import health_checks
from routes.logging import logs
from routes.parameters import parameters
from routes.points import points
from routes.roles import role
from routes.settings import settings
from werkzeug.exceptions import HTTPException

from src.api.__logger__ import setup_logger
Comment thread
Xarlos89 marked this conversation as resolved.
from src.api.core.db_helper import DB
from src.api.routes.healthchecks import health_checks
from src.api.routes.logging import logs
from src.api.routes.parameters import parameters
from src.api.routes.points import points
from src.api.routes.roles import role
from src.api.routes.settings import settings

logger = logging.getLogger(__name__)

TROOPHY = {"1", "true", "yes", "on"}
Expand Down
2 changes: 1 addition & 1 deletion src/bot/botrunner.sh
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env bash

export GIT_HASH=$(cat /commit_hash.txt)
uv run --frozen --no-cache --no-dev --package eos-bot python src/bot/main.py
uv run --frozen --no-cache --no-dev --package eos-bot python -m src.bot.main
27 changes: 27 additions & 0 deletions src/bot/cogs/__init__.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
from __future__ import annotations

from typing import TYPE_CHECKING

from discord.ext import commands

if TYPE_CHECKING:
from logging import Logger


__all__ = ("BaseCog",)


class BaseCog(commands.Cog):
"""The base cog which comes along with basic logging."""

def __init__(self, logger: None | Logger = None) -> None:
super().__init__()
self.logger: None | Logger = logger

async def cog_load(self) -> None:
if self.logger:
self.logger.info(f"Cog: {self.qualified_name} has been loaded.")

async def cog_unload(self) -> None:
if self.logger:
self.logger.info(f"Cog: {self.qualified_name} has been unloaded.")
6 changes: 5 additions & 1 deletion src/bot/cogs/admin/healthchecks.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -30,8 +32,10 @@ def embed_hc(api, db, uptime, git_hash):
return embed


class Health(commands.Cog):
class Health(BaseCog):
def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@commands.hybrid_command()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/points.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,8 @@
import discord
from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)

Expand All@@ -23,7 +24,7 @@ def embed_info(title, message, color):
return embed


class Points(commands.Cog):
class Points(BaseCog):
"""
This cog manages a points-based system for Discord guild members.

Expand All@@ -40,6 +41,8 @@ class Points(commands.Cog):

def __init__(self, bot: commands.Bot) -> None:
"""Initialization of the points Class"""
super().__init__(logger)

self.bot = bot

@is_admin()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/settings.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,8 @@
import discord
from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)

Expand All@@ -18,12 +19,14 @@ def sanitize_string(input_string):
return "".join(char for char in input_string if ord(char) < 128)


class Settings(commands.Cog):
class Settings(BaseCog):
"""
Settings Cog for managing various settings of the bot.
"""

def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@is_master_guild()
Expand Down
7 changes: 5 additions & 2 deletions src/bot/cogs/admin/sync.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,13 +2,16 @@

from discord.ext import commands

from .._checks import is_admin, is_master_guild
from src.bot.cogs import BaseCog
from src.bot.cogs._checks import is_admin, is_master_guild

logger = logging.getLogger(__name__)


class CommandSync(commands.Cog):
class CommandSync(BaseCog):
def __init__(self, bot: commands.Bot) -> None:
super().__init__(logger)

self.bot = bot

@commands.command(name="sync")
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/general_catfact.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,15 +7,19 @@
import aiohttp
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class GeneralCatFact(commands.Cog):
class GeneralCatFact(BaseCog):
"""
# Hits the catfact API and returns the response.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot

@commands.hybrid_command(name="catfact")
Expand Down
5 changes: 4 additions & 1 deletion src/bot/cogs/features/general_google.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,15 +6,18 @@

from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class GeneralSarcasticGoogle(commands.Cog):
class GeneralSarcasticGoogle(BaseCog):
"""
# Creates a link to the Let me google that for you site.
"""

def __init__(self, bot):
super().__init__(logger)
self.bot = bot

@commands.hybrid_command(name="google")
Expand Down
11 changes: 9 additions & 2 deletions src/bot/cogs/features/latex.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -10,7 +10,8 @@
from discord import app_commands
from discord.ext import commands

from ..constants import LATEX_COLORS
from src.bot.cogs import BaseCog
from src.bot.cogs.constants import LATEX_COLORS

logger = logging.getLogger(__name__)

Expand All@@ -29,19 +30,25 @@ def embed_info(title: str, message: str, image_url: str | None = None) -> discor
return embed


class LaTeX(commands.Cog):
class LaTeX(BaseCog):
"""
# Generates a LaTeX equation image using the CodeCogs API and displays it in an embed.
"""

def __init__(self, bot: commands.Bot):
super().__init__(logger)

self.bot = bot
self.session: aiohttp.ClientSession | None = None

async def cog_load(self) -> None:
await super().cog_load()

self.session = aiohttp.ClientSession()

async def cog_unload(self) -> None:
await super().cog_unload()

if self.session:
await self.session.close()

Expand Down
12 changes: 9 additions & 3 deletions src/bot/cogs/features/monthly_yapathon.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,9 +6,11 @@
import logging
import os

from discord.ext import commands, tasks
from discord.ext import tasks
from discord.utils import get

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -17,20 +19,24 @@
DATE = 1


class MonthlyYapathon(commands.Cog):
class MonthlyYapathon(BaseCog):
"""
This cog deals with all the stuff of monthly yapathon.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.yapper_role_id = self.bot.api.get_one_role("8")["role"]["value"]
self.announcement_channel_id = self.bot.api.get_one_setting("5")["setting"][
"value"
]
self.appoint_monthly_yapper.start()

def cog_unload(self):
async def cog_unload(self):
await super().cog_unload()

self.appoint_monthly_yapper.cancel()

@tasks.loop(time=TIME)
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/run_code.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,6 +11,8 @@
from discord.ext.commands import Bot, Context
from ultra_piston import File, PistonClient

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)

TRUNCATED_MESSAGE: str = "\n```\n```\nOutput too long. Message truncated.\n```"
Expand All@@ -20,10 +22,12 @@
# Discord character limit is 4096, but to prevent spamming, we reduce it to 1K


class UtilityRunCode(commands.Cog):
class UtilityRunCode(BaseCog):
"""Uses PistonAPI to run code in the server."""

def __init__(self, bot: Bot):
super().__init__(logger)

self.bot = bot
PISTON_API_TOKEN = os.environ.get("PISTON_API_TOKEN")
if not PISTON_API_TOKEN:
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/features/ticket.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,15 +8,19 @@
from discord import app_commands
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


class AddTicketButton(commands.Cog):
class AddTicketButton(BaseCog):
"""
This is the slash command that sends our UI element.
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot

@app_commands.command(description="Make a ticket and contact the Staff.")
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_avatars.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -27,12 +29,14 @@ def embed_avatar(before, after):
return embed


class LoggingAvatars(commands.Cog):
class LoggingAvatars(BaseCog):
"""
Simple listener to on_user_update
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.user_log = self.bot.api.get_one_log_setting("4") # User_log

Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_member_ban.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -25,13 +27,15 @@ def embed_ban(some_member, audit_log_entry):
return embed


class LoggingBans(commands.Cog):
class LoggingBans(BaseCog):
"""
Simple listener to on_member_remove
then checks the audit log for exact details
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.verification_role = self.bot.api.get_one_role("6")["role"][
"value"
Expand Down
6 changes: 5 additions & 1 deletion src/bot/cogs/logging/logging_member_kick.py
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,8 @@
import discord
from discord.ext import commands

from src.bot.cogs import BaseCog

logger = logging.getLogger(__name__)


Expand All@@ -26,13 +28,15 @@ def embed_kick(some_member, audit_log_entry):
return embed


class LoggingKicks(commands.Cog):
class LoggingKicks(BaseCog):
"""
Simple listener to on_member_remove
then checks the audit log for exact details
"""

def __init__(self, bot):
super().__init__(logger)

self.bot = bot
self.verification_role = self.bot.api.get_one_role("6")["role"][
"value"
Expand Down
Loading
Loading