
Bonjour, les membres de Habr!
Aujourd'hui, vous découvrirez un article qui expliquera comment créer un bot en utilisant C# sur .NET Core, et comment le déployer sur un serveur distant.
L'article sera composé d'une histoire, d'une étape préparatoire, de l'écriture de la logique et du transfert du bot sur le serveur distant.
J'espÚre que cet article aidera de nombreux débutants.
Contexte
Tout a commencé lors d'une nuit d'automne insomnie que je passais sur un serveur Discord. Comme je venais de rejoindre, j'ai commencé à l'explorer. En découvrant le canal textuel 'Offres d'emploi', j'ai été intrigué, je l'ai ouvert et j'ai trouvé parmi les offres qui ne m'intéressaient pas celle-ci :
« Programmeur (développeur de bot) »
Exigences :
- connaissance des langages de programmation ;
- capacité d'auto-apprentissage.
Souhaits :
- capacité à comprendre le code des autres ;
- connaissance des fonctionnalités de DISCORD.
TĂąches :
- développement du bot ;
- support et maintenance du fonctionnement du bot.
Votre avantage :
- Possibilité de soutenir et d'influencer un projet qui vous plaßt ;
- Acquisition d'expérience de travail en équipe ;
- Possibilité de démontrer et d'améliorer les compétences existantes.
Cela m'a immédiatement intéressé. Oui, ce travail n'était pas rémunéré, mais aucune obligation n'était requise, et cela ne serait pas superflu dans mon portfolio. J'ai donc écrit à l'admin du serveur, et il m'a demandé de créer un bot qui afficherait les statistiques des joueurs dans World of Tanks.
Ătape prĂ©paratoire

Discord
Avant de commencer à écrire notre bot, il faut d'abord le créer pour Discord. Vous devez :
- Connectez-vous Ă votre compte Discord
- Dans l'onglet 'Applications', cliquez sur le bouton 'Nouvelle application' et donnez un nom au bot
- Obtenez le token du bot en vous rendant sur votre bot et en trouvant l'onglet 'Bot' dans la liste 'ParamĂštres'
- Conservez le token quelque part
Wargaming
Il est également nécessaire de créer une application sur Wargaming pour accéder à l'API Wargaming. C'est également simple :
- Connectez-vous Ă votre compte Wargaming
- Accédez à 'Mes applications' et appuyez sur le bouton 'Ajouter une nouvelle application', en donnant un nom à l'application et en choisissant son type
- Conservez l'ID de l'application
Logiciel
Ici, vous avez dĂ©jĂ la libertĂ© de choix. Certains utilisent Visual Studio, d'autres Rider, et certains codent mĂȘme dans Vim (aprĂšs tout, de vrais programmeurs n'utilisent que le clavier, n'est-ce pas ?). Cependant, pour Ă©viter de mettre en Ćuvre l'API Discord, vous pouvez utiliser la bibliothĂšque non officielle pour C# « DSharpPlus ». Vous pouvez l'installer soit via NuGet, soit en compilant les sources vous-mĂȘme Ă partir du dĂ©pĂŽt.
Pour ceux qui ne le savent pas, ou qui ont oublié comment installer des applications depuis NuGet.Instructions pour Visual Studio
- Allez dans l'onglet Projet â Gestion des packages NuGet ;
- Cliquez sur Explorer et dans le champ de recherche, tapez « DSharpPlus » ;
- Sélectionnez et installez le framework ;
- PROFIT!
La phase préparatoire est terminée, vous pouvez passer à l'écriture du bot.
Ăcriture de la logique

Nous ne considérerons pas toute la logique de l'application, je vais juste montrer comment intercepter les messages avec le bot et comment utiliser l'API Wargaming.
Le travail avec le bot Discord se fait via la fonction static async Task MainTask(string[] args) ;
Pour appeler cette fonction, dans Main, vous devez écrire
MainTask(args).ConfigureAwait(false).GetAwaiter().GetResult();Ensuite, vous devez initialiser votre bot :
discord = new DiscordClient(new DiscordConfiguration
{
Token = token,
TokenType = TokenType.Bot,
UseInternalLogHandler = true,
LogLevel = LogLevel.Debug
}); OĂč token est le jeton de votre bot.
Ensuite, via une lambda, vous écrivez les commandes nécessaires que le bot doit exécuter :
discord.MessageCreated += async e =>
{
string message = e.Message.Content;
if (message.StartsWith("&"))
{
await e.Message.RespondAsync(âBonjour, â + e.Author.Username);
}
};
OĂč e.Author.Username est l'obtention du pseudo de l'utilisateur.
Ainsi, lorsque vous envoyez tout message commençant par &, le bot vous saluera.
à la fin de cette fonction, il est nécessaire d'écrire await discord.ConnectAsync(); et await Task.Delay(-1);
Cela permettra d'exécuter des commandes en arriÚre-plan sans occuper le thread principal.
Maintenant, il est nĂ©cessaire de comprendre l'API Wargaming. Ici, tout est simple â vous Ă©crivez des requĂȘtes CURL, recevez la rĂ©ponse sous forme de chaĂźne JSON, extrayez les donnĂ©es nĂ©cessaires et effectuez des manipulations.
Exemple de travail avec 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("Joueur non trouvé");
}
}
else
{
string error = parsed.error.message;
if (error == "NOT_ENOUGH_SEARCH_LENGTH")
{
throw new PlayerNotFound("Au moins trois caractĂšres requis");
}
else if (error == "INVALID_SEARCH")
{
throw new PlayerNotFound("Recherche invalide");
}
else if (error == "SEARCH_NOT_SPECIFIED")
{
throw new PlayerNotFound("Nickname vide");
}
else
{
throw new Exception("Quelque chose a mal tourné.");
}
}
return player;
}
Attention ! Il est fortement dĂ©conseillĂ© de stocker tous les tokens et ID d'applications en clair ! Au minimum, Discord bannit de tels tokens lorsqu'ils sont exposĂ©s sur le Web, au maximum, le bot peut ĂȘtre exploitĂ© par des malfaiteurs.
DĂ©ploiement sur VPS â serveur

Une fois que vous avez terminĂ© avec le bot, il doit ĂȘtre placĂ© sur un serveur qui fonctionne en continu 24/7. Cela est dĂ» au fait que lorsque votre application fonctionne, le bot fonctionne Ă©galement. DĂšs que vous Ă©teignez l'application, votre bot entre en veille.
Il existe de nombreux serveurs VPS dans ce monde, tant sous Windows que sous Linux, mais dans la plupart des cas, il est beaucoup moins coûteux de s'installer sur Linux.
Sur le serveur Discord, on m'a recommandé vscale.io, et j'ai immédiatement créé un serveur virtuel sous Ubuntu et téléchargé le bot. Je ne vais pas décrire comment ce site fonctionne, je vais directement passer à la configuration du bot.
Tout d'abord, vous devez installer le logiciel nécessaire qui fera fonctionner notre bot, écrit en .NET Core. .
Ensuite, vous devez télécharger le bot sur un service Git, comme GitHub et des similaires, et le cloner sur le serveur VPS, ou, par d'autres moyens, télécharger votre bot. Notez que vous aurez seulement une console, il n'y aura pas de GUI. Pas du tout.
Une fois que vous avez téléchargé votre bot, vous devez le lancer. Pour cela, vous devez :
- Restaurer toutes les dépendances : dotnet restore
- Construire l'application : dotnet build name_project.sln -c Release
- Passer au DLL construite ;
- dotnet name_of_file.dll
Félicitations ! Votre bot est lancé. Cependant, le bot, malheureusement, occupe la console, et il n'est pas si facile de se déconnecter du serveur VPS. De plus, en cas de redémarrage du serveur, il faudra relancer le bot. Il existe quelques solutions. Toutes elles concernent le lancement au démarrage du serveur :
- Ajouter le lancement du script dans /etc/init.d
- Créer un service qui sera lancé au démarrage.
Je ne vois pas vraiment l'intĂ©rĂȘt de s'attarder sur eux, tout est assez bien dĂ©crit sur Internet.
Conclusions
Je suis heureux d'avoir pris ce projet en main. C'était ma premiÚre expérience de développement de bot, et je suis heureux d'avoir acquis de nouvelles connaissances en C# et sur Linux.
Lien vers le serveur Discord.
Merci de votre attention !
Source : habr.com
