Skip to content
Closed
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
13 changes: 12 additions & 1 deletion gateway/platforms/discord.py
Original file line number Diff line number Diff line change
Expand Up @@ -1500,7 +1500,17 @@ async def slash_thread(
def _build_slash_event(self, interaction: discord.Interaction, text: str) -> MessageEvent:
"""Build a MessageEvent from a Discord slash command interaction."""
is_dm = isinstance(interaction.channel, discord.DMChannel)
chat_type = "dm" if is_dm else "group"
is_thread = isinstance(interaction.channel, discord.Thread)
thread_id = None

if is_dm:
chat_type = "dm"
elif is_thread:
chat_type = "thread"
thread_id = str(interaction.channel_id)
else:
chat_type = "group"

chat_name = ""
if not is_dm and hasattr(interaction.channel, "name"):
chat_name = interaction.channel.name
Expand All @@ -1516,6 +1526,7 @@ def _build_slash_event(self, interaction: discord.Interaction, text: str) -> Mes
chat_type=chat_type,
user_id=str(interaction.user.id),
user_name=interaction.user.display_name,
thread_id=thread_id,
chat_topic=chat_topic,
)

Expand Down
36 changes: 36 additions & 0 deletions tests/gateway/test_discord_slash_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,42 @@ async def capture_handle(event):
assert "TestGuild" in event.source.chat_name


# ------------------------------------------------------------------
# _build_slash_event β€” preserve thread context for native slash commands
# ------------------------------------------------------------------


def test_build_slash_event_preserves_thread_context(adapter):
interaction = SimpleNamespace(
channel=_FakeThreadChannel(channel_id=555, name="Planning"),
channel_id=555,
user=SimpleNamespace(display_name="Jezza", id=42),
)

event = adapter._build_slash_event(interaction, "/status")

assert event.text == "/status"
assert event.source.chat_id == "555"
assert event.source.chat_type == "thread"
assert event.source.thread_id == "555"
assert "TestGuild" in event.source.chat_name


def test_build_slash_event_uses_group_context_for_channels(adapter):
interaction = SimpleNamespace(
channel=_FakeTextChannel(channel_id=123, name="general"),
channel_id=123,
user=SimpleNamespace(display_name="Jezza", id=42),
)

event = adapter._build_slash_event(interaction, "/status")

assert event.source.chat_id == "123"
assert event.source.chat_type == "group"
assert event.source.thread_id is None
assert "TestGuild / #general" == event.source.chat_name


# ------------------------------------------------------------------
# Auto-thread: _auto_create_thread
# ------------------------------------------------------------------
Expand Down