Criação de um bot Discord em .NET Core com deploy em um servidor VPS

Criação de um bot Discord em .NET Core com deploy em um servidor VPS

Olá, Habr!

Hoje você vai conhecer um artigo que fala sobre como criar um bot usando C# no .NET Core e como colocá-lo em um servidor remoto.

O artigo consistirá em uma introdução, uma etapa de preparação, a escrita da lógica e a transferência do bot para o servidor remoto.

Espero que este artigo ajude muitos iniciantes.

Antecedentes

Tudo começou numa noite de outono sem sono que passei no servidor Discord. Como eu tinha me juntado a ele recentemente, comecei a explorá-lo detalhadamente. Descobrindo o canal de texto ‘Vagas’, fiquei interessado, abri-o e encontrei, entre as propostas que não me interessavam, esta:

“Programador (desenvolvedor de bot)
Requisitos:

  • conhecimento de linguagens de programação;
  • capacidade de autoaprendizagem.

Desejos:

  • habilidade de entender o código de outros;
  • conhecimento da funcionalidade do DISCORD.

Tarefas:

  • desenvolvimento do bot;
  • suporte e manutenção do funcionamento do bot.

Seu benefício:

  • Oportunidade de apoiar e influenciar um projeto que lhe agrade;
  • Aquisição de experiência de trabalho em equipe;
  • Oportunidade de demonstrar e melhorar habilidades existentes.”


Isso imediatamente despertou meu interesse. Sim, para esse trabalho não pagavam, mas não exigiam obrigações de você, e também não seria um problema para o portfólio. Então escrevi para o administrador do servidor, e ele pediu para criar um bot que mostrasse as estatísticas do jogador em World of Tanks.

Etapa preparatória

Criação de um bot Discord em .NET Core com deploy em um servidor VPS
Discrod
Antes de começar a escrever nosso bot, você precisa criá-lo para o Discord. Você precisa:

  1. Entrar na conta do Discord no link
  2. Na aba 'Applications', clique no botão 'New Application' e nomeie o bot
  3. Obter o token do bot, acessando seu bot e encontrando na lista a aba 'Bot' em 'Settings'
  4. Salve o token em algum lugar

Wargaming

Além disso, você precisa criar um aplicativo na Wargaming para obter acesso à API Wargaming. Aqui também é simples:

  1. Acesse sua conta Wargaming neste link
  2. Acesse 'Meus Aplicativos' e clique no botão 'Adicionar Novo Aplicativo', dando um nome ao aplicativo e escolhendo seu tipo
  3. Salve o ID do aplicativo

Software

Aqui já existe liberdade de escolha. Alguns usam Visual Studio, outros usam Rider, alguns preferem um ambiente mais robusto e escrevem código no Vim (afinal, verdadeiros programadores usam apenas o teclado, certo?). No entanto, para evitar implementar a API do Discord, você pode usar uma biblioteca não oficial para C# chamada “DSharpPlus”. Ela pode ser instalada pelo NuGet ou compilada a partir do repositório.

Para aqueles que não sabem, ou esqueceram, como instalar aplicativos do NuGet.Instruções para o Visual Studio

  1. Vá até a aba Projeto – Gerenciar pacotes NuGet;
  2. Clique em Procurar e insira “DSharpPlus” no campo de busca;
  3. Selecione e instale o framework;
  4. LUCRO!

A etapa de preparação está concluída, agora podemos passar à escrita do bot.

Escrevendo a lógica

Criação de um bot Discord em .NET Core com deploy em um servidor VPS

Não vamos considerar toda a lógica do aplicativo, apenas mostrarei como lidar com a captura de mensagens pelo bot e como trabalhar com a API da Wargaming.

A interação com o bot do Discord ocorre através da função static async Task MainTask(string[] args);
Para chamar essa função, você deve escrever no Main

MainTask(args).ConfigureAwait(false).GetAwaiter().GetResult();

Em seguida, você precisará inicializar seu bot:

discord = new DiscordClient(new DiscordConfiguration
{
    Token = token,
    TokenType = TokenType.Bot,
    UseInternalLogHandler = true,
    LogLevel = LogLevel.Debug
});

Onde token é o token do seu bot.
Depois, através de uma expressão lambda, definimos os comandos que o bot deve executar:

discord.MessageCreated += async e =>
{
    string message = e.Message.Content;
    if (message.StartsWith("&"))
    {
        await e.Message.RespondAsync(“Olá, ” + e.Author.Username);
    }
};

Onde e.Author.Username é como obter o nome de usuário do autor.

Assim, quando você enviar qualquer mensagem que comece com &, o bot irá saudá-lo.

No final dessa função, é necessário escrever await discord.ConnectAsync(); e await Task.Delay(-1);

Isso permitirá executar comandos em segundo plano, sem ocupar o thread principal.

Agora precisamos entender a API da Wargaming. Aqui é simples – você faz requisições CURL, recebe a resposta em formato de JSON – strings, extrai os dados necessários e faz as manipulações que precisar.

Exemplo de uso da WargamingAPI

public Player FindPlayer(string searchNickname)
        {
            //https://api.worldoftanks.ru/wot/account/list/?application_id=y0ur_a@@_id_h3r3search=nickname
            urlRequest = resourceMan.GetString("url_find_player") + appID + "&search=" + searchNickname;
            Player player = null;
            string resultResponse = GetResponse(urlRequest);
            dynamic parsed = JsonConvert.DeserializeObject(resultResponse);

            string status = parsed.status;
            if (status == "ok")
            {
                int count = parsed.meta.count;
                if (count > 0)
                {
                    player = new Player
                    {
                        Nickname = parsed.data[0].nickname,
                        Id = parsed.data[0].account_id
                    };
                }
                else
                {
                    throw new PlayerNotFound("Jogador não encontrado");
                }
            }
            else
            {
                string error = parsed.error.message;
                if (error == "NOT_ENOUGH_SEARCH_LENGTH")
                {
                    throw new PlayerNotFound("É necessário um mínimo de três caracteres");
                }
                else if (error == "INVALID_SEARCH")
                {
                    throw new PlayerNotFound("Busca inválida");
                }
                else if (error == "SEARCH_NOT_SPECIFIED")
                {
                    throw new PlayerNotFound("Nick vazio");
                }
                else
                {
                    throw new Exception("Algo deu errado.");
                }
            }

            return player;
        }

Atenção! Não é recomendável guardar tokens e IDs de aplicativos em texto aberto! No mínimo, o Discord bane esses tokens quando eles aparecem na rede mundial, no máximo, o bot começa a ser usado por criminosos.

Deploy no VPS – servidor

Criação de um bot Discord em .NET Core com deploy em um servidor VPS

Depois de terminar com o bot, é necessário hospedá-lo em um servidor que funcione 24/7. Isso se deve ao fato de que, enquanto seu aplicativo está em funcionamento, o bot também está. Assim que você desliga o aplicativo, seu bot entra em modo de espera.

Existem muitos servidores VPS neste mundo, tanto em Windows quanto em Linux, no entanto, na maioria dos casos, é muito mais barato hospedar em Linux.

No servidor Discord, me recomendaram o vscale.io, e eu imediatamente criei nele um servidor virtual com Ubuntu e carreguei o bot. Não vou descrever como funciona esse site, e diretamente irei para a configuração do bot.

Primeiramente, você precisa instalar o software necessário que irá executar nosso bot, escrito em .NET Core. Como fazer isso está descrito aqui.

Em seguida, você precisa enviar o bot para um serviço Git, como GitHub e semelhantes, e cloná-lo no servidor VPS, ou baixá-lo de outras maneiras. Lembre-se de que você terá apenas um console, não haverá GUI. De forma alguma.

Depois de baixar seu bot, você precisa iniciá-lo. Para isso, é necessário:

  • Restaurar todas as dependências: dotnet restore
  • Compilar o aplicativo: dotnet build nome_do_projeto.sln -c Release
  • Ir para a DLL compilada;
  • dotnet nome_do_arquivo.dll

Parabéns! Seu bot está em execução. No entanto, o bot, infelizmente, ocupa o console, e sair do servidor VPS não é tão simples. Além disso, em caso de reinicialização do servidor, você terá que iniciar o bot novamente. Existem algumas soluções para isso. Todas elas envolvem executar na inicialização do servidor:

  • Adicionar a execução do script em /etc/init.d
  • Criar um serviço que será iniciado na inicialização.

Não vejo sentido em me deter muito neles, tudo está suficientemente detalhado na internet.

Como resultado, obtemos um serviço de "monitoramento como serviço", automatizado na linha de produção de integração contínua. O desenvolvedor ou testador precisa apenas definir a lista de métricas em um arquivo JSON, e tudo o mais acontece automaticamente. Obtemos um controle de qualidade transparente dos lançamentos: todas as notificações sobre desempenho, consumo de recursos ou regressões arquitetônicas.

Estou feliz por ter aceitado essa tarefa. Esta foi minha primeira experiência desenvolvendo um bot, e estou contente por ter adquirido novos conhecimentos sobre C# e trabalho com Linux.

Link para o servidor Discord. Para aqueles que jogam Wargaming.
Link para o repositório onde está o bot do Discord.
Link para o repositório DSharpPlus.
Obrigado pela atenção!

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster