🌍 gempa.tcl – Notifikasi Gempa BMKG untuk IRC

Skrip TCL untuk Eggdrop yang mengambil data gempa terkini dari BMKG dan mengirimkannya ke channel IRC.

← Kembali ke Proyek


✨ Fitur Unggulan

📦 Instalasi

  1. Download skrip menggunakan tombol di bawah, atau buat file baru:
    nano ~/eggdrop/scripts/gempa.tcl
  2. Copy-paste kode dari bagian "Kode Lengkap" di bawah.
  3. Edit konfigurasi jika perlu:
    set setroom "#yobayat"   # Ganti dengan channel tujuan
  4. Tambahkan baris berikut di file konfigurasi Eggdrop (eggdrop.conf):
    source scripts/gempa.tcl
  5. Restart bot:
    .restart

⚙️ Konfigurasi

Di dalam skrip, ada beberapa variabel yang bisa disesuaikan:

# Daftar channel yang menerima notifikasi otomatis (kosongkan untuk semua channel)
set setroom "#meta"

# File untuk menyimpan ID gempa terakhir (agar tidak mengirim notifikasi berulang)
set gempa_file "gempa.txt"

# Path ke curl (biasanya /usr/bin/curl)
set curl_path "/usr/bin/curl"
    

🎯 Cara Penggunaan

Notifikasi otomatis: Bot akan mengecek gempa baru setiap 5 menit dan mengirim ke channel yang ditentukan.

Perintah manual: Ketik !gempa atau .gempa di channel (atau private message) untuk mendapatkan informasi gempa terbaru.

Contoh output di IRC:

[WARNING GEMPA]
Tanggal: 09 Mar 2026, Jam: 10:25:30
Magnitudo: 5.2, Kedalaman: 10 km
Wilayah: 30 km Barat Daya GARUT-JABAR
Potensi: Gempa ini berpotensi tsunami
Dirasakan: (Skala MMI): II - III Garut
    

📜 Kode Lengkap (gempa.tcl)

package require json

# Daftar channel yang menerima notifikasi otomatis
set setroom "#yobayat"

# File untuk menyimpan ID gempa terakhir
set gempa_file "gempa.txt"
if {![file exists $gempa_file]} {
    close [open $gempa_file w]
}

# Path curl
set curl_path "/usr/bin/curl"

# Binding perintah manual
bind pub - .gempa cmd_gempa
bind pub - !gempa cmd_gempa

proc cmd_gempa {nick uhost hand chan arg} {
    putlog "Gempa manual diminta oleh $nick di $chan"
    gempa_process $chan "manual"
}

# Timer otomatis setiap 5 menit
timer 300 auto_gempa
proc auto_gempa {} {
    putlog "AutoGempa: mengecek gempa baru..."
    gempa_process "room" "auto"
    timer 300 auto_gempa
}

proc gempa_process {target mode} {
    global setroom gempa_file curl_path

    set url "https://data.bmkg.go.id/DataMKG/TEWS/autogempa.json"
    set cmd [list $curl_path -s -k --max-time 10 $url]

    if {[catch {exec {*}$cmd} data]} {
        putlog "Gempa: curl error - $data"
        return
    }

    # Parse JSON
    if {[catch {set parsed [json::json2dict $data]} err]} {
        putlog "Gempa: Gagal parse JSON - $err"
        putlog "Data mentah: $data"
        return
    }

    # Ambil data gempa
    if {[catch {
        set gempa_data [dict get $parsed Infogempa gempa]
        set tanggal   [dict get $gempa_data Tanggal]
        set jam       [dict get $gempa_data Jam]
        set magnitudo [dict get $gempa_data Magnitude]
        set kedalaman [dict get $gempa_data Kedalaman]
        set wilayah   [dict get $gempa_data Wilayah]
        set potensi   [dict get $gempa_data Potensi]
        set dirasakan [dict get $gempa_data Dirasakan]
    } err]} {
        putlog "Gempa: Gagal membaca field JSON - $err"
        return
    }

    if {$mode == "manual"} {
        send_gempa $target $tanggal $jam $magnitudo $kedalaman $wilayah $potensi $dirasakan
    } else {
        set current_id "$tanggal $jam"
        if {[file exists $gempa_file]} {
            set f [open $gempa_file r]
            set last_id [gets $f]
            close $f
        } else {
            set last_id ""
        }
        if {$current_id eq $last_id} {
            putlog "AutoGempa: Tidak ada gempa baru"
            return
        }
        putlog "AutoGempa: Gempa baru ditemukan! ID: $current_id"
        set f [open $gempa_file w]
        puts $f $current_id
        close $f

        foreach chann [channels] {
            if {$setroom == "" || [lsearch -exact [string tolower $setroom] [string tolower $chann]] != -1} {
                send_gempa $chann $tanggal $jam $magnitudo $kedalaman $wilayah $potensi $dirasakan
            }
        }
    }
}

proc send_gempa {chan tanggal jam magnitudo kedalaman wilayah potensi dirasakan} {
    set header "\00305,08\002\037\/!\\\002\017 \00305\002WARNING GEMPA\002\017 \00305,08\002\037\/!\\\002\017"
    set msg1 "Tanggal: \00314$tanggal\017, Jam: \00314$jam\017"
    set msg2 "Magnitudo: \00314$magnitudo\017, Kedalaman: \00314$kedalaman\017"
    set msg3 "Wilayah: \00314$wilayah\017"
    set msg4 "Potensi: \00314$potensi\017"
    set msg5 "Dirasakan: \00314$dirasakan\017"

    putserv "PRIVMSG $chan :$header"
    putserv "PRIVMSG $chan :$msg1"
    putserv "PRIVMSG $chan :$msg2"
    putserv "PRIVMSG $chan :$msg3"
    putserv "PRIVMSG $chan :$msg4"
    putserv "PRIVMSG $chan :$msg5"
}

putlog "tcl BMKG INDO (pakai curl) loaded. by yuzu/Lemon Notifikasi otomatis setiap 5 menit."
⚠️ Catatan Penting:

📥 Download

⬇️ Download gempa.tcl

Letakkan di folder scripts/ Eggdrop dan source di konfigurasi.


← Kembali ke Proyek