
Antecedentes
Hace un año, decidí crear un bot de telegramas para jugar el muy popular juego de Año Nuevo "Secret Santa". Me inspiró el hecho de que hace un par de años, en el trabajo como compañía, decidimos jugar a este juego (parecía muy bueno) y, además, he estado siguiendo al
club ADM en Habré. En octubre-noviembre del año pasado, me di cuenta de que necesitaba jugar entre mi propia compañía este año nuevamente, pero esta vez sin sacar los nombres escritos en un pedazo de papel del sombrero de Santa Claus, pero más tecnológicamente, o algo así. Como todos estaban en un telegrama y era muy interesante para mí escribir un bot allí, decidí hacerlo en esta plataforma
Por cierto, hace un año ya
escribí un artículo sobre este proyecto en Habré, pero no dije nada sobre la implementación. No hablé por una buena razón, porque fue una lástima o algo :) El proyecto fue preparado solo para la empresa en el trabajo (15-20 personas a la máxima velocidad), pero resultó que el proyecto "disparó" en otros círculos después de un par de artículos sobre recursos. Además, los recursos más populares comenzaron a publicitarme (ni siquiera lo sabía antes de que una gran afluencia de personas saliera de la nada).
Durante un mes, sin una sola inversión en publicidad, reuní a más de 5000 jugadores satisfechos y realmente me enamoré de este proyecto. Pero además de todos sus beneficios, había un gran inconveniente en él, y esta es la implementación.
Como fue hace un año
Fue curioso que tuviera un botón en el bot "únete a la habitación". Sí, es precisamente el que se une. Me escribieron para corregir este error gramatical, pero no me arriesgué, y es por eso :) Luego, puse un código de la versión del bot del año pasado.
elseif ($user['state'] == 7) { if (mb_stripos($textMessage, '') !== false) { if (!empty($user['santa_for_user_id'])) { $text = ' , '; } else { $text = "! - , "; $db->updateState($userId, 8); } }
Todo el bot: de hecho, era un gran archivo index.php que vivía de la función mb_stripos. Además, había muchos "ifics" idénticos. Es decir mb_stripos ($ textMessage, 'join')! == false podría ocurrir más de una vez. Si cambia la palabra "unirse" en el botón a "unirse", y se olvida de cambiar algún tipo de ifchik (que, de nuevo, mucho), todo puede rociar. En lo que puede no ser inmediatamente perceptible (solo un bot en ciertos escenarios no responderá como debería). Una vez que cambié el texto, los usuarios comenzaron a escribir que, en un determinado escenario, el bot no responde como debería. No quería correr más riesgos, y pensé que el error no era tan crítico :) En principio, entiendes. Si había un botón, por ejemplo, "Encontrar Santa aleatorio", me enganché con la palabra "aleatorio" a través de mb_stripos. Fue divertido cuando apareció un botón similar, con texto similar, y cuando no era necesario, todo se convirtió en un innecesario si (si, por ejemplo, tanto allí como allí está la palabra "aleatorio") :)
Por cierto, ¿notaste $ user ['state']? En ese momento, introduje "estados" para comprender en qué estado se encuentra actualmente el usuario. ¿Quería unirse a la sala, por ejemplo, o crear, o tal vez quería jugar un solo juego? Y para cada estado, llegó su propio conjunto de ifchi, que también era importante no romper.
El archivo Cron, por cierto, se encuentra al lado de index.php, podría ejecutarse directamente desde debajo del navegador (aparentemente, entonces realmente no me molestó). Además, cuando de repente quería agregar algún tipo de "estado" (ojalá no quisiera esto) tuve que sumergirme en esta ciudad ... y, por supuesto, nada salió del primer intento. Todo esto también radica en el alojamiento más barato por $ 1 por mes, lo que podría enviarme al infierno cuando mucha gente comenzó a escribir en la hora pico.
Ciertamente fue un infierno para un programador :)
Lo que decidí hacer este año
Este año, por supuesto, decidí reescribir el bot (dado que hubo una demanda considerable el año pasado), quería entrar en el código anterior y descubrir cómo fue ese año para transferir la lógica comercial. Desafortunadamente, no pude descifrar el 70% del código anterior, aunque intenté dejar comentarios en el código para ayudarme en un año :)
Decidí recordar los escenarios principales, y agregar algo nuevo en el camino. Comenzó con la pregunta: "¿qué usar para escribir arquitectura para que no llores más tarde?" Después de mucha investigación, la elección recayó en
Botman . Tenemos pequeños artículos sobre Habré al respecto. En resumen, Botman es algo genial. Se puede instalar tanto en uno "limpio", y puede instalar inmediatamente su conjunto con Laravel (sí, hay un botman instalado inmediatamente encima de Laravel). Decidí quedarme en esta versión, ya que Laravel es claramente mejor de lo que era hace un año :) Tiene la capacidad de almacenar en caché desde el "cuadro", enrutamiento conveniente, artesanal, middleware, conveniencia, la capacidad de trabajar con la base de datos y otros beneficios.
Si de repente no te gusta Laravel, puedes usar cualquier otro marco e instalar Botman encima, o no puedes usar el marco en absoluto . Por cierto, Botman está construido sobre ReactPHP, lo cual es genial :)
A continuación, describiré los beneficios de Botman:
Hay un solo archivo botman.php en el que puede describir todos los comandos. Un ejemplo:
$botman->hears('/start', function (BotMan $bot) { $bot->startConversation(new StartConversation()); })->stopsConversation();
Al escribir el comando / start, StartConversation se iniciará (que debe heredar de la clase de conversación abstracta) e implementará el método run ().
Las preguntas se hacen de manera bastante conveniente, por ejemplo:
$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') {
¿Te das cuenta de que en Button podemos establecer un valor y luego aferrarnos a él más tarde? Es decir, ante sus ojos, el error con la "unión" se corrige, debido al hecho de que me aferro al valor () :)
Por cierto, aún puede usar el método isInteractiveMessageReply, que responderá a la pregunta si escribió texto o hizo clic en el botón interactivo al responder la pregunta que se le hizo al usuario.
Botman ayudó a deshacerse de los estados, puedo hacer otro método ask en el método ask, por ejemplo, si una persona hizo clic en "unirse", solo hago otra pregunta dentro de esto si.
Aquí hay algunos métodos más (de un número muy grande) que proporciona el botman, que se pueden entender fácilmente por el nombre:
$ this-> repeat ($ pregunta);
$ this-> bot-> typesAndWaits ($ secondsToWait);
$ this-> bot-> reply ($ respuesta);
El asesino de las características del botman es que un código puede ejecutarse en muchas plataformas. Es decir, puede escribir su código, inicialmente ejecutarlo solo para Telegram. Luego, decida que aún quiere ir al Administrador de Facebook y que no necesita comenzar a tratar con el SDK de Facebook, los desarrolladores de Botman ya lo han hecho por usted. Solo necesita
instalar el controlador y configurar la API Token de su bot de Facebook Messenger en .env. Toda la funcionalidad funcionará automáticamente en Facebook Messenger.
Botman no solo es compatible con Facebook Messenger y Telegram, esta lista también incluye Slack, Skype, WeChat (se puede encontrar una lista completa en su sitio web).
Además, el "héroe de la ocasión" es famoso por el hecho de que ya tiene las pruebas de papá / Botman (puede escribir pruebas unitarias, su gorra), así como buena documentación. Es difícil nombrar todos los beneficios, porque obviamente no trabajé con todos, no recuerdo todo, pero creo que lo que describí ya debería ser suficiente para interesarme en ellos al menos :)
Bueno, está bien, pero ¿alojaremos nuevamente en el hosting por $ 1?
No, este año todo es serio. Hosting por $ 10 por mes y un dominio gratis con ref. Es broma :)
Decidí aumentar mi conocimiento de Docker, compré VPS en DigitalOcean y lancé el proyecto en Docker. Resultó bastante bien, a pesar de que lo hice casi la primera vez.
Sorprendentemente, la ventana acoplable nunca cayó .
Con VPS, por supuesto, más fresco :)
Cuando se acopló, fue mucho más conveniente llevar a cabo el desarrollo (se preservó el control de versiones de la doncella y del producto).
Lo curioso es que cuando introduje la funcionalidad paga en el bot, necesitaba obtener una actualización del sistema de pago. El sistema de pago me devolvió constantemente mi solicitud de actualización y me dijo "el sitio no funciona". Trabajó para mí, trabajé para amigos (somos de Ucrania), pero no funcionó para muchachos de la Federación Rusa. Sin dudarlo, vi que Roskomnadzor todavía prohibió la dirección IP de mi gotita hace un año (muchos ILV dañaron muchos servidores DigitalOcean en ese momento). Luego también decidieron sobre esto.
¿En qué está escrito tu bot?
Y les aconsejo a todos que usen esta pila en particular cuando escriban sus bots en PHP (para no dispararse en la pierna más tarde, como lo hice).
¿Qué hay de nuevo en el bot?
Santa aprendió a llamar
¡Puedes pedir una llamada de Santa! Incluso te entenderá y te escuchará :)
Santa llama al número indicado (de los números de EE. UU.), Hace preguntas, por ejemplo, "¿Cómo te comportaste en el año?", "¿Qué quieres para el Año Nuevo?", "¿Conoces el poema?", Etc. Si el usuario dice que no conoce la rima, entonces Santa seguirá un escenario diferente de preguntas, si dice que sabe, entonces Santa le pedirá amablemente que le diga la rima :) MÁS: cuando una persona le dice su lista de deseos de Año Nuevo a Santa, Santa escucha y luego envía esta lista de deseos para el usuario que ordenó la llamada (de repente, el niño fue cerrado por sus padres en la habitación, pero de alguna manera ¿necesitan saber qué le pidió a Santa?). Santa también envía la grabación de audio de la llamada con Santa como recuerdo :)
Ahora puedes averiguar quién es tu Santa.
Zrada? Esto es contrario al nombre del juego "Secret Santa", ¿no? En principio sí. PERO el año pasado, por la cantidad de personas que querían conocer a su Santa, mis drogas fueron desgarradas. "¿El jefe me dará un regalo?", "Alguien no nos dio un regalo para alguien, ¿puedes decir quién debería haberle dado?" Y así sucesivamente. Ahora existe esa oportunidad, pero sea lo que sea, tal placer saldrá a $ 5.99 :)
Conclusiones
No debe esperar que su proyecto siempre sea pequeño. No es necesario crear un index.php con un montón de ifs, incluso si el proyecto comienza con solo un par de tres ifs (sé lo suficiente de estos proyectos)). Es mejor hacerlo de inmediato. Incluso si pasa más tiempo en él, le brindará beneficios porque cuando necesite cambiar / agregar lógica al proyecto con urgencia, no tuvo que pensar en cómo cambiar ifas para que el bot no se caiga, como resultó para mí :). Además, este enfoque (con ifas) le enseña a tomar todas las demás decisiones con muletas (no es la mejor habilidad, de acuerdo). Bueno, por supuesto, piensa en ti mismo, tendrás que entrar en este código más tarde, y tendrás que lidiar con él, y luego no será muy dulce :(
Todo el buen código, escribir sus bots de chat, y también escribir sus proyectos. ¡Esto es asombroso!
Al final, quiero recordar que leí en alguna parte que:
Si supieras que tus proyectos favoritos que utilizas (Facebook, VK, etc.) están diseñados para estar a punto de caer, te sorprenderías. Sí, de hecho, ese año todos jugaron con placer, sin siquiera imaginar lo que estaba sucediendo dentro de este bot (yo mismo me sorprendió cómo sobrevivió ese diciembre :)).
Si quieres jugar -
Bienvenido :)