<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: José Eduardo</title>
    <description>The latest articles on DEV Community by José Eduardo (@joseemds).</description>
    <link>https://dev.to/joseemds</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F409032%2F2e523818-6b81-4efa-b7e4-01924538c136.png</url>
      <title>DEV Community: José Eduardo</title>
      <link>https://dev.to/joseemds</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joseemds"/>
    <language>en</language>
    <item>
      <title>Bot do discord com Elixir e Nostrum</title>
      <dc:creator>José Eduardo</dc:creator>
      <pubDate>Tue, 25 Aug 2020 17:29:41 +0000</pubDate>
      <link>https://dev.to/joseemds/bot-do-discord-com-elixir-e-nostrum-56jo</link>
      <guid>https://dev.to/joseemds/bot-do-discord-com-elixir-e-nostrum-56jo</guid>
      <description>&lt;h2&gt;
  
  
  Requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ter o elixir instalado&lt;/li&gt;
&lt;li&gt;Antes de tudo é necessário ter um bot criado no &lt;a href="https://discord.com/developers"&gt;Portal de desenvolvedores do discord&lt;/a&gt;, caso não tenha ou não saiba como fazer, recomendo seguir os passo desse &lt;a href="https://canaltech.com.br/apps/como-criar-bots-para-responder-discord/"&gt;post&lt;/a&gt; do canaltech.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Iniciando o projeto
&lt;/h2&gt;

&lt;p&gt;Antes de tudo vamos iniciar nosso projeto rodando o comando:&lt;br&gt;
&lt;code&gt;mix new &amp;lt;nome_do_aplicativo&amp;gt; --sup&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;Com isso nossa estrutura de arquivos se encontra da seguinte forma: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--v5nd-2Gz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7azwh1yzhp5q6dhn1wjt.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--v5nd-2Gz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7azwh1yzhp5q6dhn1wjt.jpeg" alt="Estrutura de arquivos"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Adicionando e configurando o nostrum
&lt;/h2&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;deps&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:nostrum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"~&amp;gt; 0.4"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e executar o comando:&lt;br&gt;
&lt;code&gt;mix deps.get&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;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 &lt;code&gt;config.exs&lt;/code&gt;, pode ser feito com o comando:&lt;br&gt;
&lt;code&gt;mkdir config &amp;amp;&amp;amp; touch config.exs&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Para configurar o nostrum basta adicionar o seguinte no arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="no"&gt;Config&lt;/span&gt;

&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="ss"&gt;:nostrum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;token:&lt;/span&gt; &lt;span class="s2"&gt;"SEU TOKEN"&lt;/span&gt;
  &lt;span class="c1"&gt;# OU caso não queria deixar de forma explicita, podemos pegar ele de uma variável de ambiente ao inicializa-lo&lt;/span&gt;
  &lt;span class="c1"&gt;#token: System.get_env("BOT_TOKEN")&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Consumer&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;Nostrum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Consumer&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;start_link&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="no"&gt;Consumer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;__MODULE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;handle_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="ss"&gt;:ok&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trocando o &lt;code&gt;Example&lt;/code&gt;, pelo nome da sua aplicação, agora em lib//application.ex, vai ficar da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Application&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;Application&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;_args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; 
    &lt;span class="n"&gt;children&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="no"&gt;Example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Consumer&lt;/span&gt; 
    &lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="n"&gt;opts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;strategy:&lt;/span&gt; &lt;span class="ss"&gt;:one_for_one&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;name:&lt;/span&gt; &lt;span class="no"&gt;Example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Supervisor&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="no"&gt;Supervisor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso ao rodarmos o comando:&lt;br&gt;
&lt;code&gt;mix run --no-halt&lt;/code&gt; ou &lt;code&gt;iex -S mix&lt;/code&gt;, nosso bot deve ficar online no discord 🙂&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m-4iaTeh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/y0gklisv0v8bw4bkft8y.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m-4iaTeh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/y0gklisv0v8bw4bkft8y.jpeg" alt="Bot online"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mas estamos ignorando todos os eventos, então por enquanto ele não está fazendo nada 😥&lt;/p&gt;
&lt;h2&gt;
  
  
  Lidando com comandos
&lt;/h2&gt;

&lt;p&gt;Para lidar com comandos devemos cuidado do evento &lt;code&gt;:MESSAGE_CREATE&lt;/code&gt;, então nosso &lt;code&gt;consumer.ex&lt;/code&gt; fica da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Consumer&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;Nostrum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Consumer&lt;/span&gt;
  &lt;span class="n"&gt;alias&lt;/span&gt; &lt;span class="no"&gt;Nostrum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Api&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;start_link&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="no"&gt;Consumer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;__MODULE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;handle_event&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="ss"&gt;:MESSAGE_CREATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_ws_state&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
     &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="s2"&gt;"!ping"&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;channel_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Pong"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
       &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:ok&lt;/span&gt;
     &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;handle_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="ss"&gt;:ok&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso nosso bot responde ao comando !ping, com a mensagem pong, no canal que a mensagem foi enviada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I1OM6s6H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/g6jt10mz47q2c8zp3uoq.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I1OM6s6H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/g6jt10mz47q2c8zp3uoq.jpeg" alt="bot responde Ping com Pong"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Qualquer dúvida pode deixar nos comentários ou mandar uma mensagem no discord: dudu#6876&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/uduDudu/discord-bot-elixir"&gt;https://github.com/uduDudu/discord-bot-elixir&lt;/a&gt;&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>tutorial</category>
      <category>brasil</category>
    </item>
  </channel>
</rss>
