Criando um bot do Discord no .NET Core com implantação em um servidor VPS

Criando um bot do Discord no .NET Core com implantação em um servidor VPS

Olá Khabrovitas!

Hoje você verá um artigo que mostrará como criar um bot usando C# no .NET Core e como executá-lo em um servidor remoto.

O artigo consistirá em um histórico, um estágio preparatório, escrevendo a lógica e transferindo o bot para um servidor remoto.

Espero que este artigo ajude muitos iniciantes.

Pré-história

Tudo começou em uma noite de outono sem dormir que passei no servidor Discord. Desde que recentemente me juntei a ele, comecei a estudá-lo de cima a baixo. Tendo encontrado o canal de texto "Vagas", fiquei interessado, abri-o e encontrei entre as ofertas que não me interessavam, estas são:

"Programador (desenvolvedor de bot)
Requisitos:

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

Пожелания:

  • capacidade de entender o código de outras pessoas;
  • conhecimento da funcionalidade DISCORD.

Tarefas:

  • desenvolvimento de robôs;
  • suporte e manutenção do bot.

Seu benefício:

  • Oportunidade de apoiar e influenciar o projeto que você gosta;
  • Adquirir experiência de trabalho em equipe;
  • Oportunidade de demonstrar e melhorar as habilidades existentes.


Isso imediatamente me interessou. Sim, eles não pagaram por este trabalho, mas não exigiram de você nenhuma obrigação e não será supérfluo no portfólio. Portanto, escrevi para o administrador do servidor e ele me pediu para escrever um bot que mostraria as estatísticas do jogador no World of Tanks.

A fase preparatória

Criando um bot do Discord no .NET Core com implantação em um servidor VPS
Discrod
Antes de começarmos a escrever nosso bot, precisamos criá-lo para o Discord. Você precisa:

  1. Entrar na conta do Discord по ссылке
  2. Na guia "Aplicativos", clique no botão "Novo aplicativo" e nomeie o bot
  3. Obtenha um token de bot fazendo login em seu bot e encontrando a guia “Bot” na lista “Configurações”
  4. Salve o token em algum lugar

Wargaming

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

  1. Faça login na sua conta da Wargaming neste link
  2. Vamos a "Meus aplicativos" e clicamos no botão "Adicionar um novo aplicativo", informando o nome do aplicativo e selecionando seu tipo
  3. Salvando o ID do aplicativo

Software

Já existe liberdade de escolha. Alguém usa Visual Studio, alguém Rider, alguém geralmente é poderoso e escreve código no Vim (afinal, programadores reais usam apenas o teclado, certo?). No entanto, para não implementar a API do Discord, você pode usar a biblioteca C# não oficial “DSharpPlus”. Você pode instalá-lo a partir do NuGet ou criando as fontes por conta própria no repositório.

Para quem não sabe ou esqueceu como instalar aplicativos do NuGet.Instruções para Visual Studio

  1. Acesse a aba Projeto - Gerenciar Pacotes NuGet;
  2. Clique na resenha e no campo de busca digite “DSharpPlus”;
  3. Selecione e instale a estrutura;
  4. LUCRO!

A fase preparatória acabou, você pode começar a escrever o bot.

Lógica de escrita

Criando um bot do Discord no .NET Core com implantação em um servidor VPS

Não iremos considerar toda a lógica do aplicativo, apenas mostrarei como trabalhar com a interceptação de mensagens pelo bot, e como trabalhar com a API Wargaming.

O trabalho com o bot do Discord ocorre por meio da tarefa assíncrona estática MainTask(string[] args);
Para chamar esta função, em Main você precisa registrar

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

Em seguida, você precisa 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.
Então, através do lambda, escrevemos os comandos necessários que o bot deve executar:

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

Onde e.Author.Username está obtendo o apelido do usuário.

Dessa forma, quando você enviar qualquer mensagem que comece com &, o bot irá cumprimentá-lo.

Ao final desta função, você deve escrever await discord.ConnectAsync(); e aguarde Task.Delay(-1);

Isso permitirá que você execute comandos em segundo plano sem ocupar o thread principal.

Agora precisamos lidar com a API Wargaming. Tudo é simples aqui - escreva solicitações CURL, obtenha uma resposta na forma de uma string JSON, extraia os dados necessários de lá e execute manipulações neles.

Um exemplo de trabalho com 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("Игрок не найден");
                }
            }
            else
            {
                string error = parsed.error.message;
                if (error == "NOT_ENOUGH_SEARCH_LENGTH")
                {
                    throw new PlayerNotFound("Минимум три символа требуется");
                }
                else if (error == "INVALID_SEARCH")
                {
                    throw new PlayerNotFound("Неверный поиск");
                }
                else if (error == "SEARCH_NOT_SPECIFIED")
                {
                    throw new PlayerNotFound("Пустой никнейм");
                }
                else
                {
                    throw new Exception("Something went wrong.");
                }
            }

            return player;
        }

Atenção! Não é estritamente recomendado armazenar todos os tokens e IDs de aplicativos em texto não criptografado! No mínimo, o Discord bane esses tokens quando eles entram na rede mundial e, no máximo, o bot começa a ser usado por invasores.

Implantar no VPS - servidor

Criando um bot do Discord no .NET Core com implantação em um servidor VPS

Depois de terminar o bot, ele precisa ser hospedado em um servidor que esteja em execução constante 24 horas por dia, 7 dias por semana. Isso se deve ao fato de que, quando seu aplicativo está em execução, o bot também está em execução. Assim que você desliga o aplicativo, seu bot também adormece.

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

No servidor Discord, fui avisado do vscale.io e imediatamente criei um servidor virtual no Ubuntu nele e carreguei o bot. Não vou descrever como esse site funciona, mas irei direto para as configurações do bot.

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

Em seguida, você precisa carregar o bot para um serviço Git, como GitHub e similares, e cloná-lo em um servidor VPS ou baixar seu bot de outras maneiras. Observe que você terá apenas um console, sem GUI. De forma alguma.

Depois de baixar seu bot, você precisa executá-lo. Para isso, você precisa:

  • Restaurar todas as dependências: restauração dotnet
  • Aplicativo de compilação: dotnet build name_project.sln -c Release
  • Vá para a DLL construída;
  • dotnet nome_do_arquivo.dll

Parabéns! Seu bot está em execução. No entanto, o bot, infelizmente, ocupa o console e não é fácil sair do servidor VPS. Além disso, em caso de reinicialização do servidor, você terá que iniciar o bot de uma nova maneira. Existem algumas maneiras de sair da situação. Todos eles estão relacionados ao lançamento na inicialização do servidor:

  • Adicione o script de execução a /etc/init.d
  • Crie um serviço que será executado na inicialização.

Não vejo sentido em me alongar sobre eles, tudo é descrito com detalhes suficientes na Internet.

Descobertas

Estou feliz por ter assumido esta tarefa. Esta foi minha primeira experiência de desenvolvimento de bot e estou feliz por ter adquirido novos conhecimentos em C # e trabalhando com Linux.

Link para o servidor do Discord. Para aqueles que jogam jogos Wargaming.
Link para o repositório onde o bot do Discord está localizado.
Link para o repositório DSharpPlus.
Obrigado!

Fonte: habr.com

Adicionar um comentário