Send direct message
One script reply has been approved by the moderators Verified

Sends direct message to user (you must know user email)

Created by mrl5 1117 days ago Picked 1 time
Submitted by mrl5 Deno
Verified 201 days ago
1
import { WebClient } from "https://deno.land/x/[email protected]/mod.ts";
2
import { isEmail } from "https://deno.land/x/[email protected]/mod.ts";
3

4
type Slack = {
5
  token: string;
6
};
7
export async function main(user_email: string, text: string, slack: Slack) {
8
  throwOnInvalidEmail(user_email);
9

10
  const client = new WebClient(slack.token);
11
  const userData = await getUserData(client, user_email);
12
  console.log(userData);
13
  const result = await sendDirectMessage(text, client, userData);
14

15
  return result;
16
}
17

18
interface UserData {
19
  id: string;
20
  email: string;
21
  real_name: string;
22
}
23

24
async function getUserData(
25
  client: WebClient,
26
  email: string,
27
): Promise<UserData> {
28
  try {
29
    const response = await client.users.lookupByEmail({ email: email });
30

31
    const { id, real_name } = response.user;
32
    return { id, email, real_name };
33
  } catch (err) {
34
    return handleApiResponse(email, err);
35
  }
36
}
37

38
async function sendDirectMessage(
39
  text: string,
40
  client: WebClient,
41
  userData: UserData,
42
) {
43
  const { ok, ts, channel } = await client.chat.postMessage({
44
    channel: userData.id,
45
    text,
46
  });
47
  return { ok, ts, channel, email: userData.email };
48
}
49

50
function throwOnInvalidEmail(email: string) {
51
  if (!isEmail(email)) {
52
    throw new Error("Expected user email");
53
  }
54
}
55

56
function handleApiResponse(email: string, error: Error) {
57
  return Promise.reject({ email, err_msg: error.message });
58
}
59