A fork of mtelver's day10 project
1type channel = Slack | Zulip | Telegram | Email | Stdout
2
3let channel_of_string = function
4 | "slack" -> Slack
5 | "zulip" -> Zulip
6 | "telegram" -> Telegram
7 | "email" -> Email
8 | "stdout" -> Stdout
9 | s -> failwith (Printf.sprintf "Unknown channel: %s" s)
10
11let channel_to_string = function
12 | Slack -> "slack"
13 | Zulip -> "zulip"
14 | Telegram -> "telegram"
15 | Email -> "email"
16 | Stdout -> "stdout"
17
18let env key =
19 try Sys.getenv key
20 with Not_found -> failwith (Printf.sprintf "Environment variable %s not set" key)
21
22let run_curl args =
23 let cmd = String.concat " " ("curl" :: "-s" :: "-o" :: "/dev/null" :: "-w" :: "'%{http_code}'" :: args) in
24 let ic = Unix.open_process_in cmd in
25 let output = try input_line ic with End_of_file -> "" in
26 match Unix.close_process_in ic with
27 | Unix.WEXITED 0 ->
28 let code = try int_of_string (String.trim output |> fun s ->
29 (* Remove surrounding quotes if present *)
30 if String.length s >= 2 && s.[0] = '\'' then String.sub s 1 (String.length s - 2) else s
31 ) with _ -> 0 in
32 if code >= 200 && code < 300 then 0 else 1
33 | _ -> 1
34
35let send ~channel ~message =
36 match channel with
37 | Stdout ->
38 print_endline message; 0
39 | Slack ->
40 let url = env "SLACK_WEBHOOK_URL" in
41 let escaped = String.concat "\\\"" (String.split_on_char '"' message) in
42 run_curl ["-X"; "POST"; "-H"; "'Content-type: application/json'";
43 "-d"; Printf.sprintf "'{\"text\":\"%s\"}'" escaped; url]
44 | Zulip ->
45 let email = env "ZULIP_BOT_EMAIL" in
46 let api_key = env "ZULIP_BOT_API_KEY" in
47 let server = env "ZULIP_SERVER" in
48 let stream = env "ZULIP_STREAM" in
49 run_curl ["-u"; Printf.sprintf "%s:%s" email api_key;
50 "-X"; "POST"; Printf.sprintf "%s/api/v1/messages" server;
51 "-d"; Printf.sprintf "'type=stream&to=%s&topic=day10&content=%s'" stream message]
52 | Telegram ->
53 let token = env "TELEGRAM_BOT_TOKEN" in
54 let chat_id = env "TELEGRAM_CHAT_ID" in
55 let escaped = String.concat "\\\"" (String.split_on_char '"' message) in
56 run_curl ["-X"; "POST";
57 Printf.sprintf "'https://api.telegram.org/bot%s/sendMessage'" token;
58 "-d"; Printf.sprintf "'chat_id=%s&text=%s'" chat_id escaped]
59 | Email ->
60 let to_addr = env "EMAIL_TO" in
61 let from_addr = env "EMAIL_FROM" in
62 let cmd = Printf.sprintf "echo %s | mail -s 'Day10 Notification' -r %s %s"
63 (Filename.quote message) from_addr to_addr in
64 match Unix.system cmd with
65 | Unix.WEXITED 0 -> 0
66 | _ -> 1