Apakah Anda ingin menguji fungsionalitasnya? Tulis ke bot menggunakan tautan ini dan dia akan menjawab Anda.
Dan bagi mereka yang tertarik dengan cara kerjanya dan bagaimana seorang siswa berusia 16 tahun dapat menulisnya, saya dengan senang hati akan memberi tahu Anda semuanya secara rinci di artikel ini.
Latar Belakang
Semuanya dimulai dengan bot saya yang lain untuk VK pada node js , yang mendekripsi pesan suara (dan karena bot semacam itu adalah selusin sepeser pun, saya memutuskan untuk tidak menulis artikel tentang perkembangannya, meskipun ia juga memiliki beberapa fitur khas). Setelah saya meluncurkannya, ayah saya menyarankan agar saya mengembangkan bot lain untuk obrolan keluarga kami melalui telegram. Inti dari bot ini sederhana - untuk mengekstrak tanggal dan waktu dari pesan teks seseorang, dan menggunakan pesan telegram yang tertunda, membuat pengingat tepat di obrolan keluarga.
Tapi segera saya kecewa. Ternyata bot tidak dapat membuat pesan yang ditangguhkan, jadi saya memutuskan untuk menulis sistem saya sendiri untuk menyimpan dan menjalankan pengingat.
Pengembangan
Informasi Umum
Bot ini ditulis di node js dan tinggal di heroku .
Itu mampu menyimpan pengingat teks apa pun yang akurat hingga satu menit.
Dia juga bisa bekerja dalam percakapan kelompok.
Saat ini, bot hanya mengenali tanggal dan waktu dalam bahasa Rusia.
SmartScheduler adalah proyek open source yang tersedia di github saya .
Ekstrak tanggal dan waktu dari pesan
Saya memutuskan untuk memulai dengan tugas yang paling sulit: membagi pengingat teks menjadi tanggal dan pengingat itu sendiri. Untuk melakukan ini, kami harus memperhitungkan semua kemungkinan standar untuk menulis tanggal oleh seseorang, dari " pukul 12.00 " hingga " Minggu depan pukul dua puluh lima hingga delapan malam ."
Basis data besar (constValues.js) telah dibuat, menyimpan ekspresi konstan dan propertinya yang digunakan seseorang dalam pidatonya. Kemudian fungsi ditulis untuk mengenali setiap ejaan waktu.
Misalnya , fungsi digunakan untuk mengenali tanggal dalam bentuk "melalui X % time_type %"
FindAdditiveLiterals, dan untuk menemukan hari dalam seminggu FindDayOfWeek.
Setiap opsi penunjukan waktu memiliki prioritasnya sendiri.
Hasilnya, algoritme parser terlihat seperti ini:
- String asli dibagi menjadi kata-kata. Kata-kata yang digunakan untuk mencari waktu tidak boleh lebih dari 40.
- Larik kata dilewatkan melalui fungsi konversi kata ke angka.

- Semua indikasi waktu ditemukan dalam pesan, dan kata-kata yang digunakan dalam indikasi juga ditandai (misalnya, dalam indikasi "jam alarm jam 8", tulisan "8" dan "jam" ditandai).
- Jika beberapa karakteristik waktu tidak ditemukan (misalnya, bulan) dalam pesan teks, maka nilai karakteristik ini akan diambil.
- Untuk putusan akhir, indikasi waktu dengan prioritas tertinggi dan indikasi yang berdekatan yang memiliki kata sumber yang sama dipilih (misalnya, pada kata "10:30" jam dan menit ditunjukkan secara bersamaan).
- , , , .
- , .
- ,
{ string: answer, string: text, date: date }
{ string: answer, string: text }
(answer – , text – , date – ).
Pertanyaan berikutnya adalah di mana menyimpan semua pengingat dan bagaimana melacak penerapannya.
Awalnya, saya ingin menggunakan pustaka jadwal node , tetapi menyerah pada ide ini, karena saya tidak ingin menyumbat RAM dengan semua pengingat.
Sebagai gantinya, saya memutuskan untuk mempelajari cara kerja database SQL dan membuatnya sendiri.
Setelah membaca banyak artikel di Internet, saya membuat database postgresql di platform heroku, karena Anda dapat menanamkan database di aplikasi Anda di dalamnya, yang sangat nyaman.
Untuk berinteraksi dengan database, saya menulis skrip kecil (db.js) di mana saya menerapkan semua fungsi yang diperlukan, seperti menginisialisasi database, mendapatkan daftar pengingat, dll.
Ada dua tabel di database saya: yang pertama untuk menyimpan pengingat, dan yang kedua untuk menyimpan zona waktu pengguna (lebih lanjut nanti).
Setelah itu, saya menerapkan penyimpanan pengingat yang diurai dari pesan teks ke database. Waktu pengingat diperiksa oleh timer yang bekerja satu menit sekali. Jika waktunya telah tiba untuk pengingat, itu akan dihapus dari database, dan pesan dengan teks dari pengingat dikirim ke pengguna yang membuatnya.
Saya juga menambahkan tampilan semua pengingat melalui perintah / list .
(ada perintah / N yang dapat diklik di samping setiap pengingat, yang menghapusnya saat Anda mengkliknya)
Pengaturan zona waktu
Sebelum saya memutuskan untuk menulis artikel ini dan meletakkannya di Habr, zona waktu Moskow telah di-hardcode di variabel lingkungan. Ini sudah cukup untuk digunakan dalam keluarga kami, tetapi untuk memanfaatkan semua kesenangan dan kemudahan hidup dengan bot SmartScheduler yang bisa dilakukan semua orang, saya memutuskan untuk menambahkan pengaturan zona waktu individu.
Untuk menyelesaikan konfigurasi, Anda perlu menulis perintah / tz , yang akan diperingatkan oleh bot jika dia belum menentukan zona waktunya:
(karena fakta bahwa zona waktu tidak ditentukan, responsnya tidak menggunakan waktu lokal, tetapi waktu Greenwich)
Saat memasukkan perintah / tz proses penentuan zona waktu dimulai dan keyboard muncul dengan tiga tombol:
- Menggunakan lokasi pengguna.
- Masukan manual.
- Pembatalan.
Tombol pertama menanyakan lokasi pengguna, berdasarkan zona waktu yang dihitung.
Contoh penggunaan
Tombol kedua memungkinkan Anda memasukkan zona waktu secara manual dalam format ± HH: MM , di
mana ± - plus atau minus, HH - jam, MM - menit.
Contoh penggunaan
Tombol ketiga membatalkan proses definisi.
Setelah pengguna menentukan zona waktunya, bot akan menampilkan dan menyimpan waktu pengingat dengan benar.
Perbaikan terakhir
Setelah selesai dengan fungsi utama, saya menambahkan keyboard utama dengan fungsi utama, mengoreksi jawaban untuk perintah / start dan / help , dan untuk hal-hal kecil.
Saya juga memutuskan untuk mengganti zona waktu default untuk semua pengguna dengan Moskow .
Hasil
Keuntungan utama dari bot SmartScheduler adalah, tentu saja, penguraian tanggal, yang memungkinkan Anda dengan cepat dan mudah menuliskan informasi atau tugas yang diperlukan dalam bentuk pengingat bahkan dalam situasi yang paling tidak terduga.
Anda tidak perlu lagi membolak-balik kalender untuk mencari hari yang tepat dan memutar jam untuk menyetel waktu yang tepat, cukup dengan manusiawi memberi tahu bot "apa" dan "kapan", dan kemudian dia akan melakukan semuanya sendiri.
Kesimpulan
Sebelum mengembangkan bot di node js, saya sama sekali tidak terbiasa dengan javascript, oleh karena itu, semua pengetahuan yang saya gunakan dalam menulis kode diambil dari Internet, di mana Anda sering kali tidak menemukan apa yang sebenarnya Anda butuhkan. Karena itu, kemungkinan besar, di suatu tempat dalam kode saya terdapat kesalahan yang sangat bodoh, yang masih belum cukup saya ketahui untuk menentukan.
Awalnya, tujuan saya bukanlah menciptakan yang paling maju dan ideal dari sudut pandang struktur proyek, yang terpenting bagi saya adalah mendapatkan pengetahuan baru, belajar bahasa pemrograman baru untuk meningkatkan pemahaman ilmu komputer secara umum, dan membuat produk MVP.
Tetapi jika pengembangan ini diminati, maka saya akan terus memperbaikinya dengan senang hati, dan jika Anda memiliki ide atau menemukan bug, selamat datang di github proyek. Saya sudah memiliki ide di mana dan bagaimana mengubah apa (misalnya, menulis ulang kode spaghetti yang mengerikan dalam modul parsing menggunakan pola Pengunjung normal), serta berencana untuk menambahkan dukungan untuk bahasa Inggris.
Saya berharap bot ini akan membantu Anda serta membantu saya dan keluarga saya dalam kegiatan sehari-hari.
Terima kasih atas perhatian Anda!
UPD: Menambahkan dukungan untuk pesan suara dengan permintaan populer.
UPD 2: Bot telah menerima pembaruan besar sejak artikel diterbitkan. Daftar perubahan .