Compare commits

...
5 Commits
Author SHA1 Message Date
imcompiling 1ab9cdfea3 Added editorconfig and dockerignore. Update the dockerfile to use uv.
build_develop / build (push) Successful in 38s
2025-03-19 10:08:01 -04:00
imcompiling 5748159279 Update launch module. 2025-03-19 09:58:06 -04:00
imcompiling 12b700f340 Update imports for new file structure. 2025-03-19 09:57:36 -04:00
imcompiling 89534ed5b8 Rename database package. 2025-03-19 09:52:15 -04:00
imcompiling 80dde1e8ed Move all files into dakiny_bot package. 2025-03-19 09:41:54 -04:00
38 changed files with 139 additions and 101 deletions
+6
View File
@@ -0,0 +1,6 @@
.*
Dockerfile
LICENSE
README.md
renovate.json
permissions_required.txt
+16
View File
@@ -0,0 +1,16 @@
# see https://editorconfig.org/
root = true
[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 4
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
[*.{yml,yaml}]
indent_size = 2
+1 -1
View File
@@ -137,5 +137,5 @@ TODO.txt
sql_tester.py
conf
outputs
database
/database
dakiny-messages/
+2 -1
View File
@@ -4,6 +4,7 @@
"ms-python.python",
"ms-python.debugpy",
"charliermarsh.ruff",
"alexcvzz.vscode-sqlite"
"alexcvzz.vscode-sqlite",
"editorconfig.editorconfig"
]
}
+1 -1
View File
@@ -8,7 +8,7 @@
"name": "Python: Module",
"type": "debugpy",
"request": "launch",
"module": "main",
"module": "dakiny_bot",
"justMyCode": true
}
]
+2 -1
View File
@@ -6,6 +6,7 @@
"CLANLEADER",
"Dakiny",
"DISCORDMANAGER",
"highcouncil"
"highcouncil",
"nextcord"
]
}
+8 -12
View File
@@ -3,17 +3,13 @@ FROM python:3.12.3-slim
# install dependencies
RUN apt-get update && apt-get -y upgrade && apt-get -y install git sqlite3
# install uv
COPY --from=ghcr.io/astral-sh/uv:0.6.5 /uv /uvx /bin/
COPY . /home
# Sync the project into a new environment, using the frozen lockfile
WORKDIR /home
RUN uv sync --frozen --no-dev
COPY DakinySettings.py DakinySettings.py
COPY main.py main.py
COPY utils.py utils.py
COPY pyproject.toml pyproject.toml
COPY classes classes/
COPY cogs cogs/
COPY database_setup database_setup/
RUN pip install --upgrade pip && pip install poetry && poetry export -f requirements.txt --output requirements.txt && pip install -r requirements.txt
CMD ["python3", "-u", "./main.py"]
CMD ["uv", "run", "--frozen", "--no-dev", "-m", "dakiny_bot"]
+1
View File
@@ -0,0 +1 @@
"""Empty init file for dakiny_bot module."""
+14
View File
@@ -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()
+8 -11
View File
@@ -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()
@@ -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,
@@ -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,
@@ -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):
@@ -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):
@@ -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):
@@ -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
@@ -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.
@@ -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"):
@@ -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"):
@@ -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])
@@ -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"):
@@ -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"):
@@ -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"):
@@ -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
@@ -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"):
@@ -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"):
@@ -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:
@@ -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"):
@@ -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
@@ -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"):
+3 -2
View File
@@ -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"