A fork of mtelver's day10 project
at main 66 lines 2.5 kB view raw
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