DEV Community

José Eduardo
José Eduardo

Posted on

1

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

AWS Q Developer image

Your AI Code Assistant

Automate your code reviews. Catch bugs before your coworkers. Fix security issues in your code. Built to handle large projects, Amazon Q Developer works alongside you from idea to production code.

Get started free in your IDE

Top comments (0)

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post