
¡Hola, miembros de Habr!
Hoy se familiarizarán con un artículo que tratará sobre cómo crear un bot utilizando C# en .NET Core, y cómo ponerlo en un servidor remoto.
El artículo constará de antecedentes, un paso preparatorio, escritura de la lógica y traslado del bot al servidor remoto.
Espero que este artículo ayude a muchos principiantes.
Antecedentes
Todo comenzó en una noche de otoño insomne que pasé en Discord. Como me uní relativamente recientemente, comencé a explorarlo a fondo. Al descubrir el canal de texto 'Vacantes', me interesé, lo abrí y encontré entre las ofertas que no me interesaban lo siguiente:
"Programador (desarrollador de bots)"
Requisitos:
- conocimientos de lenguajes de programación;
- capacidad de autoaprendizaje.
Requisitos:
- capacidad para entender el código ajeno;
- conocimiento de la funcionalidad de DISCORD.
Tareas:
- desarrollo del bot;
- mantenimiento y soporte del bot.
Tu beneficio:
- Oportunidad de apoyar e influir en un proyecto que te gusta;
- Adquirir experiencia trabajando en equipo;
- Oportunidad de demostrar y mejorar habilidades existentes."
Esto me interesó de inmediato. Sí, no se pagaba por este trabajo, pero no había obligaciones, y no estaría de más en el portafolio. Así que le escribí al administrador del servidor, y me pidió que escribiera un bot que mostrara estadísticas de los jugadores en World of Tanks.
Etapa preparatoria

Discord
Antes de comenzar a escribir nuestro bot, es necesario crearlo para Discord. Necesitas:
- Iniciar sesión en tu cuenta de Discord
- En la pestaña 'Applications', haz clic en el botón 'New Application' y nombra al bot
- Obtener el token del bot, ingresando a tu bot y encontrando en la lista la pestaña 'Bot' en 'Settings'
- Guarda el token en algún lugar
Wargaming
También es necesario crear una aplicación en Wargaming para acceder a la API de Wargaming. Esto también es bastante sencillo:
- Ingresa a tu cuenta de Wargaming
- Accede a 'Mis aplicaciones' y haz clic en el botón 'Agregar nueva aplicación', dando un nombre a la aplicación y eligiendo su tipo
- Guarda el ID de la aplicación
Software
Aquí ya hay libertad de elección. Algunos usan Visual Studio, otros Rider, algunos son más poderosos y escriben código en Vim (los verdaderos programadores solo usan el teclado, ¿verdad?). Sin embargo, para evitar implementar la API de Discord, se puede usar la biblioteca no oficial para C# “DSharpPlus”. Se puede instalar desde NuGet, o compilando los fuentes desde el repositorio por uno mismo.
Para aquellos que no saben, o que han olvidado, cómo instalar aplicaciones desde NuGet.Instrucciones para Visual Studio
- Vamos a la pestaña Proyecto – Administrar paquetes NuGet;
- Hacemos clic en exploración y en el campo de búsqueda escribimos “DSharpPlus”;
- Seleccionamos e instalamos el framework;
- ¡BENEFICIO!
La etapa preparatoria ha terminado, ahora podemos pasar a escribir el bot.
Escribiendo la lógica

No vamos a considerar toda la lógica de la aplicación, solo mostraré cómo trabajar con la interceptación de mensajes del bot y cómo trabajar con la API de Wargaming.
El trabajo con el bot de Discord se realiza a través de la función static async Task MainTask(string[] args);
Para llamar a esta función, en Main es necesario escribir
MainTask(args).ConfigureAwait(false).GetAwaiter().GetResult();Luego, necesitas inicializar tu 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 una 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(“Hola, ” + e.Author.Username);
}
};
Donde e.Author.Username es la obtención del apodo del usuario.
Así, cuando envíes cualquier mensaje que comience con &, el bot te saludará.
Al final de esta función, es necesario escribir await discord.ConnectAsync(); y await Task.Delay(-1);
Esto permitirá ejecutar comandos en segundo plano, sin ocupar el hilo principal.
Ahora es necesario entender la API de Wargaming. Aquí todo es simple: escribes solicitudes CURL, obtienes una respuesta en forma de cadena JSON, extraes los datos necesarios y realizas manipulaciones sobre ellos.
Ejemplo de trabajo con WargamingAPI
public Player FindPlayer(string searchNickname)
{
//https://api.worldoftanks.ru/wot/account/list/?application_id=y0ur_a@@_id_h3r3&search=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("Jugador no encontrado");
}
}
else
{
string error = parsed.error.message;
if (error == "NOT_ENOUGH_SEARCH_LENGTH")
{
throw new PlayerNotFound("Se requieren al menos tres caracteres");
}
else if (error == "INVALID_SEARCH")
{
throw new PlayerNotFound("Búsqueda inválida");
}
else if (error == "SEARCH_NOT_SPECIFIED")
{
throw new PlayerNotFound("Apodo vacío");
}
else
{
throw new Exception("Algo salió mal.");
}
}
return player;
}
¡Atención! No se recomienda almacenar tokens e IDs de aplicaciones en texto claro. Al menos, Discord bloquea esos tokens cuando se publican en la red mundial; en el peor de los casos, los atacantes pueden usarlos.
Despliegue en VPS – servidor

Después de terminar con el bot, es necesario alojarlo en un servidor que esté en funcionamiento continuamente 24/7. Esto se debe a que, cuando tu aplicación está activa, el bot también lo está. En cuanto apagas la aplicación, tu bot también se detiene.
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 barato alojar en Linux.
En el servidor de Discord me recomendaron vscale.io, y enseguida creé un servidor virtual en Ubuntu y subí el bot. No voy a describir cómo funciona este sitio, sino que pasaré directamente a la configuración del bot.
En primer lugar, necesitas instalar el software necesario, que ejecutará nuestro bot, escrito en .NET Core. .
A continuación, debes subir el bot a un servicio de Git, como GitHub y similares, y clonarlo en el servidor VPS, o descargarlo de otras maneras. Ten en cuenta que solo tendrás la consola, no habrá GUI. En absoluto.
Después de descargar tu bot, es necesario iniciarlo. Para ello, debes:
- Restaurar todas las dependencias: dotnet restore
- Construir la aplicación: dotnet build name_project.sln -c Release
- Acceder al DLL construido;
- dotnet name_of_file.dll
¡Felicidades! Tu bot está en funcionamiento. Sin embargo, el bot, desafortunadamente, ocupa la consola, y salir del VPS – servidor no es tan sencillo. Además, en caso de reiniciar el servidor, tendrás que iniciar el bot de nuevo. Hay un par de soluciones para esta situación. Todas están relacionadas con el inicio al arrancar el servidor:
- Agregar el script de inicio en /etc/init.d
- Crear un servicio que se inicie al arrancar.
No creo que tenga sentido detenerme en ellos, ya que está todo bastante bien explicado en internet.
Conclusiones
Me alegra haberme encargado de esta tarea. Esta fue mi primera experiencia desarrollando un bot, y estoy contento de haber adquirido nuevos conocimientos en C# y sobre Linux.
Enlace al servidor de Discord.
¡Gracias por su atención!
Fuente: habr.com
