diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..2eea525 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6b9df02 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.mp3 filter=lfs diff=lfs merge=lfs -text diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index f864ad0..f259bd7 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -15,6 +15,8 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@main + with: + lfs: true - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3.10.0 diff --git a/.gitignore b/.gitignore index 8278892..227dd29 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,9 @@ ENV/ logs/ *.log +# App specific +bot-data/ + # IDE / Editor settings .vscode/ .idea/ diff --git a/Dockerfile b/Dockerfile index a99ded1..f8c8b9a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,6 @@ -FROM python:alpine +FROM python:slim-bookworm + +RUN apt update && apt install -y ffmpeg WORKDIR /aw-bot @@ -7,6 +9,7 @@ RUN pip install --no-cache-dir -r requirements.txt COPY bot /aw-bot/bot COPY database /aw-bot/database +COPY sounds /aw-bot/sounds COPY aw.py . ENV BOT_TOKEN="" diff --git a/aw.py b/aw.py index 8f16ea1..4774806 100644 --- a/aw.py +++ b/aw.py @@ -1,3 +1,4 @@ +from dotenv import load_dotenv import os import discord @@ -13,6 +14,9 @@ OFFTOPIC_CHANNEL = 1112048063448617142 intents = discord.Intents.all() bot = commands.Bot(command_prefix="!", intents=intents) +# Load environment variables from .env file (if it exists) +load_dotenv(override=True) + initialize_db() diff --git a/bot/events.py b/bot/events.py index 753e020..df3ecdc 100644 --- a/bot/events.py +++ b/bot/events.py @@ -6,6 +6,7 @@ from bot.events_handlers import ( handle_bulk_message_delete, handle_message_delete, handle_message, + handle_voice_state_update, ) @@ -38,4 +39,8 @@ async def setup(bot): async def on_message_edit(before, after): await handle_message_edit(before, after, bot) + @bot.event + async def on_voice_state_update(member, before, after): + await handle_voice_state_update(member, before, after, bot) + print("Events extension loaded!") diff --git a/bot/events_handlers/__init__.py b/bot/events_handlers/__init__.py index bcdae8a..4fe18dc 100644 --- a/bot/events_handlers/__init__.py +++ b/bot/events_handlers/__init__.py @@ -6,3 +6,4 @@ from .message_events import ( handle_message_delete, handle_message, ) +from .voice_events import handle_voice_state_update diff --git a/bot/events_handlers/voice_events.py b/bot/events_handlers/voice_events.py new file mode 100644 index 0000000..ef3ef2a --- /dev/null +++ b/bot/events_handlers/voice_events.py @@ -0,0 +1,31 @@ +import discord +import asyncio + +MP3_PATH = "sounds/hello.mp3" + + +async def handle_voice_state_update(member, before, after, bot): + # Ignore bot users + if member.bot: + return + + # Check if the member joined a new voice channel + if after.channel and (before.channel != after.channel): + voice_channel = after.channel + + try: + # Join the voice channel + vc = await voice_channel.connect() + + # Play the MP3 file + vc.play(discord.FFmpegPCMAudio(MP3_PATH)) + + # Wait for playback to finish + while vc.is_playing(): + await asyncio.sleep(1) + + # Disconnect + await vc.disconnect() + + except Exception as e: + print(f"Error: {e}") diff --git a/requirements.txt b/requirements.txt index 2371911..ad3c552 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,5 @@ discord.py requests audioop-lts +python-dotenv +pynacl diff --git a/sounds/hello.mp3 b/sounds/hello.mp3 new file mode 100644 index 0000000..a1df1ec --- /dev/null +++ b/sounds/hello.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca2ae9afe287a472266ec3875db378154582a7344e459d205a1bfa5569615dc3 +size 23691