DEV Community

José Eduardo
José Eduardo

Posted on

Bot do discord com Elixir e Nostrum

Requisitos

  • Ter o elixir instalado
  • Antes de tudo é necessário ter um bot criado no Portal de desenvolvedores do discord, caso não tenha ou não saiba como fazer, recomendo seguir os passo desse post do canaltech.

Iniciando o projeto

Antes de tudo vamos iniciar nosso projeto rodando o comando:
mix new <nome_do_aplicativo> --sup

Passamos a flag --sup para que o mix inicie nosso projeto com um Supervisor configurado, assim ao iniciarmos nossa aplicação o supervisor irá iniciar todas as aplicações que pedirmos.

Com isso nossa estrutura de arquivos se encontra da seguinte forma:

Estrutura de arquivos

Adicionando e configurando o nostrum

Com o projeto iniciado devemos adicionar o nostrum em nossas dependências, para isso basta modificiar o arquivo mix.exs e modificar a função deps ficando da seguinte forma:

defp deps do
  [
    {:nostrum, "~> 0.4"}
  ]
end
Enter fullscreen mode Exit fullscreen mode

e executar o comando:
mix deps.get

Com isso agora devemos configurar o nostrum e fornecer o token do nosso bot, para isso vamos criar o diretório config e dentro o arquivo config.exs, pode ser feito com o comando:
mkdir config && touch config.exs

Para configurar o nostrum basta adicionar o seguinte no arquivo:

import Config

config :nostrum,
  token: "SEU TOKEN"
  # OU caso não queria deixar de forma explicita, podemos pegar ele de uma variável de ambiente ao inicializa-lo
  #token: System.get_env("BOT_TOKEN")
Enter fullscreen mode Exit fullscreen mode

e por vamos criar um modulo para iniciar o bot e adicionar esse modulo ao supervisor. vamos criar o arquivo consumer.ex, dentro de lib//, com o seguinte conteúdo:

defmodule Example.Consumer do
  use Nostrum.Consumer

  def start_link do
    Consumer.start_link(__MODULE__)
  end

  def handle_event(_) do
    :ok
  end
end
Enter fullscreen mode Exit fullscreen mode

Trocando o Example, pelo nome da sua aplicação, agora em lib//application.ex, vai ficar da seguinte forma:

defmodule Example.Application do
  use Application

  def start(_type,_args) do 
    children = [
      Example.Consumer 
    ]

  opts = [strategy: :one_for_one, name: Example.Supervisor]
  Supervisor.start_link(children,opts)
  end
end
Enter fullscreen mode Exit fullscreen mode

Com isso ao rodarmos o comando:
mix run --no-halt ou iex -S mix, nosso bot deve ficar online no discord 🙂

OBS: Caso você tenha optado por usar o System.get_env("BOT_TOKEN") é necessário rodar o comando da seguinte forma:
BOT_TOKEN="TOKEN" mix run --no-halt ou BOT_TOKEN="TOKEN" iex -S mix

Bot online

Mas estamos ignorando todos os eventos, então por enquanto ele não está fazendo nada 😥

Lidando com comandos

Para lidar com comandos devemos cuidado do evento :MESSAGE_CREATE, então nosso consumer.ex fica da seguinte forma:

defmodule Example.Consumer do
  use Nostrum.Consumer
  alias Nostrum.Api

  def start_link do
    Consumer.start_link(__MODULE__)
  end

  def handle_event({:MESSAGE_CREATE,msg, _ws_state}) do
     case msg.content do
      "!ping" -> Api.create_message(msg.channel_id, "Pong")
       _ -> :ok
     end
  end

  def handle_event(_) do
    :ok
  end
end

Enter fullscreen mode Exit fullscreen mode

Com isso nosso bot responde ao comando !ping, com a mensagem pong, no canal que a mensagem foi enviada.

bot responde Ping com Pong

Com isso nosso bot já esta respondendo a comandos, mas está bem simples, agora você é livre para organizar os arquivos e lidar com os comandos da forma que deseja, aqui está o link do repositório do github com alguns comandos e a forma que preferi programar.

Qualquer dúvida pode deixar nos comentários ou mandar uma mensagem no discord: dudu#6876

Repo: https://github.com/uduDudu/discord-bot-elixir

Discussion (0)