Lompat ke konten
dokumentasi.id
Commit a5cb8ad
v2
Star20 rb

Kamu membaca versi lama. Halaman ini hanya bisa dibaca.

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-36

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-306 GhostTR.py:219-227

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.
Fig. 1: Urutan pemanggilan banner menu dan banner handlermain 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-36

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-36

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-207

HandlerOpsi menu (num / text)Baris dekorator
IP_Track1 / IP TrackerGhostTR.py:40-41
showIP2 / Show Your IPGhostTR.py:169-170
phoneGW3 / Phone Number TrackerGhostTR.py:80-81
TrackLu4 / Username TrackerGhostTR.py:121-122

Handler exit pada opsi 0 adalah exit bawaan Python, bukan fungsi yang dihias, sehingga memilih Exit langsung mengakhiri proses tanpa banner. GhostTR.py:180-207

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-293

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-216

⚠️ Banner ditulis ke stderr lewat stderr.writelines, bukan ke stdout. Mengalihkan keluaran dengan python GhostTR.py > out.txt hanya menangkap hasil handler, sedangkan banner menu dan banner run_banner tetap muncul di layar.

⚠️ clear() bergantung pada perintah shell cls atau clear. Di lingkungan tanpa perintah itu, misalnya sebagian container, pembersihan layar gagal tanpa pesan karena status keluarnya diabaikan.

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-272 GhostTR.py:245-249

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-306

Aspekoption()run_banner()
Pemanggilmain()wrapper dari is_option
Pembersihan layarclear() di awal fungsiclear() di awal fungsi
Jedatidak ada di dalam fungsi; main() memanggil time.sleep(1) sesudahnyatime.sleep(1) sebelum dan time.sleep(0.5) sesudah banner
Target tulisstderr.writelinesstderr.writelines
IsiASCII 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.