Port Python 3 / slixmpp dari BlackSmith mark.2 (WitcherGeralt) Porting Python3 by: paijo.ahmad@jabber.ru
Versi: 1.0.0 Core BlackSmith mark.2 Basis: Port Python 3 / slixmpp dari BlackSmith mark.2 (WitcherGeralt) Protokol: XMPP (Jabber) — client MUC bot
Nexsus Safety adalah bot XMPP berbasis arsitektur expansion (plugin) — setiap fitur (command, auto-responder, scheduler) adalah modul terpisah yang dimuat otomatis saat startup dari folder expansions/. Engine inti (NexsusBot.py) menyediakan:
- Koneksi XMPP (multi-account) via slixmpp
- Manajemen room MUC (join, roles, affiliations)
- Sistem command dengan prefix dan level akses
- Database SQLite per-fitur
- Sistem help otomatis dari file
.{lang}
nexsusBot/
├── NexsusBot.py # Engine inti — koneksi, presence, command dispatcher
├── requirements.txt # Dependency Python
├── users.db # Database user global (SQLite)
├── nexsus.log # Log runtime (DEBUG level)
│
├── static/ # Konfigurasi & teks statis (TIDAK berubah saat runtime)
│ ├── config.ini # Config utama: akun, TLS, limit, admin
│ ├── clients.ini # Akun XMPP tambahan (multi-account)
│ └── insc.py # AnsBase global (teks jawaban default)
│
├── current/ # Data dinamis (runtime, per-room/per-user)
│ ├── chats.db / chats.cp # Daftar room yang diikuti bot
│ ├── access.db # Daftar access level custom per-JID
│ ├── sessions.db # PID tracking (cegah duplikat proses)
│ ├── roster.db # Status roster (on/off)
│ ├── notepad.db # Data command 'note'
│ ├── wtf.db # Data command 'wtf'/'def'
│ ├── books.db / cdesc.db # Data expansion 'books'
│ └── <room_jid>/ # Folder per-room (data spesifik room)
│
├── library/ # Library lokal (bukan via pip)
│ ├── itypes.py # Counter & tipe data util (AtomicNumber dkk)
│ ├── ithr.py # Thread helper
│ └── fb2.py # Parser FictionBook (expansion 'books')
│
└── expansions/ # Semua fitur/plugin bot
└── <nama_expansion>/
├── code.py # Logic command & handler
├── insc.py # Teks jawaban (AnsBase) — opsional, multi-bahasa
└── <command>.<lang> # File help, contoh: ping.en, config.en
| Komponen | Fungsi |
|---|---|
NexusClient |
Wrapper slixmpp.ClientXMPP — 1 instance per akun XMPP |
sConf |
Representasi 1 room MUC (peserta, status, affiliation) |
sUser |
Representasi 1 peserta dalam room (nick, JID, role, access) |
Command |
Wrapper 1 command — handler, access level, help, statistik |
expansion |
Base class setiap plugin di expansions/ |
Cmds |
Dict global semua command terdaftar |
Chats |
Dict global semua room yang diikuti |
Clients |
Dict global semua koneksi XMPP aktif |
load_config() → baca static/config.ini & clients.ini
└─ load_nexus()
├─ load AnsBase dari static/insc.py
├─ check_copies() → cek PID lama, kill jika masih jalan
├─ load_expansions() → scan & load semua expansions/*/code.py
├─ call_sfunctions("00si") → init handler tahap awal
├─ connect_clients() → connect semua akun XMPP
├─ join_chats() → join semua room dari current/chats.db
└─ Main loop: monitoring tiap 180s (memory, koneksi)
| Level | Label | Keterangan |
|---|---|---|
| 8 | God | Admin utama (ADMIN= di config.ini), akses penuh |
| 7 | Chief | Akses tinggi (private command, remote, dll) |
| 6 | — | Owner/Admin room |
| 5 | — | Moderator room |
| 4 | — | — |
| 3 | — | Participant dengan affiliation member |
| 2 | — | Participant biasa |
| 1 | All | Default — semua user |
| 0 | — | Visitor (read-only di room moderated) |
Access dihitung dari kombinasi affiliation + role di room (jika JID tidak diketahui), atau dari Galist/access.db (jika JID dikenal).
_handle_message()
├─ Cek access minimum (enough_access)
├─ Cek prefix command (! @ # . * atau nick bot)
├─ Parse command + argumen
├─ Macro hook (untuk expansion yang intercept semua pesan)
└─ Cmds[command].execute() → jalankan handler di thread terpisah
| Expansion | Command | Fungsi |
|---|---|---|
access |
access, acclist, acclist2, gaccess, laccess |
Manajemen access level user |
alive_keeper |
— | Auto-ping berkala agar koneksi tetap hidup |
allweb |
— | Helper akses web (internal) |
basic_control |
join, rejoin, leave, reconnect, reload, exit |
Kontrol koneksi & room |
books |
order |
Pencarian & pengiriman e-book (FictionBook) |
bot_sends |
clear, test, sendall, more, send, toadmin, echo, invite |
Kirim pesan massal/khusus |
calendar |
calendar |
Tampilan kalender |
clear_stats |
— | Reset statistik saat user/bot keluar room |
cmd_control |
taboo |
Blokir command tertentu per-room |
config |
config, client |
Lihat/ubah konfigurasi runtime |
converter |
convert |
Konversi satuan/mata uang |
cron |
cron |
Penjadwalan tugas berkala |
dns |
dns, port |
Lookup DNS & cek port |
exp_control |
expinfo, expload, expunload, tumbler |
Manajemen expansion (load/unload runtime) |
extra_control |
turbo, remote, private, redirect |
Eksekusi command lanjutan (multi/remote) |
game |
game |
Mini-game |
get_iq |
ping, pstat, time, version, vcard, uptime, idle, list, disco |
Query info XMPP (IQ requests) |
help |
location, comacc, help, commands |
Sistem bantuan & info command |
info |
online, chatslist, inmuc, visitors, search |
Info status room & user |
interpreter |
eval, exec, sh, calc |
Eksekusi kode/shell (akses tinggi) |
muc |
subject, ban, none, member, admin, owner, kick, visitor, participant, moder, fullban, fullunban |
Moderasi & administrasi MUC |
new_year |
new_year |
Hitung mundur tahun baru |
note |
note |
Catatan personal per-user |
roster_control |
roster, roster2 |
Manajemen roster/subscription |
sconf_attrs |
botjid, botnick, botstatus, password, prefix |
Atribut bot per-room |
session_stats |
excinfo, botup, stat, comstat |
Statistik sesi & uptime |
sheriff |
order |
Moderasi otomatis |
talkers |
talkers |
Statistik aktivitas user |
turn |
turn |
Sistem giliran/antrian |
user_stats |
userstat, here |
Statistik per-user |
wtf |
wtf, def |
Kamus/definisi custom |
[STATES]
TLS = True # True = STARTTLS, False = plain TCP
MSERVE = True # Bot tetap layani meski bukan moderator
GETEXC = True # Kirim exception detail ke admin
LANG = EN # Bahasa default (EN/RU/UA/...)
[CLIENT]
SERV = jabber.server.com
PORT = 5222
USER = botusername
HOST = jabber.server.com
PASS = secret
[CONFIG]
RESOURCE = Nexsus
STATUS = Type "HELP" for help with commands
NICK = Nexsus
ADMIN = admin@jabber.server.com # God-level access (8)
[LIMITS]
MEMORY = 64 # MB, 0 = unlimited
INCOMING = 10240 # Karakter pesan masuk
CHAT = 1024 # Karakter balasan ke room
PRIVATE = 2024 # Karakter balasan ke private chat
CHAT_LIST_LENGTH = 100Multi-account tambahan didaftarkan di static/clients.ini dengan format section serupa.
# 1. Install dependencies
pip install -r requirements.txt
# 2. Edit konfigurasi
nano static/config.ini
# 3. Jalankan
python3 NexsusBot.py
# Opsional — custom folder:
python3 NexsusBot.py -s static -d current -e expansionsBot akan auto-reconnect setelah crash (delay 30 detik), dan menyimpan PID di current/sessions.db untuk mencegah proses duplikat.
Buat folder expansions/<nama>/code.py:
# coding: utf-8
class expansion_temp(expansion):
def __init__(self, name):
expansion.__init__(self, name)
AnsBase = ("Pesan jawaban.",) # index 0, dst
def command_contoh(self, stype, source, body, disp):
Answer(self.AnsBase[0], stype, source, disp)
commands = (
(command_contoh, "contoh", 1,), # (handler, nama_command, min_access)
)Opsional: buat expansions/<nama>/contoh.en (file help, format bebas, baris 1-2 = header).
Expansion otomatis termuat saat restart, atau gunakan expload <nama> untuk load runtime.
Proyek ini adalah hasil porting dari BlackSmith mark.2 (Python 2, library xmpppy). Perubahan utama:
xmpppy→ slixmpp (asyncio-based)has_key(),xrange(),itervalues()→ sintaks Python 3itypes.Number()→AtomicNumber(thread-safe counter custom)- Setiap
NexusClientberjalan di asyncio event loop tersendiri dalam thread daemon - MUC presence di-parse langsung dari XML (
<x xmlns="muc#user"><item .../></x>) untuk kompatibilitas penuh dengan slixmpp 1.15.x