diff --git a/.vscode/settings.json b/.vscode/settings.json index a8cedf8..4ed75f6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,6 +6,7 @@ "CLANLEADER", "Dakiny", "DISCORDMANAGER", - "highcouncil" + "highcouncil", + "nextcord" ] -} \ No newline at end of file +} diff --git a/dakiny_bot/__init__.py b/dakiny_bot/__init__.py new file mode 100644 index 0000000..d5b3590 --- /dev/null +++ b/dakiny_bot/__init__.py @@ -0,0 +1 @@ +"""Empty init file for dakiny_bot module.""" diff --git a/dakiny_bot/__main__.py b/dakiny_bot/__main__.py new file mode 100644 index 0000000..9c0afa0 --- /dev/null +++ b/dakiny_bot/__main__.py @@ -0,0 +1,14 @@ +"""Starts the app for dakiny_bot.""" + +import logging + +from .app import run + +nextcord_logger = logging.getLogger("nextcord") +nextcord_logger.setLevel(logging.DEBUG) +nextcord_handler = logging.FileHandler(filename="nextcord.log", encoding="utf-8", mode="w") +nextcord_handler.setFormatter(logging.Formatter("%(asctime)s:%(levelname)s:%(name)s: %(message)s")) +nextcord_logger.addHandler(nextcord_handler) + +if __name__ == "__main__": + run() diff --git a/dakiny_bot/main.py b/dakiny_bot/app.py similarity index 82% rename from dakiny_bot/main.py rename to dakiny_bot/app.py index ef9bfb8..1a446e2 100644 --- a/dakiny_bot/main.py +++ b/dakiny_bot/app.py @@ -6,12 +6,13 @@ import os import nextcord from nextcord.ext import commands -from classes.nominate_highcouncil_views import NominateHighCouncilView -from classes.nominate_views import NominateView -from classes.voting_highcouncil_views import VoteHighcouncilView -from classes.voting_views import VoteView -from DakinySettings import settings -from database_setup import create_database +from dakiny_bot.classes.nominate_highcouncil_views import NominateHighCouncilView +from dakiny_bot.classes.nominate_views import NominateView +from dakiny_bot.classes.voting_highcouncil_views import VoteHighcouncilView +from dakiny_bot.classes.voting_views import VoteView +from dakiny_bot.database import create_database + +from .DakinySettings import settings birthday_list: list[int] = [] @@ -22,7 +23,7 @@ handler.setFormatter(logging.Formatter("%(asctime)s:%(levelname)s:%(name)s: %(me logger.addHandler(handler) -def main() -> None: +def run() -> None: """Builds and runs bot.""" # Allows privileged intents for monitoring members joining, roles editing, and role assignments # These need to be enabled in the developer portal as well @@ -53,7 +54,3 @@ def main() -> None: # Run Discord bot bot.run(settings.params.discord_token) - - -if __name__ == "__main__": - main() diff --git a/dakiny_bot/classes/election.py b/dakiny_bot/classes/election.py index 5f02483..1130dbf 100644 --- a/dakiny_bot/classes/election.py +++ b/dakiny_bot/classes/election.py @@ -5,20 +5,21 @@ from datetime import UTC, datetime, timedelta from pathlib import Path import nextcord -from classes.nominate_highcouncil_views import NominateHighCouncilView -from classes.nominate_views import NominateView -from classes.voting_highcouncil_views import VoteHighcouncilView -from classes.voting_views import VoteView -from DakinySettings import settings -from database_setup.sql_data_classes import ( +from sqlalchemy import select, true, update +from sqlalchemy.orm import Session + +from dakiny_bot.classes.nominate_highcouncil_views import NominateHighCouncilView +from dakiny_bot.classes.nominate_views import NominateView +from dakiny_bot.classes.voting_highcouncil_views import VoteHighcouncilView +from dakiny_bot.classes.voting_views import VoteView +from dakiny_bot.DakinySettings import settings +from dakiny_bot.database.sql_data_classes import ( CouncilMembers, ElectionInformation, Votes, engine, ) -from sqlalchemy import select, true, update -from sqlalchemy.orm import Session -from utils import ( +from dakiny_bot.utils import ( TEMPLATES_DIR, VoteType, build_highcouncil_votes_str, diff --git a/dakiny_bot/classes/nominate_highcouncil_views.py b/dakiny_bot/classes/nominate_highcouncil_views.py index e461ac1..c74a768 100644 --- a/dakiny_bot/classes/nominate_highcouncil_views.py +++ b/dakiny_bot/classes/nominate_highcouncil_views.py @@ -1,12 +1,13 @@ """Contains various views to be used in the high council nomination process.""" import nextcord -from DakinySettings import settings -from database_setup.sql_data_classes import CouncilMembers, engine from nextcord.interactions import Interaction from sqlalchemy import select from sqlalchemy.orm import Session -from utils import ( + +from dakiny_bot.DakinySettings import settings +from dakiny_bot.database.sql_data_classes import CouncilMembers, engine +from dakiny_bot.utils import ( NOMINEE_SPLITTER, decorate_cl_nomination, decorate_dm_nomination, diff --git a/dakiny_bot/classes/nominate_views.py b/dakiny_bot/classes/nominate_views.py index 3f7858a..06f5e7e 100644 --- a/dakiny_bot/classes/nominate_views.py +++ b/dakiny_bot/classes/nominate_views.py @@ -1,12 +1,13 @@ """Contains various views to be used in the nomination process.""" import nextcord -from DakinySettings import settings -from database_setup.sql_data_classes import CouncilMembers, engine from nextcord.interactions import Interaction from sqlalchemy import select from sqlalchemy.orm import Session -from utils import NOMINEE_SPLITTER, decorate_nomination, get_election_name + +from dakiny_bot.DakinySettings import settings +from dakiny_bot.database.sql_data_classes import CouncilMembers, engine +from dakiny_bot.utils import NOMINEE_SPLITTER, decorate_nomination, get_election_name class NominateModal(nextcord.ui.Modal): diff --git a/dakiny_bot/classes/voting_highcouncil_views.py b/dakiny_bot/classes/voting_highcouncil_views.py index 9ccd3ca..cc013c2 100644 --- a/dakiny_bot/classes/voting_highcouncil_views.py +++ b/dakiny_bot/classes/voting_highcouncil_views.py @@ -1,18 +1,19 @@ """Contains various views to be used while voting for high council. Controls the logic when performing the vote.""" import nextcord -from DakinySettings import settings -from database_setup.sql_data_classes import ( +from nextcord import SelectOption +from nextcord.interactions import Interaction +from sqlalchemy import exc, select, update +from sqlalchemy.orm import Session + +from dakiny_bot.DakinySettings import settings +from dakiny_bot.database.sql_data_classes import ( CouncilMembers, ElectionInformation, Votes, engine, ) -from nextcord import SelectOption -from nextcord.interactions import Interaction -from sqlalchemy import exc, select, update -from sqlalchemy.orm import Session -from utils import VoteType, build_highcouncil_votes_str, get_election_name +from dakiny_bot.utils import VoteType, build_highcouncil_votes_str, get_election_name class VoteSelect(nextcord.ui.StringSelect): diff --git a/dakiny_bot/classes/voting_views.py b/dakiny_bot/classes/voting_views.py index 1ee91fe..5681cee 100644 --- a/dakiny_bot/classes/voting_views.py +++ b/dakiny_bot/classes/voting_views.py @@ -1,18 +1,19 @@ """Contains various views to be used while voting. Controls the logic when performing the vote.""" import nextcord -from DakinySettings import settings -from database_setup.sql_data_classes import ( +from nextcord import SelectOption +from nextcord.interactions import Interaction +from sqlalchemy import exc, select, update +from sqlalchemy.orm import Session + +from dakiny_bot.DakinySettings import settings +from dakiny_bot.database.sql_data_classes import ( CouncilMembers, ElectionInformation, Votes, engine, ) -from nextcord import SelectOption -from nextcord.interactions import Interaction -from sqlalchemy import exc, select, update -from sqlalchemy.orm import Session -from utils import VoteType, build_votes_str, get_election_name +from dakiny_bot.utils import VoteType, build_votes_str, get_election_name class VoteSelect(nextcord.ui.StringSelect): diff --git a/dakiny_bot/cogs/clan_messages/__init__.py b/dakiny_bot/cogs/clan_messages/__init__.py index 63fdd0d..bd1e1f6 100644 --- a/dakiny_bot/cogs/clan_messages/__init__.py +++ b/dakiny_bot/cogs/clan_messages/__init__.py @@ -8,9 +8,9 @@ from fastapi import FastAPI from git import Repo from nextcord.ext import commands -from classes.gitea_webhook import GiteaWebhook -from DakinySettings import settings -from utils import REPO_DIR, edit_clan_council_info, update_clan_messages +from dakiny_bot.classes.gitea_webhook import GiteaWebhook +from dakiny_bot.DakinySettings import settings +from dakiny_bot.utils import REPO_DIR, edit_clan_council_info, update_clan_messages if TYPE_CHECKING: import nextcord diff --git a/dakiny_bot/cogs/commands/__init__.py b/dakiny_bot/cogs/commands/__init__.py index 16d5af9..9205764 100644 --- a/dakiny_bot/cogs/commands/__init__.py +++ b/dakiny_bot/cogs/commands/__init__.py @@ -2,15 +2,15 @@ from nextcord.ext import commands -from cogs.commands.record import RecordCog -from cogs.commands.refresh import RefreshCog -from cogs.commands.remove import RemoveCog -from cogs.commands.request import RequestCog -from cogs.commands.set import SetCog -from cogs.commands.settings import SettingsCog -from cogs.commands.test import TestCog -from cogs.commands.time import TimeCog -from cogs.commands.view import ViewCog +from dakiny_bot.cogs.commands.record import RecordCog +from dakiny_bot.cogs.commands.refresh import RefreshCog +from dakiny_bot.cogs.commands.remove import RemoveCog +from dakiny_bot.cogs.commands.request import RequestCog +from dakiny_bot.cogs.commands.set import SetCog +from dakiny_bot.cogs.commands.settings import SettingsCog +from dakiny_bot.cogs.commands.test import TestCog +from dakiny_bot.cogs.commands.time import TimeCog +from dakiny_bot.cogs.commands.view import ViewCog # This function will be called when this extension is loaded. diff --git a/dakiny_bot/cogs/commands/record.py b/dakiny_bot/cogs/commands/record.py index ed1fbfc..070b323 100644 --- a/dakiny_bot/cogs/commands/record.py +++ b/dakiny_bot/cogs/commands/record.py @@ -4,8 +4,8 @@ import nextcord from discord import TextInputStyle from nextcord.ext import commands -from DakinySettings import settings -from utils import GUILDS, MAX_DISCORD_MESSAGE_LENGTH, PointType, record_points +from dakiny_bot.DakinySettings import settings +from dakiny_bot.utils import GUILDS, MAX_DISCORD_MESSAGE_LENGTH, PointType, record_points class RecordCog(commands.Cog, name="Record Commands"): diff --git a/dakiny_bot/cogs/commands/refresh.py b/dakiny_bot/cogs/commands/refresh.py index a42cecc..710d3fc 100644 --- a/dakiny_bot/cogs/commands/refresh.py +++ b/dakiny_bot/cogs/commands/refresh.py @@ -6,7 +6,7 @@ from pathlib import Path import nextcord from nextcord.ext import commands -from utils import MESSAGES_DIR, edit_clan_council_info, update_clan_messages +from dakiny_bot.utils import MESSAGES_DIR, edit_clan_council_info, update_clan_messages class RefreshCog(commands.Cog, name="Refresh Commands"): diff --git a/dakiny_bot/cogs/commands/remove.py b/dakiny_bot/cogs/commands/remove.py index d5b72e2..6be5e89 100644 --- a/dakiny_bot/cogs/commands/remove.py +++ b/dakiny_bot/cogs/commands/remove.py @@ -5,7 +5,7 @@ from nextcord.ext import commands from sqlalchemy import delete, select from sqlalchemy.orm import Session -from database_setup.sql_data_classes import Presences, engine +from dakiny_bot.database.sql_data_classes import Presences, engine class RemoveCog(commands.Cog, name="Remove Commands"): @@ -54,14 +54,14 @@ class RemoveCog(commands.Cog, name="Remove Commands"): """ with Session(engine) as session: stmt = select(Presences) - presences_dict: dict[str,str] = {pres.Presence: str(pres.Id) for pres in session.scalars(stmt)} + presences_dict: dict[str, str] = {pres.Presence: str(pres.Id) for pres in session.scalars(stmt)} # if empty compare string if not presence_str: await interaction.response.send_autocomplete(dict(list(presences_dict.items())[:25])) return - autofilled_presences: dict[str,str] = { + autofilled_presences: dict[str, str] = { pres: pres_id for pres, pres_id in presences_dict.items() if presence_str.lower() in pres.lower() } await interaction.response.send_autocomplete(autofilled_presences[:25]) diff --git a/dakiny_bot/cogs/commands/request.py b/dakiny_bot/cogs/commands/request.py index 9004c8c..004ce8b 100644 --- a/dakiny_bot/cogs/commands/request.py +++ b/dakiny_bot/cogs/commands/request.py @@ -4,8 +4,8 @@ import nextcord from nextcord.ext import commands from sqlalchemy.orm import Session -from DakinySettings import settings -from database_setup.sql_data_classes import Presences, engine +from dakiny_bot.DakinySettings import settings +from dakiny_bot.database.sql_data_classes import Presences, engine class RequestCog(commands.Cog, name="Request Commands"): diff --git a/dakiny_bot/cogs/commands/set.py b/dakiny_bot/cogs/commands/set.py index 2165241..64bf39d 100644 --- a/dakiny_bot/cogs/commands/set.py +++ b/dakiny_bot/cogs/commands/set.py @@ -8,8 +8,8 @@ from sqlalchemy import delete, select from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import Session -from database_setup.sql_data_classes import UserBirthday, engine -from main import birthday_list +from dakiny_bot.app import birthday_list +from dakiny_bot.database.sql_data_classes import UserBirthday, engine class SetCog(commands.Cog, name="Set Commands"): diff --git a/dakiny_bot/cogs/commands/settings.py b/dakiny_bot/cogs/commands/settings.py index de3914c..05d51f8 100644 --- a/dakiny_bot/cogs/commands/settings.py +++ b/dakiny_bot/cogs/commands/settings.py @@ -3,8 +3,8 @@ import nextcord from nextcord.ext import commands -from DakinySettings import settings -from utils import GUILDS +from dakiny_bot.DakinySettings import settings +from dakiny_bot.utils import GUILDS class SettingsCog(commands.Cog, name="Settings Commands"): diff --git a/dakiny_bot/cogs/commands/test.py b/dakiny_bot/cogs/commands/test.py index 208e99b..39861c4 100644 --- a/dakiny_bot/cogs/commands/test.py +++ b/dakiny_bot/cogs/commands/test.py @@ -3,9 +3,9 @@ import nextcord from nextcord.ext import application_checks, commands -from classes.election import Election -from DakinySettings import settings -from utils import GUILDS, get_active_election_cycle, get_quarter_name +from dakiny_bot.classes.election import Election +from dakiny_bot.DakinySettings import settings +from dakiny_bot.utils import GUILDS, get_active_election_cycle, get_quarter_name ME = 206602713511886849 diff --git a/dakiny_bot/cogs/commands/time.py b/dakiny_bot/cogs/commands/time.py index cb3ddef..a9a5799 100644 --- a/dakiny_bot/cogs/commands/time.py +++ b/dakiny_bot/cogs/commands/time.py @@ -5,7 +5,7 @@ from datetime import MAXYEAR, MINYEAR, UTC, datetime import nextcord from nextcord.ext import commands -from utils import GUILDS +from dakiny_bot.utils import GUILDS class TimeCog(commands.Cog, name="Time Commands"): diff --git a/dakiny_bot/cogs/commands/view.py b/dakiny_bot/cogs/commands/view.py index cf4d2d1..dec2d1e 100644 --- a/dakiny_bot/cogs/commands/view.py +++ b/dakiny_bot/cogs/commands/view.py @@ -6,13 +6,13 @@ from nextcord.ext import commands from sqlalchemy import select from sqlalchemy.orm import Session -from database_setup.sql_data_classes import ( +from dakiny_bot.database.sql_data_classes import ( Points, Presences, Votes, engine, ) -from utils import GUILDS, MAX_DISCORD_MESSAGE_LENGTH, PointType, VoteType +from dakiny_bot.utils import GUILDS, MAX_DISCORD_MESSAGE_LENGTH, PointType, VoteType class ViewCog(commands.Cog, name="View Commands"): diff --git a/dakiny_bot/cogs/loops/__init__.py b/dakiny_bot/cogs/loops/__init__.py index 56102bf..050c359 100644 --- a/dakiny_bot/cogs/loops/__init__.py +++ b/dakiny_bot/cogs/loops/__init__.py @@ -2,8 +2,8 @@ from nextcord.ext import commands -from cogs.loops.bot_presence import BotPresence -from cogs.loops.daily_loop import DailyLoop +from dakiny_bot.cogs.loops.bot_presence import BotPresence +from dakiny_bot.cogs.loops.daily_loop import DailyLoop def setup(bot: commands.Bot) -> None: diff --git a/dakiny_bot/cogs/loops/bot_presence.py b/dakiny_bot/cogs/loops/bot_presence.py index 71ed2f5..cf037d2 100644 --- a/dakiny_bot/cogs/loops/bot_presence.py +++ b/dakiny_bot/cogs/loops/bot_presence.py @@ -5,7 +5,7 @@ from nextcord.ext import commands, tasks from sqlalchemy import func, select from sqlalchemy.orm import Session -from database_setup.sql_data_classes import Presences, engine +from dakiny_bot.database.sql_data_classes import Presences, engine class BotPresence(commands.Cog, name="Bot Presence"): diff --git a/dakiny_bot/cogs/loops/daily_loop.py b/dakiny_bot/cogs/loops/daily_loop.py index abe028e..3602714 100644 --- a/dakiny_bot/cogs/loops/daily_loop.py +++ b/dakiny_bot/cogs/loops/daily_loop.py @@ -9,11 +9,11 @@ from pytz import timezone from sqlalchemy import select from sqlalchemy.orm import Session -from classes.election import Election -from DakinySettings import settings -from database_setup.sql_data_classes import UserBirthday, engine -from main import birthday_list -from utils import get_active_election_cycle +from dakiny_bot.app import birthday_list +from dakiny_bot.classes.election import Election +from dakiny_bot.DakinySettings import settings +from dakiny_bot.database.sql_data_classes import UserBirthday, engine +from dakiny_bot.utils import get_active_election_cycle if TYPE_CHECKING: import nextcord diff --git a/dakiny_bot/cogs/message_listener/__init__.py b/dakiny_bot/cogs/message_listener/__init__.py index a53ef34..8f1229a 100644 --- a/dakiny_bot/cogs/message_listener/__init__.py +++ b/dakiny_bot/cogs/message_listener/__init__.py @@ -3,7 +3,7 @@ import nextcord from nextcord.ext import commands -from main import birthday_list +from dakiny_bot.app import birthday_list class SubmissionListener(commands.Cog, name="Message Listener"): diff --git a/dakiny_bot/utils.py b/dakiny_bot/utils.py index fc21c61..a86c26e 100644 --- a/dakiny_bot/utils.py +++ b/dakiny_bot/utils.py @@ -12,8 +12,7 @@ import nextcord from sqlalchemy import select, true, update from sqlalchemy.orm import Session -from DakinySettings import settings -from database_setup.sql_data_classes import ( +from dakiny_bot.database.sql_data_classes import ( CouncilMembers, Messages, Points, @@ -22,6 +21,8 @@ from database_setup.sql_data_classes import ( engine, ) +from .DakinySettings import settings + NOMINEE_SPLITTER = "========================================\n\n" REPO_DIR = "./dakiny-messages" MESSAGES_DIR = f"{REPO_DIR}/messages"