はじめに
- Elixir楽しんでいますか
-
Qiita Advent Calendar 2021へ向けて記事をどんどん書いていきましょう!
- Qiita Advent Calendar 2021では、Elixir その3くらいまでは余裕で埋めてしまいましょう
- Qiita Advent Calendar 2020の私てきまとめはこちら
- 2020/12/26(土)に行われたkokura.ex#16:Elixir忘年会&もくもく会~入門もあるよ(9:30~)の成果です
- @im_miolab さん、ありがとうございます!
- @im_miolab さんが、人間ボットで「年末ですね」と定期的につぶやくと宣言されたので、そこから着想を得て、バタバタとボットをつくりました
Qiita Advent Calendar 2020
- 2020/12/26(土) 21:52現在
-
プログラミング言語カテゴリーでトップ10以内にダブルランクインです
- Elixir Advent Calendar 2020 第2位
- Elixir その2 Advent Calendar 2020 第9位
- 29 GET
インストール
- Elixirをインストールしましょう
- 手前味噌ですが、インストールなどをご参照ください
- 何事にも準備が肝心です
- ここが一番つまらないし、謎にハマってしまうことが多いのですが、がんばってください!
- うまくいかなかったら、思い切って僕の胸に飛び込んで来てほしい (by 長嶋茂雄 読売ジャイアンツ終身名誉監督)
-
elixirjp.slack.com slack workspaceかNervesJP workspaceに入ってきていただいて、
@torifukukaiou
へご質問ください - たとえ私が答えられなくても、マジみんな親切で優しい人が多いので、きっと解決できるでしょう
-
elixirjp.slack.com slack workspaceかNervesJP workspaceに入ってきていただいて、
プロジェクト作成
$ mix new nenmatsu_bot --sup
$ cd nenmatsu_bot
mix.exs
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"}
{:httpoison, "~> 1.7"},
{:jason, "~> 1.2"}
]
end
$ mix deps.get
ソースコードを書く
lib/nenmatsu_bot/slack.ex
defmodule NenmatsuBot.Slack do
@url "https://hooks.slack.com/services/secret..."
def post(text, username, icon_url, channel_name) do
body =
%{
text: text,
username: username,
icon_url: icon_url,
link_names: 1,
channel: channel_name
}
|> Jason.encode!()
headers = [{"Content-type", "application/json"}]
HTTPoison.post!(@url, body, headers)
end
end
lib/nenmatsu_bot/worker.ex
defmodule NenmatsuBot.Worker do
use GenServer
@one_minute 60 * 1000
@thirteen_minutes @one_minute * 13
@famous_folks %{
"徳川家康" =>
"https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Tokugawa_Ieyasu2.JPG/270px-Tokugawa_Ieyasu2.JPG",
"有名人①" =>
"https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Bill_Gates_June_2015.jpg/220px-Bill_Gates_June_2015.jpg",
"有名人②" =>
"https://upload.wikimedia.org/wikipedia/commons/thumb/4/49/Elon_Musk_2015.jpg/220px-Elon_Musk_2015.jpg",
"有名人③" =>
"https://assets.media-platform.com/bi/dist/images/2019/06/07/jeff-bezos-shares-his-best-advice-for-anyone-starting-a-business.jpg"
}
def start_link(state \\ %{}) do
GenServer.start_link(__MODULE__, state, name: __MODULE__)
end
def init(state) do
Process.send_after(__MODULE__, :tick, @one_minute)
{:ok, state}
end
def handle_info(:tick, state) do
Process.send_after(__MODULE__, :tick, @thirteen_minutes)
{username, icon_url} = Enum.random(@famous_folks)
NenmatsuBot.Slack.post("年末ですね", username, icon_url, "kokura-ex")
{:noreply, state}
end
end
-
kokura-ex
のところは投稿したいチャネル名に変更してください
lib/nenmatsu_bot/application.ex
defmodule NenmatsuBot.Application do
# See https://hexdocs.pm/elixir/Application.html
# for more information on OTP Applications
@moduledoc false
use Application
@impl true
def start(_type, _args) do
children = [
# Starts a worker by calling: NenmatsuBot.Worker.start_link(arg)
# {NenmatsuBot.Worker, arg}
NenmatsuBot.Worker # add
]
# See https://hexdocs.pm/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: NenmatsuBot.Supervisor]
Supervisor.start_link(children, opts)
end
end
- ソースコードは説明しませんが、なんとなくやっていることは伝わるのではないでしょうか
- $\huge{Don't think, feeeeeeeel}$
- SlackのIncoming Web hook APIを使っています
- その他管理項目 > アプリを管理する
- 次の画面で Incoming Web hookで検索
- あとは案内の通りに進めて、Webhook URLを
@url
にセットします
Run
$ iex -S mix
- このまま放っておくと、
- 13分に一回
kokura-ex
チャネルに「年末ですね」を投稿します - Enum.random/1関数でランダムに有名人を選んでいます
Wrapping Up
- Qiita Advent Calendar 2021 早くはじまらないかなあー
- Enjoy Elixir !!!