5
Banner dan Dekorator is_option
Halaman ini membahas dua lapis tampilan di GhostTR.py: banner menu yang dicetak oleh option(), dan banner kecil yang dicetak oleh run_banner() tepat sebelum setiap handler berjalan. Keduanya membersihkan layar lewat clear() dan menulis ke stderr, bukan lewat print. Perekat antara banner dan handler adalah dekorator is_option. GhostTR.py:29-361
Urutan pemanggilan banner
main() membersihkan layar, mencetak banner menu, menunggu satu detik, lalu membaca pilihan. Setelah opsi dipilih, execute_option memanggil call_option, yang memanggil option['func'](). Nilai func itu sebenarnya wrapper hasil dekorasi is_option, jadi run_banner() selalu berjalan lebih dulu, baru handler aslinya. GhostTR.py:296-3062 GhostTR.py:219-2273
graph TD
main["main()"] --> clr_main["clear()"]
clr_main --> opt["option()"]
opt --> clr_opt["clear()"]
clr_opt --> menu_banner["stderr.writelines: banner menu"]
menu_banner --> opt_text["option_text()"]
opt_text --> pick["input: Select Option"]
pick --> exec_opt["execute_option(opt)"]
exec_opt --> call_opt["call_option(opt)"]
call_opt --> wrap["wrapper() dari is_option"]
wrap --> rb["run_banner()"]
rb --> clr_rb["clear()"]
clr_rb --> sleep_a["time.sleep(1)"]
sleep_a --> ghost_banner["stderr.writelines: banner GHOST - TRACKER"]
ghost_banner --> sleep_b["time.sleep(0.5)"]
sleep_b --> handler["func(*args, **kwargs)"]
handler --> wait["input: Press enter to continue"]
wait -.-> main
style opt fill:#f59e0b,color:#000
style wrap fill:#f59e0b,color:#000
style menu_banner fill:#8b5cf6,color:#fff
style ghost_banner fill:#8b5cf6,color:#fff
style handler fill:#2d7d46,color:#fff
%% fig: Urutan pemanggilan banner menu dan banner handler
%% desc: main membersihkan layar lalu mencetak banner menu lewat option, dan setiap handler yang dipilih melewati wrapper is_option yang mencetak run_banner lebih dulu.is_option sebagai pembungkus
is_option hanya berisi satu fungsi dalam, wrapper(*args, **kwargs). Isinya dua baris: run_banner(), lalu func(*args, **kwargs). Decorator mengembalikan wrapper, sehingga nama modul seperti IP_Track terikat ke pembungkus, bukan ke fungsi aslinya. Tidak ada functools.wraps di berkas ini, jadi __name__ milik handler yang dihias berubah menjadi wrapper. GhostTR.py:29-361
wrapper memanggil func tanpa mengembalikan nilainya. Setiap handler yang dihias karena itu selalu menghasilkan None ke pemanggil, dan call_option memang mengabaikan nilai balik itu. GhostTR.py:29-361
Empat handler menu memakai dekorator ini. options menyimpan referensi ke nama yang sudah terdekorasi, jadi banner tercetak tanpa satu pun pemanggilan run_banner() di dalam options atau call_option. GhostTR.py:180-2074
| Handler | Opsi menu (num / text) | Baris dekorator |
|---|---|---|
IP_Track | 1 / IP Tracker | GhostTR.py:40-415 |
showIP | 2 / Show Your IP | GhostTR.py:169-1706 |
phoneGW | 3 / Phone Number Tracker | GhostTR.py:80-817 |
TrackLu | 4 / Username Tracker | GhostTR.py:121-1228 |
Handler exit pada opsi 0 adalah exit bawaan Python, bukan fungsi yang dihias, sehingga memilih Exit langsung mengakhiri proses tanpa banner. GhostTR.py:180-2074
run_banner dan clear
run_banner menjalankan empat langkah berurutan: clear(), time.sleep(1), stderr.writelines berisi ASCII art hantu dengan kotak teks GHOST - TRACKER - IP ADDRESS dan @CODE BY HUNXBYTS, lalu time.sleep(0.5). Total jeda sebelum handler mulai membaca input adalah 1,5 detik. GhostTR.py:275-2939
clear() memilih perintah sesuai os.name: cls bila nilainya 'nt', dan clear untuk sistem lain. Hasil pemanggilan os.system ditampung ke _ lalu dibuang, dan status keluarnya tidak pernah diperiksa. GhostTR.py:210-21610
⚠️ Banner ditulis ke
stderrlewatstderr.writelines, bukan kestdout. Mengalihkan keluaran denganpython GhostTR.py > out.txthanya menangkap hasil handler, sedangkan banner menu dan bannerrun_bannertetap muncul di layar.
⚠️
clear()bergantung pada perintah shellclsatauclear. Di lingkungan tanpa perintah itu, misalnya sebagian container, pembersihan layar gagal tanpa pesan karena status keluarnya diabaikan.
Banner menu di option()
option() juga memanggil clear() di awal. Setelah itu ia menulis ASCII art Ghost-Track dengan baris credit [ + ] C O D E B Y H U N X [ + ] ke stderr, lalu menambahkan tiga baris kosong dan menulis hasil option_text() yang menyusun daftar [ num ] text dari options. GhostTR.py:259-27211 GhostTR.py:245-24912
Karena main() sudah memanggil clear() sebelum option(), layar dibersihkan dua kali berturut-turut sebelum banner menu tercetak. Keduanya tidak berbahaya, hanya satu pemanggilan berlebih. GhostTR.py:296-3062
| Aspek | option() | run_banner() |
|---|---|---|
| Pemanggil | main() | wrapper dari is_option |
| Pembersihan layar | clear() di awal fungsi | clear() di awal fungsi |
| Jeda | tidak ada di dalam fungsi; main() memanggil time.sleep(1) sesudahnya | time.sleep(1) sebelum dan time.sleep(0.5) sesudah banner |
| Target tulis | stderr.writelines | stderr.writelines |
| Isi | ASCII art Ghost-Track, baris credit, lalu option_text() | ASCII art hantu dan kotak GHOST - TRACKER - IP ADDRESS |
Rincian loop menu dan validasi angka ada di Validasi Opsi dan Loop Menu, sedangkan perilaku tiap handler yang dihias dijelaskan di halaman IP Tracker, Show Your IP, Phone Number Tracker, dan Username Tracker.