3
Arsitektur CLI Satu Berkas
GhostTrack dikirim sebagai satu skrip Python, bukan package. Semua kode yang dijalankan pengguna berada di GhostTR.py: blok import hanya memuat pustaka standar dan dua pustaka pihak ketiga, requests dan phonenumbers, tanpa satu pun modul internal (GhostTR.py:9-151). Berkas yang sama juga ditutup oleh guard if __name__ == '__main__' yang memanggil main() dan menangkap KeyboardInterrupt (GhostTR.py:309-3152).
Karena tidak ada pemisahan modul, seluruh koordinasi antarbagian terjadi lewat namespace global berkas itu: variabel warna Bl sampai Wh (GhostTR.py:17-243), list options, dan fungsi-fungsi yang saling memanggil langsung tanpa lapisan service. Halaman ini memetakan lapisan tersebut; perilaku runtime-nya dibahas di subhalaman.
Lapisan di dalam GhostTR.py
Isi berkas terbaca sebagai tujuh lapisan berurutan, dari bahan mentah sampai entrypoint.
| Lapisan | Isi | Baris |
|---|---|---|
| Import | json, requests, time, os, phonenumbers, carrier, geocoder, timezone, stderr | GhostTR.py:9-151 |
| Palet warna ANSI | Bl, Re, Gr, Ye, Blu, Mage, Cy, Wh | GhostTR.py:17-243 |
| Decorator | is_option membungkus setiap fungsi fitur | GhostTR.py:30-364 |
| Fungsi fitur | IP_Track, phoneGW, TrackLu, showIP | GhostTR.py:40-1765 |
| Tabel opsi | list options berisi dict num, text, func | GhostTR.py:180-2076 |
| Helper terminal dan dispatcher | clear, call_option, execute_option, option_text, is_in_options, option, run_banner | GhostTR.py:210-2937 |
| Entrypoint | main dan guard __main__ | GhostTR.py:296-3158 |
Ketergantungan antar fungsi
Diagram berikut menunjukkan siapa memanggil siapa di dalam modul tunggal itu. Panah berarti pemanggilan langsung saat runtime, bukan import, karena semuanya berada di satu namespace.
graph TD
Entry["__main__ guard"] --> Main["main()"]
Main --> Clear["clear()"]
Main --> Option["option()"]
Main --> Exec["execute_option(opt)"]
Option --> Clear
Option --> OptText["option_text()"]
OptText --> Options[("options")]
Exec --> Call["call_option(opt)"]
Exec --> Main
Call --> InOpts["is_in_options(num)"]
Call --> Options
InOpts --> Options
Options --> F1["IP_Track()"]
Options --> F2["showIP()"]
Options --> F3["phoneGW()"]
Options --> F4["TrackLu()"]
Options --> F0["exit (builtin)"]
F1 --> Dec["is_option wrapper"]
F2 --> Dec
F3 --> Dec
F4 --> Dec
Dec --> RunB["run_banner()"]
RunB --> Clear
style Options fill:#f59e0b,color:#000
style Dec fill:#f59e0b,color:#000
style Main fill:#2d7d46,color:#fff
style Exec fill:#2d7d46,color:#fff
style Call fill:#2d7d46,color:#fff
style F1 fill:#8b5cf6,color:#fff
style F2 fill:#8b5cf6,color:#fff
style F3 fill:#8b5cf6,color:#fff
style F4 fill:#8b5cf6,color:#fff
style F0 fill:#dc2626,color:#fff
%% fig: Ketergantungan fungsi dalam modul tunggal GhostTR.py
%% desc: Guard __main__ memanggil main, yang menggambar menu lewat option dan meneruskan pilihan ke execute_option; tabel options menyambungkan nomor opsi ke fungsi fitur yang dibungkus is_option.Urutan definisi di berkas hampir mengikuti urutan ketergantungan. List options sudah menunjuk ke objek fungsi yang didefinisikan lebih dulu, yaitu IP_Track, showIP, phoneGW, dan TrackLu (GhostTR.py:180-2076). Pengecualiannya is_option, yang dideklarasikan jauh sebelum run_banner: wrapper itu aman karena run_banner() baru dipanggil saat fungsi fitur dieksekusi, bukan saat dekorasi (GhostTR.py:30-364). Wrapper tersebut juga tidak mengembalikan hasil func(*args, **kwargs), sehingga setiap fungsi fitur yang didekorasi selalu menghasilkan None (GhostTR.py:30-364).
Siklus menu terbentuk lewat rekursi, bukan lewat loop: execute_option memanggil main() lagi setelah pengguna menekan enter (GhostTR.py:230-2429). Rincian alur dispatch dan validasi opsi ada di Loop Menu dan Dispatch Opsi.
Tabel options sebagai titik sambung
List options adalah satu-satunya tempat nomor menu, label, dan fungsi bertemu. Setiap entri adalah dict dengan tiga kunci.
num | text | func | Baris |
|---|---|---|---|
| 1 | IP Tracker | IP_Track | GhostTR.py:181-18510 |
| 2 | Show Your IP | showIP | GhostTR.py:186-19111 |
| 3 | Phone Number Tracker | phoneGW | GhostTR.py:192-19612 |
| 4 | Username Tracker | TrackLu | GhostTR.py:197-20113 |
| 0 | Exit | exit (builtin Python) | GhostTR.py:202-20614 |
Tiap helper membaca subset kunci yang berbeda dari tabel yang sama. option_text memakai num dan text untuk merangkai baris menu (GhostTR.py:245-24915). is_in_options hanya membandingkan num (GhostTR.py:252-25616). call_option memakai func, dan mencetak No function detected bila kunci itu tidak ada (GhostTR.py:219-22717). Konsekuensinya, menambah satu entri di options langsung mengubah tiga hal sekaligus: tampilan menu, validasi masukan, dan fungsi yang dijalankan.
Peran tiap helper
| Fungsi | Peran | Baris |
|---|---|---|
main | membersihkan layar, menggambar menu, membaca int(input(...)), lalu meneruskan ke execute_option | GhostTR.py:296-30618 |
option | memanggil clear() lalu menulis banner dan teks menu ke stderr | GhostTR.py:259-27219 |
option_text | merangkai baris [ num ] text dari seluruh options | GhostTR.py:245-24915 |
run_banner | clear(), time.sleep, lalu menulis banner Ghost Tracker ke stderr | GhostTR.py:275-29320 |
is_in_options | memeriksa apakah num ada di options | GhostTR.py:252-25616 |
call_option | melempar ValueError('Option not found') untuk nomor tak dikenal, lalu memanggil option['func']() | GhostTR.py:219-22717 |
execute_option | memanggil call_option, menunggu enter, lalu main() | GhostTR.py:230-2429 |
clear | os.system('cls') bila os.name == 'nt', os.system('clear') untuk lainnya | GhostTR.py:210-21621 |
Bentuk banner, penggunaan palet warna ANSI, dan helper tampilan lain dijelaskan di Banner, Warna ANSI, dan Helper.
⚠️ Entri
0menyimpanexit, yaitu fungsi builtin Python, bukan fungsi yang didekorasiis_option(GhostTR.py:202-20614). Karenacall_optionmemanggiloption['func']()langsung tanpa pemeriksaan tipe (GhostTR.py:219-22717), memilih opsi itu menghentikan proses tanpa banner penutup, tanpa jeda, dan tanpa melewati jalurKeyboardInterruptyang disiapkanexecute_option.
Konsekuensi modul tunggal
Satu berkas berarti satu unit deploy: tidak ada import internal yang bisa putus, dan seluruh dependensi eksternal cukup dideklarasikan di requirements.txt. Efek sampingnya, tidak ada batas antara logika pelacakan dan presentasi. Keempat fungsi fitur mencetak hasilnya sendiri ke stdout dengan variabel warna global, dan tidak ada satu pun yang mengembalikan struktur data (GhostTR.py:40-1765). Akibatnya setiap format keluaran baru harus diubah di dalam fungsi fitur, bukan di helper terpisah.
Ketiadaan modul juga membuat tabel options menjadi kontrak tunggal yang dipakai tiga helper sekaligus, sehingga perubahan pada satu entri menyentuh menu, validasi, dan dispatch dalam satu langkah (GhostTR.py:180-2076). Penanganan galat yang menyertai struktur ini, termasuk pemanggilan ulang main(), dirangkum di Penanganan Error dan Interrupt.