Skip to content

Commit 5a41e76

Browse files
thatsmeclaude
andcommitted
Discord: chunk messages over 2000 chars, fix /skills and /workflows
Discord API rejects messages over 2000 characters. Added line-aware chunking that splits long responses into multiple messages without breaking mid-line. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 9b40dbb commit 5a41e76

1 file changed

Lines changed: 32 additions & 6 deletions

File tree

lib/alex_claw/gateway/discord.ex

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,26 @@ defmodule AlexClaw.Gateway.Discord do
2727

2828
@impl AlexClaw.Gateway.Behaviour
2929
@spec send_message(String.t(), keyword()) :: :ok
30+
@discord_max_length 2000
31+
3032
def send_message(text, opts \\ []) do
3133
channel_id = Keyword.get(opts, :chat_id) || get_channel_id()
3234

3335
if channel_id && channel_id != "" do
3436
channel_id = to_integer(channel_id)
3537

36-
case Nostrum.Api.Message.create(channel_id, content: text) do
37-
{:ok, _msg} -> :ok
38-
{:error, reason} ->
39-
Logger.warning("Discord send failed: #{inspect(reason)}")
40-
:ok
41-
end
38+
text
39+
|> chunk_message(@discord_max_length)
40+
|> Enum.each(fn chunk ->
41+
case Nostrum.Api.Message.create(channel_id, content: chunk) do
42+
{:ok, _msg} -> :ok
43+
{:error, reason} ->
44+
Logger.warning("Discord send failed: #{inspect(reason)}")
45+
:ok
46+
end
47+
end)
48+
49+
:ok
4250
else
4351
Logger.warning("Cannot send to Discord: channel_id not configured")
4452
:ok
@@ -90,6 +98,24 @@ defmodule AlexClaw.Gateway.Discord do
9098

9199
# --- Internal ---
92100

101+
defp chunk_message(text, max_length) when byte_size(text) <= max_length, do: [text]
102+
103+
defp chunk_message(text, max_length) do
104+
text
105+
|> String.split("\n")
106+
|> Enum.reduce([""], fn line, [current | rest] ->
107+
candidate = if current == "", do: line, else: current <> "\n" <> line
108+
109+
if byte_size(candidate) <= max_length do
110+
[candidate | rest]
111+
else
112+
[line, current | rest]
113+
end
114+
end)
115+
|> Enum.reverse()
116+
|> Enum.reject(&(&1 == ""))
117+
end
118+
93119
defp normalize(msg) do
94120
%Message{
95121
text: msg.content,

0 commit comments

Comments
 (0)