diff options
author | brian <brianmchu42@gmail.com> | 2023-12-03 21:54:01 -0800 |
---|---|---|
committer | brian <brianmchu42@gmail.com> | 2023-12-03 21:54:01 -0800 |
commit | 7000f47b60b3fbdf90e2db12a363bbd1b2236b53 (patch) | |
tree | 13d9db09d3530f93d40afe1badf5da35c714a14d /bin/utils.ml | |
download | AdventOfCode2023-7000f47b60b3fbdf90e2db12a363bbd1b2236b53.tar.gz |
add template for ocaml
Diffstat (limited to 'bin/utils.ml')
-rw-r--r-- | bin/utils.ml | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/bin/utils.ml b/bin/utils.ml new file mode 100644 index 0000000..4f488f4 --- /dev/null +++ b/bin/utils.ml @@ -0,0 +1,51 @@ +open Unix +open Lwt +open Cohttp +open Cohttp_lwt_unix + +let session_file = ".session" + +let year_file = ".year" + +let get_token () = + let file = In_channel.open_text session_file in + let token = In_channel.input_all file in + In_channel.close file ; String.trim token + +let get_year () = + if Caml.Sys.file_exists year_file then ( + let file = In_channel.open_text year_file in + let year = In_channel.input_all file in + In_channel.close file ; + int_of_string (String.trim year) ) + else + let time = time () in + let time = gmtime time in + time.tm_year + 1900 + +let download_input day fn = + let year = get_year () in + let url = + Printf.sprintf "https://adventofcode.com/%d/day/%s/input" year day + in + let token = get_token () in + let headers = Header.init () in + let headers = Header.add headers "Cookie" ("session=" ^ token) in + let headers = + Header.add headers "User-Agent" + "github.com/fangyi-zhou/advent-of-code-ocaml-starter by \ + me+aoc@fangyi.io" + in + let uri = Uri.of_string url in + let body = + Client.get ~headers uri + >>= fun (resp, body) -> + let code = resp |> Response.status |> Code.code_of_status in + if code = 200 then body |> Cohttp_lwt.Body.to_string + else failwith ("Unable to get data, status " ^ Int.to_string code) + in + let body = Lwt_main.run body in + let body = String.trim body in + let file = Out_channel.open_text fn in + Out_channel.output_string file body ; + Out_channel.close file |