fix(slack): apply limit parameter to emoji-list action (#4293)

This commit is contained in:
Marcus Castro
2026-02-10 13:30:16 -03:00
committed by Peter Steinberger
parent 86e4fe0a7a
commit 3224d1a75a
3 changed files with 43 additions and 4 deletions

View File

@@ -432,4 +432,26 @@ describe("handleSlackAction", () => {
const [, , opts] = sendSlackMessage.mock.calls[0] ?? [];
expect(opts?.token).toBe("xoxp-1");
});
it("returns all emojis when no limit is provided", async () => {
const cfg = { channels: { slack: { botToken: "tok" } } } as OpenClawConfig;
const emojiMap = { wave: "url1", smile: "url2", heart: "url3" };
listSlackEmojis.mockResolvedValueOnce({ ok: true, emoji: emojiMap });
const result = await handleSlackAction({ action: "emojiList" }, cfg);
const payload = result.details as { ok: boolean; emojis: { emoji: Record<string, string> } };
expect(payload.ok).toBe(true);
expect(Object.keys(payload.emojis.emoji)).toHaveLength(3);
});
it("applies limit to emoji-list results", async () => {
const cfg = { channels: { slack: { botToken: "tok" } } } as OpenClawConfig;
const emojiMap = { wave: "url1", smile: "url2", heart: "url3", fire: "url4", star: "url5" };
listSlackEmojis.mockResolvedValueOnce({ ok: true, emoji: emojiMap });
const result = await handleSlackAction({ action: "emojiList", limit: 2 }, cfg);
const payload = result.details as { ok: boolean; emojis: { emoji: Record<string, string> } };
expect(payload.ok).toBe(true);
const emojiKeys = Object.keys(payload.emojis.emoji);
expect(emojiKeys).toHaveLength(2);
expect(emojiKeys.every((k) => k in emojiMap)).toBe(true);
});
});

View File

@@ -18,7 +18,13 @@ import {
} from "../../slack/actions.js";
import { parseSlackTarget, resolveSlackChannelId } from "../../slack/targets.js";
import { withNormalizedTimestamp } from "../date-time.js";
import { createActionGate, jsonResult, readReactionParams, readStringParam } from "./common.js";
import {
createActionGate,
jsonResult,
readNumberParam,
readReactionParams,
readStringParam,
} from "./common.js";
const messagingActions = new Set(["sendMessage", "editMessage", "deleteMessage", "readMessages"]);
@@ -305,8 +311,19 @@ export async function handleSlackAction(
if (!isActionEnabled("emojiList")) {
throw new Error("Slack emoji list is disabled.");
}
const emojis = readOpts ? await listSlackEmojis(readOpts) : await listSlackEmojis();
return jsonResult({ ok: true, emojis });
const result = readOpts ? await listSlackEmojis(readOpts) : await listSlackEmojis();
const ok = result.ok ?? false;
const limit = readNumberParam(params, "limit", { integer: true });
if (limit != null && limit > 0 && result.emoji != null) {
const entries = Object.entries(result.emoji).toSorted(([a], [b]) => a.localeCompare(b));
if (entries.length > limit) {
return jsonResult({
ok,
emojis: { ...result, emoji: Object.fromEntries(entries.slice(0, limit)) },
});
}
}
return jsonResult({ ok, emojis: result });
}
throw new Error(`Unknown action: ${action}`);

View File

@@ -211,7 +211,7 @@ export function createSlackActions(providerId: string): ChannelMessageActionAdap
if (action === "emoji-list") {
return await handleSlackAction(
{ action: "emojiList", accountId: accountId ?? undefined },
{ action: "emojiList", limit: params.limit, accountId: accountId ?? undefined },
cfg,
);
}