search
LoginSignup
5

More than 1 year has passed since last update.

posted at

updated at

Organization

年末ですね Slackボット (Elixir)

はじめに

Qiita Advent Calendar 2020

スクリーンショット 2020-12-26 21.51.44.png

:tada::tada::tada:

インストール

  • Elixirをインストールしましょう :rocket::rocket::rocket:
  • 手前味噌ですが、インストールなどをご参照ください
  • 何事にも準備が肝心です
  • ここが一番つまらないし、謎にハマってしまうことが多いのですが、がんばってください!
  • うまくいかなかったら、思い切って僕の胸に飛び込んで来てほしい (by 長嶋茂雄 読売ジャイアンツ終身名誉監督)
    • elixirjp.slack.com slack workspaceNervesJP workspaceに入ってきていただいて、@torifukukaiouへご質問ください
    • たとえ私が答えられなくても、マジみんな親切で優しい人が多いので、きっと解決できるでしょう:bangbang:

プロジェクト作成

$ 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
  • HTTPクライアントHTTPoisonとすんげー速い:rocket:JSONパーサー&ジェネレーターJasonをプロジェクトで使えるようにします
$ 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を使っています

スクリーンショット 2020-12-26 22.04.13.png

  • その他管理項目 > アプリを管理する
  • 次の画面で Incoming Web hookで検索

スクリーンショット 2020-12-26 22.05.55.png

  • あとは案内の通りに進めて、Webhook URL@urlにセットします

Run

$ iex -S mix
  • このまま放っておくと、
  • 13分に一回 kokura-ex チャネルに「年末ですね」を投稿します
  • Enum.random/1関数でランダムに有名人を選んでいます

スクリーンショット 2020-12-26 22.20.06.png

Wrapping Up :christmas_tree::santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5::christmas_tree:

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
5