Comment vous avez besoin et n'avez pas besoin d'écrire un chat pour les bots en utilisant l'exemple de mon bot pour jouer à Secret Santa

image

Contexte


Il y a un an, j'ai décidé de créer un bot de télégramme afin de jouer au jeu très populaire du Nouvel An «Secret Santa». J'ai été inspiré par le fait qu'il y a quelques années, nous, au travail, en tant qu'entreprise, avons décidé de jouer à ce jeu (cela semblait très cool), et en plus, je suis depuis longtemps le club ADM sur Habré. En octobre-novembre de l'année dernière, j'ai réalisé que je devais jouer entre ma propre entreprise cette année encore, mais cette fois sans retirer les noms écrits sur un morceau de papier du chapeau du Père Noël, mais plus technologiquement, ou quelque chose. Comme tout le monde était dans un télégramme et qu'il était très intéressant pour moi d'écrire un bot là-bas, j'ai décidé de le faire sur cette plateforme

Au fait, il y a un an, j'avais déjà écrit un article sur ce projet sur Habré, mais je n'ai rien dit sur la mise en œuvre. Je n'ai pas parlé pour une bonne raison, car c'était une honte ou quelque chose :) Le projet a été préparé uniquement pour l'entreprise au travail (15-20 personnes à vitesse maximale), mais il s'est avéré que le projet a "tourné" dans d'autres cercles après quelques articles sur les ressources. De plus, des ressources plus populaires elles-mêmes ont commencé à me faire de la publicité (je ne le savais même pas avant qu'un afflux important de personnes ne sorte de nulle part).

Pendant un mois, sans un seul investissement publicitaire, j'ai rassemblé plus de 5000 joueurs satisfaits et suis vraiment tombé amoureux de ce projet. Mais en plus de tous ses avantages, il y avait un énorme inconvénient en lui, et c'est la mise en œuvre.

Comment c'était il y a un an


C'était drôle que j'avais un bouton dans le bot "rejoindre la salle". Oui, c'est précisément celui qui rejoint. Ils m'ont écrit pour corriger ce bug de grammaire, mais je ne l'ai pas risqué, et c'est pourquoi :) Ensuite, j'ai mis un morceau de code de la version de l'an dernier du bot.

elseif ($user['state'] == 7) { if (mb_stripos($textMessage, '') !== false) { if (!empty($user['santa_for_user_id'])) { $text = '   ,      '; } else { $text = "!       -     ,      "; $db->updateState($userId, 8); } } 

Le bot entier - c'était un énorme fichier index.php qui vivait de la fonction mb_stripos, en fait. De plus, il y avait beaucoup de "ifics" identiques. C'est-à-dire mb_stripos ($ textMessage, 'join')! == false peut se produire plusieurs fois. Si vous changez le mot «rejoindre» dans le bouton pour «rejoindre», et oubliez de changer une sorte d'ifchik (qui, encore une fois, beaucoup), tout peut saupoudrer. À quoi il peut ne pas être immédiatement perceptible (juste un bot dans certains scénarios ne répondra pas comme il se doit). Une fois que j'ai changé le texte, les utilisateurs ont commencé à écrire que dans un certain scénario, le bot ne répond pas comme il se doit. Je ne voulais pas prendre de risques supplémentaires et je pensais que l'erreur n'était pas si critique :) En principe, vous comprenez. S'il y avait un bouton, par exemple, "Trouver un Père Noël aléatoire", je me suis accroché au mot "aléatoire" via mb_stripos. C'était amusant quand un bouton similaire est apparu, avec un texte similaire, et quand ce n'était pas nécessaire, tout est devenu inutile si (si par exemple à la fois là et il y a le mot "aléatoire") :)

Au fait, avez-vous remarqué $ user ['state']? À cette époque, j'ai introduit des «états» afin de comprendre dans quel état se trouve actuellement l'utilisateur. Voulait-il rejoindre la salle, par exemple, ou créer, ou peut-être voulait-il jouer à un seul jeu? Et pour chaque état, son propre ensemble d'ifchi est venu, ce qui était également important de ne pas se casser.

Soit dit en passant, le fichier Cron se trouvait à côté de index.php, il pouvait être exécuté directement sous le navigateur (apparemment, cela ne m'a pas vraiment dérangé). De plus, quand j'ai soudainement voulu ajouter une sorte d '"état" (j'aurais aimé ne pas le vouloir), j'ai dû plonger dans cette ville ... et bien sûr, rien n'est sorti de la première tentative. Tout cela reposait également sur l'hébergement le moins cher pour 1 $ par mois, ce qui pourrait m'envoyer en enfer lorsque beaucoup de gens ont commencé à écrire aux heures de pointe.

C'était certainement un enfer pour un programmeur :)

Ce que j'ai décidé de faire cette année


Cette année, bien sûr, j'ai décidé de réécrire le bot (car il y avait une demande considérable l'année dernière), je voulais entrer dans l'ancien code et comprendre comment c'était cette année afin de transférer la logique métier. Malheureusement, je n'ai même pas pu comprendre à 70% l'ancien code, même si j'ai ensuite essayé de me laisser des commentaires dans le code pour m'aider dans un an :)

J'ai décidé de simplement rappeler les principaux scénarios, et d'y ajouter quelque chose de nouveau en cours de route. Il a commencé par la question: "que faut-il utiliser pour écrire l’architecture pour ne pas pleurer plus tard?" Après de nombreuses recherches, le choix s'est porté sur Botman . Nous avons de petits articles sur Habré à ce sujet. En bref, Botman est une chose très cool. Il peut être installé à la fois sur un "propre", et vous pouvez immédiatement installer son assemblage avec Laravel (oui, il y a un botman installé immédiatement au-dessus de Laravel). J'ai décidé de rester sur cette version, car Laravel est clairement meilleur qu'il y a un an :) Il a la capacité de mettre en cache à partir de la "boîte", un routage pratique, artisan, middleware, commodité, la possibilité de travailler avec la base de données et d'autres avantages. Si tout à coup vous n'aimez pas Laravel, vous pouvez utiliser n'importe quel autre framework et installer Botman dessus, ou vous ne pouvez pas utiliser le framework du tout . Soit dit en passant, Botman est construit sur ReactPHP, ce qui est cool :)

Ensuite, je décrirai les avantages de Botman:

Il existe un seul fichier botman.php dans lequel vous pouvez décrire toutes les commandes. Un exemple:

 $botman->hears('/start', function (BotMan $bot) { $bot->startConversation(new StartConversation()); })->stopsConversation(); 

Lors de l'écriture de la commande / start, StartConversation démarrera (qui devrait hériter de la classe de conversation abstraite) et implémentera la méthode run ().

Les questions sont posées très facilement, par exemple:

 $question = Question::create("   ,    ?")->addButtons([Button::create('')->value('create'), Button::create('')->value('join')]); $this->ask($question, function (Answer $answer) { if ($answer->isInteractiveMessageReply()) { if ($answer->getValue() == 'join') { 

Remarquez que chez Button, nous pouvons définir une valeur, et nous y accrocher plus tard? Autrement dit, sous vos yeux, le bug avec le "join" est corrigé, car je m'accroche à value () :)
Soit dit en passant, vous pouvez toujours utiliser la méthode isInteractiveMessageRhness, qui répondra à la question si vous avez écrit du texte ou cliqué sur le bouton interactif lors de la réponse à la question posée à l'utilisateur.

Botman a aidé à se débarrasser des états, je peux faire une autre méthode de demande dans la méthode de demande, par exemple, si une personne a cliqué sur «rejoindre», je fais juste une autre demande à l'intérieur de ce si.

Voici quelques autres méthodes (d'un très grand nombre) fournies par le botman, qui peuvent être facilement comprises à partir du nom:
$ this-> repeat ($ question);

$ this-> bot-> typesAndWaits ($ secondsToWait);

$ this-> bot-> reply ($ reply);
Le tueur des fonctionnalités du botman est qu'un code peut s'exécuter sur de nombreuses plates-formes. Autrement dit, vous pouvez écrire votre code, ne l'exécuter initialement que pour Telegram. Ensuite, décidez que vous souhaitez toujours accéder à Facebook Manager, et que vous n'avez pas du tout besoin de commencer à gérer le SDK Facebook, les développeurs Botman l'ont déjà fait pour vous. Il vous suffit d' installer le pilote et de définir l'API Token de votre bot Facebook Messenger en .env. Toutes les fonctionnalités fonctionneront automatiquement dans Facebook Messenger.
Botman ne prend pas seulement en charge Facebook Messenger et Telegram, cette liste comprend également Slack, Skype, WeChat (une liste complète peut être trouvée sur leur site Web).

En outre, le "héros de l'occasion" est célèbre pour le fait qu'il a déjà les tests de papa / Botman (vous pouvez écrire des tests unitaires, votre casquette), ainsi qu'une bonne documentation. Il est difficile de nommer tous les avantages, car je n'ai évidemment pas travaillé avec tout le monde, je ne me souviens pas de tout, mais je pense que ce que j'ai décrit devrait déjà être suffisant pour être intéressé par eux au moins :)

Eh bien, ok, mais allons-nous héberger à nouveau sur l'hébergement pour 1 $?


Non, cette année, tout est sérieux. Hébergement pour 10 $ par mois et un domaine gratuit avec ref. Je plaisante :)

J'ai décidé d'approfondir mes connaissances de docker, acheté VPS sur DigitalOcean et lancé le projet dans docker. Cela s'est plutôt bien passé, malgré le fait que je l'ai fait presque la première fois. Étonnamment, le docker n'est jamais tombé .

Avec VPS, bien sûr, plus cool :)

Lorsqu'il était docker, il était beaucoup plus pratique de mener à bien le développement (le versioning sur la vierge et sur la prod a été conservé).

Le plus drôle, c'est que lorsque j'ai introduit des fonctionnalités payantes dans le bot, j'avais besoin d'obtenir une mise à niveau du système de paiement. Le système de paiement me renvoyait constamment ma demande de mise à niveau et disait "le site est en panne". A travaillé pour moi, a travaillé pour des amis (nous sommes d'Ukraine), mais n'a pas travaillé pour des gars de la Fédération de Russie. Sans hésitation, j'ai vu que Roskomnadzor interdisait toujours l'adresse IP de ma droplet il y a un an (beaucoup de serveurs DigitalOcean ont été endommagés par l'ILV à cette époque). Ensuite, ils ont également décidé de cela.

Sur quoi est écrit votre bot?


  • PHP 7.3
  • Laravel
  • Botman

Et je conseille à tout le monde d'utiliser cette pile particulière lors de l'écriture de leurs bots en PHP (afin de ne pas se tirer une balle dans la jambe plus tard, comme je l'ai fait).

Quoi de neuf dans le bot?


Le Père Noël a appris à appeler


Vous pouvez commander un appel du Père Noël! Il va même vous comprendre et vous écouter :)

Le Père Noël appelle le numéro indiqué (à partir des numéros américains), pose des questions, par exemple, "Comment vous êtes-vous comporté dans l'année?", "Que voulez-vous pour la nouvelle année?", "Connaissez-vous le poème?", Etc. Si l'utilisateur dit qu'il ne connaît pas la rime, alors le Père Noël suivra un scénario différent de questions, s'il dit qu'il sait, alors le Père Noël vous demandera de bien vouloir dire la rime :) PLUS: quand une personne dit sa liste de souhaits pour le Nouvel An au Père Noël, le Père Noël écoute, puis envoie cette liste de souhaits à l'utilisateur qui a ordonné l'appel (tout d'un coup, l'enfant a été fermé à ses parents dans la chambre, mais ils ont en quelque sorte besoin de savoir ce qu'il a demandé au Père Noël?). Le Père Noël envoie également l'enregistrement audio de l'appel avec le Père Noël en souvenir :)

Vous pouvez maintenant découvrir qui est votre père Noël.


Zrada? C'est contraire au nom du jeu "Secret Santa", n'est-ce pas? En principe, oui. MAIS l'année dernière, à cause du nombre de personnes qui voulaient connaître leur père Noël, mes drogues étaient déchirées. "Le patron va-t-il me donner un cadeau?", "Quelqu'un ne nous a pas donné de cadeau pour quelqu'un, pouvez-vous dire qui aurait dû lui donner?" Et ainsi de suite. Maintenant, il y a une telle opportunité, mais quelle qu'elle soit - un tel plaisir sortira à 5,99 $ :)

Conclusions


Vous ne devez pas espérer que votre projet sera toujours petit. Il n'est pas nécessaire de créer un index.php avec un tas d'if, même si le projet commence avec seulement quelques trois ifs (je connais assez de ces projets)). Il vaut mieux le faire tout de suite. Même si vous y consacrez plus de temps, cela vous apportera des avantages en ce sens que lorsque vous aurez un besoin urgent de changer / ajouter de la logique au projet, vous n'avez pas eu à réfléchir à la façon de changer ifas pour que le bot ne tombe pas, comme cela s'est avéré pour moi :). De plus, cette approche (avec ifas) vous apprend à prendre toutes les autres décisions béquillées (pas la meilleure compétence, d'accord). Eh bien, bien sûr, pensez à vous, vous devrez entrer dans ce code plus tard, et vous devrez vous en occuper, puis ce ne sera pas très doux :(

Tout le bon code, écrire vos robots de chat, et aussi écrire vos projets. C'est génial!

En fin de compte, je tiens à rappeler que j'ai lu quelque part que:
Si vous saviez que vos projets préférés que vous utilisez (Facebook, VK, etc.) sont construits de telle sorte que sur le point de tomber, vous seriez surpris. Oui, en effet, cette année-là, tout le monde a joué avec plaisir, sans même imaginer ce qui se passait à l'intérieur de ce bot (j'ai moi-même été choqué de voir comment il a survécu en décembre :)).

Si vous voulez jouer - Bienvenue :)

Source: https://habr.com/ru/post/fr476144/


All Articles