Lompat ke konten
dokumentasi.id
Commit a5cb8ad
v4
Star20 rb

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-15). Berkas yang sama juga ditutup oleh guard if __name__ == '__main__' yang memanggil main() dan menangkap KeyboardInterrupt (GhostTR.py:309-315).

Karena tidak ada pemisahan modul, seluruh koordinasi antarbagian terjadi lewat namespace global berkas itu: variabel warna Bl sampai Wh (GhostTR.py:17-24), 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.

LapisanIsiBaris
Importjson, requests, time, os, phonenumbers, carrier, geocoder, timezone, stderrGhostTR.py:9-15
Palet warna ANSIBl, Re, Gr, Ye, Blu, Mage, Cy, WhGhostTR.py:17-24
Decoratoris_option membungkus setiap fungsi fiturGhostTR.py:30-36
Fungsi fiturIP_Track, phoneGW, TrackLu, showIPGhostTR.py:40-176
Tabel opsilist options berisi dict num, text, funcGhostTR.py:180-207
Helper terminal dan dispatcherclear, call_option, execute_option, option_text, is_in_options, option, run_bannerGhostTR.py:210-293
Entrypointmain dan guard __main__GhostTR.py:296-315

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.
Fig. 1: Ketergantungan fungsi dalam modul tunggal GhostTR.pyGuard __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-207). 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-36). Wrapper tersebut juga tidak mengembalikan hasil func(*args, **kwargs), sehingga setiap fungsi fitur yang didekorasi selalu menghasilkan None (GhostTR.py:30-36).

Siklus menu terbentuk lewat rekursi, bukan lewat loop: execute_option memanggil main() lagi setelah pengguna menekan enter (GhostTR.py:230-242). 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.

numtextfuncBaris
1IP TrackerIP_TrackGhostTR.py:181-185
2Show Your IPshowIPGhostTR.py:186-191
3Phone Number TrackerphoneGWGhostTR.py:192-196
4Username TrackerTrackLuGhostTR.py:197-201
0Exitexit (builtin Python)GhostTR.py:202-206

Tiap helper membaca subset kunci yang berbeda dari tabel yang sama. option_text memakai num dan text untuk merangkai baris menu (GhostTR.py:245-249). is_in_options hanya membandingkan num (GhostTR.py:252-256). call_option memakai func, dan mencetak No function detected bila kunci itu tidak ada (GhostTR.py:219-227). Konsekuensinya, menambah satu entri di options langsung mengubah tiga hal sekaligus: tampilan menu, validasi masukan, dan fungsi yang dijalankan.

Peran tiap helper

FungsiPeranBaris
mainmembersihkan layar, menggambar menu, membaca int(input(...)), lalu meneruskan ke execute_optionGhostTR.py:296-306
optionmemanggil clear() lalu menulis banner dan teks menu ke stderrGhostTR.py:259-272
option_textmerangkai baris [ num ] text dari seluruh optionsGhostTR.py:245-249
run_bannerclear(), time.sleep, lalu menulis banner Ghost Tracker ke stderrGhostTR.py:275-293
is_in_optionsmemeriksa apakah num ada di optionsGhostTR.py:252-256
call_optionmelempar ValueError('Option not found') untuk nomor tak dikenal, lalu memanggil option['func']()GhostTR.py:219-227
execute_optionmemanggil call_option, menunggu enter, lalu main()GhostTR.py:230-242
clearos.system('cls') bila os.name == 'nt', os.system('clear') untuk lainnyaGhostTR.py:210-216

Bentuk banner, penggunaan palet warna ANSI, dan helper tampilan lain dijelaskan di Banner, Warna ANSI, dan Helper.

⚠️ Entri 0 menyimpan exit, yaitu fungsi builtin Python, bukan fungsi yang didekorasi is_option (GhostTR.py:202-206). Karena call_option memanggil option['func']() langsung tanpa pemeriksaan tipe (GhostTR.py:219-227), memilih opsi itu menghentikan proses tanpa banner penutup, tanpa jeda, dan tanpa melewati jalur KeyboardInterrupt yang disiapkan execute_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-176). 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-207). Penanganan galat yang menyertai struktur ini, termasuk pemanggilan ulang main(), dirangkum di Penanganan Error dan Interrupt.