3.2
Banner, Warna ANSI, dan Helper
Tampilan GhostTR.py dibangun dari tiga bahan kecil di bagian atas berkas: delapan konstanta warna ANSI, decorator is_option, dan helper layar run_banner() serta clear(). Tidak ada modul presentasi terpisah; keempat fitur pelacakan mencetak hasilnya sendiri memakai konstanta yang sama. Ketiga bahan itu dideklarasikan sebelum list options, sehingga semua fitur di bawahnya mewarisi perilaku yang sama (GhostTR.py:17-361).
Konstanta warna ANSI
Baris 17 sampai 24 mendeklarasikan delapan variabel global berisi escape sequence ANSI, misalnya Bl = '\033[30m' dan Wh = '\033[1;37m'. Nilainya berupa string biasa, jadi bisa ditempel langsung ke dalam f-string sebagai {Wh}, {Gr}, atau {Re} (GhostTR.py:17-242).
| Konstanta | Escape sequence | Warna | Pemakaian nyata di berkas |
|---|---|---|---|
Bl | \033[30m | hitam | hanya baris 17, tidak dipakai lagi |
Re | \033[1;31m | merah tebal | Error : {e} pada TrackLu baris 160, [ ! ] Exit pada execute_option baris 240, Please input number baris 304, Exit baris 313 |
Gr | \033[1;32m | hijau tebal | prompt input, nilai hasil, dan baris teks di dalam banner |
Ye | \033[1;33m | kuning tebal | penanda Username not found baris 158 |
Blu | \033[1;34m | biru tebal | hanya baris 21, tidak dipakai lagi |
Mage | \033[1;35m | magenta tebal | hanya baris 22, tidak dipakai lagi |
Cy | \033[1;36m | cyan tebal | hanya baris 23, tidak dipakai lagi |
Wh | \033[1;37m | putih tebal | label kolom, bingkai [ + ], pembuka teks banner |
Dua konstanta yang paling sering muncul adalah Wh untuk label dan bingkai serta Gr untuk nilai hasil dan teks yang ditekankan. Re khusus dipakai pada jalur kegagalan: pesan Error : {e} di TrackLu dan baris [ ! ] Exit di execute_option (GhostTR.py:158-1603, GhostTR.py:239-2414). Ye dipakai untuk penanda Username not found di dalam blok yang sama, jadi hasil yang tidak ditemukan tetap berwarna kuning meski berada di jalur gagal (GhostTR.py:158-1603). Empat konstanta sisanya hanya hadir di blok deklarasi dan tidak dirujuk di tempat lain (GhostTR.py:20-235).
Decorator is_option
is_option menerima satu fungsi dan mengembalikan wrapper yang memanggil run_banner() lebih dulu, lalu menjalankan func(*args, **kwargs). Decorator ini tidak memakai functools.wraps, dan wrapper tidak mengembalikan nilai apa pun dari func (GhostTR.py:29-366).
Pemasangannya memakai sintaks biasa, terlihat pertama pada IP_Track (GhostTR.py:40-417), lalu pada phoneGW (baris 80), TrackLu (baris 121), dan showIP (baris 169). Karena decorator mengganti nama fungsi dengan wrapper, entri func di dalam list options menunjuk ke wrapper, bukan ke badan fungsi aslinya. Akibatnya banner selalu dicetak sebelum fitur mana pun berjalan.
graph TD
D["@is_option baris 40"] --> W["wrapper(*args, **kwargs)"]
W --> B["run_banner() baris 275"]
B --> C["clear() baris 210"]
C --> X["os.system: cls atau clear"]
W --> F["func(*args, **kwargs) baris 33"]
F --> T["IP_Track / showIP / phoneGW / TrackLu"]
F -.-> N["wrapper mengembalikan None"]
style D fill:#f59e0b,color:#000
style W fill:#f59e0b,color:#000
style C fill:#f59e0b,color:#000
style B fill:#8b5cf6,color:#fff
style X fill:#2d7d46,color:#fff
style F fill:#8b5cf6,color:#fff
style T fill:#2d7d46,color:#fff
style N fill:#dc2626,color:#fff
%% fig: Rantai pemanggilan decorator is_option
%% desc: Setiap fitur berdekorasi memanggil run_banner lebih dulu, dan run_banner membersihkan layar sebelum badan fungsi asli dijalankan tanpa mengembalikan nilainya.Helper layar run_banner() dan clear()
run_banner() membersihkan layar, menunggu time.sleep(1), menulis seni ASCII hantu beserta kotak judul GHOST - TRACKER - IP ADDRESS dan @CODE BY HUNXBYTS ke stderr, lalu menunggu time.sleep(0.5). Penulisannya memakai stderr.writelines, bukan print (GhostTR.py:275-2938).
clear() adalah pembungkus tipis di atas os.system. Kalau os.name == 'nt' ia menjalankan cls, selain itu menjalankan clear; hasil pemanggilan disimpan ke variabel _ (GhostTR.py:210-2169).
| Helper atau decorator | Baris | Peran | Dipanggil dari |
|---|---|---|---|
is_option | 30-36 | membungkus fitur dan mencetak banner lebih dulu | deklarasi @is_option pada tiap fitur |
run_banner | 275-293 | membersihkan layar, menunggu, menulis seni ASCII hantu ke stderr | wrapper di dalam is_option |
clear | 210-216 | memilih cls atau clear berdasarkan os.name | main, option, dan run_banner |
option_text | 245-249 | menyusun daftar opsi dari list options | option |
⚠️
clear()tidak memeriksa kode keluaros.system, jadi kegagalan perintah pembersih layar tidak terdeteksi oleh kode dan banner bisa menumpuk di atas output lama (GhostTR.py:210-2169).
⚠️ Karena semua banner ditulis ke
stderrlewatstderr.writelines, pengalihan aliran itu akan menghilangkan banner sementara hasil pencetakan kestdouttetap tampil (GhostTR.py:275-2938).
Dua jalur banner
Ada dua banner berbeda dengan helper pembersih yang sama. Banner menu ditulis oleh option(), yang memanggil clear() lalu mencetak seni ASCII GhostTrack, baris C O D E B Y H U N X, dan akhirnya daftar opsi hasil option_text() (GhostTR.py:259-27210). option_text() sendiri hanya merangkai string dari list options dengan format [ num ] text (GhostTR.py:245-24911). Banner fitur ditulis oleh run_banner(), yang dipanggil decorator sebelum badan fitur berjalan (GhostTR.py:275-2938).
Pemanggil clear() ada tiga: main, option, dan run_banner. main sudah memanggil clear() sebelum memanggil option(), lalu option() memanggil clear() sekali lagi (GhostTR.py:296-30612). Rincian urutan pemilihan opsi dan pemanggilan execute_option ada di Loop Menu dan Dispatch Opsi.
graph TD
M["main() baris 296"] --> O["option() baris 259"]
M --> CL["clear() baris 210"]
O --> CL
O --> OT["option_text() baris 245"]
O --> A1["stderr: ASCII GhostTrack dan C O D E B Y H U N X"]
W["wrapper dari is_option"] --> R["run_banner() baris 275"]
R --> CL
R --> A2["stderr: ASCII GHOST - TRACKER - IP ADDRESS"]
CL --> S["os.system: cls atau clear"]
style M fill:#8b5cf6,color:#fff
style O fill:#8b5cf6,color:#fff
style R fill:#8b5cf6,color:#fff
style OT fill:#8b5cf6,color:#fff
style W fill:#f59e0b,color:#000
style CL fill:#f59e0b,color:#000
style A1 fill:#2d7d46,color:#fff
style A2 fill:#2d7d46,color:#fff
style S fill:#2d7d46,color:#fff
%% fig: Dua banner yang berbagi clear
%% desc: Banner menu dari option() dan banner fitur dari run_banner() sama-sama memanggil clear() sebelum menulis seni ASCII-nya ke stderr.Pratinjau banner di README
Berkas asset/bn.png tidak dirujuk satu kali pun oleh GhostTR.py; gambar itu dipakai README.md sebagai pratinjau lewat elemen <img src=.../asset/bn.png> (README.md:413). Jadi gambar banner pada README adalah tangkapan layar, sementara yang dicetak program saat berjalan adalah seni ASCII di dalam run_banner() (GhostTR.py:275-2938).