Bot Telegram Custom Command - Regex Dasar (GAS II-03)
Eh, sudah dua minggu-an ternyata ya belum update. Kita lanjutkan, tapi dengan materi ringan saja ya. Sebelum berlanjut ke materi rumit atau komplek. Kita modif bot dengan berbagai kondisi, fokus pendalaman materi soal regex. Karena ini dasar materi per-bot-an,
Pendahuluan
Sebelum materi ini ditulis, aku sudah buat video nya. Tapi gak jadi di upload / publish. Yakni, materi fokus yang membahas regex. Penyajian regex per kasus, mungkin akan lebih mengena dibandingkan fokus total dengan materi murni kali ya.
Untuk itulah materi sederhana ini dibuat.
Ruang Lingkup
Materi sebenarnya adalah fokus pada pemakaman regex (regular expression). Jadi bagi teman-teman yang ingin memperdalam sendiri, silakan di google ya. Ada banyak sekali di sana. Namun yang berbahasa Indonesia sepertinya masih kurang.
Dalam materi ini, saya tidak bahas tentang regex itu sendiri. Apa itu regex, tidak dibahas setidaknya dimateri ini.
Tapi sengaja ingin berfokus terhadap kasus yang sering dipergunakan pada bot. Itu saja, so.. let’s go!
Library
Menggunakan versi-2 ya.
🔖 Cekidot: Library Telegram Ver-2
Pra-Materi
🔖 Ikuti terlebih dahulu materi Halo Bot
ReGex
ReGex merupakan kepanjangan dari Regular Expression. Definisinya ya cari di google hehe..
Kenapa REGEX?
Mungkin awalnya rumit, tapi setelah mengalami sendiri komplek kasus yang harus dikelola. Maka regex ini menjadi kunci dalam pembuatan bot (proses menangkap/memfilter/mengubah/atau menyajikan data).
Penggunakan syntax seperti if (pesan == text)
akan sulit, rumit, bahkan panjang sekali untuk menghandlenya.
Maka BELAJARlah REGEX! Itu yang selalu saya tekankan pada materi ataupun library.
Syntax
🔖 Rumusnya selalu diawali dengan: /pola/flag
Dengan pola
adalah yang akan kita tangkap.
Sementara flag
adalah kondisi tertentu yang diinginkan, misalnya tidak membedakan huruf besar dan huruf kecil pada pola
, maka bisa pakai flag i
.
Tanda Khusus
Tanda khusus yang memiliki arti spesial pada regex. Ga semua harus dihapali, tapi ini yang sering dipakai ya:
^
caping atas artinya diawal kata / kalimat$
dolar, artinya diakhir kalimat.
titik berarti sembarang karakter, kecuali ganti baris*
artinya 0 karakter atau lebih (banyak)+
artinya 1 karakter atau lebih (banyak)?
artinya 0 atau 1. Misal:https?
artinya bolehhttp
atauhttps
\b
penanda satu kata penuh{m,n}
artinya minimal m dan maksimal n, misalA{1,3}
artinya huruf A minimal 1 dan maksimal 3[]
grup karakter ATAU sebanyak 1 aja, misal[abc]
boleh a, b atau c.[^abc]
grup yang BUKAN berisi itu di dalamnya|
karakter ATAU\w
huruf alphabetnumeric. Senilai pola:[a-zA-Z0-9_]
\n
ganti baris\s
spasi\d
artinya digit atau angka, senilai pola[0-9]
(group)
tanda kurung, berarti hasilnya digrup(?:group)
digrup tapi tidak dimasukkan dalam tangkapan
Masih banyak tanda khusus, namun itu yang bakal sering kita pakai ya.
Flag
Flag yang sering dipergunakan:
i
ignore case untuk tidak membedakan huruf besar dan kecilg
global mencari semua pola yang cocokm
multiline cari di semua baris
Masih ada beberapa flag, namun diawal kita perlu mengenal 3 itu saja dulu. Untuk pendahuluan yang mudah dihapal dan sering dipakai.
Escape
Karena karakter /
dipakai sebagai penanda regex. Maka jika ingin menuliskan karakter itu harus di escape (pengecualian) dengan karakter backslash \
.
Misal:
User: /ping
Bot : Pong!
Pola Salah:
//ping/i
Seharusnya:
/\/ping/i
Garis miring /
diawal ping, HARUS di escape dengan backslash : \/
.
Berlaku juga untuk karakter-karakter khusus lainnya, misalnya titik, menjadi \.
, buka kurung \(
dst.
PENTING! Escape karakter-karakter khusus seperti pada tanda diatas jika ingin ditangkap.
Custom Command
Ingat ya, letakkan code pada materi ini pada baris sesudah:
// kalau mau kembangin sendiri menjadi bot interaktif, code nya taruh di bawah ini
// -- mulai custom text --
Okay, mari kita fokus…
Echo
Ini adalah dasar pengembangan pertama dari bot.
Echo 1 Basic
Kita buat bot untuk memantulkan isi text.
Misal:
User: !echo Halo mas
Bot : Halo mas
Bagaimana caranya?
Pola nya adalah:
/^!echo (.+)/i
Artinya:
^
kata!echo
harus diawal kalimat. Tidak ditengah atau diakhir.()
adalah grup pertama untuk hasil yang ditangkap..
sembarang karakter kecuali ganti baris+
perulangan sembarang karakter, apa aja minimal 1 sampai tidak terbatas
Pemakaiannya:
// membuat custom echo
var pola = /^!echo (.+)/i;
if ( cocok = pola.exec(msg.text) ){
return tg.sendMsg(msg, cocok[1]);
}
Silakan di test, jangan lupa di deploy baru.
Mudah bukan?
Echo 2 Angka
Kasus lain, ada yang ingin menangkap dengan angka saja. Misalnya kebutuhannya disuruh memasukkan umur.
User: !echo 21
Bot : 21
Selain angka akan diabaikan.
Pola nya adalah:
/^!echo (\d+)/i
Artinya yang akan kita tangkap dengan grup kurung ()
adalah \d
adalah angka saja, dengan terserah panjangnya asalkan minimal 1 karakter angka (makna tanda +
).
Pemakaiannya:
// membuat custom echo angka
var pola = /^!echo (\d+)/i;
if ( cocok = pola.exec(msg.text) ){
return tg.sendMsg(msg, cocok[1]);
}
Echo 3 TTL
Misalnya disuruh memasukkan tempat tanggal lahir.
User: !echo Kediri, 23-06-2001
Bot : Kamu lahir di Kediri, tanggal 23-06-2001
Pola deteksi tanggal sederhananya adalah:
/^!echo (.*),\s*(\d\d-\d\d-\d{4})$/i
Artinya :
- Detek tempat lahir dengan karakter apa saja
(.*)
sampai ketemu koma. \s*
sesudah koma, ada spasi atau tidak, tetep kedetek\d
artinya angka, jika\d\d
artinya angka dijejer 2x (atau 2 digit)\d{4}
artinya angka yang dijejer 4
Pemakaiannya:
// membuat custom echo angka
var pola = /^!echo (.*),\s*(\d\d-\d\d-\d{4})$/i;
if ( cocok = pola.exec(msg.text) ){
return tg.sendMsg(msg, "Kamu lahir di "+cocok[1]+", tanggal "+cocok[2]);
}
Dengan pola sederhana ini, secara umum bisa ditangkap dan mudah dipahami.
Namun, ada yang ingin lebih memfilternya atau membuat lebih detail.
Echo 3 TTL Komplek
Pola kompleksnya:
/^!echo (.*),\s*((0?[1-9]|[12][0-9]|3[01])-(0?[1-9]|1[012])-\d{4})/i
Ga usah diartikan haha.. Cuma buat pelengkap artikel saja.
Intinya, mirip dengan sebelumnya. Hanya mendeteksi misalnya tanggal tidak boleh lebih dari 31, dan bulan tidak boleh lebih dari 13.
Echo 4 Multiline
Pada beberapa kasus, ada yang ingin menangkap berbaris-baris pesan.
Contoh ini dapat kita temui pada kasus bot hastags.
User:
!echo Puisi Rahasia
Aku akan menulis
sebuah puisi rahasia
tapi ini rahasia ya
rahasia sekali
Maaf, ini rahasia.
Selesai.
Contohnya seperti itu. Bagaimana menangkapnya?
Ada banyak cara atau metode. Namun, cara yang saya sukai adalah dengan menangkap pesan statisnya (!echo
), kemudian membuangnya. Dengan demikian, pesan dinamisnya akan kita dapatkan akhirnya.
Pesan statisnya dikit, jadi itu saja yang ditangkap. Maka pesan statis dibuatkan group.
Pola:
/^(!echo )/i
Dan kodenya seperti ini kira-kira:
var pola = /^(!echo )/i;
if ( cocok = pola.exec(msg.text) ){
// buang pola yang di dapatkan dengan menggantinya dengan karakter kosong atau tidak ada
var pesan = msg.text.replace(cocok[1],'');
return tg.sendMsg(msg, pesan);
}
Dengan cara demikian, kita akan mendapatkan isi pesan secara penuh bebas diisi karakter apa saja.
Sapaan Halo
Agar bot terkesan ramah, kadang perlu kita buat bot sapaan.
Kadang ga cukup kata halo, ada yang yang nulisnya macam-macam: halo, hallo, hai, dan seterusnya.
Level 1:
Data semua kata yang memungkinkan dipakai:
pola /(halo|hallo)/i
Artinya, pola yang akan ditangkap kata halo
, atau hallo
yang letaknya dimana saja maka bot akan meresponnya.
Kodenya seperti ini kira-kira:
var pola = /(halo|hallo|helo|hello|hai|hay)/i;
if (pola.exec(msg.text) ){
return tg.sendMsg(msg, 'Halo juga!');
}
Level 2:
pola /halo+/i
pesan ditangkap: halo, haloo, haloooo … huruf o bisa panjang
o
minimal 1, maksimal banyakkkk
Level 3
pola /hall?o+/i
pesan ditangkap: mirip level 2, hanya bisa doble l. Halo, hallo, hallooo.. dst
l
kedua, boleh ada boleh tidak.
Level 4
pola /h[ae]ll?o+/i
pesan ditangkap: bisa halo, helo, hallo, hello, halooo.. dst
huruf a
atau e
, pilih salah satu. Tapi tidak keduanya.
Level 5
pola /(h[ae]ll?o+|h[ae]i+)/i
pesan ditangkap: mirip dengan level 4, ditambahkan kata hai, hei, haii, heii
Video
Cuzz.. langsung saja simak.
Penutup
Segitu dulu deh, kawatir kebanyakan malah ga masuk diotak kan hehe..
Banyak praktek dan mencoba saja ya. Dan semoga materi kali ini bisa diserap dan ditangkap :-D
Referensi
Akhir Kata
Jika ada pertanyaan, saran atau masukkan silakan didiskusikan. Jika ingin live dan biasanya tanggapan juga lebih cepat, sangat disarankan bergabung pada group Telegram @botIndonesia.