Genel bakış
Scriptler, sunucunuzu genişleten küçük Lua programlarıdır. Bottan tamamen ayrılmış, yalıtılmış bir Lua 5.5 sandbox sürecinde çalışırlar. Bir script veritabanına, dosya sistemine veya diğer sunuculara asla dokunmaz. Her yetenek, IPC üzerinden bota geri dönen izin listeli bir host API'sinden geçer.
Yüklü script yoksa süreç de yoktur.
bot:* ve msg:* çağrılarının yetkisini Lua değil, bot denetler.
AutoMod, karşılama ve ticketlar her zaman çalışır. Scriptler tamamlar, yerlerine geçmez.
Çöken bir script devre dışı bırakılır veya karantinaya alınır, bot çalışmaya devam eder.
Tarayıcıda editör yoktur. .lua dosyasını gerçek bir editörde yazın ve sunucunuzun Scriptler sayfasından yükleyin.
Başlarken
- 1
Yerelde bir .lua dosyası yazın
VS Code, Neovim veya herhangi bir editör. - 2
Yerelde kontrol edin (isteğe bağlı)
script_runner --check file.luakomutucheck: okyazdırır. - 3
Yükleyin
Sunucunuzun Scriptler sayfasını açın, kodu yapıştırın veya .lua dosyasını yükleyin (en fazla 64 KiB). - 4
Deneme çalıştırması
Hiçbir şeyi çalıştırmadan boyutu, kodlamayı, bytecode'u ve yasaklı API'leri doğrular. - 5
Etkinleştirin
Sürümün yetkili onayını bekleyin, sonra Etkinleştir'e basın. Bot onu birkaç saniye içinde yükler. - 6
Bir log kanalı belirleyin
bot:logçıktısını ve hata bildirimlerini orada alın.
Yerel CLI
Çalıştırıcı, botun kullandığı ikili dosyanın aynısıdır.
- script_runner --check file.lua
Çalıştırmadan statik sözdizimi/yasaklı API kontrolü. 'check: ok' yazdırır.
- script_runner --eval 'code'
Bir kod parçasını sandbox'ta yerelde çalıştırır. Hatalar tür + mesaj yazdırır.
- script_runner --self-test
Sandbox, protokol ve soket öz testlerini çalıştırır.
Yaşam döngüsü ve inceleme
Scriptler sürümlüdür. Bir sürüm gönderdiğiniz anda dondurulur ve SHA-256 ile tanımlanır. Yalnızca onaylı sürümler etkinleştirilebilir ve bot yalnızca etkin sürümleri yükler.
- 1
Yazın
.lua dosyasını yerelde VS Code, Neovim veya herhangi bir editörde oluşturun. Tarayıcıda editör bilerek yoktur. - 2
Deneme çalıştırması / yükleme
Kodu yapıştırın veya .lua dosyasını sunucunun Scriptler sayfasında yükleyin (≤ 64 KiB, ikili değil). Deneme çalıştırması hiçbir şeyi çalıştırmadan boyutu, kodlamayı, bytecode'u ve yasaklı API'leri doğrular. - 3
İnceleme
Her yeni script ve her yeni sürüm beklemede başlar. Yetkili, kodun çalışabilmesi için önce o kod revizyonunu onaylar veya reddeder. - 4
Etkinleştirme
Onaylı bir sürümü siz etkinleştirirsiniz. Beklemedeki veya reddedilmiş bir sürümün etkinleştirilmesi reddedilir. Bot yalnızca etkin sürümleri yükler. - 5
Çalıştırma
Bot sürümü (kod + SHA-256, çalıştırıcı tarafından doğrulanır) yalıtılmış bir Lua 5.5 sandbox'ına yükler. Olaylar yalnızca bot:on ile kaydedilmiş handler'lara dağıtılır. - 6
Güncelleme / geri alma
Yeni bir sürüm yükleyin (yine beklemede) veya geri almak için daha eski onaylı bir sürümü etkinleştirin. KV depolaması kalır. - 7
Devre dışı bırakma / silme
Devre dışı bırakma yüklemeyi hemen durdurur, 'Tümünü devre dışı bırak' sunucunun tüm etkin scriptlerini etkiler. Silme; scripti, sürümlerini, KV'yi ve hataları kaldırır.
Script durumu
Her scriptte rozet olarak gösterilir.
- taslak
Oluşturuldu, henüz etkin sürüm yok.
- beklemede
Bir şey bekleniyor (örn. ilk onay), taslak olarak asla çalışmaz.
- etkin
Onaylı bir sürüm etkinleştirildi ve bot tarafından yüklendi.
- reddedildi
Yetkili reddetti; script yüklenmez.
- devre dışı
Elle devre dışı bırakıldı (siz, yetkili, 'Tümünü devre dışı bırak' veya kota nedeniyle kaldırma), yüklenmez.
- karantinada
Limit kötüye kullanımı sonrası otomatik kapatma (hız taşması, kuyruk taşması, tekrarlayan hatalar). Yüklenmez ve yetkili ilgisi gerekir.
Sürüm incelemesi
Her kod revizyonu yetkili incelemesinden geçer.
- beklemede
Yetkili henüz karar vermedi. Etkinleştirilemez.
- onaylandı
Etkinleştirilebilir. Yüklü mağaza scriptlerinin yeni yüklemeleri kuyruğu atlar (ilan sürümü zaten onaylanmıştı).
- reddedildi
Yetkili bu kod revizyonunu reddetti. Bunun yerine yeni bir sürüm yükleyin.
Kota: sunucu başına ücretsiz 2 etkin script, premium ile 10. Kota düşerse, üst sınırı aşan en eski etkin scriptler otomatik olarak devre dışı bırakılır ve script log kanalı üzerinden bilgilendirilirsiniz.
Handler'lar ve olaylar
Handler'ları bot:on(event, fn) ile kaydedin. Script, kayıtlı olaylarını yüklenirken bildirir ve ona yalnızca bu olaylar iletilir. Bilinmeyen olay adları yüklemeyi başarısız kılar ve bir script olay başına en fazla 8 handler kaydedebilir.
bot:on("message_create", function(msg)
if msg.content == "!ping" then
msg:reply("pong")
end
end)Mesaj benzeri olaylar (message_*, automod_check) yöntemleri olan bir mesaj nesnesi iletir, bkz. Mesaj nesnesi.
Host çağrıları yield eder: bir handler bot:kv_get ve benzeri çağrıları beklerken aynı scriptte ikinci bir olay çalışmaz. Yeni olaylar 32'lik bir kuyrukta bekler, taşma durumunda en eski olay düşer ve sürekli taşma scripti karantinaya alır.
guild_id her zaman yüke eklenir. Olaylar yalnızca bot:on ile kaydedilmiş handler'lara iletilir. Bilinmeyen olay adları yüklemeyi policy hatasıyla başarısız kılar. voice_state olayı yoktur.
Olay yükleri
Her yük guild_id taşır. Alanlar küçük harfli snake_case tablolardır.
- message_create
id, guild_id, channel_id, author_id, author, content, attachments, referenced_id
Etiketlerden/otomatik yanıttan önce tetiklenir. Ekler: en fazla 8 kayıt { id, filename, size }. Yanıt referansı yoksa referenced_id 0'dır.
- message_update
same as message_create
- message_delete
channel_id, id
- message_delete_bulk
channel_id, ids
ids, silinen mesaj ID'lerinin bir dizisidir.
- guild_member_add
user_id
Bot hesapları atlanır.
- guild_member_remove
user_id
- guild_member_update
user_id
- reaction_add
channel_id, id, author_id, user_id, emoji, emoji_id
Bot tepkileri atlanır. emoji addır, unicode emojiler için emoji_id 0'dır.
- reaction_remove
channel_id, id, author_id, user_id, emoji, emoji_id
- channel_create
id, name, type
- channel_update
id, name, type
- channel_delete
id, name
- role_create
id, name
- role_update
id, name
- role_delete
id, name
- thread_create
id, name
- thread_update
id, name
- thread_delete
id
- invite_create
code, uses
- invite_delete
code
- guild_ban_add
user_id
- guild_ban_remove
user_id
- welcome_before
user_id, username
Yerel karşılama mesajından önce tetiklenir. Yalnızca bot olmayan katılımlar.
- goodbye_before
user_id
Yerel veda mesajından önce tetiklenir.
- ticket_created
ticket_id, user_id, channel_id
- automod_check
content, channel_id, author_id, id
Yerel AutoMod'dan önce tetiklenir. msg:escalate() süren mesajı siler; yerel ret her zaman kazanır; msg:allow() etkisizdir.
- webhooks_update
channel_id
- emoji_update
count, ids
ids en fazla 8 ile sınırlıdır.
- tick
unix
Her 60 saniyede bir, yalnızca bot:on("tick") kaydeden scriptlere iletilir. unix, unix zamanıdır.
Host API'leri
Bu çağrılar IPC üzerinden bota yield eder. Script başına hız sınırları: 30 host çağrısı / 10 sn ve ayrıca 5 Discord gönderimi / 10 sn (reply, channel_send, react, edit, delete, pin, escalate, http_get). member_get ve guild_get gibi önbellek okumaları Discord'a doğrudan gitmez.
- bot:log(msg)
Script log kanalına ve hata loguna yazar. 30 çağrı / 10 sn limitine sayılır.
- bot:kv_get(key)
Saklanan JSON değerini veya nil döndürür. Anahtarlar: 1–64 karakter [A-Za-z0-9_-].
- bot:kv_set(key, value)
En fazla 8 KiB JSON saklar. Script başına 256 anahtar, script başına 1 MiB (premium 8 MiB), sunucu başına 8 MiB.
- bot:kv_del(key)
Bir anahtarı siler.
- bot:kv_keys()
En fazla 256 anahtarı sıralı döndürür.
- bot:kv_incr(key, delta?)
Saklanan bir JSON sayısını artırır, varsayılan delta 1, delta ±1.000.000.000 ile sınırlıdır.
- bot:db_exec(sql, binds?)
Sunucu script veritabanında tek bir yazma veya şema ifadesi çalıştırır (CREATE TABLE/INDEX, INSERT, UPDATE, DELETE, DROP). İsteğe bağlı bind'ler: nil, boolean, number veya string dizisi, en fazla 8. { changes, last_insert_rowid } döndürür. Kota, meşgul veya limit sorunları hata fırlatmak yerine { error, kind } döndürür; yasaklı ifadeler policy hatası fırlatır.
- bot:db_query(sql, binds?)
İsteğe bağlı bind'lerle tek bir SELECT çalıştırır ve her biri sütun adlarıyla anahtarlanmış bir tablo olan en fazla 50 satır döndürür. Her zaman LIMIT kullanın. Hata durumunda { error, kind } döndürür, bu yüzden rows.error değerini kontrol edin.
- bot:http_get(url)
Yalnızca HTTPS GET. Host, sunucu izin listesinde olmalıdır. { status, body, truncated } döndürür; body en fazla 16 KiB. Bekleme, 100 ms'lik Lua duvar saatine sayılmaz.
- bot:channel_send(channel_id, text, embed?)
Kendi sunucunuzda botun yazabildiği herhangi bir kanala gönderir. msg:reply ile aynı içerik kuralları.
- bot:channel_get(channel_id)
Önbellek okuması: { id, name, type, parent_id }. Yalnızca kendi sunucunuz.
- bot:member_get(user_id)
Önbellek okuması: { id, nick, bot, roles (en fazla 20) }.
- bot:role_get(role_id)
Önbellek okuması: { id, name, position, color }.
- bot:guild_get()
Kendi sunucu önbelleği: { id, name, owner_id, member_count }.
- bot:self()
Bot kullanıcısı: { id, username, bot }.
- bot:has_role(user_id, role_id)
Önbellek okuması, { has: true|false } döndürür.
- bot:channels()
Sunucunun kanallarının önbellek listesi (en fazla 50).
- bot:roles()
Sunucunun rollerinin önbellek listesi (en fazla 50).
- bot:now()
Saniye cinsinden unix zamanı.
- bot:id()
Bu scriptin UUID'si. Yield etmez, hız sınırlarına sayılmaz.
- bot:message_get(channel_id, message_id)
Botun mesaj önbelleğinden okuma (ağ üzerinden alma yok).
- bot:can_send(channel_id)
Botun o kanalda gönderebilip gönderemeyeceğini { ok: true|false } olarak döndürür.
bot:http_get neyi kabul eder
- Yalnızca HTTPS
http:// URL'leri reddedilir. userinfo (user:pass@host) yoktur.
- Sunucu izin listesi
Host, sunucunun HTTP izin listesinde olmalıdır (Scriptler sayfası, en fazla 32 host). Bunu kendiniz yönetirsiniz.
- Altyapı hostları yok
IP adresleri, localhost, *.local ve *.internal her zaman reddedilir.
- Yanıt
{ status, body, truncated }, body en fazla 16 KiB. Zaman aşımı 3 sn. 10 sn'de 5'lik Discord kovasını paylaşır.
Mesaj nesnesi
Mesaj olayları bir msg tablosunu ve yük alanlarını iletir. Yöntemler yalnızca süren olayın mesajı üzerinde çalışır, rastgele mesajları alıp düzenleyemezsiniz.
Her yerde geçerli içerik kuralları: metin 1 ila 2000 bayt, en fazla bir embed { title, description, color }, bahsetmeler yalnızca olayın yazarı için çözülür, @everyone ve @here temizlenir. Dosya yok, çıkartma yok.
- msg:reply(text, embed?)
Olayın kanalında yanıt verir. Bahsetmeler yalnızca olayın yazarı için çözülür; @everyone / @here temizlenir. Metin 1–2000 bayt, en fazla bir embed.
- msg:react(emoji)
Olay mesajına tepki ekler.
- msg:unreact(emoji)
Scriptin kendi tepkisini kaldırır.
- msg:edit(text, embed?)
Süren mesajı düzenler. Yanıtla aynı içerik kuralları.
- msg:delete()
Süren mesajı siler.
- msg:pin() / msg:unpin()
Süren mesajı sabitler/sabitlemeyi kaldırır.
- msg:escalate()
Yalnızca automod_check: süren mesajı siler (ek işlem, hız sınırlı). Yerel AutoMod kararları her zaman kazanır.
- msg:allow()
Yalnızca automod_check: mesajı izinli olarak işaretler. Yerel bir reddi geri alamaz, fiilen etkisiz bir işarettir.
Limitler ve kotalar
Tüm limitler, botun ve çalıştırıcının paylaştığı tek bir yapılandırma dosyasında yer alır. Burada yalnızca belgelenmekle kalmaz, çalışma zamanında da uygulanır. Sayılar güncel varsayılanlardır.
- Dil
Lua 5.5, yalnızca metin parçaları (bytecode reddedilir). io/os.file/require/load/debug/coroutine yok.
- Hesaplama
Handler başına ~100 ms duvar saati, 10.000.000 komut (count hook).
- Bellek
Script başına ücretsiz 2 MB, premium 8 MB.
- Kod boyutu
64 KiB UTF-8 .lua, NUL baytı yok, bytecode yok.
- Host çağrıları
Script başına 10 sn'de 30 (bot:log dahil).
- Discord gönderimleri
Script başına 10 sn'de 5 (reply, channel_send, react/unreact, edit, delete, pin/unpin, escalate, http_get). 10 sn'de 8 ret → karantina.
- Handler'lar
Script başına olay başına en fazla 8. Bilinmeyen olay adları yüklenirken reddedilir.
- Olay kuyruğu
Script başına derinlik 32, taşmada en eski düşer. 10 sn'de 8+ düşme → karantina.
- HTTP
HTTPS + sunucu izin listesi, zaman aşımı 3 sn, body 16 KiB, IP/localhost/dahili host yok, userinfo yok.
- KV
Anahtarlar 1–64 [A-Za-z0-9_-], değerler ≤ 8 KiB JSON, script başına 256 anahtar, script başına 1 MiB (premium 8 MiB), sunucu başına 8 MiB.
- Veritabanı
Sunucu başına bir SQLite dosyası, tüm scriptleri tarafından paylaşılır: 1 MiB (premium 8 MiB), çağrı başına bir ifade, SQL ≤ 2 KiB, ≤ 8 bind, ≤ 50 satır, ifade başına 20 ms, 64 tablo ve indeks. ATTACH, PRAGMA, transaction, trigger, view veya WITH yok. Sunucudaki her script her tabloyu okuyabilir ve silebilir.
- Etkin scriptler
Sunucu başına ücretsiz 2, premium 10. Fazla olan en eski etkin scriptler otomatik olarak devre dışı bırakılır.
- Sürümler
Script başına sınırsız sayıda; her yeni sürüm, yetkili onaylayana kadar beklemededir.
- Bahsetmeler
Yalnızca olayın yazarı. @everyone / @here temizlenir. Dosya yok, çıkartma yok.
- Yalıtım
3 hata (timeout/memory/policy/runtime) → kendi yalıtılmış worker'ı (en fazla 4), aksi halde karantina + devre dışı bırakma.
- Hata logu
Panelde son 24 saat görünür, kayıtlar 7 gün sonra temizlenir.
- Yasaklı
voice_state yok, mod_* API'leri yok (ban/kick/timeout), sunucular arası erişim yok, veritabanı/dosya sistemi yok, gelir elde etme yok.
- AutoMod
Yerel AutoMod önce çalışır ve scriptlere karşı her zaman kazanır.
Doğrulama
Bir sürüm saklanmadan önce arka uç statik kontroller çalıştırır. Deneme çalıştırması aynısını kaydetmeden yapar. Sandbox'ın kendisi ikinci savunma hattıdır: yasaklı globaller çalışma zamanında hiç yoktur.
- Boyut / kodlama
Boş değil, ≤ 64 KiB, NUL baytı olmayan UTF-8.
- Bytecode
Lua bytecode imzasıyla başlayan her şey reddedilir.
- Yasaklı API'ler
Statik tarama şunları reddeder: load(, loadfile, dofile, require(, os.execute, io.open, debug., string.dump, loadstring, getfenv, setfenv, package., coroutine., ffi., jit.
- Çalışma zamanı sandbox'ı
Statik taramadan bir şey kaçsa bile sandbox bu globalleri hiç sunmaz, çağrı policy hatasıyla başarısız olur.
Kullanılabilir yerleşikler: dosya erişimi olmayan standart Lua kütüphanesi. string, table, math, tostring, tonumber, type, pairs, ipairs, os.time, os.clock, os.difftime ve bot.
Hatalar ve karantina
Her handler hatası bir türle kaydedilir ve script ayrıntı sayfasında gösterilir (son 24 saat). Kayıtlar 7 gün sonra temizlenir.
- runtime
Handler'ınızda bir Lua hatası (nil erişimi, hatalı argümanlar, …). Mesaj, Lua hata metnini içerir.
- timeout
Handler 100 ms duvar saatini aştı veya bir IPC çağrısı zaman aşımına uğradı (1 sn).
- memory
Script bellek üst sınırını aştı.
- policy
Script izin verilmeyen bir şey denedi: bilinmeyen olay, çok fazla handler, izin verilmeyen API, aşırı büyük yük.
Tekrarlayan kötüye kullanım otomatik olarak kademelendirilir: 3 hata (timeout, memory, policy, runtime) scripti kendi yalıtılmış worker'ına taşır. Kötü davranış sürerse veya boş yalıtılmış yuva yoksa (en fazla 4), script karantinaya alınır: devre dışı bırakılır ve panelde işaretlenir. Hız taşmaları (10 sn'de 8 reddedilen Discord gönderimi veya 8 kuyruk düşmesi) hemen karantinaya alır. Script log kanalı veya DM ile bilgilendirilirsiniz.
Operasyon tarafı: bot, yeniden başlatma olmadan bir kill switch ile global olarak duraklatılabilir ve bir scripts:updated sinyali değişen sürümleri birkaç saniye içinde yeniden yükler. İkisi de yetkili işlemleridir.
Mağaza
Mağaza, scriptleri herkese açık paylaşmanızı ve diğer sunuculardan script yüklemenizi sağlar. Yayınlama ve yükleme ikisi de kopya oluşturur. Bir ilanı yüklemek sunucunuzda bağımsız bir script oluşturur, yazarın koduna bağlı kalmaz.
- Yayınlama
Onaylı sürümü olan etkin bir script, bir açıklama (10–512 karakter) ve 1–8 etiket ([a-z0-9-], 1–24 karakter) gerekir. İlk yayından önce mağaza kullanım koşullarını bir kez kabul etmelisiniz.
- Yükleme
Yükleme, ilanı sunucunuza kendi scripti olarak kopyalar (taslak, önceden onaylı sürüm, ad alınmışsa sonekli kendi adı). KV kopyalanmaz. İlandaki yükleme sayacı artar.
- Yayından kaldırma
İlanı mağazadan kaldırır. Mevcut kopyalar kalır ve çalışmaya devam eder; yalnızca artık güncelleme almazlar.
- Para yok
Açıklamada veya kodda satış, ödeme duvarı, bağış/kripto bağlantıları ve benzeri gelir elde etme yayınlama sırasında reddedilir ve scriptin yasaklanmasına yol açabilir.
- Şikayetler
Sunucuya erişimi olan herkes bir ilanı nedenle birlikte şikayet edebilir. Yetkililer açık şikayet kuyruğunu görür ve şikayetleri inceledikten sonra kapatır.
- Limitler
Mağaza listesi sorgu başına en fazla 50 ilan gösterir (arama, etiket, yüklemeye veya en yeniye göre sıralama). Yüklemeler için normal sunucu script kotası geçerlidir.
Örnekler
Kodunu görmek için bir örnek seçin.