Creación de un bot de Discord en .NET Core con implementación en un servidor VPS

Creación de un bot de Discord en .NET Core con implementación en un servidor VPS

¡Hola Khabrovitas!

Hoy verá un artículo que le mostrará cómo crear un bot usando C# en .NET Core y cómo ejecutarlo en un servidor remoto.

El artículo constará de antecedentes, una etapa preparatoria, escribir lógica y transferir el bot a un servidor remoto.

Espero que este artículo ayude a muchos principiantes.

Prehistoria

Todo comenzó una noche de otoño sin dormir que pasé en el servidor de Discord. Desde que me uní a él recientemente, comencé a estudiarlo de arriba a abajo. Habiendo encontrado el canal de texto "Vacantes", me interesé, lo abrí y encontré entre las ofertas que no me interesaban, estas son:

"Programador (desarrollador de bots)
requisitos:

  • conocimiento de lenguajes de programación;
  • capacidad para el autoaprendizaje.

Пожелания:

  • habilidad para entender el código de otras personas;
  • conocimiento de la funcionalidad DISCORD.

Objetivos:

  • desarrollo de bots;
  • soporte y mantenimiento del bot.

Su beneficio:

  • Oportunidad de apoyar e influir en el proyecto que te gusta;
  • Adquirir experiencia de trabajo en equipo;
  • Oportunidad de demostrar y mejorar las habilidades existentes.


Esto me interesó de inmediato. Sí, no pagaron por este trabajo, pero no le exigieron ninguna obligación, y no será superfluo en la cartera. Por lo tanto, le escribí al administrador del servidor y me pidió que escribiera un bot que mostrara las estadísticas del jugador en World of Tanks.

La fase preparatoria

Creación de un bot de Discord en .NET Core con implementación en un servidor VPS
discordia
Antes de comenzar a escribir nuestro bot, debemos crearlo para Discord. Necesitas:

  1. Iniciar sesión en la cuenta de Discord enlace
  2. En la pestaña "Aplicaciones", haga clic en el botón "Nueva aplicación" y asigne un nombre al bot
  3. Obtenga un token de bot iniciando sesión en su bot y buscando la pestaña "Bot" en la lista "Configuración"
  4. Guarde el token en algún lugar

Wargaming

Además, debe crear una aplicación en Wargaming para obtener acceso a la API de Wargaming. Aquí, también, todo es simple:

  1. Inicie sesión en su cuenta de Wargaming en este enlace
  2. Vamos a "Mis Aplicaciones" y pulsamos en el botón "Añadir una nueva aplicación", dando el nombre de la aplicación y seleccionando su tipo
  3. Guardar la identificación de la aplicación

Software

Ya hay libertad de elección. Alguien usa Visual Studio, alguien Rider, alguien generalmente es poderoso y escribe código en Vim (después de todo, los programadores reales solo usan el teclado, ¿no?). Sin embargo, para no implementar la API de Discord, puede usar la biblioteca C# no oficial "DSharpPlus". Puede instalarlo desde NuGet o creando las fuentes usted mismo desde el repositorio.

Para los que no saben o han olvidado como instalar aplicaciones desde NuGet.Instrucciones para Visual Studio

  1. Vaya a la pestaña Proyecto - Administrar paquetes NuGet;
  2. Haga clic en la revisión y en el campo de búsqueda ingrese "DSharpPlus";
  3. Seleccione e instale el marco;
  4. ¡GANANCIA!

La etapa preparatoria ha terminado, puede proceder a escribir el bot.

Lógica de escritura

Creación de un bot de Discord en .NET Core con implementación en un servidor VPS

No consideraremos toda la lógica de la aplicación, solo mostraré cómo trabajar con la interceptación de mensajes por parte del bot y cómo trabajar con la API de Wargaming.

Trabajar con el bot de Discord ocurre a través de la Tarea MainTask asincrónica estática (cadena [] args);
Para llamar a esta función, en Main necesita registrarse

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

A continuación, debe inicializar su bot:

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

Donde token es el token de tu bot.
Luego, a través de la lambda, escribimos los comandos necesarios que debe ejecutar el bot:

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

Donde e.Author.Username obtiene el apodo del usuario.

De esta forma, cuando envíes cualquier mensaje que comience con &, el bot te saludará.

Al final de esta función, debe escribir await discord.ConnectAsync(); y espera Task.Delay(-1);

Esto le permitirá ejecutar comandos en segundo plano sin retomar el hilo principal.

Ahora tenemos que lidiar con la API de Wargaming. Aquí todo es simple: escriba solicitudes CURL, obtenga una respuesta en forma de cadena JSON, extraiga los datos necesarios de allí y realice manipulaciones en ellos.

Un ejemplo de trabajo con 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;
        }

¡Atención! ¡No se recomienda estrictamente almacenar todos los tokens e ID de aplicaciones en texto claro! Como mínimo, Discord prohíbe dichos tokens cuando ingresan a la red mundial y, como máximo, los atacantes comienzan a utilizar el bot.

Implementar en VPS - servidor

Creación de un bot de Discord en .NET Core con implementación en un servidor VPS

Una vez que haya terminado con el bot, debe estar alojado en un servidor que se ejecute constantemente las 24 horas del día, los 7 días de la semana. Esto se debe al hecho de que cuando su aplicación se está ejecutando, el bot también se está ejecutando. Tan pronto como apagas la aplicación, tu bot también se queda dormido.

Existen muchos servidores VPS en este mundo, tanto en Windows como en Linux, sin embargo, en la mayoría de los casos, es mucho más económico alojar en Linux.

En el servidor Discord, me recomendaron vscale.io, e inmediatamente creé un servidor virtual en Ubuntu y cargué el bot. No describiré cómo funciona este sitio, pero iré directamente a la configuración del bot.

En primer lugar, debe instalar el software necesario que ejecutará nuestro bot escrito en .NET Core. Cómo hacerlo se describe aquí.

A continuación, debe cargar el bot en un servicio de Git, como GitHub y similares, y clonarlo en un servidor VPS, o descargar su bot de otras formas. Tenga en cuenta que solo tendrá una consola, no una GUI. En absoluto.

Una vez que haya descargado su bot, debe ejecutarlo. Para esto, necesitas:

  • Restaurar todas las dependencias: dotnet restore
  • Aplicación de compilación: dotnet build name_project.sln -c Release
  • Ir a la DLL compilada;
  • dotnet nombre_de_archivo.dll

¡Felicidades! Su bot se está ejecutando. Sin embargo, el bot, desafortunadamente, ocupa la consola y no es fácil salir del servidor VPS. Además, en caso de reinicio del servidor, deberá iniciar el bot de una nueva manera. Hay un par de maneras de salir de la situación. Todos ellos están relacionados con el lanzamiento al inicio del servidor:

  • Agregue el script de ejecución a /etc/init.d
  • Cree un servicio que se ejecutará al inicio.

No veo el sentido de insistir en ellos en detalle, todo se describe con suficiente detalle en Internet.

Hallazgos

Me alegro de haber aceptado esta tarea. Esta fue mi primera experiencia en el desarrollo de bots y me alegro de haber adquirido nuevos conocimientos en C# y de trabajar con Linux.

Enlace al servidor de Discord. Para aquellos que juegan juegos de Wargaming.
Enlace al repositorio donde se encuentra el bot de Discord.
Enlace al repositorio de DSharpPlus.
Gracias por su atención!

Fuente: habr.com

Añadir un comentario