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 .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ BOT_OWNER_COOLDOWN=5


# OpenAI API key
BOT_OPENAI_MODEL=gpt-5.2
BOT_OPENAI_MODEL=gpt-5.4
OPENAI_API_KEY=


Expand Down
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "DiscordBot"
version = "3.0.10"
version = "3.0.11"
description = "A simple Discord bot with OpenAI support and server administration tools"
urls.Repository = "https://github.com/ddc/DiscordBot"
urls.Homepage = "https://ddc.github.io/DiscordBot"
Expand Down Expand Up @@ -47,7 +47,7 @@ dev = [
"coverage>=7.13.5",
"poethepoet>=0.42.1",
"pytest-asyncio>=1.3.0",
"ruff>=0.15.7",
"ruff>=0.15.8",
"testcontainers[postgres]>=4.14.2",
]

Expand Down
7 changes: 6 additions & 1 deletion src/bot/cogs/events/on_disconnect.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,12 @@ async def on_disconnect(self) -> None:
- Discord terminating the connection
"""
try:
self.bot.log.warning(messages.bot_disconnected(self.bot.user))
ws = self.bot.ws
close_code = getattr(ws, "close_code", None) if ws else None
msg = messages.bot_disconnected(self.bot.user)
if close_code:
msg += f" (close code: {close_code})"
self.bot.log.warning(msg)
except Exception as e:
# Fallback logging in case of critical failure
print(f"Bot disconnected - logging failed: {e}")
Expand Down
20 changes: 20 additions & 0 deletions src/bot/cogs/events/on_resumed.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from discord.ext import commands
from src.bot.constants import messages
from src.bot.discord_bot import Bot


class OnResumed(commands.Cog):
def __init__(self, bot: Bot) -> None:
self.bot = bot

@commands.Cog.listener()
async def on_resumed(self) -> None:
"""Called when the client has resumed a session after a disconnect"""
try:
self.bot.log.info(messages.bot_resumed(self.bot.user))
except Exception as e:
print(f"Bot resumed - logging failed: {e}")


async def setup(bot: Bot) -> None:
await bot.add_cog(OnResumed(bot))
5 changes: 5 additions & 0 deletions src/bot/constants/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ def starting(seconds: int) -> str:
def disconnected(bot_user) -> str:
return f"Bot {bot_user} disconnected from Discord"

@staticmethod
def resumed(bot_user) -> str:
return f"Bot {bot_user} resumed connection to Discord"


class Admin:
@staticmethod
Expand Down Expand Up @@ -241,6 +245,7 @@ class Owner:
bot_online = Bot.online
bot_starting = Bot.starting
bot_disconnected = Bot.disconnected
bot_resumed = Bot.resumed

# Admin
bot_announce_playing = Admin.announce_playing
Expand Down
15 changes: 15 additions & 0 deletions tests/unit/bot/events/test_bot_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,17 +248,32 @@ async def test_setup_function(self, mock_bot):
@pytest.mark.asyncio
async def test_on_disconnect_event_logs_warning(self, mock_bot):
"""Test on_disconnect event logs a warning message."""
mock_bot.ws = None
cog = OnDisconnect(mock_bot)

# Call the listener method directly
await cog.on_disconnect()

mock_bot.log.warning.assert_called_once_with(messages.bot_disconnected(mock_bot.user))

@pytest.mark.asyncio
async def test_on_disconnect_event_logs_close_code(self, mock_bot):
"""Test on_disconnect event logs close code when available."""
mock_ws = MagicMock()
mock_ws.close_code = 1001
mock_bot.ws = mock_ws
cog = OnDisconnect(mock_bot)

await cog.on_disconnect()

expected_msg = f"{messages.bot_disconnected(mock_bot.user)} (close code: 1001)"
mock_bot.log.warning.assert_called_once_with(expected_msg)

@pytest.mark.asyncio
@patch("src.bot.cogs.events.on_disconnect.messages")
async def test_on_disconnect_event_with_bot_disconnected_message(self, mock_messages, mock_bot):
"""Test on_disconnect event calls bot_disconnected function."""
mock_bot.ws = None
mock_messages.bot_disconnected.return_value = f"Bot {mock_bot.user} has disconnected!"

cog = OnDisconnect(mock_bot)
Expand Down
46 changes: 23 additions & 23 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading