Apa yang Anda butuhkan dan tidak perlu menulis obrolan untuk bot menggunakan contoh bot saya untuk bermain Secret Santa

gambar

Latar belakang


Setahun yang lalu, saya memutuskan untuk membuat bot telegram untuk memainkan permainan Tahun Baru yang cukup populer "Secret Santa". Saya terinspirasi oleh kenyataan bahwa beberapa tahun yang lalu kami di tempat kerja sebagai perusahaan memutuskan untuk memainkan permainan ini (sepertinya sangat keren), dan ditambah lagi, saya telah lama mengikuti klub ADM di Habré. Pada bulan Oktober-November tahun lalu, saya menyadari bahwa saya perlu bermain di antara perusahaan saya sendiri tahun ini lagi, tetapi kali ini tanpa mengeluarkan nama-nama yang tertulis di selembar kertas dari topi Santa Claus, tetapi lebih berteknologi, atau sesuatu. Karena semua orang menggunakan telegram dan sangat menarik bagi saya untuk menulis bot di sana, saya memutuskan untuk melakukannya di platform ini.

Ngomong-ngomong, setahun yang lalu saya sudah menulis artikel tentang proyek ini di Habré, tapi saya tidak mengatakan apa-apa tentang implementasi. Saya tidak berbicara karena alasan yang baik, karena itu memalukan atau semacamnya :) Proyek ini dipersiapkan hanya untuk perusahaan di tempat kerja (15-20 orang dengan kecepatan maksimum), tetapi ternyata proyek itu "menembak" di lingkaran lain setelah beberapa artikel tentang sumber daya. Lebih jauh, sumber daya yang lebih populer sendiri mulai mengiklankan saya (saya bahkan tidak tahu tentang hal itu sebelum gelombang besar orang keluar entah dari mana).

Selama sebulan, tanpa investasi tunggal dalam periklanan, saya mengumpulkan 5000+ pemain yang puas dan benar-benar jatuh cinta pada proyek ini. Tapi selain semua manfaatnya, ada satu minus besar dalam dirinya, dan ini adalah implementasi.

Bagaimana itu setahun yang lalu


Itu lucu bahwa saya memiliki tombol di bot "bergabung dengan ruangan." Ya, justru yang bergabung. Mereka menulis kepada saya untuk memperbaiki bug tata bahasa ini, tetapi saya tidak mengambil risiko, dan itu sebabnya :) Selanjutnya, saya menaruh sepotong kode dari bot versi tahun lalu.

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

Seluruh bot - itu adalah satu file index.php besar yang hidup dari fungsi mb_stripos, pada kenyataannya. Selain itu, ada banyak "ifics" identik. Yaitu mb_stripos ($ textMessage, 'join')! == false dapat terjadi lebih dari sekali. Jika Anda mengubah kata "gabung" pada tombol menjadi "gabung", dan lupa untuk mengubah semacam ifchik (yang, sekali lagi, banyak), semuanya dapat dipercikkan. Apa itu mungkin tidak segera terlihat (hanya bot dalam skenario tertentu tidak akan merespon sebagaimana mestinya). Setelah saya mengubah teks, pengguna mulai menulis bahwa dalam skenario tertentu bot tidak merespons sebagaimana mestinya. Saya tidak ingin mengambil risiko lebih lanjut, dan saya pikir kesalahannya tidak begitu penting :) Pada prinsipnya, Anda mengerti. Jika ada tombol, misalnya, "Cari Santa acak," saya ketagihan kata "acak" melalui mb_stripos. Sangat menyenangkan ketika tombol yang sama muncul, dengan teks yang sama, dan ketika itu tidak perlu, semuanya masuk ke yang tidak perlu jika (jika misalnya ada dan ada kata "acak") :)

Omong-omong, apakah Anda melihat $ user ['state']? Pada saat itu, saya memperkenalkan "status" untuk memahami keadaan pengguna saat ini. Apakah dia ingin bergabung dengan ruangan, misalnya, atau membuat, atau mungkin dia ingin bermain satu game? Dan untuk masing-masing negara bagian, kumpulan ifchi-nya sendiri datang, yang juga penting untuk tidak dilanggar.

Omong-omong, file cron terletak di sebelah index.php, itu bisa dijalankan langsung dari bawah browser (tampaknya itu tidak benar-benar mengganggu saya). Lebih jauh, ketika saya tiba-tiba ingin menambahkan semacam "negara" (saya berharap saya tidak menginginkan ini) saya harus terjun ke kota ini ... dan tentu saja, tidak ada yang keluar dari upaya pertama. Semua ini juga terletak pada hosting termurah untuk $ 1 per bulan, yang dapat mengirim saya ke neraka ketika banyak orang mulai menulis pada jam sibuk.

Itu tentu saja neraka bagi seorang programmer :)

Apa yang saya putuskan untuk lakukan tahun ini


Tahun ini, tentu saja, saya memutuskan untuk menulis ulang bot (karena ada banyak permintaan tahun lalu), saya ingin masuk ke kode lama dan mencari tahu bagaimana itu tahun itu untuk mentransfer logika bisnis. Sayangnya, saya tidak dapat mencapai 70% bahkan mengetahui kode lama, meskipun kemudian saya mencoba untuk meninggalkan komentar untuk diri saya sendiri dalam kode untuk membantu diri sendiri dalam setahun :)

Saya memutuskan hanya untuk mengingat skenario utama, dan di sana dan menambahkan sesuatu yang baru di sepanjang jalan. Dia mulai dengan pertanyaan: "apa yang harus digunakan untuk menulis arsitektur sehingga Anda tidak menangis nanti?" Setelah banyak penelitian, pilihan jatuh pada Botman . Kami memiliki artikel kecil tentang Habré tentang hal itu. Singkatnya, Botman adalah hal yang sangat keren. Ini dapat diinstal baik pada yang "bersih", dan Anda dapat segera menginstal perakitannya dengan Laravel (ya, ada seorang botman yang dipasang segera di atas Laravel). Saya memutuskan untuk tetap menggunakan versi ini, karena Laravel jelas lebih baik daripada setahun yang lalu :) Ia memiliki kemampuan untuk melakukan cache dari "kotak", perutean yang mudah, pengrajin, middleware, kenyamanan, kemampuan untuk bekerja dengan database dan manfaat lainnya. Jika tiba-tiba Anda tidak menyukai Laravel, Anda dapat menggunakan kerangka kerja lain, dan menginstal Botman di atasnya, atau Anda tidak dapat menggunakan kerangka kerja sama sekali . Omong-omong, Botman dibangun di atas ReactPHP, yang keren :)

Berikutnya, saya akan menjelaskan manfaat Botman:

Ada satu file botman.php di mana Anda dapat menggambarkan semua perintah. Contoh:

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

Saat menulis perintah / mulai, StartConversation akan mulai (yang seharusnya mewarisi dari kelas Percakapan abstrak) dan mengimplementasikan metode run ().

Pertanyaan diajukan dengan cukup mudah, misalnya:

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

Perhatikan bahwa pada Tombol kita dapat menetapkan nilai, dan kemudian melekat padanya nanti? Yaitu, di depan mata Anda bug dengan "bergabung" sudah diperbaiki, karena fakta bahwa saya berpegang teguh pada nilai () :)
Omong-omong, Anda masih dapat menggunakan metode isInteractiveMessageReply, yang akan menjawab pertanyaan apakah Anda menulis teks atau mengklik tombol interaktif saat menjawab pertanyaan yang diajukan kepada pengguna.

Botman membantu menyingkirkan keadaan, saya bisa membuat metode bertanya lain dalam metode bertanya, misalnya, jika seseorang mengklik "bergabung", saya hanya melakukan tanya lain di dalam ini jika.

Berikut adalah beberapa metode (dari jumlah yang sangat besar) yang disediakan oleh botman, yang dapat dengan mudah dipahami dari namanya:
$ this-> repeat ($ question);

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

$ this-> bot-> reply ($ reply);
Pembunuh fitur botman adalah bahwa satu kode dapat berjalan di banyak platform. Artinya, Anda bisa menulis kode Anda, awalnya jalankan hanya untuk Telegram. Kemudian, putuskan bahwa Anda masih ingin pergi ke Pengelola Facebook, dan Anda tidak perlu mulai berurusan dengan SDK Facebook sama sekali, pengembang Botman telah melakukan ini untuk Anda. Anda hanya perlu menginstal driver dan mengatur API Token bot Facebook Messenger Anda di .env. Semua fungsi akan secara otomatis berfungsi di Facebook messenger.
Botman tidak hanya mendukung Facebook Messenger dan Telegram, daftar ini juga termasuk Slack, Skype, WeChat (daftar lengkap dapat ditemukan di situs web mereka).

Juga, "pahlawan acara" terkenal karena fakta bahwa ia sudah memiliki tes ayah / Botman (Anda dapat menulis tes unit, topi Anda), serta dokumentasi yang baik. Sulit untuk menyebutkan semua manfaatnya, karena saya jelas tidak bekerja dengan semua orang, saya tidak ingat semuanya, tapi saya pikir apa yang saya jelaskan sudah cukup untuk setidaknya tertarik pada mereka :)

Baiklah, ok, tapi apakah kita akan meng-host lagi di hosting sebesar $ 1?


Tidak, tahun ini semuanya serius. Hosting seharga $ 10 per bulan dan domain gratis dengan ref. Cuma bercanda :)

Saya memutuskan untuk menambah pengetahuan saya tentang buruh pelabuhan, membeli VPS di DigitalOcean, dan meluncurkan proyek ini di buruh pelabuhan. Ternyata cukup baik, meskipun saya melakukannya hampir pertama kali. Anehnya, buruh pelabuhan itu tidak pernah jatuh .

Dengan VPS, tentu saja, lebih dingin :)

Ketika buruh pelabuhan, itu jauh lebih mudah untuk melakukan pengembangan (versi pada gadis dan pada prod dipertahankan).

Yang lucu adalah ketika saya memperkenalkan fungsionalitas berbayar di bot, saya harus mendapatkan peningkatan dari sistem pembayaran. Sistem pembayaran terus-menerus mengembalikan aplikasi saya kepada saya untuk peningkatan, dan mengatakan "situs sedang down." Bekerja untuk saya, bekerja untuk teman-teman (kami dari Ukraina), tetapi tidak bekerja untuk orang-orang dari Federasi Rusia. Tanpa ragu, saya melihat bahwa Roskomnadzor masih melarang alamat IP tetesan saya setahun yang lalu (banyak server DigitalOcean rusak oleh ILV pada waktu itu). Kemudian mereka juga memutuskan ini.

Di mana bot Anda ditulis?


  • PHP 7.3
  • Laravel
  • Botman

Dan saya menyarankan semua orang untuk menggunakan tumpukan khusus ini ketika menulis bot mereka di PHP (agar tidak menembak diri sendiri nanti, seperti yang saya lakukan).

Apa yang baru di bot?


Santa belajar menelepon


Anda dapat memesan panggilan dari Santa! Dia bahkan akan mengerti dan mendengarkan Anda :)

Santa memanggil nomor yang ditunjukkan (dari nomor AS), mengajukan pertanyaan, misalnya, "Bagaimana Anda bersikap pada tahun itu?", "Apa yang Anda inginkan untuk Tahun Baru?", "Apakah Anda tahu puisi itu?", Dll. Jika pengguna mengatakan bahwa dia tidak tahu puisi itu, maka Santa akan mengikuti skenario pertanyaan yang berbeda, jika dia mengatakan bahwa dia tahu, maka Santa akan dengan ramah meminta Anda untuk menceritakan puisi itu :) Juga: ketika seseorang mengatakan daftar keinginannya untuk Tahun Baru ke Santa, Santa mendengarkan, dan kemudian mengirim daftar keinginan ini untuk pengguna yang memesan panggilan (tiba-tiba, anak itu ditutup dari orang tuanya di kamar, tetapi entah bagaimana mereka perlu mencari tahu apa yang dia tanyakan pada Santa?). Santa juga mengirimkan rekaman audio panggilan dengan Santa sebagai suvenir :)

Sekarang Anda dapat mengetahui siapa Santa Anda.


Zrada? Ini bertentangan dengan nama game "Secret Santa", bukan? Secara prinsip, ya. TETAPI tahun lalu, dari jumlah orang yang ingin mengetahui Santa mereka, obat saya sobek. “Apakah bos akan memberi saya hadiah?”, “Seseorang tidak memberi kami hadiah untuk seseorang, dapatkah Anda memberi tahu siapa yang seharusnya memberinya?” Dan seterusnya. Sekarang ada kesempatan seperti itu, tapi apa pun itu - kesenangan seperti itu akan keluar seharga $ 5,99 :)

Kesimpulan


Anda seharusnya tidak berharap bahwa proyek Anda akan selalu kecil. Tidak perlu membuat satu index.php dengan sekelompok ifs, bahkan jika proyek dimulai hanya dengan beberapa tiga ifs (saya cukup tahu tentang proyek-proyek ini)). Lebih baik melakukannya segera. Bahkan jika Anda menghabiskan lebih banyak waktu untuk itu, itu akan memberi Anda manfaat ketika Anda sangat perlu mengubah / menambahkan logika ke proyek, Anda tidak perlu berpikir tentang cara mengubah ifas sehingga bot tidak jatuh, seperti yang terjadi pada saya :). Juga, pendekatan ini (dengan ifas) mengajarkan Anda untuk membuat semua keputusan lain dikruk (bukan keterampilan terbaik, setujui). Nah, tentu saja, pikirkan tentang diri Anda, Anda harus masuk ke kode ini nanti, dan Anda harus menghadapinya, dan kemudian itu tidak akan sangat manis :(

Semua kode yang baik, menulis bot obrolan Anda, dan juga menulis proyek Anda. Ini luar biasa!

Pada akhirnya, saya ingin mengingat bahwa saya membaca di suatu tempat bahwa:
Jika Anda tahu bahwa proyek favorit Anda yang Anda gunakan (Facebook, VK, dll.) Dibangun sehingga di ambang jatuh, Anda akan terkejut. Ya, memang, tahun itu semua orang bermain dengan senang hati, bahkan tidak membayangkan apa yang sedang terjadi di dalam bot ini (saya sendiri kaget bagaimana dia bisa selamat pada bulan Desember itu :)).

Jika Anda ingin bermain - Wellcome :)

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


All Articles