Como você precisa e não precisa escrever um chat para bots usando o exemplo do meu bot para jogar Secret Santa

imagem

Antecedentes


Há um ano, decidi criar um bot de telegrama para jogar o bastante popular jogo de ano novo "Secret Santa". Fiquei inspirado pelo fato de, há alguns anos, trabalharmos como empresa, decidir jogar esse jogo (parecia muito legal) e, além disso, tenho acompanhado o clube ADM em Habré. Em outubro-novembro do ano passado, percebi que precisava jogar novamente entre minha própria empresa este ano, mas desta vez sem retirar os nomes escritos em um pedaço de papel do chapéu de Papai Noel, mas mais tecnologicamente ou algo assim. Como todo mundo estava em um telegrama e foi muito interessante escrever um bot por lá, decidi fazê-lo nesta plataforma

A propósito, há um ano eu já escrevi um artigo sobre este projeto no Habré, mas não disse nada sobre implementação. Não falei por um bom motivo, porque era uma vergonha ou algo assim :) O projeto foi preparado apenas para a empresa no trabalho (15 a 20 pessoas em velocidade máxima), mas aconteceu que o projeto "disparou" em outros círculos depois de alguns artigos sobre recursos. Além disso, recursos mais populares começaram a me anunciar (eu nem sabia disso antes que um grande fluxo de pessoas saísse do nada).

Por um mês, sem um único investimento em publicidade, reuni mais de 5000 jogadores satisfeitos e me apaixonei por esse projeto. Mas, além de todos os seus benefícios, havia um enorme menos nele, e isso é implementação.

Como foi um ano atrás


Era engraçado ter um botão no bot "entrar na sala". Sim, é precisamente o que se une. Eles me escreveram para corrigir esse erro gramatical, mas não corri o risco, e é por isso :) Em seguida, coloquei um pedaço de código da versão do bot do ano passado.

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

O bot inteiro - era um enorme arquivo index.php que vivia da função mb_stripos, na verdade. Além disso, havia muitos "idênticos" idênticos. I.e. mb_stripos ($ textMessage, 'join')! == false pode ocorrer mais de uma vez. Se você alterar a palavra "ingressar" para "ingressar" no botão e esquecer de alterar algum tipo de ifchik (dos quais, novamente, existem muitos), tudo poderá borrifar. No que pode não ser imediatamente perceptível (apenas um bot em certos cenários não responderá como deveria). Depois que mudei o texto, os usuários começaram a escrever que, em um determinado cenário, o bot não responde como deveria. Não queria correr mais riscos e pensei que o erro não era tão crítico :) Em princípio, você entende. Se houvesse um botão, por exemplo, "Encontrar Papai Noel aleatório", eu me viciei na palavra "aleatório" através de mb_stripos. Foi divertido quando um botão semelhante apareceu, com texto semelhante e, quando não era necessário, tudo se tornou desnecessário se (se, por exemplo, existe e existe a palavra "aleatório") :)

A propósito, você notou $ user ['state']? Naquele momento, introduzi "estados" para entender em que estado o usuário está atualmente. Ele queria entrar na sala, por exemplo, ou criar, ou talvez ele quisesse jogar um único jogo? E para cada estado, veio seu próprio conjunto de ifchi, o que também era importante para não quebrar.

A propósito, o arquivo Cron estava ao lado de index.php; ele poderia ser executado diretamente no navegador (aparentemente, isso realmente não me incomodou). Além disso, quando de repente eu quis adicionar algum tipo de "estado" (eu gostaria de não querer isso), tive que mergulhar nesta cidade ... e, claro, nada saiu da primeira tentativa. Tudo isso também estava na hospedagem mais barata por US $ 1 por mês, o que poderia me levar ao inferno quando muitas pessoas começaram a escrever na hora do rush.

Certamente foi um inferno para um programador :)

O que eu decidi fazer este ano


Este ano, é claro, decidi reescrever o bot (já que havia uma demanda considerável no ano passado), queria entrar no código antigo e descobrir como era esse ano para transferir a lógica de negócios. Infelizmente, eu não consegui 70% nem descobrir o código antigo, apesar de ter tentado deixar comentários no código para me ajudar em um ano :)

Decidi apenas relembrar os principais cenários e adicionar algo novo ao longo do caminho. Ele começou com a pergunta: "o que usar para escrever arquitetura para que você não chore mais tarde?" Depois de muita pesquisa, a escolha recaiu sobre Botman . Temos pequenos artigos sobre Habré sobre isso. Em suma, Botman é uma coisa muito legal. Ele pode ser instalado em um "limpo" e você pode instalar imediatamente sua montagem com o Laravel (sim, existe um botman instalado imediatamente em cima do Laravel). Eu decidi ficar nessa versão, já que o Laravel é claramente melhor do que era há um ano :) Tem capacidade para armazenar em cache da "caixa", roteamento conveniente, artesão, middleware, conveniência, capacidade de trabalhar com o banco de dados e outros benefícios. Se de repente você não gostar do Laravel, poderá usar qualquer outra estrutura e instalar o Botman em cima dela, ou não poderá usar a estrutura . A propósito, Botman é construído sobre o ReactPHP, o que é legal :)

A seguir, descreverei os benefícios do Botman:

Há um único arquivo botman.php no qual você pode descrever todos os comandos. Um exemplo:

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

Ao escrever o comando / start, o StartConversation será iniciado (que deve herdar da classe abstrata Conversation) e implementará o método run ().

As perguntas são feitas de maneira bastante conveniente, por exemplo:

 $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') { 

Observe que em Button podemos definir um valor e, posteriormente, nos apegar a ele mais tarde? Ou seja, diante de seus olhos o bug com a "junção" foi corrigido, devido ao fato de eu me apegar a value () :)
A propósito, você ainda pode usar o método isInteractiveMessageReply, que responderá à pergunta se você escreveu texto ou clicou no botão interativo ao responder à pergunta feita ao usuário.

Botman ajudou a se livrar dos estados, eu posso fazer outro método ask no método ask, por exemplo, se uma pessoa clicou em "join", eu apenas fiz outra ask dentro desse if.

Aqui estão mais alguns métodos (de um número muito grande) que o botman fornece, que podem ser facilmente entendidos pelo nome:
$ this-> repeat ($ questão);

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

$ this-> bot-> reply ($ reply);
O assassino dos recursos do botman é que um código pode ser executado em várias plataformas. Ou seja, você pode escrever seu código, executá-lo inicialmente apenas para o Telegram. Depois, decida que você ainda deseja acessar o Facebook Manager e não precisa começar a lidar com o SDK do Facebook, os desenvolvedores do Botman já fizeram isso por você. Você só precisa instalar o driver e definir a API de token do seu bot do Facebook Messenger em .env. Toda a funcionalidade funcionará automaticamente no messenger do Facebook.
Botman não suporta apenas o Facebook Messenger e o Telegram, esta lista também inclui Slack, Skype, WeChat (uma lista completa pode ser encontrada em seu site).

Além disso, o "herói da ocasião" é famoso pelo fato de ele já ter os testes do pai / Botman (você pode escrever testes de unidade, seu boné), além de boa documentação. É difícil citar todos os benefícios, já que obviamente não trabalhei com todos, não me lembro de tudo, mas acho que o que descrevi já deve ser suficiente para pelo menos me interessar por eles :)

Bem, ok, mas vamos hospedar novamente na hospedagem por US $ 1?


Não, este ano está tudo sério. Hospedagem por US $ 10 por mês e um domínio gratuito com ref. Brincadeirinha :)

Decidi aumentar meu conhecimento sobre docker, comprei o VPS no DigitalOcean e lancei o projeto no docker. Acabou muito bem, apesar do fato de ter feito quase a primeira vez. Surpreendentemente, o estivador nunca caiu .

Com o VPS, é claro, mais legal :)

Na janela de encaixe, era muito mais conveniente conduzir o desenvolvimento (a versão na donzela e no produto foi preservada).

O engraçado é que, quando introduzi a funcionalidade paga no bot, eu precisava obter uma atualização do sistema de pagamento. O sistema de pagamento constantemente retornava para mim meu pedido de atualização e dizia "o site está inoperante". Trabalhou para mim, trabalhou para amigos (somos da Ucrânia), mas não funcionou para homens da Federação Russa. Sem hesitar, vi que Roskomnadzor ainda havia banido o endereço IP da minha gota há um ano (muitos servidores da DigitalOcean foram danificados pelo ILV naquela época). Então eles também decidiram isso.

Em que está escrito o seu bot?


  • PHP 7.3
  • Laravel
  • Botman

E recomendo a todos que usem essa pilha específica ao escrever seus bots em PHP (para não se machucar mais tarde, como eu fiz).

O que há de novo no bot?


Papai Noel aprendeu a ligar


Você pode solicitar uma ligação do Papai Noel! Ele até vai entender e ouvir você :)

Papai Noel liga para o número indicado (dos números dos EUA), faz perguntas, por exemplo: “Como você se comportou no ano?”, “O que você quer para o Ano Novo?”, “Você conhece o poema?”, Etc. Se o usuário disser que não conhece a rima, o Papai Noel seguirá um cenário diferente de perguntas. Se ele disser que sabe, o Papai Noel pedirá que você conte a rima :) MAIS: quando uma pessoa diz sua lista de desejos para o Ano Novo para o Papai Noel, o Papai Noel ouve e envia essa lista de desejos para o usuário que solicitou a ligação (de repente, a criança foi fechada de seus pais no quarto, mas de alguma forma eles precisam descobrir o que ele pediu ao Papai Noel?). Papai Noel também envia a gravação de áudio da chamada com Papai Noel como lembrança :)

Agora você pode descobrir quem é seu Papai Noel.


Zrada? Isso é contrário ao nome do jogo "Secret Santa", não é? Em princípio sim. MAS, no ano passado, do número de pessoas que queriam conhecer o Papai Noel, minhas drogas foram destruídas. "O chefe vai me dar um presente?", "Alguém não nos deu um presente para alguém, você pode dizer quem deveria ter dado a ela?" E assim por diante. Agora existe essa oportunidade, mas, seja lá o que for - um prazer sairá em US $ 5,99 :)

Conclusões


Você não deve esperar que seu projeto seja sempre pequeno. Não há necessidade de criar um index.php com vários ifs, mesmo que o projeto comece com apenas alguns ifs (eu conheço o suficiente desses projetos)). Melhor fazer agora. Mesmo que você gaste mais tempo com isso, ele trará benefícios, pois quando você precisar alterar / adicionar lógica com urgência ao projeto, não precisará pensar em como alterar o if para que o bot não caia, como aconteceu comigo :). Além disso, essa abordagem (com ifas) ensina você a tomar todas as outras decisões restritas (não é a melhor habilidade, concordo). Bem, é claro, pense em si mesmo, você terá que entrar nesse código mais tarde e terá que lidar com isso, e então não será muito agradável :(

Todo o bom código, escrevendo seus bots de bate-papo e também escreva seus projetos. Isso é demais!

No final, quero lembrar que li em algum lugar que:
Se você soubesse que seus projetos favoritos que você usa (Facebook, VK, etc.) são construídos para que quase caiam, você ficará surpreso. Sim, de fato, naquele ano todo mundo brincava com prazer, nem mesmo imaginando o que estava acontecendo dentro desse bot (eu mesmo fiquei chocado ao saber como ele sobreviveu em dezembro :).

Se você quer jogar - Wellcome :)

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


All Articles