defmodule AoC do defp get_session!(), do: File.read!("./.session") |> String.trim() defp get_request_headers!(), do: [Cookie: "session=#{get_session!()}"] def fetch_input!(year, day) do Req.get!( "https://adventofcode.com/#{year}/day/#{day}/input", headers: get_request_headers!() ) |> Map.get(:body) end def fetch_reportcard!(year) do import Enum, only: [sort_by: 2, at: 2] import String, only: [split: 2, trim: 1, contains?: 2, to_integer: 1] day_class = fn classes -> classes |> split(" ") |> at(0) |> split("-") |> at(1) |> trim() end days_complete = fn classes -> cond do contains?(classes, "verycomplete") -> 2 contains?(classes, "complete") -> 1 true -> 0 end end session = get_session!() Req.get!("https://adventofcode.com/#{year}", headers: [cookie: "session=#{session}"]).body |> Floki.parse_document!(html_parser: Floki.HTMLParser.Html5ever) |> Floki.find("pre.calendar > a") |> Stream.map(fn e -> "#{Floki.attribute(e, "class")}\n" end) |> Stream.map(fn classes -> {day_class.(classes), days_complete.(classes)} end) |> Stream.map(fn {day, c} -> {day |> split("day") |> at(1) |> to_integer(), c} end) |> sort_by(&elem(&1, 0)) end end