Lompat ke konten
dokumentasi.id
Commit a5cb8ad
v4
Star20 rb

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-315.

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-306. 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-272. 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-216, sedangkan option_text() merangkai satu baris [ num ] text untuk tiap entri options GhostTR.py:245-249.

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.
Fig. 1: Siklus satu opsi menumain 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-207.

numtextfuncHalaman fitur
1IP TrackerIP_TrackIP Tracker
2Show Your IPshowIPShow Your IP
3Phone Number TrackerphoneGWPhone Number Tracker
4Username TrackerTrackLuUsername Tracker
0ExitexitPenanganan 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-221. is_in_options hanya memindai options dan mengembalikan True atau False tanpa efek samping GhostTR.py:252-256. 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-227.

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-36. Contohnya showIP, yang baru melakukan requests.get ke https://api.ipify.org/ setelah banner tergambar GhostTR.py:169-176. run_banner memanggil clear() dan time.sleep(1) sebelum menulis banner Ghost ke stderr GhostTR.py:275-293; 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-242. 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-242. 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-242.

LokasiPemicuKeluaran yang tercetakRujukan
mainint() gagal karena input bukan angkaPlease input number, lalu time.sleep(2) dan main() lagiGhostTR.py:303-306
call_optionnomor tidak ada di optionsValueError('Option not found')GhostTR.py:220-221
call_optionentri tanpa kunci funcNo function detectedGhostTR.py:222-227
execute_optionKeyboardInterrupt saat menunggu EnterExit, lalu exit()GhostTR.py:239-242
blok __main__KeyboardInterrupt di luar siklusExit, lalu exit()GhostTR.py:309-315
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.
Fig. 2: Tiga jalur keluar dari satu putaran menuInput yang bukan angka kembali ke main, opsi valid menjalankan func lalu kembali ke main, dan interrupt mengakhiri program.

⚠️ Tidak ada while di 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-242. Sesi yang memakai menu ratusan kali menumpuk frame sebanyak itu pula.

⚠️ Nomor yang tidak ada di options, misalnya 9, ditangani dengan memanggil execute_option(opt) lagi memakai argumen yang sama. Nilai opt tidak pernah berubah, jadi pengulangan ini tidak punya kondisi berhenti dan berakhir sebagai RecursionError GhostTR.py:235-238.