Multi-Sesson Livebook App
Mix.install([
{:req, "~> 0.5"},
{:kino, "~> 0.14"},
{:kino_slack, "~> 0.1"}
])
App
gh =
Req.new(
base_url: "https://api.github.com",
auth: {:bearer, System.fetch_env!("LB_GITHUB_TOKEN")},
headers: [
{"Accept", "application/vnd.github+json"},
{"X-GitHub-Api-Version", "2022-11-28"}
]
)
Kino.nothing()
repo =
"オーナー/リポジトリー"
|> Kino.Input.text()
|> Kino.render()
|> Kino.Input.read()
if not String.contains?(repo, "/") do
Kino.interrupt!(:normal, "オーナー/リポジトリー を入力してください")
end
report =
case Req.get!(gh, url: "/repos/#{repo}/security-advisories") do
%{status: 200, body: body} ->
"リポジトリー #{repo} には #{length(body)} 個の報告があります"
%{status: 404} ->
Kino.interrupt!(:error, "リポジトリー #{repo} は存在しません")
%{status: status} ->
Kino.interrupt!(:error, "GitHub はステータス #{status} でエラーを返しました")
end
req =
Req.new(
base_url: "https://slack.com/api",
auth: {:bearer, System.fetch_env!("LB_SLACK_TOKEN")}
)
channel =
"Slack Channel"
|> Kino.Input.text()
|> Kino.render()
|> Kino.Input.read()
if not String.starts_with?(channel, "#") do
Kino.interrupt!(:normal, "送信先チャンネルを指定してください")
end
response =
Req.post!(req,
url: "/chat.postMessage",
json: %{channel: channel, text: "新しい報告が来ました
#{report}"}
)
case response.body do
%{"ok" => true} ->
"報告が送信されました!"
%{"ok" => false, "error" => error} ->
Kino.interrupt!(:error, "Slack 送信でエラーが発生しました #{error}")
end