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 |
|