3.1
Loop Menu dan Dispatch Opsi
GhostTR.py tidak membaca argumen baris perintah sama sekali. Seluruh interaksi dimulai dari fungsi main, yang menggambar menu, membaca satu nomor opsi, lalu menyerahkannya ke execute_option. Setelah aksi selesai, execute_option memanggil main lagi sehingga menu berputar ulang. Blok if __name__ == '__main__': hanya membungkus pemanggilan pertama itu dengan penangkap KeyboardInterrupt GhostTR.py:309-3151.
Satu putaran dari main sampai kembali ke main
main menjalankan empat langkah berurutan: clear(), option(), jeda time.sleep(1), lalu int(input(...)) dengan prompt Select Option GhostTR.py:296-3062. Nilai int itu langsung diteruskan ke execute_option(opt) tanpa validasi tambahan di main, sehingga nomor di luar daftar baru ditolak di dalam call_option.
option() membersihkan layar sekali lagi, menulis banner ASCII ke stderr, lalu menambahkan daftar opsi ke stderr yang sama lewat stderr.writelines GhostTR.py:259-2723. Karena keluarannya memakai stderr, menu tidak muncul di stdout; ini terasa saat keluaran tool di-pipe ke berkas. clear() memilih perintah cls di Windows dan clear di platform lain berdasarkan os.name GhostTR.py:210-2164, sedangkan option_text() merangkai satu baris [ num ] text untuk tiap entri options GhostTR.py:245-2495.
sequenceDiagram
autonumber
participant U as User
participant M as main
participant O as option
participant T as option_text
participant E as execute_option
participant C as call_option
participant I as is_in_options
participant W as is_option wrapper
participant B as run_banner
U->>M: python GhostTR.py
M->>M: clear()
M->>O: option()
O->>O: "clear() + stderr.writelines(banner)"
M->>T: option_text()
T-->>M: baris [ num ] text
M->>U: input Select Option
U-->>M: int
M->>E: execute_option(opt)
E->>C: call_option(opt)
C->>I: is_in_options(opt)
I-->>C: True atau False
alt opt tidak ada di options
C-->>E: "raise ValueError('Option not found')"
else opt ada
C->>W: "option['func']()"
W->>B: run_banner()
B-->>W: banner Ghost tercetak ke stderr
W-->>C: selesai tanpa nilai balik
end
E->>U: input Press enter to continue
E->>M: main()
%% fig: Siklus satu opsi menu
%% desc: main menggambar menu, membaca nomor opsi, men-dispatch lewat call_option, lalu kembali ke main setelah pengguna menekan Enter.Daftar opsi dan fungsi tujuannya
Setiap entri options adalah dict dengan kunci num, text, dan func. Hanya num 0 yang tidak menuju tracker: nilainya adalah builtin exit GhostTR.py:180-2076.
num | text | func | Halaman fitur |
|---|---|---|---|
| 1 | IP Tracker | IP_Track | IP Tracker |
| 2 | Show Your IP | showIP | Show Your IP |
| 3 | Phone Number Tracker | phoneGW | Phone Number Tracker |
| 4 | Username Tracker | TrackLu | Username Tracker |
| 0 | Exit | exit | Penanganan Error dan Interrupt |
Dispatch: is_in_options lalu call_option
call_option memvalidasi nomor lebih dulu lewat is_in_options, dan melempar ValueError('Option not found') bila nomor itu tidak ada di daftar GhostTR.py:220-2217. is_in_options hanya memindai options dan mengembalikan True atau False tanpa efek samping GhostTR.py:252-2568. Bila nomor valid, call_option mencari entri dengan option['num'] == opt lalu memanggil option['func'](); jika kunci func tidak ada, ia mencetak No function detected GhostTR.py:222-2279.
Fungsi tracker tidak dipanggil mentah. IP_Track, phoneGW, TrackLu, dan showIP dibungkus decorator is_option, yang menjalankan run_banner() lebih dulu lalu memanggil fungsi aslinya tanpa mengembalikan nilai GhostTR.py:30-3610. Contohnya showIP, yang baru melakukan requests.get ke https://api.ipify.org/ setelah banner tergambar GhostTR.py:169-17611. run_banner memanggil clear() dan time.sleep(1) sebelum menulis banner Ghost ke stderr GhostTR.py:275-29312; detail warnanya dibahas di Banner, Warna ANSI, dan Helper.
Retry, exit, dan rekursi
execute_option membungkus call_option dalam try. Setelah aksi selesai ia menahan layar dengan input berlabel Press enter to continue, lalu memanggil main() kembali — inilah mekanisme putar ulang menu GhostTR.py:230-24213. Dua exception ditangani di situ: ValueError dicetak lalu memicu execute_option(opt) ulang, dan KeyboardInterrupt mencetak Exit, menunggu 2 detik, lalu memanggil exit() GhostTR.py:235-24214. Karena exception dari dalam fungsi tracker merambat lewat call_option, menekan Ctrl+C saat prompt tracker juga berakhir di handler KeyboardInterrupt yang sama GhostTR.py:239-24215.
| Lokasi | Pemicu | Keluaran yang tercetak | Rujukan |
|---|---|---|---|
main | int() gagal karena input bukan angka | Please input number, lalu time.sleep(2) dan main() lagi | GhostTR.py:303-30616 |
call_option | nomor tidak ada di options | ValueError('Option not found') | GhostTR.py:220-2217 |
call_option | entri tanpa kunci func | No function detected | GhostTR.py:222-2279 |
execute_option | KeyboardInterrupt saat menunggu Enter | Exit, lalu exit() | GhostTR.py:239-24215 |
blok __main__ | KeyboardInterrupt di luar siklus | Exit, lalu exit() | GhostTR.py:309-3151 |
graph TD
A["main()"] --> B["clear() + option()"]
B --> C["int(input Select Option)"]
C -->|"int() gagal"| D["print Please input number"]
D --> E["time.sleep(2)"]
E --> A
C -->|"int() berhasil"| F["execute_option(opt)"]
F --> G{"is_in_options(opt)"}
G -->|"False"| H["raise ValueError Option not found"]
H --> I["print(e) + time.sleep(2)"]
I --> F
G -->|"True"| J["option['func']()"]
J --> K["input Press enter to continue"]
K --> A
F -->|"KeyboardInterrupt"| L["print Exit + exit()"]
style A fill:#f59e0b,color:#000
style B fill:#f59e0b,color:#000
style G fill:#f59e0b,color:#000
style C fill:#8b5cf6,color:#fff
style J fill:#2d7d46,color:#fff
style K fill:#2d7d46,color:#fff
style D fill:#dc2626,color:#fff
style H fill:#dc2626,color:#fff
style I fill:#dc2626,color:#fff
style L fill:#dc2626,color:#fff
%% fig: Tiga jalur keluar dari satu putaran menu
%% desc: Input yang bukan angka kembali ke main, opsi valid menjalankan func lalu kembali ke main, dan interrupt mengakhiri program.⚠️ Tidak ada
whiledi berkas ini. Putar ulang menu dilakukan dengan rekursi, jadi setiap putaran menambah satu frame baru di stack:main→execute_option→main→ dan seterusnya GhostTR.py:230-24213. Sesi yang memakai menu ratusan kali menumpuk frame sebanyak itu pula.
⚠️ Nomor yang tidak ada di
options, misalnya9, ditangani dengan memanggilexecute_option(opt)lagi memakai argumen yang sama. Nilaiopttidak pernah berubah, jadi pengulangan ini tidak punya kondisi berhenti dan berakhir sebagaiRecursionErrorGhostTR.py:235-23817.