Skip to content
← Public packages

@kody/slack

Read Slack conversations and safely send messages as the authorizing user through the saved slack OAuth integration.

src/list-conversations.ts

36 lines · 1.3 KB · TypeScript
import { nextCursor, resolveIntegrationName, slackRequest } from './request.ts'
import { boundedLimit, inputRecord, optionalBoolean, optionalString } from './validation.ts'

const allowedTypes = new Set(['public_channel', 'private_channel', 'im', 'mpim'])

type ConversationsResponse = {
	ok: boolean
	channels?: unknown[]
	response_metadata?: { next_cursor?: string }
	[key: string]: unknown
}

/** List conversations available to the authorizing Slack user. */
export default async function listConversations(params: Record<string, unknown> = {}) {
	const input = inputRecord(params)
	const requestedTypes = input.types ?? ['public_channel', 'private_channel', 'im', 'mpim']
	if (!Array.isArray(requestedTypes) || requestedTypes.some((type) => typeof type !== 'string' || !allowedTypes.has(type))) {
		throw new Error('types must contain only public_channel, private_channel, im, or mpim.')
	}

	const result = await slackRequest<ConversationsResponse>(
		'users.conversations',
		{
			types: requestedTypes.join(','),
			limit: boundedLimit(input.limit),
			cursor: optionalString(input, 'cursor'),
			exclude_archived: optionalBoolean(input, 'excludeArchived') ?? true,
		},
		resolveIntegrationName(input.integration),
	)

	return {
		conversations: result.channels ?? [],
		nextCursor: nextCursor(result),
	}
}