Primeiro que tudo para brincar com Go tive de instalar a linguagem na minha máquina, no meu caso já se encontrava instalado, podia passar ao passo seguinte. Outra coisa que foi necessária foi criar uma aplicação no Discord Developers. Entrei neste link, e depois cliquei no botão que diz “New App”.

Criar a App no Discord Developers

Depois de clicar em “New App” apareceu-me um formulário com as informações básicas de um app do Discord. Preenchi o nome, uma breve descrição que mais tarde pode ser alterada e um ícone para ficar um bot com uma imagem toda elegante. No fim cliquei em “Create App” e fui reencaminhado para um segundo formulário.

Neste segundo formulário, fui à parte inferior e cliquei “Create a Bot User” para definir a aplicação como tipo bot. Apareceu um popup a perguntar se tinha a certeza e cliquei “Yes, do it” para confirmar. No fim foi apenas preciso guardar as alterações clicando em “Save Changes”.

Agora que o bot estava criado, só faltava adiciona-lo ao meu canal de Discord. Para este efeito criei um canal de testes e adicionei o bot a este canal. O passo inicial foi clicar em “Generate OAuth2 URL” e depois na página seguinte clicar em “Copy”. Nesta página podia ver quais as permissões que melhor se enquadravam para mim, mas o que estava pré-definido chegava para o que eu queria fazer.

Depois de copiado o link, abri um novo separador, colei-o e abri uma nova página. Nesta nova página escolhi o meu canal de testes e cliquei em “Authorize”. De seguida cliquei para reconhecer que não sou um robot e no fim o Discord disse-me que o bot foi autorizado.

Abri o Discord e foi ao meu canal de testes. No lado direito na lista de utilizadores, já lá estava o megabotlod o que confirmou que toda a operação foi um sucesso.

Estruturar o código inicial

Agora que o bot estava criado e associado ao meu canal, podia começar a criar código e fazer o menino funcionar. Comecei por criar uma pasta dentro da `src` da instalação do Go e dentro dessa pasta o ficheiro principal que tem sempre o nome de main.go .

Com este código base podia testar a aplicação. Limitei-me a criar a estrutura de um “Hello World” simples e correr go run main.go na linha de comandos. A linha de comandos devolveu-me um “Hello Bot” e assim confirmou que estava tudo ok para começar a desenvolver o bot. A estrutura base com que fiquei foi a seguinte:

discord-bot/

|- main.go

Library de Discord para Go

A ligação entre o Go e a API do Discord tinha de ser feita de alguma maneira, e para não ser tudo feito de raiz (o que daria uma enorme trabalheira), investiguei se existia alguma library para o efeito. Ao que parece, existe mesmo. Encontrei no Github um repositório chamado discordgo desenvolvido por um tipo chamado Bruce. Esta library tinha tudo o que precisava para desenvolver o bot.

O primeiro passo seria instala-la no meu computador e para isso, bastou correr o comando go get github.com/bwmarrin/discordgo . O Go tratou do resto e instalou-a na pasta correcta.

Seguindo a documentação da library, cheguei à conclusão que para usar a aplicação tinha de criar uma nova instância da library. Primeiro que tudo, importei a library na linha 5. Na linha 8 criei uma constante chamada token de tipo string que iria servir para guardar o token da App que criei no Discord Developers. Dentro da função main tem a estrutura da criação de uma nova instância discord e da variável de erro para verificação se aconteceu algum erro na tentativa de criar a instância.

Para obter o token da aplicação, voltei ao Discord Developers e em “My Apps” escolhi a aplicação com que estava a trabalhar. Na parte de baixo da página, na secção “Bot”, existe um botão que diz “click to reveal token” e ao clicar obtive o meu token. Depois foi só trocar na linha 8 do código a cima.

Agora que tinha o token podia continuar o resto do código. Uma das coisas principais que precisava de fazer era obter o ID to bot. Para isso, criei por baixo do token uma outra variável global BotID também como string. Esta variável precisa de ser lida nos outros packages, por isso começa com letra maíuscula e leva um comentário. Para obter os detalhes do bot, usei a função User() do discordgo com o atributo “@me” e guardei o resultado numa variável. Mais uma vez tratei dos erros, na linha 20 obtive o ID do bot e associei-o à variável global que criei no início.

Para terminar a lógica da ligação e ligar o bot usei a função Open() do discordgo sem qualquer atributo. Novamente tratei dos erros e mais a baixo na linha 13 do exemplo mandei para a consola um aviso a dizer que o bot está a correr. No fim, para garantir que o bot se mantem a correr, criei um channel vazio que não recebe nada e que vai manter a aplicação a correr infinitamente. O bot vai estar sempre a receber comandos e a tratar deles, por essa razão é preciso ter a aplicação sempre a correr. Assim, quando alguém escrever algo, o bot lê, analisa e encaminha para o sitio correcto.

Depois de executar o comando go run main.go apareceu a mensagem “The bot is running” e de seguida ao abrir o Discord o bot aparecia como online com a bolinha verde no canto.

Criação de funcionalidades

Com o bot ligado e a funcionar, estava na altura de lhe adicionar funcionalidades. Para que o bot possa saber que funcionalidades executar, tem de ser encaminhado através de um message handler. Criei uma função por baixo da função main() com o nome messageHandler . Esta nova função recebe dois atributos, a sessão e a mensagem. De seguida verifiquei se o Id do autor da mensagem recebida era igual ao id do bot, se for, ignore e retorna a função sem executar mais nada, desta forma o bot ignora-se a si próprio, o que faz sentido.

Para completar e testar a função adicionei um if que verifica se o conteúdo da mensagem é igual a “ping”, e caso seja, deve pegar na sessão e enviar uma mensagem simples para o canal. Usei a função ChannelMessageSend() com o atributo message.ChannelID que é basicamente o ID do canal de onde foi recebida a mensagem “ping”, e o atributo “pong” que é a mensagem de resposta e que irá ser enviada para o canal.

Agora que a função existe, tem de ser chamada, e o sítio onde isto deve ser feito, é antes de ser aberta a sessão. Ou seja, dentro da função main, antes da linha err = discord.Open() . Usei a variável discord que representa a instância do discordgo e através da função AddHandler() passei-lhe a função que criei anteriormente como atributo.

Conclusão

Et voilá, bot concluído. Este artigo demonstrou como fiz um bot de forma muito simples, com um único comando. Para quem percebe de programação de certeza que entende como criar comandos novos, e para quem percebe de Go até consegue com toda a certeza criar algo mais correctamente estruturado a partir desta base. O objectivo era facilitar a parte de configurações iniciais com a aplicação de Discord e a integração com o código em si. O código completo pode ser encontrado aqui.