diff --git a/lib/contrib/linkbot.ex b/lib/contrib/linkbot.ex new file mode 100644 index 0000000..22b2ba3 --- /dev/null +++ b/lib/contrib/linkbot.ex @@ -0,0 +1,38 @@ +defmodule Omnibot.Contrib.Linkbot do + use Omnibot.Module + require Logger + + defmodule Client do + use Tesla + + plug Tesla.Middleware.Headers, [{"user-agent", "Tesla/Omnibot"}] + plug Tesla.Middleware.FollowRedirects, max_redirects: 10 + plug Tesla.Middleware.Compression, format: "gzip" + + @title_regex ~r"(?<title>.+)"i + + def get_title(url) do + if should_get?(url) do + resp = get!(url) + %{"title" => title} = Regex.named_captures(@title_regex, resp.body) + title + end + end + + defp should_get?(url) do + resp = head!(url) + Tesla.get_header(resp, "content-type") + |> String.downcase() + |> String.contains?(["html", "text"]) + end + end + + @url_regex ~r"\bhttps?://[^\s]+" + + @impl true + def on_channel_msg(irc, channel, _nick, line) do + Regex.scan(@url_regex, line) + |> Enum.map(fn url -> Client.get_title(url) end) + |> Enum.each(fn title -> Irc.send_to(irc, channel, title) end) + end +end diff --git a/mix.exs b/mix.exs index b742bff..191b72d 100644 --- a/mix.exs +++ b/mix.exs @@ -29,9 +29,6 @@ defmodule Omnibot.MixProject do # Run "mix help deps" to learn about dependencies. defp deps do - [ - # {:dep_from_hexpm, "~> 0.3.0"}, - # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"} - ] + [{:tesla, "~> 1.3.0"}] end end