slack.client.ts•6.87 kB
import { WebClient } from "@slack/web-api";
import { ISlackClient } from "../../core/interfaces/slack.interface.js";
import {
AddReactionRequest,
GetChannelHistoryRequest,
GetThreadRepliesRequest,
GetUserProfileRequest,
GetUsersRequest,
ListChannelsRequest,
PostMessageRequest,
ReplyToThreadRequest,
SlackChannel,
SlackMessage,
SlackOperationResult,
SlackUser,
SlackUserProfile,
} from "../../core/types/slack.types.js";
export class SlackClient implements ISlackClient {
private client: WebClient;
constructor(token: string) {
this.client = new WebClient(token);
}
async listChannels(request: ListChannelsRequest): Promise<
SlackOperationResult<{
channels: SlackChannel[];
next_cursor?: string;
}>
> {
try {
const result = await this.client.conversations.list({
types: "public_channel",
exclude_archived: true,
limit: Math.min(request.limit || 100, 200),
cursor: request.cursor,
});
if (!result.ok) {
return {
success: false,
error: result.error || "Failed to list channels",
};
}
return {
success: true,
data: {
channels: (result.channels || []) as SlackChannel[],
next_cursor: result.response_metadata?.next_cursor,
},
};
} catch (error) {
console.error("SlackClient.listChannels error:", error);
return {
success: false,
error: error instanceof Error ? error.message : String(error),
};
}
}
async postMessage(
request: PostMessageRequest
): Promise<SlackOperationResult<SlackMessage>> {
try {
const result = await this.client.chat.postMessage({
channel: request.channel_id,
text: request.text,
});
if (!result.ok) {
return {
success: false,
error: result.error || "Failed to post message",
};
}
return {
success: true,
data: result.message as SlackMessage,
};
} catch (error) {
console.error("SlackClient.postMessage error:", error);
return {
success: false,
error: error instanceof Error ? error.message : String(error),
};
}
}
async replyToThread(
request: ReplyToThreadRequest
): Promise<SlackOperationResult<SlackMessage>> {
try {
const result = await this.client.chat.postMessage({
channel: request.channel_id,
thread_ts: request.thread_ts,
text: request.text,
});
if (!result.ok) {
return {
success: false,
error: result.error || "Failed to reply to thread",
};
}
return {
success: true,
data: result.message as SlackMessage,
};
} catch (error) {
console.error("SlackClient.replyToThread error:", error);
return {
success: false,
error: error instanceof Error ? error.message : String(error),
};
}
}
async addReaction(
request: AddReactionRequest
): Promise<SlackOperationResult<void>> {
try {
const result = await this.client.reactions.add({
channel: request.channel_id,
timestamp: request.timestamp,
name: request.reaction,
});
if (!result.ok) {
return {
success: false,
error: result.error || "Failed to add reaction",
};
}
return {
success: true,
};
} catch (error) {
console.error("SlackClient.addReaction error:", error);
return {
success: false,
error: error instanceof Error ? error.message : String(error),
};
}
}
async getChannelHistory(request: GetChannelHistoryRequest): Promise<
SlackOperationResult<{
messages: SlackMessage[];
}>
> {
try {
const result = await this.client.conversations.history({
channel: request.channel_id,
limit: request.limit || 10,
});
if (!result.ok) {
return {
success: false,
error: result.error || "Failed to get channel history",
};
}
return {
success: true,
data: {
messages: (result.messages || []) as SlackMessage[],
},
};
} catch (error) {
console.error("SlackClient.getChannelHistory error:", error);
return {
success: false,
error: error instanceof Error ? error.message : String(error),
};
}
}
async getThreadReplies(request: GetThreadRepliesRequest): Promise<
SlackOperationResult<{
messages: SlackMessage[];
}>
> {
try {
const result = await this.client.conversations.replies({
channel: request.channel_id,
ts: request.thread_ts,
});
if (!result.ok) {
return {
success: false,
error: result.error || "Failed to get thread replies",
};
}
return {
success: true,
data: {
messages: (result.messages || []) as SlackMessage[],
},
};
} catch (error) {
console.error("SlackClient.getThreadReplies error:", error);
return {
success: false,
error: error instanceof Error ? error.message : String(error),
};
}
}
async getUsers(request: GetUsersRequest): Promise<
SlackOperationResult<{
users: SlackUser[];
next_cursor?: string;
}>
> {
try {
const result = await this.client.users.list({
limit: Math.min(request.limit || 100, 200),
cursor: request.cursor,
});
if (!result.ok) {
return {
success: false,
error: result.error || "Failed to get users",
};
}
return {
success: true,
data: {
users: (result.members || []) as SlackUser[],
next_cursor: result.response_metadata?.next_cursor,
},
};
} catch (error) {
console.error("SlackClient.getUsers error:", error);
return {
success: false,
error: error instanceof Error ? error.message : String(error),
};
}
}
async getUserProfile(
request: GetUserProfileRequest
): Promise<SlackOperationResult<SlackUserProfile>> {
try {
const result = await this.client.users.profile.get({
user: request.user_id,
include_labels: true,
});
if (!result.ok) {
return {
success: false,
error: result.error || "Failed to get user profile",
};
}
return {
success: true,
data: result.profile as SlackUserProfile,
};
} catch (error) {
console.error("SlackClient.getUserProfile error:", error);
return {
success: false,
error: error instanceof Error ? error.message : String(error),
};
}
}
}